diff options
Diffstat (limited to 'indra/media_plugins/webkit')
| -rw-r--r-- | indra/media_plugins/webkit/media_plugin_webkit.cpp | 255 | 
1 files changed, 153 insertions, 102 deletions
| diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index afde904be6..24c53638d2 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -88,10 +88,12 @@ public:  private:  	std::string mProfileDir; +	std::string mHostLanguage;  	enum  	{ -		INIT_STATE_UNINITIALIZED,		// Browser instance hasn't been set up yet +		INIT_STATE_UNINITIALIZED,		// LLQtWebkit hasn't been set up yet +		INIT_STATE_INITIALIZED,			// LLQtWebkit has been set up, but no browser window has been created yet.  		INIT_STATE_NAVIGATING,			// Browser instance has been set up and initial navigate to about:blank has been issued  		INIT_STATE_NAVIGATE_COMPLETE,	// initial navigate to about:blank has completed  		INIT_STATE_WAIT_REDRAW,			// First real navigate begin has been received, waiting for page changed event to start handling redraws @@ -191,13 +193,6 @@ private:  		if ( mInitState > INIT_STATE_UNINITIALIZED )  			return true; -		// not enough information to initialize the browser yet. -		if ( mWidth < 0 || mHeight < 0 || mDepth < 0 ||  -				mTextureWidth < 0 || mTextureHeight < 0 ) -		{ -			return false; -		}; -  		// set up directories  		char cwd[ FILENAME_MAX ];	// I *think* this is defined on all platforms we use  		if (NULL == getcwd( cwd, FILENAME_MAX - 1 )) @@ -208,12 +203,12 @@ private:  		std::string application_dir = std::string( cwd );  #if LL_DARWIN -	// When running under the Xcode debugger, there's a setting called "Break on Debugger()/DebugStr()" which defaults to being turned on. -	// This causes the environment variable USERBREAK to be set to 1, which causes these legacy calls to break into the debugger. -	// This wouldn't cause any problems except for the fact that the current release version of the Flash plugin has a call to Debugger() in it -	// which gets hit when the plugin is probed by webkit. -	// Unsetting the environment variable here works around this issue. -	unsetenv("USERBREAK"); +		// When running under the Xcode debugger, there's a setting called "Break on Debugger()/DebugStr()" which defaults to being turned on. +		// This causes the environment variable USERBREAK to be set to 1, which causes these legacy calls to break into the debugger. +		// This wouldn't cause any problems except for the fact that the current release version of the Flash plugin has a call to Debugger() in it +		// which gets hit when the plugin is probed by webkit. +		// Unsetting the environment variable here works around this issue. +		unsetenv("USERBREAK");  #endif  #if LL_WINDOWS @@ -254,66 +249,92 @@ private:  		bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, mProfileDir, native_window_handle );  		if ( result )  		{ -			// create single browser window -			mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight ); +			mInitState = INIT_STATE_INITIALIZED; +			 +			return true; +		}; + +		return false; +	}; + +	//////////////////////////////////////////////////////////////////////////////// +	// +	bool initBrowserWindow() +	{ +		// already initialized +		if ( mInitState > INIT_STATE_INITIALIZED ) +			return true; + +		// not enough information to initialize the browser yet. +		if ( mWidth < 0 || mHeight < 0 || mDepth < 0 ||  +				mTextureWidth < 0 || mTextureHeight < 0 ) +		{ +			return false; +		}; +		 +		// Set up host language before creating browser window +		if(!mHostLanguage.empty()) +		{ +			LLQtWebKit::getInstance()->setHostLanguage(mHostLanguage); +		} +		 +		// create single browser window +		mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight );  #if LL_WINDOWS -			// Enable plugins -			LLQtWebKit::getInstance()->enablePlugins(true); +		// Enable plugins +		LLQtWebKit::getInstance()->enablePlugins(true);  #elif LL_DARWIN -			// Enable plugins -			LLQtWebKit::getInstance()->enablePlugins(true); +		// Enable plugins +		LLQtWebKit::getInstance()->enablePlugins(true);  #elif LL_LINUX -			// Enable plugins -			LLQtWebKit::getInstance()->enablePlugins(true); +		// Enable plugins +		LLQtWebKit::getInstance()->enablePlugins(true);  #endif -			// Enable cookies -			LLQtWebKit::getInstance()->enableCookies( true ); +		// Enable cookies +		LLQtWebKit::getInstance()->enableCookies( true ); -			// tell LLQtWebKit about the size of the browser window -			LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); +		// tell LLQtWebKit about the size of the browser window +		LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); -			// observer events that LLQtWebKit emits -			LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this ); +		// observer events that LLQtWebKit emits +		LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this ); -			// append details to agent string -			LLQtWebKit::getInstance()->setBrowserAgentId( "LLPluginMedia Web Browser" ); +		// append details to agent string +		LLQtWebKit::getInstance()->setBrowserAgentId( "LLPluginMedia Web Browser" );  #if !LL_QTWEBKIT_USES_PIXMAPS -			// don't flip bitmap -			LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true ); +		// don't flip bitmap +		LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true );  #endif // !LL_QTWEBKIT_USES_PIXMAPS -			 -			// set background color -			// convert background color channels from [0.0, 1.0] to [0, 255]; -			LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, int(mBackgroundR * 255.0f), int(mBackgroundG * 255.0f), int(mBackgroundB * 255.0f) ); - -			// Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns. -			setInitState(INIT_STATE_NAVIGATING); - -			// Don't do this here -- it causes the dreaded "white flash" when loading a browser instance. -			// FIXME: Re-added this because navigating to a "page" initializes things correctly - especially -			// for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date. -			// Build a data URL like this: "data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#RRGGBB%22%3E%3C/body%3E%3C/html%3E" -			// where RRGGBB is the background color in HTML style -			std::stringstream url; -			 -			url << "data:text/html,%3Chtml%3E%3Cbody%20bgcolor=%22#"; -			// convert background color channels from [0.0, 1.0] to [0, 255]; -			url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundR * 255.0f); -			url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundG * 255.0f); -			url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundB * 255.0f); -			url << "%22%3E%3C/body%3E%3C/html%3E"; -			 -			lldebugs << "data url is: " << url.str() << llendl; -						 -			LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() ); -//			LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" ); - -			return true; -		}; +		 +		// set background color +		// convert background color channels from [0.0, 1.0] to [0, 255]; +		LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, int(mBackgroundR * 255.0f), int(mBackgroundG * 255.0f), int(mBackgroundB * 255.0f) ); + +		// Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns. +		setInitState(INIT_STATE_NAVIGATING); + +		// Don't do this here -- it causes the dreaded "white flash" when loading a browser instance. +		// FIXME: Re-added this because navigating to a "page" initializes things correctly - especially +		// for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date. +		// Build a data URL like this: "data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#RRGGBB%22%3E%3C/body%3E%3C/html%3E" +		// where RRGGBB is the background color in HTML style +		std::stringstream url; +		 +		url << "data:text/html,%3Chtml%3E%3Cbody%20bgcolor=%22#"; +		// convert background color channels from [0.0, 1.0] to [0, 255]; +		url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundR * 255.0f); +		url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundG * 255.0f); +		url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundB * 255.0f); +		url << "%22%3E%3C/body%3E%3C/html%3E"; +		 +		lldebugs << "data url is: " << url.str() << llendl; +					 +		LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() ); +//		LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" ); -		return false; -	}; +		return true;	 +	}  	void setVolume(F32 vol); @@ -676,9 +697,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  		{  			if(message_name == "init")  			{ -				std::string user_data_path = message_in.getValue("user_data_path"); // n.b. always has trailing platform-specific dir-delimiter -				mProfileDir = user_data_path + "browser_profile"; -  				LLPluginMessage message("base", "init_response");  				LLSD versions = LLSD::emptyMap();  				versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION; @@ -690,23 +708,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  				plugin_version += LLQtWebKit::getInstance()->getVersion();  				message.setValue("plugin_version", plugin_version);  				sendMessage(message); -				 -				// Plugin gets to decide the texture parameters to use. -				mDepth = 4; - -				message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); -				message.setValueS32("default_width", 1024); -				message.setValueS32("default_height", 1024); -				message.setValueS32("depth", mDepth); -				message.setValueU32("internalformat", GL_RGBA); -#if LL_QTWEBKIT_USES_PIXMAPS -				message.setValueU32("format", GL_BGRA_EXT); // I hope this isn't system-dependant... is it?  If so, we'll have to check the root window's pixel layout or something... yuck. -#else -				message.setValueU32("format", GL_RGBA); -#endif // LL_QTWEBKIT_USES_PIXMAPS -				message.setValueU32("type", GL_UNSIGNED_BYTE); -				message.setValueBoolean("coords_opengl", true); -				sendMessage(message);  			}  			else if(message_name == "idle")  			{ @@ -771,7 +772,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  //				std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl;  			}  		} -                else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME) +		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)  		{  			if(message_name == "set_volume")  			{ @@ -781,7 +782,50 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  		}  		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)  		{ -			if(message_name == "size_change") +			if(message_name == "init") +			{ +				// This is the media init message -- all necessary data for initialization should have been received. +				if(initBrowser()) +				{ +					 +					// Plugin gets to decide the texture parameters to use. +					mDepth = 4; + +					LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params"); +					message.setValueS32("default_width", 1024); +					message.setValueS32("default_height", 1024); +					message.setValueS32("depth", mDepth); +					message.setValueU32("internalformat", GL_RGBA); +	#if LL_QTWEBKIT_USES_PIXMAPS +					message.setValueU32("format", GL_BGRA_EXT); // I hope this isn't system-dependant... is it?  If so, we'll have to check the root window's pixel layout or something... yuck. +	#else +					message.setValueU32("format", GL_RGBA); +	#endif // LL_QTWEBKIT_USES_PIXMAPS +					message.setValueU32("type", GL_UNSIGNED_BYTE); +					message.setValueBoolean("coords_opengl", true); +					sendMessage(message); +				} +				else +				{ +					// if initialization failed, we're done. +					mDeleteMe = true; +				} + +			} +			else if(message_name == "set_user_data_path") +			{ +				std::string user_data_path = message_in.getValue("path"); // n.b. always has trailing platform-specific dir-delimiter +				mProfileDir = user_data_path + "browser_profile"; + +				// FIXME: Should we do anything with this if it comes in after the browser has been initialized? +			} +			else if(message_name == "set_language_code") +			{ +				mHostLanguage = message_in.getValue("language"); + +				// FIXME: Should we do anything with this if it comes in after the browser has been initialized? +			} +			else if(message_name == "size_change")  			{  				std::string name = message_in.getValue("name");  				S32 width = message_in.getValueS32("width"); @@ -803,29 +847,36 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  						mWidth = width;  						mHeight = height; -						// initialize (only gets called once) -						initBrowser(); - -						// size changed so tell the browser -						LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); -						 -//						std::cerr << "webkit plugin: set size to " << mWidth << " x " << mHeight  -//								<< ", rowspan is " << LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) << std::endl; -								 -						S32 real_width = LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) / LLQtWebKit::getInstance()->getBrowserDepth(mBrowserWindowId);  -						 -						// The actual width the browser will be drawing to is probably smaller... let the host know by modifying texture_width in the response. -						if(real_width <= texture_width) +						if(initBrowserWindow())  						{ -							texture_width = real_width; + +							// size changed so tell the browser +							LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); +							 +	//						std::cerr << "webkit plugin: set size to " << mWidth << " x " << mHeight  +	//								<< ", rowspan is " << LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) << std::endl; +									 +							S32 real_width = LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) / LLQtWebKit::getInstance()->getBrowserDepth(mBrowserWindowId);  +							 +							// The actual width the browser will be drawing to is probably smaller... let the host know by modifying texture_width in the response. +							if(real_width <= texture_width) +							{ +								texture_width = real_width; +							} +							else +							{ +								// This won't work -- it'll be bigger than the allocated memory.  This is a fatal error. +	//							std::cerr << "Fatal error: browser rowbytes greater than texture width" << std::endl; +								mDeleteMe = true; +								return; +							}  						}  						else  						{ -							// This won't work -- it'll be bigger than the allocated memory.  This is a fatal error. -//							std::cerr << "Fatal error: browser rowbytes greater than texture width" << std::endl; +							// Setting up the browser window failed.  This is a fatal error.  							mDeleteMe = true; -							return;  						} +  						mTextureWidth = texture_width;  						mTextureHeight = texture_height; | 
