diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index ade2d3eb9..bd69c72f7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -112,12 +112,6 @@ IF(DYNAMIC_OPENSCENEGRAPH) ADD_SUBDIRECTORY(osgpdf) ENDIF(POPPLER_FOUND AND CAIRO_FOUND) - IF(XUL_FOUND) - IF (WIN32 OR APPLE OR GTK_FOUND) - ADD_SUBDIRECTORY(osgbrowser) - ENDIF(WIN32 OR APPLE OR GTK_FOUND) - ENDIF(XUL_FOUND) - IF (BUILD_OSG_WRAPPERS) ADD_SUBDIRECTORY(osgintrospection) ENDIF(BUILD_OSG_WRAPPERS) @@ -165,6 +159,7 @@ IF(DYNAMIC_OPENSCENEGRAPH) ENDIF(APPLE) IF (BUILD_OSGWIDGET) + ADD_SUBDIRECTORY(osgbrowser) ADD_SUBDIRECTORY(osgwidgetaddremove) ADD_SUBDIRECTORY(osgwidgetbox) ADD_SUBDIRECTORY(osgwidgetcanvas) diff --git a/examples/osgbrowser/CMakeLists.txt b/examples/osgbrowser/CMakeLists.txt index 3cf687594..ea6e837ee 100644 --- a/examples/osgbrowser/CMakeLists.txt +++ b/examples/osgbrowser/CMakeLists.txt @@ -1,66 +1,8 @@ SET(TARGET_SRC - llembeddedbrowser.cpp - llembeddedbrowserwindow.cpp - llmozlib2.cpp - nsProfileDirServiceProvider.cpp - UBrowser.cpp osgbrowser.cpp - ReaderWriterUBrowser.cpp ) -SET(TARGET_H - llembeddedbrowser.h - llembeddedbrowserwindow.h - llmozlib2.h - nsProfileDirServiceProvider.h - nsProfileLock.h - nsProfileStringTypes.h - UBrowser.h -) - -ADD_DEFINITIONS(-DMOZILLA_INTERNAL_API) -ADD_DEFINITIONS(-DXUL_DIR=${XUL_DIR}) - -SET(ALL_REQUIRED_XUL_INCLUDE_DIRS - ${XUL_INCLUDE_DIRS} - ${XUL_INCLUDE_DIR}/xpcom - ${XUL_INCLUDE_DIR}/string - ${XUL_INCLUDE_DIR}/locale - ${XUL_INCLUDE_DIR}/view - ${XUL_INCLUDE_DIR}/content - ${XUL_INCLUDE_DIR}/gfx - ${XUL_INCLUDE_DIR}/layout - ${XUL_INCLUDE_DIR}/webbrwsr - ${XUL_INCLUDE_DIR}/widget - ${XUL_INCLUDE_DIR}/dom - ${XUL_INCLUDE_DIR}/docshell - ${XUL_INCLUDE_DIR}/pref - ${XUL_INCLUDE_DIR}/nkcache - ${XUL_INCLUDE_DIR}/necko/ - ${XUL_INCLUDE_DIR}/profdirserviceprovider - ${XUL_INCLUDE_DIR}/nkcache - ${XUL_INCLUDE_DIR}/xulapp - ${XUL_INCLUDE_DIR}/profile - ${XUL_INCLUDE_DIR}/appshell - ${XUL_INCLUDE_DIR}/xpcom_obsolete - ${XUL_INCLUDE_DIR}/intl - ${XUL_INCLUDE_DIR}/windowwatcher - ${XUL_INCLUDE_DIR}/xpconnect -) - -IF (WIN32 OR APPLE) - - INCLUDE_DIRECTORIES(${ALL_REQUIRED_XUL_INCLUDE_DIRS} ) - SET(TARGET_EXTERNAL_LIBRARIES ${XUL_LIBRARIES}) - -ELSE(WIN32 OR APPLE) - - INCLUDE_DIRECTORIES(${GTK_INCLUDE_DIRS} ${ALL_REQUIRED_XUL_INCLUDE_DIRS} ) - SET(TARGET_EXTERNAL_LIBRARIES ${GTK_LIBRARIES} ${XUL_LIBRARIES}) - -ENDIF(WIN32 OR APPLE) - -SET(TARGET_ADDED_LIBRARIES osgWidget ) +SET(TARGET_ADDED_LIBRARIES osgWidget) #### end var setup ### SETUP_EXAMPLE(osgbrowser) diff --git a/examples/osgbrowser/ReaderWriterUBrowser.cpp b/examples/osgbrowser/ReaderWriterUBrowser.cpp deleted file mode 100644 index 190805113..000000000 --- a/examples/osgbrowser/ReaderWriterUBrowser.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2008 Robert Osfield - * - * This library is open source and may be redistributed and/or modified under - * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or - * (at your option) any later version. The full license is in LICENSE file - * included with this distribution, and on the openscenegraph.org website. - * - * 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 - * OpenSceneGraph Public License for more details. -*/ - -#include -#include -#include - -#include "UBrowser.h" - -class ReaderWriterUBrowser : public osgDB::ReaderWriter -{ - public: - - ReaderWriterUBrowser() - { - supportsExtension("browser","browser image"); - - osgWidget::BrowserManager::instance() = new UBrowserManager; - } - - virtual const char* className() const { return "Browser Reader/Writer"; } - - virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options =NULL) const - { - return readImage(file, options); - } - - virtual ReadResult readImage(const std::string& file, const osgDB::ReaderWriter::Options* options) const - { - std::string ext = osgDB::getLowerCaseFileExtension(file); - if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED; - - return osgWidget::BrowserManager::instance()->createBrowserImage(osgDB::getNameLessExtension(file)); - } -}; - -// now register with Registry to instantiate the above -// reader/writer. -REGISTER_OSGPLUGIN(ubrowser, ReaderWriterUBrowser) diff --git a/examples/osgbrowser/UBrowser.cpp b/examples/osgbrowser/UBrowser.cpp deleted file mode 100644 index 11f120f7f..000000000 --- a/examples/osgbrowser/UBrowser.cpp +++ /dev/null @@ -1,546 +0,0 @@ -/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2008 Robert Osfield - * - * This library is open source and may be redistributed and/or modified under - * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or - * (at your option) any later version. The full license is in LICENSE file - * included with this distribution, and on the openscenegraph.org website. - * - * 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 - * OpenSceneGraph Public License for more details. -*/ - -#include "UBrowser.h" - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#ifdef _WINDOWS - #include -#elif defined(__APPLE__) - #include -#else - extern "C" { - #include - } -#endif - -////////////////////////////////////////////////////////////////////////// -// -// UBrowserManager implementation -// -UBrowserManager::UBrowserManager(): - _initialized(false), - _previousButtonMask(0) -{ -} - -UBrowserManager::~UBrowserManager() -{ - _thread->setDone(true); - - while(_thread->isRunning()) - { - OpenThreads::Thread::YieldCurrentThread(); - } - - _thread = 0; -} - -osgWidget::BrowserImage* UBrowserManager::createBrowserImage(const std::string& url, int width, int height) -{ - return new UBrowserImage(this, url, width, height); -} - -#if defined(_WINDOWS) -void* UBrowserManager::getNativeWindowHandle() -{ - if (_nativeWindowHandle) return _nativeWindowHandle; - - // My implementation of the embedded browser needs a native window handle - // Can't get this via GLUT so had to use this hack - _nativeWindowHandle = FindWindow( NULL, _appWindowName.c_str() ); - - return _nativeWindowHandle; -} - -#elif defined(__APPLE__) -void* UBrowserManager::getNativeWindowHandle() -{ - if (_nativeWindowHandle) return _nativeWindowHandle; - - // Create a window just for this purpose. - Rect window_rect = {100, 100, 200, 200}; - - _nativeWindowHandle = (void*) NewCWindow( - NULL, - &window_rect, - "\p", - false, // Create the window invisible. - zoomDocProc, // Window with a grow box and a zoom box - kLastWindowOfClass, // create it behind other windows - false, // no close box - 0); - } - - return _nativeWindowHandle; -} -#else -void* UBrowserManager::getNativeWindowHandle() -{ - if (_nativeWindowHandle) return _nativeWindowHandle; - - gtk_disable_setlocale(); - gtk_init(NULL, NULL); - - GtkWidget *win = gtk_window_new(GTK_WINDOW_POPUP); - // Why a layout widget? A MozContainer would be ideal, but - // it involves exposing Mozilla headers to mozlib-using apps. - // A layout widget with a GtkWindow parent has the desired - // properties of being plain GTK, having a window, and being - // derived from a GtkContainer. - GtkWidget *rtnw = gtk_layout_new(NULL, NULL); - gtk_container_add(GTK_CONTAINER(win), rtnw); - gtk_widget_realize(rtnw); - GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(rtnw), GTK_NO_WINDOW); - - _nativeWindowHandle = rtnw; - - return _nativeWindowHandle; -} -#endif - -struct InitOperation : public osg::Operation -{ - InitOperation(): - Operation("init",false) {} - - /** Override the standard Operation operator and dynamic cast object to a GraphicsContext, - * on success call operation()(GraphicsContext*).*/ - virtual void operator () (osg::Object* object) - { - UBrowserManager* ubrowserManager = dynamic_cast(object); - - // create a single browser window and set things up. - std::string applicationDir = osgDB::getFilePath(ubrowserManager->getApplication()); - if (applicationDir.empty()) applicationDir = osgDB::getRealPath("."); - else applicationDir = osgDB::getRealPath(applicationDir); - - std::string componentDir = ADDQUOTES(XUL_DIR); - std::string profileDir = applicationDir + "/" + ".profile"; - LLMozLib::getInstance()->init( applicationDir, componentDir, profileDir, ubrowserManager->getNativeWindowHandle() ); - - // append details to agent string - LLMozLib::getInstance()->setBrowserAgentId( ubrowserManager->getApplication() ); - } - -}; - -struct UpdateOperation : public osg::Operation -{ - UpdateOperation(): - osg::Operation("update",true) {} - - virtual void operator () (osg::Object* object) - { - UBrowserManager* ubrowserManager = dynamic_cast(object); - - // osg::notify(osg::NOTICE)<<"Update"<_ubrowserImageList.empty()) - { - // osg::notify(osg::NOTICE)<<"Nothing to do"< > RefImageList; - RefImageList images; - - { - OpenThreads::ScopedLock lock(ubrowserManager->_ubrowserImageListMutex); - std::copy(ubrowserManager->_ubrowserImageList.begin(), - ubrowserManager->_ubrowserImageList.end(), - std::back_inserter(images)); - } - - for(RefImageList::iterator itr = images.begin(); - itr != images.end(); - ++itr) - { - update(itr->get()); - } - - // osg::notify(osg::NOTICE)<<"complted Update"<getBrowserWindowId(); - - if (id==0) - { - int width = image->s(); - int height = image->t(); - - osg::notify(osg::INFO)<<"Constructing browser window for first time, width = "<getBrowserWindowId(); - - // send event to LLMozLib - if (_buttonDelta>0) - { - LLMozLib::getInstance()->mouseDown( id, _x, _y ); - } - else if (_buttonDelta<0) - { - LLMozLib::getInstance()->mouseUp( id, _x, _y ); - - // this seems better than sending focus on mouse down (still need to improve this) - LLMozLib::getInstance()->focusBrowser( id, true ); - } - else - { - // send event to LLMozLib - LLMozLib::getInstance()->mouseMove( id, _x, _y ); - } - - } - - osg::ref_ptr _image; - int _x; - int _y; - int _buttonDelta; -}; - -void UBrowserManager::sendPointerEvent(UBrowserImage* image, int x, int y, int buttonMask) -{ - int deltaButton = (buttonMask&1) - (_previousButtonMask&1); - _previousButtonMask = buttonMask; - - _thread->add(new PointerEventOperation(image, x, y, deltaButton)); -} - - -struct KeyEventOperation : public osg::Operation -{ - KeyEventOperation(UBrowserImage* image, int key, bool isUnicode): - osg::Operation("key event",false), - _image(image), - _key(key), - _isUnicode(isUnicode) {} - - virtual void operator () (osg::Object* object) - { - int id = _image->getBrowserWindowId(); - if (_isUnicode) LLMozLib::getInstance()->unicodeInput( id, _key ); - else LLMozLib::getInstance()->keyPress( id, _key ); - } - - osg::ref_ptr _image; - int _key; - bool _isUnicode; -}; - -void UBrowserManager::sendKeyEvent(UBrowserImage* image, int key, bool keyDown) -{ - if (!keyDown) return; - - KeyMap::const_iterator itr = _keyMap.find(key); - if (_keyMap.find(key)==_keyMap.end()) _thread->add(new KeyEventOperation(image, key, true)); - else _thread->add(new KeyEventOperation(image, itr->second, false)); - -} - - -struct NavigateToOperation : public osg::Operation -{ - NavigateToOperation(UBrowserImage* image, const std::string& url): - osg::Operation("key event",false), - _image(image), - _url(url) {} - - virtual void operator () (osg::Object* object) - { - int id = _image->getBrowserWindowId(); - LLMozLib::getInstance()->navigateTo( id, _url ); - } - - osg::ref_ptr _image; - std::string _url; -}; - -void UBrowserManager::navigateTo(UBrowserImage* image, const std::string& url) -{ - _thread->add(new NavigateToOperation(image, url)); -} - -//////////////////////////////////////////////////////////////////////////////////// -// -// UBrowser implementation - -UBrowserImage::UBrowserImage(UBrowserManager* manager, const std::string& homeURL, int width, int height): - _browserWindowId(0), - _needsUpdate(true) -{ - _manager = manager; - - GLint internalFormat = GL_RGB; - GLenum pixelFormat = GL_BGR_EXT; - - setImage(width,height,1, internalFormat, pixelFormat, GL_UNSIGNED_BYTE, - 0, - osg::Image::NO_DELETE); - - setDataVariance(osg::Object::DYNAMIC); - setOrigin(osg::Image::TOP_LEFT); - - _homeURL = homeURL; - - manager->registerUBrowserImage(this); - -} - -UBrowserImage::~UBrowserImage() -{ - _manager->unregisterUBrowserImage(this); -} - -void UBrowserImage::sendPointerEvent(int x, int y, int buttonMask) -{ - _manager->sendPointerEvent(this, x, y, buttonMask); -} - -void UBrowserImage::sendKeyEvent(int key, bool keyDown) -{ - _manager->sendKeyEvent(this, key, keyDown); -} - -void UBrowserImage::navigateTo(const std::string& url) -{ - _manager->navigateTo(this, url); -} - diff --git a/examples/osgbrowser/UBrowser.h b/examples/osgbrowser/UBrowser.h deleted file mode 100644 index e915d55b4..000000000 --- a/examples/osgbrowser/UBrowser.h +++ /dev/null @@ -1,181 +0,0 @@ -/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2008 Robert Osfield - * - * This library is open source and may be redistributed and/or modified under - * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or - * (at your option) any later version. The full license is in LICENSE file - * included with this distribution, and on the openscenegraph.org website. - * - * 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 - * OpenSceneGraph Public License for more details. -*/ - -#ifndef UBROWSER_H -#define UBROWSER_H - -#include - -#include - -#include - -#include -#include "llmozlib2.h" - -class UBrowserImage; - -////////////////////////////////////////////////////////////////////////// -// -// UBrowserManager interface -// -class UBrowserManager : public osgWidget::BrowserManager -{ - public: - - UBrowserManager(); - - virtual void init(const std::string& application); - - virtual osgWidget::BrowserImage* createBrowserImage(const std::string& url, int width, int height); - - public: - - void* getNativeWindowHandle(); - - const std::string& getApplication() const { return _application; } - - void registerUBrowserImage(UBrowserImage* image) - { - OpenThreads::ScopedLock lock(_ubrowserImageListMutex); - _ubrowserImageList.push_back(image); - } - - void unregisterUBrowserImage(UBrowserImage* image) - { - OpenThreads::ScopedLock lock(_ubrowserImageListMutex); - UBrowserImageList::iterator itr = std::find(_ubrowserImageList.begin(), _ubrowserImageList.end(), image); - if (itr != _ubrowserImageList.end()) _ubrowserImageList.erase(itr); - } - - void sendKeyEvent(UBrowserImage* image, int key, bool keyDown); - - void sendPointerEvent(UBrowserImage* image, int x, int y, int buttonMask); - - void navigateTo(UBrowserImage* image, const std::string& page); - - typedef std::list< UBrowserImage* > UBrowserImageList; - - OpenThreads::Mutex _ubrowserImageListMutex; - UBrowserImageList _ubrowserImageList; - - protected: - - UBrowserManager(const UBrowserManager& rhs, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY) {} - - virtual ~UBrowserManager(); - - META_Object(osgWidget,UBrowserManager) - - void setUpKeyMap(); - int convertToXULKey(int key) const; - - bool _initialized; - bool _done; - - std::string _application; - void* _nativeWindowHandle; - - typedef std::map KeyMap; - KeyMap _keyMap; - - int _previousButtonMask; - - osg::ref_ptr _thread; -}; - -//////////////////////////////////////////////////////////////////////////////////// -// -// UBrowser interface -class UBrowserImage : public osgWidget::BrowserImage, public LLEmbeddedBrowserWindowObserver -{ - public: - - UBrowserImage(UBrowserManager* manager, const std::string& homeURL, int width, int height); - - - const std::string& getHomeURL() const { return _homeURL; } - - virtual void sendPointerEvent(int x, int y, int buttonMask); - - virtual void sendKeyEvent(int key, bool keyDown); - - virtual void navigateTo(const std::string& url); - - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onPageChanged( const EventType& eventIn ) - { - // flag that an update is required - page grab happens in idle() so we don't stall - osg::notify(osg::NOTICE) << "Event: onPageChanged " << eventIn.getEventUri() << std::endl; - _needsUpdate = true; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onNavigateBegin( const EventType& eventIn ) - { - osg::notify(osg::NOTICE) << "Event: begin navigation to " << eventIn.getEventUri() << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onNavigateComplete( const EventType& eventIn ) - { - osg::notify(osg::NOTICE) << "Event: end navigation to " << eventIn.getEventUri() << " with response status of " << eventIn.getIntValue() << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onUpdateProgress( const EventType& eventIn ) - { - osg::notify(osg::NOTICE) << "Event: progress value updated to " << eventIn.getIntValue() << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onStatusTextChange( const EventType& eventIn ) - { - osg::notify(osg::NOTICE) << "Event: status updated to " << eventIn.getStringValue() << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onLocationChange( const EventType& eventIn ) - { - osg::notify(osg::NOTICE) << "Event: location changed to " << eventIn.getStringValue() << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onClickLinkHref( const EventType& eventIn ) - { - osg::notify(osg::NOTICE) << "Event: clicked on link to " << eventIn.getStringValue() << std::endl; - }; - - void setBrowserWindowId(int id) { _browserWindowId = id; } - int getBrowserWindowId() const { return _browserWindowId; } - - osg::ref_ptr _manager; - - protected: - - virtual ~UBrowserImage(); - - int _browserWindowId; - bool _needsUpdate; - std::string _homeURL; -}; - -#endif diff --git a/examples/osgbrowser/llembeddedbrowser.cpp b/examples/osgbrowser/llembeddedbrowser.cpp deleted file mode 100644 index 2816984ea..000000000 --- a/examples/osgbrowser/llembeddedbrowser.cpp +++ /dev/null @@ -1,450 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Linden Lab Inc. (http://lindenlab.com) code. - * - * The Initial Developer of the Original Code is: - * Callum Prentice (callum@ubrowser.com) - * - * Portions created by the Initial Developer are Copyright (C) 2006 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Callum Prentice (callum@ubrowser.com) - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// Windows specific switches -#ifdef WIN32 - // appears to be required by LibXUL/Mozilla code to avoid crashes in debug versions of their code (undef'd at end of this file) - #ifdef _DEBUG - #define DEBUG 1 - #endif -#endif // WIN32 - -#include - -#include "llembeddedbrowser.h" -#include "llembeddedbrowserwindow.h" - -#ifdef WIN32 - #pragma warning( disable : 4265 ) // "class has virtual functions, but destructor is not virtual" - #pragma warning( disable : 4291 ) // (no matching operator delete found; memory will not be freed if initialization throws an exception) -#endif // WIN32 - -#include "nsBuildID.h" -#include "nsICacheService.h" -#include "nsICookieManager.h" -#include "nsIPref.h" -#include "nsNetCID.h" -#include "nsProfileDirServiceProvider.h" -#include "nsXULAppAPI.h" -#include "nsIAppShell.h" -#include "nsIPromptService.h" -#include "time.h" -#include "nsWidgetsCID.h" -#include "nsNetCID.h" - -static nsIAppShell *sAppShell = nsnull; - -// singleton pattern - initialization -LLEmbeddedBrowser* LLEmbeddedBrowser::sInstance = 0; - -//////////////////////////////////////////////////////////////////////////////// -// -LLEmbeddedBrowser::LLEmbeddedBrowser() : - mErrorNum( 0 ), - mNativeWindowHandle( 0 ) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// -LLEmbeddedBrowser::~LLEmbeddedBrowser() -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// -LLEmbeddedBrowser* LLEmbeddedBrowser::getInstance() -{ - if ( ! sInstance ) - { - sInstance = new LLEmbeddedBrowser; - }; - - return sInstance; -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void LLEmbeddedBrowser::setLastError( int errorNumIn ) -{ - mErrorNum = errorNumIn; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLEmbeddedBrowser::clearLastError() -{ - mErrorNum = 0x0000; -} - -//////////////////////////////////////////////////////////////////////////////// -// -int LLEmbeddedBrowser::getLastError() -{ - return mErrorNum; -} - -//////////////////////////////////////////////////////////////////////////////// -// -std::string LLEmbeddedBrowser::getGREVersion() -{ - // take the string directly from Mozilla - return std::string( GRE_BUILD_ID ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowser::init( std::string applicationDir, - std::string componentDir, - std::string profileDir, - void* nativeWindowHandleIn ) -{ - mNativeWindowHandle = nativeWindowHandleIn; - - NS_ConvertUTF8toUTF16 applicationDirUTF16(applicationDir.c_str()); - NS_ConvertUTF8toUTF16 componentDirUTF16(componentDir.c_str()); - NS_ConvertUTF8toUTF16 profileDirUTF16(profileDir.c_str()); - - nsCOMPtr< nsILocalFile > applicationDirNative; - nsresult result = NS_NewLocalFile( applicationDirUTF16, PR_FALSE, getter_AddRefs( applicationDirNative ) ); - if ( NS_FAILED( result ) ) - { - setLastError( 0x1000 ); - return false; - }; - - nsCOMPtr< nsILocalFile > componentDirNative; - result = NS_NewLocalFile( componentDirUTF16 , PR_FALSE, getter_AddRefs( componentDirNative ) ); - if ( NS_FAILED( result ) ) - { - setLastError( 0x1001 ); - return false; - }; - - result = XRE_InitEmbedding( componentDirNative, applicationDirNative, nsnull, nsnull, 0 ); - if ( NS_FAILED( result ) ) - { - setLastError( 0x1002 ); - return false; - }; - - nsCOMPtr< nsILocalFile > profileDirNative; - result = NS_NewLocalFile( profileDirUTF16 , PR_TRUE, getter_AddRefs( profileDirNative ) ); - if ( NS_FAILED( result ) ) - { - setLastError( 0x1007 ); - return false; - }; - nsCOMPtr< nsProfileDirServiceProvider > locProvider; - NS_NewProfileDirServiceProvider( PR_TRUE, getter_AddRefs( locProvider ) ); - if ( ! locProvider ) - { - setLastError( 0x1003 ); - XRE_TermEmbedding(); - return PR_FALSE; - }; - - result = locProvider->Register(); - if ( NS_FAILED( result ) ) - { - setLastError( 0x1004 ); - XRE_TermEmbedding(); - return PR_FALSE; - }; - - result = locProvider->SetProfileDir( profileDirNative ); - if ( NS_FAILED( result ) ) - { - setLastError( 0x1005 ); - XRE_TermEmbedding(); - return PR_FALSE; - }; - - nsCOMPtr pref = do_CreateInstance( NS_PREF_CONTRACTID ); - if ( pref ) - { - pref->SetBoolPref( "security.warn_entering_secure", PR_FALSE ); - pref->SetBoolPref( "security.warn_entering_weak", PR_FALSE ); - pref->SetBoolPref( "security.warn_leaving_secure", PR_FALSE ); - pref->SetBoolPref( "security.warn_submit_insecure", PR_FALSE ); - pref->SetBoolPref( "network.protocol-handler.warn-external-default", PR_FALSE ); - } - else - { - setLastError( 0x1006 ); - }; - - // disable proxy by default - enableProxy( false, "", 0 ); - - // Originally from Linux version but seems to help other platforms too - nsresult rv; - nsCOMPtr appShell; - NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID); - appShell = do_CreateInstance(kAppShellCID, &rv); - if (!appShell) - { - setLastError( 0x1008 ); - return PR_FALSE; - } - sAppShell = appShell.get(); - NS_ADDREF(sAppShell); - sAppShell->Create(0, nsnull); - sAppShell->Spinup(); - - clearLastError(); - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowser::reset() -{ - XRE_TermEmbedding(); - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowser::clearCache() -{ - nsCOMPtr< nsICacheService > cacheService = do_GetService( NS_CACHESERVICE_CONTRACTID ); - if (! cacheService) - return false; - - cacheService->EvictEntries( nsICache::STORE_ANYWHERE ); - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowser::enableProxy( bool proxyEnabledIn, std::string proxyHostNameIn, int proxyPortIn ) -{ - nsCOMPtr pref = do_CreateInstance( NS_PREF_CONTRACTID ); - if ( pref ) - { - if ( proxyEnabledIn ) - pref->SetIntPref( "network.proxy.type", 1 ); - else - pref->SetIntPref( "network.proxy.type", 0 ); - - pref->SetCharPref( "network.proxy.ssl", proxyHostNameIn.c_str() ); - pref->SetIntPref( "network.proxy.ssl_port", proxyPortIn ); - - pref->SetCharPref( "network.proxy.ftp", proxyHostNameIn.c_str() ); - pref->SetIntPref( "network.proxy.ftp_port", proxyPortIn ); - - pref->SetCharPref( "network.proxy.gopher", proxyHostNameIn.c_str() ); - pref->SetIntPref( "network.proxy.gopher_port", proxyPortIn ); - - pref->SetCharPref( "network.proxy.http", proxyHostNameIn.c_str() ); - pref->SetIntPref( "network.proxy.http_port", proxyPortIn ); - - pref->SetBoolPref( "network.proxy.share_proxy_settings", true ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowser::enableCookies( bool enabledIn ) -{ - nsCOMPtr pref = do_CreateInstance( NS_PREF_CONTRACTID ); - if ( pref ) - { - if ( enabledIn ) - pref->SetIntPref( "network.cookie.cookieBehavior", 0 ); - else - pref->SetIntPref( "network.cookie.cookieBehavior", 2 ); - - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowser::clearAllCookies() -{ - nsCOMPtr< nsICookieManager > cookieManager = do_GetService( NS_COOKIEMANAGER_CONTRACTID ); - if ( ! cookieManager ) - return false; - - cookieManager->RemoveAll(); - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowser::enablePlugins( bool enabledIn ) -{ - nsCOMPtr pref = do_CreateInstance( NS_PREF_CONTRACTID ); - if ( pref ) - { - if ( enabledIn ) - { - pref->SetBoolPref( "plugin.scan.plid.all", PR_TRUE ); - pref->SetBoolPref( "xpinstall-enabled", PR_TRUE ); - } - else - { - pref->SetBoolPref( "plugin.scan.plid.all", PR_FALSE ); - pref->SetBoolPref( "xpinstall-enabled", PR_FALSE ); - pref->SetBoolPref( "plugin.scan.4xPluginFolder", PR_FALSE ); - pref->SetCharPref( "plugin.scan.Quicktime", "20.0" ); - pref->SetCharPref( "plugin.scan.Acrobat", "99.0" ); - pref->SetCharPref( "plugin.scan.SunJRE", "99.0" ); - pref->SetCharPref( "plugin.scan.WindowsMediaPlayer", "99.0" ); - }; - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLEmbeddedBrowser::setBrowserAgentId( std::string idIn ) -{ - nsCOMPtr pref = do_CreateInstance( NS_PREF_CONTRACTID ); - if ( pref ) - { - pref->SetCharPref( "general.useragent.extra.* ", idIn.c_str() ); - }; -} - -//////////////////////////////////////////////////////////////////////////////// -// -LLEmbeddedBrowserWindow* LLEmbeddedBrowser::createBrowserWindow( int browserWidthIn, int browserHeightIn ) -{ - nsCOMPtr< nsIWebBrowserChrome > chrome; - - LLEmbeddedBrowserWindow* newWin = new LLEmbeddedBrowserWindow(); - if ( ! newWin ) - { - return 0; - }; - - nsIWebBrowserChrome** aNewWindow = getter_AddRefs( chrome ); - - CallQueryInterface( NS_STATIC_CAST( nsIWebBrowserChrome*, newWin ), aNewWindow ); - - NS_ADDREF( *aNewWindow ); - - newWin->SetChromeFlags( nsIWebBrowserChrome::CHROME_ALL ); - - nsCOMPtr< nsIWebBrowser > newBrowser; - - newWin->createBrowser( mNativeWindowHandle, browserWidthIn, browserHeightIn, getter_AddRefs( newBrowser ) ); - if ( ! newBrowser ) - { - return 0; - }; - - if ( newWin && chrome ) - { - newWin->setParent( this ); - nsCOMPtr< nsIWebBrowser > newBrowser; - chrome->GetWebBrowser( getter_AddRefs( newBrowser ) ); - nsCOMPtr< nsIWebNavigation > webNav( do_QueryInterface ( newBrowser ) ); - webNav->LoadURI( NS_ConvertUTF8toUTF16( "about:blank" ).get(), nsIWebNavigation::LOAD_FLAGS_NONE, nsnull, nsnull, nsnull ); - - clearLastError(); - - return newWin; - }; - - setLastError( 0x2001 ); - return 0; -}; - - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowser::destroyBrowserWindow( LLEmbeddedBrowserWindow* browserWindowIn ) -{ - nsCOMPtr< nsIWebBrowser > webBrowser; - nsCOMPtr< nsIWebNavigation > webNavigation; - - browserWindowIn->GetWebBrowser( getter_AddRefs( webBrowser ) ); - webNavigation = do_QueryInterface( webBrowser ); - if ( webNavigation ) - { - webNavigation->Stop( nsIWebNavigation::STOP_ALL ); - }; - - nsCOMPtr< nsIWebBrowser > browser = nsnull; - browserWindowIn->GetWebBrowser( getter_AddRefs( browser ) ); - nsCOMPtr< nsIBaseWindow > browserAsWin = do_QueryInterface( browser ); - if ( browserAsWin ) - { - browserAsWin->Destroy(); - }; - - - browserWindowIn->SetWebBrowser( nsnull ); - - NS_RELEASE( browserWindowIn ); - - delete browserWindowIn; - - clearLastError(); - - return true; -} - -// Windows specific switches -#ifdef WIN32 - #pragma warning( 3 : 4291 ) // (no matching operator delete found; memory will not be freed if initialization throws an exception) - #pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual" - - // #define required by this file for LibXUL/Mozilla code to avoid crashes in their debug code - #ifdef _DEBUG - #undef DEBUG - #endif - -#endif // WIN32 diff --git a/examples/osgbrowser/llembeddedbrowser.h b/examples/osgbrowser/llembeddedbrowser.h deleted file mode 100644 index 3b4d30c65..000000000 --- a/examples/osgbrowser/llembeddedbrowser.h +++ /dev/null @@ -1,78 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Linden Lab Inc. (http://lindenlab.com) code. - * - * The Initial Developer of the Original Code is: - * Callum Prentice (callum@ubrowser.com) - * - * Portions created by the Initial Developer are Copyright (C) 2006 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Callum Prentice (callum@ubrowser.com) - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef LLEMBEDDEDBROWSER_H -#define LLEMBEDDEDBROWSER_H - -#include -#include - -class LLEmbeddedBrowserWindow; -class LLEmbeddedBrowserWindowObserver; - -class LLEmbeddedBrowser -{ - public: - LLEmbeddedBrowser(); - virtual ~LLEmbeddedBrowser(); - - static LLEmbeddedBrowser* getInstance(); - - bool init( std::string applicationDir, std::string componentDir, std::string profileDir, void* nativeWindowHandleIn ); - bool reset(); - bool clearCache(); - bool enableProxy( bool proxyEnabledIn, std::string proxyHostNameIn, int proxyPortIn ); - bool enableCookies( bool enabledIn ); - bool clearAllCookies(); - bool enablePlugins( bool enabledIn ); - std::string getGREVersion(); - void setBrowserAgentId( std::string idIn ); - LLEmbeddedBrowserWindow* createBrowserWindow( int browserWidthIn, int browserHeightIn ); - bool destroyBrowserWindow( LLEmbeddedBrowserWindow* browserWindowIn ); - void setLastError( int errorNumIn ); - void clearLastError(); - int getLastError(); - - private: - static LLEmbeddedBrowser* sInstance; - void* mNativeWindowHandle; - int mErrorNum; -}; - -#endif // LLEMBEDDEDBROWSER_H - diff --git a/examples/osgbrowser/llembeddedbrowserwindow.cpp b/examples/osgbrowser/llembeddedbrowserwindow.cpp deleted file mode 100644 index ee7019bad..000000000 --- a/examples/osgbrowser/llembeddedbrowserwindow.cpp +++ /dev/null @@ -1,1418 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Linden Lab Inc. (http://lindenlab.com) code. - * - * The Initial Developer of the Original Code is: - * Callum Prentice (callum@ubrowser.com) - * - * Portions created by the Initial Developer are Copyright (C) 2006 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Callum Prentice (callum@ubrowser.com) - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// seems to be required by LibXUL/Mozilla code to avoid crashes in their debug code, but only on Windows. -// undef'd at end of this -#ifdef _DEBUG - #ifdef WIN32 - #define DEBUG 1 - #endif -#endif - -// needed for the code in LLEmbeddedBrowserWindow::NotifyInvalidated() which will -// one day be moved to platform agnostic code when I find out how... -#ifdef WIN32 -#include "windows.h" -#endif - -#include "llembeddedbrowser.h" -#include "llembeddedbrowserwindow.h" - -// Mozilla code has non-virtual destructors -#ifdef WIN32 -#pragma warning( disable : 4291 ) // (no matching operator delete found; memory will not be freed if initialization throws an exception) -#pragma warning( disable : 4265 ) // "class has virtual functions, but destructor is not virtual" -#endif - -#include "nsCWebBrowser.h" -#include "nsGUIEvent.h" -#include "nsICaret.h" -#include "nsIContent.h" -#include "nsIDOMDocument.h" -#include "nsIDOMElement.h" -#include "nsIDOMWindow.h" -#include "nsIDOMEvent.h" -#include "nsIDocShell.h" -#include "nsIDocShellTreeItem.h" -#include "nsIDocument.h" -#include "nsIFrame.h" -#include "nsIHttpChannel.h" -#include "nsIInterfaceRequestorUtils.h" -#include "nsIScrollableView.h" -#include "nsISelection.h" -#include "nsISelectionController.h" -#include "nsIWebBrowserChrome.h" -#include "nsIWebBrowserChromeFocus.h" -#include "nsIWebBrowserFocus.h" -#include "nsIWebProgress.h" -#include "nsIWebProgressListener.h" -#include "nsPresContext.h" -#include "nsProfileDirServiceProvider.h" -#include "nsXPCOMGlue.h" -#include "nsXULAppAPI.h" - -#include "llembeddedbrowserwindow.h" - -#include - -#ifdef WIN32 -#pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual" -#endif - -//////////////////////////////////////////////////////////////////////////////// -// -LLEmbeddedBrowserWindow::LLEmbeddedBrowserWindow() : - mParent( 0 ), - mWebBrowser( nsnull ), - mBaseWindow( nsnull ), - mWindowId( 0 ), - mPercentComplete( 0 ), - mBrowserWidth( 0 ), - mBrowserHeight( 0 ), - mBrowserDepth( 4 ), - mPageBuffer( 0 ), - mEnabled( true ), - mCurrentUri( "" ), - mStatusText( "" ), - mClickHref( "" ), - mClickTarget( "" ), - mNoFollowScheme( "secondlife://" ), - mBkgRed( 0xff ), - mBkgGreen( 0xff ), - mBkgBlue( 0xff ), - mCaretRed( 0x00 ), - mCaretGreen( 0x00 ), - mCaretBlue( 0x00 ), - m404RedirectUrl( "" ), - mFlipBitmap( false ) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// -LLEmbeddedBrowserWindow::~LLEmbeddedBrowserWindow() -{ - if ( mWebNav ) - { - mWebNav->Stop ( nsIWebNavigation::STOP_ALL ); - mWebNav = nsnull; - }; - - if ( mBaseWindow ) - { - mBaseWindow->Destroy(); - mBaseWindow = nsnull; - }; - - if ( mPageBuffer ) - { - delete[] mPageBuffer; - mPageBuffer = 0; - }; -} - -//////////////////////////////////////////////////////////////////////////////// -// -nsresult LLEmbeddedBrowserWindow::createBrowser( void* nativeWindowHandleIn, PRInt32 widthIn, PRInt32 heightIn, nsIWebBrowser **aBrowser ) -{ - NS_ENSURE_ARG_POINTER(aBrowser); - *aBrowser = nsnull; - - nsresult rv; - mWebBrowser = do_CreateInstance( NS_WEBBROWSER_CONTRACTID, &rv ); - if ( ! mWebBrowser ) - { - return NS_ERROR_FAILURE; - } - - (void)mWebBrowser->SetContainerWindow( NS_STATIC_CAST( nsIWebBrowserChrome*, this ) ); - - nsCOMPtr dsti = do_QueryInterface( mWebBrowser ); - dsti->SetItemType( nsIDocShellTreeItem::typeContentWrapper ); - - mBaseWindow = do_QueryInterface( mWebBrowser ); - - mBaseWindow->InitWindow( nativeWindowHandleIn, nsnull, 0, 0, mBrowserWidth, mBrowserHeight ); - mBaseWindow->Create(); - - nsCOMPtr< nsIWebProgressListener > listener( NS_STATIC_CAST( nsIWebProgressListener*, this ) ); - nsCOMPtr< nsIWeakReference > thisListener( do_GetWeakReference( listener ) ); - mWebBrowser->AddWebBrowserListener( thisListener, NS_GET_IID( nsIWebProgressListener ) ); - -#if LL_DARWIN - // Without this, the mac doesn't get upates for animating gifs, mouseovers, etc. - mBaseWindow->SetVisibility( PR_TRUE ); -#else - mBaseWindow->SetVisibility( PR_FALSE ); -#endif - - nsresult result; - mWebNav = do_QueryInterface( mWebBrowser, &result ); - if ( NS_FAILED( result ) || ! mWebNav ) - { - return NS_ERROR_FAILURE; - }; - - setSize( widthIn, heightIn ); - - if ( mWebBrowser ) - { - *aBrowser = mWebBrowser; - NS_ADDREF( *aBrowser ); - - return NS_OK; - }; - - return NS_ERROR_FAILURE; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMPL_ADDREF( LLEmbeddedBrowserWindow ) -NS_IMPL_RELEASE( LLEmbeddedBrowserWindow ) - -//////////////////////////////////////////////////////////////////////////////// -// -NS_INTERFACE_MAP_BEGIN( LLEmbeddedBrowserWindow ) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS( nsISupports, nsIWebBrowserChrome ) - NS_INTERFACE_MAP_ENTRY( nsIInterfaceRequestor ) - NS_INTERFACE_MAP_ENTRY( nsIWebBrowserChrome ) - NS_INTERFACE_MAP_ENTRY( nsIWebProgressListener ) - NS_INTERFACE_MAP_ENTRY( nsIURIContentListener ) -#ifdef SUPPORTS_WEAK_REFENCE - NS_INTERFACE_MAP_ENTRY( nsISupportsWeakReference ) -#endif -#ifdef NS_DECL_NSITOOLKITOBSERVER - NS_INTERFACE_MAP_ENTRY( nsIToolkitObserver ) -#endif -NS_INTERFACE_MAP_END - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::GetInterface( const nsIID &aIID, void** aInstancePtr ) -{ - if ( aIID.Equals( NS_GET_IID( nsIDOMWindow ) ) ) - { - if ( mWebBrowser ) - { - return mWebBrowser->GetContentDOMWindow( ( nsIDOMWindow** )aInstancePtr ); - }; - - return NS_ERROR_NOT_INITIALIZED; - }; - - return QueryInterface( aIID, aInstancePtr ); -} - -//////////////////////////////////////////////////////////////////////////////// -// called when something changes the status text - emits event to consumer -NS_IMETHODIMP LLEmbeddedBrowserWindow::SetStatus( PRUint32 aType, const PRUnichar* aStatus ) -{ - mStatusText = std::string( NS_ConvertUTF16toUTF8( aStatus ).get() ); - - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onStatusTextChange, event ); - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::GetWebBrowser( nsIWebBrowser** aWebBrowser ) -{ - NS_ENSURE_ARG_POINTER( aWebBrowser ); - - *aWebBrowser = mWebBrowser; - - NS_IF_ADDREF( *aWebBrowser ); - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::SetWebBrowser( nsIWebBrowser* aWebBrowser ) -{ - NS_ENSURE_ARG_POINTER( aWebBrowser ); - - mWebBrowser = aWebBrowser; - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::GetChromeFlags( PRUint32* aChromeMask ) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::SetChromeFlags( PRUint32 aChromeMask ) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::DestroyBrowserWindow() -{ - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::SizeBrowserTo( PRInt32 aCX, PRInt32 aCY ) -{ - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::ShowAsModal() -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -//////////////////////////////////////////////////////////////////////////////// -// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::IsWindowModal( PRBool* retval ) -{ - *retval = PR_FALSE; - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::ExitModalEventLoop( nsresult aStatus ) -{ - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// called when the page loading progress changes - emits event to consumer -NS_IMETHODIMP LLEmbeddedBrowserWindow::OnProgressChange( nsIWebProgress* progress, nsIRequest* request, - PRInt32 curSelfProgress, PRInt32 maxSelfProgress, - PRInt32 curTotalProgress, PRInt32 maxTotalProgress ) -{ - mPercentComplete = static_cast< PRInt16 > - ( static_cast< float >( curTotalProgress * 100.0f ) / static_cast< float >( maxTotalProgress ) ); - - if ( mPercentComplete < 0 ) - mPercentComplete = 0; - - if ( mPercentComplete > 100 ) - mPercentComplete = 100; - - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mPercentComplete ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onUpdateProgress, event ); - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// called when the browser state changes - as described below - emits event to consumer -NS_IMETHODIMP LLEmbeddedBrowserWindow::OnStateChange( nsIWebProgress* progress, nsIRequest* request, - PRUint32 progressStateFlags, nsresult status ) -{ - if ( ( progressStateFlags & STATE_START ) && ( progressStateFlags & STATE_IS_DOCUMENT ) && ( status == NS_OK ) ) - { - // TODO: move this to a better place. - enableToolkitObserver( false ); - enableToolkitObserver( true ); - - // page load is starting so remove listener that catches "click" events - nsCOMPtr< nsIDOMWindow > window; - nsresult result = progress->GetDOMWindow( getter_AddRefs( window ) ); - if ( result == NS_OK ) - { - nsCOMPtr< nsIDOMEventTarget > target = do_QueryInterface( window ); - if ( target ) - target->RemoveEventListener(NS_ConvertUTF8toUTF16( "click" ), this, PR_TRUE ); - }; - - // set the listener to we can catch nsURIContentListener events - if ( mWebBrowser ) - { - mWebBrowser->SetParentURIContentListener( NS_STATIC_CAST( nsIURIContentListener*, this ) ); - }; - - // emit event that navigation is beginning - mStatusText = std::string( "Browser loaded" ); - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onNavigateBegin, event ); - - // about to move to a different page so have to stop grabbing a page - // but done one final grab in case the app doesn't ever call grabWindow again - grabWindow( 0, 0, mBrowserWidth, mBrowserHeight ); - }; - - if ( ( progressStateFlags & STATE_STOP ) && ( progressStateFlags & STATE_IS_WINDOW ) && ( status == NS_OK ) ) - { - // page load is complete so add listener that catches "click" events - nsCOMPtr< nsIDOMWindow > window; - nsresult result = progress->GetDOMWindow( getter_AddRefs( window ) ); - if ( result == NS_OK ) - { - nsCOMPtr< nsIDOMEventTarget > target = do_QueryInterface( window ); - if ( target ) - target->AddEventListener(NS_ConvertUTF8toUTF16( "click" ), this, PR_TRUE ); - }; - - // pick up raw HTML response status code - PRUint32 responseStatus = 0; - if ( request ) - { - nsCOMPtr< nsIHttpChannel > httpChannel = do_QueryInterface( request ); - if ( httpChannel ) - { - httpChannel->GetResponseStatus( &responseStatus ); - }; - }; - - // emit event that navigation is finished - mStatusText = std::string( "Done" ); - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText, (int)responseStatus ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onNavigateComplete, event ); - - // also set the flag here since back/forward navigation doesn't call progress change - grabWindow( 0, 0, mBrowserWidth, mBrowserHeight ); - }; - - if ( progressStateFlags & STATE_REDIRECTING ) - { - mStatusText = std::string( "Redirecting..." ); - }; - - if ( progressStateFlags & STATE_TRANSFERRING ) - { - mStatusText = std::string( "Transferring..." ); - }; - - if ( progressStateFlags & STATE_NEGOTIATING ) - { - mStatusText = std::string( "Negotiating..." ); - }; - - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onStatusTextChange, event ); - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// call when the location changes - e.g. when a site redirects - emits event to consumer -// TODO: ought to check that this change is on the top frame and -// indicate this to the consumer of this class -NS_IMETHODIMP LLEmbeddedBrowserWindow::OnLocationChange( nsIWebProgress* webProgress, - nsIRequest* request, - nsIURI* location ) -{ - if ( request ) - { - nsCOMPtr< nsIHttpChannel > http_channel = do_QueryInterface( request ); - if ( http_channel ) - { - PRUint32 response_status = 0; - http_channel->GetResponseStatus( &response_status ); - - if ( response_status == 404 ) - { - if ( ! m404RedirectUrl.empty() ) - { - if ( mWebNav ) - { - mWebNav->LoadURI( reinterpret_cast< const PRUnichar* > - ( NS_ConvertUTF8toUTF16( m404RedirectUrl.c_str() ).get() ), - nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY, - nsnull, nsnull, nsnull ); - }; - }; - }; - }; - }; - - nsCAutoString newURI; - location->GetSpec( newURI ); - - mCurrentUri = newURI.get(); - - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri() ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onLocationChange, event ); - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// change the background color that gets used between pages (usually white) -void LLEmbeddedBrowserWindow::setBackgroundColor( const PRUint8 redIn, const PRUint8 greenIn, const PRUint8 blueIn ) -{ - mBkgRed = redIn; - mBkgGreen = greenIn; - mBkgBlue = blueIn; -} - -//////////////////////////////////////////////////////////////////////////////// -// change the caret color (we have different backgrounds to edit fields - black caret on black background == bad) -void LLEmbeddedBrowserWindow::setCaretColor( const PRUint8 redIn, const PRUint8 greenIn, const PRUint8 blueIn ) -{ - mCaretRed = redIn; - mCaretGreen = greenIn; - mCaretBlue = blueIn; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLEmbeddedBrowserWindow::setEnabled( PRBool enabledIn ) -{ - mEnabled = enabledIn; -} - -//////////////////////////////////////////////////////////////////////////////// -// allow consumers of this class to observe events - add themselves as an observer -bool LLEmbeddedBrowserWindow::addObserver( LLEmbeddedBrowserWindowObserver* observerIn ) -{ - return mEventEmitter.addObserver( observerIn ); -} - -//////////////////////////////////////////////////////////////////////////////// -// allow consumers of this class to observe events - remove themselves as an observer -bool LLEmbeddedBrowserWindow::remObserver( LLEmbeddedBrowserWindowObserver* observerIn ) -{ - return mEventEmitter.remObserver( observerIn ); -} - -//////////////////////////////////////////////////////////////////////////////// -// used by observers of this class to get the current URI -const std::string& LLEmbeddedBrowserWindow::getCurrentUri() -{ - return mCurrentUri; -} - -//////////////////////////////////////////////////////////////////////////////// -// utility method that is used by observers to retrieve data after an event -const PRInt16 LLEmbeddedBrowserWindow::getPercentComplete() -{ - return mPercentComplete; -} - -//////////////////////////////////////////////////////////////////////////////// -// utility method that is used by observers to retrieve data after an event -const std::string& LLEmbeddedBrowserWindow::getStatusMsg() -{ - return mStatusText; -} - -//////////////////////////////////////////////////////////////////////////////// -// utility method that is used by observers to retrieve data after an event -const std::string& LLEmbeddedBrowserWindow::getClickLinkHref() -{ - return mClickHref; -} - -//////////////////////////////////////////////////////////////////////////////// -// utility method that is used by observers to retrieve data after an event -const std::string& LLEmbeddedBrowserWindow::getClickLinkTarget() -{ - return mClickTarget; -} - -//////////////////////////////////////////////////////////////////////////////// -// called when the status text is changed - emits event to consumer -NS_IMETHODIMP LLEmbeddedBrowserWindow::OnStatusChange( nsIWebProgress* aWebProgress, - nsIRequest* aRequest, - nsresult aStatus, - const PRUnichar* aMessage ) -{ - mStatusText = std::string( NS_ConvertUTF16toUTF8( aMessage ).get() ); - - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onStatusTextChange, event ); - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// implement this if you want to do something when the security state changtes -NS_IMETHODIMP LLEmbeddedBrowserWindow::OnSecurityChange( nsIWebProgress* aWebProgress, - nsIRequest* aRequest, - PRUint32 state ) -{ - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// render a page into memory and grab the window -// TODO: 0,0, browser width, browser height is always passed in right now -// need to make this work with arbitrary rects (i.e. the dirty rect) -unsigned char* LLEmbeddedBrowserWindow::grabWindow( int xIn, int yIn, int widthIn, int heightIn ) -{ - // sanity check - if ( ! mWebBrowser ) - return 0; - - // only grab the window if it's enabled - if ( ! mEnabled ) - return false; - - // get the docshell - nsCOMPtr< nsIDocShell > docShell = do_GetInterface( mWebBrowser ); - if ( ! docShell ) - return PR_FALSE; - - - // get pres context - nsCOMPtr< nsPresContext > presContext; - nsresult result = docShell->GetPresContext( getter_AddRefs( presContext ) ); - if ( NS_FAILED( result ) || ( ! presContext ) ) - return PR_FALSE; - - // get view manager - nsIViewManager* viewManager = presContext->GetViewManager(); - if ( ! viewManager ) - return PR_FALSE; - - // get the view - nsIScrollableView* scrollableView = NULL; - viewManager->GetRootScrollableView( &scrollableView ); - nsIView* view = NULL; - if ( scrollableView ) - scrollableView->GetScrolledView( view ); - else - viewManager->GetRootView( view ); - - // get the rectangle we want to render in twips (this looks odd but takees care of scrolling too) - nsRect rect = view->GetBounds() - view->GetPosition() - view->GetPosition(); - if ( rect.IsEmpty() ) - return 0; - - float p2t = presContext->PixelsToTwips(); - rect.width = NSIntPixelsToTwips( widthIn, p2t ); - rect.height = NSIntPixelsToTwips( heightIn, p2t ); - - // render the page - nsCOMPtr< nsIRenderingContext > context; - result = viewManager->RenderOffscreen( view, rect, PR_FALSE, PR_FALSE, NS_RGB( mBkgRed, mBkgGreen, mBkgBlue ), getter_AddRefs( context ) ); - if ( NS_FAILED( result ) ) - return 0; - - // retrieve the surface we rendered to - nsIDrawingSurface* surface = nsnull; - context->GetDrawingSurface( &surface ); - if ( ! surface ) - return 0; - - // lock the surface and retrieve a pointer to the rendered data and current row span - PRUint8* data; - PRInt32 rowLen; - // sometime rowspan ! width in pixels * bytes per pixel so save row span value and use in application - result = surface->Lock( xIn, yIn, widthIn, heightIn, reinterpret_cast< void** >( &data ), &mBrowserRowSpan, &rowLen, NS_LOCK_SURFACE_READ_ONLY ); - if ( NS_FAILED ( result ) ) - return 0; - - // save row span - it *can* change during the life of the app - mBrowserDepth = rowLen / mBrowserWidth; - - // create memory buffer here so it can be deleted and recreated elsewhere - if ( ! mPageBuffer ) - mPageBuffer = new unsigned char[ mBrowserRowSpan * mBrowserHeight ]; - - // save the pixels and optionally invert them - // (it's useful the SL client to get bitmaps that are inverted compared - // to the way that Mozilla renders them - allow to optionally flip - if ( mFlipBitmap ) - { - for( int y = mBrowserHeight - 1; y > -1; --y ) - { - memcpy( mPageBuffer + y * mBrowserRowSpan, - data + ( mBrowserHeight - y - 1 ) * mBrowserRowSpan, - mBrowserRowSpan ); - }; - } - else - { - memcpy( mPageBuffer, data, mBrowserRowSpan * mBrowserHeight ); - }; - - // release and destroy the surface we rendered to - surface->Unlock(); - context->DestroyDrawingSurface( surface ); - - renderCaret(); - - return mPageBuffer; -} - -//////////////////////////////////////////////////////////////////////////////// -// all this just to render a caret! -PRBool LLEmbeddedBrowserWindow::renderCaret() -{ - nsCOMPtr< nsIWebBrowserFocus > focus = do_QueryInterface( mWebBrowser ); - if ( ! focus ) - return NS_ERROR_FAILURE; - - nsCOMPtr< nsIDOMElement > focusedElement; - focus->GetFocusedElement( getter_AddRefs( focusedElement ) ); - if ( ! focusedElement ) - return NS_ERROR_FAILURE; - - nsCOMPtr focusedContent = do_QueryInterface( focusedElement ); - if ( ! focusedContent ) - return NS_ERROR_FAILURE; - - nsIPresShell* presShell = focusedContent->GetCurrentDoc()->GetShellAt( 0 ); - if ( ! presShell ) - return NS_ERROR_FAILURE; - - nsCOMPtr< nsICaret > caret; - presShell->GetCaret( getter_AddRefs( caret ) ); - if ( ! caret ) - return NS_ERROR_FAILURE; - - nsIFrame* frame = nsnull; - presShell->GetPrimaryFrameFor( focusedContent, &frame ); - if ( ! frame ) - return NS_ERROR_FAILURE; - - nsCOMPtr selCtrl; - frame->GetSelectionController( presShell->GetPresContext(), getter_AddRefs( selCtrl ) ); - if ( ! selCtrl ) - return NS_ERROR_FAILURE; - - nsCOMPtr selection; - selCtrl->GetSelection( nsISelectionController::SELECTION_NORMAL, getter_AddRefs( selection ) ); - if ( ! selection ) - return NS_ERROR_FAILURE; - - PRBool collapsed; - nsRect coords; - nsIView* caretView; - caret->GetCaretCoordinates( nsICaret::eTopLevelWindowCoordinates, selection, &coords, &collapsed, &caretView ); - if ( ! caretView ) - return NS_ERROR_FAILURE; - - float twips2Pixls = presShell->GetPresContext()->TwipsToPixels(); - - PRInt32 caretX = NSTwipsToIntPixels( coords.x, twips2Pixls ); - PRInt32 caretY = NSTwipsToIntPixels( coords.y, twips2Pixls ); - PRInt32 caretHeight = NSTwipsToIntPixels( coords.height, twips2Pixls ); - - if ( caretX > -1 && caretX < mBrowserWidth && caretY > -1 && caretY < mBrowserHeight ) - { - if ( mPageBuffer ) - { - for( int y = 1; y < caretHeight - 1; ++y ) - { - PRInt32 base_pos = caretY + y; - if ( mFlipBitmap ) - base_pos = mBrowserHeight - ( caretY + y ); - - // sometimes the caret seems valid when it really isn't - cap it to size of screen - if ( caretY + y + caretHeight < mBrowserHeight ) - { - mPageBuffer[ base_pos * getBrowserRowSpan() + ( caretX + 1 ) * mBrowserDepth + 0 ] = mCaretBlue; - mPageBuffer[ base_pos * getBrowserRowSpan() + ( caretX + 1 ) * mBrowserDepth + 1 ] = mCaretGreen; - mPageBuffer[ base_pos * getBrowserRowSpan() + ( caretX + 1 ) * mBrowserDepth + 2 ] = mCaretRed; - }; - }; - }; - }; - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// return the buffer that contains the rendered page -unsigned char* LLEmbeddedBrowserWindow::getPageBuffer() -{ - return mPageBuffer; -} - -//////////////////////////////////////////////////////////////////////////////// -// -PRInt16 LLEmbeddedBrowserWindow::getBrowserWidth() -{ - return mBrowserWidth; -} - -//////////////////////////////////////////////////////////////////////////////// -// -PRInt16 LLEmbeddedBrowserWindow::getBrowserHeight() -{ - return mBrowserHeight; -} - -//////////////////////////////////////////////////////////////////////////////// -// -PRInt16 LLEmbeddedBrowserWindow::getBrowserDepth() -{ - return mBrowserDepth; -} - -//////////////////////////////////////////////////////////////////////////////// -// -PRInt32 LLEmbeddedBrowserWindow::getBrowserRowSpan() -{ - return mBrowserRowSpan; -} - -//////////////////////////////////////////////////////////////////////////////// -// -PRBool LLEmbeddedBrowserWindow::navigateTo( const std::string uriIn ) -{ - if ( mWebNav ) - { - mWebNav->LoadURI( reinterpret_cast< const PRUnichar* >( NS_ConvertUTF8toUTF16( uriIn.c_str() ).get() ), - nsIWebNavigation::LOAD_FLAGS_NONE, - nsnull, nsnull, nsnull ); - - return PR_TRUE; - }; - - return PR_FALSE; -}; - -//////////////////////////////////////////////////////////////////////////////// -// -PRBool LLEmbeddedBrowserWindow::canNavigateBack() -{ - if ( ! mWebNav ) - { - return PR_FALSE; - }; - - PRBool canGoBack = PR_FALSE; - - nsresult result = mWebNav->GetCanGoBack( &canGoBack ); - if ( NS_FAILED( result ) ) - { - return PR_FALSE; - }; - - return canGoBack; -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void LLEmbeddedBrowserWindow::navigateStop() -{ - if ( mWebNav ) - mWebNav->Stop( nsIWebNavigation::STOP_ALL ); -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void LLEmbeddedBrowserWindow::navigateBack() -{ - if ( mWebNav ) - mWebNav->GoBack(); -}; - -//////////////////////////////////////////////////////////////////////////////// -// -PRBool LLEmbeddedBrowserWindow::canNavigateForward() -{ - if ( ! mWebNav ) - return PR_FALSE; - - PRBool canGoForward = PR_FALSE; - - nsresult result = mWebNav->GetCanGoForward( &canGoForward ); - if ( NS_FAILED( result ) ) - { - return PR_FALSE; - }; - - return canGoForward; -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void LLEmbeddedBrowserWindow::navigateForward() -{ - if ( mWebNav ) - mWebNav->GoForward(); -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void LLEmbeddedBrowserWindow::navigateReload() -{ - // maybe need a cache version of this too? - if ( mWebNav ) - mWebNav->Reload( nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE ); -}; - -//////////////////////////////////////////////////////////////////////////////// -// set the size of the browser window -PRBool LLEmbeddedBrowserWindow::setSize( PRInt16 widthIn, PRInt16 heightIn ) -{ - if ( mBaseWindow ) - { - // if there is a buffer already, get rid of it (it will get created as required in grabWindow()) - if ( mPageBuffer ) - { - delete[] mPageBuffer; - mPageBuffer = 0; - }; - - // record new size (important: may change after grabWindow() is called); - mBrowserWidth = widthIn; - mBrowserHeight = heightIn; - mBrowserRowSpan = mBrowserWidth * mBrowserDepth; - - // On the Mac, these calls do strange things to the main viewer window, and they don't seem necessary in any case. - #ifdef WIN32 - // this is the actual OS (on Win32) Window so it needs to be hidden - mBaseWindow->SetVisibility( PR_FALSE ); - - // move WAY off screen (and in a place that makes the combobox hack work) - mBaseWindow->SetPosition( 8000, -6000 ); - #endif - - // tell Mozilla about the new size - mBaseWindow->SetSize( widthIn, heightIn, PR_FALSE ); - - return PR_TRUE; - }; - - return PR_FALSE; -} - -//////////////////////////////////////////////////////////////////////////////// -// -PRBool LLEmbeddedBrowserWindow::flipWindow( PRBool flip ) -{ - mFlipBitmap = flip; - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// higher level mouse event -void LLEmbeddedBrowserWindow::mouseLeftDoubleClick( PRInt16 xPosIn, PRInt16 yPosIn ) -{ - // Internally Mozilla represents double-click as a 2-count mouse down event. - // TODO: support triple-click - const PRUint32 clickCount = 2; - sendMozillaMouseEvent( NS_MOUSE_LEFT_BUTTON_DOWN, xPosIn, yPosIn, clickCount ); -} - -//////////////////////////////////////////////////////////////////////////////// -// higher level mouse event -void LLEmbeddedBrowserWindow::mouseDown( PRInt16 xPosIn, PRInt16 yPosIn ) -{ - const PRUint32 clickCount = 1; - sendMozillaMouseEvent( NS_MOUSE_LEFT_BUTTON_DOWN, xPosIn, yPosIn, clickCount ); -} - -//////////////////////////////////////////////////////////////////////////////// -// higher level mouse event -void LLEmbeddedBrowserWindow::mouseUp( PRInt16 xPosIn, PRInt16 yPosIn ) -{ - const PRUint32 clickCount = 1; - sendMozillaMouseEvent( NS_MOUSE_LEFT_BUTTON_UP, xPosIn, yPosIn, clickCount ); -} - -//////////////////////////////////////////////////////////////////////////////// -// higher level mouse event -void LLEmbeddedBrowserWindow::mouseMove( PRInt16 xPosIn, PRInt16 yPosIn ) -{ - const PRUint32 clickCount = 1; // ignored? - sendMozillaMouseEvent( NS_MOUSE_MOVE, xPosIn, yPosIn, clickCount ); -} - -//////////////////////////////////////////////////////////////////////////////// -// utility methods to set an error message so something else can look at it -void LLEmbeddedBrowserWindow::scrollByLines( PRInt16 linesIn ) -{ - if ( mWebBrowser ) - { - nsCOMPtr< nsIDOMWindow > window; - nsresult result = mWebBrowser->GetContentDOMWindow( getter_AddRefs( window ) ); - - if ( ! NS_FAILED( result ) && window ) - { - result = window->ScrollByLines( linesIn ); - }; - }; -} - -//////////////////////////////////////////////////////////////////////////////// -// synthesizes a mouse event and sends into the embedded instance -// eventIn - NS_MOUSE_LEFT_BUTTON_DOWN, NS_MOUSE_LEFT_BUTTON_UP, etc. -// xPosIn, yPosIn - coordinates (in browser window space) -// clickCountIn - use 1 for single click, 2 for double-click, etc. -PRBool LLEmbeddedBrowserWindow::sendMozillaMouseEvent( PRInt16 eventIn, PRInt16 xPosIn, PRInt16 yPosIn, PRUint32 clickCountIn ) -{ - if ( ! mEnabled ) - return PR_FALSE; - - if ( ! mWebBrowser ) - return PR_FALSE; - - nsCOMPtr< nsIDocShell > docShell = do_GetInterface( mWebBrowser ); - if ( ! docShell ) - return PR_FALSE; - - nsCOMPtr< nsPresContext > presContext; - nsresult result = docShell->GetPresContext( getter_AddRefs( presContext ) ); - if ( NS_FAILED( result ) || ( ! presContext ) ) - return PR_FALSE; - - nsIViewManager* viewManager = presContext->GetViewManager(); - if ( ! viewManager ) - return PR_FALSE; - - nsIView* rootView; - result = viewManager->GetRootView( rootView ); - if ( NS_FAILED( result ) || ( ! rootView ) ) - return PR_FALSE; - - nsCOMPtr< nsIWidget > widget = rootView->GetWidget(); - if ( ! widget ) - return PR_FALSE; - - nsMouseEvent mouseEvent( PR_TRUE, eventIn, widget, nsMouseEvent::eReal ); - mouseEvent.clickCount = clickCountIn; - mouseEvent.isShift = 0; - mouseEvent.isControl = 0; - mouseEvent.isAlt = 0; - mouseEvent.isMeta = 0; - mouseEvent.widget = widget; - mouseEvent.nativeMsg = nsnull; - mouseEvent.point.x = xPosIn; - mouseEvent.point.y = yPosIn; - mouseEvent.refPoint.x = xPosIn; - mouseEvent.refPoint.y = yPosIn; - mouseEvent.flags = 0; - - nsEventStatus status; - result = viewManager->DispatchEvent( &mouseEvent, &status ); - if ( NS_FAILED( result ) ) - return PR_FALSE; - - return PR_TRUE; -}; - -//////////////////////////////////////////////////////////////////////////////// -// higher level keyboard functions - -// accept a (mozilla-style) keycode -void LLEmbeddedBrowserWindow::keyPress( PRInt16 keyCode ) -{ - sendMozillaKeyboardEvent( 0, keyCode ); -} - -// accept keyboard input that's already been translated into a unicode char. -void LLEmbeddedBrowserWindow::unicodeInput( PRUint32 uni_char ) -{ - sendMozillaKeyboardEvent( uni_char, 0 ); -} - -//////////////////////////////////////////////////////////////////////////////// -// synthesizes a keyboard event and sends into the embedded instance -PRBool LLEmbeddedBrowserWindow::sendMozillaKeyboardEvent( PRUint32 uni_char, PRUint32 ns_vk_code ) -{ - if ( ! mEnabled ) - return PR_FALSE; - - if ( ! mWebBrowser ) - return PR_FALSE; - - nsCOMPtr< nsIDocShell > docShell = do_GetInterface( mWebBrowser ); - if ( ! docShell ) - return PR_FALSE; - - nsCOMPtr< nsPresContext > presContext; - docShell->GetPresContext( getter_AddRefs( presContext ) ); - if ( ! presContext ) - return PR_FALSE; - - nsIViewManager* viewManager = presContext->GetViewManager(); - if ( ! viewManager ) - return PR_FALSE; - - nsIView* rootView; - viewManager->GetRootView( rootView ); - if ( ! rootView ) - return PR_FALSE; - - nsCOMPtr< nsIWidget > widget = rootView->GetWidget(); - if ( ! widget ) - return PR_FALSE; - - nsKeyEvent keyEvent( PR_TRUE, NS_KEY_PRESS, widget ); - keyEvent.keyCode = ns_vk_code; - keyEvent.charCode = uni_char; - keyEvent.isChar = uni_char ? PR_TRUE : PR_FALSE; - keyEvent.isShift = 0; - keyEvent.isControl = 0; - keyEvent.isAlt = 0; - keyEvent.isMeta = 0; - keyEvent.widget = widget; - keyEvent.nativeMsg = nsnull; - keyEvent.point.x = 0; - keyEvent.point.y = 0; - keyEvent.refPoint.x = 0; - keyEvent.refPoint.y = 0; - keyEvent.flags = 0; - - nsEventStatus status; - nsresult result = viewManager->DispatchEvent( &keyEvent, &status ); - if ( NS_FAILED( result ) ) - return PR_FALSE; - - return PR_TRUE; -} - -//////////////////////////////////////////////////////////////////////////////// -// override nsIWebBrowserChrome::HandleEvent () -NS_IMETHODIMP LLEmbeddedBrowserWindow::HandleEvent( nsIDOMEvent* anEvent ) -{ - nsCOMPtr< nsIDOMEventTarget > eventTarget; - anEvent->GetTarget( getter_AddRefs( eventTarget ) ); - - nsCOMPtr linkElement ( do_QueryInterface ( eventTarget ) ); - if ( linkElement ) - { - // look for an href link - nsString name; - linkElement->GetAttribute( NS_ConvertUTF8toUTF16( "href" ), name ); - mClickHref = std::string( NS_ConvertUTF16toUTF8( name ).get() ); - - // look for a target element - linkElement->GetAttribute( NS_ConvertUTF8toUTF16( "target" ), name ); - mClickTarget = std::string( NS_ConvertUTF16toUTF8( name ).get() ); - - // if the href link contains something - if ( mClickHref.length() ) - { - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mClickHref, mClickTarget ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onClickLinkHref, event ); - }; - }; - - return NS_OK; -}; - -//////////////////////////////////////////////////////////////////////////////// -// override nsIURIContentListener methods -NS_IMETHODIMP LLEmbeddedBrowserWindow::OnStartURIOpen( nsIURI *aURI, PRBool *_retval ) -{ - nsCAutoString newURI; - aURI->GetSpec( newURI ); - std::string rawUri = newURI.get(); - - // are we navigating to a 'nofollow' link - if ( mNoFollowScheme.length() && rawUri.substr( 0, mNoFollowScheme.length() ) == mNoFollowScheme ) - { - LLEmbeddedBrowserWindowEvent event( getWindowId(), rawUri, rawUri ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onClickLinkNoFollow, event ); - - // tell browser we're handling things and don't follow link - *_retval = PR_TRUE; - } - else - { - // tell browser to proceed as normal - *_retval = PR_FALSE; - }; - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLEmbeddedBrowserWindow::setNoFollowScheme( std::string schemeIn ) -{ - mNoFollowScheme = schemeIn; -} - -//////////////////////////////////////////////////////////////////////////////// -// -std::string LLEmbeddedBrowserWindow::getNoFollowScheme() -{ - return mNoFollowScheme; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::DoContent( const char *aContentType, - PRBool aIsContentPreferred, - nsIRequest *aRequest, - nsIStreamListener **aContentHandler, - PRBool *_retval ) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::IsPreferred( const char *aContentType, - char **aDesiredContentType, - PRBool *_retval ) -{ - // important (otherwise, links try to open in a new window and trigger the window watcher code) - *_retval = PR_TRUE; - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::CanHandleContent( const char *aContentType, - PRBool aIsContentPreferred, - char **aDesiredContentType, - PRBool *_retval ) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::GetLoadCookie( nsISupports * *aLoadCookie ) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::SetLoadCookie( nsISupports * aLoadCookie ) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::GetParentContentListener( nsIURIContentListener** aParentContentListener ) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -//////////////////////////////////////////////////////////////////////////////// -// -NS_IMETHODIMP LLEmbeddedBrowserWindow::SetParentContentListener( nsIURIContentListener* aParentContentListener ) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -//////////////////////////////////////////////////////////////////////////////// -// give focus to the browser so that input keyboard events work -void LLEmbeddedBrowserWindow::focusBrowser( PRBool focusBrowserIn ) -{ - if ( mWebBrowser ) - { - if ( focusBrowserIn ) - { - nsCOMPtr< nsIWebBrowserFocus > focus( do_GetInterface( mWebBrowser ) ); - focus->Activate(); - } - else - { - nsCOMPtr< nsIWebBrowserFocus > focus( do_GetInterface( mWebBrowser ) ); - focus->Deactivate(); - }; - }; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLEmbeddedBrowserWindow::setWindowId( int windowIdIn ) -{ - mWindowId = windowIdIn; -} - -//////////////////////////////////////////////////////////////////////////////// -// -int LLEmbeddedBrowserWindow::getWindowId() -{ - //printf("## Getting id for %p and it is %d\n", this, mWindowId ); - - return mWindowId; -} - -//////////////////////////////////////////////////////////////////////////////// -// add / remove the toolkit (and therefore 'page changed') observer -PRBool LLEmbeddedBrowserWindow::enableToolkitObserver( PRBool enableIn ) -{ - //TODO: AddObserver fails if I grab the toolkit this way. - //static NS_DEFINE_CID(kNS_TOOLKIT_CID, NS_TOOLKIT_CID); - //nsresult result1; - //nsCOMPtr< nsIToolkit > toolkit = do_GetService( kNS_TOOLKIT_CID, &result1 ); - //if ( ( result1 == NS_OK ) && toolkit ) - //{ - // if ( toolkit->AddObserver( this ) ) - // { - // return true; - // }; - //}; - //return false; - - // TODO: this is horrible but seems to work - need a better way to get the toolkit - nsCOMPtr< nsIDocShell > docShell = do_GetInterface( mWebBrowser ); - if ( ! docShell ) - return false; - - nsCOMPtr< nsPresContext > presContext; - nsresult result = docShell->GetPresContext( getter_AddRefs( presContext ) ); - if ( NS_FAILED( result ) || ( ! presContext ) ) - return false; - - nsIViewManager* viewManager = presContext->GetViewManager(); - if ( ! viewManager ) - return false; - - nsIView* rootView; - result = viewManager->GetRootView( rootView ); - if ( NS_FAILED( result ) || ( ! rootView ) ) - return false; - - nsCOMPtr< nsIWidget > widget = rootView->GetWidget(); - if ( ! widget ) - return false; - - nsCOMPtr< nsIToolkit > mToolkit = widget->GetToolkit(); - if ( ! mToolkit ) - return false; - -#ifdef NS_DECL_NSITOOLKITOBSERVER - if ( enableIn ) - mToolkit->AddObserver( this ); - else - mToolkit->RemoveObserver( this ); -#endif - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// something on the page changed - e.g. a new page loaded, scrolling, user -// input or as the result of some kind of animation. -// NOTE: we don't call grabWindow here as this can stall graphics apps - -// we merely pass back an event to the app and let it decide when/if -// to call grabWindow() -NS_METHOD LLEmbeddedBrowserWindow::NotifyInvalidated( nsIWidget *aWidget, PRInt32 x, PRInt32 y, PRInt32 width, PRInt32 height ) -{ -// printf("LLEmbeddedBrowserWindow::NotifyInvalidated(%p, %d, %d, %d, %d)\n", (void*)aWidget, (int)x, (int)y, (int)width, (int)height); - - // try to match widget-window against ourselves to see if we need to update the texture - // only works using native widgets (on Windows) at the moment - needs to be moved to platform agnostic code ASAP - #ifdef WIN32 - - // this is horrible beyond words but it seems to work... - // nsToolkit tells us that a widget changed and we need to see if it's this instance - // so we can emit an event that causes the parent app to update the browser texture - nsIWidget* mainWidget; - mBaseWindow->GetMainWidget( &mainWidget ); - - HWND nativeWidget = (HWND)aWidget->GetNativeData( NS_NATIVE_WIDGET ); - HWND nativeWidgetChild = 0; - while ( ::GetParent( nativeWidget ) ) - { - nativeWidgetChild = nativeWidget; - nativeWidget = ::GetParent( nativeWidget ); - }; - - if ( ( (HWND)mainWidget->GetNativeData( NS_NATIVE_WIDGET ) ) == nativeWidgetChild ) - { - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), x, y, width, height ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onPageChanged, event ); - }; - - // other platforms will always update - desperately inefficient but you'll see something. - #else - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), x, y, width, height ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onPageChanged, event ); - #endif - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// -std::string LLEmbeddedBrowserWindow::evaluateJavascript( std::string scriptIn ) -{ - nsCOMPtr< nsIScriptGlobalObjectOwner > theGlobalObjectOwner( do_GetInterface( mWebBrowser ) ); - - if ( theGlobalObjectOwner ) - { - nsIScriptGlobalObject* theGlobalObject; - theGlobalObject = theGlobalObjectOwner->GetScriptGlobalObject(); - - nsIScriptContext* theScriptContext = theGlobalObject->GetContext(); - - PRBool IsUndefined; - nsString output; - nsresult result = theScriptContext->EvaluateString(NS_ConvertUTF8toUTF16(scriptIn.c_str()), - nsnull, nsnull, "", 1, nsnull, &output, &IsUndefined); - - if( NS_FAILED( result ) ) - return ""; - - return std::string( NS_ConvertUTF16toUTF8( output ).get() ); - } - - return ""; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowserWindow::set404RedirectUrl( std::string redirect_url ) -{ - m404RedirectUrl = redirect_url; - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowserWindow::clr404RedirectUrl() -{ - m404RedirectUrl = std::string( "" ); - - return true; -} - -// #define required by this file for LibXUL/Mozilla code to avoid crashes in their debug code -#ifdef _DEBUG - #ifdef WIN32 - #undef DEBUG - #endif -#endif diff --git a/examples/osgbrowser/llembeddedbrowserwindow.h b/examples/osgbrowser/llembeddedbrowserwindow.h deleted file mode 100644 index 69d1362be..000000000 --- a/examples/osgbrowser/llembeddedbrowserwindow.h +++ /dev/null @@ -1,264 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Linden Lab Inc. (http://lindenlab.com) code. - * - * The Initial Developer of the Original Code is: - * Callum Prentice (callum@ubrowser.com) - * - * Portions created by the Initial Developer are Copyright (C) 2006 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Callum Prentice (callum@ubrowser.com) - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef LLEMBEDDEDBROWSERWINDOW_H -#define LLEMBEDDEDBROWSERWINDOW_H - -// Mozilla code has non-virtual destructors -#ifdef WIN32 -#pragma warning( disable : 4265 ) // "class has virtual functions, but destructor is not virtual" -#endif - -#include "nsIBaseWindow.h" -#include "nsIDOMEventListener.h" -#include "nsIDOMEventTarget.h" -#include "nsIInterfaceRequestor.h" -#include "nsIWebBrowserChrome.h" -#include "nsIWebNavigation.h" -#include "nsIWebProgressListener.h" -#include "nsIURIContentListener.h" -#include "nsWeakReference.h" -#include "nsIWebBrowser.h" -#include "nsIToolkit.h" -#include "nsIScriptGlobalObject.h" -#include "nsIScriptGlobalObjectOwner.h" -#include "nsIScriptContext.h" - -#ifdef WIN32 -#pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual" -#endif - -#include -#include -#include - -#include "llmozlib2.h" - -/////////////////////////////////////////////////////////////////////////////// -// manages the process of storing and emitting events that the consumer -// of the embedding class can observe -template< class T > -class LLEmbeddedBrowserWindowEmitter -{ - public: - LLEmbeddedBrowserWindowEmitter() { }; - ~LLEmbeddedBrowserWindowEmitter() { }; - - typedef typename T::EventType EventType; - typedef std::list< T* > ObserverContainer; - typedef void( T::*observerMethod )( const EventType& ); - - /////////////////////////////////////////////////////////////////////////////// - // - bool addObserver( T* observerIn ) - { - if ( ! observerIn ) - return false; - - if ( std::find( observers.begin(), observers.end(), observerIn ) != observers.end() ) - return false; - - observers.push_back( observerIn ); - - return true; - }; - - /////////////////////////////////////////////////////////////////////////////// - // - bool remObserver( T* observerIn ) - { - if ( ! observerIn ) - return false; - - observers.remove( observerIn ); - - return true; - }; - - /////////////////////////////////////////////////////////////////////////////// - // - void update( observerMethod method, const EventType& msgIn ) - { - typename std::list< T* >::iterator iter = observers.begin(); - - while( iter != observers.end() ) - { - ( ( *iter )->*method )( msgIn ); - - ++iter; - }; - }; - - protected: - ObserverContainer observers; -}; - -class LLEmbeddedBrowser; - -//////////////////////////////////////////////////////////////////////////////// -// class for a "window" that holds a browser - there can be lots of these -class LLEmbeddedBrowserWindow : - public nsIInterfaceRequestor, - public nsIWebBrowserChrome, - public nsIWebProgressListener, - public nsIURIContentListener, -#ifdef SUPPORTS_WEAK_REFENCE - public nsSupportsWeakReference, -#endif -#ifdef NS_DECL_NSITOOLKITOBSERVER - public nsIToolkitObserver, -#endif - public nsIDOMEventListener -{ - public: - LLEmbeddedBrowserWindow(); - virtual ~LLEmbeddedBrowserWindow(); - - NS_DECL_ISUPPORTS - NS_DECL_NSIINTERFACEREQUESTOR - NS_DECL_NSIWEBBROWSERCHROME - NS_DECL_NSIWEBPROGRESSLISTENER - NS_DECL_NSIURICONTENTLISTENER - NS_DECL_NSIDOMEVENTLISTENER -#ifdef NS_DECL_NSITOOLKITOBSERVER - NS_DECL_NSITOOLKITOBSERVER -#endif - // housekeeping - nsresult createBrowser( void* nativeWindowHandleIn, PRInt32 widthIn, PRInt32 heightIn, nsIWebBrowser** aBrowser ); - void setParent( LLEmbeddedBrowser* parentIn ) { mParent = parentIn; }; - PRBool setSize( PRInt16 widthIn, PRInt16 heightIn ); - void focusBrowser( PRBool focusBrowserIn ); - void scrollByLines( PRInt16 linesIn ); - void setWindowId( int windowIdIn ); - int getWindowId(); - - NS_METHOD NotifyInvalidated(nsIWidget*, PRInt32, PRInt32, PRInt32, PRInt32); - - // random accessors - const PRInt16 getPercentComplete(); - const std::string& getStatusMsg(); - const std::string& getCurrentUri(); - const std::string& getClickLinkHref(); - const std::string& getClickLinkTarget(); - - // memory buffer management - unsigned char* grabWindow( int xIn, int yIn, int widthIn, int heightIn ); - PRBool flipWindow( PRBool flip ); - unsigned char* getPageBuffer(); - PRInt16 getBrowserWidth(); - PRInt16 getBrowserHeight(); - PRInt16 getBrowserDepth(); - PRInt32 getBrowserRowSpan(); - - // set background color that you see in between pages - default is white but sometimes useful to change - void setBackgroundColor( const PRUint8 redIn, const PRUint8 greenIn, const PRUint8 blueIn ); - - // change the caret color (we have different backgrounds to edit fields - black caret on black background == bad) - void setCaretColor( const PRUint8 redIn, const PRUint8 greenIn, const PRUint8 blueIn ); - - // can turn off updates to a page - e.g. when it's hidden by your windowing system - void setEnabled( PRBool enabledIn ); - - // navigation - void navigateStop(); - PRBool navigateTo( const std::string uriIn ); - PRBool canNavigateBack(); - void navigateBack(); - PRBool canNavigateForward(); - void navigateForward(); - void navigateReload(); - - // javascript access/control - std::string evaluateJavascript( std::string scriptIn ); - - // redirection when you hit a missing page - bool set404RedirectUrl( std::string redirect_url ); - bool clr404RedirectUrl(); - - // mouse & keyboard events - void mouseDown( PRInt16 xPosIn, PRInt16 yPosIn ); - void mouseUp( PRInt16 xPosIn, PRInt16 yPosIn ); - void mouseMove( PRInt16 xPosIn, PRInt16 yPosIn ); - void mouseLeftDoubleClick( PRInt16 xPosIn, PRInt16 yPosIn ); - void keyPress( PRInt16 keyCode ); - void unicodeInput( PRUint32 uni_char ); - - // allow consumers of this class and to observe browser events - bool addObserver( LLEmbeddedBrowserWindowObserver* observerIn ); - bool remObserver( LLEmbeddedBrowserWindowObserver* observerIn ); - - // accessor/mutator for scheme that browser doesn't follow - e.g. secondlife.com:// - void setNoFollowScheme( std::string schemeIn ); - std::string getNoFollowScheme(); - - private: - PRBool sendMozillaMouseEvent( PRInt16 eventIn, PRInt16 xPosIn, PRInt16 yPosIn, PRUint32 clickCountIn ); - PRBool sendMozillaKeyboardEvent( PRUint32 keyIn, PRUint32 ns_vk_code ); - PRBool renderCaret(); - PRBool enableToolkitObserver( PRBool enableIn ); - - LLEmbeddedBrowserWindowEmitter< LLEmbeddedBrowserWindowObserver > mEventEmitter; - - LLEmbeddedBrowser* mParent; - PRInt16 mPercentComplete; - std::string mStatusText; - std::string mCurrentUri; - std::string mClickHref; - std::string mClickTarget; - std::string mNoFollowScheme; - nsCOMPtr< nsIWebBrowser > mWebBrowser; - nsCOMPtr< nsIBaseWindow > mBaseWindow; - nsCOMPtr< nsIWebNavigation > mWebNav; - int mWindowId; - unsigned char* mPageBuffer; - std::string m404RedirectUrl; - PRBool mEnabled; - PRBool mFlipBitmap; - PRInt32 mBrowserRowSpan; - PRInt16 mBrowserWidth; - PRInt16 mBrowserHeight; - PRInt16 mBrowserDepth; - PRUint8 mBkgRed; - PRUint8 mBkgGreen; - PRUint8 mBkgBlue; - PRUint8 mCaretRed; - PRUint8 mCaretGreen; - PRUint8 mCaretBlue; -}; - -#endif // LLEMBEDEDDBROWSERWINDOW_H diff --git a/examples/osgbrowser/llmozlib2.cpp b/examples/osgbrowser/llmozlib2.cpp deleted file mode 100644 index f7274fc15..000000000 --- a/examples/osgbrowser/llmozlib2.cpp +++ /dev/null @@ -1,686 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Linden Lab Inc. (http://lindenlab.com) code. - * - * The Initial Developer of the Original Code is: - * Callum Prentice (callum@ubrowser.com) - * - * Portions created by the Initial Developer are Copyright (C) 2006 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Callum Prentice (callum@ubrowser.com) - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include -#include -#include -#include - -#include "llmozlib2.h" - -#include "llembeddedbrowser.h" -#include "llembeddedbrowserwindow.h" - -LLMozLib* LLMozLib::sInstance = 0; - -//////////////////////////////////////////////////////////////////////////////// -// -LLMozLib::LLMozLib() : - mMaxBrowserWindows( 16 ) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// -LLMozLib* LLMozLib::getInstance() -{ - if ( ! sInstance ) - { - sInstance = new LLMozLib; - }; - - return sInstance; -} - -//////////////////////////////////////////////////////////////////////////////// -// -LLMozLib::~LLMozLib() -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::init( std::string applicationDir, std::string componentDir, std::string profileDir, void* nativeWindowHandleIn ) -{ - return LLEmbeddedBrowser::getInstance()->init( applicationDir, - componentDir, - profileDir, - nativeWindowHandleIn ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -int LLMozLib::getLastError() -{ - return LLEmbeddedBrowser::getInstance()->getLastError(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::reset() -{ - return LLEmbeddedBrowser::getInstance()->reset(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::clearCache() -{ - return LLEmbeddedBrowser::getInstance()->clearCache(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -const std::string LLMozLib::getVersion() -{ - const int majorVersion = 2; - const int minorVersion = 1; - - // number of hours since "time began" for this library - used to identify builds of same version - const int magicNumber = static_cast< int >( ( time( NULL ) / 3600L ) - ( 321190L ) ); - - // return as a string for now - don't think we need to expose actual version numbers - std::ostringstream codec; - codec << std::setw( 1 ) << std::setfill( '0' ); - codec << majorVersion << "."; - codec << std::setw( 2 ) << std::setfill( '0' ); - codec << minorVersion << "."; - codec << std::setw( 5 ) << std::setfill( '0' ); - codec << magicNumber; - codec << " (Mozilla GRE version "; - codec << LLEmbeddedBrowser::getInstance()->getGREVersion(); - codec << ")"; - - return codec.str(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLMozLib::setBrowserAgentId( std::string idIn ) -{ - LLEmbeddedBrowser::getInstance()->setBrowserAgentId( idIn ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::enableProxy( bool proxyEnabledIn, std::string proxyHostNameIn, int proxyPortIn ) -{ - return LLEmbeddedBrowser::getInstance()->enableProxy( proxyEnabledIn, proxyHostNameIn, proxyPortIn ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -int LLMozLib::createBrowserWindow( int browserWindowWidthIn, int browserWindowHeightIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = LLEmbeddedBrowser::getInstance()->createBrowserWindow( browserWindowWidthIn, browserWindowHeightIn ); - - if ( browserWindow ) - { - // arbitrary limit so we don't exhaust system resources - int id( 0 ); - while ( ++id < mMaxBrowserWindows ) - { - std::pair< BrowserWindowMapIter, bool > result = mBrowserWindowMap.insert( std::make_pair( id, browserWindow ) ); - - // find first place the insert succeeds and use that index as the id - if ( result.second ) - { - browserWindow->setWindowId( id ); - - return id; - }; - }; - }; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::destroyBrowserWindow( int browserWindowIdIn ) -{ - // don't use the utility method here since we need the iterator to remove the entry from the map - BrowserWindowMapIter iter = mBrowserWindowMap.find( browserWindowIdIn ); - LLEmbeddedBrowserWindow* browserWindow = (*iter).second; - - if ( browserWindow ) - { - LLEmbeddedBrowser::getInstance()->destroyBrowserWindow( browserWindow ); - }; - - mBrowserWindowMap.erase( iter ); - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::setBackgroundColor( int browserWindowIdIn, const int redIn, const int greenIn, const int blueIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->setBackgroundColor( redIn, greenIn, blueIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::setCaretColor( int browserWindowIdIn, const int redIn, const int greenIn, const int blueIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->setCaretColor( redIn, greenIn, blueIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::setEnabled( int browserWindowIdIn, bool enabledIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->setEnabled( enabledIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::setSize( int browserWindowIdIn, int widthIn, int heightIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->setSize( widthIn, heightIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::scrollByLines( int browserWindowIdIn, int linesIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->scrollByLines( linesIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::addObserver( int browserWindowIdIn, LLEmbeddedBrowserWindowObserver* subjectIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->addObserver( subjectIn ); - }; - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::remObserver( int browserWindowIdIn, LLEmbeddedBrowserWindowObserver* subjectIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->remObserver( subjectIn ); - }; - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::navigateTo( int browserWindowIdIn, const std::string uriIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->navigateTo( uriIn ) ? true : false; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::navigateStop( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->navigateStop(); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::canNavigateBack( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->canNavigateBack() ? true : false; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::navigateBack( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->navigateBack(); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::canNavigateForward( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->canNavigateForward() ? true : false; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::navigateForward( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->navigateForward(); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::navigateReload( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->navigateReload(); - - return true; - }; - - return false; -} - -/////////////////////////////////////////////////////////////////////////////// -// -const unsigned char* LLMozLib::grabBrowserWindow( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->grabWindow( 0, 0, getBrowserWidth( browserWindowIdIn ), getBrowserHeight( browserWindowIdIn ) ); - }; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -const unsigned char* LLMozLib::getBrowserWindowPixels( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->getPageBuffer(); - }; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -const bool LLMozLib::flipWindow( int browserWindowIdIn, bool flipIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->flipWindow( flipIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -const int LLMozLib::getBrowserWidth( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->getBrowserWidth(); - }; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -const int LLMozLib::getBrowserHeight( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->getBrowserHeight(); - }; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -const int LLMozLib::getBrowserDepth( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->getBrowserDepth(); - }; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -const int LLMozLib::getBrowserRowSpan( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->getBrowserRowSpan(); - }; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::mouseDown( int browserWindowIdIn, int xPosIn, int yPosIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->mouseDown( xPosIn, yPosIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::mouseUp( int browserWindowIdIn, int xPosIn, int yPosIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->mouseUp( xPosIn, yPosIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::mouseMove( int browserWindowIdIn, int xPosIn, int yPosIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->mouseMove( xPosIn, yPosIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::mouseLeftDoubleClick( int browserWindowIdIn, int xPosIn, int yPosIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->mouseLeftDoubleClick( xPosIn, yPosIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::keyPress( int browserWindowIdIn, int keyCodeIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->keyPress( keyCodeIn ); - - return true; - }; - - return false; -} - -bool LLMozLib::unicodeInput( int browserWindowIdIn, unsigned long uni_char ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->unicodeInput( uni_char ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::focusBrowser( int browserWindowIdIn, bool focusBrowserIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->focusBrowser( focusBrowserIn ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLMozLib::setNoFollowScheme( int browserWindowIdIn, std::string schemeIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->setNoFollowScheme( schemeIn ); - }; -} - -//////////////////////////////////////////////////////////////////////////////// -// -std::string LLMozLib::getNoFollowScheme( int browserWindowIdIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->getNoFollowScheme(); - }; - - return ( "" ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::enableCookies( bool enabledIn ) -{ - return LLEmbeddedBrowser::getInstance()->enableCookies( enabledIn ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::clearAllCookies() -{ - return LLEmbeddedBrowser::getInstance()->clearAllCookies(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::enablePlugins( bool enabledIn ) -{ - return LLEmbeddedBrowser::getInstance()->enablePlugins( enabledIn ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -std::string LLMozLib::evaluateJavascript( int browserWindowIdIn, const std::string scriptIn ) -{ - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->evaluateJavascript( scriptIn ); - }; - - return ""; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::set404RedirectUrl( int browser_window_in, std::string redirect_url ) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId( browser_window_in ); - if ( browser_window ) - { - browser_window->set404RedirectUrl( redirect_url ); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLMozLib::clr404RedirectUrl( int browser_window_in ) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId( browser_window_in ); - if ( browser_window ) - { - browser_window->clr404RedirectUrl(); - - return true; - }; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// utility method to get an LLEmbeddedBrowserWindow* from a window id (int) -LLEmbeddedBrowserWindow* LLMozLib::getBrowserWindowFromWindowId( int browserWindowIdIn ) -{ - BrowserWindowMapIter iter = mBrowserWindowMap.find( browserWindowIdIn ); - - if ( iter != mBrowserWindowMap.end() ) - return ( *iter ).second; - else - return 0; -} - diff --git a/examples/osgbrowser/llmozlib2.h b/examples/osgbrowser/llmozlib2.h deleted file mode 100644 index 96cdb7512..000000000 --- a/examples/osgbrowser/llmozlib2.h +++ /dev/null @@ -1,384 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is Linden Lab Inc. (http://lindenlab.com) code. - * - * The Initial Developer of the Original Code is: - * Callum Prentice (callum@ubrowser.com) - * - * Portions created by the Initial Developer are Copyright (C) 2006 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Callum Prentice (callum@ubrowser.com) - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef LLMOZLIB_H -#define LLMOZLIB_H - -#include -#include - -class LLEmbeddedBrowser; -class LLEmbeddedBrowserWindow; - -//////////////////////////////////////////////////////////////////////////////// -// data class that is passed with an event -class LLEmbeddedBrowserWindowEvent -{ - public: - LLEmbeddedBrowserWindowEvent( int eventWindowIdIn, std::string uriIn ) : - mEventWindowId( eventWindowIdIn ), - mEventUri( uriIn ) - { - }; - - // single int passed with the event - e.g. progress - LLEmbeddedBrowserWindowEvent( int eventWindowIdIn, std::string uriIn, int intValIn ) : - mEventWindowId( eventWindowIdIn ), - mEventUri( uriIn ), - mIntVal( intValIn ) - { - }; - - // string passed with the event - LLEmbeddedBrowserWindowEvent( int eventWindowIdIn, std::string uriIn, std::string stringValIn ) : - mEventWindowId( eventWindowIdIn ), - mEventUri( uriIn ), - mStringVal( stringValIn ) - { - }; - - // 2 strings passed with the event - LLEmbeddedBrowserWindowEvent( int eventWindowIdIn, std::string uriIn, std::string stringValIn, std::string stringVal2In ) : - mEventWindowId( eventWindowIdIn ), - mEventUri( uriIn ), - mStringVal( stringValIn ), - mStringVal2( stringVal2In ) - { - }; - - // string and an int passed with the event - LLEmbeddedBrowserWindowEvent( int eventWindowIdIn, std::string uriIn, std::string stringValIn, int intValIn ) : - mEventWindowId( eventWindowIdIn ), - mEventUri( uriIn ), - mStringVal( stringValIn ), - mIntVal( intValIn ) - { - }; - - // 4 ints passed (semantically as a rectangle but could be anything - didn't want to make a RECT type structure) - LLEmbeddedBrowserWindowEvent( int eventWindowIdIn, std::string uriIn, int xIn, int yIn, int widthIn, int heightIn ) : - mEventWindowId( eventWindowIdIn ), - mEventUri( uriIn ), - mXVal( xIn ), - mYVal( yIn ), - mWidthVal( widthIn ), - mHeightVal( heightIn ) - { - }; - - virtual ~LLEmbeddedBrowserWindowEvent() - { - }; - - int getEventWindowId() const - { - return mEventWindowId; - }; - - std::string getEventUri() const - { - return mEventUri; - }; - - int getIntValue() const - { - return mIntVal; - }; - - std::string getStringValue() const - { - return mStringVal; - }; - - std::string getStringValue2() const - { - return mStringVal2; - }; - - void getRectValue( int& xOut, int& yOut, int& widthOut, int& heightOut ) const - { - xOut = mXVal; - yOut = mYVal; - widthOut = mWidthVal; - heightOut = mHeightVal; - }; - - private: - int mEventWindowId; - std::string mEventUri; - int mIntVal; - std::string mStringVal; - std::string mStringVal2; - int mXVal; - int mYVal; - int mWidthVal; - int mHeightVal; -}; - -//////////////////////////////////////////////////////////////////////////////// -// derrive from this class and override these methods to observe these events -class LLEmbeddedBrowserWindowObserver -{ - public: - virtual ~LLEmbeddedBrowserWindowObserver() { }; - typedef LLEmbeddedBrowserWindowEvent EventType; - - virtual void onPageChanged( const EventType& eventIn ) { }; - virtual void onNavigateBegin( const EventType& eventIn ) { }; - virtual void onNavigateComplete( const EventType& eventIn ) { }; - virtual void onUpdateProgress( const EventType& eventIn ) { }; - virtual void onStatusTextChange( const EventType& eventIn ) { }; - virtual void onLocationChange( const EventType& eventIn ) { }; - virtual void onClickLinkHref( const EventType& eventIn ) { }; - virtual void onClickLinkNoFollow( const EventType& eventIn ) { }; -}; - -//////////////////////////////////////////////////////////////////////////////// -// main library class -class LLMozLib -{ - public: - virtual ~LLMozLib(); - - // singleton access - static LLMozLib* getInstance(); - - // housekeeping - bool init( std::string applicationDir, std::string componentDir, std::string profileDir, void* nativeWindowHandleIn ); - bool reset(); - bool clearCache(); - int getLastError(); - const std::string getVersion(); - void setBrowserAgentId( std::string idIn ); - bool enableProxy( bool proxyEnabledIn, std::string proxyHostNameIn, int proxyPortIn ); - bool enableCookies( bool enabledIn ); - bool clearAllCookies(); - bool enablePlugins( bool enabledIn ); - - // browser window - creation/deletion, mutation etc. - int createBrowserWindow( int browserWindowWidthIn, int browserWindowHeightIn ); - bool destroyBrowserWindow( int browserWindowIdIn ); - bool setSize( int browserWindowIdIn, int widthIn, int heightIn ); - bool scrollByLines( int browserWindowIdIn, int linesIn ); - bool setBackgroundColor( int browserWindowIdIn, const int redIn, const int greenIn, const int blueIn ); - bool setCaretColor( int browserWindowIdIn, const int redIn, const int greenIn, const int blueIn ); - bool setEnabled( int browserWindowIdIn, bool enabledIn ); - - // add/remove yourself as an observer on browser events - see LLEmbeddedBrowserWindowObserver declaration - bool addObserver( int browserWindowIdIn, LLEmbeddedBrowserWindowObserver* subjectIn ); - bool remObserver( int browserWindowIdIn, LLEmbeddedBrowserWindowObserver* subjectIn ); - - // navigation - self explanatory - bool navigateTo( int browserWindowIdIn, const std::string uriIn ); - bool navigateStop( int browserWindowIdIn ); - bool canNavigateBack( int browserWindowIdIn ); - bool navigateBack( int browserWindowIdIn ); - bool canNavigateForward( int browserWindowIdIn ); - bool navigateForward( int browserWindowIdIn ); - bool navigateReload( int browserWindowIdIn ); - - // javascript access/control - std::string evaluateJavascript( int browserWindowIdIn, const std::string scriptIn ); - - // set/clear URL to redirect to when a 404 page is reached - bool set404RedirectUrl( int browser_window_in, std::string redirect_url ); - bool clr404RedirectUrl( int browser_window_in ); - - // access to rendered bitmap data - const unsigned char* grabBrowserWindow( int browserWindowIdIn ); // renders page to memory and returns pixels - const unsigned char* getBrowserWindowPixels( int browserWindowIdIn ); // just returns pixels - no render - const bool flipWindow( int browserWindowIdIn, bool flipIn ); // optionally flip window (pixels) you get back - const int getBrowserWidth( int browserWindowIdIn ); // current browser width (can vary slightly after page is rendered) - const int getBrowserHeight( int browserWindowIdIn ); // current height - const int getBrowserDepth( int browserWindowIdIn ); // depth in bytes - const int getBrowserRowSpan( int browserWindowIdIn ); // width in pixels * depth in bytes - - // mouse/keyboard interaction - bool mouseDown( int browserWindowIdIn, int xPosIn, int yPosIn ); // send a mouse down event to a browser window at given XY in browser space - bool mouseUp( int browserWindowIdIn, int xPosIn, int yPosIn ); // send a mouse up event to a browser window at given XY in browser space - bool mouseMove( int browserWindowIdIn, int xPosIn, int yPosIn ); // send a mouse move event to a browser window at given XY in browser space - bool mouseLeftDoubleClick( int browserWindowIdIn, int xPosIn, int yPosIn ); // send a mouse left button double click to a browser window at given XY in browser space - bool keyPress( int browserWindowIdIn, int keyCodeIn ); // send a key press event to a browser window - bool unicodeInput ( int browserWindowIdIn, unsigned long uni_char ); // send a unicode keypress event to a browser window - bool focusBrowser( int browserWindowIdIn, bool focusBrowserIn ); // set/remove focus to given browser window - - // accessor/mutator for scheme that browser doesn't follow - e.g. secondlife.com:// - void setNoFollowScheme( int browserWindowIdIn, std::string schemeIn ); - std::string getNoFollowScheme( int browserWindowIdIn ); - - private: - LLMozLib(); - LLEmbeddedBrowserWindow* getBrowserWindowFromWindowId( int browserWindowIdIn ); - static LLMozLib* sInstance; - const int mMaxBrowserWindows; - typedef std::map< int, LLEmbeddedBrowserWindow* > BrowserWindowMap; - typedef std::map< int, LLEmbeddedBrowserWindow* >::iterator BrowserWindowMapIter; - BrowserWindowMap mBrowserWindowMap; -}; - -// Mozilla virtual keycodes. -// We don't want to suck in Mozilla headers so we copy these consts -// from nsIDOMKeyEvent.idl. - -const unsigned long LL_DOM_VK_CANCEL = 0x03; -const unsigned long LL_DOM_VK_HELP = 0x06; -const unsigned long LL_DOM_VK_BACK_SPACE = 0x08; -const unsigned long LL_DOM_VK_TAB = 0x09; -const unsigned long LL_DOM_VK_CLEAR = 0x0C; -const unsigned long LL_DOM_VK_RETURN = 0x0D; -const unsigned long LL_DOM_VK_ENTER = 0x0E; -const unsigned long LL_DOM_VK_SHIFT = 0x10; -const unsigned long LL_DOM_VK_CONTROL = 0x11; -const unsigned long LL_DOM_VK_ALT = 0x12; -const unsigned long LL_DOM_VK_PAUSE = 0x13; -const unsigned long LL_DOM_VK_CAPS_LOCK = 0x14; -const unsigned long LL_DOM_VK_ESCAPE = 0x1B; -const unsigned long LL_DOM_VK_SPACE = 0x20; -const unsigned long LL_DOM_VK_PAGE_UP = 0x21; -const unsigned long LL_DOM_VK_PAGE_DOWN = 0x22; -const unsigned long LL_DOM_VK_END = 0x23; -const unsigned long LL_DOM_VK_HOME = 0x24; -const unsigned long LL_DOM_VK_LEFT = 0x25; -const unsigned long LL_DOM_VK_UP = 0x26; -const unsigned long LL_DOM_VK_RIGHT = 0x27; -const unsigned long LL_DOM_VK_DOWN = 0x28; -const unsigned long LL_DOM_VK_PRINTSCREEN = 0x2C; -const unsigned long LL_DOM_VK_INSERT = 0x2D; -const unsigned long LL_DOM_VK_DELETE = 0x2E; - -// LL_DOM_VK_0 - LL_DOM_VK_9 match their ASCII values -const unsigned long LL_DOM_VK_0 = 0x30; -const unsigned long LL_DOM_VK_1 = 0x31; -const unsigned long LL_DOM_VK_2 = 0x32; -const unsigned long LL_DOM_VK_3 = 0x33; -const unsigned long LL_DOM_VK_4 = 0x34; -const unsigned long LL_DOM_VK_5 = 0x35; -const unsigned long LL_DOM_VK_6 = 0x36; -const unsigned long LL_DOM_VK_7 = 0x37; -const unsigned long LL_DOM_VK_8 = 0x38; -const unsigned long LL_DOM_VK_9 = 0x39; - -const unsigned long LL_DOM_VK_SEMICOLON = 0x3B; -const unsigned long LL_DOM_VK_EQUALS = 0x3D; - -// LL_DOM_VK_A - LL_DOM_VK_Z match their ASCII values -const unsigned long LL_DOM_VK_A = 0x41; -const unsigned long LL_DOM_VK_B = 0x42; -const unsigned long LL_DOM_VK_C = 0x43; -const unsigned long LL_DOM_VK_D = 0x44; -const unsigned long LL_DOM_VK_E = 0x45; -const unsigned long LL_DOM_VK_F = 0x46; -const unsigned long LL_DOM_VK_G = 0x47; -const unsigned long LL_DOM_VK_H = 0x48; -const unsigned long LL_DOM_VK_I = 0x49; -const unsigned long LL_DOM_VK_J = 0x4A; -const unsigned long LL_DOM_VK_K = 0x4B; -const unsigned long LL_DOM_VK_L = 0x4C; -const unsigned long LL_DOM_VK_M = 0x4D; -const unsigned long LL_DOM_VK_N = 0x4E; -const unsigned long LL_DOM_VK_O = 0x4F; -const unsigned long LL_DOM_VK_P = 0x50; -const unsigned long LL_DOM_VK_Q = 0x51; -const unsigned long LL_DOM_VK_R = 0x52; -const unsigned long LL_DOM_VK_S = 0x53; -const unsigned long LL_DOM_VK_T = 0x54; -const unsigned long LL_DOM_VK_U = 0x55; -const unsigned long LL_DOM_VK_V = 0x56; -const unsigned long LL_DOM_VK_W = 0x57; -const unsigned long LL_DOM_VK_X = 0x58; -const unsigned long LL_DOM_VK_Y = 0x59; -const unsigned long LL_DOM_VK_Z = 0x5A; - -const unsigned long LL_DOM_VK_CONTEXT_MENU = 0x5D; - -const unsigned long LL_DOM_VK_NUMPAD0 = 0x60; -const unsigned long LL_DOM_VK_NUMPAD1 = 0x61; -const unsigned long LL_DOM_VK_NUMPAD2 = 0x62; -const unsigned long LL_DOM_VK_NUMPAD3 = 0x63; -const unsigned long LL_DOM_VK_NUMPAD4 = 0x64; -const unsigned long LL_DOM_VK_NUMPAD5 = 0x65; -const unsigned long LL_DOM_VK_NUMPAD6 = 0x66; -const unsigned long LL_DOM_VK_NUMPAD7 = 0x67; -const unsigned long LL_DOM_VK_NUMPAD8 = 0x68; -const unsigned long LL_DOM_VK_NUMPAD9 = 0x69; -const unsigned long LL_DOM_VK_MULTIPLY = 0x6A; -const unsigned long LL_DOM_VK_ADD = 0x6B; -const unsigned long LL_DOM_VK_SEPARATOR = 0x6C; -const unsigned long LL_DOM_VK_SUBTRACT = 0x6D; -const unsigned long LL_DOM_VK_DECIMAL = 0x6E; -const unsigned long LL_DOM_VK_DIVIDE = 0x6F; -const unsigned long LL_DOM_VK_F1 = 0x70; -const unsigned long LL_DOM_VK_F2 = 0x71; -const unsigned long LL_DOM_VK_F3 = 0x72; -const unsigned long LL_DOM_VK_F4 = 0x73; -const unsigned long LL_DOM_VK_F5 = 0x74; -const unsigned long LL_DOM_VK_F6 = 0x75; -const unsigned long LL_DOM_VK_F7 = 0x76; -const unsigned long LL_DOM_VK_F8 = 0x77; -const unsigned long LL_DOM_VK_F9 = 0x78; -const unsigned long LL_DOM_VK_F10 = 0x79; -const unsigned long LL_DOM_VK_F11 = 0x7A; -const unsigned long LL_DOM_VK_F12 = 0x7B; -const unsigned long LL_DOM_VK_F13 = 0x7C; -const unsigned long LL_DOM_VK_F14 = 0x7D; -const unsigned long LL_DOM_VK_F15 = 0x7E; -const unsigned long LL_DOM_VK_F16 = 0x7F; -const unsigned long LL_DOM_VK_F17 = 0x80; -const unsigned long LL_DOM_VK_F18 = 0x81; -const unsigned long LL_DOM_VK_F19 = 0x82; -const unsigned long LL_DOM_VK_F20 = 0x83; -const unsigned long LL_DOM_VK_F21 = 0x84; -const unsigned long LL_DOM_VK_F22 = 0x85; -const unsigned long LL_DOM_VK_F23 = 0x86; -const unsigned long LL_DOM_VK_F24 = 0x87; - -const unsigned long LL_DOM_VK_NUM_LOCK = 0x90; -const unsigned long LL_DOM_VK_SCROLL_LOCK = 0x91; - -const unsigned long LL_DOM_VK_COMMA = 0xBC; -const unsigned long LL_DOM_VK_PERIOD = 0xBE; -const unsigned long LL_DOM_VK_SLASH = 0xBF; -const unsigned long LL_DOM_VK_BACK_QUOTE = 0xC0; -const unsigned long LL_DOM_VK_OPEN_BRACKET = 0xDB; -const unsigned long LL_DOM_VK_BACK_SLASH = 0xDC; -const unsigned long LL_DOM_VK_CLOSE_BRACKET = 0xDD; -const unsigned long LL_DOM_VK_QUOTE = 0xDE; - -const unsigned long LL_DOM_VK_META = 0xE0; - -#endif // LLMOZLIB_H diff --git a/examples/osgbrowser/nsProfileDirServiceProvider.cpp b/examples/osgbrowser/nsProfileDirServiceProvider.cpp deleted file mode 100644 index e94914f29..000000000 --- a/examples/osgbrowser/nsProfileDirServiceProvider.cpp +++ /dev/null @@ -1,544 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2002 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Conrad Carlen - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsProfileDirServiceProvider.h" -#include "nsProfileStringTypes.h" -#include "nsProfileLock.h" -#include "nsILocalFile.h" -#include "nsDirectoryServiceDefs.h" -#include "nsAppDirectoryServiceDefs.h" -#include "nsISupportsUtils.h" -#include "nsISimpleEnumerator.h" -#include "nsIObserverService.h" - -#ifdef MOZ_PROFILESHARING -#include "nsIProfileSharingSetup.h" -#include "ipcITransactionService.h" -#endif - -// File Name Defines - -#define PREFS_FILE_50_NAME NS_LITERAL_CSTRING("prefs.js") -#define USER_CHROME_DIR_50_NAME NS_LITERAL_CSTRING("chrome") -#define LOCAL_STORE_FILE_50_NAME NS_LITERAL_CSTRING("localstore.rdf") -#define HISTORY_FILE_50_NAME NS_LITERAL_CSTRING("history.dat") -#define PANELS_FILE_50_NAME NS_LITERAL_CSTRING("panels.rdf") -#define MIME_TYPES_FILE_50_NAME NS_LITERAL_CSTRING("mimeTypes.rdf") -#define BOOKMARKS_FILE_50_NAME NS_LITERAL_CSTRING("bookmarks.html") -#define DOWNLOADS_FILE_50_NAME NS_LITERAL_CSTRING("downloads.rdf") -#define SEARCH_FILE_50_NAME NS_LITERAL_CSTRING("search.rdf" ) -#define MAIL_DIR_50_NAME NS_LITERAL_CSTRING("Mail") -#define IMAP_MAIL_DIR_50_NAME NS_LITERAL_CSTRING("ImapMail") -#define NEWS_DIR_50_NAME NS_LITERAL_CSTRING("News") -#define MSG_FOLDER_CACHE_DIR_50_NAME NS_LITERAL_CSTRING("panacea.dat") -#define STORAGE_FILE_50_NAME NS_LITERAL_CSTRING("storage.sdb") - -//***************************************************************************** -// nsProfileDirServiceProvider::nsProfileDirServiceProvider -//***************************************************************************** - -nsProfileDirServiceProvider::nsProfileDirServiceProvider(PRBool aNotifyObservers) : -#ifdef MOZ_PROFILELOCKING - mProfileDirLock(nsnull), -#endif - mNotifyObservers(aNotifyObservers), - mSharingEnabled(PR_FALSE) -{ -} - - -nsProfileDirServiceProvider::~nsProfileDirServiceProvider() -{ -#ifdef MOZ_PROFILELOCKING - delete mProfileDirLock; -#endif -} - -nsresult -nsProfileDirServiceProvider::SetProfileDir(nsIFile* aProfileDir, - nsIFile* aLocalProfileDir) -{ - if (!aLocalProfileDir) - aLocalProfileDir = aProfileDir; - if (mProfileDir) { - PRBool isEqual; - if (aProfileDir && - NS_SUCCEEDED(aProfileDir->Equals(mProfileDir, &isEqual)) && isEqual) { - NS_WARNING("Setting profile dir to same as current"); - return NS_OK; - } -#ifdef MOZ_PROFILELOCKING - mProfileDirLock->Unlock(); -#endif - UndefineFileLocations(); - } - mProfileDir = aProfileDir; - mLocalProfileDir = aLocalProfileDir; - if (!mProfileDir) - return NS_OK; - - nsresult rv = InitProfileDir(mProfileDir); - if (NS_FAILED(rv)) - return rv; - - // Make sure that the local profile dir exists - // we just try to create it - if it exists already, that'll fail; ignore - // errors - mLocalProfileDir->Create(nsIFile::DIRECTORY_TYPE, 0700); - -#ifdef MOZ_PROFILESHARING - if (mSharingEnabled) { - nsCOMPtr transServ = - do_GetService(IPC_TRANSACTIONSERVICE_CONTRACTID, &rv); - if (NS_SUCCEEDED(rv)) { - nsCAutoString nativePath; - rv = mProfileDir->GetNativePath(nativePath); - if (NS_SUCCEEDED(rv)) - rv = transServ->Init(nativePath); - } - if (NS_FAILED(rv)) { - NS_WARNING("Unable to initialize transaction service"); - } - } -#endif - -#ifdef MOZ_PROFILELOCKING - // Lock the non-shared sub-dir if we are sharing, - // the whole profile dir if we are not. - nsCOMPtr dirToLock; - if (mSharingEnabled) - dirToLock = do_QueryInterface(mNonSharedProfileDir); - else - dirToLock = do_QueryInterface(mProfileDir); - rv = mProfileDirLock->Lock(dirToLock, nsnull); - if (NS_FAILED(rv)) - return rv; -#endif - - if (mNotifyObservers) { - nsCOMPtr observerService = - do_GetService("@mozilla.org/observer-service;1"); - if (!observerService) - return NS_ERROR_FAILURE; - - NS_NAMED_LITERAL_STRING(context, "startup"); - // Notify observers that the profile has changed - Here they respond to new profile - observerService->NotifyObservers(nsnull, "profile-do-change", context.get()); - // Now observers can respond to something another observer did on "profile-do-change" - observerService->NotifyObservers(nsnull, "profile-after-change", context.get()); - } - - return NS_OK; -} - -nsresult -nsProfileDirServiceProvider::Register() -{ - nsCOMPtr directoryService = - do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID); - if (!directoryService) - return NS_ERROR_FAILURE; - return directoryService->RegisterProvider(this); -} - -nsresult -nsProfileDirServiceProvider::Shutdown() -{ - if (!mNotifyObservers) - return NS_OK; - - nsCOMPtr observerService = - do_GetService("@mozilla.org/observer-service;1"); - if (!observerService) - return NS_ERROR_FAILURE; - - NS_NAMED_LITERAL_STRING(context, "shutdown-persist"); - observerService->NotifyObservers(nsnull, "profile-before-change", context.get()); - return NS_OK; -} - -//***************************************************************************** -// nsProfileDirServiceProvider::nsISupports -//***************************************************************************** - -NS_IMPL_THREADSAFE_ISUPPORTS1(nsProfileDirServiceProvider, - nsIDirectoryServiceProvider) - -//***************************************************************************** -// nsProfileDirServiceProvider::nsIDirectoryServiceProvider -//***************************************************************************** - -NS_IMETHODIMP -nsProfileDirServiceProvider::GetFile(const char *prop, PRBool *persistant, nsIFile **_retval) -{ - NS_ENSURE_ARG(prop); - NS_ENSURE_ARG_POINTER(persistant); - NS_ENSURE_ARG_POINTER(_retval); - - // Don't assert - we can be called many times before SetProfileDir() has been called. - if (!mProfileDir) - return NS_ERROR_FAILURE; - - *persistant = PR_TRUE; - nsIFile* domainDir = mProfileDir; - -#ifdef MOZ_PROFILESHARING - // If the prop is prefixed with NS_SHARED, - // the location is in the shared domain. - PRBool bUseShared = PR_FALSE; - if (strncmp(prop, NS_SHARED, sizeof(NS_SHARED)-1) == 0) { - prop += (sizeof(NS_SHARED)-1); - bUseShared = PR_TRUE; - } - if (!bUseShared && mNonSharedProfileDir) - domainDir = mNonSharedProfileDir; -#endif - - nsCOMPtr localFile; - nsresult rv = NS_ERROR_FAILURE; - - if (strcmp(prop, NS_APP_PREFS_50_DIR) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - } - else if (strcmp(prop, NS_APP_PREFS_50_FILE) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) - rv = localFile->AppendNative(PREFS_FILE_50_NAME); - } - else if (strcmp(prop, NS_APP_USER_PROFILE_50_DIR) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - } - else if (strcmp(prop, NS_APP_USER_PROFILE_LOCAL_50_DIR) == 0) { - rv = mLocalProfileDir->Clone(getter_AddRefs(localFile)); - } - else if (strcmp(prop, NS_APP_USER_CHROME_DIR) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) - rv = localFile->AppendNative(USER_CHROME_DIR_50_NAME); - } - else if (strcmp(prop, NS_APP_LOCALSTORE_50_FILE) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) { - rv = localFile->AppendNative(LOCAL_STORE_FILE_50_NAME); - if (NS_SUCCEEDED(rv)) { - // it's OK if we can't copy the file... it will be created - // by client code. - (void) EnsureProfileFileExists(localFile, domainDir); - } - } - } - else if (strcmp(prop, NS_APP_HISTORY_50_FILE) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) - rv = localFile->AppendNative(HISTORY_FILE_50_NAME); - } - else if (strcmp(prop, NS_APP_USER_PANELS_50_FILE) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) { - rv = localFile->AppendNative(PANELS_FILE_50_NAME); - if (NS_SUCCEEDED(rv)) - rv = EnsureProfileFileExists(localFile, domainDir); - } - } - else if (strcmp(prop, NS_APP_USER_MIMETYPES_50_FILE) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) { - rv = localFile->AppendNative(MIME_TYPES_FILE_50_NAME); - if (NS_SUCCEEDED(rv)) - rv = EnsureProfileFileExists(localFile, domainDir); - } - } - else if (strcmp(prop, NS_APP_BOOKMARKS_50_FILE) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) - rv = localFile->AppendNative(BOOKMARKS_FILE_50_NAME); - } - else if (strcmp(prop, NS_APP_DOWNLOADS_50_FILE) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) - rv = localFile->AppendNative(DOWNLOADS_FILE_50_NAME); - } - else if (strcmp(prop, NS_APP_SEARCH_50_FILE) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) { - rv = localFile->AppendNative(SEARCH_FILE_50_NAME); - if (NS_SUCCEEDED(rv)) - rv = EnsureProfileFileExists(localFile, domainDir); - } - } - else if (strcmp(prop, NS_APP_MAIL_50_DIR) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) - rv = localFile->AppendNative(MAIL_DIR_50_NAME); - } - else if (strcmp(prop, NS_APP_IMAP_MAIL_50_DIR) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) - rv = localFile->AppendNative(IMAP_MAIL_DIR_50_NAME); - } - else if (strcmp(prop, NS_APP_NEWS_50_DIR) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) - rv = localFile->AppendNative(NEWS_DIR_50_NAME); - } - else if (strcmp(prop, NS_APP_MESSENGER_FOLDER_CACHE_50_DIR) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) - rv = localFile->AppendNative(MSG_FOLDER_CACHE_DIR_50_NAME); - } - else if (strcmp(prop, NS_APP_STORAGE_50_FILE) == 0) { - rv = domainDir->Clone(getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) - rv = localFile->AppendNative(STORAGE_FILE_50_NAME); - } - - - if (localFile && NS_SUCCEEDED(rv)) - return CallQueryInterface(localFile, _retval); - - return rv; -} - -//***************************************************************************** -// Protected methods -//***************************************************************************** - -nsresult -nsProfileDirServiceProvider::Initialize() -{ -#ifdef MOZ_PROFILELOCKING - mProfileDirLock = new nsProfileLock; - if (!mProfileDirLock) - return NS_ERROR_OUT_OF_MEMORY; -#endif - -#ifdef MOZ_PROFILESHARING - nsCOMPtr sharingSetup = - do_GetService("@mozilla.org/embedcomp/profile-sharing-setup;1"); - if (sharingSetup) { - PRBool tempBool; - if (NS_SUCCEEDED(sharingSetup->GetIsSharingEnabled(&tempBool))) - mSharingEnabled = tempBool; - if (mSharingEnabled) - sharingSetup->GetClientName(mNonSharedDirName); - } -#endif - - return NS_OK; -} - -nsresult -nsProfileDirServiceProvider::InitProfileDir(nsIFile *profileDir) -{ - // Make sure our "Profile" folder exists. - // If it does not, copy the profile defaults to its location. - - nsresult rv; - PRBool exists; - rv = profileDir->Exists(&exists); - if (NS_FAILED(rv)) - return rv; - - if (!exists) { - nsCOMPtr profileDefaultsDir; - nsCOMPtr profileDirParent; - nsCAutoString profileDirName; - - (void)profileDir->GetParent(getter_AddRefs(profileDirParent)); - if (!profileDirParent) - return NS_ERROR_FAILURE; - rv = profileDir->GetNativeLeafName(profileDirName); - if (NS_FAILED(rv)) - return rv; - - rv = NS_GetSpecialDirectory(NS_APP_PROFILE_DEFAULTS_50_DIR, getter_AddRefs(profileDefaultsDir)); - if (NS_FAILED(rv)) { - rv = NS_GetSpecialDirectory(NS_APP_PROFILE_DEFAULTS_NLOC_50_DIR, getter_AddRefs(profileDefaultsDir)); - if (NS_FAILED(rv)) - return rv; - } - rv = profileDefaultsDir->CopyToNative(profileDirParent, profileDirName); - if (NS_FAILED(rv)) { - // if copying failed, lets just ensure that the profile directory exists. - profileDirParent->AppendNative(profileDirName); - rv = profileDirParent->Create(nsIFile::DIRECTORY_TYPE, 0700); - if (NS_FAILED(rv)) - return rv; - } - -#if !defined(XP_MAC) && !defined(WINCE) - rv = profileDir->SetPermissions(0700); - if (NS_FAILED(rv)) - return rv; -#endif - - } - else { - PRBool isDir; - rv = profileDir->IsDirectory(&isDir); - - if (NS_FAILED(rv)) - return rv; - if (!isDir) - return NS_ERROR_FILE_NOT_DIRECTORY; - } - - if (mNonSharedDirName.Length()) - rv = InitNonSharedProfileDir(); - - return rv; -} - -nsresult -nsProfileDirServiceProvider::InitNonSharedProfileDir() -{ - nsresult rv; - - NS_ENSURE_STATE(mProfileDir); - NS_ENSURE_STATE(mNonSharedDirName.Length()); - - nsCOMPtr localDir; - rv = mProfileDir->Clone(getter_AddRefs(localDir)); - if (NS_SUCCEEDED(rv)) { - rv = localDir->Append(mNonSharedDirName); - if (NS_SUCCEEDED(rv)) { - PRBool exists; - rv = localDir->Exists(&exists); - if (NS_SUCCEEDED(rv)) { - if (!exists) { - rv = localDir->Create(nsIFile::DIRECTORY_TYPE, 0700); - } - else { - PRBool isDir; - rv = localDir->IsDirectory(&isDir); - if (NS_SUCCEEDED(rv)) { - if (!isDir) - rv = NS_ERROR_FILE_NOT_DIRECTORY; - } - } - if (NS_SUCCEEDED(rv)) - mNonSharedProfileDir = localDir; - } - } - } - return rv; -} - -nsresult -nsProfileDirServiceProvider::EnsureProfileFileExists(nsIFile *aFile, nsIFile *destDir) -{ - nsresult rv; - PRBool exists; - - rv = aFile->Exists(&exists); - if (NS_FAILED(rv)) - return rv; - if (exists) - return NS_OK; - - nsCOMPtr defaultsFile; - - // Attempt first to get the localized subdir of the defaults - rv = NS_GetSpecialDirectory(NS_APP_PROFILE_DEFAULTS_50_DIR, getter_AddRefs(defaultsFile)); - if (NS_FAILED(rv)) { - // If that has not been defined, use the top level of the defaults - rv = NS_GetSpecialDirectory(NS_APP_PROFILE_DEFAULTS_NLOC_50_DIR, getter_AddRefs(defaultsFile)); - if (NS_FAILED(rv)) - return rv; - } - - nsCAutoString leafName; - rv = aFile->GetNativeLeafName(leafName); - if (NS_FAILED(rv)) - return rv; - rv = defaultsFile->AppendNative(leafName); - if (NS_FAILED(rv)) - return rv; - - return defaultsFile->CopyTo(destDir, EmptyString()); -} - -nsresult -nsProfileDirServiceProvider::UndefineFileLocations() -{ - nsresult rv; - - nsCOMPtr directoryService = - do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv); - NS_ENSURE_TRUE(directoryService, NS_ERROR_FAILURE); - - (void) directoryService->Undefine(NS_APP_PREFS_50_DIR); - (void) directoryService->Undefine(NS_APP_PREFS_50_FILE); - (void) directoryService->Undefine(NS_APP_USER_PROFILE_50_DIR); - (void) directoryService->Undefine(NS_APP_USER_CHROME_DIR); - (void) directoryService->Undefine(NS_APP_LOCALSTORE_50_FILE); - (void) directoryService->Undefine(NS_APP_HISTORY_50_FILE); - (void) directoryService->Undefine(NS_APP_USER_PANELS_50_FILE); - (void) directoryService->Undefine(NS_APP_USER_MIMETYPES_50_FILE); - (void) directoryService->Undefine(NS_APP_BOOKMARKS_50_FILE); - (void) directoryService->Undefine(NS_APP_DOWNLOADS_50_FILE); - (void) directoryService->Undefine(NS_APP_SEARCH_50_FILE); - (void) directoryService->Undefine(NS_APP_MAIL_50_DIR); - (void) directoryService->Undefine(NS_APP_IMAP_MAIL_50_DIR); - (void) directoryService->Undefine(NS_APP_NEWS_50_DIR); - (void) directoryService->Undefine(NS_APP_MESSENGER_FOLDER_CACHE_50_DIR); - - return NS_OK; -} - -//***************************************************************************** -// Global creation function -//***************************************************************************** - -nsresult NS_NewProfileDirServiceProvider(PRBool aNotifyObservers, - nsProfileDirServiceProvider** aProvider) -{ - NS_ENSURE_ARG_POINTER(aProvider); - *aProvider = nsnull; - - nsProfileDirServiceProvider *prov = new nsProfileDirServiceProvider(aNotifyObservers); - if (!prov) - return NS_ERROR_OUT_OF_MEMORY; - nsresult rv = prov->Initialize(); - if (NS_FAILED(rv)) { - delete prov; - return rv; - } - NS_ADDREF(*aProvider = prov); - return NS_OK; -} diff --git a/examples/osgbrowser/nsProfileDirServiceProvider.h b/examples/osgbrowser/nsProfileDirServiceProvider.h deleted file mode 100644 index 03c5f4606..000000000 --- a/examples/osgbrowser/nsProfileDirServiceProvider.h +++ /dev/null @@ -1,145 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2002 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Conrad Carlen - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -// Interfaces Needed -#include "nsIDirectoryService.h" -#include "nsILocalFile.h" - -#include "nsCOMPtr.h" -#include "nsDirectoryServiceUtils.h" -#include "nsComponentManagerUtils.h" -#include "nsServiceManagerUtils.h" - -#ifdef MOZILLA_INTERNAL_API -#include "nsString.h" -#else -#include "nsEmbedString.h" -#endif - -// Forward Declarations -class nsProfileLock; - -// -------------------------------------------------------------------------------------- -// nsProfileDirServiceProvider - The nsIDirectoryServiceProvider implementation used for -// profile-relative file locations. -// -------------------------------------------------------------------------------------- - -class nsProfileDirServiceProvider: public nsIDirectoryServiceProvider -{ - NS_DECL_ISUPPORTS - NS_DECL_NSIDIRECTORYSERVICEPROVIDER - - friend nsresult NS_NewProfileDirServiceProvider(PRBool, nsProfileDirServiceProvider**); - -public: - - /** - * SetProfileDir - * - * @param aProfileDir The directory containing the profile files. - * It does not need to exist before calling this - * method. If it does not, it will be created and - * defaults will be copied to it. - * @param aLocalProfileDir - * Directory for local profile data, e.g. Cache. - * If null, aProfileDir will be used for this purpose. - */ - - virtual nsresult SetProfileDir(nsIFile* aProfileDir, - nsIFile* aLocalProfileDir = nsnull); - - /** - * Register - * - * Convenience method to register the provider with directory service. - * The service holds strong references to registered providers so consumers - * don't need to hold a reference to this object after calling Register(). - */ - - virtual nsresult Register(); - - /** - * Shutdown - * - * This method must be called before shutting down XPCOM if this object - * was created with aNotifyObservers == PR_TRUE. If this object was - * created with aNotifyObservers == PR_FALSE, this method is a no-op. - */ - - virtual nsresult Shutdown(); - -protected: - nsProfileDirServiceProvider(PRBool aNotifyObservers = PR_TRUE); - virtual ~nsProfileDirServiceProvider(); - - nsresult Initialize(); - nsresult InitProfileDir(nsIFile* profileDir); - nsresult InitNonSharedProfileDir(); - nsresult EnsureProfileFileExists(nsIFile *aFile, nsIFile *destDir); - nsresult UndefineFileLocations(); - -protected: - - nsCOMPtr mProfileDir; - nsCOMPtr mLocalProfileDir; - nsProfileLock* mProfileDirLock; - PRPackedBool mNotifyObservers; - - PRPackedBool mSharingEnabled; -#ifndef MOZILLA_INTERNAL_API - nsEmbedString mNonSharedDirName; -#else - nsString mNonSharedDirName; -#endif - nsCOMPtr mNonSharedProfileDir; -}; - - -// -------------------------------------------------------------------------------------- - -/** - * Global method to create an instance of nsProfileDirServiceProvider - * - * @param aNotifyObservers If true, will send out profile startup - * notifications when the profile directory is set. - * See nsIProfileChangeStatus. - */ - -nsresult NS_NewProfileDirServiceProvider(PRBool aNotifyObservers, - nsProfileDirServiceProvider** aProvider); - diff --git a/examples/osgbrowser/nsProfileLock.h b/examples/osgbrowser/nsProfileLock.h deleted file mode 100644 index ec9cd9674..000000000 --- a/examples/osgbrowser/nsProfileLock.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 2002 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Conrad Carlen - * Brendan Eich - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef __nsProfileLock_h___ -#define __nsProfileLock_h___ - -#include "nsILocalFile.h" - -class nsIProfileUnlocker; - -#if defined (XP_WIN) -#include -#endif - -#if defined (XP_OS2) -#define INCL_DOSERRORS -#define INCL_DOSFILEMGR -#include -#endif - -#if defined (XP_UNIX) -#include "prclist.h" -#endif - -class nsProfileLock -#if defined (XP_UNIX) - : public PRCList -#endif -{ -public: - nsProfileLock(); - nsProfileLock(nsProfileLock& src); - - ~nsProfileLock(); - - nsProfileLock& operator=(nsProfileLock& rhs); - - /** - * Attempt to lock a profile directory. - * - * @param aProfileDir [in] The profile directory to lock. - * @param aUnlocker [out] Optional. This is only returned when locking - * fails with NS_ERROR_FILE_ACCESS_DENIED, and may not - * be returned at all. - * @throws NS_ERROR_FILE_ACCESS_DENIED if the profile is locked. - */ - nsresult Lock(nsILocalFile* aProfileDir, nsIProfileUnlocker* *aUnlocker); - nsresult Unlock(); - -private: - PRPackedBool mHaveLock; - -#if defined (XP_WIN) - HANDLE mLockFileHandle; -#elif defined (XP_OS2) - LHANDLE mLockFileHandle; -#elif defined (XP_UNIX) - static void RemovePidLockFiles(); - static void FatalSignalHandler(int signo); - static PRCList mPidLockList; - - nsresult LockWithFcntl(const nsACString& lockFilePath); - - /** - * @param aHaveFcntlLock if true, we've already acquired an fcntl lock so this - * lock is merely an "obsolete" lock to keep out old Firefoxes - */ - nsresult LockWithSymlink(const nsACString& lockFilePath, PRBool aHaveFcntlLock); - - char* mPidLockFileName; - int mLockFileDesc; -#endif - -}; - -#endif /* __nsProfileLock_h___ */ diff --git a/examples/osgbrowser/nsProfileStringTypes.h b/examples/osgbrowser/nsProfileStringTypes.h deleted file mode 100644 index 337d642ec..000000000 --- a/examples/osgbrowser/nsProfileStringTypes.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Marco Pesenti Gritti . - * Portions created by the Initial Developer are Copyright (C) 2004 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/** - * We support two builds of the directory service provider. - * One, linked into the profile component, uses the internal - * string API. The other can be used by standalone embedding - * clients, and uses embed strings. - * To keep the code clean, we are using typedefs to equate - * embed/internal string types. We are also defining some - * internal macros in terms of the embedding strings API. - * - * When modifying the profile directory service provider, be - * sure to use methods supported by both the internal and - * embed strings APIs. - */ - -#ifndef MOZILLA_INTERNAL_API - -#include "nsStringAPI.h" - -typedef nsCString nsPromiseFlatCString; -typedef nsCString nsCAutoString; - -#define PromiseFlatCString nsCString - -#else -#include "nsString.h" -#include "nsPromiseFlatString.h" -#endif diff --git a/examples/osgbrowser/osgbrowser.cpp b/examples/osgbrowser/osgbrowser.cpp index 2e707c3e7..e2777e5f4 100644 --- a/examples/osgbrowser/osgbrowser.cpp +++ b/examples/osgbrowser/osgbrowser.cpp @@ -12,11 +12,7 @@ #include #include -#include - -#include "llmozlib2.h" - -#include "UBrowser.h" +#include osg::Node* createInteractiveQuad(const osg::Vec3& origin, osg::Vec3& widthAxis, osg::Vec3& heightAxis, @@ -45,7 +41,6 @@ osg::Node* createInteractiveQuad(const osg::Vec3& origin, osg::Vec3& widthAxis, return geode; } - int main( int argc, char* argv[] ) { osg::ArgumentParser arguments(&argc, argv); @@ -61,7 +56,7 @@ int main( int argc, char* argv[] ) { if (!arguments.isOption(i)) { - std::string url_browser = std::string(arguments[i])+std::string(".browser"); + std::string url_browser = std::string(arguments[i])+std::string(".gecko"); osg::ref_ptr image = osgDB::readImageFile(url_browser); if (image.valid()) images.push_back(image.get()); } diff --git a/include/osgWidget/Browser b/include/osgWidget/Browser index 899355488..551f3bfb3 100644 --- a/include/osgWidget/Browser +++ b/include/osgWidget/Browser @@ -30,9 +30,12 @@ class BrowserManager : public osg::Object virtual void init(const std::string& application); + void setApplication(const std::string& application) { _application = application; } + const std::string& getApplication() const { return _application; } + virtual BrowserImage* createBrowserImage(const std::string& url); virtual BrowserImage* createBrowserImage(const std::string& url, int width, int height); - + protected: BrowserManager(); diff --git a/src/osgWidget/Browser.cpp b/src/osgWidget/Browser.cpp index 03eab5eb2..88b66c15a 100644 --- a/src/osgWidget/Browser.cpp +++ b/src/osgWidget/Browser.cpp @@ -20,7 +20,7 @@ using namespace osgWidget; osg::ref_ptr& BrowserManager::instance() { - static osg::ref_ptr s_BrowserManager; + static osg::ref_ptr s_BrowserManager = new BrowserManager; return s_BrowserManager; }