diff options
Diffstat (limited to 'indra/llplugin')
| -rw-r--r-- | indra/llplugin/CMakeLists.txt | 8 | ||||
| -rw-r--r-- | indra/llplugin/llpluginclassmedia.cpp | 75 | ||||
| -rw-r--r-- | indra/llplugin/llpluginclassmedia.h | 33 | ||||
| -rw-r--r-- | indra/llplugin/llpluginclassmediaowner.h | 3 | ||||
| -rw-r--r-- | indra/llplugin/slplugin/slplugin.cpp | 12 | 
5 files changed, 92 insertions, 39 deletions
| diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt index fdd510b389..d3a73058c4 100644 --- a/indra/llplugin/CMakeLists.txt +++ b/indra/llplugin/CMakeLists.txt @@ -51,6 +51,14 @@ set(llplugin_HEADER_FILES  set_source_files_properties(${llplugin_HEADER_FILES}                              PROPERTIES HEADER_FILE_ONLY TRUE) +if(NOT WORD_SIZE EQUAL 32) +  if(WINDOWS) +    add_definitions(/FIXED:NO) +  else(WINDOWS) # not windows therefore gcc LINUX and DARWIN +    add_definitions(-fPIC) +  endif(WINDOWS) +endif(NOT WORD_SIZE EQUAL 32) +  list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES})  add_library (llplugin ${llplugin_SOURCE_FILES}) diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 9ce9ee2101..69ed0fb09c 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -74,6 +74,7 @@ bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::s  	// Queue up the media init message -- it will be sent after all the currently queued messages.  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "init"); +	message.setValue("target", mTarget);  	sendMessage(message);  	mPlugin->init(launcher_filename, plugin_filename, debug); @@ -143,7 +144,7 @@ void LLPluginClassMedia::reset()  	mProgressPercent = 0;	  	mClickURL.clear();  	mClickTarget.clear(); -	mClickTargetType = TARGET_NONE; +	mClickUUID.clear();  	// media_time class  	mCurrentTime = 0.0f; @@ -669,6 +670,18 @@ F64 LLPluginClassMedia::getCPUUsage()  	return result;  } +void LLPluginClassMedia::sendPickFileResponse(const std::string &file) +{ +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file_response"); +	message.setValue("file", file); +	if(mPlugin->isBlocked()) +	{ +		// If the plugin sent a blocking pick-file request, the response should unblock it. +		message.setValueBoolean("blocking_response", true); +	} +	sendMessage(message); +} +  void LLPluginClassMedia::cut()  {  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_cut"); @@ -715,24 +728,9 @@ void LLPluginClassMedia::setJavascriptEnabled(const bool enabled)  	sendMessage(message);  } -LLPluginClassMedia::ETargetType getTargetTypeFromLLQtWebkit(int target_type) +void LLPluginClassMedia::setTarget(const std::string &target)  { -	// convert a LinkTargetType value from llqtwebkit to an ETargetType -	// so that we don't expose the llqtwebkit header in viewer code -	switch (target_type) -	{ -	case LLQtWebKit::LTT_TARGET_NONE: -		return LLPluginClassMedia::TARGET_NONE; - -	case LLQtWebKit::LTT_TARGET_BLANK: -		return LLPluginClassMedia::TARGET_BLANK; - -	case LLQtWebKit::LTT_TARGET_EXTERNAL: -		return LLPluginClassMedia::TARGET_EXTERNAL; - -	default: -		return LLPluginClassMedia::TARGET_OTHER; -	} +	mTarget = target;  }  /* virtual */  @@ -945,6 +943,10 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  			mMediaName = message.getValue("name");  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAME_CHANGED);  		} +		else if(message_name == "pick_file") +		{ +			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PICK_FILE_REQUEST); +		}  		else  		{  			LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL; @@ -987,15 +989,13 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  		{  			mClickURL = message.getValue("uri");  			mClickTarget = message.getValue("target"); -			U32 target_type = message.getValueU32("target_type"); -			mClickTargetType = ::getTargetTypeFromLLQtWebkit(target_type); +			mClickUUID = message.getValue("uuid");  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_HREF);  		}  		else if(message_name == "click_nofollow")  		{  			mClickURL = message.getValue("uri");  			mClickTarget.clear(); -			mClickTargetType = TARGET_NONE;  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW);  		}  		else if(message_name == "cookie_set") @@ -1005,6 +1005,20 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  				mOwner->handleCookieSet(this, message.getValue("cookie"));  			}  		} +		else if(message_name == "close_request") +		{ +			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLOSE_REQUEST); +		} +		else if(message_name == "geometry_change") +		{ +			mClickUUID = message.getValue("uuid"); +			mGeometryX = message.getValueS32("x"); +			mGeometryY = message.getValueS32("y"); +			mGeometryWidth = message.getValueS32("width"); +			mGeometryHeight = message.getValueS32("height"); +				 +			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_GEOMETRY_CHANGE); +		}  		else  		{  			LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL; @@ -1159,6 +1173,25 @@ void LLPluginClassMedia::setBrowserUserAgent(const std::string& user_agent)  	sendMessage(message);  } +void LLPluginClassMedia::proxyWindowOpened(const std::string &target, const std::string &uuid) +{ +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_window_opened"); + +	message.setValue("target", target); +	message.setValue("uuid", uuid); + +	sendMessage(message); +} + +void LLPluginClassMedia::proxyWindowClosed(const std::string &uuid) +{ +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_window_closed"); + +	message.setValue("uuid", uuid); + +	sendMessage(message); +} +  void LLPluginClassMedia::crashPlugin()  {  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "crash"); diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index ee53f3a4da..9cb67fe909 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -156,6 +156,8 @@ public:  	void setLowPrioritySizeLimit(int size);  	F64 getCPUUsage(); +	 +	void sendPickFileResponse(const std::string &file);  	// Valid after a MEDIA_EVENT_CURSOR_CHANGED event  	std::string getCursorName() const { return mCursorName; }; @@ -176,7 +178,8 @@ public:  	void	setLanguageCode(const std::string &language_code);  	void	setPluginsEnabled(const bool enabled);  	void	setJavascriptEnabled(const bool enabled); -		 +	void	setTarget(const std::string &target); +	  	///////////////////////////////////  	// media browser class functions  	bool pluginSupportsMediaBrowser(void); @@ -193,6 +196,8 @@ public:  	void browse_back();  	void set_status_redirect(int code, const std::string &url);  	void setBrowserUserAgent(const std::string& user_agent); +	void proxyWindowOpened(const std::string &target, const std::string &uuid); +	void proxyWindowClosed(const std::string &uuid);  	// This is valid after MEDIA_EVENT_NAVIGATE_BEGIN or MEDIA_EVENT_NAVIGATE_COMPLETE  	std::string	getNavigateURI() const { return mNavigateURI; }; @@ -218,16 +223,14 @@ public:  	// This is valid after MEDIA_EVENT_CLICK_LINK_HREF  	std::string getClickTarget() const { return mClickTarget; }; -	typedef enum  -	{ -		TARGET_NONE,        // empty href target string -		TARGET_BLANK,       // target to open link in user's preferred browser -		TARGET_EXTERNAL,    // target to open link in external browser -		TARGET_OTHER        // nonempty and unsupported target type -	}ETargetType; - -	// This is valid after MEDIA_EVENT_CLICK_LINK_HREF -	ETargetType getClickTargetType() const { return mClickTargetType; }; +	// This is valid during MEDIA_EVENT_CLICK_LINK_HREF and MEDIA_EVENT_GEOMETRY_CHANGE +	std::string getClickUUID() const { return mClickUUID; }; +	 +	// These are valid during MEDIA_EVENT_GEOMETRY_CHANGE +	S32 getGeometryX() const { return mGeometryX; }; +	S32 getGeometryY() const { return mGeometryY; }; +	S32 getGeometryWidth() const { return mGeometryWidth; }; +	S32 getGeometryHeight() const { return mGeometryHeight; };  	std::string getMediaName() const { return mMediaName; };  	std::string getMediaDescription() const { return mMediaDescription; }; @@ -347,6 +350,8 @@ protected:  	LLColor4		mBackgroundColor; +	std::string		mTarget; +	  	/////////////////////////////////////////  	// media_browser class  	std::string		mNavigateURI; @@ -359,7 +364,11 @@ protected:  	std::string		mLocation;  	std::string		mClickURL;  	std::string		mClickTarget; -	ETargetType     mClickTargetType; +	std::string		mClickUUID; +	S32				mGeometryX; +	S32				mGeometryY; +	S32				mGeometryWidth; +	S32				mGeometryHeight;  	/////////////////////////////////////////  	// media_time class diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h index b48a5ca4ac..c9efff216c 100644 --- a/indra/llplugin/llpluginclassmediaowner.h +++ b/indra/llplugin/llpluginclassmediaowner.h @@ -54,6 +54,9 @@ public:  		MEDIA_EVENT_LOCATION_CHANGED,		// browser location (URL) has changed (maybe due to internal navagation/frames/etc)  		MEDIA_EVENT_CLICK_LINK_HREF,		// I'm not entirely sure what the semantics of these two are  		MEDIA_EVENT_CLICK_LINK_NOFOLLOW, +		MEDIA_EVENT_CLOSE_REQUEST,			// The plugin requested its window be closed (currently hooked up to javascript window.close in webkit) +		MEDIA_EVENT_PICK_FILE_REQUEST,		// The plugin wants the user to pick a file +		MEDIA_EVENT_GEOMETRY_CHANGE,		// The plugin requested its window geometry be changed (per the javascript window interface)  		MEDIA_EVENT_PLUGIN_FAILED_LAUNCH,	// The plugin failed to launch   		MEDIA_EVENT_PLUGIN_FAILED			// The plugin died unexpectedly diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp index 7d69e1c5cd..516a58db88 100644 --- a/indra/llplugin/slplugin/slplugin.cpp +++ b/indra/llplugin/slplugin/slplugin.cpp @@ -281,7 +281,7 @@ int main(int argc, char **argv)  			}  			// Check for a change in this process's frontmost window. -			if(FrontWindow() != front_window) +			if(GetFrontWindowOfClass(kAllWindowClasses, true) != front_window)  			{  				ProcessSerialNumber self = { 0, kCurrentProcess };  				ProcessSerialNumber parent = { 0, kNoProcess }; @@ -307,7 +307,7 @@ int main(int argc, char **argv)  					}  				} -				if((FrontWindow() != NULL) && (front_window == NULL)) +				if((GetFrontWindowOfClass(kAllWindowClasses, true) != NULL) && (front_window == NULL))  				{  					// Opening the first window @@ -319,7 +319,7 @@ int main(int argc, char **argv)  					if(layer_group)  					{ -						SetWindowGroup(FrontWindow(), layer_group); +						SetWindowGroup(GetFrontWindowOfClass(kAllWindowClasses, true), layer_group);  					}  					if(parent_is_front_process) @@ -328,9 +328,9 @@ int main(int argc, char **argv)  						(void) SetFrontProcess( &self );  					} -					ActivateWindow(FrontWindow(), true);					 +					ActivateWindow(GetFrontWindowOfClass(kAllWindowClasses, true), true);  				} -				else if((FrontWindow() == NULL) && (front_window != NULL)) +				else if((GetFrontWindowOfClass(kAllWindowClasses, true) == NULL) && (front_window != NULL))  				{  					// Closing the last window @@ -350,7 +350,7 @@ int main(int argc, char **argv)  					window_hack_state = 2;  				} -				front_window = FrontWindow(); +				front_window = GetFrontWindowOfClass(kAllWindowClasses, true);  			}  		} | 
