r=ccarlen, sr=rpotts. 65925. adding support for listener queueing in the webbrowser, and weak reference support to webprogress listeners.

This commit is contained in:
valeski%netscape.com 2001-01-31 21:03:40 +00:00
Родитель 70dd39508b
Коммит 7d3acb0d42
12 изменённых файлов: 190 добавлений и 75 удалений

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

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

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

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

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

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

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

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

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

@ -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
//*****************************************************************************

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

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

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

@ -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<nsIBaseWindow> baseWin(do_QueryInterface(aWebBrowserChrome));
nsCOMPtr<nsIInterfaceRequestor> requestor(do_QueryInterface(aWebBrowserChrome));
nsCOMPtr<nsIWebProgressListener> progressListener(do_QueryInterface(aWebBrowserChrome));
NS_ENSURE_TRUE(baseWin, NS_ERROR_INVALID_ARG);
mWebBrowserChrome = aWebBrowserChrome;
mOwnerWin = baseWin;
mOwnerProgressListener = progressListener;
mOwnerRequestor = requestor;
}
return NS_OK;

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

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

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

@ -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<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);
}
nsCOMPtr<nsIWebProgressListener> 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<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);
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<nsIWebProgressListener> 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<nsIDocShell> 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<nsISupports> 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<nsISupports> 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<nsIWebNavigation> nav(do_QueryInterface(aDocShell));
nsCOMPtr<nsIScrollable> scrollable(do_QueryInterface(aDocShell));
nsCOMPtr<nsITextScroll> textScroll(do_QueryInterface(aDocShell));
NS_ENSURE_TRUE(req && baseWin && item && nav && scrollable && textScroll, NS_ERROR_FAILURE);
nsCOMPtr<nsIWebProgress> 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<nsIWebProgressListener> listener =
NS_STATIC_CAST(nsIWebProgressListener*, mDocShellTreeOwner);
(void)AddWebBrowserListener(listener,
NS_GET_IID(nsIWebProgressListener));
mWebProgress = progress;
}
else
{
if (mDocShell)
{
nsCOMPtr<nsIWebProgressListener> 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;

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

@ -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<nsISupports> 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<nsIWebProgress> mWebProgress;
//Weak Reference interfaces...
nsIWidget* mParentWidget;
nsIDocShellTreeItem* mParent;
nsVoidArray * mListenerArray;
};

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

@ -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<nsIDocShellTreeItem> 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<nsIWebProgressListener> listener = NS_STATIC_CAST(nsIWebProgressListener*, this);
nsCOMPtr<nsISupports> supports = do_QueryInterface(listener);
(void)mWebBrowser->AddWebBrowserListener(supports,
NS_GET_IID(nsIWebProgressListener));
NS_IF_ADDREF(*aWebBrowser = mWebBrowser);
return NS_OK;

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

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