r=ccarlen, sr=rpotts. 46848. Reworking listener registration interface. collection type listeners should be registered here. removing nsIWebProgress implementation from nsWebBrowser adfter determining GetDOMWindow() wasn't being used.

git-svn-id: svn://10.0.0.236/trunk@85141 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
valeski%netscape.com 2001-01-19 06:00:23 +00:00
parent 8dd8b6a35d
commit 221a69dbb2
3 changed files with 72 additions and 87 deletions

View File

@ -34,35 +34,39 @@ interface nsIDOMWindow;
[scriptable, uuid(69E5DF00-7B8B-11d3-AF61-00A024FFC08C)]
interface nsIWebBrowser : nsISupports
{
/*
Registers a webBrowserListener to receive queries for listener interfaces.
This allows an embedding app to hook itself up to handle various listeners
that nsWebBrowser supports throwing. This process allows multiple people
to register a listeners of the nsWebBrowser. Each one has the option
to handle only certain interfaces. The callback process of
nsIWebBrowserListener allows us to dynamically add new listener interfaces
without having to add additional Add/RemoveFooListener().
@param listener - The listener interface to be called when a specific
listener interface is needed.
@return NS_OK - Listener was registered successfully.
NS_ERROR_INVALID_ARG - The listener passed in was either nsnull,
or was already registered with this listener interface.
*/
void addWebBrowserListener(in nsIInterfaceRequestor listener);
/*
Removes a previously registered webBrowserListener.
@param listener - The listener interface previously registered with
addListener() this may be nsnull if a valid cookie is provided.
Registers a listener to receive callbacks.
@return NS_OK - Listener was successfully unregistered.
NS_ERROR_INVALID_ARG - Neither the cookie nor the listener point
to a previously registered listener.
@param aListener - The listener interface pointer who's methods will be
called as defined by the semantics of the listener
interface itself (specified by the IID).
@param aIID - The IID that aListener will be registered as.
@return - NS_OK, successful registration.
NS_ERROR_INVALID_ARG, aIID is not supposed to be
registered using this method.
NS_ERROR_FAILURE, either aListener could not be QI'd
for the specified IID, or some other internal error
occurred.
*/
void removeWebBrowserListener(in nsIInterfaceRequestor listener);
void addWebBrowserListener(in nsISupports aListener, in nsIIDRef aIID);
/*
Removes a previously registered listener.
@param aListener - The listener interface pointer to be removed as a listener.
@param aIID - The IID that aListener should be removed as a listener
for.
@return - NS_OK, successful removal
NS_ERROR_INVALID_ARG, aIID is not supported for removal.
NS_ERROR_FAILURE, either aListener could not be QI'd
for the specified IID, or some other internal error
occurred.
*/
void removeWebBrowserListener(in nsISupports aListener, in nsIIDRef aIID);
/*
This is the top level window embedding the browser. The object passed in

View File

@ -40,6 +40,7 @@
#include "nsPIDOMWindow.h"
#include "nsIFocusController.h"
#include "nsIDOMWindowInternal.h"
#include "nsIWebProgress.h"
static NS_DEFINE_CID(kWebShellCID, NS_WEB_SHELL_CID);
static NS_DEFINE_IID(kChildCID, NS_CHILD_CID);
@ -102,7 +103,6 @@ NS_INTERFACE_MAP_BEGIN(nsWebBrowser)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebBrowser)
NS_INTERFACE_MAP_ENTRY(nsIWebBrowser)
NS_INTERFACE_MAP_ENTRY(nsIWebNavigation)
NS_INTERFACE_MAP_ENTRY(nsIWebProgress)
NS_INTERFACE_MAP_ENTRY(nsIBaseWindow)
NS_INTERFACE_MAP_ENTRY(nsIScrollable)
NS_INTERFACE_MAP_ENTRY(nsITextScroll)
@ -133,28 +133,44 @@ NS_IMETHODIMP nsWebBrowser::GetInterface(const nsIID& aIID, void** aSink)
// nsWebBrowser::nsIWebBrowser
//*****************************************************************************
NS_IMETHODIMP nsWebBrowser::AddWebBrowserListener(nsIInterfaceRequestor* aListener)
{
if(!mListenerList)
NS_ENSURE_SUCCESS(NS_NewISupportsArray(getter_AddRefs(mListenerList)),
NS_ERROR_FAILURE);
// listeners that currently support registration through AddWebBrowserListener:
// - nsIWebProgressListener
NS_IMETHODIMP nsWebBrowser::AddWebBrowserListener(nsISupports *aListener, const nsIID& aIID)
{
nsresult rv = NS_ERROR_INVALID_ARG;
NS_ENSURE_ARG_POINTER(aListener);
// Make sure it isn't already in the list... This is bad!
NS_ENSURE_TRUE(mListenerList->IndexOf(aListener) == -1, NS_ERROR_INVALID_ARG);
// register this listener for the specified interface id
if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) {
if (mDocShell) {
nsCOMPtr<nsIWebProgress> progress(do_GetInterface(mDocShell, &rv));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIWebProgressListener> listener = do_QueryInterface(aListener, &rv);
if (NS_FAILED(rv)) return rv;
rv = progress->AddProgressListener(listener);
}
}
NS_ENSURE_SUCCESS(mListenerList->AppendElement(aListener), NS_ERROR_FAILURE);
return NS_OK;
return rv;
}
NS_IMETHODIMP nsWebBrowser::RemoveWebBrowserListener(nsIInterfaceRequestor* aListener)
NS_IMETHODIMP nsWebBrowser::RemoveWebBrowserListener(nsISupports *aListener, const nsIID& aIID)
{
NS_ENSURE_STATE(mListenerList);
NS_ENSURE_ARG(aListener);
nsresult rv = NS_ERROR_INVALID_ARG;
NS_ENSURE_ARG_POINTER(aListener);
NS_ENSURE_TRUE(mListenerList->RemoveElement(aListener), NS_ERROR_INVALID_ARG);
return NS_OK;
// un-register this listener for the specified interface id
if (aIID.Equals(NS_GET_IID(nsIWebProgressListener))) {
if (mDocShell) {
nsCOMPtr<nsIWebProgress> progress(do_GetInterface(mDocShell, &rv));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIWebProgressListener> listener = do_QueryInterface(aListener, &rv);
if (NS_FAILED(rv)) return rv;
rv = progress->RemoveProgressListener(listener);
}
}
return rv;
}
NS_IMETHODIMP nsWebBrowser::GetContainerWindow(nsIWebBrowserChrome** aTopWindow)
@ -574,37 +590,6 @@ NS_IMETHODIMP nsWebBrowser::SaveDocument(nsIDOMDocument *aDocument, const char *
return rv;
}
//*****************************************************************************
// nsWebBrowser::nsIWebProgress
//*****************************************************************************
NS_IMETHODIMP nsWebBrowser::AddProgressListener(nsIWebProgressListener* aListener)
{
NS_ENSURE_STATE(mDocShell);
return mDocShellAsProgress->AddProgressListener(aListener);
}
NS_IMETHODIMP nsWebBrowser::RemoveProgressListener(nsIWebProgressListener* aListener)
{
NS_ENSURE_STATE(mDocShell);
return mDocShellAsProgress->RemoveProgressListener(aListener);
}
NS_IMETHODIMP nsWebBrowser::GetDOMWindow(nsIDOMWindow **aResult)
{
nsresult rv = NS_ERROR_FAILURE;
*aResult = nsnull;
if (mDocShell) {
rv = mDocShellAsProgress->GetDOMWindow(aResult);
}
return rv;
}
//*****************************************************************************
// nsWebBrowser::nsIBaseWindow
//*****************************************************************************
@ -1098,28 +1083,30 @@ NS_IMETHODIMP nsWebBrowser::SetDocShell(nsIDocShell* aDocShell)
nsCOMPtr<nsIBaseWindow> baseWin(do_QueryInterface(aDocShell));
nsCOMPtr<nsIDocShellTreeItem> item(do_QueryInterface(aDocShell));
nsCOMPtr<nsIWebNavigation> nav(do_QueryInterface(aDocShell));
nsCOMPtr<nsIWebProgress> progress(do_GetInterface(aDocShell));
nsCOMPtr<nsIScrollable> scrollable(do_QueryInterface(aDocShell));
nsCOMPtr<nsITextScroll> textScroll(do_QueryInterface(aDocShell));
NS_ENSURE_TRUE(req && baseWin && item && nav && scrollable && textScroll &&
progress, NS_ERROR_FAILURE);
NS_ENSURE_TRUE(req && baseWin && item && nav && scrollable && textScroll, NS_ERROR_FAILURE);
mDocShell = aDocShell;
mDocShellAsReq = req;
mDocShellAsWin = baseWin;
mDocShellAsItem = item;
mDocShellAsNav = nav;
mDocShellAsProgress = progress;
mDocShellAsScrollable = scrollable;
mDocShellAsTextScroll = textScroll;
AddProgressListener(NS_STATIC_CAST(nsIWebProgressListener *, mDocShellTreeOwner));
nsCOMPtr<nsIWebProgressListener> listener =
NS_STATIC_CAST(nsIWebProgressListener*, mDocShellTreeOwner);
(void)AddWebBrowserListener(listener,
NS_GET_IID(nsIWebProgressListener));
}
else
{
if (mDocShell)
{
RemoveProgressListener(NS_STATIC_CAST(nsIWebProgressListener *, mDocShellTreeOwner));
nsCOMPtr<nsIWebProgressListener> listener =
NS_STATIC_CAST(nsIWebProgressListener*, mDocShellTreeOwner);
(void)RemoveWebBrowserListener(listener, NS_GET_IID(nsIWebProgressListener));
mDocShellAsWin->Destroy();
}
mDocShell = nsnull;
@ -1127,7 +1114,6 @@ NS_IMETHODIMP nsWebBrowser::SetDocShell(nsIDocShell* aDocShell)
mDocShellAsWin = nsnull;
mDocShellAsItem = nsnull;
mDocShellAsNav = nsnull;
mDocShellAsProgress = nsnull;
mDocShellAsScrollable = nsnull;
mDocShellAsTextScroll = nsnull;
}

View File

@ -44,7 +44,6 @@
#include "nsIWebBrowser.h"
#include "nsIWebNavigation.h"
#include "nsIWebProgress.h"
#include "nsIWebBrowserSetup.h"
#include "nsIWebBrowserPersist.h"
@ -64,7 +63,6 @@ public:
class nsWebBrowser : public nsIWebBrowser,
public nsIWebNavigation,
public nsIWebProgress,
public nsIWebBrowserSetup,
public nsIDocShellTreeItem,
public nsIBaseWindow,
@ -87,7 +85,6 @@ public:
NS_DECL_NSITEXTSCROLL
NS_DECL_NSIWEBBROWSER
NS_DECL_NSIWEBNAVIGATION
NS_DECL_NSIWEBPROGRESS
NS_DECL_NSIWEBBROWSERSETUP
NS_DECL_NSIWEBBROWSERPERSIST
@ -105,13 +102,11 @@ protected:
protected:
nsDocShellTreeOwner* mDocShellTreeOwner;
nsWBURIContentListener* mContentListener;
nsCOMPtr<nsISupportsArray> mListenerList;
nsCOMPtr<nsIDocShell> mDocShell;
nsCOMPtr<nsIInterfaceRequestor> mDocShellAsReq;
nsCOMPtr<nsIBaseWindow> mDocShellAsWin;
nsCOMPtr<nsIDocShellTreeItem> mDocShellAsItem;
nsCOMPtr<nsIWebNavigation> mDocShellAsNav;
nsCOMPtr<nsIWebProgress> mDocShellAsProgress;
nsCOMPtr<nsIScrollable> mDocShellAsScrollable;
nsCOMPtr<nsITextScroll> mDocShellAsTextScroll;
nsCOMPtr<nsIWidget> mInternalWidget;