diff --git a/embedding/browser/photon/src/PtMozilla.cpp b/embedding/browser/photon/src/PtMozilla.cpp index a6f37443d8a..9a67de65393 100644 --- a/embedding/browser/photon/src/PtMozilla.cpp +++ b/embedding/browser/photon/src/PtMozilla.cpp @@ -54,6 +54,7 @@ #include "nsIDOMWindow.h" #include "nsNetUtil.h" #include "nsMPFileLocProvider.h" +#include "nsIFocusController.h" #include "nsIViewManager.h" @@ -119,7 +120,7 @@ static void MozCreateWindow(PtMozillaWidget_t *moz) // Create the webbrowser window moz->MyBrowser->WebBrowserAsWin = do_QueryInterface(moz->MyBrowser->WebBrowser); - rv = moz->MyBrowser->WebBrowserAsWin->InitWindow(PtWidgetParent(moz), nsnull, 0, 0, 200, 200 ); + rv = moz->MyBrowser->WebBrowserAsWin->InitWindow( moz /* PtWidgetParent(moz) */, nsnull, 0, 0, 200, 200 ); rv = moz->MyBrowser->WebBrowserAsWin->Create(); // Configure what the web browser can and cannot do @@ -264,6 +265,7 @@ static void mozilla_defaults( PtWidget_t *widget ) { PtMozillaWidget_t *moz = (PtMozillaWidget_t *) widget; PtBasicWidget_t *basic = (PtBasicWidget_t *) widget; + PtContainerWidget_t *cntr = (PtContainerWidget_t*) widget; moz->MyBrowser = new BrowserAccess(); @@ -282,6 +284,8 @@ static void mozilla_defaults( PtWidget_t *widget ) widget->resize_flags &= ~Pt_RESIZE_XY_BITS; // fixed size. widget->anchor_flags = Pt_TOP_ANCHORED_TOP | Pt_LEFT_ANCHORED_LEFT | \ Pt_BOTTOM_ANCHORED_TOP | Pt_RIGHT_ANCHORED_LEFT | Pt_ANCHORS_INVALID; + + cntr->flags |= Pt_CHILD_GETTING_FOCUS; } static void mozilla_destroy( PtWidget_t *widget ) { @@ -291,6 +295,97 @@ static void mozilla_destroy( PtWidget_t *widget ) { delete moz->MyBrowser; } +#if 0 +static int child_getting_focus( PtWidget_t *widget, PtWidget_t *child, PhEvent_t *ev ) { + PtMozillaWidget_t *moz = (PtMozillaWidget_t *) widget; + +/* ATENTIE */ printf( "!!!!!!!!!!!child_getting_focus\n\n\n" ); + +// PtSuperClassChildGettingFocus( PtContainer, widget, child, ev ); + + nsCOMPtr piWin; + moz->MyBrowser->WebBrowserContainer->GetPIDOMWindow( getter_AddRefs( piWin ) ); + if( !piWin ) return Pt_CONTINUE; + + piWin->Activate(); + + return Pt_CONTINUE; + } + +static int child_losing_focus( PtWidget_t *widget, PtWidget_t *child, PhEvent_t *ev ) { + PtMozillaWidget_t *moz = (PtMozillaWidget_t *) widget; + +/* ATENTIE */ printf( "!!!!!!!!!!!!child_losing_focus\n\n\n" ); + +// PtSuperClassChildLosingFocus( PtContainer, widget, child, ev ); + + nsCOMPtr piWin; + moz->MyBrowser->WebBrowserContainer->GetPIDOMWindow( getter_AddRefs( piWin ) ); + if( !piWin ) return Pt_CONTINUE; + + piWin->Deactivate(); + + // but the window is still active until the toplevel gets a focus out + nsCOMPtr focusController; + piWin->GetRootFocusController(getter_AddRefs(focusController)); + if( focusController ) focusController->SetActive( PR_TRUE ); + + return Pt_CONTINUE; + } + +static int got_focus( PtWidget_t *widget, PhEvent_t *event ) { + PtMozillaWidget_t *moz = (PtMozillaWidget_t *) widget; + +/* ATENTIE */ printf( ">>>>>>>>>>>>>>>>>>>got_focus\n\n\n" ); + + PtSuperClassGotFocus( PtContainer, widget, event ); + + nsCOMPtr piWin; + moz->MyBrowser->WebBrowserContainer->GetPIDOMWindow( getter_AddRefs( piWin ) ); + if( !piWin ) return Pt_CONTINUE; + + nsCOMPtr focusController; + piWin->GetRootFocusController( getter_AddRefs( focusController ) ); + if( focusController ) focusController->SetActive( PR_TRUE ); + + return Pt_CONTINUE; + } + +static int lost_focus( PtWidget_t *widget, PhEvent_t *event ) { + PtMozillaWidget_t *moz = (PtMozillaWidget_t *) widget; + +/* ATENTIE */ printf( "!!!!!!!!!!!!!!!!lost_focus\n\n\n" ); + + PtSuperClassLostFocus( PtContainer, widget, event ); + + nsCOMPtr piWin; + moz->MyBrowser->WebBrowserContainer->GetPIDOMWindow( getter_AddRefs( piWin ) ); + if( !piWin ) return Pt_CONTINUE; + + nsCOMPtr focusController; + piWin->GetRootFocusController( getter_AddRefs( focusController ) ); + if( focusController ) focusController->SetActive( PR_FALSE ); + + return Pt_CONTINUE; + } + +#endif + +static int child_getting_focus( PtWidget_t *widget, PtWidget_t *child, PhEvent_t *ev ) { + PtMozillaWidget_t *moz = (PtMozillaWidget_t *) widget; + + nsCOMPtr piWin; + moz->MyBrowser->WebBrowserContainer->GetPIDOMWindow( getter_AddRefs( piWin ) ); + if( !piWin ) return Pt_CONTINUE; + + nsCOMPtr focusController; + piWin->GetRootFocusController(getter_AddRefs(focusController)); + if( focusController ) focusController->SetActive( PR_TRUE ); + + return Pt_CONTINUE; + } + + /* this callback is invoked when the user changes video modes - it will reallocate the off screen memory */ static int mozilla_ev_info( PtWidget_t *widget, PhEvent_t *event ) { @@ -1123,6 +1218,10 @@ PtWidgetClass_t *PtCreateMozillaClass( void ) { Pt_SET_FLAGS, Pt_RECTANGULAR, Pt_RECTANGULAR }, { Pt_SET_DESTROY_F, (long) mozilla_destroy }, { Pt_SET_RAW_CALLBACKS, (long) &callback, 1 }, + { Pt_SET_CHILD_GETTING_FOCUS_F, ( long ) child_getting_focus }, +// { Pt_SET_CHILD_LOSING_FOCUS_F, ( long ) child_losing_focus }, +// { Pt_SET_GOT_FOCUS_F, ( long ) got_focus }, +// { Pt_SET_LOST_FOCUS_F, ( long ) lost_focus }, { Pt_SET_RESOURCES, (long) resources }, { Pt_SET_NUM_RESOURCES, sizeof( resources )/sizeof( resources[0] ) }, { Pt_SET_DESCRIPTION, (long) "PtMozilla" }, diff --git a/embedding/browser/photon/src/WebBrowserContainer.cpp b/embedding/browser/photon/src/WebBrowserContainer.cpp index f429decebfd..0713c864138 100644 --- a/embedding/browser/photon/src/WebBrowserContainer.cpp +++ b/embedding/browser/photon/src/WebBrowserContainer.cpp @@ -39,6 +39,7 @@ CWebBrowserContainer::CWebBrowserContainer(PtWidget_t *pOwner) m_pCurrentURI = nsnull; mDoingStream = PR_FALSE; mOffset = 0; + mSkipOnState = 0; } @@ -107,6 +108,7 @@ NS_INTERFACE_MAP_BEGIN(CWebBrowserContainer) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebBrowserChrome) NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor) NS_INTERFACE_MAP_ENTRY(nsIWebBrowserChrome) + NS_INTERFACE_MAP_ENTRY(nsIWebBrowserChromeFocus) NS_INTERFACE_MAP_ENTRY(nsIEmbeddingSiteWindow) NS_INTERFACE_MAP_ENTRY(nsIURIContentListener) NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeOwner) @@ -986,7 +988,10 @@ NS_IMETHODIMP CWebBrowserContainer::GetDimensions(PRUint32 flags, PRInt32 *x, PR /* void setFocus (); */ NS_IMETHODIMP CWebBrowserContainer::SetFocus() { - return NS_ERROR_NOT_IMPLEMENTED; + PtMozillaWidget_t *moz = (PtMozillaWidget_t *) m_pOwner; + nsCOMPtr browserBaseWindow = do_QueryInterface( moz->MyBrowser->WebBrowser ); +/* ATENTIE */ printf( "CWebBrowserContainer::SetFocus\n" ); + return browserBaseWindow->SetFocus(); } /* attribute boolean visibility; */ @@ -1224,3 +1229,40 @@ NS_IMETHODIMP CWebBrowserContainer::OnEndPrinting(PRUint32 aStatus) InvokePrintCallback(Pt_MOZ_PRINT_COMPLETE, 0, 0); return NS_OK; } + +/* see the gtk version */ +nsresult CWebBrowserContainer::GetPIDOMWindow( nsPIDOMWindow **aPIWin ) { + PtMozillaWidget_t *moz = ( PtMozillaWidget_t * ) m_pOwner; + *aPIWin = nsnull; + + // get the content DOM window for that web browser + nsCOMPtr domWindow; + moz->MyBrowser->WebBrowser->GetContentDOMWindow( getter_AddRefs( domWindow ) ); + if( !domWindow ) return NS_ERROR_FAILURE; + + // get the private DOM window + nsCOMPtr domWindowPrivate = do_QueryInterface(domWindow); + // and the root window for that DOM window + nsCOMPtr rootWindow; + domWindowPrivate->GetPrivateRoot(getter_AddRefs(rootWindow)); + + nsCOMPtr chromeHandler; + nsCOMPtr piWin(do_QueryInterface(rootWindow)); + + *aPIWin = piWin.get(); + + if (*aPIWin) { + NS_ADDREF(*aPIWin); + return NS_OK; + } + + return NS_ERROR_FAILURE; + } + +// nsIWebBrowserChromeFocus +NS_IMETHODIMP CWebBrowserContainer::FocusNextElement() { + return NS_ERROR_NOT_IMPLEMENTED; + } +NS_IMETHODIMP CWebBrowserContainer::FocusPrevElement() { + return NS_ERROR_NOT_IMPLEMENTED; + } diff --git a/embedding/browser/photon/src/WebBrowserContainer.h b/embedding/browser/photon/src/WebBrowserContainer.h index 99d579eb1d0..a5f66c0adb8 100644 --- a/embedding/browser/photon/src/WebBrowserContainer.h +++ b/embedding/browser/photon/src/WebBrowserContainer.h @@ -30,6 +30,7 @@ #include "stdhdrs.h" #include "nsIContextMenuListener.h" #include "nsIEmbeddingSiteWindow.h" +#include "nsIWebBrowserChromeFocus.h" #include "nsICommandHandler.h" #include "nsWeakReference.h" #include "nsIInputStream.h" @@ -41,12 +42,17 @@ #include "nsIContentViewerContainer.h" #include "nsNetUtil.h" #include "nsIDocShell.h" +#include "nsPIDOMWindow.h" +#include "nsIDOMWindowInternal.h" +#include "nsIChromeEventHandler.h" +#include "nsIURIContentListener.h" // This is the class that handles the XPCOM side of things, callback // interfaces into the web shell and so forth. class CWebBrowserContainer : public nsIWebBrowserChrome, + public nsIWebBrowserChromeFocus, public nsIWebProgressListener, public nsIEmbeddingSiteWindow, public nsIRequestObserver, @@ -70,6 +76,9 @@ public: NS_IMETHOD CloseStream( void ); NS_IMETHOD IsStreaming( void ); + // this will get the PIDOMWindow for this widget + nsresult GetPIDOMWindow( nsPIDOMWindow **aPIWin ); + virtual ~CWebBrowserContainer(); PtWidget_t *m_pOwner; @@ -84,6 +93,7 @@ protected: public: NS_DECL_ISUPPORTS NS_DECL_NSIWEBBROWSERCHROME + NS_DECL_NSIWEBBROWSERCHROMEFOCUS NS_DECL_NSIEMBEDDINGSITEWINDOW NS_DECL_NSIDOCSHELLTREEOWNER NS_DECL_NSIURICONTENTLISTENER