sr=scc. 68187. making weak reference implementation on the browser listener part requirement explicit. API change.

This commit is contained in:
valeski%netscape.com 2001-02-14 03:12:33 +00:00
Родитель ccfa389edd
Коммит 9297191086
8 изменённых файлов: 29 добавлений и 25 удалений

Просмотреть файл

@ -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);