diff options
Diffstat (limited to 'indra/llplugin')
| -rwxr-xr-x | indra/llplugin/llpluginclassmedia.cpp | 258 | ||||
| -rwxr-xr-x | indra/llplugin/llpluginclassmedia.h | 9 | 
2 files changed, 141 insertions, 126 deletions
| diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index b48f664a2a..fd04fc4b62 100755 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -1,4 +1,4 @@ -/** +/**    * @file llpluginclassmedia.cpp   * @brief LLPluginClassMedia handles a plugin which knows about the "media" message class.   * @@ -6,21 +6,21 @@   * $LicenseInfo:firstyear=2008&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2010, Linden Research, Inc. - * + *    * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - * + *    * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - * + *    * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - * + *    * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   * @endcond @@ -41,7 +41,7 @@ static int nextPowerOf2( int value )  	{  		next_power_of_2 <<= 1;  	} - +	  	return next_power_of_2;  } @@ -63,19 +63,19 @@ LLPluginClassMedia::~LLPluginClassMedia()  }  bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_dir, const std::string &plugin_filename, bool debug) -{ +{	  	LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL;  	LL_DEBUGS("Plugin") << "dir: " << plugin_dir << LL_ENDL;  	LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL; - +	  	mPlugin = new LLPluginProcessParent(this);  	mPlugin->setSleepTime(mSleepTime); - +	  	// 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_dir, plugin_filename, debug);  	return true; @@ -115,7 +115,7 @@ void LLPluginClassMedia::reset()  	mTextureHeight = 0;  	mMediaWidth = 0;  	mMediaHeight = 0; -	mDirtyRect = LLRect::null; +	mDirtyRect = LLRect::null;	  	mAutoScaleMedia = false;  	mRequestedVolume = 1.0f;  	mPriority = PRIORITY_NORMAL; @@ -132,7 +132,7 @@ void LLPluginClassMedia::reset()  	mMediaName.clear();  	mMediaDescription.clear();  	mBackgroundColor = LLColor4(1.0f, 1.0f, 1.0f, 1.0f); - +	  	// media_browser class  	mNavigateURI.clear();  	mNavigateResultCode = -1; @@ -140,13 +140,15 @@ void LLPluginClassMedia::reset()  	mHistoryBackAvailable = false;  	mHistoryForwardAvailable = false;  	mStatusText.clear(); -	mProgressPercent = 0; +	mProgressPercent = 0;	  	mClickURL.clear();  	mClickNavType.clear();  	mClickTarget.clear();  	mClickUUID.clear();  	mStatusCode = 0; - +	 +	mClickEnforceTarget = false; +	  	// media_time class  	mCurrentTime = 0.0f;  	mDuration = 0.0f; @@ -160,7 +162,7 @@ void LLPluginClassMedia::idle(void)  	{  		mPlugin->idle();  	} - +	  	if((mMediaWidth == -1) || (!mTextureParamsReceived) || (mPlugin == NULL) || (mPlugin->isBlocked()) || (mOwner == NULL))  	{  		// Can't process a size change at this time @@ -177,7 +179,7 @@ void LLPluginClassMedia::idle(void)  		else  		{  			mRequestedTextureWidth = mRequestedMediaWidth; - +			  			if(mPadding > 1)  			{  				// Pad up to a multiple of the specified number of bytes per row @@ -187,7 +189,7 @@ void LLPluginClassMedia::idle(void)  				{  					rowbytes += mPadding - pad;  				} - +				  				if(rowbytes % mRequestedTextureDepth == 0)  				{  					mRequestedTextureWidth = rowbytes / mRequestedTextureDepth; @@ -199,7 +201,7 @@ void LLPluginClassMedia::idle(void)  			}  		} - +		  		// Size change has been requested but not initiated yet.  		size_t newsize = mRequestedTextureWidth * mRequestedTextureHeight * mRequestedTextureDepth; @@ -214,22 +216,22 @@ void LLPluginClassMedia::idle(void)  				mPlugin->removeSharedMemory(mTextureSharedMemoryName);  				mTextureSharedMemoryName.clear();  			} - +			  			mTextureSharedMemorySize = newsize;  			mTextureSharedMemoryName = mPlugin->addSharedMemory(mTextureSharedMemorySize);  			if(!mTextureSharedMemoryName.empty())  			{  				void *addr = mPlugin->getSharedMemoryAddress(mTextureSharedMemoryName); - +				  				// clear texture memory to avoid random screen visual fuzz from uninitialized texture data  				memset( addr, 0x00, newsize ); - +				  				// We could do this to force an update, but textureValid() will still be returning false until the first roundtrip to the plugin,  				// so it may not be worthwhile.  				// mDirtyRect.setOriginAndSize(0, 0, mRequestedMediaWidth, mRequestedMediaHeight);  			}  		} - +		  		// This is our local indicator that a change is in progress.  		mTextureWidth = -1;  		mTextureHeight = -1; @@ -238,7 +240,7 @@ void LLPluginClassMedia::idle(void)  		// This invalidates any existing dirty rect.  		resetDirty(); - +		  		// Send a size change message to the plugin  		{  			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change"); @@ -252,11 +254,11 @@ void LLPluginClassMedia::idle(void)  			message.setValueReal("background_b", mBackgroundColor.mV[VZ]);  			message.setValueReal("background_a", mBackgroundColor.mV[VW]);  			mPlugin->sendMessage(message);	// DO NOT just use sendMessage() here -- we want this to jump ahead of the queue. - +			  			LL_DEBUGS("Plugin") << "Sending size_change" << LL_ENDL;  		}  	} - +	  	if(mPlugin && mPlugin->isRunning())  	{  		// Send queued messages @@ -322,11 +324,11 @@ void LLPluginClassMedia::setSizeInternal(void)  		mRequestedMediaWidth = mDefaultMediaWidth;  		mRequestedMediaHeight = mDefaultMediaHeight;  	} - +	  	// Save these for size/interest calculations  	mFullMediaWidth = mRequestedMediaWidth;  	mFullMediaHeight = mRequestedMediaHeight; - +	  	if(mAllowDownsample)  	{  		switch(mPriority) @@ -340,19 +342,19 @@ void LLPluginClassMedia::setSizeInternal(void)  					mRequestedMediaHeight /= 2;  				}  			break; - +			  			default:  				// Don't adjust texture size  			break;  		}  	} - +	  	if(mAutoScaleMedia)  	{  		mRequestedMediaWidth = nextPowerOf2(mRequestedMediaWidth);  		mRequestedMediaHeight = nextPowerOf2(mRequestedMediaHeight);  	} - +	  	if(mRequestedMediaWidth > 2048)  		mRequestedMediaWidth = 2048; @@ -380,9 +382,9 @@ bool LLPluginClassMedia::textureValid(void)  		mRequestedMediaWidth != mMediaWidth ||  		mRequestedMediaHeight != mMediaHeight ||  		getBitsData() == NULL -	) +	)	  		return false; - +	  	return true;  } @@ -406,8 +408,8 @@ void LLPluginClassMedia::resetDirty(void)  std::string LLPluginClassMedia::translateModifiers(MASK modifiers)  {  	std::string result; - - +	 +	  	if(modifiers & MASK_CONTROL)  	{  		result += "control|"; @@ -430,7 +432,7 @@ std::string LLPluginClassMedia::translateModifiers(MASK modifiers)  	{  		result += "meta|";  	} -*/ +*/	  	return result;  } @@ -538,11 +540,11 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int  			// Don't spam unnecessary mouse move events.  			return;  		} - +		  		mLastMouseX = x;  		mLastMouseY = y;  	} - +	  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "mouse_event");  	std::string temp;  	switch(type) @@ -557,7 +559,7 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int  	message.setValueS32("button", button);  	message.setValueS32("x", x); - +	  	// Incoming coordinates are OpenGL-style ((0,0) = lower left), so flip them here if the plugin has requested it.  	if(!mRequestedTextureCoordsOpenGL)  	{ @@ -567,42 +569,42 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int  	message.setValueS32("y", y);  	message.setValue("modifiers", translateModifiers(modifiers)); - +	  	sendMessage(message);  }  bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data)  {  	bool result = true; - +	  	// FIXME:  	// HACK: we don't have an easy way to tell if the plugin is going to handle a particular keycode.  	// For now, return false for the ones the webkit plugin won't handle properly. - +	  	switch(key_code)  	{ -		case KEY_BACKSPACE: -		case KEY_TAB: -		case KEY_RETURN: -		case KEY_PAD_RETURN: -		case KEY_SHIFT: -		case KEY_CONTROL: -		case KEY_ALT: -		case KEY_CAPSLOCK: -		case KEY_ESCAPE: -		case KEY_PAGE_UP: -		case KEY_PAGE_DOWN: -		case KEY_END: -		case KEY_HOME: -		case KEY_LEFT: -		case KEY_UP: -		case KEY_RIGHT: -		case KEY_DOWN: -		case KEY_INSERT: +		case KEY_BACKSPACE:		 +		case KEY_TAB:			 +		case KEY_RETURN:		 +		case KEY_PAD_RETURN:	 +		case KEY_SHIFT:			 +		case KEY_CONTROL:		 +		case KEY_ALT:			 +		case KEY_CAPSLOCK:		 +		case KEY_ESCAPE:		 +		case KEY_PAGE_UP:		 +		case KEY_PAGE_DOWN:		 +		case KEY_END:			 +		case KEY_HOME:			 +		case KEY_LEFT:			 +		case KEY_UP:			 +		case KEY_RIGHT:			 +		case KEY_DOWN:			 +		case KEY_INSERT:		  		case KEY_DELETE: -			// These will be handled +			// These will be handled		  		break; - +		  		default:  			// regular ASCII characters will also be handled  			if(key_code >= KEY_SPECIAL) @@ -613,7 +615,7 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie  		break;  	} -#if LL_DARWIN +#if LL_DARWIN	  	if(modifiers & MASK_ALT)  	{  		// Option-key modified characters should be handled by the unicode input path instead of this one. @@ -632,17 +634,15 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie  			case KEY_EVENT_REPEAT:			temp = "repeat";		break;  		}  		message.setValue("event", temp); - +		  		message.setValueS32("key", key_code); - -  		message.setValue("modifiers", translateModifiers(modifiers));  		message.setValueLLSD("native_key_data", native_key_data); - +		  		sendMessage(message);  	} - +		  	return result;  } @@ -653,10 +653,10 @@ void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)  	message.setValueS32("x", x);  	message.setValueS32("y", y);  	message.setValue("modifiers", translateModifiers(modifiers)); - +	  	sendMessage(message);  } - +	  bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD native_key_data)  {  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event"); @@ -664,9 +664,9 @@ bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD  	message.setValue("text", text);  	message.setValue("modifiers", translateModifiers(modifiers));  	message.setValueLLSD("native_key_data", native_key_data); - +	  	sendMessage(message); - +	  	return true;  } @@ -688,7 +688,7 @@ void LLPluginClassMedia::loadURI(const std::string &uri)  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "load_uri");  	message.setValue("uri", uri); - +	  	sendMessage(message);  } @@ -705,7 +705,7 @@ const char* LLPluginClassMedia::priorityToString(EPriority priority)  		case PRIORITY_NORMAL:		result = "normal";		break;  		case PRIORITY_HIGH:			result = "high";		break;  	} - +	  	return result;  } @@ -716,44 +716,44 @@ void LLPluginClassMedia::setPriority(EPriority priority)  		mPriority = priority;  		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_priority"); - +		  		std::string priority_string = priorityToString(priority);  		switch(priority)  		{ -			case PRIORITY_UNLOADED: +			case PRIORITY_UNLOADED:	  				mSleepTime = 1.0f;  			break; -			case PRIORITY_STOPPED: +			case PRIORITY_STOPPED:	  				mSleepTime = 1.0f;  			break; -			case PRIORITY_HIDDEN: +			case PRIORITY_HIDDEN:	  				mSleepTime = 1.0f;  			break;  			case PRIORITY_SLIDESHOW:  				mSleepTime = 1.0f;  			break; -			case PRIORITY_LOW: +			case PRIORITY_LOW:		  				mSleepTime = 1.0f / 25.0f;  			break; -			case PRIORITY_NORMAL: +			case PRIORITY_NORMAL:	  				mSleepTime = 1.0f / 50.0f;  			break; -			case PRIORITY_HIGH: +			case PRIORITY_HIGH:		  				mSleepTime = 1.0f / 100.0f;  			break;  		} - +		  		message.setValue("priority", priority_string);  		sendMessage(message); - +		  		if(mPlugin)  		{  			mPlugin->setSleepTime(mSleepTime);  		} - +		  		LL_DEBUGS("PluginPriority") << this << ": setting priority to " << priority_string << LL_ENDL; - +		  		// This may affect the calculated size, so recalculate it here.  		setSizeInternal();  	} @@ -774,12 +774,12 @@ void LLPluginClassMedia::setLowPrioritySizeLimit(int size)  F64 LLPluginClassMedia::getCPUUsage()  {  	F64 result = 0.0f; - +	  	if(mPlugin)  	{  		result = mPlugin->getCPUUsage();  	} - +	  	return result;  } @@ -843,14 +843,14 @@ void LLPluginClassMedia::setLanguageCode(const std::string &language_code)  void LLPluginClassMedia::setPluginsEnabled(const bool enabled)  { -	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "plugins_enabled"); +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "plugins_enabled");  	message.setValueBoolean("enable", enabled);  	sendMessage(message);  }  void LLPluginClassMedia::setJavascriptEnabled(const bool enabled)  { -	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "javascript_enabled"); +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "javascript_enabled");  	message.setValueBoolean("enable", enabled);  	sendMessage(message);  } @@ -868,11 +868,11 @@ void LLPluginClassMedia::setTarget(const std::string &target)  	mTarget = target;  } -/* virtual */ +/* virtual */   void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  {  	std::string message_class = message.getClass(); - +	  	if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)  	{  		std::string message_name = message.getName(); @@ -883,21 +883,21 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  			mRequestedTextureFormat = message.getValueU32("format");  			mRequestedTextureType = message.getValueU32("type");  			mRequestedTextureSwapBytes = message.getValueBoolean("swap_bytes"); -			mRequestedTextureCoordsOpenGL = message.getValueBoolean("coords_opengl"); - +			mRequestedTextureCoordsOpenGL = message.getValueBoolean("coords_opengl");			 +			  			// These two are optional, and will default to 0 if they're not specified.  			mDefaultMediaWidth = message.getValueS32("default_width");  			mDefaultMediaHeight = message.getValueS32("default_height"); - +			  			mAllowDownsample = message.getValueBoolean("allow_downsample");  			mPadding = message.getValueS32("padding");  			setSizeInternal(); - +			  			mTextureParamsReceived = true;  		}  		else if(message_name == "updated") -		{ +		{			  			if(message.hasValue("left"))  			{  				LLRect newDirtyRect; @@ -905,7 +905,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  				newDirtyRect.mTop = message.getValueS32("top");  				newDirtyRect.mRight = message.getValueS32("right");  				newDirtyRect.mBottom = message.getValueS32("bottom"); - +							  				// The plugin is likely to have top and bottom switched, due to vertical flip and OpenGL coordinate confusion.  				// If they're backwards, swap them.  				if(newDirtyRect.mTop < newDirtyRect.mBottom) @@ -914,7 +914,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  					newDirtyRect.mTop = newDirtyRect.mBottom;  					newDirtyRect.mBottom = temp;  				} - +				  				if(mDirtyRect.isEmpty())  				{  					mDirtyRect = newDirtyRect; @@ -924,7 +924,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  					mDirtyRect.unionWith(newDirtyRect);  				} -				LL_DEBUGS("Plugin") << "adjusted incoming rect is: (" +				LL_DEBUGS("Plugin") << "adjusted incoming rect is: ("   					<< newDirtyRect.mLeft << ", "  					<< newDirtyRect.mTop << ", "  					<< newDirtyRect.mRight << ", " @@ -934,10 +934,10 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  					<< mDirtyRect.mRight << ", "  					<< mDirtyRect.mBottom << ")"  					<< LL_ENDL; - +				  				mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CONTENT_UPDATED); -			} - +			}			 +			  			bool time_duration_updated = false;  			int previous_percent = mProgressPercent; @@ -957,7 +957,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  			{  				mCurrentRate = message.getValueReal("current_rate");  			} - +			  			if(message.hasValue("loaded_duration"))  			{  				mLoadedDuration = message.getValueReal("loaded_duration"); @@ -968,7 +968,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  				// If the message doesn't contain a loaded_duration param, assume it's equal to duration  				mLoadedDuration = mDuration;  			} - +			  			// Calculate a percentage based on the loaded duration and total duration.  			if(mDuration != 0.0f)	// Don't divide by zero.  			{ @@ -979,7 +979,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  			{  				mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_TIME_DURATION_UPDATED);  			} - +			  			if(previous_percent != mProgressPercent)  			{  				mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PROGRESS_UPDATED); @@ -988,9 +988,9 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  		else if(message_name == "media_status")  		{  			std::string status = message.getValue("status"); - +			  			LL_DEBUGS("Plugin") << "Status changed to: " << status << LL_ENDL; - +			  			if(status == "loading")  			{  				mStatus = LLPluginClassMediaOwner::MEDIA_LOADING; @@ -1030,24 +1030,24 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  			// TODO: check that name matches?  			mNaturalMediaWidth = width;  			mNaturalMediaHeight = height; - +			  			setSizeInternal();  		}  		else if(message_name == "size_change_response")  		{  			std::string name = message.getValue("name"); - +			  			// TODO: check that name matches? - +			  			mTextureWidth = message.getValueS32("texture_width");  			mTextureHeight = message.getValueS32("texture_height");  			mMediaWidth = message.getValueS32("width");  			mMediaHeight = message.getValueS32("height"); - +			  			// This invalidates any existing dirty rect.  			resetDirty(); - -			// TODO: should we verify that the plugin sent back the right values? +			 +			// TODO: should we verify that the plugin sent back the right values?    			// Two size changes in a row may cause them to not match, due to queueing, etc.  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_SIZE_CHANGED); @@ -1114,7 +1114,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  			mNavigateResultString = message.getValue("result_string");  			mHistoryBackAvailable = message.getValueBoolean("history_back_available");  			mHistoryForwardAvailable = message.getValueBoolean("history_forward_available"); - +			  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_COMPLETE);  		}  		else if(message_name == "progress") @@ -1136,7 +1136,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  		{  			mClickURL = message.getValue("uri");  			mClickTarget = message.getValue("target"); -			//mClickUUID = message.getValue("uuid"); +			mClickUUID = message.getValue("uuid");  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_HREF);  		}  		else if(message_name == "click_nofollow") @@ -1169,7 +1169,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  			mGeometryY = message.getValueS32("y");  			mGeometryWidth = message.getValueS32("width");  			mGeometryHeight = message.getValueS32("height"); - +				  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_GEOMETRY_CHANGE);  		}  		else if(message_name == "link_hovered") @@ -1178,7 +1178,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  			mHoverLink = message.getValue("link");  			mHoverText = message.getValue("title");  			// message.getValue("text"); - +				  			mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_LINK_HOVERED);  		}  		else @@ -1194,7 +1194,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  //		if(message_name == "message_name")  //		{  //		} -//		else +//		else   		{  			LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;  		} @@ -1202,13 +1202,13 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)  } -/* virtual */ +/* virtual */   void LLPluginClassMedia::pluginLaunchFailed()  {  	mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED_LAUNCH);  } -/* virtual */ +/* virtual */   void LLPluginClassMedia::pluginDied()  {  	mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED); @@ -1248,7 +1248,7 @@ void LLPluginClassMedia::focus(bool focused)  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "focus");  	message.setValueBoolean("focused", focused); - +	  	sendMessage(message);  } @@ -1275,13 +1275,13 @@ void LLPluginClassMedia::clear_cookies()  void LLPluginClassMedia::set_cookies(const std::string &cookies)  {  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_cookies"); -	message.setValue("cookies", cookies); +	message.setValue("cookies", cookies);	  	sendMessage(message);  }  void LLPluginClassMedia::enable_cookies(bool enable)  { -	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "cookies_enabled"); +	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "enable_cookies");  	message.setValueBoolean("enable", enable);  	sendMessage(message);  } @@ -1308,7 +1308,7 @@ void LLPluginClassMedia::browse_reload(bool ignore_cache)  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_reload");  	message.setValueBoolean("ignore_cache", ignore_cache); - +	  	sendMessage(message);  } @@ -1373,6 +1373,12 @@ void LLPluginClassMedia::addCertificateFilePath(const std::string& path)  	sendMessage(message);  } +void LLPluginClassMedia::setOverrideClickTarget(const std::string &target) +{ +	mClickEnforceTarget = true; +	mOverrideClickTarget = target; +} +  void LLPluginClassMedia::crashPlugin()  {  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "crash"); @@ -1422,7 +1428,7 @@ void LLPluginClassMedia::seek(float time)  	LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "seek");  	message.setValueReal("time", time); - +	  	sendMessage(message);  } @@ -1440,11 +1446,11 @@ void LLPluginClassMedia::setVolume(float volume)  	if(volume != mRequestedVolume)  	{  		mRequestedVolume = volume; - +		  		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "set_volume");  		message.setValueReal("volume", volume); - +		  		sendMessage(message);  	}  } diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index 3f53551b90..255fb0e2f1 100755 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -251,6 +251,13 @@ public:  	// This is valid during MEDIA_EVENT_CLICK_LINK_HREF and MEDIA_EVENT_GEOMETRY_CHANGE  	std::string getClickUUID() const { return mClickUUID; }; +	// mClickTarget is received from message and governs how link will be opened +	// use this to enforce your own way of opening links inside plugins +	void setOverrideClickTarget(const std::string &target); +	void resetOverrideClickTarget() { mClickEnforceTarget = false; }; +	bool isOverrideClickTarget() const { return mClickEnforceTarget; } +	std::string getOverrideClickTarget() const { return mOverrideClickTarget; }; +  	// These are valid during MEDIA_EVENT_DEBUG_MESSAGE  	std::string getDebugMessageText() const { return mDebugMessageText; };  	std::string getDebugMessageLevel() const { return mDebugMessageLevel; }; @@ -406,6 +413,8 @@ protected:  	std::string		mClickNavType;  	std::string		mClickTarget;  	std::string		mClickUUID; +	bool			mClickEnforceTarget; +	std::string		mOverrideClickTarget;  	std::string		mDebugMessageText;  	std::string		mDebugMessageLevel;  	S32				mGeometryX; | 
