diff --git a/examples/osgbrowser/CMakeLists.txt b/examples/osgbrowser/CMakeLists.txt index 3b262bf6e..8917b37ec 100644 --- a/examples/osgbrowser/CMakeLists.txt +++ b/examples/osgbrowser/CMakeLists.txt @@ -2,6 +2,7 @@ SET(TARGET_SRC llembeddedbrowser.cpp llembeddedbrowserwindow.cpp llmozlib2.cpp + nsProfileDirServiceProvider.cpp osgbrowser.cpp ) @@ -9,6 +10,9 @@ SET(TARGET_H llembeddedbrowser.h llembeddedbrowserwindow.h llmozlib2.h + nsProfileDirServiceProvider.h + nsProfileLock.h + nsProfileStringTypes.h ) ADD_DEFINITIONS(-DMOZILLA_INTERNAL_API) @@ -35,6 +39,12 @@ INCLUDE_DIRECTORIES( ${GLUT_INCLUDE_DIR} /usr/include/xulrunner/profdirserviceprovider /usr/include/xulrunner/nkcache /usr/include/xulrunner/xulapp + /usr/include/xulrunner/profile + /usr/include/xulrunner/appshell + /usr/include/xulrunner/xpcom_obsolete + /usr/include/xulrunner/intl + /usr/include/xulrunner/windowwatcher + /usr/include/xulrunner/xpconnect ) LINK_DIRECTORIES( ${XUL_LIB_DIRS}) SET(TARGET_EXTERNAL_LIBRARIES ${XUL_LIBRARIES} ${GLUT_glut_LIBRARY}) diff --git a/examples/osgbrowser/llembeddedbrowser.cpp b/examples/osgbrowser/llembeddedbrowser.cpp index e0da8b73d..2816984ea 100644 --- a/examples/osgbrowser/llembeddedbrowser.cpp +++ b/examples/osgbrowser/llembeddedbrowser.cpp @@ -136,10 +136,6 @@ bool LLEmbeddedBrowser::init( std::string applicationDir, { mNativeWindowHandle = nativeWindowHandleIn; - std::cout<<"applicationDir "< profileDirNative; result = NS_NewLocalFile( profileDirUTF16 , PR_TRUE, getter_AddRefs( profileDirNative ) ); if ( NS_FAILED( result ) ) @@ -182,7 +170,6 @@ bool LLEmbeddedBrowser::init( std::string applicationDir, setLastError( 0x1007 ); return false; }; -#if 0 nsCOMPtr< nsProfileDirServiceProvider > locProvider; NS_NewProfileDirServiceProvider( PR_TRUE, getter_AddRefs( locProvider ) ); if ( ! locProvider ) @@ -191,6 +178,7 @@ bool LLEmbeddedBrowser::init( std::string applicationDir, XRE_TermEmbedding(); return PR_FALSE; }; + result = locProvider->Register(); if ( NS_FAILED( result ) ) { @@ -206,7 +194,6 @@ bool LLEmbeddedBrowser::init( std::string applicationDir, XRE_TermEmbedding(); return PR_FALSE; }; -#endif nsCOMPtr pref = do_CreateInstance( NS_PREF_CONTRACTID ); if ( pref ) @@ -242,8 +229,6 @@ bool LLEmbeddedBrowser::init( std::string applicationDir, clearLastError(); - std::cout<<"LLEmbeddedBrowser::init() succeeded"<createBrowser( mNativeWindowHandle, browserWidthIn, browserHeightIn, getter_AddRefs( newBrowser ) ); if ( ! newBrowser ) { - std::cout<<"createBrowserWindow !newBrowser"<Stop ( nsIWebNavigation::STOP_ALL ); - mWebNav = nsnull; - }; + if ( mWebNav ) + { + mWebNav->Stop ( nsIWebNavigation::STOP_ALL ); + mWebNav = nsnull; + }; - if ( mBaseWindow ) - { - mBaseWindow->Destroy(); - mBaseWindow = nsnull; - }; + if ( mBaseWindow ) + { + mBaseWindow->Destroy(); + mBaseWindow = nsnull; + }; - if ( mPageBuffer ) - { - delete[] mPageBuffer; - mPageBuffer = 0; - }; + if ( mPageBuffer ) + { + delete[] mPageBuffer; + mPageBuffer = 0; + }; } //////////////////////////////////////////////////////////////////////////////// // nsresult LLEmbeddedBrowserWindow::createBrowser( void* nativeWindowHandleIn, PRInt32 widthIn, PRInt32 heightIn, nsIWebBrowser **aBrowser ) { - NS_ENSURE_ARG_POINTER(aBrowser); - *aBrowser = nsnull; + NS_ENSURE_ARG_POINTER(aBrowser); + *aBrowser = nsnull; - nsresult rv; - mWebBrowser = do_CreateInstance( NS_WEBBROWSER_CONTRACTID, &rv ); - if ( ! mWebBrowser ) - { - std::cout<<"createBrowser ! mWebBrowser at start"<SetContainerWindow( NS_STATIC_CAST( nsIWebBrowserChrome*, this ) ); @@ -177,32 +175,29 @@ nsresult LLEmbeddedBrowserWindow::createBrowser( void* nativeWindowHandleIn, PRI 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 ); + // Without this, the mac doesn't get upates for animating gifs, mouseovers, etc. + mBaseWindow->SetVisibility( PR_TRUE ); #else - mBaseWindow->SetVisibility( PR_FALSE ); + mBaseWindow->SetVisibility( PR_FALSE ); #endif - nsresult result; - mWebNav = do_QueryInterface( mWebBrowser, &result ); - if ( NS_FAILED( result ) || ! mWebNav ) - { - std::cout<<"createBrowser ! do_QueryInterface"<GetContentDOMWindow( ( nsIDOMWindow** )aInstancePtr ); - }; + if ( aIID.Equals( NS_GET_IID( nsIDOMWindow ) ) ) + { + if ( mWebBrowser ) + { + return mWebBrowser->GetContentDOMWindow( ( nsIDOMWindow** )aInstancePtr ); + }; - return NS_ERROR_NOT_INITIALIZED; - }; + return NS_ERROR_NOT_INITIALIZED; + }; - return QueryInterface( aIID, aInstancePtr ); + 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() ); + mStatusText = std::string( NS_ConvertUTF16toUTF8( aStatus ).get() ); - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onStatusTextChange, event ); + LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText ); + mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onStatusTextChange, event ); - return NS_OK; + return NS_OK; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::GetWebBrowser( nsIWebBrowser** aWebBrowser ) { - NS_ENSURE_ARG_POINTER( aWebBrowser ); + NS_ENSURE_ARG_POINTER( aWebBrowser ); - *aWebBrowser = mWebBrowser; + *aWebBrowser = mWebBrowser; - NS_IF_ADDREF( *aWebBrowser ); + NS_IF_ADDREF( *aWebBrowser ); - return NS_OK; + return NS_OK; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::SetWebBrowser( nsIWebBrowser* aWebBrowser ) { - NS_ENSURE_ARG_POINTER( aWebBrowser ); + NS_ENSURE_ARG_POINTER( aWebBrowser ); - mWebBrowser = aWebBrowser; + mWebBrowser = aWebBrowser; - return NS_OK; + return NS_OK; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::GetChromeFlags( PRUint32* aChromeMask ) { - return NS_ERROR_NOT_IMPLEMENTED; + return NS_ERROR_NOT_IMPLEMENTED; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::SetChromeFlags( PRUint32 aChromeMask ) { - return NS_ERROR_NOT_IMPLEMENTED; + return NS_ERROR_NOT_IMPLEMENTED; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::DestroyBrowserWindow() { - return NS_OK; + return NS_OK; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::SizeBrowserTo( PRInt32 aCX, PRInt32 aCY ) { - return NS_OK; + return NS_OK; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::ShowAsModal() { - return NS_ERROR_NOT_IMPLEMENTED; + return NS_ERROR_NOT_IMPLEMENTED; } //////////////////////////////////////////////////////////////////////////////// @@ -320,127 +315,127 @@ NS_IMETHODIMP LLEmbeddedBrowserWindow::ShowAsModal() // NS_IMETHODIMP LLEmbeddedBrowserWindow::IsWindowModal( PRBool* retval ) { - *retval = PR_FALSE; + *retval = PR_FALSE; - return NS_OK; + return NS_OK; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::ExitModalEventLoop( nsresult aStatus ) { - return NS_OK; + 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 ) + PRInt32 curSelfProgress, PRInt32 maxSelfProgress, + PRInt32 curTotalProgress, PRInt32 maxTotalProgress ) { - mPercentComplete = static_cast< PRInt16 > - ( static_cast< float >( curTotalProgress * 100.0f ) / static_cast< float >( maxTotalProgress ) ); + mPercentComplete = static_cast< PRInt16 > + ( static_cast< float >( curTotalProgress * 100.0f ) / static_cast< float >( maxTotalProgress ) ); - if ( mPercentComplete < 0 ) - mPercentComplete = 0; + if ( mPercentComplete < 0 ) + mPercentComplete = 0; - if ( mPercentComplete > 100 ) - mPercentComplete = 100; + if ( mPercentComplete > 100 ) + mPercentComplete = 100; - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mPercentComplete ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onUpdateProgress, event ); + LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mPercentComplete ); + mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onUpdateProgress, event ); - return NS_OK; + 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 ) + 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 ); + 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 ); - }; + // 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 ) ); - }; + // 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 ); + // 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 ); - }; + // 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 ); - }; + 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 ); - }; - }; + // 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 ); + // 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 ); - }; + // 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_REDIRECTING ) + { + mStatusText = std::string( "Redirecting..." ); + }; - if ( progressStateFlags & STATE_TRANSFERRING ) - { - mStatusText = std::string( "Transferring..." ); - }; + if ( progressStateFlags & STATE_TRANSFERRING ) + { + mStatusText = std::string( "Transferring..." ); + }; - if ( progressStateFlags & STATE_NEGOTIATING ) - { - mStatusText = std::string( "Negotiating..." ); - }; + if ( progressStateFlags & STATE_NEGOTIATING ) + { + mStatusText = std::string( "Negotiating..." ); + }; - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onStatusTextChange, event ); + LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText ); + mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onStatusTextChange, event ); - return NS_OK; + return NS_OK; } //////////////////////////////////////////////////////////////////////////////// @@ -448,140 +443,140 @@ NS_IMETHODIMP LLEmbeddedBrowserWindow::OnStateChange( nsIWebProgress* progress, // 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 ) + 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 ( 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 ); - }; - }; - }; - }; - }; + 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 ); + nsCAutoString newURI; + location->GetSpec( newURI ); - mCurrentUri = newURI.get(); + mCurrentUri = newURI.get(); - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri() ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onLocationChange, event ); + LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri() ); + mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onLocationChange, event ); - return NS_OK; + 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; + 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; + mCaretRed = redIn; + mCaretGreen = greenIn; + mCaretBlue = blueIn; } //////////////////////////////////////////////////////////////////////////////// // void LLEmbeddedBrowserWindow::setEnabled( PRBool enabledIn ) { - mEnabled = 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 ); + 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 ); + return mEventEmitter.remObserver( observerIn ); } //////////////////////////////////////////////////////////////////////////////// // used by observers of this class to get the current URI const std::string& LLEmbeddedBrowserWindow::getCurrentUri() { - return mCurrentUri; + return mCurrentUri; } //////////////////////////////////////////////////////////////////////////////// // utility method that is used by observers to retrieve data after an event const PRInt16 LLEmbeddedBrowserWindow::getPercentComplete() { - return mPercentComplete; + return mPercentComplete; } //////////////////////////////////////////////////////////////////////////////// // utility method that is used by observers to retrieve data after an event const std::string& LLEmbeddedBrowserWindow::getStatusMsg() { - return mStatusText; + return mStatusText; } //////////////////////////////////////////////////////////////////////////////// // utility method that is used by observers to retrieve data after an event const std::string& LLEmbeddedBrowserWindow::getClickLinkHref() { - return mClickHref; + return mClickHref; } //////////////////////////////////////////////////////////////////////////////// // utility method that is used by observers to retrieve data after an event const std::string& LLEmbeddedBrowserWindow::getClickLinkTarget() { - return mClickTarget; + 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 ) + nsIRequest* aRequest, + nsresult aStatus, + const PRUnichar* aMessage ) { - mStatusText = std::string( NS_ConvertUTF16toUTF8( aMessage ).get() ); + mStatusText = std::string( NS_ConvertUTF16toUTF8( aMessage ).get() ); - LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText ); - mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onStatusTextChange, event ); + LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mStatusText ); + mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onStatusTextChange, event ); - return NS_OK; + 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 ) + nsIRequest* aRequest, + PRUint32 state ) { - return NS_OK; + return NS_OK; } //////////////////////////////////////////////////////////////////////////////// @@ -590,414 +585,395 @@ NS_IMETHODIMP LLEmbeddedBrowserWindow::OnSecurityChange( nsIWebProgress* aWebPro // 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 ) { - std::cout<<"grabWindow("< docShell = do_GetInterface( mWebBrowser ); + if ( ! docShell ) + return PR_FALSE; - // only grab the window if it's enabled - if ( ! mEnabled ) - return false; - std::cout<<"grabWindow() B"< presContext; + nsresult result = docShell->GetPresContext( getter_AddRefs( presContext ) ); + if ( NS_FAILED( result ) || ( ! presContext ) ) + return PR_FALSE; - // get the docshell - nsCOMPtr< nsIDocShell > docShell = do_GetInterface( mWebBrowser ); - if ( ! docShell ) - return PR_FALSE; + // get view manager + nsIViewManager* viewManager = presContext->GetViewManager(); + if ( ! viewManager ) + return PR_FALSE; - std::cout<<"grabWindow() C"<GetRootScrollableView( &scrollableView ); + nsIView* view = NULL; + if ( scrollableView ) + scrollableView->GetScrolledView( view ); + else + viewManager->GetRootView( view ); - // get pres context - nsCOMPtr< nsPresContext > presContext; - nsresult result = docShell->GetPresContext( getter_AddRefs( presContext ) ); - if ( NS_FAILED( result ) || ( ! presContext ) ) - return PR_FALSE; + // 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; - std::cout<<"grabWindow() D"<PixelsToTwips(); + rect.width = NSIntPixelsToTwips( widthIn, p2t ); + rect.height = NSIntPixelsToTwips( heightIn, p2t ); - // get view manager - nsIViewManager* viewManager = presContext->GetViewManager(); - if ( ! viewManager ) - return PR_FALSE; + // 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; - // get the view - nsIScrollableView* scrollableView = NULL; - viewManager->GetRootScrollableView( &scrollableView ); - nsIView* view = NULL; - if ( scrollableView ) - scrollableView->GetScrolledView( view ); - else - viewManager->GetRootView( view ); + // retrieve the surface we rendered to + nsIDrawingSurface* surface = nsnull; + context->GetDrawingSurface( &surface ); + if ( ! surface ) + return 0; - // 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; + // 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; - std::cout<<"grabWindow() E"<PixelsToTwips(); - rect.width = NSIntPixelsToTwips( widthIn, p2t ); - rect.height = NSIntPixelsToTwips( heightIn, p2t ); + // create memory buffer here so it can be deleted and recreated elsewhere + if ( ! mPageBuffer ) + mPageBuffer = new unsigned char[ mBrowserRowSpan * mBrowserHeight ]; - // 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; + // 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 ); + }; - std::cout<<"grabWindow() F"<Unlock(); + context->DestroyDrawingSurface( surface ); - // retrieve the surface we rendered to - nsIDrawingSurface* surface = nsnull; - context->GetDrawingSurface( &surface ); - if ( ! surface ) - return 0; + renderCaret(); - std::cout<<"grabWindow() G"<Lock( xIn, yIn, widthIn, heightIn, reinterpret_cast< void** >( &data ), &mBrowserRowSpan, &rowLen, NS_LOCK_SURFACE_READ_ONLY ); - if ( NS_FAILED ( result ) ) - return 0; - - std::cout<<"grabWindow() H "<< mBrowserRowSpan * mBrowserHeight< -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; + 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< 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< nsIDOMElement > focusedElement; + focus->GetFocusedElement( getter_AddRefs( focusedElement ) ); + if ( ! focusedElement ) + return NS_ERROR_FAILURE; - nsCOMPtr focusedContent = do_QueryInterface( focusedElement ); - if ( ! focusedContent ) - 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; + 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; + 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; + 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 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; + 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; + 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(); + float twips2Pixls = presShell->GetPresContext()->TwipsToPixels(); - PRInt32 caretX = NSTwipsToIntPixels( coords.x, twips2Pixls ); - PRInt32 caretY = NSTwipsToIntPixels( coords.y, twips2Pixls ); - PRInt32 caretHeight = NSTwipsToIntPixels( coords.height, twips2Pixls ); + 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 ); + 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; - }; - }; - }; - }; + // 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 NS_OK; } //////////////////////////////////////////////////////////////////////////////// // return the buffer that contains the rendered page unsigned char* LLEmbeddedBrowserWindow::getPageBuffer() { - return mPageBuffer; + return mPageBuffer; } //////////////////////////////////////////////////////////////////////////////// // PRInt16 LLEmbeddedBrowserWindow::getBrowserWidth() { - return mBrowserWidth; + return mBrowserWidth; } //////////////////////////////////////////////////////////////////////////////// // PRInt16 LLEmbeddedBrowserWindow::getBrowserHeight() { - return mBrowserHeight; + return mBrowserHeight; } //////////////////////////////////////////////////////////////////////////////// // PRInt16 LLEmbeddedBrowserWindow::getBrowserDepth() { - return mBrowserDepth; + return mBrowserDepth; } //////////////////////////////////////////////////////////////////////////////// // PRInt32 LLEmbeddedBrowserWindow::getBrowserRowSpan() { - return mBrowserRowSpan; + 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 ); + 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_TRUE; + }; - return PR_FALSE; + return PR_FALSE; }; //////////////////////////////////////////////////////////////////////////////// // PRBool LLEmbeddedBrowserWindow::canNavigateBack() { - if ( ! mWebNav ) - { - return PR_FALSE; - }; + if ( ! mWebNav ) + { + return PR_FALSE; + }; - PRBool canGoBack = PR_FALSE; + PRBool canGoBack = PR_FALSE; - nsresult result = mWebNav->GetCanGoBack( &canGoBack ); - if ( NS_FAILED( result ) ) - { - return PR_FALSE; - }; + nsresult result = mWebNav->GetCanGoBack( &canGoBack ); + if ( NS_FAILED( result ) ) + { + return PR_FALSE; + }; - return canGoBack; + return canGoBack; }; //////////////////////////////////////////////////////////////////////////////// // void LLEmbeddedBrowserWindow::navigateStop() { - if ( mWebNav ) - mWebNav->Stop( nsIWebNavigation::STOP_ALL ); + if ( mWebNav ) + mWebNav->Stop( nsIWebNavigation::STOP_ALL ); }; //////////////////////////////////////////////////////////////////////////////// // void LLEmbeddedBrowserWindow::navigateBack() { - if ( mWebNav ) - mWebNav->GoBack(); + if ( mWebNav ) + mWebNav->GoBack(); }; //////////////////////////////////////////////////////////////////////////////// // PRBool LLEmbeddedBrowserWindow::canNavigateForward() { - if ( ! mWebNav ) - return PR_FALSE; + if ( ! mWebNav ) + return PR_FALSE; - PRBool canGoForward = PR_FALSE; + PRBool canGoForward = PR_FALSE; - nsresult result = mWebNav->GetCanGoForward( &canGoForward ); - if ( NS_FAILED( result ) ) - { - return PR_FALSE; - }; + nsresult result = mWebNav->GetCanGoForward( &canGoForward ); + if ( NS_FAILED( result ) ) + { + return PR_FALSE; + }; - return canGoForward; + return canGoForward; }; //////////////////////////////////////////////////////////////////////////////// // void LLEmbeddedBrowserWindow::navigateForward() { - if ( mWebNav ) - mWebNav->GoForward(); + if ( mWebNav ) + mWebNav->GoForward(); }; //////////////////////////////////////////////////////////////////////////////// // void LLEmbeddedBrowserWindow::navigateReload() { - // maybe need a cache version of this too? - if ( mWebNav ) - mWebNav->Reload( nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE ); + // 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; - }; + 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; + // 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 ); + // 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 + // 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 ); + // tell Mozilla about the new size + mBaseWindow->SetSize( widthIn, heightIn, PR_FALSE ); - return PR_TRUE; - }; + return PR_TRUE; + }; - return PR_FALSE; + return PR_FALSE; } //////////////////////////////////////////////////////////////////////////////// // PRBool LLEmbeddedBrowserWindow::flipWindow( PRBool flip ) { - mFlipBitmap = flip; + mFlipBitmap = flip; - return true; + 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 ); + // 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 ); + 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 ); + 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 ); + 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 ( mWebBrowser ) + { + nsCOMPtr< nsIDOMWindow > window; + nsresult result = mWebBrowser->GetContentDOMWindow( getter_AddRefs( window ) ); - if ( ! NS_FAILED( result ) && window ) - { - result = window->ScrollByLines( linesIn ); - }; - }; + if ( ! NS_FAILED( result ) && window ) + { + result = window->ScrollByLines( linesIn ); + }; + }; } //////////////////////////////////////////////////////////////////////////////// @@ -1007,54 +983,54 @@ void LLEmbeddedBrowserWindow::scrollByLines( PRInt16 linesIn ) // 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 ( ! mEnabled ) + return PR_FALSE; - if ( ! mWebBrowser ) - return PR_FALSE; + if ( ! mWebBrowser ) + return PR_FALSE; - nsCOMPtr< nsIDocShell > docShell = do_GetInterface( mWebBrowser ); - if ( ! docShell ) - 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; + 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; + nsIViewManager* viewManager = presContext->GetViewManager(); + if ( ! viewManager ) + return PR_FALSE; - nsIView* rootView; - result = viewManager->GetRootView( rootView ); - if ( NS_FAILED( result ) || ( ! rootView ) ) - 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; + 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; + 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; + nsEventStatus status; + result = viewManager->DispatchEvent( &mouseEvent, &status ); + if ( NS_FAILED( result ) ) + return PR_FALSE; - return PR_TRUE; + return PR_TRUE; }; //////////////////////////////////////////////////////////////////////////////// @@ -1063,290 +1039,291 @@ PRBool LLEmbeddedBrowserWindow::sendMozillaMouseEvent( PRInt16 eventIn, PRInt16 // accept a (mozilla-style) keycode void LLEmbeddedBrowserWindow::keyPress( PRInt16 keyCode ) { - sendMozillaKeyboardEvent( 0, 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 ); + 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 ( ! mEnabled ) + return PR_FALSE; - if ( ! mWebBrowser ) - return PR_FALSE; + if ( ! mWebBrowser ) + return PR_FALSE; - nsCOMPtr< nsIDocShell > docShell = do_GetInterface( mWebBrowser ); - if ( ! docShell ) - 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; + nsCOMPtr< nsPresContext > presContext; + docShell->GetPresContext( getter_AddRefs( presContext ) ); + if ( ! presContext ) + return PR_FALSE; - nsIViewManager* viewManager = presContext->GetViewManager(); - if ( ! viewManager ) - return PR_FALSE; + nsIViewManager* viewManager = presContext->GetViewManager(); + if ( ! viewManager ) + return PR_FALSE; - nsIView* rootView; - viewManager->GetRootView( rootView ); - if ( ! rootView ) - return PR_FALSE; + nsIView* rootView; + viewManager->GetRootView( rootView ); + if ( ! rootView ) + return PR_FALSE; - nsCOMPtr< nsIWidget > widget = rootView->GetWidget(); - if ( ! widget ) - 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; + 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; + + std::cout<<"Sending key envent "<DispatchEvent( &keyEvent, &status ); - if ( NS_FAILED( result ) ) - return PR_FALSE; + nsEventStatus status; + nsresult result = viewManager->DispatchEvent( &keyEvent, &status ); + if ( NS_FAILED( result ) ) + return PR_FALSE; - return PR_TRUE; + return PR_TRUE; } //////////////////////////////////////////////////////////////////////////////// // override nsIWebBrowserChrome::HandleEvent () NS_IMETHODIMP LLEmbeddedBrowserWindow::HandleEvent( nsIDOMEvent* anEvent ) { - nsCOMPtr< nsIDOMEventTarget > eventTarget; - anEvent->GetTarget( getter_AddRefs( eventTarget ) ); + 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() ); + 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() ); + // 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 ); - }; - }; + // if the href link contains something + if ( mClickHref.length() ) + { + LLEmbeddedBrowserWindowEvent event( getWindowId(), getCurrentUri(), mClickHref, mClickTarget ); + mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onClickLinkHref, event ); + }; + }; - return NS_OK; + return NS_OK; }; //////////////////////////////////////////////////////////////////////////////// // override nsIURIContentListener methods NS_IMETHODIMP LLEmbeddedBrowserWindow::OnStartURIOpen( nsIURI *aURI, PRBool *_retval ) { - nsCAutoString newURI; - aURI->GetSpec( newURI ); - std::string rawUri = newURI.get(); + 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 ); + // 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; - }; + // 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; + return NS_OK; } //////////////////////////////////////////////////////////////////////////////// // void LLEmbeddedBrowserWindow::setNoFollowScheme( std::string schemeIn ) { - mNoFollowScheme = schemeIn; + mNoFollowScheme = schemeIn; } //////////////////////////////////////////////////////////////////////////////// // std::string LLEmbeddedBrowserWindow::getNoFollowScheme() { - return mNoFollowScheme; + return mNoFollowScheme; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::DoContent( const char *aContentType, - PRBool aIsContentPreferred, - nsIRequest *aRequest, - nsIStreamListener **aContentHandler, - PRBool *_retval ) + PRBool aIsContentPreferred, + nsIRequest *aRequest, + nsIStreamListener **aContentHandler, + PRBool *_retval ) { - return NS_ERROR_NOT_IMPLEMENTED; + return NS_ERROR_NOT_IMPLEMENTED; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::IsPreferred( const char *aContentType, - char **aDesiredContentType, - PRBool *_retval ) + 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; + // 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 ) + PRBool aIsContentPreferred, + char **aDesiredContentType, + PRBool *_retval ) { - return NS_ERROR_NOT_IMPLEMENTED; + return NS_ERROR_NOT_IMPLEMENTED; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::GetLoadCookie( nsISupports * *aLoadCookie ) { - return NS_ERROR_NOT_IMPLEMENTED; + return NS_ERROR_NOT_IMPLEMENTED; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::SetLoadCookie( nsISupports * aLoadCookie ) { - return NS_ERROR_NOT_IMPLEMENTED; + return NS_ERROR_NOT_IMPLEMENTED; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::GetParentContentListener( nsIURIContentListener** aParentContentListener ) { - return NS_ERROR_NOT_IMPLEMENTED; + return NS_ERROR_NOT_IMPLEMENTED; } //////////////////////////////////////////////////////////////////////////////// // NS_IMETHODIMP LLEmbeddedBrowserWindow::SetParentContentListener( nsIURIContentListener* aParentContentListener ) { - return NS_ERROR_NOT_IMPLEMENTED; + 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(); - }; - }; + 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; + mWindowId = windowIdIn; } //////////////////////////////////////////////////////////////////////////////// // int LLEmbeddedBrowserWindow::getWindowId() { - //printf("## Getting id for %p and it is %d\n", this, mWindowId ); + //printf("## Getting id for %p and it is %d\n", this, mWindowId ); - return 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: 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; + // 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; + 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; + nsIViewManager* viewManager = presContext->GetViewManager(); + if ( ! viewManager ) + return false; - nsIView* rootView; - result = viewManager->GetRootView( rootView ); - if ( NS_FAILED( result ) || ( ! rootView ) ) - 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< nsIWidget > widget = rootView->GetWidget(); + if ( ! widget ) + return false; - nsCOMPtr< nsIToolkit > mToolkit = widget->GetToolkit(); - if ( ! mToolkit ) - return false; + nsCOMPtr< nsIToolkit > mToolkit = widget->GetToolkit(); + if ( ! mToolkit ) + return false; #ifdef NS_DECL_NSITOOLKITOBSERVER - if ( enableIn ) - mToolkit->AddObserver( this ); - else - mToolkit->RemoveObserver( this ); + if ( enableIn ) + mToolkit->AddObserver( this ); + else + mToolkit->RemoveObserver( this ); #endif - return true; + return true; } -#ifdef NS_DECL_NSITOOLKITOBSERVER //////////////////////////////////////////////////////////////////////////////// // something on the page changed - e.g. a new page loaded, scrolling, user // input or as the result of some kind of animation. @@ -1355,90 +1332,89 @@ PRBool LLEmbeddedBrowserWindow::enableToolkitObserver( PRBool enableIn ) // 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); +// 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 + // 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 ); + // 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 ); - }; + 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 ); - }; + 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 + // 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; + return NS_OK; } -#endif //////////////////////////////////////////////////////////////////////////////// // std::string LLEmbeddedBrowserWindow::evaluateJavascript( std::string scriptIn ) { - nsCOMPtr< nsIScriptGlobalObjectOwner > theGlobalObjectOwner( do_GetInterface( mWebBrowser ) ); + nsCOMPtr< nsIScriptGlobalObjectOwner > theGlobalObjectOwner( do_GetInterface( mWebBrowser ) ); - if ( theGlobalObjectOwner ) - { - nsIScriptGlobalObject* theGlobalObject; - theGlobalObject = theGlobalObjectOwner->GetScriptGlobalObject(); + if ( theGlobalObjectOwner ) + { + nsIScriptGlobalObject* theGlobalObject; + theGlobalObject = theGlobalObjectOwner->GetScriptGlobalObject(); - nsIScriptContext* theScriptContext = theGlobalObject->GetContext(); + nsIScriptContext* theScriptContext = theGlobalObject->GetContext(); - PRBool IsUndefined; - nsString output; - nsresult result = theScriptContext->EvaluateString(NS_ConvertUTF8toUTF16(scriptIn.c_str()), - nsnull, nsnull, "", 1, nsnull, &output, &IsUndefined); + PRBool IsUndefined; + nsString output; + nsresult result = theScriptContext->EvaluateString(NS_ConvertUTF8toUTF16(scriptIn.c_str()), + nsnull, nsnull, "", 1, nsnull, &output, &IsUndefined); - if( NS_FAILED( result ) ) - return ""; + if( NS_FAILED( result ) ) + return ""; - return std::string( NS_ConvertUTF16toUTF8( output ).get() ); - } + return std::string( NS_ConvertUTF16toUTF8( output ).get() ); + } - return ""; + return ""; } //////////////////////////////////////////////////////////////////////////////// // bool LLEmbeddedBrowserWindow::set404RedirectUrl( std::string redirect_url ) { - m404RedirectUrl = redirect_url; + m404RedirectUrl = redirect_url; - return true; + return true; } //////////////////////////////////////////////////////////////////////////////// // bool LLEmbeddedBrowserWindow::clr404RedirectUrl() { - m404RedirectUrl = std::string( "" ); + m404RedirectUrl = std::string( "" ); - return true; + 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 + #ifdef WIN32 + #undef DEBUG + #endif #endif diff --git a/examples/osgbrowser/llembeddedbrowserwindow.h b/examples/osgbrowser/llembeddedbrowserwindow.h index 90662e264..69d1362be 100644 --- a/examples/osgbrowser/llembeddedbrowserwindow.h +++ b/examples/osgbrowser/llembeddedbrowserwindow.h @@ -75,57 +75,57 @@ template< class T > class LLEmbeddedBrowserWindowEmitter { - public: - LLEmbeddedBrowserWindowEmitter() { }; - ~LLEmbeddedBrowserWindowEmitter() { }; + public: + LLEmbeddedBrowserWindowEmitter() { }; + ~LLEmbeddedBrowserWindowEmitter() { }; - typedef typename T::EventType EventType; - typedef std::list< T* > ObserverContainer; - typedef void( T::*observerMethod )( const EventType& ); + typedef typename T::EventType EventType; + typedef std::list< T* > ObserverContainer; + typedef void( T::*observerMethod )( const EventType& ); - /////////////////////////////////////////////////////////////////////////////// - // - bool addObserver( T* observerIn ) - { - if ( ! observerIn ) - return false; + /////////////////////////////////////////////////////////////////////////////// + // + bool addObserver( T* observerIn ) + { + if ( ! observerIn ) + return false; - if ( std::find( observers.begin(), observers.end(), observerIn ) != observers.end() ) - return false; + if ( std::find( observers.begin(), observers.end(), observerIn ) != observers.end() ) + return false; - observers.push_back( observerIn ); + observers.push_back( observerIn ); - return true; - }; + return true; + }; - /////////////////////////////////////////////////////////////////////////////// - // - bool remObserver( T* observerIn ) - { - if ( ! observerIn ) - return false; + /////////////////////////////////////////////////////////////////////////////// + // + bool remObserver( T* observerIn ) + { + if ( ! observerIn ) + return false; - observers.remove( observerIn ); + observers.remove( observerIn ); - return true; - }; + return true; + }; - /////////////////////////////////////////////////////////////////////////////// - // - void update( observerMethod method, const EventType& msgIn ) - { - typename std::list< T* >::iterator iter = observers.begin(); + /////////////////////////////////////////////////////////////////////////////// + // + void update( observerMethod method, const EventType& msgIn ) + { + typename std::list< T* >::iterator iter = observers.begin(); - while( iter != observers.end() ) - { - ( ( *iter )->*method )( msgIn ); + while( iter != observers.end() ) + { + ( ( *iter )->*method )( msgIn ); - ++iter; - }; - }; + ++iter; + }; + }; - protected: - ObserverContainer observers; + protected: + ObserverContainer observers; }; class LLEmbeddedBrowser; @@ -133,131 +133,132 @@ 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, + public nsIInterfaceRequestor, + public nsIWebBrowserChrome, + public nsIWebProgressListener, + public nsIURIContentListener, #ifdef SUPPORTS_WEAK_REFENCE - public nsSupportsWeakReference, + public nsSupportsWeakReference, #endif - public nsIDOMEventListener #ifdef NS_DECL_NSITOOLKITOBSERVER - ,public nsIToolkitObserver + public nsIToolkitObserver, #endif + public nsIDOMEventListener { - public: - LLEmbeddedBrowserWindow(); - virtual ~LLEmbeddedBrowserWindow(); + public: + LLEmbeddedBrowserWindow(); + virtual ~LLEmbeddedBrowserWindow(); - NS_DECL_ISUPPORTS - NS_DECL_NSIINTERFACEREQUESTOR - NS_DECL_NSIWEBBROWSERCHROME - NS_DECL_NSIWEBPROGRESSLISTENER - NS_DECL_NSIURICONTENTLISTENER - NS_DECL_NSIDOMEVENTLISTENER + 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 + 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(); - // 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(); + // 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(); + // 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 ); + // 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 ); + // 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 ); + // 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(); + // 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 ); + // javascript access/control + std::string evaluateJavascript( std::string scriptIn ); - // redirection when you hit a missing page - bool set404RedirectUrl( std::string redirect_url ); - bool clr404RedirectUrl(); + // 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 ); + // 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 ); + // 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(); + // 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 ); + 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; + 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; + 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 index 2358751a7..f7274fc15 100644 --- a/examples/osgbrowser/llmozlib2.cpp +++ b/examples/osgbrowser/llmozlib2.cpp @@ -51,7 +51,7 @@ LLMozLib* LLMozLib::sInstance = 0; //////////////////////////////////////////////////////////////////////////////// // LLMozLib::LLMozLib() : - mMaxBrowserWindows( 16 ) + mMaxBrowserWindows( 16 ) { } @@ -59,12 +59,12 @@ LLMozLib::LLMozLib() : // LLMozLib* LLMozLib::getInstance() { - if ( ! sInstance ) - { - sInstance = new LLMozLib; - }; + if ( ! sInstance ) + { + sInstance = new LLMozLib; + }; - return sInstance; + return sInstance; } //////////////////////////////////////////////////////////////////////////////// @@ -77,7 +77,7 @@ LLMozLib::~LLMozLib() // bool LLMozLib::init( std::string applicationDir, std::string componentDir, std::string profileDir, void* nativeWindowHandleIn ) { - return LLEmbeddedBrowser::getInstance()->init( applicationDir, + return LLEmbeddedBrowser::getInstance()->init( applicationDir, componentDir, profileDir, nativeWindowHandleIn ); @@ -87,603 +87,600 @@ bool LLMozLib::init( std::string applicationDir, std::string componentDir, std:: // int LLMozLib::getLastError() { - return LLEmbeddedBrowser::getInstance()->getLastError(); + return LLEmbeddedBrowser::getInstance()->getLastError(); } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::reset() { - return LLEmbeddedBrowser::getInstance()->reset(); + return LLEmbeddedBrowser::getInstance()->reset(); } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::clearCache() { - return LLEmbeddedBrowser::getInstance()->clearCache(); + return LLEmbeddedBrowser::getInstance()->clearCache(); } //////////////////////////////////////////////////////////////////////////////// // const std::string LLMozLib::getVersion() { - const int majorVersion = 2; - const int minorVersion = 1; + 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 ) ); + // 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 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(); + return codec.str(); } //////////////////////////////////////////////////////////////////////////////// // void LLMozLib::setBrowserAgentId( std::string idIn ) { - LLEmbeddedBrowser::getInstance()->setBrowserAgentId( idIn ); + LLEmbeddedBrowser::getInstance()->setBrowserAgentId( idIn ); } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::enableProxy( bool proxyEnabledIn, std::string proxyHostNameIn, int proxyPortIn ) { - return LLEmbeddedBrowser::getInstance()->enableProxy( proxyEnabledIn, proxyHostNameIn, proxyPortIn ); + return LLEmbeddedBrowser::getInstance()->enableProxy( proxyEnabledIn, proxyHostNameIn, proxyPortIn ); } //////////////////////////////////////////////////////////////////////////////// // int LLMozLib::createBrowserWindow( int browserWindowWidthIn, int browserWindowHeightIn ) { - LLEmbeddedBrowserWindow* browserWindow = LLEmbeddedBrowser::getInstance()->createBrowserWindow( browserWindowWidthIn, 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 ) ); + 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 ); + // find first place the insert succeeds and use that index as the id + if ( result.second ) + { + browserWindow->setWindowId( id ); - return id; - }; - }; - }; + return id; + }; + }; + }; - return 0; + 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; + // 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 ); - }; + if ( browserWindow ) + { + LLEmbeddedBrowser::getInstance()->destroyBrowserWindow( browserWindow ); + }; - mBrowserWindowMap.erase( iter ); + mBrowserWindowMap.erase( iter ); - return true; + 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 ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->setBackgroundColor( redIn, greenIn, blueIn ); - return true; - }; + return true; + }; - return false; + 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 ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->setCaretColor( redIn, greenIn, blueIn ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::setEnabled( int browserWindowIdIn, bool enabledIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->setEnabled( enabledIn ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->setEnabled( enabledIn ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::setSize( int browserWindowIdIn, int widthIn, int heightIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->setSize( widthIn, heightIn ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->setSize( widthIn, heightIn ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::scrollByLines( int browserWindowIdIn, int linesIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->scrollByLines( linesIn ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->scrollByLines( linesIn ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::addObserver( int browserWindowIdIn, LLEmbeddedBrowserWindowObserver* subjectIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->addObserver( subjectIn ); - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->addObserver( subjectIn ); + }; - return true; + return true; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::remObserver( int browserWindowIdIn, LLEmbeddedBrowserWindowObserver* subjectIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->remObserver( subjectIn ); - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->remObserver( subjectIn ); + }; - return true; + return true; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::navigateTo( int browserWindowIdIn, const std::string uriIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->navigateTo( uriIn ) ? true : false; - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + return browserWindow->navigateTo( uriIn ) ? true : false; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::navigateStop( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->navigateStop(); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->navigateStop(); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::canNavigateBack( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->canNavigateBack() ? true : false; - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + return browserWindow->canNavigateBack() ? true : false; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::navigateBack( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->navigateBack(); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->navigateBack(); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::canNavigateForward( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->canNavigateForward() ? true : false; - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + return browserWindow->canNavigateForward() ? true : false; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::navigateForward( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->navigateForward(); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->navigateForward(); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::navigateReload( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->navigateReload(); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->navigateReload(); - return true; - }; + return true; + }; - return false; + return false; } /////////////////////////////////////////////////////////////////////////////// // const unsigned char* LLMozLib::grabBrowserWindow( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->grabWindow( 0, 0, getBrowserWidth( browserWindowIdIn ), getBrowserHeight( browserWindowIdIn ) ); - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + return browserWindow->grabWindow( 0, 0, getBrowserWidth( browserWindowIdIn ), getBrowserHeight( browserWindowIdIn ) ); + }; - return 0; + return 0; } //////////////////////////////////////////////////////////////////////////////// // const unsigned char* LLMozLib::getBrowserWindowPixels( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - std::cout<<"Returning browserWindow->getPageBuffer() "<getPageBuffer(); - }; - - std::cout<<"No browserWindow"<getPageBuffer(); + }; - return 0; + return 0; } //////////////////////////////////////////////////////////////////////////////// // const bool LLMozLib::flipWindow( int browserWindowIdIn, bool flipIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->flipWindow( flipIn ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->flipWindow( flipIn ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // const int LLMozLib::getBrowserWidth( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->getBrowserWidth(); - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + return browserWindow->getBrowserWidth(); + }; - return 0; + return 0; } //////////////////////////////////////////////////////////////////////////////// // const int LLMozLib::getBrowserHeight( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->getBrowserHeight(); - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + return browserWindow->getBrowserHeight(); + }; - return 0; + return 0; } //////////////////////////////////////////////////////////////////////////////// // const int LLMozLib::getBrowserDepth( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->getBrowserDepth(); - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + return browserWindow->getBrowserDepth(); + }; - return 0; + return 0; } //////////////////////////////////////////////////////////////////////////////// // const int LLMozLib::getBrowserRowSpan( int browserWindowIdIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - return browserWindow->getBrowserRowSpan(); - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + return browserWindow->getBrowserRowSpan(); + }; - return 0; + return 0; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::mouseDown( int browserWindowIdIn, int xPosIn, int yPosIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->mouseDown( xPosIn, yPosIn ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->mouseDown( xPosIn, yPosIn ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::mouseUp( int browserWindowIdIn, int xPosIn, int yPosIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->mouseUp( xPosIn, yPosIn ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->mouseUp( xPosIn, yPosIn ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::mouseMove( int browserWindowIdIn, int xPosIn, int yPosIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->mouseMove( xPosIn, yPosIn ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->mouseMove( xPosIn, yPosIn ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::mouseLeftDoubleClick( int browserWindowIdIn, int xPosIn, int yPosIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->mouseLeftDoubleClick( xPosIn, yPosIn ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->mouseLeftDoubleClick( xPosIn, yPosIn ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::keyPress( int browserWindowIdIn, int keyCodeIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->keyPress( keyCodeIn ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->keyPress( keyCodeIn ); - return true; - }; + return true; + }; - return false; + return false; } bool LLMozLib::unicodeInput( int browserWindowIdIn, unsigned long uni_char ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->unicodeInput( uni_char ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->unicodeInput( uni_char ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::focusBrowser( int browserWindowIdIn, bool focusBrowserIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->focusBrowser( focusBrowserIn ); + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + browserWindow->focusBrowser( focusBrowserIn ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // void LLMozLib::setNoFollowScheme( int browserWindowIdIn, std::string schemeIn ) { - LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); - if ( browserWindow ) - { - browserWindow->setNoFollowScheme( 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(); - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + return browserWindow->getNoFollowScheme(); + }; - return ( "" ); + return ( "" ); } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::enableCookies( bool enabledIn ) { - return LLEmbeddedBrowser::getInstance()->enableCookies( enabledIn ); + return LLEmbeddedBrowser::getInstance()->enableCookies( enabledIn ); } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::clearAllCookies() { - return LLEmbeddedBrowser::getInstance()->clearAllCookies(); + return LLEmbeddedBrowser::getInstance()->clearAllCookies(); } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::enablePlugins( bool enabledIn ) { - return LLEmbeddedBrowser::getInstance()->enablePlugins( 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 ); - }; + LLEmbeddedBrowserWindow* browserWindow = getBrowserWindowFromWindowId( browserWindowIdIn ); + if ( browserWindow ) + { + return browserWindow->evaluateJavascript( scriptIn ); + }; - return ""; + 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 ); + LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId( browser_window_in ); + if ( browser_window ) + { + browser_window->set404RedirectUrl( redirect_url ); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // bool LLMozLib::clr404RedirectUrl( int browser_window_in ) { - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId( browser_window_in ); - if ( browser_window ) - { - browser_window->clr404RedirectUrl(); + LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId( browser_window_in ); + if ( browser_window ) + { + browser_window->clr404RedirectUrl(); - return true; - }; + return true; + }; - return false; + return false; } //////////////////////////////////////////////////////////////////////////////// // utility method to get an LLEmbeddedBrowserWindow* from a window id (int) LLEmbeddedBrowserWindow* LLMozLib::getBrowserWindowFromWindowId( int browserWindowIdIn ) { - BrowserWindowMapIter iter = mBrowserWindowMap.find( browserWindowIdIn ); + BrowserWindowMapIter iter = mBrowserWindowMap.find( browserWindowIdIn ); - if ( iter != mBrowserWindowMap.end() ) - return ( *iter ).second; - else - return 0; + if ( iter != mBrowserWindowMap.end() ) + return ( *iter ).second; + else + return 0; } diff --git a/examples/osgbrowser/llmozlib2.h b/examples/osgbrowser/llmozlib2.h index 633ca8da3..96cdb7512 100644 --- a/examples/osgbrowser/llmozlib2.h +++ b/examples/osgbrowser/llmozlib2.h @@ -49,206 +49,206 @@ class LLEmbeddedBrowserWindow; // data class that is passed with an event class LLEmbeddedBrowserWindowEvent { - public: - LLEmbeddedBrowserWindowEvent( int eventWindowIdIn, std::string uriIn ) : - mEventWindowId( eventWindowIdIn ), - mEventUri( uriIn ) - { - }; + 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 ) - { - }; + // 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 ) - { - }; + // 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 ) - { - }; + // 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 ) - { - }; + // 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 ) - { - }; + // 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() - { - }; + virtual ~LLEmbeddedBrowserWindowEvent() + { + }; - int getEventWindowId() const - { - return mEventWindowId; - }; + int getEventWindowId() const + { + return mEventWindowId; + }; - std::string getEventUri() const - { - return mEventUri; - }; + std::string getEventUri() const + { + return mEventUri; + }; - int getIntValue() const - { - return mIntVal; - }; + int getIntValue() const + { + return mIntVal; + }; - std::string getStringValue() const - { - return mStringVal; - }; + std::string getStringValue() const + { + return mStringVal; + }; - std::string getStringValue2() const - { - return mStringVal2; - }; + 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; - }; + 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; + 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; + 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 ) { }; + 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(); + public: + virtual ~LLMozLib(); - // singleton access - static LLMozLib* getInstance(); + // 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 ); + // 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 ); + // 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 ); + // 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 ); + // 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 ); + // 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 ); + // 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 + // 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 + // 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 ); + // 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; + 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. diff --git a/examples/osgbrowser/nsProfileDirServiceProvider.cpp b/examples/osgbrowser/nsProfileDirServiceProvider.cpp new file mode 100644 index 000000000..e94914f29 --- /dev/null +++ b/examples/osgbrowser/nsProfileDirServiceProvider.cpp @@ -0,0 +1,544 @@ +/* -*- 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 new file mode 100644 index 000000000..03c5f4606 --- /dev/null +++ b/examples/osgbrowser/nsProfileDirServiceProvider.h @@ -0,0 +1,145 @@ +/* -*- 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 new file mode 100644 index 000000000..ec9cd9674 --- /dev/null +++ b/examples/osgbrowser/nsProfileLock.h @@ -0,0 +1,112 @@ +/* -*- 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 new file mode 100644 index 000000000..337d642ec --- /dev/null +++ b/examples/osgbrowser/nsProfileStringTypes.h @@ -0,0 +1,64 @@ +/* -*- 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 0c2015a87..5d4381001 100644 --- a/examples/osgbrowser/osgbrowser.cpp +++ b/examples/osgbrowser/osgbrowser.cpp @@ -74,6 +74,7 @@ class testGL : mNeedsUpdate( true ), // flag to indicate if browser texture needs an update mBrowserWindowId( 0 ), mAppWindowName( "testGL" ), + //mHomeUrl( "http://www.google.com" ) mHomeUrl( "http://www.google.com" ) { std::cout << "LLMozLib version: " << LLMozLib::getInstance()->getVersion() << std::endl; @@ -174,20 +175,7 @@ class testGL : glutPostRedisplay(); }; - //////////////////////////////////////////////////////////////////////////////// - // - void idle() - { - //std::cout<<"idle()"<grabBrowserWindow( mBrowserWindowId ); - - // lots of updates for smooth motion - glutPostRedisplay(); - }; + void idle(); //////////////////////////////////////////////////////////////////////////////// // @@ -206,17 +194,20 @@ class testGL : // valid window ? if ( mBrowserWindowId ) { + static int count = 0; + count++; + // needs to be updated? - if ( mNeedsUpdate ) + if ( mNeedsUpdate && (count%1)==0) { // grab the page - std::cout<<"mNeedsUpdate = true"<getBrowserWindowPixels( mBrowserWindowId ); if ( pixels ) { - std::cout<<"Texture subload "<getBrowserRowSpan( mBrowserWindowId ) / LLMozLib::getInstance()->getBrowserDepth( mBrowserWindowId )<<", "<getBrowserRowSpan( mBrowserWindowId ) / LLMozLib::getInstance()->getBrowserDepth( mBrowserWindowId )<<", "<navigateTo( mBrowserWindowId, "http://www.linuxtoday.org" ); - - std::cout<<"new browse to"<keyPress( mBrowserWindowId, keyIn ); + if (keyIn<32) LLMozLib::getInstance()->keyPress( mBrowserWindowId, keyIn ); + else LLMozLib::getInstance()->unicodeInput( mBrowserWindowId, keyIn ); }; //////////////////////////////////////////////////////////////////////////////// @@ -432,6 +416,23 @@ testGL* theApp; //////////////////////////////////////////////////////////////////////////////// // #ifdef _WINDOWS + +//////////////////////////////////////////////////////////////////////////////// +// +void idle() +{ + //std::cout<<"idle()"<grabBrowserWindow( mBrowserWindowId ); + + // lots of updates for smooth motion + glutPostRedisplay(); +}; + + void* testGL::getNativeWindowHandle() { // My implementation of the embedded browser needs a native window handle @@ -442,18 +443,49 @@ void* testGL::getNativeWindowHandle() #include +//////////////////////////////////////////////////////////////////////////////// +// +void testGL::idle() +{ + // pump the GTK+Gecko event queue for a (limited) while. this should + // be done so that the Gecko event queue doesn't starve, and done + // *here* so that mNeedsUpdate[] can be populated by callbacks + // from Gecko. + gtk_main_iteration_do(0); + for (int iter=0; iter<10; ++iter) + if (gtk_events_pending()) + gtk_main_iteration(); + + + //std::cout<<"idle()"<grabBrowserWindow( mBrowserWindowId ); + + // lots of updates for smooth motion + glutPostRedisplay(); +}; + + void* testGL::getNativeWindowHandle() { - gtk_disable_setlocale(); - gtk_init(NULL, NULL); + gtk_disable_setlocale(); + gtk_init(NULL, NULL); - GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_realize(win); - gtk_window_set_title(GTK_WINDOW(win), "Raw gecko window"); + 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); - GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(win), GTK_NO_WINDOW); - - return win; + return rtnw; }; #endif