From 406f61beb368f4336ca2c0b3e53e165933161fb1 Mon Sep 17 00:00:00 2001 From: "rpotts%netscape.com" Date: Mon, 19 Jun 2000 05:54:37 +0000 Subject: [PATCH] Reworked the nsIWebProgress interfaces and implementation... git-svn-id: svn://10.0.0.236/trunk@72533 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/docshell/base/Makefile.in | 2 +- mozilla/docshell/base/makefile.win | 2 +- .../docshell/base/nsDSURIContentListener.cpp | 2 +- .../docshell/base/nsDSWebProgressListener.cpp | 3 + mozilla/docshell/base/nsDocShell.cpp | 289 +----- mozilla/docshell/base/nsDocShell.h | 20 - mozilla/docshell/base/nsWebShell.cpp | 3 +- .../src/control/WebBrowserContainer.cpp | 118 ++- .../browser/gtk/src/GtkMozEmbedChrome.cpp | 67 +- .../embedding/browser/gtk/src/gtkmozembed.cpp | 22 +- .../embedding/browser/gtk/src/gtkmozembed.h | 35 +- .../embedding/browser/gtk/src/nsIGtkEmbed.h | 2 +- .../browser/gtk/tests/TestGtkEmbed.cpp | 51 +- .../powerplant/source/CBrowserShell.cpp | 2 +- .../powerplant/source/CWebBrowserChrome.cpp | 31 +- .../webBrowser/nsDocShellTreeOwner.cpp | 52 +- .../browser/webBrowser/nsWebBrowser.cpp | 2 +- .../mailnews/base/src/nsMsgStatusFeedback.cpp | 70 +- mozilla/mailnews/base/src/nsMsgWindow.cpp | 2 +- mozilla/uriloader/base/nsDocLoader.cpp | 879 ++++++++++++------ mozilla/uriloader/base/nsDocLoader.h | 43 +- mozilla/uriloader/base/nsIDocumentLoader.idl | 2 + .../uriloader/base/nsIWebProgressListener.idl | 133 +-- mozilla/uriloader/base/nsURILoader.cpp | 13 - mozilla/webshell/src/nsWebShell.cpp | 3 +- .../tests/viewer/nsWebBrowserChrome.cpp | 201 ++-- .../tests/viewer/nsWebBrowserChrome.h | 9 +- .../xpfe/appshell/src/nsChromeTreeOwner.cpp | 29 +- .../browser/resources/content/navigator.js | 127 +-- .../xpfe/browser/src/nsBrowserInstance.cpp | 59 +- 30 files changed, 1207 insertions(+), 1066 deletions(-) diff --git a/mozilla/docshell/base/Makefile.in b/mozilla/docshell/base/Makefile.in index 791266b461a..065f5decb96 100644 --- a/mozilla/docshell/base/Makefile.in +++ b/mozilla/docshell/base/Makefile.in @@ -45,7 +45,7 @@ CPPSRCS = \ nsDocShell.cpp \ nsDocShellLoadInfo.cpp \ nsDSURIContentListener.cpp \ - nsDSWebProgressListener.cpp \ +# nsDSWebProgressListener.cpp \ $(NULL) # we don't want the shared lib, but we want to force the creation of a diff --git a/mozilla/docshell/base/makefile.win b/mozilla/docshell/base/makefile.win index e001e530fec..55b6fb661fe 100644 --- a/mozilla/docshell/base/makefile.win +++ b/mozilla/docshell/base/makefile.win @@ -43,7 +43,7 @@ CPP_OBJS= \ .\$(OBJDIR)\nsDocShell.obj \ .\$(OBJDIR)\nsDocShellLoadInfo.obj \ .\$(OBJDIR)\nsDSURIContentListener.obj \ - .\$(OBJDIR)\nsDSWebProgressListener.obj \ +# .\$(OBJDIR)\nsDSWebProgressListener.obj \ $(NULL) include <$(DEPTH)\config\rules.mak> diff --git a/mozilla/docshell/base/nsDSURIContentListener.cpp b/mozilla/docshell/base/nsDSURIContentListener.cpp index 6281cd84e47..7423135acf4 100644 --- a/mozilla/docshell/base/nsDSURIContentListener.cpp +++ b/mozilla/docshell/base/nsDSURIContentListener.cpp @@ -92,7 +92,7 @@ NS_IMETHODIMP nsDSURIContentListener::DoContent(const char* aContentType, aOpenedChannel->GetLoadAttributes(&loadAttribs); if(loadAttribs & nsIChannel::LOAD_RETARGETED_DOCUMENT_URI) - mDocShell->StopCurrentLoads(); + mDocShell->StopLoad(); mDocShell->OnLoadingSite(aOpenedChannel); diff --git a/mozilla/docshell/base/nsDSWebProgressListener.cpp b/mozilla/docshell/base/nsDSWebProgressListener.cpp index 3f652caba80..c3ec6841a49 100644 --- a/mozilla/docshell/base/nsDSWebProgressListener.cpp +++ b/mozilla/docshell/base/nsDSWebProgressListener.cpp @@ -19,6 +19,7 @@ * Contributor(s): * Travis Bogard */ +#if 0 /* This file is now longer used... */ // Local Includes #include "nsDocShell.h" @@ -140,3 +141,5 @@ nsDocShell* nsDSWebProgressListener::DocShell() { return mDocShell; } + +#endif /* 0 */ diff --git a/mozilla/docshell/base/nsDocShell.cpp b/mozilla/docshell/base/nsDocShell.cpp index 468090907ba..257d8ecf141 100644 --- a/mozilla/docshell/base/nsDocShell.cpp +++ b/mozilla/docshell/base/nsDocShell.cpp @@ -80,7 +80,6 @@ static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CI nsDocShell::nsDocShell() : mContentListener(nsnull), - mWebProgressListener(nsnull), mInitInfo(nsnull), mMarginWidth(0), mMarginHeight(0), @@ -133,7 +132,6 @@ NS_INTERFACE_MAP_BEGIN(nsDocShell) NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeItem) NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeNode) 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) @@ -154,9 +152,6 @@ NS_IMETHODIMP nsDocShell::GetInterface(const nsIID& aIID, void** aSink) if(aIID.Equals(NS_GET_IID(nsIURIContentListener)) && NS_SUCCEEDED(EnsureContentListener())) *aSink = mContentListener; - else if(aIID.Equals(NS_GET_IID(nsIWebProgressListener)) && - NS_SUCCEEDED(EnsureWebProgressListener())) - *aSink = mWebProgressListener; else if(aIID.Equals(NS_GET_IID(nsIScriptGlobalObject)) && NS_SUCCEEDED(EnsureScriptEnvironment())) *aSink = mScriptGlobal; @@ -179,15 +174,18 @@ NS_IMETHODIMP nsDocShell::GetInterface(const nsIID& aIID, void** aSink) else return NS_NOINTERFACE; } - else if (aIID.Equals(NS_GET_IID(nsIProgressEventSink))) + else if (aIID.Equals(NS_GET_IID(nsIProgressEventSink)) || + aIID.Equals(NS_GET_IID(nsIWebProgress))) { nsCOMPtr uriLoader(do_GetService(NS_URI_LOADER_PROGID)); NS_ENSURE_TRUE(uriLoader, NS_ERROR_FAILURE); nsCOMPtr docLoader; NS_ENSURE_SUCCESS(uriLoader->GetDocumentLoaderForContext(NS_STATIC_CAST(nsIDocShell*, this), getter_AddRefs(docLoader)), NS_ERROR_FAILURE); - if (docLoader) - return docLoader->QueryInterface(aIID, aSink); + if (docLoader) { + nsCOMPtr requestor(do_QueryInterface(docLoader)); + return requestor->GetInterface(aIID, aSink); + } else return NS_ERROR_FAILURE; } @@ -775,15 +773,25 @@ NS_IMETHODIMP nsDocShell::GetTreeOwner(nsIDocShellTreeOwner** aTreeOwner) NS_IMETHODIMP nsDocShell::SetTreeOwner(nsIDocShellTreeOwner* aTreeOwner) { - mTreeOwner = aTreeOwner; // Weak reference per API // Don't automatically set the progress based on the tree owner for frames - if(!IsFrame()) - { - nsCOMPtr progressListener(do_QueryInterface(aTreeOwner)); - mOwnerProgressListener = progressListener; // Weak reference per API + if (!IsFrame()) { + nsCOMPtr webProgress(do_GetInterface(mLoadCookie)); + + if (webProgress) { + nsCOMPtr oldListener(do_QueryInterface(mTreeOwner)); + nsCOMPtr newListener(do_QueryInterface(aTreeOwner)); + + if (oldListener) { + webProgress->RemoveProgressListener(oldListener); } - else - mOwnerProgressListener = nsnull; + + if (newListener) { + webProgress->AddProgressListener(newListener); + } + } + } + + mTreeOwner = aTreeOwner; // Weak reference per API PRInt32 i, n = mChildren.Count(); for(i = 0; i < n; i++) @@ -1188,96 +1196,6 @@ NS_IMETHODIMP nsDocShell::GetSessionHistory(nsISHistory** aSessionHistory) NS_IF_ADDREF(*aSessionHistory); return NS_OK; } - -//***************************************************************************** -// nsDocShell::nsIWebProgress -//***************************************************************************** - -NS_IMETHODIMP nsDocShell::AddProgressListener(nsIWebProgressListener* aListener) -{ - if(!mWebProgressListenerList) - NS_ENSURE_SUCCESS(NS_NewISupportsArray(getter_AddRefs(mWebProgressListenerList)), - NS_ERROR_FAILURE); - - // Make sure it isn't already in the list... This is bad! - NS_ENSURE_ARG(mWebProgressListenerList->IndexOf(aListener) == -1); - - NS_ENSURE_SUCCESS(mWebProgressListenerList->AppendElement(aListener), - NS_ERROR_FAILURE); - - return NS_OK; -} - -NS_IMETHODIMP nsDocShell::RemoveProgressListener(nsIWebProgressListener* aListener) -{ - NS_ENSURE_STATE(mWebProgressListenerList); - NS_ENSURE_ARG(aListener); - - NS_ENSURE_TRUE(mWebProgressListenerList->RemoveElement(aListener), - NS_ERROR_INVALID_ARG); - - return NS_OK; -} - -NS_IMETHODIMP nsDocShell::GetProgressStatusFlags(PRInt32* aProgressStatusFlags) -{ - //XXXTAB First Check - //XXX First Check - /* - Current connection Status of the browser. This will be one of the enumerated - connection progress steps. - */ - return NS_ERROR_FAILURE; -} - -NS_IMETHODIMP nsDocShell::GetCurSelfProgress(PRInt32* curSelfProgress) -{ - //XXXTAB First Check - //XXX First Check - /* - The current position of progress. This is between 0 and maxSelfProgress. - This is the position of only this progress object. It doesn not include - the progress of all children. - */ - return NS_ERROR_FAILURE; -} - -NS_IMETHODIMP nsDocShell::GetMaxSelfProgress(PRInt32* maxSelfProgress) -{ - //XXXTAB First Check - //XXX First Check - /* - The maximum position that progress will go to. This sets a relative - position point for the current progress to relate to. This is the max - position of only this progress object. It does not include the progress of - all the children. - */ - return NS_ERROR_FAILURE; -} - -NS_IMETHODIMP nsDocShell::GetCurTotalProgress(PRInt32* curTotalProgress) -{ - //XXXTAB First Check - //XXX First Check - /* - The current position of progress for this object and all children added - together. This is between 0 and maxTotalProgress. - */ - return NS_ERROR_FAILURE; -} - -NS_IMETHODIMP nsDocShell::GetMaxTotalProgress(PRInt32* maxTotalProgress) -{ - //XXXTAB First Check - //XXX First Check - /* - The maximum position that progress will go to for the max of this progress - object and all children. This sets the relative position point for the - current progress to relate to. - */ - return NS_ERROR_FAILURE; -} - //***************************************************************************** // nsDocShell::nsIBaseWindow //***************************************************************************** @@ -1328,7 +1246,6 @@ NS_IMETHODIMP nsDocShell::Destroy() mParentWidget = nsnull; mPrefs = nsnull; mCurrentURI = nsnull; - mWebProgressListenerList = nsnull; if(mScriptGlobal) { @@ -1359,12 +1276,6 @@ NS_IMETHODIMP nsDocShell::Destroy() NS_RELEASE(mContentListener); } - if(mWebProgressListener) - { - mWebProgressListener->DocShell(nsnull); - NS_RELEASE(mWebProgressListener); - } - return NS_OK; } @@ -2396,7 +2307,7 @@ NS_IMETHODIMP nsDocShell::InternalLoad(nsIURI* aURI, nsIURI* aReferrer, } } - NS_ENSURE_SUCCESS(StopCurrentLoads(), NS_ERROR_FAILURE); + NS_ENSURE_SUCCESS(StopLoad(), NS_ERROR_FAILURE); // Cancel any timers that were set for this loader. CancelRefreshURITimers(); @@ -2759,12 +2670,6 @@ NS_IMETHODIMP nsDocShell::DoURILoad(nsIURI* aURI, nsIURI* aReferrerURI, return NS_OK; } -NS_IMETHODIMP nsDocShell::StopCurrentLoads() -{ - StopLoad(); - return NS_OK; -} - NS_IMETHODIMP nsDocShell::ScrollIfAnchor(nsIURI* aURI, PRBool* aWasAnchor) { NS_ASSERTION(aURI, "null uri arg"); @@ -2883,7 +2788,6 @@ void nsDocShell::OnNewURI(nsIURI *aURI, nsIChannel *aChannel, loadType aLoadType NS_ASSERTION(aURI, "uri is null"); UpdateCurrentGlobalHistory(); - PRBool updateHistory = PR_TRUE; // Determine if this type of load should update history @@ -3026,7 +2930,13 @@ NS_IMETHODIMP nsDocShell::OnLoadingSite(nsIChannel* aChannel) void nsDocShell::SetCurrentURI(nsIURI* aURI) { mCurrentURI = aURI; //This assignment addrefs - FireOnLocationChange(aURI); + + nsCOMPtr loader(do_GetInterface(mLoadCookie)); + + NS_ASSERTION(loader, "No document loader"); + if (loader) { + loader->FireOnLocationChange(aURI); + } } void nsDocShell::SetReferrerURI(nsIURI* aURI) @@ -3249,143 +3159,6 @@ NS_IMETHODIMP nsDocShell::UpdateCurrentGlobalHistory() return NS_OK; } -//***************************************************************************** -// nsDocShell: WebProgressListener Firing -//***************************************************************************** - -NS_IMETHODIMP nsDocShell::EnsureWebProgressListener() -{ - if(mWebProgressListener) - return NS_OK; - - mWebProgressListener = new nsDSWebProgressListener(); - NS_ENSURE_TRUE(mWebProgressListener, NS_ERROR_OUT_OF_MEMORY); - - NS_ADDREF(mWebProgressListener); - mWebProgressListener->DocShell(this); - - return NS_OK; -} - -NS_IMETHODIMP nsDocShell::FireOnProgressChange(nsIChannel* aChannel, - PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, - PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress) -{ - if(mOwnerProgressListener) - mOwnerProgressListener->OnProgressChange(aChannel, aCurSelfProgress, - aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress); - - if(!mWebProgressListenerList) - return NS_OK; - - PRUint32 count = 0; - mWebProgressListenerList->Count(&count); - for(PRUint32 x = 0; x < count; x++) - { - nsCOMPtr element; - mWebProgressListenerList->GetElementAt(x, getter_AddRefs(element)); - nsCOMPtr listener(do_QueryInterface(element)); - if(!listener) - continue; - listener->OnProgressChange(aChannel, aCurSelfProgress, aMaxSelfProgress, - aCurTotalProgress, aMaxTotalProgress); - } - return NS_OK; -} - -NS_IMETHODIMP nsDocShell::FireOnChildProgressChange(nsIChannel* aChannel, - PRInt32 aCurChildProgress, PRInt32 aMaxChildProgress) -{ - if(mOwnerProgressListener) - mOwnerProgressListener->OnChildProgressChange(aChannel, aCurChildProgress, - aMaxChildProgress); - - if(!mWebProgressListenerList) - return NS_OK; - - PRUint32 count = 0; - mWebProgressListenerList->Count(&count); - for(PRUint32 x = 0; x < count; x++) - { - nsCOMPtr element; - mWebProgressListenerList->GetElementAt(x, getter_AddRefs(element)); - nsCOMPtr listener(do_QueryInterface(element)); - if(!listener) - continue; - listener->OnChildProgressChange(aChannel, aCurChildProgress, - aMaxChildProgress); - } - return NS_OK; -} - -NS_IMETHODIMP nsDocShell::FireOnStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) -{ - if(mOwnerProgressListener) - mOwnerProgressListener->OnStatusChange(aChannel, aProgressStatusFlags); - - if(!mWebProgressListenerList) - return NS_OK; - - PRUint32 count = 0; - mWebProgressListenerList->Count(&count); - for(PRUint32 x = 0; x < count; x++) - { - nsCOMPtr element; - mWebProgressListenerList->GetElementAt(x, getter_AddRefs(element)); - nsCOMPtr listener(do_QueryInterface(element)); - if(!listener) - continue; - listener->OnStatusChange(aChannel, aProgressStatusFlags); - } - return NS_OK; -} - -NS_IMETHODIMP nsDocShell::FireOnChildStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) -{ - if(mOwnerProgressListener) - mOwnerProgressListener->OnStatusChange(aChannel, aProgressStatusFlags); - - if(!mWebProgressListenerList) - return NS_OK; - - PRUint32 count = 0; - mWebProgressListenerList->Count(&count); - for(PRUint32 x = 0; x < count; x++) - { - nsCOMPtr element; - mWebProgressListenerList->GetElementAt(x, getter_AddRefs(element)); - nsCOMPtr listener(do_QueryInterface(element)); - if(!listener) - continue; - listener->OnChildStatusChange(aChannel, aProgressStatusFlags); - } - return NS_OK; -} - -NS_IMETHODIMP nsDocShell::FireOnLocationChange(nsIURI* aURI) -{ - if(mOwnerProgressListener) - mOwnerProgressListener->OnLocationChange(aURI); - - if(!mWebProgressListenerList) - return NS_OK; - - PRUint32 count = 0; - mWebProgressListenerList->Count(&count); - for(PRUint32 x = 0; x < count; x++) - { - nsCOMPtr element; - mWebProgressListenerList->GetElementAt(x, getter_AddRefs(element)); - nsCOMPtr listener(do_QueryInterface(element)); - if(!listener) - continue; - listener->OnLocationChange(aURI); - } - return NS_OK; -} - //***************************************************************************** // nsDocShell: Helper Routines //***************************************************************************** diff --git a/mozilla/docshell/base/nsDocShell.h b/mozilla/docshell/base/nsDocShell.h index 7f477da44bc..e829c9e79db 100644 --- a/mozilla/docshell/base/nsDocShell.h +++ b/mozilla/docshell/base/nsDocShell.h @@ -45,7 +45,6 @@ // Local Includes #include "nsDSURIContentListener.h" -#include "nsDSWebProgressListener.h" // Helper Classes #include "nsCOMPtr.h" @@ -113,7 +112,6 @@ class nsDocShell : public nsIDocShell, public nsIDocShellTreeItem, public nsIDocShellTreeNode, public nsIWebNavigation, - public nsIWebProgress, public nsIBaseWindow, public nsIScrollable, public nsITextScroll, @@ -136,7 +134,6 @@ public: NS_DECL_NSIDOCSHELLTREEITEM NS_DECL_NSIDOCSHELLTREENODE NS_DECL_NSIWEBNAVIGATION - NS_DECL_NSIWEBPROGRESS NS_DECL_NSIBASEWINDOW NS_DECL_NSISCROLLABLE NS_DECL_NSITEXTSCROLL @@ -196,7 +193,6 @@ protected: NS_IMETHOD DoURILoad(nsIURI* aURI, nsIURI* aReferrer, nsISupports *aOwner, nsURILoadCommand aLoadCmd, const char* aWindowTarget, nsIInputStream* aPostData); - NS_IMETHOD StopCurrentLoads(); NS_IMETHOD ScrollIfAnchor(nsIURI* aURI, PRBool* aWasAnchor); NS_IMETHOD OnLoadingSite(nsIChannel* aChannel); virtual void OnNewURI(nsIURI *aURI, nsIChannel* aChannel, loadType aLoadType); @@ -215,19 +211,6 @@ protected: NS_IMETHOD AddToGlobalHistory(nsIURI* aURI); NS_IMETHOD UpdateCurrentGlobalHistory(); - // WebProgressListener Management - NS_IMETHOD EnsureWebProgressListener(); - - NS_IMETHOD FireOnProgressChange(nsIChannel* aChannel, - PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, - PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress); - NS_IMETHOD FireOnChildProgressChange(nsIChannel* aChannel, - PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress); - NS_IMETHOD FireOnStatusChange(nsIChannel* aChannel, PRInt32 aProgressStatusFlags); - NS_IMETHOD FireOnChildStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags); - NS_IMETHOD FireOnLocationChange(nsIURI* aURI); - // Helper Routines nsDocShellInitInfo* InitInfo(); NS_IMETHOD GetPromptAndStringBundle(nsIPrompt** aPrompt, nsIStringBundle** @@ -257,7 +240,6 @@ protected: nsVoidArray mChildren; nsCOMPtr mRefreshURIList; nsDSURIContentListener* mContentListener; - nsDSWebProgressListener* mWebProgressListener; nsDocShellInitInfo* mInitInfo; nsCOMPtr mContentViewer; nsCOMPtr mDocumentCharsetInfo; @@ -272,7 +254,6 @@ protected: nsCOMPtr mScriptContext; nsCOMPtr mSessionHistory; nsCOMPtr mGlobalHistory; - nsCOMPtr mWebProgressListenerList; nsCOMPtr mLoadCookie; // the load cookie associated with the window context. PRInt32 mMarginWidth; PRInt32 mMarginHeight; @@ -294,7 +275,6 @@ protected: For that reasons don't use nsCOMPtr.*/ nsIDocShellTreeItem* mParent; // Weak Reference nsIDocShellTreeOwner* mTreeOwner; // Weak Reference - nsIWebProgressListener* mOwnerProgressListener; // Weak Reference nsIChromeEventHandler* mChromeEventHandler; //Weak Reference }; diff --git a/mozilla/docshell/base/nsWebShell.cpp b/mozilla/docshell/base/nsWebShell.cpp index e9580795bff..586751bddd2 100644 --- a/mozilla/docshell/base/nsWebShell.cpp +++ b/mozilla/docshell/base/nsWebShell.cpp @@ -402,6 +402,7 @@ nsWebShell::~nsWebShell() mDocLoader->Stop(); mDocLoader->RemoveObserver((nsIDocumentLoaderObserver*)this); mDocLoader->SetContainer(nsnull); + mDocLoader->Destroy(); NS_RELEASE(mDocLoader); } // Cancel any timers that were set for this loader. @@ -1138,7 +1139,7 @@ nsWebShell::OnEndDocumentLoad(nsIDocumentLoader* loader, during this load handler. */ nsCOMPtr kungFuDeathGrip(this); - if(mScriptGlobal && !mEODForCurrentDocument) + if(mScriptGlobal && !mEODForCurrentDocument && NS_SUCCEEDED(aStatus)) { if(mContentViewer) { diff --git a/mozilla/embedding/browser/activex/src/control/WebBrowserContainer.cpp b/mozilla/embedding/browser/activex/src/control/WebBrowserContainer.cpp index 2eae837556b..dd63b89fa57 100644 --- a/mozilla/embedding/browser/activex/src/control/WebBrowserContainer.cpp +++ b/mozilla/embedding/browser/activex/src/control/WebBrowserContainer.cpp @@ -154,8 +154,8 @@ NS_IMETHODIMP CWebBrowserContainer::UniversalDialog(const PRUnichar *inTitleMess /////////////////////////////////////////////////////////////////////////////// // nsIWebProgressListener -/* void onProgressChange (in nsIChannel channel, in long curSelfProgress, in long maxSelfProgress, in long curTotalProgress, in long maxTotalProgress); */ -NS_IMETHODIMP CWebBrowserContainer::OnProgressChange(nsIChannel *channel, PRInt32 curSelfProgress, PRInt32 maxSelfProgress, PRInt32 curTotalProgress, PRInt32 maxTotalProgress) +/* void onProgressChange (in nsIWebProgress aProgress, in nsIRequest aRequest, in long curSelfProgress, in long maxSelfProgress, in long curTotalProgress, in long maxTotalProgress); */ +NS_IMETHODIMP CWebBrowserContainer::OnProgressChange(nsIWebProgress *aProgress, nsIRequest *aRequest, PRInt32 curSelfProgress, PRInt32 maxSelfProgress, PRInt32 curTotalProgress, PRInt32 maxTotalProgress) { NG_TRACE(_T("CWebBrowserContainer::OnProgressChange(...)\n")); @@ -181,84 +181,76 @@ NS_IMETHODIMP CWebBrowserContainer::OnProgressChange(nsIChannel *channel, PRInt3 } -/* void onChildProgressChange (in nsIChannel channel, in long curChildProgress, in long maxChildProgress); */ -NS_IMETHODIMP CWebBrowserContainer::OnChildProgressChange(nsIChannel *channel, PRInt32 curChildProgress, PRInt32 maxChildProgress) + + +/* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest request, in long progressStateFlags, in unsinged long aStatus); */ +NS_IMETHODIMP CWebBrowserContainer::OnStateChange(nsIWebProgress* aWebProgress, nsIRequest *aRequest, PRInt32 progressStateFlags, nsresult aStatus) { - return NS_ERROR_NOT_IMPLEMENTED; -} + NG_TRACE(_T("CWebBrowserContainer::OnStateChange(...)\n")); + if (progressStateFlags & flag_is_network) + { -/* void onStatusChange (in nsIChannel channel, in long progressStatusFlags); */ -NS_IMETHODIMP CWebBrowserContainer::OnStatusChange(nsIChannel *channel, PRInt32 progressStatusFlags) -{ - NG_TRACE(_T("CWebBrowserContainer::OnStatusChange(...)\n")); + if (progressStateFlags & flag_start) + { + // TODO + } - if (progressStatusFlags & nsIWebProgress::flag_net_start) - { - // TODO - } + if (progressStateFlags & flag_stop) + { + nsXPIDLCString aURI; + if (m_pCurrentURI) + { + m_pCurrentURI->GetSpec(getter_Copies(aURI)); + } - if (progressStatusFlags & nsIWebProgress::flag_net_stop) - { - nsXPIDLCString aURI; - if (m_pCurrentURI) - { - m_pCurrentURI->GetSpec(getter_Copies(aURI)); - } + // Fire a NavigateComplete event + USES_CONVERSION; + BSTR bstrURI = SysAllocString(A2OLE((const char *) aURI)); + m_pEvents1->Fire_NavigateComplete(bstrURI); - // Fire a NavigateComplete event - USES_CONVERSION; - BSTR bstrURI = SysAllocString(A2OLE((const char *) aURI)); - m_pEvents1->Fire_NavigateComplete(bstrURI); + // Fire a NavigateComplete2 event + CComVariant vURI(bstrURI); + m_pEvents2->Fire_NavigateComplete2(m_pOwner, &vURI); - // Fire a NavigateComplete2 event - CComVariant vURI(bstrURI); - m_pEvents2->Fire_NavigateComplete2(m_pOwner, &vURI); + // Cleanup + SysFreeString(bstrURI); - // Cleanup - SysFreeString(bstrURI); + nsCOMPtr webNav(do_QueryInterface(m_pOwner->mWebBrowser)); - nsCOMPtr webNav(do_QueryInterface(m_pOwner->mWebBrowser)); + // Fire the new NavigateForward state + VARIANT_BOOL bEnableForward = VARIANT_FALSE; + PRBool aCanGoForward = PR_FALSE; + webNav->GetCanGoForward(&aCanGoForward); + if (aCanGoForward == PR_TRUE) + { + bEnableForward = VARIANT_TRUE; + } + m_pEvents2->Fire_CommandStateChange(CSC_NAVIGATEFORWARD, bEnableForward); - // Fire the new NavigateForward state - VARIANT_BOOL bEnableForward = VARIANT_FALSE; - PRBool aCanGoForward = PR_FALSE; - webNav->GetCanGoForward(&aCanGoForward); - if (aCanGoForward == PR_TRUE) - { - bEnableForward = VARIANT_TRUE; - } - m_pEvents2->Fire_CommandStateChange(CSC_NAVIGATEFORWARD, bEnableForward); + // Fire the new NavigateBack state + VARIANT_BOOL bEnableBack = VARIANT_FALSE; + PRBool aCanGoBack = PR_FALSE; + webNav->GetCanGoBack(&aCanGoBack); + if (aCanGoBack == PR_TRUE) + { + bEnableBack = VARIANT_TRUE; + } + m_pEvents2->Fire_CommandStateChange(CSC_NAVIGATEBACK, bEnableBack); - // Fire the new NavigateBack state - VARIANT_BOOL bEnableBack = VARIANT_FALSE; - PRBool aCanGoBack = PR_FALSE; - webNav->GetCanGoBack(&aCanGoBack); - if (aCanGoBack == PR_TRUE) - { - bEnableBack = VARIANT_TRUE; - } - m_pEvents2->Fire_CommandStateChange(CSC_NAVIGATEBACK, bEnableBack); + m_pOwner->mBusyFlag = FALSE; - m_pOwner->mBusyFlag = FALSE; - - if (m_pCurrentURI) - { - NS_RELEASE(m_pCurrentURI); - } - } + if (m_pCurrentURI) + { + NS_RELEASE(m_pCurrentURI); + } + } + } return NS_OK; } -/* void onChildStatusChange (in nsIChannel channel, in long progressStatusFlags); */ -NS_IMETHODIMP CWebBrowserContainer::OnChildStatusChange(nsIChannel *channel, PRInt32 progressStatusFlags) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - - /* void onLocationChange (in nsIURI location); */ NS_IMETHODIMP CWebBrowserContainer::OnLocationChange(nsIURI *location) { diff --git a/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.cpp b/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.cpp index b76895ddc02..e1aef781056 100644 --- a/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.cpp +++ b/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.cpp @@ -621,7 +621,8 @@ NS_IMETHODIMP GtkMozEmbedChrome::SetParentContentListener(nsIURIContentListener // nsIWebProgressListener -NS_IMETHODIMP GtkMozEmbedChrome::OnProgressChange(nsIChannel *channel, PRInt32 curSelfProgress, +NS_IMETHODIMP GtkMozEmbedChrome::OnProgressChange(nsIWebProgress *progress, nsIRequest *request, + PRInt32 curSelfProgress, PRInt32 maxSelfProgress, PRInt32 curTotalProgress, PRInt32 maxTotalProgress) { @@ -644,55 +645,35 @@ NS_IMETHODIMP GtkMozEmbedChrome::OnProgressChange(nsIChannel *channel, PRInt32 c return NS_ERROR_NOT_IMPLEMENTED; } -NS_IMETHODIMP GtkMozEmbedChrome::OnChildProgressChange(nsIChannel *channel, PRInt32 curChildProgress, - PRInt32 maxChildProgress) +NS_IMETHODIMP GtkMozEmbedChrome::OnStateChange(nsIWebProgress *progress, nsIRequest *request, + PRInt32 aStateFlags, nsresult aStatus) { - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("GtkMozEmbedChrome::OnChildProgressChange\n")); - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_IMETHODIMP GtkMozEmbedChrome::OnStatusChange(nsIChannel *channel, PRInt32 aStatus) -{ - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("GtkMozEmbedChrome::OnStatusChange\n")); - if (aStatus & nsIWebProgress::flag_net_start) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_start\n")); - if (aStatus & nsIWebProgress::flag_net_dns) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_dns\n")); - if (aStatus & nsIWebProgress::flag_net_connecting) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_connecting\n")); - if (aStatus & nsIWebProgress::flag_net_redirecting) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_redirecting\n")); - if (aStatus & nsIWebProgress::flag_net_negotiating) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_negotiating\n")); - if (aStatus & nsIWebProgress::flag_net_transferring) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_transferring\n")); - if (aStatus & nsIWebProgress::flag_net_failedDNS) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_failedDNS\n")); - if (aStatus & nsIWebProgress::flag_net_failedConnect) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_failedConnect\n")); - if (aStatus & nsIWebProgress::flag_net_failedTransfer) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_failedTransfer\n")); - if (aStatus & nsIWebProgress::flag_net_failedTimeout) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_failedTimeout\n")); - if (aStatus & nsIWebProgress::flag_net_userCancelled) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_net_userCancelled\n")); - if (aStatus & nsIWebProgress::flag_win_start) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_win_start\n")); - if (aStatus & nsIWebProgress::flag_win_stop) - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_win_stop\n")); + PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("GtkMozEmbedChrome::OnStateChange\n")); + if (aStateFlags & nsIWebProgressListener::flag_start) + PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_start\n")); + if (aStateFlags & nsIWebProgressListener::flag_redirecting) + PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_redirecting\n")); + if (aStateFlags & nsIWebProgressListener::flag_negotiating) + PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_negotiating\n")); + if (aStateFlags & nsIWebProgressListener::flag_transferring) + PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_transferring\n")); + if (aStateFlags & nsIWebProgressListener::flag_stop) + PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_stop\n")); + if (aStateFlags & nsIWebProgressListener::flag_is_request) + PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_is_request\n")); + if (aStateFlags & nsIWebProgressListener::flag_is_document) + PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_is_document\n")); + if (aStateFlags & nsIWebProgressListener::flag_is_network) + PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_is_network\n")); + if (aStateFlags & nsIWebProgressListener::flag_is_window) + PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("flag_is_window\n")); // if we have a callback registered, call it if (mNetCB) - mNetCB(mNetCBData, aStatus); + mNetCB(mNetCBData, aStateFlags, aStatus); return NS_OK; } -NS_IMETHODIMP GtkMozEmbedChrome::OnChildStatusChange(nsIChannel *channel, PRInt32 progressStatusFlags) -{ - PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("GtkMozEmbedChrome::OnChildStatusChange\n")); - return NS_ERROR_NOT_IMPLEMENTED; -} - NS_IMETHODIMP GtkMozEmbedChrome::OnLocationChange(nsIURI *aLocation) { PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("GtkMozEmbedChrome::OnLocationChange\n")); diff --git a/mozilla/embedding/browser/gtk/src/gtkmozembed.cpp b/mozilla/embedding/browser/gtk/src/gtkmozembed.cpp index 39f64e5f692..29f7103e2e3 100644 --- a/mozilla/embedding/browser/gtk/src/gtkmozembed.cpp +++ b/mozilla/embedding/browser/gtk/src/gtkmozembed.cpp @@ -53,7 +53,7 @@ enum { LOCATION, TITLE, PROGRESS, - NET_STATUS, + NET_STATE, NET_START, NET_STOP, NEW_WINDOW, @@ -118,7 +118,7 @@ static void gtk_moz_embed_handle_progress(GtkMozEmbed *embed, gint32 curprogress, gint32 maxprogress); static void -gtk_moz_embed_handle_net(GtkMozEmbed *embed, gint flags); +gtk_moz_embed_handle_net(GtkMozEmbed *embed, gint flags, guint status); static nsresult gtk_moz_embed_handle_new_window(PRUint32 chromeMask, nsIWebBrowser **_retval, void *aData); @@ -257,13 +257,13 @@ gtk_moz_embed_class_init(GtkMozEmbedClass *klass) GTK_SIGNAL_OFFSET(GtkMozEmbedClass, progress), gtk_marshal_NONE__INT_INT, GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT); - moz_embed_signals[NET_STATUS] = - gtk_signal_new("net_status", + moz_embed_signals[NET_STATE] = + gtk_signal_new("net_state", GTK_RUN_FIRST, object_class->type, - GTK_SIGNAL_OFFSET(GtkMozEmbedClass, net_status), + GTK_SIGNAL_OFFSET(GtkMozEmbedClass, net_state), gtk_marshal_NONE__INT, - GTK_TYPE_NONE, 1, GTK_TYPE_INT); + GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_UINT); moz_embed_signals[NET_START] = gtk_signal_new("net_start", GTK_RUN_FIRST, @@ -352,7 +352,7 @@ gtk_moz_embed_init(GtkMozEmbed *embed) embed); embed_private->embed->SetProgressCallback((void (*)(void *, gint, gint))gtk_moz_embed_handle_progress, embed); - embed_private->embed->SetNetCallback((void (*)(void *, gint))gtk_moz_embed_handle_net, + embed_private->embed->SetNetCallback((void (*)(void *, gint, guint))gtk_moz_embed_handle_net, embed); embed_private->embed->SetNewBrowserCallback(gtk_moz_embed_handle_new_window, embed); embed_private->embed->SetVisibilityCallback(gtk_moz_embed_handle_visibility, embed); @@ -850,17 +850,17 @@ gtk_moz_embed_handle_progress(GtkMozEmbed *embed, gint32 curprogress, gint32 max } static void -gtk_moz_embed_handle_net(GtkMozEmbed *embed, gint32 flags) +gtk_moz_embed_handle_net(GtkMozEmbed *embed, gint32 flags, guint32 status) { g_return_if_fail (GTK_IS_MOZ_EMBED(embed)); // if we've got the start flag, emit the signal - if (flags & GTK_MOZ_EMBED_FLAG_WIN_START) + if ((flags & GTK_MOZ_EMBED_FLAG_IS_WINDOW) && (flags & GTK_MOZ_EMBED_FLAG_START)) gtk_signal_emit(GTK_OBJECT(embed), moz_embed_signals[NET_START]); // for people who know what they are doing - gtk_signal_emit(GTK_OBJECT(embed), moz_embed_signals[NET_STATUS], flags); + gtk_signal_emit(GTK_OBJECT(embed), moz_embed_signals[NET_STATE], flags, status); // and for stop, too - if (flags & GTK_MOZ_EMBED_FLAG_WIN_STOP) + if ((flags & GTK_MOZ_EMBED_FLAG_IS_WINDOW) && (flags & GTK_MOZ_EMBED_FLAG_STOP)) gtk_signal_emit(GTK_OBJECT(embed), moz_embed_signals[NET_STOP]); } diff --git a/mozilla/embedding/browser/gtk/src/gtkmozembed.h b/mozilla/embedding/browser/gtk/src/gtkmozembed.h index bf59a83ba86..feaac982e7a 100644 --- a/mozilla/embedding/browser/gtk/src/gtkmozembed.h +++ b/mozilla/embedding/browser/gtk/src/gtkmozembed.h @@ -53,7 +53,7 @@ struct _GtkMozEmbedClass void (* location) (GtkMozEmbed *embed); void (* title) (GtkMozEmbed *embed); void (* progress) (GtkMozEmbed *embed, gint maxprogress, gint curprogress); - void (* net_status) (GtkMozEmbed *embed, gint status); + void (* net_state) (GtkMozEmbed *embed, gint state, guint status); void (* net_start) (GtkMozEmbed *embed); void (* net_stop) (GtkMozEmbed *embed); void (* new_window) (GtkMozEmbed *embed, GtkMozEmbed **newEmbed, guint chromemask); @@ -86,22 +86,25 @@ extern void gtk_moz_embed_reload (GtkMozEmbed *embed, gint32 f extern void gtk_moz_embed_set_chrome_mask (GtkMozEmbed *embed, guint32 flags); extern guint32 gtk_moz_embed_get_chrome_mask (GtkMozEmbed *embed); -/* These are straight out of nsIWebProgress.h */ +/* These are straight out of nsIWebProgressListener.h */ -enum { GTK_MOZ_EMBED_FLAG_NET_START = 1, - GTK_MOZ_EMBED_FLAG_NET_STOP = 2, - GTK_MOZ_EMBED_FLAG_NET_DNS = 4, - GTK_MOZ_EMBED_FLAG_NET_CONNECTING = 8, - GTK_MOZ_EMBED_FLAG_NET_REDIRECTING = 16, - GTK_MOZ_EMBED_FLAG_NET_NEGOTIATING = 32, - GTK_MOZ_EMBED_FLAG_NET_TRANSFERRING = 64, - GTK_MOZ_EMBED_FLAG_NET_FAILEDDNS = 4096, - GTK_MOZ_EMBED_FLAG_NET_FAILEDCONNECT = 8192, - GTK_MOZ_EMBED_FLAG_NET_FAILEDTRANSFER = 16384, - GTK_MOZ_EMBED_FLAG_NET_FAILEDTIMEOUT = 32768, - GTK_MOZ_EMBED_FLAG_NET_USERCANCELLED = 65536, - GTK_MOZ_EMBED_FLAG_WIN_START = 1048576, - GTK_MOZ_EMBED_FLAG_WIN_STOP = 2097152 }; +enum { GTK_MOZ_EMBED_FLAG_START = 1, + GTK_MOZ_EMBED_FLAG_REDIRECTING = 2, + GTK_MOZ_EMBED_FLAG_TRANSFERRING = 4, + GTK_MOZ_EMBED_FLAG_NEGOTIATING = 8, + GTK_MOZ_EMBED_FLAG_STOP = 16, + + GTK_MOZ_EMBED_FLAG_IS_REQUEST = 65536, + GTK_MOZ_EMBED_FLAG_IS_DOCUMENT = 131072, + GTK_MOZ_EMBED_FLAG_IS_NETWORK = 262144, + GTK_MOZ_EMBED_FLAG_IS_WINDOW = 524288 }; + +/* These are from various networking headers */ + +enum { GTK_MOZ_EMBED_STATUS_FAILED_DNS = 268454686, /* NS_ERROR_UNKNOWN_HOST */ + GTK_MOZ_EMBED_STATUS_FAILED_CONNECT = 268454669, /* NS_ERROR_CONNECTION_REFUSED */ + GTK_MOZ_EMBED_STATUS_FAILED_TIMEOUT = 268454670, /* NS_ERROR_NET_TIMEOUT */ + GTK_MOZ_EMBED_STATUS_FAILED_USERCANCELED = 268454658 }; /* NS_BINDING_ABORTED */ /* These are straight out of nsIWebNavigation.h */ diff --git a/mozilla/embedding/browser/gtk/src/nsIGtkEmbed.h b/mozilla/embedding/browser/gtk/src/nsIGtkEmbed.h index 6c72f332c4b..e9fa3fee199 100644 --- a/mozilla/embedding/browser/gtk/src/nsIGtkEmbed.h +++ b/mozilla/embedding/browser/gtk/src/nsIGtkEmbed.h @@ -40,7 +40,7 @@ typedef void (GtkMozEmbedLocationCB) (void *aData); typedef void (GtkMozEmbedTitleCB) (void *aData); typedef void (GtkMozEmbedProgressCB) (void *aData, PRInt32 aProgressTotal, PRInt32 aProgressCurrent); -typedef void (GtkMozEmbedNetCB) (void *aData, PRInt32 aFlags); +typedef void (GtkMozEmbedNetCB) (void *aData, PRInt32 aFlags, nsresult aStatus); typedef PRBool (GtkMozEmbedStartOpenCB) (const char *aURI, void *aData); class nsIGtkEmbed : public nsISupports diff --git a/mozilla/embedding/browser/gtk/tests/TestGtkEmbed.cpp b/mozilla/embedding/browser/gtk/tests/TestGtkEmbed.cpp index 05813f222f3..529680877c6 100644 --- a/mozilla/embedding/browser/gtk/tests/TestGtkEmbed.cpp +++ b/mozilla/embedding/browser/gtk/tests/TestGtkEmbed.cpp @@ -65,7 +65,7 @@ static void location_changed_cb (GtkMozEmbed *embed, TestGtkBrowser *browser); static void title_changed_cb (GtkMozEmbed *embed, TestGtkBrowser *browser); static void load_started_cb (GtkMozEmbed *embed, TestGtkBrowser *browser); static void load_finished_cb (GtkMozEmbed *embed, TestGtkBrowser *browser); -static void net_status_change_cb (GtkMozEmbed *embed, gint flags, TestGtkBrowser *browser); +static void net_state_change_cb (GtkMozEmbed *embed, gint flags, guint status, TestGtkBrowser *browser); static void progress_change_cb (GtkMozEmbed *embed, gint cur, gint max, TestGtkBrowser *browser); static void link_message_cb (GtkMozEmbed *embed, TestGtkBrowser *browser); @@ -229,8 +229,8 @@ new_gtk_browser(guint32 chromeMask) gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "net_stop", GTK_SIGNAL_FUNC(load_finished_cb), browser); // hook up to the change in network status - gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "net_status", - GTK_SIGNAL_FUNC(net_status_change_cb), browser); + gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "net_state", + GTK_SIGNAL_FUNC(net_state_change_cb), browser); // hookup to changes in progress gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "progress", GTK_SIGNAL_FUNC(progress_change_cb), browser); @@ -397,30 +397,33 @@ load_finished_cb (GtkMozEmbed *embed, TestGtkBrowser *browser) void -net_status_change_cb (GtkMozEmbed *embed, gint flags, TestGtkBrowser *browser) +net_state_change_cb (GtkMozEmbed *embed, gint flags, guint status, TestGtkBrowser *browser) { - // g_print("net_status_change_cb %d\n", flags); - if (flags & GTK_MOZ_EMBED_FLAG_NET_DNS) - browser->statusMessage = "Looking up host..."; - else if (flags & GTK_MOZ_EMBED_FLAG_NET_CONNECTING) - browser->statusMessage = "Connecting to site..."; - else if (flags & GTK_MOZ_EMBED_FLAG_NET_REDIRECTING) - browser->statusMessage = "Connecting to site..."; - else if (flags & GTK_MOZ_EMBED_FLAG_NET_TRANSFERRING) + // g_print("net_state_change_cb %d\n", flags); + if (flags & GTK_MOZ_EMBED_FLAG_IS_REQUEST) { + if (flags & GTK_MOZ_EMBED_FLAG_REDIRECTING) + browser->statusMessage = "Redirecting to site..."; + else if (flags & GTK_MOZ_EMBED_FLAG_TRANSFERRING) browser->statusMessage = "Transferring data from site..."; - else if (flags & GTK_MOZ_EMBED_FLAG_NET_FAILEDDNS) - browser->statusMessage = "Site not found."; - else if (flags & GTK_MOZ_EMBED_FLAG_NET_FAILEDCONNECT) - browser->statusMessage = "Failed to connect to site."; - else if (flags & GTK_MOZ_EMBED_FLAG_NET_FAILEDTRANSFER) - browser->statusMessage = "Failed to transfer any data from site."; - else if (flags & GTK_MOZ_EMBED_FLAG_NET_USERCANCELLED) - browser->statusMessage = "User cancelled connecting to site."; + else if (flags & GTK_MOZ_EMBED_FLAG_NEGOTIATING) + browser->statusMessage = "Waiting for authorization..."; + } - if (flags & GTK_MOZ_EMBED_FLAG_WIN_START) - browser->statusMessage = "Loading site..."; - else if (flags & GTK_MOZ_EMBED_FLAG_WIN_STOP) - browser->statusMessage = "Done."; + if (status == GTK_MOZ_EMBED_STATUS_FAILED_DNS) + browser->statusMessage = "Site not found."; + else if (status == GTK_MOZ_EMBED_STATUS_FAILED_CONNECT) + browser->statusMessage = "Failed to connect to site."; + else if (status == GTK_MOZ_EMBED_STATUS_FAILED_TIMEOUT) + browser->statusMessage = "Failed due to connection timeout."; + else if (status == GTK_MOZ_EMBED_STATUS_FAILED_USERCANCELED) + browser->statusMessage = "User canceled connecting to site."; + + if (flags & GTK_MOZ_EMBED_FLAG_IS_WINDOW) { + if (flags & GTK_MOZ_EMBED_FLAG_START) + browser->statusMessage = "Loading site..."; + else if (flags & GTK_MOZ_EMBED_FLAG_STOP) + browser->statusMessage = "Done."; + } update_status_bar_text(browser); diff --git a/mozilla/embedding/browser/powerplant/source/CBrowserShell.cpp b/mozilla/embedding/browser/powerplant/source/CBrowserShell.cpp index f2eeb6864b7..4b5726ee218 100644 --- a/mozilla/embedding/browser/powerplant/source/CBrowserShell.cpp +++ b/mozilla/embedding/browser/powerplant/source/CBrowserShell.cpp @@ -111,7 +111,7 @@ NS_IMETHODIMP CBrowserShell::CommonConstruct() NS_ENSURE_TRUE(treeItem, NS_ERROR_FAILURE); mWebBrowserAsTreeItem = treeItem; - nsCOMPtr asProgress(do_QueryInterface(mWebBrowser)); + nsCOMPtr asProgress(do_GetInterface(mWebBrowser)); NS_ENSURE_TRUE(asProgress, NS_ERROR_FAILURE); mWebBrowserAsProgress = asProgress; diff --git a/mozilla/embedding/browser/powerplant/source/CWebBrowserChrome.cpp b/mozilla/embedding/browser/powerplant/source/CWebBrowserChrome.cpp index 3e7c2fd1c8b..6b436de72ff 100644 --- a/mozilla/embedding/browser/powerplant/source/CWebBrowserChrome.cpp +++ b/mozilla/embedding/browser/powerplant/source/CWebBrowserChrome.cpp @@ -170,35 +170,30 @@ NS_IMETHODIMP CWebBrowserChrome::ShowAsModal(void) // CWebBrowserChrome::nsIWebProgressListener //***************************************************************************** -NS_IMETHODIMP CWebBrowserChrome::OnProgressChange(nsIChannel *channel, PRInt32 curSelfProgress, PRInt32 maxSelfProgress, PRInt32 curTotalProgress, PRInt32 maxTotalProgress) +NS_IMETHODIMP CWebBrowserChrome::OnProgressChange(nsIWebProgress *progress, nsIRequest *request, + PRInt32 curSelfProgress, PRInt32 maxSelfProgress, + PRInt32 curTotalProgress, PRInt32 maxTotalProgress) { return NS_OK; } -NS_IMETHODIMP CWebBrowserChrome::OnChildProgressChange(nsIChannel *channel, PRInt32 curSelfProgress, PRInt32 curTotalProgress) -{ - return NS_OK; -} - -NS_IMETHODIMP CWebBrowserChrome::OnStatusChange(nsIChannel *channel, PRInt32 progressStatusFlags) +NS_IMETHODIMP CWebBrowserChrome::OnStateChange(nsIWebProgress *progress, nsIRequest *request, + PRInt32 progressStateFlags nsresult status) { NS_ENSURE_TRUE(mBrowserWindow, NS_ERROR_NOT_INITIALIZED); - if (progressStatusFlags & nsIWebProgress::flag_net_start) - mBrowserWindow->OnStatusNetStart(channel); - else if (progressStatusFlags & nsIWebProgress::flag_net_stop) - mBrowserWindow->OnStatusNetStop(channel); - else if (progressStatusFlags & nsIWebProgress::flag_net_dns) - mBrowserWindow->OnStatusDNS(channel); + if (progressStateFlags & flag_is_network) { + if (progressStateFlags & flag_start) + mBrowserWindow->OnStatusNetStart(channel); + else if (progressStateFlags & flag_stop) + mBrowserWindow->OnStatusNetStop(channel); + } +/// else if (progressStatusFlags & nsIWebProgress::flag_net_dns) +/// mBrowserWindow->OnStatusDNS(channel); return NS_OK; } -NS_IMETHODIMP CWebBrowserChrome::OnChildStatusChange(nsIChannel *channel, PRInt32 progressStatusFlags) -{ - return NS_OK; -} - NS_IMETHODIMP CWebBrowserChrome::OnLocationChange(nsIURI *location) { diff --git a/mozilla/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp b/mozilla/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp index fafb91a6bfe..3070ed60a86 100644 --- a/mozilla/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp +++ b/mozilla/embedding/browser/webBrowser/nsDocShellTreeOwner.cpp @@ -377,46 +377,38 @@ NS_IMETHODIMP nsDocShellTreeOwner::SetTitle(const PRUnichar* aTitle) // nsDocShellTreeOwner::nsIWebProgressListener //***************************************************************************** -NS_IMETHODIMP nsDocShellTreeOwner::OnProgressChange(nsIChannel* aChannel, - PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, - PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress) +NS_IMETHODIMP +nsDocShellTreeOwner::OnProgressChange(nsIWebProgress* aProgress, + nsIRequest* aRequest, + PRInt32 aCurSelfProgress, + PRInt32 aMaxSelfProgress, + PRInt32 aCurTotalProgress, + PRInt32 aMaxTotalProgress) { if(!mOwnerProgressListener) return NS_OK; - return mOwnerProgressListener->OnProgressChange(aChannel, - aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, - aMaxTotalProgress); + return mOwnerProgressListener->OnProgressChange(aProgress, + aRequest, + aCurSelfProgress, + aMaxSelfProgress, + aCurTotalProgress, + aMaxTotalProgress); } -NS_IMETHODIMP nsDocShellTreeOwner::OnChildProgressChange(nsIChannel* aChannel, - PRInt32 aCurChildProgress, PRInt32 aMaxChildProgress) -{ - if(!mOwnerProgressListener) - return NS_OK; - - return mOwnerProgressListener->OnChildProgressChange(aChannel, - aCurChildProgress, aMaxChildProgress); -} - -NS_IMETHODIMP nsDocShellTreeOwner::OnStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) +NS_IMETHODIMP +nsDocShellTreeOwner::OnStateChange(nsIWebProgress* aProgress, + nsIRequest* aRequest, + PRInt32 aProgressStateFlags, + nsresult aStatus) { if(!mOwnerProgressListener) return NS_OK; - return mOwnerProgressListener->OnStatusChange(aChannel, - aProgressStatusFlags); -} - -NS_IMETHODIMP nsDocShellTreeOwner::OnChildStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) -{ - if(!mOwnerProgressListener) - return NS_OK; - - return mOwnerProgressListener->OnChildStatusChange(aChannel, - aProgressStatusFlags); + return mOwnerProgressListener->OnStateChange(aProgress, + aRequest, + aProgressStateFlags, + aStatus); } NS_IMETHODIMP nsDocShellTreeOwner::OnLocationChange(nsIURI* aURI) diff --git a/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp b/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp index 763781d3b21..e34afb61cbe 100644 --- a/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp +++ b/mozilla/embedding/browser/webBrowser/nsWebBrowser.cpp @@ -968,7 +968,7 @@ NS_IMETHODIMP nsWebBrowser::SetDocShell(nsIDocShell* aDocShell) nsCOMPtr baseWin(do_QueryInterface(aDocShell)); nsCOMPtr item(do_QueryInterface(aDocShell)); nsCOMPtr nav(do_QueryInterface(aDocShell)); - nsCOMPtr progress(do_QueryInterface(aDocShell)); + nsCOMPtr progress(do_GetInterface(aDocShell)); nsCOMPtr scrollable(do_QueryInterface(aDocShell)); nsCOMPtr textScroll(do_QueryInterface(aDocShell)); NS_ENSURE_TRUE(req && baseWin && item && nav && scrollable && textScroll && diff --git a/mozilla/mailnews/base/src/nsMsgStatusFeedback.cpp b/mozilla/mailnews/base/src/nsMsgStatusFeedback.cpp index 547209ee9c5..b5984528050 100644 --- a/mozilla/mailnews/base/src/nsMsgStatusFeedback.cpp +++ b/mozilla/mailnews/base/src/nsMsgStatusFeedback.cpp @@ -36,6 +36,7 @@ #include "nsIDOMXULDocument.h" #include "nsIDocShell.h" #include "nsIDocShellTreeItem.h" +#include "nsIChannel.h" #define MSGFEEDBACK_TIMER_INTERVAL 500 @@ -85,9 +86,13 @@ NS_INTERFACE_MAP_END // nsMsgStatusFeedback::nsIWebProgressListener ////////////////////////////////////////////////////////////////////////////////// -NS_IMETHODIMP nsMsgStatusFeedback::OnProgressChange(nsIChannel* aChannel, - PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, - PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress) +NS_IMETHODIMP +nsMsgStatusFeedback::OnProgressChange(nsIWebProgress* aWebProgress, + nsIRequest* aRequest, + PRInt32 aCurSelfProgress, + PRInt32 aMaxSelfProgress, + PRInt32 aCurTotalProgress, + PRInt32 aMaxTotalProgress) { PRInt32 percentage = 0; if (aMaxTotalProgress > 0) @@ -100,45 +105,39 @@ NS_IMETHODIMP nsMsgStatusFeedback::OnProgressChange(nsIChannel* aChannel, return NS_OK; } -NS_IMETHODIMP nsMsgStatusFeedback::OnChildProgressChange(nsIChannel* aChannel, - PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress) -{ - return NS_OK; -} - -NS_IMETHODIMP nsMsgStatusFeedback::OnStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) +NS_IMETHODIMP +nsMsgStatusFeedback::OnStateChange(nsIWebProgress* aWebProgress, + nsIRequest* aRequest, + PRInt32 aProgressStateFlags, + nsresult aStatus) { nsresult rv; - if (aProgressStatusFlags & nsIWebProgress::flag_net_start) + if (aProgressStateFlags & flag_is_network) { - m_lastPercent = 0; - StartMeteors(); - nsXPIDLString loadingDocument; - rv = mBundle->GetStringFromName(NS_ConvertASCIItoUCS2("documentLoading").GetUnicode(), - getter_Copies(loadingDocument)); - if (NS_SUCCEEDED(rv)) - ShowStatusString(loadingDocument); - } - else if (aProgressStatusFlags & nsIWebProgress::flag_net_stop) - { - StopMeteors(); - nsXPIDLString documentDone; - rv = mBundle->GetStringFromName(NS_ConvertASCIItoUCS2("documentDone").GetUnicode(), - getter_Copies(documentDone)); - if (NS_SUCCEEDED(rv)) - ShowStatusString(documentDone); + if (aProgressStateFlags & flag_start) + { + m_lastPercent = 0; + StartMeteors(); + nsXPIDLString loadingDocument; + rv = mBundle->GetStringFromName(NS_ConvertASCIItoUCS2("documentLoading").GetUnicode(), + getter_Copies(loadingDocument)); + if (NS_SUCCEEDED(rv)) + ShowStatusString(loadingDocument); + } + else if (aProgressStateFlags & flag_stop) + { + StopMeteors(); + nsXPIDLString documentDone; + rv = mBundle->GetStringFromName(NS_ConvertASCIItoUCS2("documentDone").GetUnicode(), + getter_Copies(documentDone)); + if (NS_SUCCEEDED(rv)) + ShowStatusString(documentDone); + } } return NS_OK; } -NS_IMETHODIMP nsMsgStatusFeedback::OnChildStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) -{ - return NS_OK; -} - NS_IMETHODIMP nsMsgStatusFeedback::OnLocationChange(nsIURI* aLocation) { return NS_OK; @@ -336,7 +335,8 @@ nsMsgStatusFeedback::NotifyStopMeteors(nsITimer* aTimer) NS_IMETHODIMP nsMsgStatusFeedback::OnProgress(nsIChannel* channel, nsISupports* ctxt, PRUint32 aProgress, PRUint32 aProgressMax) { - return OnProgressChange(channel, aProgress, aProgressMax, + // XXX: What should the nsIWebProgress be? + return OnProgressChange(nsnull, channel, aProgress, aProgressMax, aProgress /* current total progress */, aProgressMax /* max total progress */); } diff --git a/mozilla/mailnews/base/src/nsMsgWindow.cpp b/mozilla/mailnews/base/src/nsMsgWindow.cpp index d0d8c7aa026..15a29584a7e 100644 --- a/mozilla/mailnews/base/src/nsMsgWindow.cpp +++ b/mozilla/mailnews/base/src/nsMsgWindow.cpp @@ -124,7 +124,7 @@ NS_IMETHODIMP nsMsgWindow::GetStatusFeedback(nsIMsgStatusFeedback * *aStatusFeed NS_IMETHODIMP nsMsgWindow::SetStatusFeedback(nsIMsgStatusFeedback * aStatusFeedback) { - nsCOMPtr webProgress(do_QueryInterface(mMessageWindowDocShell)); + nsCOMPtr webProgress(do_GetInterface(mMessageWindowDocShell)); nsCOMPtr webProgressListener(do_QueryInterface(mStatusFeedback)); mStatusFeedback = aStatusFeedback; diff --git a/mozilla/uriloader/base/nsDocLoader.cpp b/mozilla/uriloader/base/nsDocLoader.cpp index 9ba2f9491c5..293c308c5ec 100644 --- a/mozilla/uriloader/base/nsDocLoader.cpp +++ b/mozilla/uriloader/base/nsDocLoader.cpp @@ -31,7 +31,6 @@ #include "nsIServiceManager.h" #include "nsXPIDLString.h" -#include "nsIURL.h" #include "nsIURL.h" #include "nsCOMPtr.h" #include "nsCom.h" @@ -42,6 +41,7 @@ #include "nsIPresShell.h" #include "nsIPresContext.h" + #if defined(PR_LOGGING) // // Log module for nsIDocumentLoader logging... @@ -58,11 +58,44 @@ PRLogModuleInfo* gDocLoaderLog = nsnull; #endif /* PR_LOGGING */ +#if defined(DEBUG) +void GetURIStringFromChannel(nsIRequest *aRequest, nsXPIDLCString &aStr) +{ + nsCOMPtr channel; + nsCOMPtr uri; + nsresult rv = NS_OK; + + channel = do_QueryInterface(aRequest, &rv); + if (NS_SUCCEEDED(rv)) + rv = channel->GetURI(getter_AddRefs(uri)); + + if (NS_SUCCEEDED(rv) && uri) + rv = uri->GetSpec(getter_Copies(aStr)); + else + aStr = "???"; +} +#endif /* DEBUG */ + /* Define IIDs... */ static NS_DEFINE_IID(kIDocumentIID, NS_IDOCUMENT_IID); static NS_DEFINE_IID(kIContentViewerContainerIID, NS_ICONTENT_VIEWER_CONTAINER_IID); +struct nsChannelInfo { + nsChannelInfo(nsIChannel *key) : mKey(key), + mCurrentProgress(0), + mMaxProgress(0) + { + key->GetURI(getter_AddRefs(mURI)); + } + + void* mKey; + nsCOMPtr mURI; + PRInt32 mCurrentProgress; + PRInt32 mMaxProgress; +}; + + nsDocLoaderImpl::nsDocLoaderImpl() { NS_INIT_REFCNT(); @@ -77,8 +110,6 @@ nsDocLoaderImpl::nsDocLoaderImpl() mParent = nsnull; mIsLoadingDocument = PR_FALSE; - mProgressStatusFlags = 0; - ClearInternalProgress(); PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, @@ -103,9 +134,6 @@ nsDocLoaderImpl::Init() PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, ("DocLoader:%p: load group %x.\n", this, mLoadGroup.get())); -/// rv = mLoadGroup->SetGroupListenerFactory(this); -/// if (NS_FAILED(rv)) return rv; - rv = NS_NewISupportsArray(getter_AddRefs(mChildList)); return rv; @@ -403,12 +431,7 @@ nsDocLoaderImpl::Destroy() mDocumentChannel = null_nsCOMPtr(); - // Clear factory pointer (which is the docloader) - (void)mLoadGroup->SetGroupListenerFactory(nsnull); - mLoadGroup->SetGroupObserver(nsnull); - // now forget about our progress listener... - mProgressListener = nsnull; return NS_OK; } @@ -425,6 +448,7 @@ nsDocLoaderImpl::OnStartRequest(nsIChannel *aChannel, nsISupports *aCtxt) aChannel->GetLoadAttributes(&loadAttribs); if (loadAttribs & nsIChannel::LOAD_DOCUMENT_URI) { mIsLoadingDocument = PR_TRUE; + ClearInternalProgress(); // only clear our progress if we are starting a new load.... } } @@ -438,23 +462,33 @@ nsDocLoaderImpl::OnStartRequest(nsIChannel *aChannel, nsISupports *aCtxt) rv = mLoadGroup->GetActiveCount(&count); if (NS_FAILED(rv)) return rv; + // + // Create a new ChannelInfo for the channel that is starting to + // load... + // + AddChannelInfo(aChannel); if (1 == count) { - nsCOMPtr uri; - - rv = aChannel->GetURI(getter_AddRefs(uri)); - if (NS_FAILED(rv)) return rv; - // This channel is associated with the entire document... mDocumentChannel = aChannel; mLoadGroup->SetDefaultLoadChannel(mDocumentChannel); - FireOnStartDocumentLoad(this, uri); + + // Update the progress status state + mProgressStateFlags = nsIWebProgressListener::flag_start; + + doStartDocumentLoad(); + FireOnStartDocumentLoad(this, aChannel); } - else + else { + doStartURLLoad(aChannel); FireOnStartURLLoad(this, aChannel); + } } - else + else { + ClearChannelInfoList(); + doStartURLLoad(aChannel); FireOnStartURLLoad(this, aChannel); + } return NS_OK; } @@ -474,6 +508,28 @@ nsDocLoaderImpl::OnStopRequest(nsIChannel *aChannel, if (mIsLoadingDocument) { PRUint32 count; + // + // Set the Maximum progress to the same value as the current progress. + // Since the URI has finished loading, all the data is there. Also, + // this will allow a more accurate estimation of the max progress (in case + // the old value was unknown ie. -1) + // + nsChannelInfo *info; + info = GetChannelInfo(aChannel); + if (info) { + PRInt32 oldMax = info->mMaxProgress; + + info->mMaxProgress = info->mCurrentProgress; + // + // If a channel whose content-length was previously unknown has just + // finished loading, then use this new data to try to calculate a + // mMaxSelfProgress... + // + if ((oldMax < 0) && (mMaxSelfProgress < 0)) { + CalculateMaxProgress(&mMaxSelfProgress); + } + } + rv = mLoadGroup->GetActiveCount(&count); if (NS_FAILED(rv)) return rv; @@ -482,11 +538,15 @@ nsDocLoaderImpl::OnStopRequest(nsIChannel *aChannel, // if (0 == count) DocLoaderIsEmpty(aStatus); - else + else { + doStopURLLoad(aChannel, aStatus); FireOnEndURLLoad(this, aChannel, aStatus); + } } - else + else { + doStopURLLoad(aChannel, aStatus); FireOnEndURLLoad(this, aChannel, aStatus); + } return NS_OK; } @@ -505,6 +565,7 @@ nsresult nsDocLoaderImpl::RemoveChildGroup(nsDocLoaderImpl* aLoader) void nsDocLoaderImpl::DocLoaderIsEmpty(nsresult aStatus) { +#if 0 if (mParent) { mParent->DocLoaderIsEmpty(aStatus); // @@ -513,7 +574,7 @@ void nsDocLoaderImpl::DocLoaderIsEmpty(nsresult aStatus) // mLoadGroup->SetDefaultLoadChannel(nsnull); } - +#endif /* 0 */ if (mIsLoadingDocument) { PRBool busy = PR_FALSE; /* In the unimagineably rude circumstance that onload event handlers @@ -532,11 +593,21 @@ void nsDocLoaderImpl::DocLoaderIsEmpty(nsresult aStatus) mDocumentChannel = null_nsCOMPtr(); mIsLoadingDocument = PR_FALSE; + // Update the progress status state - the document is done + mProgressStateFlags = nsIWebProgressListener::flag_stop; + + // + // New code to break the circular reference between + // the load group and the docloader... + // + mLoadGroup->SetDefaultLoadChannel(nsnull); + // // Do nothing after firing the OnEndDocumentLoad(...). The document // loader may be loading a *new* document - if LoadDocument() // was called from a handler! // + doStopDocumentLoad(docChannel, aStatus); FireOnEndDocumentLoad(this, docChannel, aStatus); if (mParent) { @@ -546,16 +617,111 @@ void nsDocLoaderImpl::DocLoaderIsEmpty(nsresult aStatus) } } - -void nsDocLoaderImpl::FireOnStartDocumentLoad(nsDocLoaderImpl* aLoadInitiator, - nsIURI* aURL) +void nsDocLoaderImpl::doStartDocumentLoad(void) { - PRInt32 count; #if defined(DEBUG) nsXPIDLCString buffer; - aURL->GetSpec(getter_Copies(buffer)); + GetURIStringFromChannel(mDocumentChannel, buffer); + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: ++ Firing OnStateChange for start document load (...)." + "\tURI: %s \n", + this, (const char *) buffer)); +#endif /* DEBUG */ + + // Fire an OnStatus(...) notification flag_net_start. This indicates + // that the document represented by mDocumentChannel has started to + // load... + FireOnStateChange(this, + mDocumentChannel, + nsIWebProgressListener::flag_start | + nsIWebProgressListener::flag_is_document | + nsIWebProgressListener::flag_is_request | + nsIWebProgressListener::flag_is_network, + NS_OK); +} + +void nsDocLoaderImpl::doStartURLLoad(nsIChannel *aChannel) +{ +#if defined(DEBUG) + nsXPIDLCString buffer; + + GetURIStringFromChannel(aChannel, buffer); + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: ++ Firing OnStateChange start url load (...)." + "\tURI: %s\n", + this, (const char *) buffer)); +#endif /* DEBUG */ + + FireOnStateChange(this, + aChannel, + nsIWebProgressListener::flag_start | + nsIWebProgressListener::flag_is_request, + NS_OK); +} + +void nsDocLoaderImpl::doStopURLLoad(nsIChannel *aChannel, nsresult aStatus) +{ +#if defined(DEBUG) + nsXPIDLCString buffer; + + GetURIStringFromChannel(aChannel, buffer); + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: ++ Firing OnStateChange for end url load (...)." + "\tURI: %s status=%x\n", + this, (const char *) buffer, aStatus)); +#endif /* DEBUG */ + + FireOnStateChange(this, + aChannel, + nsIWebProgressListener::flag_stop | + nsIWebProgressListener::flag_is_request, + aStatus); +} + +void nsDocLoaderImpl::doStopDocumentLoad(nsIChannel* aChannel, + nsresult aStatus) +{ +#if defined(DEBUG) + nsXPIDLCString buffer; + + GetURIStringFromChannel(aChannel, buffer); + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: ++ Firing OnStateChange for end document load (...)." + "\tURI: %s Status=%x\n", + this, (const char *) buffer, aStatus)); +#endif /* DEBUG */ + + // + // Fire an OnStatusChange(...) notification indicating the the + // current document has finished loading... + // + FireOnStateChange(this, + aChannel, + nsIWebProgressListener::flag_stop | + nsIWebProgressListener::flag_is_document | + nsIWebProgressListener::flag_is_request | + nsIWebProgressListener::flag_is_network, + aStatus); +} + + + + +void nsDocLoaderImpl::FireOnStartDocumentLoad(nsDocLoaderImpl* aLoadInitiator, + nsIChannel *aDocChannel) +{ + PRInt32 count; + + nsCOMPtr uri; + + aDocChannel->GetURI(getter_AddRefs(uri)); + +#if defined(DEBUG) + nsXPIDLCString buffer; + + GetURIStringFromChannel(aDocChannel, buffer); if (aLoadInitiator == this) { PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, ("DocLoader:%p: ++ Firing OnStartDocumentLoad(...).\tURI: %s\n", @@ -568,36 +734,6 @@ void nsDocLoaderImpl::FireOnStartDocumentLoad(nsDocLoaderImpl* aLoadInitiator, } #endif /* DEBUG */ - // if we have a web progress listener, propagate the fact that we are starting to load a url - // but only propogate it if we are the one who initiated the on start... - if (mProgressListener && aLoadInitiator == this) - { -#if defined(DEBUG) - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: ++ Firing OnStatusChange for start document load (...).\tURI: %s \tWebProgressListener: %p\n", - this, (const char *) buffer, mProgressListener.get())); -#endif - mProgressStatusFlags = nsIWebProgress::flag_net_start; - mProgressListener->OnStatusChange(mDocumentChannel, mProgressStatusFlags); - } - - if (aLoadInitiator == this) - { - ClearInternalProgress(); // only clear our progress if we are starting a new load.... - nsCOMPtr parentProgressListener; - GetParentWebProgressListener(this, getter_AddRefs(parentProgressListener)); - if (parentProgressListener && parentProgressListener.get() != mProgressListener.get()) - { -#if defined(DEBUG) - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: ++ Firing OnChildStatusChange for start document load (...).\tURI: %s \tWebProgressListener: %p\n", - this, (const char *) buffer, parentProgressListener.get())); -#endif - mProgressStatusFlags = nsIWebProgress::flag_net_start; - parentProgressListener->OnChildStatusChange(mDocumentChannel, mProgressStatusFlags); - } - } - /* * First notify any observers that the document load has begun... * @@ -615,14 +751,14 @@ void nsDocLoaderImpl::FireOnStartDocumentLoad(nsDocLoaderImpl* aLoadInitiator, continue; } - observer->OnStartDocumentLoad(aLoadInitiator, aURL, mCommand); + observer->OnStartDocumentLoad(aLoadInitiator, uri, mCommand); } /* * Finally notify the parent... */ if (mParent) { - mParent->FireOnStartDocumentLoad(aLoadInitiator, aURL); + mParent->FireOnStartDocumentLoad(aLoadInitiator, aDocChannel); } } @@ -632,63 +768,22 @@ void nsDocLoaderImpl::FireOnEndDocumentLoad(nsDocLoaderImpl* aLoadInitiator, { #if defined(DEBUG) - nsCOMPtr uri; nsXPIDLCString buffer; - nsresult rv = NS_OK; - if (aDocChannel) - rv = aDocChannel->GetURI(getter_AddRefs(uri)); - if (NS_SUCCEEDED(rv)) { - if (uri) - rv = uri->GetSpec(getter_Copies(buffer)); - if (NS_SUCCEEDED(rv) && buffer != nsnull) { - if (aLoadInitiator == this) { - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: ++ Firing OnEndDocumentLoad(...)" - "\tURI: %s Status: %x\n", - this, (const char *) buffer, aStatus)); - } else { - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: -- Propagating OnEndDocumentLoad(...)." - "DocLoader:%p URI:%s\n", - this, aLoadInitiator, (const char *)buffer)); - } - } - } + + GetURIStringFromChannel(aDocChannel, buffer); + if (aLoadInitiator == this) { + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: ++ Firing OnEndDocumentLoad(...)" + "\tURI: %s Status: %x\n", + this, (const char *) buffer, aStatus)); + } else { + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: -- Propagating OnEndDocumentLoad(...)." + "DocLoader:%p URI:%s\n", + this, aLoadInitiator, (const char *)buffer)); + } #endif /* DEBUG */ - if (aLoadInitiator == this) - { - nsCOMPtr parentProgressListener; - GetParentWebProgressListener(this, getter_AddRefs(parentProgressListener)); - if (parentProgressListener && (parentProgressListener.get() != mProgressListener.get())) - { -#if defined(DEBUG) - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: ++ Firing OnChildStatusChange for end document load (...).\tURI: %s \tWebProgressListener: %p\n", - this, (const char *) buffer, parentProgressListener.get())); -#endif - mProgressStatusFlags = nsIWebProgress::flag_net_stop; - parentProgressListener->OnChildStatusChange(aDocChannel, mProgressStatusFlags); - } - } - - PRBool isBusy = PR_FALSE; - IsBusy(&isBusy); - // if we have a web progress listener, propagate the fact that we are stoppinging a document load - // only signal a OnStatusChange iff we are the doc loader which initiated the onEndDocumentLoad - // OR the on end document load we are receiving is the last one for the doc loader hierarchy (i.e. it - // isn't busy anymore). - if (mProgressListener && (aLoadInitiator == this || !isBusy )) - { -#if defined(DEBUG) - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: ++ Firing OnStatusChange for end document load (...).\tURI: %s \tWebProgressListener: %p\n", - this, (const char *) buffer, mProgressListener.get())); -#endif - mProgressStatusFlags = nsIWebProgress::flag_net_stop; - mProgressListener->OnStatusChange(aDocChannel, mProgressStatusFlags); - } - /* * First notify any observers that the document load has finished... * @@ -717,9 +812,6 @@ void nsDocLoaderImpl::FireOnEndDocumentLoad(nsDocLoaderImpl* aLoadInitiator, if (mParent) { mParent->FireOnEndDocumentLoad(aLoadInitiator, aDocChannel, aStatus); } - - // now forget about our progress listener... -// mProgressListener = nsnull; } @@ -727,50 +819,22 @@ void nsDocLoaderImpl::FireOnStartURLLoad(nsDocLoaderImpl* aLoadInitiator, nsIChannel* aChannel) { #if defined(DEBUG) - nsCOMPtr uri; nsXPIDLCString buffer; - nsresult rv = NS_OK; - if (aChannel) - rv = aChannel->GetURI(getter_AddRefs(uri)); - if (NS_SUCCEEDED(rv)) { - if (uri) - rv = uri->GetSpec(getter_Copies(buffer)); - if (NS_SUCCEEDED(rv) && buffer != nsnull) { - if (aLoadInitiator == this) { - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: ++ Firing OnStartURLLoad(...)" - "\tURI: %s\n", - this, (const char *) buffer)); - } else { - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: -- Propagating OnStartURLLoad(...)." - "DocLoader:%p URI:%s\n", - this, aLoadInitiator, (const char *) buffer)); - } - } + + GetURIStringFromChannel(aChannel, buffer); + if (aLoadInitiator == this) { + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: ++ Firing OnStartURLLoad(...)" + "\tURI: %s\n", + this, (const char *) buffer)); + } else { + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: -- Propagating OnStartURLLoad(...)." + "DocLoader:%p URI:%s\n", + this, aLoadInitiator, (const char *) buffer)); } #endif /* DEBUG */ - // if we initiated this load AND we have a web progress listener OR we have - // a parent that has a listener, then signal a on child status change to signify that - // we are beginning to load a url contined within the document. - if (aLoadInitiator == this) - { - nsCOMPtr progressListener (mProgressListener); - if (!progressListener) // if we don't have a listener, get the parent listener.... - GetParentWebProgressListener(this, getter_AddRefs(progressListener)); - if (progressListener) - { -#if defined(DEBUG) - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: ++ Firing OnChildStatusChange for start url load (...).\tURI: %s \tWebProgressListener: %p\n", - this, (const char *) buffer, progressListener.get())); -#endif - mProgressStatusFlags = nsIWebProgress::flag_net_start; - progressListener->OnChildStatusChange(aChannel, nsIWebProgress::flag_net_start); - } - } - PRInt32 count; @@ -807,50 +871,21 @@ void nsDocLoaderImpl::FireOnEndURLLoad(nsDocLoaderImpl* aLoadInitiator, nsIChannel* aChannel, nsresult aStatus) { #if defined(DEBUG) - nsCOMPtr uri; nsXPIDLCString buffer; - nsresult rv = NS_OK; - if (aChannel) - rv = aChannel->GetURI(getter_AddRefs(uri)); - if (NS_SUCCEEDED(rv)) { - if (uri) - rv = uri->GetSpec(getter_Copies(buffer)); - if (NS_SUCCEEDED(rv) && buffer != nsnull) { - if (aLoadInitiator == this) { - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: ++ Firing OnEndURLLoad(...)" - "\tURI: %s Status: %x\n", - this, (const char *) buffer, aStatus)); - } else { - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: -- Propagating OnEndURLLoad(...)." - "DocLoader:%p URI:%s\n", - this, aLoadInitiator, (const char *) buffer)); - } - } + + GetURIStringFromChannel(aChannel, buffer); + if (aLoadInitiator == this) { + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: ++ Firing OnEndURLLoad(...)" + "\tURI: %s Status: %x\n", + this, (const char *) buffer, aStatus)); + } else { + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: -- Propagating OnEndURLLoad(...)." + "DocLoader:%p URI:%s\n", + this, aLoadInitiator, (const char *) buffer)); } #endif /* DEBUG */ - - // if we initiated this load AND we have a web progress listener OR we have - // a parent that has a listener, then signal a on child status change to signify that - // we are done loading a url contained within the document. - if (aLoadInitiator == this) - { - nsCOMPtr progressListener (mProgressListener); - if (!progressListener) // if we don't have a listener, get the parent listener.... - GetParentWebProgressListener(this, getter_AddRefs(progressListener)); - - if (progressListener) - { -#if defined(DEBUG) - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: ++ Firing OnChildStatusChange for end url load (...).\tURI: %s \tWebProgressListener: %p\n", - this, (const char *) buffer, progressListener.get())); -#endif - mProgressStatusFlags = nsIWebProgress::flag_net_stop; - progressListener->OnChildStatusChange(aChannel, nsIWebProgress::flag_net_stop); - } - } PRInt32 count; @@ -891,41 +926,42 @@ void nsDocLoaderImpl::FireOnEndURLLoad(nsDocLoaderImpl* aLoadInitiator, // to see if one of our parent doc loaders has one. nsresult nsDocLoaderImpl::GetParentWebProgressListener(nsDocLoaderImpl * aDocLoader, nsIWebProgressListener ** aWebProgress) { - // only return our progress listener if we aren't the one asking for the parent - // web progress listener... - if (mProgressListener && aDocLoader != this) - { - *aWebProgress = mProgressListener; - NS_ADDREF(*aWebProgress); - } - else if (mParent) - return mParent->GetParentWebProgressListener(aDocLoader, aWebProgress); - else - { - // if we got here, there is no web progress to return - *aWebProgress = nsnull; - } + // if we got here, there is no web progress to return + *aWebProgress = nsnull; return NS_OK; } -NS_IMETHODIMP nsDocLoaderImpl::AddProgressListener(nsIWebProgressListener *listener) +NS_IMETHODIMP +nsDocLoaderImpl::AddProgressListener(nsIWebProgressListener *aListener) { - // the doc loader only needs to worry about the progress listener for the docshell. - // it in turn actually manages the list of web progress listeners... - mProgressListener = listener; - return NS_OK; + nsresult rv; + + if (mListenerList.IndexOf(aListener) == -1) { + + // XXX this method incorrectly returns a bool + rv = mListenerList.AppendElement(aListener) ? NS_OK : NS_ERROR_FAILURE; + } else { + // The listener is already in the list... + rv = NS_ERROR_FAILURE; + } + return rv; } -NS_IMETHODIMP nsDocLoaderImpl::RemoveProgressListener(nsIWebProgressListener *listener) +NS_IMETHODIMP +nsDocLoaderImpl::RemoveProgressListener(nsIWebProgressListener *aListener) { - mProgressListener = nsnull; - return NS_OK; + nsresult rv; + + // XXX this method incorrectly returns a bool + rv = mListenerList.RemoveElement(aListener) ? NS_OK : NS_ERROR_FAILURE; + + return rv; } -NS_IMETHODIMP nsDocLoaderImpl::GetProgressStatusFlags(PRInt32 *aProgressStatusFlags) +NS_IMETHODIMP nsDocLoaderImpl::GetProgressStatusFlags(PRInt32 *aProgressStateFlags) { - *aProgressStatusFlags = mProgressStatusFlags; + *aProgressStateFlags = mProgressStateFlags; return NS_OK; } @@ -945,38 +981,17 @@ NS_IMETHODIMP nsDocLoaderImpl::GetMaxSelfProgress(PRInt32 *aMaxSelfProgress) NS_IMETHODIMP nsDocLoaderImpl::GetCurTotalProgress(PRInt32 *aCurTotalProgress) { - *aCurTotalProgress = mCurrentSelfProgress; - - PRUint32 count = 0; - nsresult rv = NS_OK; - PRInt32 invididualProgress; - rv = mChildList->Count(&count); - if (NS_FAILED(rv)) return rv; - nsCOMPtr webProgress; - nsCOMPtr docloader; - for (PRUint32 i=0; iElementAt(i)); - if (docloader) - { - webProgress = do_QueryInterface(docloader); - webProgress->GetCurTotalProgress(&invididualProgress); - } - *aCurTotalProgress += invididualProgress; - } - + *aCurTotalProgress = mCurrentTotalProgress; return NS_OK; } NS_IMETHODIMP nsDocLoaderImpl::GetMaxTotalProgress(PRInt32 *aMaxTotalProgress) { - *aMaxTotalProgress = mMaxSelfProgress; - PRUint32 count = 0; nsresult rv = NS_OK; - PRInt32 invididualProgress; + PRInt32 invididualProgress, newMaxTotal; + + newMaxTotal = 0; rv = mChildList->Count(&count); if (NS_FAILED(rv)) return rv; @@ -994,12 +1009,18 @@ NS_IMETHODIMP nsDocLoaderImpl::GetMaxTotalProgress(PRInt32 *aMaxTotalProgress) if (invididualProgress < 0) // if one of the elements doesn't know it's size // then none of them do { - *aMaxTotalProgress = -1; + newMaxTotal = -1; break; } else - *aMaxTotalProgress += invididualProgress; + newMaxTotal += invididualProgress; } + if (mMaxSelfProgress >= 0 && newMaxTotal >= 0) { + *aMaxTotalProgress = newMaxTotal + mMaxSelfProgress; + } else { + *aMaxTotalProgress = -1; + } + return NS_OK; } @@ -1010,38 +1031,78 @@ NS_IMETHODIMP nsDocLoaderImpl::GetMaxTotalProgress(PRInt32 *aMaxTotalProgress) // then turns around and makes the right web progress calls based on this information. //////////////////////////////////////////////////////////////////////////////////// -NS_IMETHODIMP nsDocLoaderImpl::OnProgress(nsIChannel* channel, nsISupports* ctxt, +NS_IMETHODIMP nsDocLoaderImpl::OnProgress(nsIChannel* aChannel, nsISupports* ctxt, PRUint32 aProgress, PRUint32 aProgressMax) { - mCurrentSelfProgress = aProgress; - mMaxSelfProgress = aProgressMax; + nsChannelInfo *info; + PRInt32 progressDelta = 0; - PRInt32 currentTotal = 0; - PRInt32 currentMax = 0; + // + // Update the ChannelInfo entry with the new progress data + // + info = GetChannelInfo(aChannel); + if (info) { + if ((0 == info->mCurrentProgress) && (0 == info->mMaxProgress)) { + // + // This is the first progress notification for the entry. If + // (aMaxProgress > 0) then the content-length of the data is known, + // so update mMaxSelfProgress... Otherwise, set it to -1 to indicate + // that the content-length is no longer known. + // + if (aProgressMax != (PRUint32)-1) { + mMaxSelfProgress += aProgressMax; + info->mMaxProgress = aProgressMax; + } else { + mMaxSelfProgress = -1; + info->mMaxProgress = -1; + } - GetMaxTotalProgress(¤tMax); - GetCurTotalProgress(¤tTotal); + // Send a flag_transferring notification for the request. + PRInt32 flags; + + flags = nsIWebProgressListener::flag_transferring | + nsIWebProgressListener::flag_is_request; + // + // Move the WebProgress into the flag_transferring state if necessary... + // + if (mProgressStateFlags & nsIWebProgressListener::flag_start) { + mProgressStateFlags = nsIWebProgressListener::flag_transferring; - // if for some reason the max is less than the # we've already processed, - // then just assume we really don't know the max - if (currentMax < currentTotal) - currentMax = -1; + // Send flag_transferring for the document too... + flags |= nsIWebProgressListener::flag_is_document; + } - if (mProgressListener) - mProgressListener->OnProgressChange(channel, mCurrentSelfProgress, mMaxSelfProgress, - currentTotal /* current total progress */, currentMax /* max total progress */); - // if we have a parent progress listener, then signal a on child progress change to it - nsCOMPtr parentProgressListener; - GetParentWebProgressListener(this, getter_AddRefs(parentProgressListener)); - if (parentProgressListener) - { - parentProgressListener->OnChildProgressChange(channel, mCurrentSelfProgress, mMaxSelfProgress); + FireOnStateChange(this, aChannel, flags, NS_OK); + } + + // Update the current progress count... + progressDelta = aProgress - info->mCurrentProgress; + mCurrentSelfProgress += progressDelta; + + info->mCurrentProgress = aProgress; + } + // + // The channel is not part of the load group, so ignore its progress + // information... + // + else { +#if defined(DEBUG) + nsXPIDLCString buffer; + + GetURIStringFromChannel(aChannel, buffer); + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p OOPS - No Channel Info for: %s\n", + this, (const char *)buffer)); +#endif /* DEBUG */ + + return NS_OK; } - // we have to inform our parent that our progress changed so the parent can trigger - // a OnProgresschange for it's progressListener - if (mParent) - mParent->ChildProgressChange(this); + // + // Fire progress notifications out to any registered nsIWebProgressListeners + // + FireOnProgressChange(this, aChannel, aProgress, aProgressMax, progressDelta, + mCurrentTotalProgress, mMaxTotalProgress); return NS_OK; } @@ -1053,12 +1114,278 @@ NS_IMETHODIMP nsDocLoaderImpl::OnStatus(nsIChannel* channel, nsISupports* ctxt, void nsDocLoaderImpl::ClearInternalProgress() { - mCurrentSelfProgress = 0; - mMaxSelfProgress = 0; + ClearChannelInfoList(); + + mCurrentSelfProgress = mMaxSelfProgress = 0; + mCurrentTotalProgress = mMaxTotalProgress = 0; + + mProgressStateFlags = nsIWebProgressListener::flag_stop; } -void nsDocLoaderImpl::ChildProgressChange(nsDocLoaderImpl * aDocLoader) + +void nsDocLoaderImpl::FireOnProgressChange(nsDocLoaderImpl *aLoadInitiator, + nsIChannel *aChannel, + PRInt32 aProgress, + PRInt32 aProgressMax, + PRInt32 aProgressDelta, + PRInt32 aTotalProgress, + PRInt32 aMaxTotalProgress) { - OnProgress(nsnull, nsnull, mCurrentSelfProgress, mMaxSelfProgress); + PRInt32 count; + + if (mIsLoadingDocument) { + mCurrentTotalProgress += aProgressDelta; + GetMaxTotalProgress(&mMaxTotalProgress); + + aTotalProgress = mCurrentTotalProgress; + aMaxTotalProgress = mMaxTotalProgress; + } + +#if defined(DEBUG) + nsXPIDLCString buffer; + + GetURIStringFromChannel(aChannel, buffer); + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: Progress (%s): curSelf: %d maxSelf: %d curTotal: %d maxTotal %d\n", + this, (const char *)buffer, aProgress, aProgressMax, aTotalProgress, aMaxTotalProgress)); +#endif /* DEBUG */ + + /* + * First notify any listeners of the new progress info... + * + * Operate the elements from back to front so that if items get + * get removed from the list it won't affect our iteration + */ + count = mListenerList.Count(); + while (count > 0) { + nsIWebProgressListener *listener; + + listener = NS_STATIC_CAST(nsIWebProgressListener*, + mListenerList.ElementAt(--count)); + + NS_ASSERTION(listener, "NULL listener found in list."); + if (! listener) { + continue; + } + + listener->OnProgressChange(aLoadInitiator,aChannel, + aProgress, aProgressMax, + aTotalProgress, aMaxTotalProgress); + } + + // Pass the notification up to the parent... + if (mParent) { + mParent->FireOnProgressChange(aLoadInitiator, aChannel, + aProgress, aProgressMax, + aProgressDelta, + aTotalProgress, aMaxTotalProgress); + } } + + +void nsDocLoaderImpl::FireOnStateChange(nsIWebProgress *aProgress, + nsIRequest *aRequest, + PRInt32 aStateFlags, + nsresult aStatus) +{ + PRInt32 count; + + // + // Remove the flag_is_network bit if necessary. + // + // The rule is to remove this bit, if the notification has been passed + // up from a child WebProgress, and the current WebProgress is already + // active... + // + if (mIsLoadingDocument && + (aStateFlags & nsIWebProgressListener::flag_is_network) && + (this != aProgress)) { + aStateFlags &= ~nsIWebProgressListener::flag_is_network; + } + +#if defined(DEBUG) + nsXPIDLCString buffer; + + GetURIStringFromChannel(aRequest, buffer); + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: Status (%s): code: %x\n", + this, (const char *)buffer, aStateFlags)); +#endif /* DEBUG */ + + + /* + * First notify any listeners of the new state info... + * + * Operate the elements from back to front so that if items get + * get removed from the list it won't affect our iteration + */ + count = mListenerList.Count(); + while (count > 0) { + nsIWebProgressListener *listener; + + listener = NS_STATIC_CAST(nsIWebProgressListener*, + mListenerList.ElementAt(--count)); + + NS_ASSERTION(listener, "NULL listener found in list."); + if (! listener) { + continue; + } + + listener->OnStateChange(aProgress, aRequest, aStateFlags, aStatus); + } + + // Pass the notification up to the parent... + if (mParent) { + mParent->FireOnStateChange(aProgress, aRequest, aStateFlags, aStatus); + } +} + + +NS_IMETHODIMP +nsDocLoaderImpl::FireOnLocationChange(nsIURI *aUri) +{ + PRInt32 count; + + count = mListenerList.Count(); + while (count > 0) { + nsIWebProgressListener *listener; + + listener = NS_STATIC_CAST(nsIWebProgressListener*, + mListenerList.ElementAt(--count)); + + NS_ASSERTION(listener, "NULL listener found in list."); + if (! listener) { + continue; + } + + listener->OnLocationChange(aUri); + } + + return NS_OK; +} + +nsresult nsDocLoaderImpl::AddChannelInfo(nsIChannel *aChannel) +{ + nsresult rv; + PRUint32 loadAttribs=nsIChannel::LOAD_NORMAL; + + // + // Only create a ChannelInfo entry if the channel is *not* being loaded + // in the background... + // + rv = aChannel->GetLoadAttributes(&loadAttribs); + if (!(nsIChannel::LOAD_BACKGROUND & loadAttribs)) { + nsChannelInfo *info; + + info = new nsChannelInfo(aChannel); + if (info) { + // XXX this method incorrectly returns a bool + rv = mChannelInfoList.AppendElement(info) ? NS_OK : NS_ERROR_FAILURE; + } else { + rv = NS_ERROR_OUT_OF_MEMORY; + } + } + else { + rv = NS_OK; + } + return rv; +} + +nsChannelInfo * nsDocLoaderImpl::GetChannelInfo(nsIChannel *aChannel) +{ + nsChannelInfo *info; + PRInt32 i, count; + + count = mChannelInfoList.Count(); + for(i=0; imKey) { + return info; + } + } + + return nsnull; +} + +nsresult nsDocLoaderImpl::ClearChannelInfoList(void) +{ + nsChannelInfo *info; + PRInt32 i, count; + + count = mChannelInfoList.Count(); + for(i=0; imCurrentProgress; + if (max >= 0) { + if (info->mMaxProgress < info->mCurrentProgress) { + max = -1; + } else { + max += info->mMaxProgress; + } + } + } + + *aMax = max; +} + + +#if 0 +void nsDocLoaderImpl::DumpChannelInfo() +{ + nsChannelInfo *info; + PRInt32 i, count; + PRInt32 current=0, max=0; + + + printf("==== DocLoader=%x\n", this); + + count = mChannelInfoList.Count(); + for(i=0; imURI) { + rv = info->mURI->GetSpec(getter_Copies(buffer)); + } + + printf(" [%d] current=%d max=%d [%s]\n", i, + info->mCurrentProgress, + info->mMaxProgress, (const char *)buffer); +#endif /* DEBUG */ + + current += info->mCurrentProgress; + if (max >= 0) { + if (info->mMaxProgress < info->mCurrentProgress) { + max = -1; + } else { + max += info->mMaxProgress; + } + } + } + + printf("\nCurrent=%d Total=%d\n====\n", current, max); +} +#endif /* 0 */ \ No newline at end of file diff --git a/mozilla/uriloader/base/nsDocLoader.h b/mozilla/uriloader/base/nsDocLoader.h index df588f909e8..f30f0f25470 100644 --- a/mozilla/uriloader/base/nsDocLoader.h +++ b/mozilla/uriloader/base/nsDocLoader.h @@ -40,6 +40,7 @@ #include "nsIInterfaceRequestor.h" #include "nsCOMPtr.h" +struct nsChannelInfo; /**************************************************************************** * nsDocLoaderImpl implementation... @@ -82,7 +83,7 @@ protected: void DocLoaderIsEmpty(nsresult aStatus); void FireOnStartDocumentLoad(nsDocLoaderImpl* aLoadInitiator, - nsIURI* aURL); + nsIChannel* aChannel); void FireOnEndDocumentLoad(nsDocLoaderImpl* aLoadInitiator, nsIChannel *aDocChannel, @@ -94,14 +95,28 @@ protected: void FireOnEndURLLoad(nsDocLoaderImpl* aLoadInitiator, nsIChannel* channel, nsresult aStatus); + void FireOnProgressChange(nsDocLoaderImpl* aLoadInitiator, + nsIChannel* aChannel, + PRInt32 aProgress, + PRInt32 aProgressMax, + PRInt32 aProgressDelta, + PRInt32 aTotalProgress, + PRInt32 aMaxTotalProgress); + + void FireOnStateChange(nsIWebProgress *aProgress, + nsIRequest* aChannel, + PRInt32 aStateFlags, + nsresult aStatus); + + void doStartDocumentLoad(); + void doStartURLLoad(nsIChannel *aChannel); + void doStopURLLoad(nsIChannel *aChannel, nsresult aStatus); + void doStopDocumentLoad(nsIChannel* aChannel, nsresult aStatus); + // get web progress returns our web progress listener or if // we don't have one, it will look up the doc loader hierarchy // to see if one of our parent doc loaders has one. nsresult GetParentWebProgressListener(nsDocLoaderImpl * aDocLoader, nsIWebProgressListener ** aWebProgres); - // if a child doc loader's progress changed, they'll call this method - // on their parent docloader. this is so the parent knows to trigger OnProgress - // on the progress listener - void ChildProgressChange(nsDocLoaderImpl * aDocLoader); protected: @@ -113,6 +128,7 @@ protected: nsCOMPtr mDocumentChannel; // [OWNER] ???compare with document nsVoidArray mDocObservers; + nsVoidArray mListenerList; nsISupports* mContainer; // [WEAK] it owns me! nsDocLoaderImpl* mParent; // [WEAK] @@ -132,10 +148,23 @@ protected: // The following member variables are related to the new nsIWebProgress // feedback interfaces that travis cooked up. nsCOMPtr mProgressListener; - PRInt32 mProgressStatusFlags; + PRInt32 mProgressStateFlags; + PRInt32 mCurrentSelfProgress; PRInt32 mMaxSelfProgress; - + + PRInt32 mCurrentTotalProgress; + PRInt32 mMaxTotalProgress; + + nsVoidArray mChannelInfoList; + +private: + nsresult AddChannelInfo(nsIChannel *aChannel); + nsChannelInfo *GetChannelInfo(nsIChannel *aChannel); + nsresult ClearChannelInfoList(void); + void CalculateMaxProgress(PRInt32 *aMax); +/// void DumpChannelInfo(void); + // used to clear our internal progress state between loads... void ClearInternalProgress(); }; diff --git a/mozilla/uriloader/base/nsIDocumentLoader.idl b/mozilla/uriloader/base/nsIDocumentLoader.idl index abfab2016e9..980ba59919d 100644 --- a/mozilla/uriloader/base/nsIDocumentLoader.idl +++ b/mozilla/uriloader/base/nsIDocumentLoader.idl @@ -49,5 +49,7 @@ interface nsIDocumentLoader : nsISupports // this should really be in a private interface as it is only // called between a parent doc loader and it's child. void clearParentDocLoader(); + + void fireOnLocationChange(in nsIURI aUri); }; diff --git a/mozilla/uriloader/base/nsIWebProgressListener.idl b/mozilla/uriloader/base/nsIWebProgressListener.idl index c43c29bdde5..3d5566cd4c0 100644 --- a/mozilla/uriloader/base/nsIWebProgressListener.idl +++ b/mozilla/uriloader/base/nsIWebProgressListener.idl @@ -23,82 +23,83 @@ #include "nsISupports.idl" /** - * The nsIWebProgressListener is the interface implemented by clients wishing to - * listen in on a progress object. + * The nsIWebProgressListener interface is implemented by clients wishing to + * listen in on the progress associated with the loading of documents. */ +interface nsIRequest; +interface nsIWebProgress; interface nsIChannel; interface nsIURI; [scriptable, uuid(570F39D1-EFD0-11d3-B093-00A024FFC08C)] interface nsIWebProgressListener : nsISupports { - /* - Notification of that the progress has changed for the main object we are - tracking progress for. + /** + * Progress state transition bits. + * These flags indicate the various states that documents and requests + * may transition through as they are being loaded. + */ + const long flag_start = 0x00000001; + const long flag_redirecting = 0x00000002; + const long flag_transferring = 0x00000004; + const long flag_negotiating = 0x00000008; + const long flag_stop = 0x00000010; - @param channel - The main channel that is loading that we are tracking - progress for. - - @param curSelfProgress - The current position of progress. This is - between 0 and maxSelfProgress. This is the position of only this - progress object. It doesn not include the progress of all children. - - @param maxSelfProgress - The maximum position that progress will go to. - This sets a relative position point for the current progress to relate - to. This is the max position of only this progress object. It does not - include the progress of all the children. - - @param curTotalProgress - The current position of progress for this object - and all children added together. This is between 0 and maxTotalProgress. - - @param maxTotalProgress - The maximum position that progress will go to for - the max of this progress object and all children. This sets the relative - position point for the current progress to relate to. - */ - void onProgressChange(in nsIChannel channel, in long curSelfProgress, - in long maxSelfProgress, in long curTotalProgress, - in long maxTotalProgress); - - /* - Notification that the progress has changed for a child of the main object - we are tracking progress for. - - @param channel - The child channel that we are getting this progress change - for. - - @param curChildProgress - The current position of progress. This is - between 0 and maxSelfProgress. This is the position of only this - child progress object. - - @param maxChildProgress - The maximum position that progress will go to. - This sets a relative position point for the current progress to relate - to. This is the max position of only this child progress object. - */ - void onChildProgressChange(in nsIChannel channel, in long curChildProgress, - in long maxChildProgress); - - /* - Notification that the progress status flags have changed for the main item - we are tracking progress for. - - @param channel - The main channel that is loading that we are tracking - progress for. - @param progressStatusFlags - This is the current progressStatusFlags. This - will be one or a combination of the progress status flags. - */ - void onStatusChange(in nsIChannel channel, in long progressStatusFlags); - - /* - Notification that the progress status flags have changed for a child of the - main item we are tracking progress for.. - - @param channel - The child channel that this status change message is for. - @param progressStatusFlags - This is the current progressStatusFlags. This - will be one or a combination of the progress status flags. - */ - void onChildStatusChange(in nsIChannel channel, in long progressStatusFlags); + /** + * Progress type bits. + * These flags indicate whether the transition is occuring on a document + * or an individual request within the document. + */ + const long flag_is_request = 0x00010000; + const long flag_is_document = 0x00020000; + const long flag_is_network = 0x00040000; + const long flag_is_window = 0x00080000; + /** + * Notification indicating the state has changed for one of the requests + * associated with the document loaded. + * + * @param aWebProgress The nsIWebProgress instance that fired the + * notification + * + * @param aRequest The nsIRequest which has changed state. + * + * @param aStateFlags Flags indicating the state change. + * + * @param aStatus Status code for the state change. + */ + void onStateChange(in nsIWebProgress aWebProgress, + in nsIRequest aRequest, + in long aStateFlags, + in unsigned long aStatus); + /** + * Notification that the progress has changed for one of the requests being + * monitored. + * + * @param aWebProgress The nsIWebProgress instance that fired the + * notification + * + * @param aRequest The nsIRequest that has new progress. + * + * @param aCurSelfProgress The current progress for aRequest. + * + * @param aMaxSelfProgress The maximum progress for aRequest. If this + * value is not known then -1 is passed. + * + * @param aCurTotalProgress The current progress for all the requests + * being monitored. + * + * @param aMaxTotalProgress The total progress for all the requests being + * monitored. If this value is not known then + * -1 is passed. + */ + void onProgressChange(in nsIWebProgress aWebProgress, + in nsIRequest aRequest, + in long aCurSelfProgress, + in long aMaxSelfProgress, + in long aCurTotalProgress, + in long aMaxTotalProgress); /* Called when the window being watched changes the location that is currently. This is not when a load is requested, but rather once it is verified that diff --git a/mozilla/uriloader/base/nsURILoader.cpp b/mozilla/uriloader/base/nsURILoader.cpp index 0763110d540..d35bbb48ec1 100644 --- a/mozilla/uriloader/base/nsURILoader.cpp +++ b/mozilla/uriloader/base/nsURILoader.cpp @@ -586,19 +586,6 @@ NS_IMETHODIMP nsURILoader::OpenURIVia(nsIChannel * aChannel, nsCOMPtr loadCookie; SetupLoadCookie(retargetedWindowContext, getter_AddRefs(loadCookie)); - // every time we do a load, we should reset the progress listener on it... - if (loadCookie) - { - // bind the web progress listener (if there is one) to the web progress - // instance of the doc loader.. - nsCOMPtr docLoader (do_GetInterface(loadCookie)); - nsCOMPtr webProgress (do_QueryInterface(docLoader)); - nsCOMPtr webProgressListener (do_GetInterface(retargetedWindowContext)); - if (webProgress && webProgressListener) - webProgress->AddProgressListener(webProgressListener); - } - - loader->Init(retargetedWindowContext, aOriginalWindowContext); // Extra Info // now instruct the loader to go ahead and open the url diff --git a/mozilla/webshell/src/nsWebShell.cpp b/mozilla/webshell/src/nsWebShell.cpp index e9580795bff..586751bddd2 100644 --- a/mozilla/webshell/src/nsWebShell.cpp +++ b/mozilla/webshell/src/nsWebShell.cpp @@ -402,6 +402,7 @@ nsWebShell::~nsWebShell() mDocLoader->Stop(); mDocLoader->RemoveObserver((nsIDocumentLoaderObserver*)this); mDocLoader->SetContainer(nsnull); + mDocLoader->Destroy(); NS_RELEASE(mDocLoader); } // Cancel any timers that were set for this loader. @@ -1138,7 +1139,7 @@ nsWebShell::OnEndDocumentLoad(nsIDocumentLoader* loader, during this load handler. */ nsCOMPtr kungFuDeathGrip(this); - if(mScriptGlobal && !mEODForCurrentDocument) + if(mScriptGlobal && !mEODForCurrentDocument && NS_SUCCEEDED(aStatus)) { if(mContentViewer) { diff --git a/mozilla/webshell/tests/viewer/nsWebBrowserChrome.cpp b/mozilla/webshell/tests/viewer/nsWebBrowserChrome.cpp index 40ab5c6f470..73869e2f84f 100644 --- a/mozilla/webshell/tests/viewer/nsWebBrowserChrome.cpp +++ b/mozilla/webshell/tests/viewer/nsWebBrowserChrome.cpp @@ -45,6 +45,8 @@ nsWebBrowserChrome::nsWebBrowserChrome() : mBrowserWindow(nsnull), mTimerSet(PR_ { NS_INIT_REFCNT(); + + mActiveDocuments = 0; } nsWebBrowserChrome::~nsWebBrowserChrome() @@ -343,51 +345,84 @@ NS_IMETHODIMP nsWebBrowserChrome::SetTitle(const PRUnichar* aTitle) // nsWebBrowserChrome::nsIWebProgressListener //***************************************************************************** -NS_IMETHODIMP nsWebBrowserChrome::OnProgressChange(nsIChannel* aChannel, - PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, - PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress) +NS_IMETHODIMP +nsWebBrowserChrome::OnProgressChange(nsIWebProgress* aProgress, + nsIRequest* aRequest, + PRInt32 aCurSelfProgress, + PRInt32 aMaxSelfProgress, + PRInt32 aCurTotalProgress, + PRInt32 aMaxTotalProgress) { + mProgress = aCurTotalProgress; + mMaxProgress = aMaxTotalProgress; + if(mBrowserWindow->mStatus) { + nsAutoString buf; + PRUint32 size; + + buf.AppendWithConversion("Loaded "); + buf.AppendInt(mCurrent); + buf.AppendWithConversion(" of "); + buf.AppendInt(mTotal); + buf.AppendWithConversion(" items. ("); + buf.AppendInt(mProgress); + buf.AppendWithConversion(" bytes of "); + buf.AppendInt(mMaxProgress); + buf.AppendWithConversion(" bytes)"); + + mBrowserWindow->mStatus->SetText(buf,size); + } return NS_OK; } -NS_IMETHODIMP nsWebBrowserChrome::OnChildProgressChange(nsIChannel* aChannel, - PRInt32 aCurChildProgress, PRInt32 aMaxChildProgress) +NS_IMETHODIMP +nsWebBrowserChrome::OnStateChange(nsIWebProgress* aProgress, + nsIRequest* aRequest, + PRInt32 aProgressStateFlags, + nsresult aStatus) { - return NS_OK; -} - -NS_IMETHODIMP nsWebBrowserChrome::OnStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) -{ - if(aProgressStatusFlags & nsIWebProgress::flag_net_start) - OnLoadStart(aChannel); - else if(aProgressStatusFlags & nsIWebProgress::flag_net_stop) - OnLoadFinished(aChannel, aProgressStatusFlags); - else if(aProgressStatusFlags & nsIWebProgress::flag_net_dns) - OnStatusDNS(aChannel); - else if(aProgressStatusFlags & nsIWebProgress::flag_net_connecting) - OnStatusConnecting(aChannel); - else if(aProgressStatusFlags & nsIWebProgress::flag_net_redirecting) - OnStatusRedirecting(aChannel); - else if(aProgressStatusFlags & nsIWebProgress::flag_net_negotiating) - OnStatusNegotiating(aChannel); - else if(aProgressStatusFlags & nsIWebProgress::flag_net_transferring) - OnStatusTransferring(aChannel); - - if(aProgressStatusFlags & nsIWebProgress::flag_win_start) + if (aProgressStateFlags & flag_start) { + if (aProgressStateFlags & flag_is_network) { OnWindowActivityStart(); - else if(aProgressStatusFlags & nsIWebProgress::flag_win_stop) + OnLoadStart(aRequest); + } + if (aProgressStateFlags & flag_is_request) { + mTotal += 1; + } + } + + if (aProgressStateFlags & flag_stop) { + if (aProgressStateFlags & flag_is_request) { + mCurrent += 1; + + if(mBrowserWindow->mStatus) { + nsAutoString buf; + PRUint32 size; + + buf.AppendWithConversion("Loaded "); + buf.AppendInt(mCurrent); + buf.AppendWithConversion(" of "); + buf.AppendInt(mTotal); + buf.AppendWithConversion(" items. ("); + buf.AppendInt(mProgress); + buf.AppendWithConversion(" bytes of "); + buf.AppendInt(mMaxProgress); + buf.AppendWithConversion(" bytes)"); + + mBrowserWindow->mStatus->SetText(buf,size); + } + } + + if (aProgressStateFlags & flag_is_network) { + OnLoadFinished(aRequest, aProgressStateFlags); OnWindowActivityFinished(); + } + } - return NS_OK; -} + if (aProgressStateFlags & flag_transferring) { + OnStatusTransferring(aRequest); + } -NS_IMETHODIMP nsWebBrowserChrome::OnChildStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) -{ - //XXXTAB Implement - NS_ERROR("NotYetImplemented"); - return NS_OK; + return NS_OK; } NS_IMETHODIMP nsWebBrowserChrome::OnLocationChange(nsIURI* aURI) @@ -430,17 +465,20 @@ nsBrowserWindow* nsWebBrowserChrome::BrowserWindow() // nsWebBrowserChrome: Status Change Handling //***************************************************************************** -void nsWebBrowserChrome::OnLoadStart(nsIChannel* aChannel) +void nsWebBrowserChrome::OnLoadStart(nsIRequest* aRequest) { - mBrowserWindow->mLoadStartTime = PR_Now(); +mCurrent=mTotal=mProgress=mMaxProgress=0; - if(mBrowserWindow->mThrobber) - mBrowserWindow->mThrobber->Start(); + mBrowserWindow->mLoadStartTime = PR_Now(); - if (aChannel) { + if (aRequest) { + nsresult rv; + nsCOMPtr channel; + nsCOMPtr uri; - nsCOMPtr uri; - aChannel->GetURI(getter_AddRefs(uri)); + channel = do_QueryInterface(aRequest, &rv); + if (NS_SUCCEEDED(rv)) { + channel->GetURI(getter_AddRefs(uri)); #ifdef MOZ_PERF_METRICS if (PR_FALSE == mTimerSet) { @@ -458,8 +496,7 @@ void nsWebBrowserChrome::OnLoadStart(nsIChannel* aChannel) } #endif - if(mBrowserWindow->mStatus) - { + if(mBrowserWindow->mStatus) { nsXPIDLCString uriString; uri->GetSpec(getter_Copies(uriString)); @@ -468,15 +505,16 @@ void nsWebBrowserChrome::OnLoadStart(nsIChannel* aChannel) url.AppendWithConversion(": start"); PRUint32 size; mBrowserWindow->mStatus->SetText(url,size); - } - } // if (aChannel) + } + } + } // if (aChannel) } -void nsWebBrowserChrome::OnLoadFinished(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) +void nsWebBrowserChrome::OnLoadFinished(nsIRequest* aRequest, + PRInt32 aProgressStatusFlags) { #ifdef MOZ_PERF_METRICS - if ( (aProgressStatusFlags & nsIWebProgress::flag_win_stop) && mTimerSet ) { + if ( /*(aProgressStatusFlags & nsIWebProgress::flag_win_stop) && */mTimerSet ) { MOZ_TIMER_DEBUGLOG(("Stop: nsWebShell::OnEndDocumentLoad(), this=%p\n", this)); MOZ_TIMER_STOP(mTotalTime); MOZ_TIMER_LOG(("Total (Layout + Page Load) Time (webBrowserChrome=%p): ", this)); @@ -485,37 +523,40 @@ void nsWebBrowserChrome::OnLoadFinished(nsIChannel* aChannel, } #endif - nsXPIDLCString uriString; - if(aChannel) - { - nsCOMPtr uri; - aChannel->GetURI(getter_AddRefs(uri)); + nsXPIDLCString uriString; + if(aRequest) { + nsresult rv; + nsCOMPtr channel; + nsCOMPtr uri; + + channel = do_QueryInterface(channel, &rv); + if (NS_SUCCEEDED(rv)) { + channel->GetURI(getter_AddRefs(uri)); uri->GetSpec(getter_Copies(uriString)); - } - - nsAutoString msg; msg.AssignWithConversion(uriString); + } + } + nsAutoString msg; msg.AssignWithConversion(uriString); - PRTime endLoadTime = PR_Now(); - if(mBrowserWindow->mShowLoadTimes) - { - printf("Loading "); - fputs(msg, stdout); - PRTime delta; - LL_SUB(delta, endLoadTime, mBrowserWindow->mLoadStartTime); - double usecs; - LL_L2D(usecs, delta); - printf(" took %g milliseconds\n", usecs / 1000.0); - } - if(mBrowserWindow->mThrobber) - mBrowserWindow->mThrobber->Stop(); - if(mBrowserWindow->mStatus) - { - PRUint32 size; + PRTime endLoadTime = PR_Now(); + if(mBrowserWindow->mShowLoadTimes) + { + printf("Loading "); + fputs(msg, stdout); + PRTime delta; + LL_SUB(delta, endLoadTime, mBrowserWindow->mLoadStartTime); + double usecs; + LL_L2D(usecs, delta); + printf(" took %g milliseconds\n", usecs / 1000.0); + } - msg.AppendWithConversion(" done."); + if(mBrowserWindow->mStatus) + { + PRUint32 size; - mBrowserWindow->mStatus->SetText(msg, size); + msg.AppendWithConversion(" done."); + +/// mBrowserWindow->mStatus->SetText(msg, size); } } @@ -549,14 +590,20 @@ void nsWebBrowserChrome::OnStatusNegotiating(nsIChannel* aChannel) { } -void nsWebBrowserChrome::OnStatusTransferring(nsIChannel* aChannel) +void nsWebBrowserChrome::OnStatusTransferring(nsIRequest* aRequest) { } void nsWebBrowserChrome::OnWindowActivityStart() { + if(mBrowserWindow->mThrobber) + mBrowserWindow->mThrobber->Start(); + } void nsWebBrowserChrome::OnWindowActivityFinished() { + if(mBrowserWindow->mThrobber) + mBrowserWindow->mThrobber->Stop(); + } diff --git a/mozilla/webshell/tests/viewer/nsWebBrowserChrome.h b/mozilla/webshell/tests/viewer/nsWebBrowserChrome.h index 6f717f942fe..3a3f80d58b0 100644 --- a/mozilla/webshell/tests/viewer/nsWebBrowserChrome.h +++ b/mozilla/webshell/tests/viewer/nsWebBrowserChrome.h @@ -59,13 +59,13 @@ protected: nsBrowserWindow* BrowserWindow(); // Status Change Handling - void OnLoadStart(nsIChannel* aChannel); - void OnLoadFinished(nsIChannel* aChannel, PRInt32 aProgressStatusFlags); + void OnLoadStart(nsIRequest* aRequest); + void OnLoadFinished(nsIRequest* aRequest, PRInt32 aProgressStatusFlags); void OnStatusDNS(nsIChannel* aChannel); void OnStatusConnecting(nsIChannel* aChannel); void OnStatusRedirecting(nsIChannel* aChannel); void OnStatusNegotiating(nsIChannel* aChannel); - void OnStatusTransferring(nsIChannel* aChannel); + void OnStatusTransferring(nsIRequest* aRequest); void OnWindowActivityStart(); void OnWindowActivityFinished(); @@ -74,6 +74,9 @@ protected: PRBool mTimerSet; MOZ_TIMER_DECLARE(mTotalTime) + + PRInt32 mActiveDocuments; + PRInt32 mCurrent, mTotal, mProgress, mMaxProgress; }; #endif /* nsWebBrowserChrome_h__ */ diff --git a/mozilla/xpfe/appshell/src/nsChromeTreeOwner.cpp b/mozilla/xpfe/appshell/src/nsChromeTreeOwner.cpp index c711ce99a90..f4a1a3af1bb 100644 --- a/mozilla/xpfe/appshell/src/nsChromeTreeOwner.cpp +++ b/mozilla/xpfe/appshell/src/nsChromeTreeOwner.cpp @@ -317,27 +317,22 @@ NS_IMETHODIMP nsChromeTreeOwner::SetTitle(const PRUnichar* aTitle) // nsChromeTreeOwner::nsIWebProgressListener //***************************************************************************** -NS_IMETHODIMP nsChromeTreeOwner::OnProgressChange(nsIChannel* aChannel, - PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, - PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress) +NS_IMETHODIMP +nsChromeTreeOwner::OnProgressChange(nsIWebProgress* aWebProgress, + nsIRequest* aRequest, + PRInt32 aCurSelfProgress, + PRInt32 aMaxSelfProgress, + PRInt32 aCurTotalProgress, + PRInt32 aMaxTotalProgress) { return NS_OK; } -NS_IMETHODIMP nsChromeTreeOwner::OnChildProgressChange(nsIChannel* aChannel, - PRInt32 aCurChildProgress, PRInt32 aMaxChildProgress) -{ - return NS_OK; -} - -NS_IMETHODIMP nsChromeTreeOwner::OnStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) -{ - return NS_OK; -} - -NS_IMETHODIMP nsChromeTreeOwner::OnChildStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) +NS_IMETHODIMP +nsChromeTreeOwner::OnStateChange(nsIWebProgress* aWebProgress, + nsIRequest* aRequest, + PRInt32 aProgressStateFlags, + nsresult aStatus) { return NS_OK; } diff --git a/mozilla/xpfe/browser/resources/content/navigator.js b/mozilla/xpfe/browser/resources/content/navigator.js index 0565e95a29c..daa99822346 100644 --- a/mozilla/xpfe/browser/resources/content/navigator.js +++ b/mozilla/xpfe/browser/resources/content/navigator.js @@ -62,6 +62,9 @@ catch (ex) var backButton = null; var forwardButton = null; + var useRealProgressFlag = false; + var totalRequests = 0; + var finishedRequests = 0; ///////////////////////////// DOCUMENT SAVE /////////////////////////////////// // focused frame URL @@ -255,8 +258,12 @@ nsXULBrowserWindow.prototype = if(!statusMeter) statusMeter = document.getElementById("statusbar-icon"); var percentage = 0; - if (max > 0) - { + + if (!useRealProgressFlag && (channel != null)) { + return; + } + + if (max > 0) { percentage = (current * 100) / max ; if (statusMeter.getAttribute("mode") != "normal") statusMeter.setAttribute("mode", "normal"); @@ -279,60 +286,70 @@ nsXULBrowserWindow.prototype = if(!stopMenu) stopMenu = document.getElementById("menuitem-stop"); - if(status & Components.interfaces.nsIWebProgress.flag_net_start) - { - // Remember when loading commenced. - startTime = (new Date()).getTime(); - // Turn progress meter on. - statusMeter.setAttribute("mode","undetermined"); - throbberElement.setAttribute("busy", true); - } - else if(status & Components.interfaces.nsIWebProgress.flag_net_stop) - { - // Record page loading time. - var elapsed = ( (new Date()).getTime() - startTime ) / 1000; - var msg = bundle.GetStringFromName("nv_done") + " (" + elapsed + " secs)"; - dump( msg + "\n" ); - defaultStatus = msg; - UpdateStatusField(); - window.XULBrowserWindow.setDefaultStatus(msg); - // Turn progress meter off. - statusMeter.setAttribute("mode","normal"); - statusMeter.value = 0; // be sure to clear the progress bar - statusMeter.progresstext = ""; - throbberElement.setAttribute("busy", false); - } - else if(status & Components.interfaces.nsIWebProgress.flag_net_dns) - { - alert("XXX: Not yet Implemented (navigator.js dns network step."); - } - else if(status & Components.interfaces.nsIWebProgress.flag_net_connecting) - { - alert("XXX: Not yet Implemented (navigator.js connecting network step."); - } - else if(status & Components.interfaces.nsIWebProgress.flag_net_transferring) - { - alert("XXX: Not yet Implemented (navigator.js transferring network step."); - } - else if(status & Components.interfaces.nsIWebProgress.flag_net_redirecting) - { - alert("XXX: Not yet Implemented (navigator.js redirecting network step."); - } - else if(status & Components.interfaces.nsIWebProgress.flag_net_negotiating) - { - alert("XXX: Not yet Implemented (navigator.js negotiating network step."); - } + if (status & Components.interfaces.nsIWebProgressListener.flag_start) { + if(status & Components.interfaces.nsIWebProgressListener.flag_is_network) { + // Remember when loading commenced. + startTime = (new Date()).getTime(); + // Turn progress meter on. + statusMeter.setAttribute("mode","undetermined"); + throbberElement.setAttribute("busy", true); + + // XXX: These need to be based on window activity... + stopButton.setAttribute("disabled", false); + stopMenu.setAttribute("disabled", false); + + // Initialize the progress stuff... + statusMeter.setAttribute("mode","undetermined"); + useRealProgressFlag = false; + totalRequests = 0; + finishedRequests = 0; + } + if (status & Components.interfaces.nsIWebProgressListener.flag_is_request) { + totalRequests += 1; + } + } + else if (status & Components.interfaces.nsIWebProgressListener.flag_stop) { + if (status & Components.interfaces.nsIWebProgressListener.flag_is_request) { + finishedRequests += 1; + if (!useRealProgressFlag) { + this.onProgress(null, finishedRequests, totalRequests); + } + } + if(status & Components.interfaces.nsIWebProgressListener.flag_is_network) { + // Record page loading time. + var elapsed = ( (new Date()).getTime() - startTime ) / 1000; + var msg = bundle.GetStringFromName("nv_done") + " (" + elapsed + " secs)"; + dump( msg + "\n" ); + defaultStatus = msg; + UpdateStatusField(); + window.XULBrowserWindow.setDefaultStatus(msg); + // Turn progress meter off. + statusMeter.setAttribute("mode","normal"); + statusMeter.value = 0; // be sure to clear the progress bar + statusMeter.progresstext = ""; + throbberElement.setAttribute("busy", false); + + // XXX: These need to be based on window activity... + stopButton.setAttribute("disabled", true); + stopMenu.setAttribute("disabled", true); + } + } + else if (status & Components.interfaces.nsIWebProgressListener.flag_transferring) { + if (status & Components.interfaces.nsIWebProgressListener.flag_is_document) { + var ctype=channel.contentType; + + if (ctype != "text/html") { + useRealProgressFlag = true; + } + statusMeter.setAttribute("mode", "normal"); + } + if (status & Components.interfaces.nsIWebProgressListener.flag_is_request) { + if (!useRealProgressFlag) { + this.onProgress(null, finishedRequests, totalRequests); + } + } + } - if(status & Components.interfaces.nsIWebProgress.flag_win_start) - { - stopButton.setAttribute("disabled", false); - stopMenu.setAttribute("disabled", false); - } - else if(status & Components.interfaces.nsIWebProgress.flag_win_stop) - { - stopButton.setAttribute("disabled", true); - stopMenu.setAttribute("disabled", true); - } }, onLocationChange : function(location) { diff --git a/mozilla/xpfe/browser/src/nsBrowserInstance.cpp b/mozilla/xpfe/browser/src/nsBrowserInstance.cpp index b08b32699e0..a954a80a366 100644 --- a/mozilla/xpfe/browser/src/nsBrowserInstance.cpp +++ b/mozilla/xpfe/browser/src/nsBrowserInstance.cpp @@ -941,7 +941,7 @@ nsBrowserInstance::SetContentWindow(nsIDOMWindow* aWin) mContentAreaDocShellWeak = getter_AddRefs(NS_GetWeakReference(docShell)); // Weak reference docShell->SetDocLoaderObserver((nsIDocumentLoaderObserver *)this); - nsCOMPtr webProgress(do_QueryInterface(docShell)); + nsCOMPtr webProgress(do_GetInterface(docShell)); webProgress->AddProgressListener(NS_STATIC_CAST(nsIWebProgressListener*, this)); nsCOMPtr sessionHistory(do_CreateInstance(NS_SHISTORY_PROGID)); nsCOMPtr webNav(do_QueryInterface(docShell)); @@ -1633,35 +1633,44 @@ nsBrowserInstance::SetLoadCookie(nsISupports * aLoadCookie) // nsBrowserInstance::nsIWebProgressListener //***************************************************************************** -NS_IMETHODIMP nsBrowserInstance::OnProgressChange(nsIChannel* aChannel, - PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, - PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress) +NS_IMETHODIMP +nsBrowserInstance::OnProgressChange(nsIWebProgress* aWebProgress, + nsIRequest* aRequest, + PRInt32 aCurSelfProgress, + PRInt32 aMaxSelfProgress, + PRInt32 aCurTotalProgress, + PRInt32 aMaxTotalProgress) { - EnsureXULBrowserWindow(); - if(mXULBrowserWindow) - mXULBrowserWindow->OnProgress(aChannel, aCurTotalProgress, aMaxTotalProgress); - return NS_OK; + EnsureXULBrowserWindow(); + if(mXULBrowserWindow) { + nsresult rv; + nsCOMPtr channel; + + channel = do_QueryInterface(aRequest, &rv); + if (NS_SUCCEEDED(rv)) { + mXULBrowserWindow->OnProgress(channel, aCurTotalProgress, aMaxTotalProgress); + } + } + return NS_OK; } -NS_IMETHODIMP nsBrowserInstance::OnChildProgressChange(nsIChannel* aChannel, - PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress) +NS_IMETHODIMP +nsBrowserInstance::OnStateChange(nsIWebProgress* aWebProgress, + nsIRequest* aRequest, + PRInt32 aProgressStateFlags, + nsresult aStatus) { - return NS_OK; -} + EnsureXULBrowserWindow(); + if(mXULBrowserWindow) { + nsresult rv; + nsCOMPtr channel; -NS_IMETHODIMP nsBrowserInstance::OnStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) -{ - EnsureXULBrowserWindow(); - if(mXULBrowserWindow) - mXULBrowserWindow->OnStatusChange(aChannel, aProgressStatusFlags); - return NS_OK; -} - -NS_IMETHODIMP nsBrowserInstance::OnChildStatusChange(nsIChannel* aChannel, - PRInt32 aProgressStatusFlags) -{ - return NS_OK; + channel = do_QueryInterface(aRequest, &rv); + if (NS_SUCCEEDED(rv)) { + mXULBrowserWindow->OnStatusChange(channel, aProgressStateFlags); + } + } + return NS_OK; } NS_IMETHODIMP nsBrowserInstance::OnLocationChange(nsIURI* aLocation)