diff options
| -rwxr-xr-x | doc/contributions.txt | 2 | ||||
| -rw-r--r-- | indra/llcommon/lluriparser.cpp | 11 | ||||
| -rw-r--r-- | indra/llcommon/lluriparser.h | 2 | ||||
| -rwxr-xr-x | indra/llui/lltextbase.cpp | 1 | ||||
| -rwxr-xr-x | indra/llui/llurlentry.cpp | 23 | ||||
| -rwxr-xr-x | indra/llui/llurlentry.h | 7 | ||||
| -rwxr-xr-x | indra/llui/llurlregistry.cpp | 13 | ||||
| -rwxr-xr-x | indra/llui/llurlregistry.h | 1 | ||||
| -rwxr-xr-x | indra/newview/llweb.cpp | 19 | 
9 files changed, 43 insertions, 36 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index f7041c538e..211d4fcf08 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -327,6 +327,7 @@ Cinder Roxley      STORM-2036      STORM-2037      STORM-2053 +    STORM-2113  Clara Young  Coaldust Numbers      VWR-1095 @@ -1231,6 +1232,7 @@ Sovereign Engineer      MAINT-2334      OPEN-189      STORM-1972 +    STORM-2113      OPEN-195      OPEN-217      OPEN-295 diff --git a/indra/llcommon/lluriparser.cpp b/indra/llcommon/lluriparser.cpp index ef4481d32f..0ff6657b87 100644 --- a/indra/llcommon/lluriparser.cpp +++ b/indra/llcommon/lluriparser.cpp @@ -118,11 +118,14 @@ void LLUriParser::fragment(const std::string& s)  void LLUriParser::textRangeToString(UriTextRangeA& textRange, std::string& str)  { -	S32 len = textRange.afterLast - textRange.first; -	if (len) +	if (textRange.first != NULL && textRange.afterLast != NULL && textRange.first < textRange.afterLast)  	{ -		str = textRange.first; -		str = str.substr(0, len); +		const ptrdiff_t len = textRange.afterLast - textRange.first; +		str.assign(textRange.first, static_cast<std::string::size_type>(len)); +	} +	else +	{ +		str = LLStringUtil::null;  	}  } diff --git a/indra/llcommon/lluriparser.h b/indra/llcommon/lluriparser.h index 719f916837..3e7a5c2a57 100644 --- a/indra/llcommon/lluriparser.h +++ b/indra/llcommon/lluriparser.h @@ -36,7 +36,7 @@ class LL_COMMON_API LLUriParser  {  public:  	LLUriParser(const std::string& u); -	virtual ~LLUriParser(); +	~LLUriParser();  	const char * scheme() const;  	void sheme (const std::string& s); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 43e048d216..8af63e9e7d 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -38,7 +38,6 @@  #include "lltextutil.h"  #include "lltooltip.h"  #include "lluictrl.h" -#include "lluriparser.h"  #include "llurlaction.h"  #include "llurlregistry.h"  #include "llview.h" diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 7e4104c49b..52e6965f33 100755 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -39,8 +39,6 @@  #include "lluicolortable.h"  #include "message.h" -#include "uriparser/Uri.h" -  #define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))"  // Utility functions @@ -347,27 +345,36 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const  //  // LLUrlEntrySeconlifeURLs Describes *secondlife.com and *lindenlab.com urls to substitute icon 'hand.png' before link  // -LLUrlEntrySeconlifeURL::LLUrlEntrySeconlifeURL() +LLUrlEntrySecondlifeURL::LLUrlEntrySecondlifeURL()  {   	mPattern = boost::regex("\\b(https?://)?([-\\w\\.]*\\.)?(secondlife|lindenlab)\\.com(:\\d{1,5})?(/\\S*)?\\b",  		boost::regex::perl|boost::regex::icase);  	mIcon = "Hand";  	mMenuName = "menu_url_http.xml"; +	mTooltip = LLTrans::getString("TooltipHttpUrl");  } -std::string LLUrlEntrySeconlifeURL::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +/// Return the url from a string that matched the regex +std::string LLUrlEntrySecondlifeURL::getUrl(const std::string &string) const  { -	LLUriParser up(url); -	up.extractParts(); -	return up.host(); +	if (string.find("://") == std::string::npos) +	{ +		return "https://" + escapeUrl(string); +	} +	return escapeUrl(string);  } -std::string LLUrlEntrySeconlifeURL::getTooltip(const std::string &url) const +std::string LLUrlEntrySecondlifeURL::getLabel(const std::string &url, const LLUrlLabelCallback &cb)  {  	return url;  } +std::string LLUrlEntrySecondlifeURL::getTooltip(const std::string &url) const +{ +	return mTooltip; +} +  //  // LLUrlEntryAgent Describes a Second Life agent Url, e.g.,  // secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 1cb11cdb1c..d142dff0bc 100755 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -172,11 +172,12 @@ public:  ///  /// LLUrlEntrySeconlifeURLs Describes *secondlife.com and *lindenlab.com Urls  /// -class LLUrlEntrySeconlifeURL : public LLUrlEntryBase +class LLUrlEntrySecondlifeURL : public LLUrlEntryBase  {  public: -	LLUrlEntrySeconlifeURL(); -	bool isTrusted() const { return true; } +	LLUrlEntrySecondlifeURL(); +	/*virtual*/ bool isTrusted() const { return true; } +	/*virtual*/ std::string getUrl(const std::string &string) const;  	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);  	/*virtual*/ std::string getTooltip(const std::string &url) const; diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 9e8d8d01f1..0f42a1a80c 100755 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -47,7 +47,7 @@ LLUrlRegistry::LLUrlRegistry()  	registerUrl(new LLUrlEntrySLURL());  	// decorated links for host names like: secondlife.com and lindenlab.com -	registerUrl(new LLUrlEntrySeconlifeURL()); +	registerUrl(new LLUrlEntrySecondlifeURL());  	registerUrl(new LLUrlEntryHTTP());  	mUrlEntryHTTPLabel = new LLUrlEntryHTTPLabel(); @@ -209,9 +209,12 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL  		// fill in the LLUrlMatch object and return it  		std::string url = text.substr(match_start, match_end - match_start + 1); -		LLUriParser up(url); -		up.normalize(); -		url = up.normalizedUri(); +		if (match_entry == mUrlEntryTrusted) +		{ +			LLUriParser up(url); +			up.normalize(); +			url = up.normalizedUri(); +		}  		match.setValues(match_start, match_end,  						match_entry->getUrl(url), @@ -243,7 +246,7 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr  		// character encoding, so we need to update the start  		// and end values to be correct for the wide string.  		LLWString wurl = utf8str_to_wstring(match.getUrl()); -		S32 start = text.find(wurl); +		size_t start = text.find(wurl);  		if (start == std::string::npos)  		{  			return false; diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index 1cb403dfc9..c571d1f075 100755 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -93,6 +93,7 @@ private:  	friend class LLSingleton<LLUrlRegistry>;  	std::vector<LLUrlEntryBase *> mUrlEntry; +	LLUrlEntryBase*	mUrlEntryTrusted;  	LLUrlEntryBase*	mUrlEntryIcon;  	LLUrlEntryBase* mUrlEntryHTTPLabel;  	LLUrlEntryBase* mUrlEntrySLLabel; diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 0f0d9ce703..0be6e49834 100755 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -49,7 +49,7 @@  #include "llviewerregion.h"  #include "llviewerwindow.h"  #include "llnotificationsutil.h" - +#include "lluriparser.h"  #include "uriparser/Uri.h"  #include <boost/regex.hpp> @@ -240,19 +240,10 @@ bool LLWeb::useExternalBrowser(const std::string &url)  	}  	else if (gSavedSettings.getU32("PreferredBrowserBehavior") == BROWSER_INT_LL_EXT_OTHERS)  	{ -		UriParserStateA state; -		UriUriA uri; -		state.uri = &uri; - -		std::string uri_string = url; -		uriParseUriA(&state, uri_string.c_str()); -		if (uri.hostText.first) -		{ -			S32 length = uri.hostText.afterLast - uri.hostText.first; -			std::string buf = uri.hostText.first; -			uri_string = buf.substr(0,length); -		} -		uriFreeUriMembersA(&uri); +		LLUriParser up(url); +		up.normalize(); +		up.extractParts(); +		std::string uri_string = up.host();  		boost::regex pattern = boost::regex("\\b(lindenlab.com|secondlife.com)$", boost::regex::perl|boost::regex::icase);  		boost::match_results<std::string::const_iterator> matches; | 
