diff options
| author | Dessie Linden <dessie@lindenlab.com> | 2011-01-19 12:06:25 -0800 | 
|---|---|---|
| committer | Dessie Linden <dessie@lindenlab.com> | 2011-01-19 12:06:25 -0800 | 
| commit | 120e64387cc8275de68aca990d186540f5468c89 (patch) | |
| tree | d4df26e5c9ad7d75ab4fc7cf5fb725b24e299837 | |
| parent | 224a63edbe04ec7662cc7351d882cfbcb36884a0 (diff) | |
| parent | 6b7a7081c31607bada575dd2f0a226bc5d721fc2 (diff) | |
Removed accidental changeset id tag
| -rw-r--r-- | indra/llcommon/llavatarname.cpp | 2 | ||||
| -rw-r--r-- | indra/llcommon/llavatarname.h | 2 | ||||
| -rw-r--r-- | indra/llmessage/llavatarnamecache.cpp | 265 | ||||
| -rw-r--r-- | indra/llmessage/llavatarnamecache.h | 3 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llimview.cpp | 28 | ||||
| -rw-r--r-- | indra/newview/llpanellogin.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_web_content.xml | 26 | 
8 files changed, 196 insertions, 139 deletions
| diff --git a/indra/llcommon/llavatarname.cpp b/indra/llcommon/llavatarname.cpp index b1ec9e9875..ad1845d387 100644 --- a/indra/llcommon/llavatarname.cpp +++ b/indra/llcommon/llavatarname.cpp @@ -48,7 +48,7 @@ LLAvatarName::LLAvatarName()  	mLegacyFirstName(),  	mLegacyLastName(),  	mIsDisplayNameDefault(false), -	mIsDummy(false), +	mIsTemporaryName(false),  	mExpires(F64_MAX),  	mNextUpdate(0.0)  { } diff --git a/indra/llcommon/llavatarname.h b/indra/llcommon/llavatarname.h index 145aeccd35..ba258d6d52 100644 --- a/indra/llcommon/llavatarname.h +++ b/indra/llcommon/llavatarname.h @@ -79,7 +79,7 @@ public:  	// Under error conditions, we may insert "dummy" records with  	// names like "???" into caches as placeholders.  These can be  	// shown in UI, but are not serialized. -	bool mIsDummy; +	bool mIsTemporaryName;  	// Names can change, so need to keep track of when name was  	// last checked. diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 03c28eb2a5..767001b633 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -81,8 +81,11 @@ namespace LLAvatarNameCache  	// only need per-frame timing resolution  	LLFrameTimer sRequestTimer; -	// Periodically clean out expired entries from the cache -	//LLFrameTimer sEraseExpiredTimer; +    /// Maximum time an unrefreshed cache entry is allowed +    const F64 MAX_UNREFRESHED_TIME = 20.0 * 60.0; + +    /// Time when unrefreshed cached names were checked last +    static F64 sLastExpireCheck;  	//-----------------------------------------------------------------------  	// Internal methods @@ -99,8 +102,9 @@ namespace LLAvatarNameCache  	// Legacy name system callback  	void legacyNameCallback(const LLUUID& agent_id, -		const std::string& full_name, -		bool is_group); +							const std::string& full_name, +							bool is_group +							);  	void requestNamesViaLegacy(); @@ -117,7 +121,7 @@ namespace LLAvatarNameCache  	bool isRequestPending(const LLUUID& agent_id);  	// Erase expired names from cache -	void eraseExpired(); +	void eraseUnrefreshed();  	bool expirationFromCacheControl(LLSD headers, F64 *expires);  } @@ -187,6 +191,7 @@ public:  	{  		// Pull expiration out of headers if available  		F64 expires = LLAvatarNameCache::nameExpirationFromHeaders(mHeaders); +		F64 now = LLFrameTimer::getTotalSeconds();  		LLSD agents = content["agents"];  		LLSD::array_const_iterator it = agents.beginArray(); @@ -207,84 +212,91 @@ public:  				av_name.mDisplayName = av_name.mUsername;  			} +			LL_DEBUGS("AvNameCache") << "LLAvatarNameResponder::result for " << agent_id << " " +									 << "user '" << av_name.mUsername << "' " +									 << "display '" << av_name.mDisplayName << "' " +									 << "expires in " << expires - now << " seconds" +									 << LL_ENDL; +			  			// cache it and fire signals  			LLAvatarNameCache::processName(agent_id, av_name, true);  		}  		// Same logic as error response case  		LLSD unresolved_agents = content["bad_ids"]; -		if (unresolved_agents.size() > 0) +		S32  num_unresolved = unresolved_agents.size(); +		if (num_unresolved > 0)  		{ -			const std::string DUMMY_NAME("\?\?\?"); -			LLAvatarName av_name; -			av_name.mUsername = DUMMY_NAME; -			av_name.mDisplayName = DUMMY_NAME; -			av_name.mIsDisplayNameDefault = false; -			av_name.mIsDummy = true; -			av_name.mExpires = expires; - +            LL_WARNS("AvNameCache") << "LLAvatarNameResponder::result " << num_unresolved << " unresolved ids; " +                                    << "expires in " << expires - now << " seconds" +                                    << LL_ENDL;  			it = unresolved_agents.beginArray();  			for ( ; it != unresolved_agents.endArray(); ++it)  			{  				const LLUUID& agent_id = *it; -				// cache it and fire signals -				LLAvatarNameCache::processName(agent_id, av_name, true); + +				LL_WARNS("AvNameCache") << "LLAvatarNameResponder::result " +                                        << "failed id " << agent_id +                                        << LL_ENDL; + +                LLAvatarNameCache::handleAgentError(agent_id);  			}  		} -	} +        LL_DEBUGS("AvNameCache") << "LLAvatarNameResponder::result "  +                                 << LLAvatarNameCache::sCache.size() << " cached names" +                                 << LL_ENDL; +    }  	/*virtual*/ void error(U32 status, const std::string& reason)  	{  		// If there's an error, it might be caused by PeopleApi,  		// or when loading textures on startup and using a very slow  -		// network, this query may time out. Fallback to the legacy -		// cache.  - -		llwarns << "LLAvatarNameResponder error " << status << " " << reason << llendl; +		// network, this query may time out. +		// What we should do depends on whether or not we have a cached name +		LL_WARNS("AvNameCache") << "LLAvatarNameResponder::error " << status << " " << reason +								<< LL_ENDL; -		// Add dummy records for all agent IDs in this request +		// Add dummy records for any agent IDs in this request that we do not have cached already  		std::vector<LLUUID>::const_iterator it = mAgentIDs.begin();  		for ( ; it != mAgentIDs.end(); ++it)  		{  			const LLUUID& agent_id = *it; -			gCacheName->get(agent_id, false,  // legacy compatibility -						boost::bind(&LLAvatarNameCache::legacyNameCallback, -						_1, _2, _3)); -		} -	} - -	// Return time to retry a request that generated an error, based on -	// error type and headers.  Return value is seconds-since-epoch. -	F64 errorRetryTimestamp(S32 status) -	{ -		F64 now = LLFrameTimer::getTotalSeconds(); - -		// Retry-After takes priority -		LLSD retry_after = mHeaders["retry-after"]; -		if (retry_after.isDefined()) -		{ -			// We only support the delta-seconds type -			S32 delta_seconds = retry_after.asInteger(); -			if (delta_seconds > 0) -			{ -				// ...valid delta-seconds -				return now + F64(delta_seconds); -			} +			LLAvatarNameCache::handleAgentError(agent_id);  		} - -		// If no Retry-After, look for Cache-Control max-age -		F64 expires = 0.0; -		if (LLAvatarNameCache::expirationFromCacheControl(mHeaders, &expires)) -		{ -			return expires; -		} - -		// No information in header, make a guess -		const F64 DEFAULT_DELAY = 120.0; // 2 mintues -		return now + DEFAULT_DELAY;  	}  }; +// Provide some fallback for agents that return errors +void LLAvatarNameCache::handleAgentError(const LLUUID& agent_id) +{ +	std::map<LLUUID,LLAvatarName>::iterator existing = sCache.find(agent_id); +	if (existing == sCache.end()) +    { +        // there is no existing cache entry, so make a temporary name from legacy +        LL_WARNS("AvNameCache") << "LLAvatarNameCache get legacy for agent " +                                << agent_id << LL_ENDL; +        gCacheName->get(agent_id, false,  // legacy compatibility +                        boost::bind(&LLAvatarNameCache::legacyNameCallback, +                                    _1, _2, _3)); +    } +	else +    { +        // we have a chached (but probably expired) entry - since that would have +        // been returned by the get method, there is no need to signal anyone + +        // Clear this agent from the pending list +        LLAvatarNameCache::sPendingQueue.erase(agent_id); + +        const LLAvatarName& av_name = existing->second; +        LL_DEBUGS("AvNameCache") << "LLAvatarNameCache use cache for agent " +                                 << agent_id  +                                 << "user '" << av_name.mUsername << "' " +                                 << "display '" << av_name.mDisplayName << "' " +                                 << "expires in " << av_name.mExpires - LLFrameTimer::getTotalSeconds() << " seconds" +                                 << LL_ENDL; +    } +} +  void LLAvatarNameCache::processName(const LLUUID& agent_id,  									const LLAvatarName& av_name,  									bool add_to_cache) @@ -326,6 +338,7 @@ void LLAvatarNameCache::requestNamesViaCapability()  	std::vector<LLUUID> agent_ids;  	agent_ids.reserve(128); +	U32 ids = 0;  	ask_queue_t::const_iterator it = sAskQueue.begin();  	for ( ; it != sAskQueue.end(); ++it)  	{ @@ -336,11 +349,13 @@ void LLAvatarNameCache::requestNamesViaCapability()  			// ...starting new request  			url += sNameLookupURL;  			url += "?ids="; +			ids = 1;  		}  		else  		{  			// ...continuing existing request  			url += "&ids="; +			ids++;  		}  		url += agent_id.asString();  		agent_ids.push_back(agent_id); @@ -350,8 +365,10 @@ void LLAvatarNameCache::requestNamesViaCapability()  		if (url.size() > NAME_URL_SEND_THRESHOLD)  		{ -			//llinfos << "requestNames " << url << llendl; -			LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));//, LLSD(), 10.0f); +			LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::requestNamesViaCapability first " +									 << ids << " ids" +									 << LL_ENDL; +			LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));  			url.clear();  			agent_ids.clear();  		} @@ -359,8 +376,10 @@ void LLAvatarNameCache::requestNamesViaCapability()  	if (!url.empty())  	{ -		//llinfos << "requestNames " << url << llendl; -		LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));//, LLSD(), 10.0f); +		LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::requestNamesViaCapability all " +								 << ids << " ids" +								 << LL_ENDL; +		LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));  		url.clear();  		agent_ids.clear();  	} @@ -376,6 +395,11 @@ void LLAvatarNameCache::legacyNameCallback(const LLUUID& agent_id,  	// Construct a dummy record for this name.  By convention, SLID is blank  	// Never expires, but not written to disk, so lasts until end of session.  	LLAvatarName av_name; +	LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::legacyNameCallback " +							 << "agent " << agent_id << " " +							 << "full name '" << full_name << "'" +							 << ( is_group ? " [group]" : "" ) +							 << LL_ENDL;  	buildLegacyName(full_name, &av_name);  	// Don't add to cache, the data already exists in the legacy name system @@ -397,6 +421,8 @@ void LLAvatarNameCache::requestNamesViaLegacy()  		// invoked below.  This should never happen in practice.  		sPendingQueue[agent_id] = now; +		LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::requestNamesViaLegacy agent " << agent_id << LL_ENDL; +  		gCacheName->get(agent_id, false,  // legacy compatibility  			boost::bind(&LLAvatarNameCache::legacyNameCallback,  				_1, _2, _3)); @@ -435,21 +461,24 @@ void LLAvatarNameCache::importFile(std::istream& istr)  		av_name.fromLLSD( it->second );  		sCache[agent_id] = av_name;  	} -	// entries may have expired since we last ran the viewer, just -	// clean them out now -	eraseExpired(); -	llinfos << "loaded " << sCache.size() << llendl; +    LL_INFOS("AvNameCache") << "loaded " << sCache.size() << LL_ENDL; + +	// Some entries may have expired since the cache was stored, +    // but they will be flushed in the first call to eraseUnrefreshed +    // from LLAvatarNameResponder::idle  }  void LLAvatarNameCache::exportFile(std::ostream& ostr)  {  	LLSD agents; +	F64 max_unrefreshed = LLFrameTimer::getTotalSeconds() - MAX_UNREFRESHED_TIME;  	cache_t::const_iterator it = sCache.begin();  	for ( ; it != sCache.end(); ++it)  	{  		const LLUUID& agent_id = it->first;  		const LLAvatarName& av_name = it->second; -		if (!av_name.mIsDummy) +		// Do not write temporary or expired entries to the stored cache +		if (!av_name.mIsTemporaryName && av_name.mExpires >= max_unrefreshed)  		{  			// key must be a string  			agents[agent_id.asString()] = av_name.asLLSD(); @@ -484,62 +513,63 @@ void LLAvatarNameCache::idle()  	//	return;  	//} -	// Must be large relative to above - -	// No longer deleting expired entries, just re-requesting in the get -	// this way first synchronous get call on an expired entry won't return -	// legacy name.  LF - -	//const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds -	//if (sEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT)) -	//{ -	//	eraseExpired(); -	//} - -	if (sAskQueue.empty()) +	if (!sAskQueue.empty())  	{ -		return; +        if (useDisplayNames()) +        { +            requestNamesViaCapability(); +        } +        else +        { +            // ...fall back to legacy name cache system +            requestNamesViaLegacy(); +        }  	} -	if (useDisplayNames()) -	{ -		requestNamesViaCapability(); -	} -	else -	{ -		// ...fall back to legacy name cache system -		requestNamesViaLegacy(); -	} +    // erase anything that has not been refreshed for more than MAX_UNREFRESHED_TIME +    eraseUnrefreshed();  }  bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id)  { +	bool isPending = false;  	const F64 PENDING_TIMEOUT_SECS = 5.0 * 60.0; -	F64 now = LLFrameTimer::getTotalSeconds(); -	F64 expire_time = now - PENDING_TIMEOUT_SECS;  	pending_queue_t::const_iterator it = sPendingQueue.find(agent_id);  	if (it != sPendingQueue.end())  	{ -		bool request_expired = (it->second < expire_time); -		return !request_expired; +		// in the list of requests in flight, retry if too old +		F64 expire_time = LLFrameTimer::getTotalSeconds() - PENDING_TIMEOUT_SECS; +		isPending = (it->second > expire_time);  	} -	return false; +	return isPending;  } -void LLAvatarNameCache::eraseExpired() +void LLAvatarNameCache::eraseUnrefreshed()  {  	F64 now = LLFrameTimer::getTotalSeconds(); -	cache_t::iterator it = sCache.begin(); -	while (it != sCache.end()) -	{ -		cache_t::iterator cur = it; -		++it; -		const LLAvatarName& av_name = cur->second; -		if (av_name.mExpires < now) -		{ -			sCache.erase(cur); -		} +	F64 max_unrefreshed = now - MAX_UNREFRESHED_TIME; + +    if (!sLastExpireCheck || sLastExpireCheck < max_unrefreshed) +    { +        sLastExpireCheck = now; +        cache_t::iterator it = sCache.begin(); +        while (it != sCache.end()) +        { +            cache_t::iterator cur = it; +            ++it; +            const LLAvatarName& av_name = cur->second; +            if (av_name.mExpires < max_unrefreshed) +            { +                const LLUUID& agent_id = it->first; +                LL_DEBUGS("AvNameCache") << agent_id  +                                         << " user '" << av_name.mUsername << "' " +                                         << "expired " << now - av_name.mExpires << " secs ago" +                                         << LL_ENDL; +                sCache.erase(cur); +            } +        } +        LL_INFOS("AvNameCache") << sCache.size() << " cached avatar names" << LL_ENDL;  	}  } @@ -550,8 +580,11 @@ void LLAvatarNameCache::buildLegacyName(const std::string& full_name,  	av_name->mUsername = "";  	av_name->mDisplayName = full_name;  	av_name->mIsDisplayNameDefault = true; -	av_name->mIsDummy = true; -	av_name->mExpires = F64_MAX; +	av_name->mIsTemporaryName = true; +	av_name->mExpires = F64_MAX; // not used because these are not cached +	LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::buildLegacyName " +							 << full_name +							 << LL_ENDL;  }  // fills in av_name if it has it in the cache, even if expired (can check expiry time) @@ -574,6 +607,9 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name)  				{  					if (!isRequestPending(agent_id))  					{ +						LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " +												 << "refresh agent " << agent_id +												 << LL_ENDL;  						sAskQueue.insert(agent_id);  					}  				} @@ -595,6 +631,9 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name)  	if (!isRequestPending(agent_id))  	{ +		LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " +								 << "queue request for agent " << agent_id +								 << LL_ENDL;  		sAskQueue.insert(agent_id);  	} @@ -627,7 +666,6 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot)  				{  					// ...name already exists in cache, fire callback now  					fireSignal(agent_id, slot, av_name); -  					return;  				}  			} @@ -723,6 +761,9 @@ F64 LLAvatarNameCache::nameExpirationFromHeaders(LLSD headers)  bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires)  { +	bool fromCacheControl = false; +	F64 now = LLFrameTimer::getTotalSeconds(); +  	// Allow the header to override the default  	LLSD cache_control_header = headers["cache-control"];  	if (cache_control_header.isDefined()) @@ -731,12 +772,16 @@ bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires)  		std::string cache_control = cache_control_header.asString();  		if (max_age_from_cache_control(cache_control, &max_age))  		{ -			F64 now = LLFrameTimer::getTotalSeconds();  			*expires = now + (F64)max_age; -			return true; +			fromCacheControl = true;  		}  	} -	return false; +	LL_DEBUGS("AvNameCache") +		<< ( fromCacheControl ? "expires based on cache control " : "default expiration " ) +		<< "in " << *expires - now << " seconds" +		<< LL_ENDL; +	 +	return fromCacheControl;  } diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h index 8f21ace96a..59c1329ffa 100644 --- a/indra/llmessage/llavatarnamecache.h +++ b/indra/llmessage/llavatarnamecache.h @@ -82,6 +82,9 @@ namespace LLAvatarNameCache  	void erase(const LLUUID& agent_id); +    /// Provide some fallback for agents that return errors +	void handleAgentError(const LLUUID& agent_id); +  	// Force a re-fetch of the most recent data, but keep the current  	// data in cache  	void fetch(const LLUUID& agent_id); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 3a98c23e05..e92042bcd4 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3734,6 +3734,7 @@ void LLAppViewer::loadNameCache()  	// display names cache  	std::string filename =  		gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml"); +	LL_INFOS("AvNameCache") << filename << LL_ENDL;  	llifstream name_cache_stream(filename);  	if(name_cache_stream.is_open())  	{ diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index ce305dcd89..9623554200 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -279,20 +279,20 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  void LLIMModel::LLIMSession::onAdHocNameCache(const LLAvatarName& av_name)  { -	if (av_name.mIsDummy) -	{
 -		S32 separator_index = mName.rfind(" ");
 -		std::string name = mName.substr(0, separator_index);
 -		++separator_index;
 -		std::string conference_word = mName.substr(separator_index, mName.length());
 -
 -		// additional check that session name is what we expected
 -		if ("Conference" == conference_word)
 -		{
 -			LLStringUtil::format_map_t args;
 -			args["[AGENT_NAME]"] = name;
 -			LLTrans::findString(mName, "conference-title-incoming", args);
 -		}
 +	if (av_name.mIsTemporaryName) +	{ +		S32 separator_index = mName.rfind(" "); +		std::string name = mName.substr(0, separator_index); +		++separator_index; +		std::string conference_word = mName.substr(separator_index, mName.length()); + +		// additional check that session name is what we expected +		if ("Conference" == conference_word) +		{ +			LLStringUtil::format_map_t args; +			args["[AGENT_NAME]"] = name; +			LLTrans::findString(mName, "conference-title-incoming", args); +		}  	}  	else  	{ diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index c143aff2d4..8d3b1fd7a0 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -35,6 +35,7 @@  #include "llsecondlifeurls.h"  #include "v4color.h" +#include "llappviewer.h"  #include "llbutton.h"  #include "llcheckboxctrl.h"  #include "llcommandhandler.h"		// for secondlife:///app/login/ @@ -859,6 +860,13 @@ void LLPanelLogin::loadLoginPage()  	char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridLabel().c_str(), 0);  	oStr << "&grid=" << curl_grid;  	curl_free(curl_grid); +	 +	// add OS info +	char * os_info = curl_escape(LLAppViewer::instance()->getOSInfo().getOSStringSimple().c_str(), 0); +	oStr << "&os=" << os_info; +	curl_free(os_info); +	 +	  	gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());  	gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml index 2ad46824c2..1c64a5eb44 100644 --- a/indra/newview/skins/default/xui/en/floater_web_content.xml +++ b/indra/newview/skins/default/xui/en/floater_web_content.xml @@ -2,26 +2,26 @@  <floater
    legacy_header_height="18"
    can_resize="true"
 -  height="440"
 +  height="775"
    layout="topleft"
 -  min_height="140"
 -  min_width="467"
 +  min_height="400"
 +  min_width="500"
    name="floater_web_content"
    help_topic="floater_web_content"
    save_rect="true"
    auto_tile="true"
    title=""
    initial_mime_type="text/html"
 -  width="820">
 +  width="735">
    <layout_stack
 -    bottom="440"
 +    bottom="775"
      follows="left|right|top|bottom"
      layout="topleft"
      left="5"
      name="stack1"
      orientation="vertical"
      top="20"
 -    width="810">
 +    width="725">
      <layout_panel
        auto_resize="false"
        default_tab_group="1"
 @@ -32,7 +32,7 @@        name="nav_controls"
        top="400"
        user_resize="false"
 -      width="800">
 +      width="725">
        <button
          image_overlay="Arrow_Left_Off"
  		    image_disabled="PushButton_Disabled"
 @@ -115,7 +115,7 @@          combo_editor.select_on_focus="true"
          tool_tip="Enter URL here"
          top_delta="0"
 -        width="702">
 +        width="627">
          <combo_box.commit_callback
            function="WebContent.EnterAddress" />
        </combo_box>
 @@ -125,7 +125,7 @@          follows="top|right"
          image_name="Lock2"
          layout="topleft"
 -        left_delta="656"
 +        left_delta="575"
          top_delta="2"
          visible="false" 
          tool_tip="Secured Browsing"
 @@ -142,7 +142,7 @@          height="22"
          layout="topleft"
          name="popexternal"
 -        right="800"
 +        right="725"
          top_delta="-2"
          width="22">
          <button.commit_callback
 @@ -166,16 +166,16 @@          top="0"/>
        <text
          type="string"
 -        length="100"
 +        length="200"
          follows="bottom|left"
          height="20"
          layout="topleft"
          left_delta="0"
          name="statusbartext"
          parse_urls="false"
 -        text_color="0.4 0.4 0.4 1" 
 +        text_color="0.4 0.4 0.4 1"
          top_pad="5"
 -        width="452"/>
 +        width="520"/>
        <progress_bar
          color_bar="0.3 1.0 0.3 1"
          follows="bottom|right"
 | 
