зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
70dd39508b
Коммит
7d3acb0d42
|
@ -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();
|
||||
|
|
Загрузка…
Ссылка в новой задаче