SOCIAL-311 PARTIAL FIX (2) Media browser has too many oddities to be useful for viewer web apps

Latest traunch of fixes to new Web only content floater
Also removed line in test app that fails to build - have a note to fix later
meow-7.2.2
callum 2010-12-01 19:02:53 -08:00
parent 3f2f03923c
commit 88eabbd077
7 changed files with 555 additions and 476 deletions

View File

@ -407,6 +407,8 @@ private:
{
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 @@ private:
mAuthPassword = message.getValue("password");
}
}
////////////////////////////////////////////////////////////////////////////////
// virtual
void onLinkHovered(const EventType& event)

View File

@ -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>

View File

@ -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() );
}

View File

@ -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

View File

@ -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>

View File

@ -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, "", "");

View File

@ -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>