diff --git a/embedding/browser/activex/src/control/WebBrowserContainer.cpp b/embedding/browser/activex/src/control/WebBrowserContainer.cpp index 219ada6e7fa9..bef7f1104756 100644 --- a/embedding/browser/activex/src/control/WebBrowserContainer.cpp +++ b/embedding/browser/activex/src/control/WebBrowserContainer.cpp @@ -64,6 +64,7 @@ NS_INTERFACE_MAP_BEGIN(CWebBrowserContainer) NS_INTERFACE_MAP_ENTRY(nsIPrompt) NS_INTERFACE_MAP_ENTRY(nsIContextMenuListener) // NS_INTERFACE_MAP_ENTRY(nsICommandHandler) + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_END diff --git a/embedding/browser/activex/src/control/WebBrowserContainer.h b/embedding/browser/activex/src/control/WebBrowserContainer.h index d68940d6ab41..b10c88e05fb7 100644 --- a/embedding/browser/activex/src/control/WebBrowserContainer.h +++ b/embedding/browser/activex/src/control/WebBrowserContainer.h @@ -27,6 +27,7 @@ #include "nsIContextMenuListener.h" #include "nsICommandHandler.h" +#include "nsWeakReference.h" // This is the class that handles the XPCOM side of things, callback // interfaces into the web shell and so forth. @@ -42,7 +43,8 @@ class CWebBrowserContainer : public nsIInterfaceRequestor, public nsIPrompt, public nsIContextMenuListener, - public nsICommandHandler + public nsICommandHandler, + public nsSupportsWeakReference { public: CWebBrowserContainer(CMozillaBrowser *pOwner); diff --git a/embedding/browser/gtk/src/gtkmozembed.cpp b/embedding/browser/gtk/src/gtkmozembed.cpp index 15ddaebb19e4..b6b826796aec 100644 --- a/embedding/browser/gtk/src/gtkmozembed.cpp +++ b/embedding/browser/gtk/src/gtkmozembed.cpp @@ -55,6 +55,7 @@ #include "nsMPFileLocProvider.h" #include "prio.h" #include "prprf.h" +#include "nsWeakReference.h" // freakin X headers #ifdef Success @@ -101,7 +102,8 @@ private: // this class is a progress listener for the main content area, once // it has been loaded. -class GtkMozEmbedContentProgress : public nsIWebProgressListener +class GtkMozEmbedContentProgress : public nsIWebProgressListener, + public nsSupportsWeakReference { public: GtkMozEmbedContentProgress(); @@ -119,7 +121,8 @@ private: }; // this class is a progress listener for the chrome area -class GtkMozEmbedChromeProgress : public nsIWebProgressListener +class GtkMozEmbedChromeProgress : public nsIWebProgressListener, + public nsSupportsWeakReference { public: GtkMozEmbedChromeProgress(); @@ -1868,6 +1871,7 @@ NS_IMPL_RELEASE(GtkMozEmbedContentProgress) NS_INTERFACE_MAP_BEGIN(GtkMozEmbedContentProgress) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_END void @@ -1988,6 +1992,7 @@ NS_IMPL_RELEASE(GtkMozEmbedChromeProgress) NS_INTERFACE_MAP_BEGIN(GtkMozEmbedChromeProgress) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_END void diff --git a/embedding/browser/photon/src/PtMozilla.cpp b/embedding/browser/photon/src/PtMozilla.cpp index abab968b6bbf..e68e2f148f68 100644 --- a/embedding/browser/photon/src/PtMozilla.cpp +++ b/embedding/browser/photon/src/PtMozilla.cpp @@ -47,6 +47,7 @@ #include "nsWidgetsCID.h" #include "nsIAppShell.h" #include "nsIDOMDocument.h" +#include "nsWeakReference.h" // freakin X headers #ifdef Success @@ -92,7 +93,8 @@ private: // this class is a progress listener for the main content area, once // it has been loaded. -class PhMozEmbedContentProgress : public nsIWebProgressListener +class PhMozEmbedContentProgress : public nsIWebProgressListener, + public nsSupportsWeakReference { public: PhMozEmbedContentProgress(); @@ -110,7 +112,8 @@ private: }; // this class is a progress listener for the chrome area -class PhMozEmbedChromeProgress : public nsIWebProgressListener +class PhMozEmbedChromeProgress : public nsIWebProgressListener, + public nsSupportsWeakReference { public: PhMozEmbedChromeProgress(); @@ -899,6 +902,7 @@ NS_IMPL_RELEASE(PhMozEmbedContentProgress) NS_INTERFACE_MAP_BEGIN(PhMozEmbedContentProgress) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_END void @@ -1060,6 +1064,7 @@ NS_IMPL_RELEASE(PhMozEmbedChromeProgress) NS_INTERFACE_MAP_BEGIN(PhMozEmbedChromeProgress) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_END void diff --git a/embedding/browser/powerplant/source/CWebBrowserChrome.cpp b/embedding/browser/powerplant/source/CWebBrowserChrome.cpp index 7b3e931ac05d..5b62836e69fc 100644 --- a/embedding/browser/powerplant/source/CWebBrowserChrome.cpp +++ b/embedding/browser/powerplant/source/CWebBrowserChrome.cpp @@ -115,6 +115,7 @@ NS_INTERFACE_MAP_BEGIN(CWebBrowserChrome) NS_INTERFACE_MAP_ENTRY(nsIPrompt) NS_INTERFACE_MAP_ENTRY(nsIContextMenuListener) NS_INTERFACE_MAP_ENTRY(nsITooltipListener) + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_END //***************************************************************************** diff --git a/embedding/browser/powerplant/source/CWebBrowserChrome.h b/embedding/browser/powerplant/source/CWebBrowserChrome.h index 63c820116724..b2b7d1374678 100644 --- a/embedding/browser/powerplant/source/CWebBrowserChrome.h +++ b/embedding/browser/powerplant/source/CWebBrowserChrome.h @@ -35,6 +35,7 @@ #include "nsIPrompt.h" #include "nsIContextMenuListener.h" #include "nsITooltipListener.h" +#include "nsWeakReference.h" // Other #include "nsIWebBrowser.h" @@ -51,7 +52,8 @@ class CWebBrowserChrome : public nsIWebBrowserChrome, public nsIPrompt, public nsIInterfaceRequestor, public nsIContextMenuListener, - public nsITooltipListener + public nsITooltipListener, + public nsSupportsWeakReference { friend class CBrowserWindow; diff --git a/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp b/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp index 2d684153ebff..ee9624008414 100644 --- a/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp +++ b/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp @@ -60,7 +60,6 @@ nsDocShellTreeOwner::nsDocShellTreeOwner() : mTreeOwner(nsnull), mPrimaryContentShell(nsnull), mWebBrowserChrome(nsnull), - mOwnerProgressListener(nsnull), mOwnerWin(nsnull), mOwnerRequestor(nsnull), mChromeListener(nsnull) @@ -82,8 +81,7 @@ nsDocShellTreeOwner::~nsDocShellTreeOwner() NS_IMPL_ADDREF(nsDocShellTreeOwner) NS_IMPL_RELEASE(nsDocShellTreeOwner) - - + NS_INTERFACE_MAP_BEGIN(nsDocShellTreeOwner) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDocShellTreeOwner) NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeOwner) @@ -91,6 +89,7 @@ NS_INTERFACE_MAP_BEGIN(nsDocShellTreeOwner) NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor) NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) NS_INTERFACE_MAP_ENTRY(nsICDocShellTreeOwner) + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_END //***************************************************************************** @@ -461,17 +460,7 @@ nsDocShellTreeOwner::OnProgressChange(nsIWebProgress* aProgress, // In the absence of DOM document creation event, this method is the // most convenient place to install the mouse listener on the // DOM document. - AddChromeListeners(); - - if(!mOwnerProgressListener) - return NS_OK; - - return mOwnerProgressListener->OnProgressChange(aProgress, - aRequest, - aCurSelfProgress, - aMaxSelfProgress, - aCurTotalProgress, - aMaxTotalProgress); + return AddChromeListeners(); } NS_IMETHODIMP @@ -480,23 +469,14 @@ nsDocShellTreeOwner::OnStateChange(nsIWebProgress* aProgress, PRInt32 aProgressStateFlags, nsresult aStatus) { - if(!mOwnerProgressListener) - return NS_OK; - - return mOwnerProgressListener->OnStateChange(aProgress, - aRequest, - aProgressStateFlags, - aStatus); + return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP nsDocShellTreeOwner::OnLocationChange(nsIWebProgress* aWebProgress, nsIRequest* aRequest, nsIURI* aURI) { - if(!mOwnerProgressListener) - return NS_OK; - - return mOwnerProgressListener->OnLocationChange(aWebProgress, aRequest, aURI); + return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP @@ -505,10 +485,7 @@ nsDocShellTreeOwner::OnStatusChange(nsIWebProgress* aWebProgress, nsresult aStatus, const PRUnichar* aMessage) { - if(!mOwnerProgressListener) - return NS_OK; - - return mOwnerProgressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage); + return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP @@ -567,19 +544,16 @@ NS_IMETHODIMP nsDocShellTreeOwner::SetWebBrowserChrome(nsIWebBrowserChrome* aWeb if(!aWebBrowserChrome) { mWebBrowserChrome = nsnull; mOwnerWin = nsnull; - mOwnerProgressListener = nsnull; mOwnerRequestor = nsnull; } else { nsCOMPtr baseWin(do_QueryInterface(aWebBrowserChrome)); nsCOMPtr requestor(do_QueryInterface(aWebBrowserChrome)); - nsCOMPtr progressListener(do_QueryInterface(aWebBrowserChrome)); NS_ENSURE_TRUE(baseWin, NS_ERROR_INVALID_ARG); mWebBrowserChrome = aWebBrowserChrome; mOwnerWin = baseWin; - mOwnerProgressListener = progressListener; mOwnerRequestor = requestor; } return NS_OK; diff --git a/embedding/browser/webBrowser/nsDocShellTreeOwner.h b/embedding/browser/webBrowser/nsDocShellTreeOwner.h index 1275b9e927d2..e9fc0b1eaf33 100644 --- a/embedding/browser/webBrowser/nsDocShellTreeOwner.h +++ b/embedding/browser/webBrowser/nsDocShellTreeOwner.h @@ -32,11 +32,12 @@ #include "nsIDocShellTreeOwner.h" #include "nsIInterfaceRequestor.h" #include "nsIWebBrowserChrome.h" -#include "nsIWebProgressListener.h" #include "nsIDOMMouseListener.h" #include "nsIDOMDocument.h" #include "nsIChromeEventHandler.h" #include "nsIDOMEventReceiver.h" +#include "nsIWebProgressListener.h" +#include "nsWeakReference.h" #include "nsIDOMKeyListener.h" #include "nsIDOMMouseMotionListener.h" #include "nsITimer.h" @@ -67,7 +68,8 @@ class nsDocShellTreeOwner : public nsIDocShellTreeOwner, public nsIBaseWindow, public nsIInterfaceRequestor, public nsIWebProgressListener, - public nsICDocShellTreeOwner + public nsICDocShellTreeOwner, + public nsSupportsWeakReference { friend class nsWebBrowser; friend class nsCommandHandler; @@ -100,7 +102,6 @@ protected: nsIDocShellTreeItem* mPrimaryContentShell; nsIWebBrowserChrome* mWebBrowserChrome; - nsIWebProgressListener* mOwnerProgressListener; nsIBaseWindow* mOwnerWin; nsIInterfaceRequestor* mOwnerRequestor; diff --git a/embedding/browser/webBrowser/nsWebBrowser.cpp b/embedding/browser/webBrowser/nsWebBrowser.cpp index 8915af4edebe..b2de0e8b7d24 100644 --- a/embedding/browser/webBrowser/nsWebBrowser.cpp +++ b/embedding/browser/webBrowser/nsWebBrowser.cpp @@ -41,6 +41,7 @@ #include "nsIFocusController.h" #include "nsIDOMWindowInternal.h" #include "nsIWebProgress.h" +#include "nsIWebProgressListener.h" #include "nsIWebBrowserFocus.h" static NS_DEFINE_CID(kWebShellCID, NS_WEB_SHELL_CID); @@ -54,7 +55,7 @@ static NS_DEFINE_IID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID); nsWebBrowser::nsWebBrowser() : mDocShellTreeOwner(nsnull), mContentListener(nsnull), mInitInfo(nsnull), mContentType(typeContentWrapper), mParentNativeWindow(nsnull), mParentWidget(nsnull), mParent(nsnull), - mProgressListener(nsnull) + mProgressListener(nsnull), mListenerArray(nsnull) { NS_INIT_REFCNT(); mInitInfo = new nsWebBrowserInitInfo(); @@ -65,6 +66,12 @@ nsWebBrowser::~nsWebBrowser() InternalDestroy(); } +PRBool deleteListener(void *aElement, void *aData) { + nsWebBrowserListenerState *state = (nsWebBrowserListenerState*)aElement; + NS_DELETEXPCOM(state); + return PR_TRUE; +} + NS_IMETHODIMP nsWebBrowser::InternalDestroy() { @@ -89,6 +96,12 @@ NS_IMETHODIMP nsWebBrowser::InternalDestroy() mInitInfo = nsnull; } + if (mListenerArray) { + (void)mListenerArray->EnumerateForwards(deleteListener, nsnull); + delete mListenerArray; + mListenerArray = nsnull; + } + return NS_OK; } @@ -142,17 +155,46 @@ NS_IMETHODIMP nsWebBrowser::AddWebBrowserListener(nsISupports *aListener, const nsresult rv = NS_ERROR_INVALID_ARG; NS_ENSURE_ARG_POINTER(aListener); + // first determine if the listener supports weak references; it's required. + // see http://www.mozilla.org/projects/xpcom/weak_references.html for info + // on how to support weak references. + nsWeakPtr listener = getter_AddRefs(NS_GetWeakReference(aListener)); + if (!listener) return NS_ERROR_INVALID_ARG; + + if (!mWebProgress) { + // The window hasn't been created yet, so queue up the listener. They'll be + // registered when the window gets created. + nsWebBrowserListenerState *state = nsnull; + NS_NEWXPCOM(state, nsWebBrowserListenerState); + if (!state) return NS_ERROR_OUT_OF_MEMORY; + + state->mWeakPtr = listener; + state->mID = aIID; + + if (!mListenerArray) { + NS_NEWXPCOM(mListenerArray, nsVoidArray); + if (!mListenerArray) return NS_ERROR_OUT_OF_MEMORY; + } + + if (!mListenerArray->AppendElement(state)) return NS_ERROR_OUT_OF_MEMORY; + } else { + rv = BindListener(aListener, aIID); + } + + return rv; +} + +NS_IMETHODIMP nsWebBrowser::BindListener(nsISupports *aListener, const nsIID& aIID) { + NS_ASSERTION(aListener, "invalid args"); + NS_ASSERTION(mWebProgress, "this should only be called after we've retrieved a progress iface"); + nsresult rv = NS_OK; + // register this listener for the specified interface id if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) { - if (mDocShell) { - nsCOMPtr progress(do_GetInterface(mDocShell, &rv)); - if (NS_FAILED(rv)) return rv; - nsCOMPtr listener = do_QueryInterface(aListener, &rv); - if (NS_FAILED(rv)) return rv; - rv = progress->AddProgressListener(listener); - } + nsCOMPtr listener = do_QueryInterface(aListener, &rv); + if (NS_FAILED(rv)) return rv; + rv = mWebProgress->AddProgressListener(listener); } - return rv; } @@ -161,20 +203,53 @@ NS_IMETHODIMP nsWebBrowser::RemoveWebBrowserListener(nsISupports *aListener, con nsresult rv = NS_ERROR_INVALID_ARG; NS_ENSURE_ARG_POINTER(aListener); - // un-register this listener for the specified interface id - if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) { - if (mDocShell) { - nsCOMPtr progress(do_GetInterface(mDocShell, &rv)); - if (NS_FAILED(rv)) return rv; - nsCOMPtr listener = do_QueryInterface(aListener, &rv); - if (NS_FAILED(rv)) return rv; - rv = progress->RemoveProgressListener(listener); + if (!mWebProgress) { + // if there's no-one to register the listener w/, and we don't have a queue going, + // the the called is calling Remove before an Add which doesn't make sense. + if (!mListenerArray) return NS_ERROR_FAILURE; + + // iterate the array and remove the queued listener + PRInt32 count = mListenerArray->Count(); + while (count > 0) { + nsWebBrowserListenerState *state = (nsWebBrowserListenerState*)mListenerArray->ElementAt(count); + NS_ASSERTION(state, "list construction problem"); + + if (state->Equals(aListener, aIID)) { + // this is the one, pull it out. + mListenerArray->RemoveElementAt(count); + break; + } + count--; } + + // if we've emptied the array, get rid of it. + if (0 >= mListenerArray->Count()) { + (void)mListenerArray->EnumerateForwards(deleteListener, nsnull); + NS_DELETEXPCOM(mListenerArray); + mListenerArray = nsnull; + } + + } else { + rv = UnBindListener(aListener, aIID); } return rv; } +NS_IMETHODIMP nsWebBrowser::UnBindListener(nsISupports *aListener, const nsIID& aIID) { + NS_ASSERTION(aListener, "invalid args"); + NS_ASSERTION(mWebProgress, "this should only be called after we've retrieved a progress iface"); + nsresult rv = NS_OK; + + // remove the listener for the specified interface id + if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) { + nsCOMPtr listener = do_QueryInterface(aListener, &rv); + if (NS_FAILED(rv)) return rv; + rv = mWebProgress->RemoveProgressListener(listener); + } + return rv; +} + NS_IMETHODIMP nsWebBrowser::GetContainerWindow(nsIWebBrowserChrome** aTopWindow) { NS_ENSURE_ARG_POINTER(aTopWindow); @@ -655,6 +730,34 @@ NS_IMETHODIMP nsWebBrowser::Create() nsCOMPtr docShell(do_CreateInstance(kWebShellCID)); NS_ENSURE_SUCCESS(SetDocShell(docShell), NS_ERROR_FAILURE); + // the docshell has been set so we now have our listener registrars. + if (mListenerArray) { + // we had queued up some listeners, let's register them now. + PRInt32 count = mListenerArray->Count(); + PRInt32 i = 0; + NS_ASSERTION(count > 0, "array construction problem"); + while (i < count) { + nsWebBrowserListenerState *state = (nsWebBrowserListenerState*)mListenerArray->ElementAt(i); + NS_ASSERTION(state, "array construction problem"); + nsCOMPtr listener = do_QueryReferent(state->mWeakPtr); + NS_ASSERTION(listener, "bad listener"); + (void)BindListener(listener, state->mID); + i++; + } + (void)mListenerArray->EnumerateForwards(deleteListener, nsnull); + NS_DELETEXPCOM(mListenerArray); + mListenerArray = nsnull; + } + + // HACK ALERT - this registration registers the nsDocShellTreeOwner as a + // nsIWebBrowserListener so it can setup it's MouseListener in one of the + // progress callbacks. If we can register the MouseListener another way, this + // registration can go away, and nsDocShellTreeOwner can stop implementing + // nsIWebProgressListener. + nsCOMPtr supports = nsnull; + (void)mDocShellTreeOwner->QueryInterface(NS_GET_IID(nsIWebProgressListener), (void**)&supports); + (void)BindListener(supports, NS_GET_IID(nsIWebProgressListener)); + NS_ENSURE_SUCCESS(mDocShellAsWin->InitWindow(nsnull, docShellParentWidget, mInitInfo->x, mInitInfo->y, mInitInfo->cx, mInitInfo->cy), NS_ERROR_FAILURE); @@ -1087,7 +1190,9 @@ NS_IMETHODIMP nsWebBrowser::SetDocShell(nsIDocShell* aDocShell) nsCOMPtr nav(do_QueryInterface(aDocShell)); nsCOMPtr scrollable(do_QueryInterface(aDocShell)); nsCOMPtr textScroll(do_QueryInterface(aDocShell)); - NS_ENSURE_TRUE(req && baseWin && item && nav && scrollable && textScroll, NS_ERROR_FAILURE); + nsCOMPtr progress(do_GetInterface(aDocShell)); + NS_ENSURE_TRUE(req && baseWin && item && nav && scrollable && textScroll && progress, + NS_ERROR_FAILURE); mDocShell = aDocShell; mDocShellAsReq = req; @@ -1096,21 +1201,12 @@ NS_IMETHODIMP nsWebBrowser::SetDocShell(nsIDocShell* aDocShell) mDocShellAsNav = nav; mDocShellAsScrollable = scrollable; mDocShellAsTextScroll = textScroll; - - nsCOMPtr listener = - NS_STATIC_CAST(nsIWebProgressListener*, mDocShellTreeOwner); - (void)AddWebBrowserListener(listener, - NS_GET_IID(nsIWebProgressListener)); + mWebProgress = progress; } else { - if (mDocShell) - { - nsCOMPtr listener = - NS_STATIC_CAST(nsIWebProgressListener*, mDocShellTreeOwner); - (void)RemoveWebBrowserListener(listener, NS_GET_IID(nsIWebProgressListener)); - mDocShellAsWin->Destroy(); - } + if (mDocShellAsWin) (void)mDocShellAsWin->Destroy(); + mDocShell = nsnull; mDocShellAsReq = nsnull; mDocShellAsWin = nsnull; @@ -1118,6 +1214,7 @@ NS_IMETHODIMP nsWebBrowser::SetDocShell(nsIDocShell* aDocShell) mDocShellAsNav = nsnull; mDocShellAsScrollable = nsnull; mDocShellAsTextScroll = nsnull; + mWebProgress = nsnull; } return NS_OK; diff --git a/embedding/browser/webBrowser/nsWebBrowser.h b/embedding/browser/webBrowser/nsWebBrowser.h index fd03401f61f3..5aef6d68c5ec 100644 --- a/embedding/browser/webBrowser/nsWebBrowser.h +++ b/embedding/browser/webBrowser/nsWebBrowser.h @@ -38,9 +38,9 @@ #include "nsIInterfaceRequestor.h" #include "nsIScrollable.h" #include "nsISHistory.h" -#include "nsISupportsArray.h" #include "nsITextScroll.h" #include "nsIWidget.h" +#include "nsIWebProgress.h" #include "nsIWebBrowser.h" #include "nsIWebNavigation.h" @@ -48,6 +48,9 @@ #include "nsIWebBrowserPersist.h" #include "nsIWebBrowserFocus.h" +#include "nsVoidArray.h" +#include "nsWeakPtr.h" + class nsWebBrowserInitInfo { public: @@ -61,6 +64,18 @@ public: nsString name; }; +class nsWebBrowserListenerState +{ +public: + PRBool Equals(nsISupports *aListener, const nsIID& aID) { + nsCOMPtr listener = do_QueryReferent(mWeakPtr); + if (listener.get() == aListener && mID.Equals(aID)) return PR_TRUE; + return PR_FALSE; + }; + + nsWeakPtr mWeakPtr; + nsIID mID; +}; class nsWebBrowser : public nsIWebBrowser, public nsIWebNavigation, @@ -98,6 +113,8 @@ protected: NS_IMETHOD EnsureDocShellTreeOwner(); NS_IMETHOD EnsureContentListener(); NS_IMETHOD GetPrimaryContentWindow(nsIDOMWindowInternal **aDomWindow); + NS_IMETHOD BindListener(nsISupports *aListener, const nsIID& aIID); + NS_IMETHOD UnBindListener(nsISupports *aListener, const nsIID& aIID); static nsEventStatus PR_CALLBACK HandleEvent(nsGUIEvent *aEvent); @@ -116,11 +133,12 @@ protected: PRUint32 mContentType; nativeWindow mParentNativeWindow; nsIWebBrowserPersistProgress *mProgressListener; + nsCOMPtr mWebProgress; //Weak Reference interfaces... nsIWidget* mParentWidget; nsIDocShellTreeItem* mParent; - + nsVoidArray * mListenerArray; }; diff --git a/embedding/tests/winEmbed/WebBrowserChrome.cpp b/embedding/tests/winEmbed/WebBrowserChrome.cpp index 03e358004eb3..dc237ad85ec8 100644 --- a/embedding/tests/winEmbed/WebBrowserChrome.cpp +++ b/embedding/tests/winEmbed/WebBrowserChrome.cpp @@ -69,6 +69,7 @@ NS_INTERFACE_MAP_BEGIN(WebBrowserChrome) NS_INTERFACE_MAP_ENTRY(nsIWebBrowserChrome) NS_INTERFACE_MAP_ENTRY(nsIBaseWindow) NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) // optional + NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) // NS_INTERFACE_MAP_ENTRY(nsIPrompt) NS_INTERFACE_MAP_END @@ -137,7 +138,7 @@ NS_IMETHODIMP WebBrowserChrome::CreateBrowserWindow(PRUint32 chromeMask, PRInt32 if (!mWebBrowser) return NS_ERROR_FAILURE; - mWebBrowser->SetContainerWindow(NS_STATIC_CAST(nsIWebBrowserChrome*, this)); + (void)mWebBrowser->SetContainerWindow(NS_STATIC_CAST(nsIWebBrowserChrome*, this)); nsCOMPtr dsti = do_QueryInterface(mWebBrowser); dsti->SetItemType(nsIDocShellTreeItem::typeContentWrapper); @@ -153,6 +154,11 @@ NS_IMETHODIMP WebBrowserChrome::CreateBrowserWindow(PRUint32 chromeMask, PRInt32 nsnull, aX, aY, aCX, aCY); mBaseWindow->Create(); + + nsCOMPtr listener = NS_STATIC_CAST(nsIWebProgressListener*, this); + nsCOMPtr supports = do_QueryInterface(listener); + (void)mWebBrowser->AddWebBrowserListener(supports, + NS_GET_IID(nsIWebProgressListener)); NS_IF_ADDREF(*aWebBrowser = mWebBrowser); return NS_OK; diff --git a/embedding/tests/winEmbed/WebBrowserChrome.h b/embedding/tests/winEmbed/WebBrowserChrome.h index b36ccc2d9c69..6cebc2e1af18 100644 --- a/embedding/tests/winEmbed/WebBrowserChrome.h +++ b/embedding/tests/winEmbed/WebBrowserChrome.h @@ -37,6 +37,8 @@ #include "nsIPrompt.h" #include "nsIWebBrowser.h" #include "nsVoidArray.h" +#include "nsWeakReference.h" + class WebBrowserChromeUI { @@ -60,7 +62,8 @@ class WebBrowserChrome : public nsIWebBrowserChrome, public nsIWebProgressListener, public nsIBaseWindow, // public nsIPrompt, - public nsIInterfaceRequestor + public nsIInterfaceRequestor, + public nsSupportsWeakReference { public: WebBrowserChrome();