diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 1666f877e9b1500266e9a3c97ed934b467bf7fb6..19244d2d1f43e8cd149df290b60e4a846827dbbf 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -407,6 +407,8 @@ class MediaPluginWebKit :
 		{
 			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
 			message.setValue("uri", event.getEventUri());
+			message.setValueBoolean("history_back_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK));
+			message.setValueBoolean("history_forward_available", LLQtWebKit::getInstance()->userActionIsEnabled( mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD));
 			sendMessage(message);
 		
 			setStatus(STATUS_LOADING);
@@ -605,7 +607,7 @@ class MediaPluginWebKit :
 			mAuthPassword = message.getValue("password");
 		}
 	}
-
+	
 	////////////////////////////////////////////////////////////////////////////////
 	// virtual
 	void onLinkHovered(const EventType& event)
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index ef45eaa1dbce6d5e152874143ef2b5a59b4999fb..5548abc62311d1df7ee5acafecf7da2ef6a99770 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -6626,7 +6626,18 @@
     <key>MediaBrowserWindowLimit</key>
     <map>
       <key>Comment</key>
-      <string>Maximum number of media brower windows that can be open at once (0 for no limit)</string>
+      <string>Maximum number of media brower windows that can be open at once in the media browser floater (0 for no limit)</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <integer>5</integer>
+    </map>
+    <key>WebContentWindowLimit</key>
+    <map>
+      <key>Comment</key>
+      <string>Maximum number of web brower windows that can be open at once in the Web content floater (0 for no limit)</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp
index 138ddeabdac0fa1fac4dc331fd961d20694830ea..8321b2914f1222ca7f22374f9bee83bd5b42f4d1 100644
--- a/indra/newview/llfloaterwebcontent.cpp
+++ b/indra/newview/llfloaterwebcontent.cpp
@@ -1,276 +1,309 @@
-/** 
- * @file llfloaterwebcontent.cpp
- * @brief floater for displaying web content - e.g. profiles and search (eventually)
- *
- * $LicenseInfo:firstyear=2006&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$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterwebcontent.h"
-
-#include "llfloaterreg.h"
-#include "llparcel.h"
-#include "llpluginclassmedia.h"
-#include "lluictrlfactory.h"
-#include "llmediactrl.h"
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-#include "llviewerparcelmgr.h"
-#include "llweb.h"
-#include "llui.h"
-#include "roles_constants.h"
-
-#include "llurlhistory.h"
-#include "llviewermedia.h"
-#include "llviewerparcelmedia.h"
-#include "llcombobox.h"
-#include "llwindow.h"
-#include "lllayoutstack.h"
-#include "llcheckboxctrl.h"
-
-#include "llnotifications.h"
-
-// TEMP
-#include "llsdutil.h"
-
-LLFloaterWebContent::LLFloaterWebContent(const LLSD& key)
-	: LLFloater(key)
-{
-}
-
-//static 
-void LLFloaterWebContent::create(const std::string &url, const std::string& target, const std::string& uuid)
-{
-	lldebugs << "url = " << url << ", target = " << target << ", uuid = " << uuid << llendl;
-	
-	std::string tag = target;
-	
-	if(target.empty() || target == "_blank")
-	{
-		if(!uuid.empty())
-		{
-			tag = uuid;
-		}
-		else
-		{
-			// create a unique tag for this instance
-			LLUUID id;
-			id.generate();
-			tag = id.asString();
-		}
-	}
-	
-	S32 browser_window_limit = gSavedSettings.getS32("MediaBrowserWindowLimit");
-	
-	if(LLFloaterReg::findInstance("web_content", tag) != NULL)
-	{
-		// There's already a web browser for this tag, so we won't be opening a new window.
-	}
-	else if(browser_window_limit != 0)
-	{
-		// showInstance will open a new window.  Figure out how many web browsers are already open, 
-		// and close the least recently opened one if this will put us over the limit.
-		
-		LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList("web_content");
-		lldebugs << "total instance count is " << instances.size() << llendl;
-		
-		for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++)
-		{
-			lldebugs << "    " << (*iter)->getKey() << llendl;
-		}
-		
-		if(instances.size() >= (size_t)browser_window_limit)
-		{
-			// Destroy the least recently opened instance
-			(*instances.begin())->closeFloater();
-		}
-	}
-
-	LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::showInstance("web_content", tag));
-	llassert(browser);
-	if(browser)
-	{
-		browser->mUUID = uuid;
-
-		// tell the browser instance to load the specified URL
-		browser->openMedia(url, target);
-		LLViewerMedia::proxyWindowOpened(target, uuid);
-	}
-}
-
-//static 
-void LLFloaterWebContent::closeRequest(const std::string &uuid)
-{
-	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("web_content");
-	lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl;
-	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
-	{
-		LLFloaterWebContent* i = dynamic_cast<LLFloaterWebContent*>(*iter);
-		lldebugs << "    " << i->mUUID << llendl;
-		if (i && i->mUUID == uuid)
-		{
-			i->closeFloater(false);
-			return;
- 		}
- 	}
-}
-
-//static 
-void LLFloaterWebContent::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height)
-{
-	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("web_content");
-	lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl;
-	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
-	{
-		LLFloaterWebContent* i = dynamic_cast<LLFloaterWebContent*>(*iter);
-		lldebugs << "    " << i->mUUID << llendl;
-		if (i && i->mUUID == uuid)
-		{
-			i->geometryChanged(x, y, width, height);
-			return;
-		}
-	}
-}
-	
-void LLFloaterWebContent::geometryChanged(S32 x, S32 y, S32 width, S32 height)
-{	
-	// Make sure the layout of the browser control is updated, so this calculation is correct.
-	LLLayoutStack::updateClass();
-		
-	// TODO: need to adjust size and constrain position to make sure floaters aren't moved outside the window view, etc.
-	LLCoordWindow window_size;
-	getWindow()->getSize(&window_size);
-
-	// Adjust width and height for the size of the chrome on the web Browser window.
-	width += getRect().getWidth() - mWebBrowser->getRect().getWidth();
-	height += getRect().getHeight() - mWebBrowser->getRect().getHeight();
-	
-	LLRect geom;
-	geom.setOriginAndSize(x, window_size.mY - (y + height), width, height);
-
-	lldebugs << "geometry change: " << geom << llendl;
-	
-	handleReshape(geom,false);
-}
-
-void LLFloaterWebContent::openMedia(const std::string& web_url, const std::string& target)
-{
-	mWebBrowser->setHomePageUrl(web_url);
-	mWebBrowser->setTarget(target);
-	mWebBrowser->navigateTo(web_url);
-	setCurrentURL(web_url);
-}
-
-void LLFloaterWebContent::draw()
-{
-//	getChildView("go")->setEnabled(!mAddressCombo->getValue().asString().empty());
-
-	getChildView("back")->setEnabled(mWebBrowser->canNavigateBack());
-	getChildView("forward")->setEnabled(mWebBrowser->canNavigateForward());
-
-	LLFloater::draw();
-}
-
-BOOL LLFloaterWebContent::postBuild()
-{
-	mWebBrowser = getChild<LLMediaCtrl>("webbrowser");
-	mWebBrowser->addObserver(this);
-
-	childSetAction("back", onClickBack, this);
-	childSetAction("forward", onClickForward, this);
-	childSetAction("reload", onClickRefresh, this);
-	childSetAction("go", onClickGo, this);
-
-	return TRUE;
-}
-
-//virtual
-void LLFloaterWebContent::onClose(bool app_quitting)
-{
-	LLViewerMedia::proxyWindowClosed(mUUID);
-	destroy();
-}
-
-void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
-{
-	if(event == MEDIA_EVENT_LOCATION_CHANGED)
-	{
-		setCurrentURL(self->getLocation());
-	}
-	else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
-	{
-		// This is the event these flags are sent with.
-		getChildView("back")->setEnabled(self->getHistoryBackAvailable());
-		getChildView("forward")->setEnabled(self->getHistoryForwardAvailable());
-	}
-	else if(event == MEDIA_EVENT_CLOSE_REQUEST)
-	{
-		// The browser instance wants its window closed.
-		closeFloater();
-	}
-	else if(event == MEDIA_EVENT_GEOMETRY_CHANGE)
-	{
-		geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight());
-	}
-}
-
-void LLFloaterWebContent::setCurrentURL(const std::string& url)
-{
-	mCurrentURL = url;
-
-	getChildView("back")->setEnabled(mWebBrowser->canNavigateBack());
-	getChildView("forward")->setEnabled(mWebBrowser->canNavigateForward());
-	getChildView("reload")->setEnabled(TRUE);
-}
-
-//static 
-void LLFloaterWebContent::onClickRefresh(void* user_data)
-{
-	LLFloaterWebContent* self = (LLFloaterWebContent*)user_data;
-
-	self->mWebBrowser->navigateTo(self->mCurrentURL);
-}
-
-//static 
-void LLFloaterWebContent::onClickForward(void* user_data)
-{
-	LLFloaterWebContent* self = (LLFloaterWebContent*)user_data;
-
-	self->mWebBrowser->navigateForward();
-}
-
-//static 
-void LLFloaterWebContent::onClickBack(void* user_data)
-{
-	LLFloaterWebContent* self = (LLFloaterWebContent*)user_data;
-
-	self->mWebBrowser->navigateBack();
-}
-
-//static 
-void LLFloaterWebContent::onClickGo(void* user_data)
-{
-//	LLFloaterWebContent* self = (LLFloaterWebContent*)user_data;
-
-//	self->mWebBrowser->navigateTo(self->mAddressCombo->getValue().asString());
-}
+/**
+ * @file llfloaterwebcontent.cpp
+ * @brief floater for displaying web content - e.g. profiles and search (eventually)
+ *
+ * $LicenseInfo:firstyear=2006&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$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcombobox.h"
+#include "llfloaterreg.h"
+#include "lllayoutstack.h"
+#include "llpluginclassmedia.h"
+#include "llprogressbar.h"
+#include "lltextbox.h"
+#include "llviewercontrol.h"
+#include "llwindow.h"
+
+#include "llfloaterwebcontent.h"
+
+LLFloaterWebContent::LLFloaterWebContent(const LLSD& key)
+	: LLFloater(key)
+{
+	mCommitCallbackRegistrar.add("WebContent.Back", boost::bind( &LLFloaterWebContent::onClickBack, this));
+	mCommitCallbackRegistrar.add("WebContent.Forward", boost::bind( &LLFloaterWebContent::onClickForward, this));
+	mCommitCallbackRegistrar.add("WebContent.Reload", boost::bind( &LLFloaterWebContent::onClickReload, this));
+
+	mCommitCallbackRegistrar.add("WebContent.EnterAddress", boost::bind( &LLFloaterWebContent::onEnterAddress, this));
+	mCommitCallbackRegistrar.add("WebContent.Go", boost::bind( &LLFloaterWebContent::onClickGo, this));
+}
+
+BOOL LLFloaterWebContent::postBuild()
+{
+	// these are used in a bunch of places so cache them
+	mWebBrowser = getChild<LLMediaCtrl>("webbrowser");
+	mAddressCombo = getChild<LLComboBox>("address");
+	mStatusBarText = getChild<LLTextBox>("statusbartext");
+	mStatusBarProgress = getChild<LLProgressBar>("statusbarprogress");
+
+	// observe browser events
+	mWebBrowser->addObserver(this);
+
+	// these button are always enabled
+	getChildView("reload")->setEnabled( true );
+	getChildView("go")->setEnabled( true );
+
+	return TRUE;
+}
+
+//static
+void LLFloaterWebContent::create(const std::string &url, const std::string& target, const std::string& uuid)
+{
+	lldebugs << "url = " << url << ", target = " << target << ", uuid = " << uuid << llendl;
+
+	std::string tag = target;
+
+	if(target.empty() || target == "_blank")
+	{
+		if(!uuid.empty())
+		{
+			tag = uuid;
+		}
+		else
+		{
+			// create a unique tag for this instance
+			LLUUID id;
+			id.generate();
+			tag = id.asString();
+		}
+	}
+
+	S32 browser_window_limit = gSavedSettings.getS32("WebContentWindowLimit");
+
+	if(LLFloaterReg::findInstance("web_content", tag) != NULL)
+	{
+		// There's already a web browser for this tag, so we won't be opening a new window.
+	}
+	else if(browser_window_limit != 0)
+	{
+		// showInstance will open a new window.  Figure out how many web browsers are already open,
+		// and close the least recently opened one if this will put us over the limit.
+
+		LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList("web_content");
+		lldebugs << "total instance count is " << instances.size() << llendl;
+
+		for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++)
+		{
+			lldebugs << "    " << (*iter)->getKey() << llendl;
+		}
+
+		if(instances.size() >= (size_t)browser_window_limit)
+		{
+			// Destroy the least recently opened instance
+			(*instances.begin())->closeFloater();
+		}
+	}
+
+	LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::showInstance("web_content", tag));
+	llassert(browser);
+	if(browser)
+	{
+		browser->mUUID = uuid;
+
+		// tell the browser instance to load the specified URL
+		browser->open_media(url, target);
+		LLViewerMedia::proxyWindowOpened(target, uuid);
+	}
+}
+
+//static
+void LLFloaterWebContent::closeRequest(const std::string &uuid)
+{
+	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("web_content");
+	lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl;
+	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+	{
+		LLFloaterWebContent* i = dynamic_cast<LLFloaterWebContent*>(*iter);
+		lldebugs << "    " << i->mUUID << llendl;
+		if (i && i->mUUID == uuid)
+		{
+			i->closeFloater(false);
+			return;
+ 		}
+ 	}
+}
+
+//static
+void LLFloaterWebContent::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height)
+{
+	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("web_content");
+	lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl;
+	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+	{
+		LLFloaterWebContent* i = dynamic_cast<LLFloaterWebContent*>(*iter);
+		lldebugs << "    " << i->mUUID << llendl;
+		if (i && i->mUUID == uuid)
+		{
+			i->geometryChanged(x, y, width, height);
+			return;
+		}
+	}
+}
+
+void LLFloaterWebContent::geometryChanged(S32 x, S32 y, S32 width, S32 height)
+{
+	// Make sure the layout of the browser control is updated, so this calculation is correct.
+	LLLayoutStack::updateClass();
+
+	// TODO: need to adjust size and constrain position to make sure floaters aren't moved outside the window view, etc.
+	LLCoordWindow window_size;
+	getWindow()->getSize(&window_size);
+
+	// Adjust width and height for the size of the chrome on the web Browser window.
+	width += getRect().getWidth() - mWebBrowser->getRect().getWidth();
+	height += getRect().getHeight() - mWebBrowser->getRect().getHeight();
+
+	LLRect geom;
+	geom.setOriginAndSize(x, window_size.mY - (y + height), width, height);
+
+	lldebugs << "geometry change: " << geom << llendl;
+
+	handleReshape(geom,false);
+}
+
+void LLFloaterWebContent::open_media(const std::string& web_url, const std::string& target)
+{
+	mWebBrowser->setHomePageUrl(web_url);
+	mWebBrowser->setTarget(target);
+	mWebBrowser->navigateTo(web_url);
+	set_current_url(web_url);
+}
+
+//virtual
+void LLFloaterWebContent::onClose(bool app_quitting)
+{
+	LLViewerMedia::proxyWindowClosed(mUUID);
+	destroy();
+}
+
+void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
+{
+	if(event == MEDIA_EVENT_LOCATION_CHANGED)
+	{
+		const std::string url = self->getStatusText();
+
+		if ( url.length() )
+			mStatusBarText->setText( url );
+
+		set_current_url( url );
+	}
+	else if(event == MEDIA_EVENT_NAVIGATE_BEGIN)
+	{
+		// flags are sent with this event
+		getChildView("back")->setEnabled( self->getHistoryBackAvailable() );
+		getChildView("forward")->setEnabled( self->getHistoryForwardAvailable() );
+
+		// manually decide on the state of this button
+		getChildView("stop")->setEnabled( true );
+
+		// turn "on" progress bar now we're loaded
+		mStatusBarProgress->setVisible( true );
+	}
+	else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
+	{
+		// flags are sent with this event
+		getChildView("back")->setEnabled( self->getHistoryBackAvailable() );
+		getChildView("forward")->setEnabled( self->getHistoryForwardAvailable() );
+
+		// manually decide on the state of this button
+		getChildView("stop")->setEnabled( false );
+
+		// turn "off" progress bar now we're loaded
+		mStatusBarProgress->setVisible( false );
+	}
+	else if(event == MEDIA_EVENT_CLOSE_REQUEST)
+	{
+		// The browser instance wants its window closed.
+		closeFloater();
+	}
+	else if(event == MEDIA_EVENT_GEOMETRY_CHANGE)
+	{
+		geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight());
+	}
+	else if(event == MEDIA_EVENT_STATUS_TEXT_CHANGED )
+	{
+		const std::string text = self->getStatusText();
+		if ( text.length() )
+			mStatusBarText->setText( text );
+	}
+	else if(event == MEDIA_EVENT_PROGRESS_UPDATED )
+	{
+		int percent = (int)self->getProgressPercent();
+		mStatusBarProgress->setPercent( percent );
+	}
+	else if(event == MEDIA_EVENT_NAME_CHANGED )
+	{
+		std::string page_title = self->getMediaName();
+		setTitle( page_title );
+	}
+}
+
+void LLFloaterWebContent::set_current_url(const std::string& url)
+{
+	mCurrentURL = url;
+
+	// redirects will navigate momentarily to about:blank, don't add to history
+	if ( mCurrentURL != "about:blank" )
+	{
+		mAddressCombo->remove( mCurrentURL );
+		mAddressCombo->add( mCurrentURL );
+		mAddressCombo->selectByValue( mCurrentURL );
+	}
+}
+
+void LLFloaterWebContent::onClickForward()
+{
+	mWebBrowser->navigateForward();
+}
+
+void LLFloaterWebContent::onClickBack()
+{
+	mWebBrowser->navigateBack();
+}
+
+void LLFloaterWebContent::onClickReload()
+{
+	mAddressCombo->remove(0);
+
+	if( mWebBrowser->getMediaPlugin() )
+	{
+		bool ignore_cache = true;
+		mWebBrowser->getMediaPlugin()->browse_reload( ignore_cache );
+	};
+}
+
+void LLFloaterWebContent::onClickStop()
+{
+	if( mWebBrowser->getMediaPlugin() )
+		mWebBrowser->getMediaPlugin()->stop();
+}
+
+void LLFloaterWebContent::onEnterAddress()
+{
+	mWebBrowser->navigateTo( mAddressCombo->getValue().asString() );
+}
+
+void LLFloaterWebContent::onClickGo()
+{
+	mWebBrowser->navigateTo( mAddressCombo->getValue().asString() );
+}
diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h
index 71346aa80ef076d4945e42b662d724c0e902dcae..b41da57a6f6924a92c3c9caa5a9cf2d9329920ff 100644
--- a/indra/newview/llfloaterwebcontent.h
+++ b/indra/newview/llfloaterwebcontent.h
@@ -1,71 +1,77 @@
-/** 
- * @file llfloaterwebcontent.h
- * @brief floater for displaying web content - e.g. profiles and search (eventually)
- *
- * $LicenseInfo:firstyear=2006&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$
- */
-
-#ifndef LL_LLFLOATERWEBCONTENT_H
-#define LL_LLFLOATERWEBCONTENT_H
-
-#include "llfloater.h"
-#include "llmediactrl.h"
-
-class LLMediaCtrl;
-
-class LLFloaterWebContent : 
-	public LLFloater, 
-	public LLViewerMediaObserver
-{
-public:
-    LOG_CLASS(LLFloaterWebContent);
-	LLFloaterWebContent(const LLSD& key);
-
-	static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null);
-
-	static void closeRequest(const std::string &uuid);
-	static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height);
-	void geometryChanged(S32 x, S32 y, S32 width, S32 height);
-	
-	/*virtual*/ BOOL postBuild();
-	/*virtual*/ void onClose(bool app_quitting);
-	/*virtual*/ void draw();
-
-	// inherited from LLViewerMediaObserver
-	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
-
-	void openMedia(const std::string& media_url, const std::string& target);
-	void setCurrentURL(const std::string& url);
-
-	static void onClickRefresh(void* user_data);
-	static void onClickBack(void* user_data);
-	static void onClickForward(void* user_data);
-	static void onClickGo(void* user_data);
-
-private:
-	LLMediaCtrl* mWebBrowser;
-	std::string mCurrentURL;
-	std::string mUUID;
-};
-
-#endif  // LL_LLFLOATERWEBCONTENT_H
-
+/**
+ * @file llfloaterwebcontent.h
+ * @brief floater for displaying web content - e.g. profiles and search (eventually)
+ *
+ * $LicenseInfo:firstyear=2006&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$
+ */
+
+#ifndef LL_LLFLOATERWEBCONTENT_H
+#define LL_LLFLOATERWEBCONTENT_H
+
+#include "llfloater.h"
+#include "llmediactrl.h"
+
+class LLMediaCtrl;
+class LLComboBox;
+class LLTextBox;
+class LLProgressBar;
+
+class LLFloaterWebContent :
+	public LLFloater,
+	public LLViewerMediaObserver
+{
+public:
+    LOG_CLASS(LLFloaterWebContent);
+	LLFloaterWebContent(const LLSD& key);
+
+	static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null);
+
+	static void closeRequest(const std::string &uuid);
+	static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height);
+	void geometryChanged(S32 x, S32 y, S32 width, S32 height);
+
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onClose(bool app_quitting);
+
+	// inherited from LLViewerMediaObserver
+	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
+
+	void onClickBack();
+	void onClickForward();
+	void onClickReload();
+	void onClickStop();
+	void onEnterAddress();
+	void onClickGo();
+
+private:
+	void open_media(const std::string& media_url, const std::string& target);
+	void set_current_url(const std::string& url);
+
+	LLMediaCtrl* mWebBrowser;
+	LLComboBox* mAddressCombo;
+	LLTextBox* mStatusBarText;
+	LLProgressBar* mStatusBarProgress;
+	std::string mCurrentURL;
+	std::string mUUID;
+};
+
+#endif  // LL_LLFLOATERWEBCONTENT_H
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 777c67261a843b66088e401f0ac5cc40a3e33067..62df206360359fa1ec5afa99c5c728361c017693 100644
--- a/indra/newview/skins/default/xui/en/floater_web_content.xml
+++ b/indra/newview/skins/default/xui/en/floater_web_content.xml
@@ -1,124 +1,151 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- can_resize="true"
- height="440"
- layout="topleft"
- min_height="140"
- min_width="467"
- name="floater_web_content"
- help_topic="floater_web_content"
- save_rect="true"
- auto_tile="true"
- title="WEB CONTENT"
- width="820">
-    <floater.string
-     name="home_page_url">
-        http://www.secondlife.com
-    </floater.string>
-    <layout_stack
-     bottom="440"
-     follows="left|right|top|bottom"
-     layout="topleft"
-     left="10"
-     name="stack1"
-     orientation="vertical" 
-     top="20"
-     width="800">
-        <layout_panel
-         auto_resize="false"
-         default_tab_group="1" 
-         height="20"
-         layout="topleft"
-         left="0"
-         min_height="20"
-         name="nav_controls"
-         top="400"
-         user_resize="false"
-         width="800">
-            <button
-             follows="left|top"
-             height="20"
-             label="Back"
-             layout="topleft"
-             left="0"
-             name="back"
-             top="0"
-             width="55">
-				<button.commit_callback
-				function="MediaBrowser.Back" />
-			</button>
-            <button
-             follows="left|top"
-             height="20"
-             label="Forward"
-             layout="topleft"
-             left_pad="3"
-             name="forward"
-             top_delta="0"
-             width="68">
-				<button.commit_callback
-				function="MediaBrowser.Forward" />
-			</button>
-            <button
-             enabled="false"
-             follows="left|top"
-             height="20"
-             label="Reload"
-             layout="topleft"
-             left_pad="2"
-             name="reload"
-             top_delta="0"
-             width="70">
-				<button.commit_callback
-				function="MediaBrowser.Refresh" />
-			</button>
-            <combo_box
-             allow_text_entry="true"
-             follows="left|top|right"
-             tab_group="1"
-             height="20"
-             layout="topleft"
-             left_pad="5"
-             max_chars="1024"
-             name="address"
-             combo_editor.select_on_focus="true"
-             top_delta="0"
-             width="540">
-				<combo_box.commit_callback
-				function="MediaBrowser.EnterAddress" />
-			</combo_box>
-            <button
-             enabled="false"
-             follows="right|top"
-             height="20"
-             label="Go"
-             layout="topleft"
-             left_pad="5"
-             name="go"
-             top_delta="0"
-             width="55">
-				<button.commit_callback
-				function="MediaBrowser.Go" />
-			</button>
-        </layout_panel>
-    
-        <layout_panel
-         height="40"
-         layout="topleft"
-         left_delta="0"
-         name="external_controls"
-         top_delta="0"
-         user_resize="false"
-         width="540">
-          <web_browser
-             bottom="-30"
-             follows="all"
-             layout="topleft"
-             left="0"
-             name="webbrowser"
-             top="0"
-             width="540" />
-        </layout_panel>
-    </layout_stack>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+  legacy_header_height="18"
+  can_resize="true"
+  height="440"
+  layout="topleft"
+  min_height="140"
+  min_width="467"
+  name="floater_web_content"
+  help_topic="floater_web_content"
+  save_rect="true"
+  auto_tile="true"
+  title="WEB CONTENT"
+  width="820">
+  <layout_stack
+    bottom="440"
+    follows="left|right|top|bottom"
+    layout="topleft"
+    left="5"
+    name="stack1"
+    orientation="vertical"
+    top="20"
+    width="810">
+    <layout_panel
+      auto_resize="false"
+      default_tab_group="1"
+      height="20"
+      layout="topleft"
+      left="0"
+      min_height="20"
+      name="nav_controls"
+      top="400"
+      user_resize="false"
+      width="800">
+      <button
+        follows="left|top"
+        height="20"
+        label="Back"
+        layout="topleft"
+        left="0"
+        name="back"
+        top="0"
+        width="35">
+        <button.commit_callback
+          function="WebContent.Back" />
+      </button>
+      <button
+        follows="left|top"
+        height="20"
+        label="Forward"
+        layout="topleft"
+        left_pad="3"
+        name="forward"
+        top_delta="0"
+        width="35">
+        <button.commit_callback
+          function="WebContent.Forward" />
+      </button>
+      <button
+        enabled="false"
+        follows="left|top"
+        height="20"
+        label="Reload"
+        layout="topleft"
+        left_pad="2"
+        name="reload"
+        top_delta="0"
+        width="35">
+        <button.commit_callback
+          function="WebContent.Reload" />
+      </button>
+      <button
+        enabled="false"
+        follows="left|top"
+        height="20"
+        label="Stop"
+        layout="topleft"
+        left_pad="2"
+        name="stop"
+        top_delta="0"
+        width="35">
+        <button.commit_callback
+          function="WebContent.Stop" />
+      </button>
+      <combo_box
+        allow_text_entry="true"
+        follows="left|top|right"
+        tab_group="1"
+        height="20"
+        layout="topleft"
+        left_pad="5"
+        max_chars="1024"
+        name="address"
+        combo_editor.select_on_focus="true"
+        top_delta="0"
+        width="610">
+        <combo_box.commit_callback
+          function="WebContent.EnterAddress" />
+      </combo_box>
+      <button
+        enabled="false"
+        follows="right|top"
+        height="20"
+        label="Go"
+        layout="topleft"
+        left_pad="0"
+        name="go"
+        top_delta="0"
+        width="35">
+        <button.commit_callback
+          function="WebContent.Go" />
+      </button>
+    </layout_panel>
+    <layout_panel
+      height="40"
+      layout="topleft"
+      left_delta="0"
+      name="external_controls"
+      top_delta="0"
+      user_resize="false"
+      width="540">
+      <web_browser
+        bottom="-22"
+        follows="all"
+        layout="topleft"
+        left="0"
+        name="webbrowser"
+        top="0"
+        width="540" />
+      <text
+        type="string"
+        length="100"
+        follows="bottom|left"
+        height="20"
+        layout="topleft"
+        left_delta="0"
+        name="statusbartext"
+        top_pad="5"
+        width="452"/>
+      <progress_bar
+        color_bar="0.3 1.0 0.3 1" 
+        follows="bottom|right"
+        height="16"
+        top_delta="-1"
+        left_pad="24"
+        layout="topleft"
+        name="statusbarprogress"
+        width="64"/>
+    </layout_panel>
+  </layout_stack>
+</floater>
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index f8483225d9b1361206aab9510861faa58adb6107..4a2272032b0a7fd2d1c85136da9822e8e5f805a7 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -2223,7 +2223,7 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e
 
 		case MEDIA_EVENT_AUTH_REQUEST:
 		{
-			std::cerr <<  "Media event:  MEDIA_EVENT_AUTH_REQUEST, url " << self->getAuthURL() ", realm " << self->getAuthRealm() << std::endl;
+			//std::cerr <<  "Media event:  MEDIA_EVENT_AUTH_REQUEST, url " << self->getAuthURL() ", realm " << self->getAuthRealm() << std::endl;
 
 			// TODO: display an auth dialog
 			self->sendAuthResponse(false, "", "");
diff --git a/install.xml b/install.xml
index 1055aba3e21e691ed055db27ba70d87969b8af96..2ad6b17675373a89f854ed6b249f736bd66e4978 100644
--- a/install.xml
+++ b/install.xml
@@ -995,9 +995,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>eb048de70c366084e1abb4fbf0e71edf</string>
+            <string>40ee8464da01fde6845b8276dcb4cc0f</string>
             <key>url</key>
-            <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.7.1-20101129.tar.bz2</uri>
+            <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.7.1-20101201.tar.bz2</uri>
           </map>
         </map>
       </map>