diff options
| -rw-r--r-- | indra/llui/llurlentry.cpp | 25 | ||||
| -rw-r--r-- | indra/llui/llurlentry.h | 11 | ||||
| -rw-r--r-- | indra/llui/llurlregistry.cpp | 18 | ||||
| -rw-r--r-- | indra/newview/llfloatersearch.cpp | 18 | ||||
| -rw-r--r-- | indra/newview/llfloatersearch.h | 8 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_search.xml | 14 | 
7 files changed, 97 insertions, 5 deletions
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 7694d02837..7350457274 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -197,6 +197,31 @@ std::string LLUrlEntryHTTPLabel::getUrl(const std::string &string)  }  // +// LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com +// +LLUrlEntryHTTPNoProtocol::LLUrlEntryHTTPNoProtocol() +{ +	mPattern = boost::regex("(\\bwww\\.\\S+\\.\\S+|\\S+.com\\S*|\\S+.net\\S*|\\S+.edu\\S*|\\S+.org\\S*)", +							boost::regex::perl|boost::regex::icase); +	mMenuName = "menu_url_http.xml"; +	mTooltip = LLTrans::getString("TooltipHttpUrl"); +} + +std::string LLUrlEntryHTTPNoProtocol::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ +	return unescapeUrl(url); +} + +std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) +{ +	if (string.find("://") == std::string::npos) +	{ +		return "http://" + escapeUrl(string); +	} +	return escapeUrl(string); +} + +//  // LLUrlEntrySLURL Describes generic http: and https: Urls  //  LLUrlEntrySLURL::LLUrlEntrySLURL() diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index b3fb333fdd..4adffde99c 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -135,6 +135,17 @@ public:  };  /// +/// LLUrlEntryHTTPNoProtocol Describes generic Urls like www.google.com +/// +class LLUrlEntryHTTPNoProtocol : public LLUrlEntryBase +{ +public: +	LLUrlEntryHTTPNoProtocol(); +	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +	/*virtual*/ std::string getUrl(const std::string &string); +}; + +///  /// LLUrlEntrySLURL Describes http://slurl.com/... Urls  ///  class LLUrlEntrySLURL : public LLUrlEntryBase diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index f47db2db1a..afcff0d409 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -58,6 +58,9 @@ LLUrlRegistry::LLUrlRegistry()  	//so it should be registered in the end of list  	registerUrl(new LLUrlEntrySL());  	registerUrl(new LLUrlEntrySLLabel()); +	// most common pattern is a URL without any protocol, +	// e.g., "secondlife.com" +	registerUrl(new LLUrlEntryHTTPNoProtocol());	  }  LLUrlRegistry::~LLUrlRegistry() @@ -118,10 +121,23 @@ static bool matchRegex(const char *text, boost::regex regex, U32 &start, U32 &en  	return true;  } +static bool stringHasUrl(const std::string &text) +{ +	// fast heuristic test for a URL in a string. This is used +	// to avoid lots of costly regex calls, BUT it needs to be +	// kept in sync with the LLUrlEntry regexes we support. +	return (text.find("://") != std::string::npos || +			text.find("www.") != std::string::npos || +			text.find(".com") != std::string::npos || +			text.find(".net") != std::string::npos || +			text.find(".edu") != std::string::npos || +			text.find(".org") != std::string::npos); +} +  bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb)  {  	// avoid costly regexes if there is clearly no URL in the text -	if (text.find("://") == std::string::npos) +	if (! stringHasUrl(text))  	{  		return false;  	} diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 2c618263ec..c658963708 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -42,7 +42,8 @@  LLFloaterSearch::LLFloaterSearch(const LLSD& key) :  	LLFloater(key),  	LLViewerMediaObserver(), -	mBrowser(NULL) +	mBrowser(NULL), +	mSearchGodLevel(0)  {  	// declare a map that transforms a category name into  	// the URL suffix that is used to search that category @@ -86,12 +87,21 @@ void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent eve  	case MEDIA_EVENT_NAVIGATE_COMPLETE:  		childSetText("status_text", getString("done_text"));  		break; -		 +  	default:  		break;  	}  } +void LLFloaterSearch::godLevelChanged(U8 godlevel) +{ +	// search results can change based upon god level - if the user +	// changes god level, then give them a warning (we don't refresh +	// the search as this might undo any page navigation or +	// AJAX-driven changes since the last search). +	childSetVisible("refresh_search", (godlevel != mSearchGodLevel)); +} +  void LLFloaterSearch::search(const LLSD &key)  {  	if (! mBrowser) @@ -99,6 +109,10 @@ void LLFloaterSearch::search(const LLSD &key)  		return;  	} +	// reset the god level warning as we're sending the latest state +	childHide("refresh_search"); +	mSearchGodLevel = gAgent.getGodLevel(); +  	// get the URL for the search page  	std::string url = getString("search_url");  	if (! LLStringUtil::endsWith(url, "/")) diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h index 743107484f..ba817adf7f 100644 --- a/indra/newview/llfloatersearch.h +++ b/indra/newview/llfloatersearch.h @@ -66,14 +66,20 @@ public:  	///    "events", "groups", "wiki", "destinations", "classifieds"  	void search(const LLSD &key); +	/// changing godmode can affect the search results that are +	/// returned by the search website - use this method to tell the +	/// search floater that the user has changed god level. +	void godLevelChanged(U8 godlevel); +  private:  	/*virtual*/ BOOL postBuild();  	// inherited from LLViewerMediaObserver  	/*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event); -	 +  	LLMediaCtrl *mBrowser;  	LLSD        mCategoryPaths; +	U8          mSearchGodLevel;  };  #endif  // LL_LLFLOATERSEARCH_H diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 78322dda75..9def699708 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -59,6 +59,7 @@  #include "llfloaterland.h"  #include "llfloaterpay.h"  #include "llfloaterreporter.h" +#include "llfloatersearch.h"  #include "llfloaterscriptdebug.h"  #include "llfloatertools.h"  #include "llfloaterworldmap.h" @@ -3408,6 +3409,13 @@ void set_god_level(U8 god_level)  	// changing god-level can affect which menus we see  	show_debug_menus(); + +	// changing god-level can invalidate search results +	LLFloaterSearch *search = dynamic_cast<LLFloaterSearch*>(LLFloaterReg::getInstance("search")); +	if (search) +	{ +		search->godLevelChanged(god_level); +	}  }  #ifdef TOGGLE_HACKED_GODLIKE_VIEWER diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index 82e4d87b28..e6bdcdf78e 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -55,8 +55,20 @@               layout="topleft"               left_delta="0"               name="status_text" -             top_pad="5" +             top_pad="7"               width="150" /> +            <text +             visible="false" +             follows="bottom|right" +             height="16" +             left_delta="0" +             name="refresh_search" +             left_pad="0" +             right="-10" +             halign="right" +             width="450"> +               Redo search to reflect current God level +            </text>          </layout_panel>      </layout_stack>  </floater>  | 
