зеркало из https://github.com/mozilla/gecko-dev.git
sr=scc. 68187. making weak reference implementation on the browser listener part requirement explicit. API change.
This commit is contained in:
Родитель
ccfa389edd
Коммит
9297191086
|
@ -1077,7 +1077,9 @@ HRESULT CMozillaBrowser::CreateBrowser()
|
|||
mWebBrowserAsWin->SetVisibility(PR_TRUE);
|
||||
|
||||
// Subscribe for progress notifications
|
||||
mWebBrowser->AddWebBrowserListener(NS_STATIC_CAST(nsIWebBrowserChrome*, mWebBrowserContainer), NS_GET_IID(nsIWebProgressListener));
|
||||
nsCOMPtr<nsIWeakReference> listener(
|
||||
dont_AddRef(NS_GetWeakReference(NS_STATIC_CAST(nsIWebProgressListener*, mWebBrowserContainer))));
|
||||
mWebBrowser->AddWebBrowserListener(listener, NS_GET_IID(nsIWebProgressListener));
|
||||
|
||||
mValidBrowserFlag = TRUE;
|
||||
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
#include "nsIDocument.h"
|
||||
#include "nsIDOMHTMLCollection.h"
|
||||
#include "nsIWebBrowserFind.h"
|
||||
#include "nsWeakPtr.h"
|
||||
|
||||
#include <UModalDialogs.h>
|
||||
#include <LStream.h>
|
||||
|
@ -450,7 +451,8 @@ NS_IMETHODIMP CBrowserShell::SetTopLevelWindow(nsIWebBrowserChrome * aTopLevelWi
|
|||
|
||||
mWebBrowser->SetContainerWindow(aTopLevelWindow);
|
||||
if (aTopLevelWindow) {
|
||||
rv = mWebBrowser->AddWebBrowserListener(aTopLevelWindow, NS_GET_IID(nsIWebProgressListener));
|
||||
nsWeakPtr weakling(dont_AddRef(NS_GetWeakReference(aTopLevelWindow)));
|
||||
rv = mWebBrowser->AddWebBrowserListener(weakling, NS_GET_IID(nsIWebProgressListener));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Call to AddWebBrowserListener failed");
|
||||
}
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ interface nsIInterfaceRequestor;
|
|||
interface nsIWebBrowserChrome;
|
||||
interface nsIURIContentListener;
|
||||
interface nsIDOMWindow;
|
||||
interface nsIWeakReference;
|
||||
|
||||
/**
|
||||
* The nsIWebBrowser
|
||||
|
@ -50,7 +51,7 @@ interface nsIWebBrowser : nsISupports
|
|||
for the specified IID, or some other internal error
|
||||
occurred.
|
||||
*/
|
||||
void addWebBrowserListener(in nsISupports aListener, in nsIIDRef aIID);
|
||||
void addWebBrowserListener(in nsIWeakReference aListener, in nsIIDRef aIID);
|
||||
|
||||
/*
|
||||
Removes a previously registered listener.
|
||||
|
@ -66,7 +67,7 @@ interface nsIWebBrowser : nsISupports
|
|||
for the specified IID, or some other internal error
|
||||
occurred.
|
||||
*/
|
||||
void removeWebBrowserListener(in nsISupports aListener, in nsIIDRef aIID);
|
||||
void removeWebBrowserListener(in nsIWeakReference aListener, in nsIIDRef aIID);
|
||||
|
||||
/*
|
||||
This is the top level window embedding the browser. The object passed in
|
||||
|
|
|
@ -156,17 +156,11 @@ NS_IMETHODIMP nsWebBrowser::GetInterface(const nsIID& aIID, void** aSink)
|
|||
|
||||
// listeners that currently support registration through AddWebBrowserListener:
|
||||
// - nsIWebProgressListener
|
||||
NS_IMETHODIMP nsWebBrowser::AddWebBrowserListener(nsISupports *aListener, const nsIID& aIID)
|
||||
NS_IMETHODIMP nsWebBrowser::AddWebBrowserListener(nsIWeakReference *aListener, const nsIID& aIID)
|
||||
{
|
||||
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.
|
||||
|
@ -174,7 +168,7 @@ NS_IMETHODIMP nsWebBrowser::AddWebBrowserListener(nsISupports *aListener, const
|
|||
NS_NEWXPCOM(state, nsWebBrowserListenerState);
|
||||
if (!state) return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
state->mWeakPtr = listener;
|
||||
state->mWeakPtr = aListener;
|
||||
state->mID = aIID;
|
||||
|
||||
if (!mListenerArray) {
|
||||
|
@ -184,7 +178,9 @@ NS_IMETHODIMP nsWebBrowser::AddWebBrowserListener(nsISupports *aListener, const
|
|||
|
||||
if (!mListenerArray->AppendElement(state)) return NS_ERROR_OUT_OF_MEMORY;
|
||||
} else {
|
||||
rv = BindListener(aListener, aIID);
|
||||
nsCOMPtr<nsISupports> supports(do_QueryReferent(aListener));
|
||||
if (!supports) return NS_ERROR_INVALID_ARG;
|
||||
rv = BindListener(supports, aIID);
|
||||
}
|
||||
|
||||
return rv;
|
||||
|
@ -211,7 +207,7 @@ NS_IMETHODIMP nsWebBrowser::BindListener(nsISupports *aListener, const nsIID& aI
|
|||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsWebBrowser::RemoveWebBrowserListener(nsISupports *aListener, const nsIID& aIID)
|
||||
NS_IMETHODIMP nsWebBrowser::RemoveWebBrowserListener(nsIWeakReference *aListener, const nsIID& aIID)
|
||||
{
|
||||
nsresult rv = NS_ERROR_INVALID_ARG;
|
||||
NS_ENSURE_ARG_POINTER(aListener);
|
||||
|
@ -243,6 +239,8 @@ NS_IMETHODIMP nsWebBrowser::RemoveWebBrowserListener(nsISupports *aListener, con
|
|||
}
|
||||
|
||||
} else {
|
||||
nsCOMPtr<nsISupports> supports(do_QueryReferent(aListener));
|
||||
if (!supports) return NS_ERROR_INVALID_ARG;
|
||||
rv = UnBindListener(aListener, aIID);
|
||||
}
|
||||
|
||||
|
|
|
@ -70,9 +70,8 @@ public:
|
|||
class nsWebBrowserListenerState
|
||||
{
|
||||
public:
|
||||
PRBool Equals(nsISupports *aListener, const nsIID& aID) {
|
||||
nsCOMPtr<nsISupports> listener = do_QueryReferent(mWeakPtr);
|
||||
if (listener.get() == aListener && mID.Equals(aID)) return PR_TRUE;
|
||||
PRBool Equals(nsIWeakReference *aListener, const nsIID& aID) {
|
||||
if (mWeakPtr.get() == aListener && mID.Equals(aID)) return PR_TRUE;
|
||||
return PR_FALSE;
|
||||
};
|
||||
|
||||
|
|
|
@ -222,9 +222,9 @@ HRESULT CBrowserView::CreateBrowser()
|
|||
|
||||
// Register the BrowserImpl object to receive progress messages
|
||||
// These callbacks will be used to update the status/progress bars
|
||||
nsCOMPtr<nsIWebProgressListener> listener = NS_STATIC_CAST(nsIWebProgressListener*, mpBrowserImpl);
|
||||
nsCOMPtr<nsISupports> supports = do_QueryInterface(listener);
|
||||
(void)mWebBrowser->AddWebBrowserListener(supports,
|
||||
nsWeakPtr weakling(
|
||||
dont_AddRef(NS_GetWeakReference(NS_STATIC_CAST(nsIWebProgressListener*, mpBrowserImpl))));
|
||||
(void)mWebBrowser->AddWebBrowserListener(weakling,
|
||||
NS_GET_IID(nsIWebProgressListener));
|
||||
|
||||
// Finally, show the web browser window
|
||||
|
|
|
@ -164,13 +164,13 @@ nsresult WebBrowserChrome::CreateBrowser(PRInt32 aX, PRInt32 aY,
|
|||
aX, aY, aCX, aCY);
|
||||
mBaseWindow->Create();
|
||||
|
||||
nsCOMPtr<nsIWebProgressListener> listener = NS_STATIC_CAST(nsIWebProgressListener*, this);
|
||||
nsCOMPtr<nsISupports> supports = do_QueryInterface(listener);
|
||||
(void)mWebBrowser->AddWebBrowserListener(supports,
|
||||
nsCOMPtr<nsIWebProgressListener> listener(NS_STATIC_CAST(nsIWebProgressListener*, this));
|
||||
nsCOMPtr<nsIWeakReference> thisListener(dont_AddRef(NS_GetWeakReference(listener)));
|
||||
(void)mWebBrowser->AddWebBrowserListener(thisListener,
|
||||
NS_GET_IID(nsIWebProgressListener));
|
||||
|
||||
// The window has been created. Now register for history notifications
|
||||
mWebBrowser->AddWebBrowserListener(supports, NS_GET_IID(nsISHistoryListener));
|
||||
mWebBrowser->AddWebBrowserListener(thisListener, NS_GET_IID(nsISHistoryListener));
|
||||
|
||||
if (mWebBrowser) {
|
||||
*aBrowser = mWebBrowser;
|
||||
|
|
|
@ -1408,7 +1408,9 @@ nsBrowserWindow::Init(nsIAppShell* aAppShell,
|
|||
rv = webBrowserWin->InitWindow(mWindow->GetNativeData(NS_NATIVE_WIDGET), nsnull, r.x, r.y, r.width, r.height);
|
||||
NS_ENSURE_SUCCESS(EnsureWebBrowserChrome(), NS_ERROR_FAILURE);
|
||||
mWebBrowser->SetContainerWindow(mWebBrowserChrome);
|
||||
mWebBrowser->AddWebBrowserListener((nsIWebProgressListener *)(mWebBrowserChrome), NS_GET_IID(nsIWebProgressListener));
|
||||
nsWeakPtr weakling(
|
||||
dont_AddRef(NS_GetWeakReference((nsIWebProgressListener*)mWebBrowserChrome)));
|
||||
mWebBrowser->AddWebBrowserListener(weakling, NS_GET_IID(nsIWebProgressListener));
|
||||
|
||||
webBrowserWin->Create();
|
||||
mDocShell = do_GetInterface(mWebBrowser);
|
||||
|
|
Загрузка…
Ссылка в новой задаче