summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp28
-rw-r--r--indra/llplugin/llpluginclassmedia.h12
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp1
-rw-r--r--indra/newview/llfloaterabout.cpp2
-rw-r--r--indra/newview/llmediactrl.cpp45
-rw-r--r--indra/newview/llmediactrl.h1
6 files changed, 72 insertions, 17 deletions
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index ed8d10a88c..2c9fb35588 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -37,6 +37,8 @@
#include "llpluginclassmedia.h"
#include "llpluginmessageclasses.h"
+#include "llqtwebkit.h"
+
static int LOW_PRIORITY_TEXTURE_SIZE_DEFAULT = 256;
static int nextPowerOf2( int value )
@@ -134,6 +136,9 @@ void LLPluginClassMedia::reset()
mHistoryForwardAvailable = false;
mStatusText.clear();
mProgressPercent = 0;
+ mClickURL.clear();
+ mClickTarget.clear();
+ mClickTargetType = TARGET_NONE;
// media_time class
mCurrentTime = 0.0f;
@@ -669,6 +674,26 @@ void LLPluginClassMedia::paste()
sendMessage(message);
}
+LLPluginClassMedia::ETargetType getTargetTypeFromLLQtWebkit(int target_type)
+{
+ // 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 LinkTargetType::LTT_TARGET_NONE:
+ return LLPluginClassMedia::TARGET_NONE;
+
+ case LinkTargetType::LTT_TARGET_BLANK:
+ return LLPluginClassMedia::TARGET_BLANK;
+
+ case LinkTargetType::LTT_TARGET_EXTERNAL:
+ return LLPluginClassMedia::TARGET_EXTERNAL;
+
+ default:
+ return LLPluginClassMedia::TARGET_OTHER;
+ }
+}
+
/* virtual */
void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
{
@@ -921,12 +946,15 @@ 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);
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
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 5a1928ab1d..ebb9099576 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -214,6 +214,17 @@ 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; };
+
std::string getMediaName() const { return mMediaName; };
std::string getMediaDescription() const { return mMediaDescription; };
@@ -344,6 +355,7 @@ protected:
std::string mLocation;
std::string mClickURL;
std::string mClickTarget;
+ ETargetType mClickTargetType;
/////////////////////////////////////////
// media_time class
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index a0336f6156..084cdd9561 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -429,6 +429,7 @@ private:
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_href");
message.setValue("uri", event.getStringValue());
message.setValue("target", event.getStringValue2());
+ message.setValueU32("target_type", event.getLinkType());
sendMessage(message);
}
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index aa343b2f69..ef69f39ad2 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -269,7 +269,7 @@ LLSD LLFloaterAbout::getInfo()
info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : LLTrans::getString("NotConnected");
// TODO: Implement media plugin version query
- info["QT_WEBKIT_VERSION"] = "4.5.2 (version number hard-coded)";
+ info["QT_WEBKIT_VERSION"] = "4.6 (version number hard-coded)";
if (gPacketsIn > 0)
{
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 6b0f9b709d..87ebce1d34 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -84,7 +84,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
mHomePageUrl( "" ),
mIgnoreUIScale( true ),
mAlwaysRefresh( false ),
- mExternalUrl( "" ),
mMediaSource( 0 ),
mTakeFocusOnClick( true ),
mCurrentNavUrl( "" ),
@@ -877,9 +876,27 @@ bool LLMediaCtrl::onClickLinkExternalTarget(const LLSD& notification, const LLSD
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( 0 == option )
{
- // open in external browser because we don't support
- // creation of our own secondary browser windows
- LLWeb::loadURLExternal( notification["payload"]["external_url"].asString() );
+ LLSD payload = notification["payload"];
+ std::string url = payload["url"].asString();
+ S32 target_type = payload["target_type"].asInteger();
+
+ switch (target_type)
+ {
+ case LLPluginClassMedia::TARGET_EXTERNAL:
+ // load target in an external browser
+ LLWeb::loadURLExternal(url);
+ break;
+
+ case LLPluginClassMedia::TARGET_BLANK:
+ // load target in the user's preferred browser
+ LLWeb::loadURL(url);
+ break;
+
+ default:
+ // unsupported link target - shouldn't happen
+ LL_WARNS("LinkTarget") << "Unsupported link target type" << LL_ENDL;
+ break;
+ }
}
return false;
}
@@ -993,20 +1010,18 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
void LLMediaCtrl::onClickLinkHref( LLPluginClassMedia* self )
{
// retrieve the event parameters
- std::string target = self->getClickTarget();
std::string url = self->getClickURL();
+ U32 target_type = self->getClickTargetType();
- // if there is a value for the target
- if ( !target.empty() )
+ // is there is a target specified for the link?
+ if (target_type == LLPluginClassMedia::TARGET_EXTERNAL ||
+ target_type == LLPluginClassMedia::TARGET_BLANK)
{
- if ( target == "_external" )
- {
- mExternalUrl = url;
- LLSD payload;
- payload["external_url"] = mExternalUrl;
- LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
- return;
- }
+ LLSD payload;
+ payload["url"] = url;
+ payload["target_type"] = LLSD::Integer(target_type);
+ LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
+ return;
}
const std::string protocol1( "http://" );
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 8f9e6e7179..b0aca3cfa4 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -182,7 +182,6 @@ public:
bool mOpenLinksInInternalBrowser;
bool mTrusted;
std::string mHomePageUrl;
- std::string mExternalUrl;
std::string mCurrentNavUrl;
bool mIgnoreUIScale;
bool mAlwaysRefresh;