diff --git a/mozilla/docshell/base/nsDocShell.cpp b/mozilla/docshell/base/nsDocShell.cpp index 39d62fec1af..54966c94571 100644 --- a/mozilla/docshell/base/nsDocShell.cpp +++ b/mozilla/docshell/base/nsDocShell.cpp @@ -2561,12 +2561,17 @@ NS_IMETHODIMP nsDocShell::OnStateChange(nsIWebProgress *aProgress, nsIRequest *aRequest, PRInt32 aStateFlags, nsresult aStatus) { + if ((aStateFlags & STATE_IS_DOCUMENT) && (aStateFlags & STATE_STOP)) { + nsCOMPtr webProgress(do_QueryInterface(mLoadCookie)); - if ((aStateFlags & STATE_STOP) && (aStateFlags & STATE_IS_NETWORK)) { - if (LSHE) - LSHE->SetLoadType(nsIDocShellLoadInfo::loadHistory); - LSHE = nsnull; + // Is the document stop notification for this document? + if (aProgress == webProgress.get()) { + nsCOMPtr channel(do_QueryInterface(aRequest)); + + EndPageLoad(aProgress, channel, aStatus); + } } + return NS_OK; } @@ -2596,6 +2601,39 @@ nsDocShell::OnSecurityChange(nsIWebProgress *aWebProgress, } +nsresult nsDocShell::EndPageLoad(nsIWebProgress *aProgress, + nsIChannel *aChannel, + nsresult aStatus) +{ + if (LSHE) { + LSHE->SetLoadType(nsIDocShellLoadInfo::loadHistory); + + // Clear the LSHE reference to indicate document loading is done one + // way or another. + LSHE = nsnull; + } + + // + // one of many safeguards that prevent death and destruction if + // someone is so very very rude as to bring this window down + // during this load handler. + // + nsCOMPtr kungFuDeathGrip(this); + // + // Notify the ContentViewer that the Document has finished loading... + // + // This will cause any OnLoad(...) handlers to fire, if it is a HTML + // document... + // + if (!mEODForCurrentDocument && mContentViewer) { + mContentViewer->LoadComplete(aStatus); + + mEODForCurrentDocument = PR_TRUE; + } + return NS_OK; +} + + //***************************************************************************** // nsDocShell: Content Viewer Management //***************************************************************************** diff --git a/mozilla/docshell/base/nsDocShell.h b/mozilla/docshell/base/nsDocShell.h index 9a06343d78e..96e3c46f0e9 100644 --- a/mozilla/docshell/base/nsDocShell.h +++ b/mozilla/docshell/base/nsDocShell.h @@ -259,6 +259,14 @@ protected: PRBool IsFrame(); + // + // Helper method that is called when a new document (including any + // sub-documents - ie. frames) has been completely loaded. + // + virtual nsresult EndPageLoad(nsIWebProgress *aProgress, + nsIChannel *aChannel, + nsresult aResult); + protected: nsString mName; nsString mTitle; diff --git a/mozilla/docshell/base/nsWebShell.cpp b/mozilla/docshell/base/nsWebShell.cpp index 82a2471fb10..cc04f210b01 100644 --- a/mozilla/docshell/base/nsWebShell.cpp +++ b/mozilla/docshell/base/nsWebShell.cpp @@ -35,6 +35,7 @@ typedef unsigned long HMTX; #include "nsWebShell.h" #include "nsIWebBrowserChrome.h" #include "nsIInterfaceRequestor.h" +#include "nsIWebProgress.h" #include "nsIDocumentLoader.h" #include "nsIDocumentLoaderObserver.h" #include "nsIDocumentLoaderFactory.h" @@ -184,7 +185,6 @@ nsWebShell::~nsWebShell() // Stop any pending document loads and destroy the loader... if (nsnull != mDocLoader) { mDocLoader->Stop(); - mDocLoader->RemoveObserver((nsIDocumentLoaderObserver*)this); mDocLoader->SetContainer(nsnull); mDocLoader->Destroy(); NS_RELEASE(mDocLoader); @@ -282,7 +282,6 @@ NS_INTERFACE_MAP_BEGIN(nsWebShell) NS_INTERFACE_MAP_ENTRY(nsIWebShell) NS_INTERFACE_MAP_ENTRY(nsIWebShellServices) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsIContentViewerContainer, nsIWebShell) - NS_INTERFACE_MAP_ENTRY(nsIDocumentLoaderObserver) NS_INTERFACE_MAP_ENTRY(nsIWebShellContainer) NS_INTERFACE_MAP_ENTRY(nsILinkHandler) NS_INTERFACE_MAP_ENTRY(nsIClipboardCommands) @@ -883,340 +882,311 @@ nsWebShell::GetLinkState(const char* aLinkURI, nsLinkState& aState) return NS_OK; } -//---------------------------------------------------------------------- +// +// XXX: This is a temporary method to emulate the mDocLoaderObserver +// notifications that are fired as a result of calling +// SetDocLoaderObserver(...) +// +// This method will go away once all of the callers of SetDocLoaderObserver(...) +// are cleaned up. +// NS_IMETHODIMP -nsWebShell::OnStartDocumentLoad(nsIDocumentLoader* loader, - nsIURI* aURL, - const char* aCommand) +nsWebShell::OnStateChange(nsIWebProgress *aProgress, nsIRequest *aRequest, + PRInt32 aStateFlags, nsresult aStatus) { - nsresult rv = NS_ERROR_FAILURE; + if (aStateFlags & STATE_IS_DOCUMENT) { + nsCOMPtr webProgress(do_QueryInterface(mLoadCookie)); - if(loader == mDocLoader) - { + if (aProgress == webProgress.get()) { + nsCOMPtr url; + nsCOMPtr channel(do_QueryInterface(aRequest)); nsCOMPtr dlObserver; - if(!mDocLoaderObserver && mParent) - { - /* If this is a frame (in which case it would have a parent && doesn't - * have a documentloaderObserver, get it from the rootWebShell - */ - nsCOMPtr rootItem; - GetSameTypeRootTreeItem(getter_AddRefs(rootItem)); - nsCOMPtr rootDocShell(do_QueryInterface(rootItem)); - if(rootDocShell) - rootDocShell->GetDocLoaderObserver(getter_AddRefs(dlObserver)); - } - else - dlObserver = do_QueryInterface(mDocLoaderObserver); // we need this to addref + (void) channel->GetURI(getter_AddRefs(url)); + + if(!mDocLoaderObserver && mParent) { + /* If this is a frame (in which case it would have a parent && doesn't + * have a documentloaderObserver, get it from the rootWebShell + */ + nsCOMPtr rootItem; + GetSameTypeRootTreeItem(getter_AddRefs(rootItem)); + nsCOMPtr rootDocShell(do_QueryInterface(rootItem)); + if(rootDocShell) { + rootDocShell->GetDocLoaderObserver(getter_AddRefs(dlObserver)); + } + } + else { + dlObserver = do_QueryInterface(mDocLoaderObserver); // we need this to addref + } + + if (aStateFlags & STATE_START) { + /* + * Fire the OnStartDocumentLoad of the webshell observer + */ + if(mContainer && dlObserver) { + dlObserver->OnStartDocumentLoad(mDocLoader, url, "command is bogus"); + } + } + else if (aStateFlags & STATE_STOP) { + /* + * Fire the OnEndDocumentLoad of the DocLoaderobserver + */ + if(dlObserver && url) { + dlObserver->OnEndDocumentLoad(mDocLoader, channel, aStatus); + } + } + } + } + + if (aStateFlags & STATE_IS_REQUEST) { + nsCOMPtr channel(do_QueryInterface(aRequest)); + + if (aStateFlags & STATE_START) { /* - * Fire the OnStartDocumentLoad of the webshell observer + *Fire the OnStartDocumentLoad of the webshell observer */ - if(mContainer && dlObserver) - dlObserver->OnStartDocumentLoad(mDocLoader, aURL, aCommand); + if ((nsnull != mContainer) && (nsnull != mDocLoaderObserver)) { + mDocLoaderObserver->OnStartURLLoad(mDocLoader, channel); } - return rv; + } + else if (aStateFlags & STATE_STOP) { + /* + *Fire the OnEndDocumentLoad of the webshell observer + */ + if ((nsnull != mContainer) && (nsnull != mDocLoaderObserver)) { + mDocLoaderObserver->OnEndURLLoad(mDocLoader, channel, aStatus); + } + } + } + + return nsDocShell::OnStateChange(aProgress, aRequest, aStateFlags, aStatus); } - - -NS_IMETHODIMP -nsWebShell::OnEndDocumentLoad(nsIDocumentLoader* loader, - nsIChannel* channel, - nsresult aStatus) +//---------------------------------------------------------------------- +nsresult nsWebShell::EndPageLoad(nsIWebProgress *aProgress, + nsIChannel *aChannel, + nsresult aStatus) { - if(loader != mDocLoader) - return NS_OK; + nsresult rv = NS_OK; - nsresult rv = NS_OK; - if(!channel) - return NS_ERROR_NULL_POINTER; + if(!aChannel) + return NS_ERROR_NULL_POINTER; - nsCOMPtr aURL; - NS_ENSURE_SUCCESS(channel->GetURI(getter_AddRefs(aURL)), NS_ERROR_FAILURE); + nsCOMPtr url; + + rv = aChannel->GetURI(getter_AddRefs(url)); + if (NS_FAILED(rv)) return rv; - // clean up reload state for meta charset - if(eCharsetReloadRequested == mCharsetReloadState) - mCharsetReloadState = eCharsetReloadStopOrigional; - else - mCharsetReloadState = eCharsetReloadInit; + // clean up reload state for meta charset + if(eCharsetReloadRequested == mCharsetReloadState) + mCharsetReloadState = eCharsetReloadStopOrigional; + else + mCharsetReloadState = eCharsetReloadInit; - // Clear the LSHE reference in docshell to indicate document loading - // is done one way or another. - LSHE = nsnull; + // + // one of many safeguards that prevent death and destruction if + // someone is so very very rude as to bring this window down + // during this load handler. + // + nsCOMPtr kungFuDeathGrip(this); + nsDocShell::EndPageLoad(aProgress, aChannel, aStatus); - /* one of many safeguards that prevent death and destruction if - someone is so very very rude as to bring this window down - during this load handler. */ - nsCOMPtr kungFuDeathGrip(this); - - // Notify the ContentViewer that the Document has finished loading... - if (!mEODForCurrentDocument && mContentViewer) { - mContentViewer->LoadComplete(aStatus); - } - - mEODForCurrentDocument = PR_TRUE; - nsCOMPtr dlObserver; - - if(!mDocLoaderObserver && mParent) - { - /* If this is a frame (in which case it would have a parent && doesn't - * have a documentloaderObserver, get it from the rootWebShell - */ - nsCOMPtr rootItem; - GetSameTypeRootTreeItem(getter_AddRefs(rootItem)); - nsCOMPtr rootDocShell(do_QueryInterface(rootItem)); - - if(rootDocShell) - rootDocShell->GetDocLoaderObserver(getter_AddRefs(dlObserver)); - } - else - dlObserver = do_QueryInterface(mDocLoaderObserver); // we need this to addref - - /* - * Fire the OnEndDocumentLoad of the DocLoaderobserver - */ - if(dlObserver && aURL) - dlObserver->OnEndDocumentLoad(mDocLoader, channel, aStatus); - - if(mDocLoader == loader && NS_FAILED(aStatus)) - { - nsXPIDLCString host; - nsresult hostResult = NS_ERROR_FAILURE; - if (aURL) { - hostResult = aURL->GetHost(getter_Copies(host)); - } - if (NS_SUCCEEDED(hostResult) && host) - { - CBufDescriptor buf((const char *)host, PR_TRUE, PL_strlen(host) + 1); - nsCAutoString hostStr(buf); - PRInt32 dotLoc = hostStr.FindChar('.'); - - nsXPIDLCString scheme; - aURL->GetScheme(getter_Copies(scheme)); - - PRUint32 schemeLen = PL_strlen((const char*)scheme); - CBufDescriptor schemeBuf((const char*)scheme, PR_TRUE, schemeLen+1, schemeLen); - nsCAutoString schemeStr(schemeBuf); - - - if(aStatus == NS_ERROR_UNKNOWN_HOST || - aStatus == NS_ERROR_CONNECTION_REFUSED || - aStatus == NS_ERROR_NET_TIMEOUT) - { - PRBool keywordsEnabled = PR_FALSE; - if(mPrefs) - { - NS_ENSURE_SUCCESS(mPrefs->GetBoolPref("keyword.enabled", &keywordsEnabled), - NS_ERROR_FAILURE); - } - - // we should only perform a keyword search under the following conditions: - // (0) Pref keyword.enabled is true - // (1) the url scheme is http (or https) - // (2) the url does not have a protocol scheme - // If we don't enforce such a policy, then we end up doing keyword searchs on urls - // we don't intend like imap, file, mailbox, etc. This could lead to a security - // problem where we send data to the keyword server that we shouldn't be. - // Someone needs to clean up keywords in general so we can determine on a per url basis - // if we want keywords enabled...this is just a bandaid... - static const char httpSchemeName[] = "http"; - - if (keywordsEnabled) { - if (!schemeStr.IsEmpty() && ((schemeStr.Find(httpSchemeName)) != 0)) - keywordsEnabled = PR_FALSE; - } - - if(keywordsEnabled && (-1 == dotLoc)) - { - // only send non-qualified hosts to the keyword server - nsAutoString keywordSpec; keywordSpec.AssignWithConversion("keyword:"); - keywordSpec.Append(NS_ConvertUTF8toUCS2(host)); - return LoadURI(keywordSpec.GetUnicode(), LOAD_FLAGS_NONE); - } // end keywordsEnabled - } - - // Doc failed to load because the host was not found. - if(aStatus == NS_ERROR_UNKNOWN_HOST) - { - // Try our www.*.com trick. - nsCAutoString retryHost; - - - if(schemeStr.Find("http") == 0) - { - if(-1 == dotLoc) - { - retryHost = "www."; - retryHost += hostStr; - retryHost += ".com"; - } - else - { - PRInt32 hostLen = hostStr.Length(); - if(((hostLen - dotLoc) == 3) || ((hostLen - dotLoc) == 4)) - { - retryHost = "www."; - retryHost += hostStr; - } - } - } - - if(!retryHost.IsEmpty()) - { - NS_ENSURE_SUCCESS(aURL->SetHost(retryHost.GetBuffer()), - NS_ERROR_FAILURE); - nsXPIDLCString aSpec; - NS_ENSURE_SUCCESS(aURL->GetSpec(getter_Copies(aSpec)), - NS_ERROR_FAILURE); - // reload the url - return LoadURI(NS_ConvertASCIItoUCS2(aSpec).GetUnicode(), LOAD_FLAGS_NONE); - } // retry - - // throw a DNS failure dialog - nsCOMPtr prompter; - nsCOMPtr stringBundle; - GetPromptAndStringBundle(getter_AddRefs(prompter), - getter_AddRefs(stringBundle)); - NS_ENSURE_TRUE(stringBundle, NS_ERROR_FAILURE); - - nsXPIDLString messageStr; - NS_ENSURE_SUCCESS(stringBundle->GetStringFromName( - NS_ConvertASCIItoUCS2("dnsNotFound").GetUnicode(), - getter_Copies(messageStr)), NS_ERROR_FAILURE); - - if (host) { - PRUnichar *msg = nsTextFormatter::smprintf(messageStr, (const char*)host); - if (!msg) return NS_ERROR_OUT_OF_MEMORY; - - prompter->Alert(nsnull, msg); - nsTextFormatter::smprintf_free(msg); - } - } - else if(aStatus == NS_ERROR_CONNECTION_REFUSED) - {// Doc failed to load because we couldn't connect to the server. - // throw a connection failure dialog - PRInt32 port = -1; - NS_ENSURE_SUCCESS(aURL->GetPort(&port), NS_ERROR_FAILURE); - - nsCOMPtr prompter; - nsCOMPtr stringBundle; - GetPromptAndStringBundle(getter_AddRefs(prompter), - getter_AddRefs(stringBundle)); - NS_ENSURE_TRUE(stringBundle, NS_ERROR_FAILURE); - - nsXPIDLString messageStr; - NS_ENSURE_SUCCESS(stringBundle->GetStringFromName( - NS_ConvertASCIItoUCS2("connectionFailure").GetUnicode(), - getter_Copies(messageStr)), NS_ERROR_FAILURE); - - // build up the host:port string. - nsCAutoString combo(host); - if (port > 0) { - combo.Append(':'); - combo.AppendInt(port); - } - PRUnichar *msg = nsTextFormatter::smprintf(messageStr, combo.GetBuffer()); - if (!msg) return NS_ERROR_OUT_OF_MEMORY; - - prompter->Alert(nsnull, msg); - nsTextFormatter::smprintf_free(msg); - } - else if(aStatus == NS_ERROR_NET_TIMEOUT) - {// Doc failed to load because the socket function timed out. - // throw a timeout dialog - nsCOMPtr prompter; - nsCOMPtr stringBundle; - GetPromptAndStringBundle(getter_AddRefs(prompter), - getter_AddRefs(stringBundle)); - NS_ENSURE_TRUE(stringBundle, NS_ERROR_FAILURE); - - - nsXPIDLString messageStr; - NS_ENSURE_SUCCESS(stringBundle->GetStringFromName( - NS_ConvertASCIItoUCS2("netTimeout").GetUnicode(), - getter_Copies(messageStr)), NS_ERROR_FAILURE); - - PRUnichar *msg = nsTextFormatter::smprintf(messageStr, (const char*)host); - if (!msg) return NS_ERROR_OUT_OF_MEMORY; - - prompter->Alert(nsnull, msg); - nsTextFormatter::smprintf_free(msg); - } // end NS_ERROR_NET_TIMEOUT - } // if we have a host - } // end mDocLoader == loader + // + // If the page load failed, then deal with the error condition... + // Errors are handled as follows: + // 1. Send the URI to a keyword server (if enabled) + // 2. If the error was DNS failure, then add www and .com to the URI + // (if appropriate). + // 3. Throw an error dialog box... + // + if(url && NS_FAILED(aStatus)) { + nsXPIDLCString host; + rv = url->GetHost(getter_Copies(host)); + if (!host) { return rv; -} + } -NS_IMETHODIMP -nsWebShell::OnStartURLLoad(nsIDocumentLoader* loader, - nsIChannel* channel) -{ - /* - *Fire the OnStartDocumentLoad of the webshell observer - */ - if ((nsnull != mContainer) && (nsnull != mDocLoaderObserver)) - { - mDocLoaderObserver->OnStartURLLoad(mDocLoader, channel); - } + CBufDescriptor buf((const char *)host, PR_TRUE, PL_strlen(host) + 1); + nsCAutoString hostStr(buf); + PRInt32 dotLoc = hostStr.FindChar('.'); + + nsXPIDLCString scheme; + url->GetScheme(getter_Copies(scheme)); + + PRUint32 schemeLen = PL_strlen((const char*)scheme); + CBufDescriptor schemeBuf((const char*)scheme, PR_TRUE, schemeLen+1, schemeLen); + nsCAutoString schemeStr(schemeBuf); + + // + // First try sending the request to a keyword server (if enabled)... + // + if(aStatus == NS_ERROR_UNKNOWN_HOST || + aStatus == NS_ERROR_CONNECTION_REFUSED || + aStatus == NS_ERROR_NET_TIMEOUT) + { + PRBool keywordsEnabled = PR_FALSE; + + if(mPrefs) { + rv = mPrefs->GetBoolPref("keyword.enabled", &keywordsEnabled); + if (NS_FAILED(rv)) return rv; + } + + // we should only perform a keyword search under the following conditions: + // (0) Pref keyword.enabled is true + // (1) the url scheme is http (or https) + // (2) the url does not have a protocol scheme + // If we don't enforce such a policy, then we end up doing keyword searchs on urls + // we don't intend like imap, file, mailbox, etc. This could lead to a security + // problem where we send data to the keyword server that we shouldn't be. + // Someone needs to clean up keywords in general so we can determine on a per url basis + // if we want keywords enabled...this is just a bandaid... + if (keywordsEnabled && !schemeStr.IsEmpty() && + (schemeStr.Find("http") != 0)) { + keywordsEnabled = PR_FALSE; + } + + if(keywordsEnabled && (-1 == dotLoc)) { + // only send non-qualified hosts to the keyword server + nsAutoString keywordSpec; keywordSpec.AssignWithConversion("keyword:"); + keywordSpec.Append(NS_ConvertUTF8toUCS2(host)); + + return LoadURI(keywordSpec.GetUnicode(), LOAD_FLAGS_NONE); + } // end keywordsEnabled + } + + // + // Next, try rewriting the URI using our www.*.com trick + // + if(aStatus == NS_ERROR_UNKNOWN_HOST) { + // Try our www.*.com trick. + nsCAutoString retryHost; + + + if(schemeStr.Find("http") == 0) { + if(-1 == dotLoc) { + retryHost = "www."; + retryHost += hostStr; + retryHost += ".com"; + } else { + PRInt32 hostLen = hostStr.Length(); + if(((hostLen - dotLoc) == 3) || ((hostLen - dotLoc) == 4)) { + retryHost = "www."; + retryHost += hostStr; + } + } + } + + if(!retryHost.IsEmpty()) { + // This seems evil, since it is modifying the original URL + rv = url->SetHost(retryHost.GetBuffer()); + if (NS_FAILED(rv)) return rv; + + rv = url->GetSpec(getter_Copies(host)); + if (NS_FAILED(rv)) return rv; + + // reload the url + return LoadURI(NS_ConvertASCIItoUCS2(host).GetUnicode(), LOAD_FLAGS_NONE); + } // retry + } + + // + // Well, none of the URI rewriting tricks worked :-( + // It is time to throw an error dialog box, and be done with it... + // + + // Doc failed to load because the host was not found. + if(aStatus == NS_ERROR_UNKNOWN_HOST) { + // throw a DNS failure dialog + nsCOMPtr prompter; + nsCOMPtr stringBundle; + + rv = GetPromptAndStringBundle(getter_AddRefs(prompter), + getter_AddRefs(stringBundle)); + if (!stringBundle) { + return rv; + } + + nsXPIDLString messageStr; + rv = stringBundle->GetStringFromName(NS_ConvertASCIItoUCS2("dnsNotFound").GetUnicode(), + getter_Copies(messageStr)); + if (NS_FAILED(rv)) return rv; + + if (host) { + PRUnichar *msg = nsTextFormatter::smprintf(messageStr, (const char*)host); + if (!msg) return NS_ERROR_OUT_OF_MEMORY; + + prompter->Alert(nsnull, msg); + nsTextFormatter::smprintf_free(msg); + } + } + // + // Doc failed to load because we couldn't connect to the server. + // throw a connection failure dialog + // + else if(aStatus == NS_ERROR_CONNECTION_REFUSED) { + PRInt32 port = -1; + + rv = url->GetPort(&port); + if (NS_FAILED(rv)) return rv; + + nsCOMPtr prompter; + nsCOMPtr stringBundle; + + rv = GetPromptAndStringBundle(getter_AddRefs(prompter), + getter_AddRefs(stringBundle)); + if (!stringBundle) { + return rv; + } + + nsXPIDLString messageStr; + rv = stringBundle->GetStringFromName(NS_ConvertASCIItoUCS2("connectionFailure").GetUnicode(), + getter_Copies(messageStr)); + if (NS_FAILED(rv)) return rv; + + // build up the host:port string. + nsCAutoString combo(host); + if (port > 0) { + combo.Append(':'); + combo.AppendInt(port); + } + + PRUnichar *msg = nsTextFormatter::smprintf(messageStr, combo.GetBuffer()); + if (!msg) return NS_ERROR_OUT_OF_MEMORY; + + prompter->Alert(nsnull, msg); + nsTextFormatter::smprintf_free(msg); + } + // + // Doc failed to load because the socket function timed out. + // throw a timeout dialog + // + else if(aStatus == NS_ERROR_NET_TIMEOUT) { + nsCOMPtr prompter; + nsCOMPtr stringBundle; + + rv = GetPromptAndStringBundle(getter_AddRefs(prompter), + getter_AddRefs(stringBundle)); + if (!stringBundle) { + return rv; + } + + nsXPIDLString messageStr; + rv = stringBundle->GetStringFromName(NS_ConvertASCIItoUCS2("netTimeout").GetUnicode(), + getter_Copies(messageStr)); + if (NS_FAILED(rv)) return rv; + + PRUnichar *msg = nsTextFormatter::smprintf(messageStr, (const char*)host); + if (!msg) return NS_ERROR_OUT_OF_MEMORY; + + prompter->Alert(nsnull, msg); + nsTextFormatter::smprintf_free(msg); + } // end NS_ERROR_NET_TIMEOUT + } // if we have a host return NS_OK; } -NS_IMETHODIMP -nsWebShell::OnProgressURLLoad(nsIDocumentLoader* loader, - nsIChannel* channel, - PRUint32 aProgress, - PRUint32 aProgressMax) -{ - /* - *Fire the OnStartDocumentLoad of the webshell observer and container... - */ - if ((nsnull != mContainer) && (nsnull != mDocLoaderObserver)) - { - mDocLoaderObserver->OnProgressURLLoad(mDocLoader, channel, aProgress, aProgressMax); - } - - return NS_OK; -} - -NS_IMETHODIMP -nsWebShell::OnStatusURLLoad(nsIDocumentLoader* loader, - nsIChannel* channel, - nsString& aMsg) -{ - /* - *Fire the OnStartDocumentLoad of the webshell observer and container... - */ - if ((nsnull != mContainer) && (nsnull != mDocLoaderObserver)) - { - mDocLoaderObserver->OnStatusURLLoad(mDocLoader, channel, aMsg); - } - - return NS_OK; -} - -NS_IMETHODIMP -nsWebShell::OnEndURLLoad(nsIDocumentLoader* loader, - nsIChannel* channel, - nsresult aStatus) -{ -#if 0 - const char* spec; - aURL->GetSpec(&spec); - printf("nsWebShell::OnEndURLLoad:%p: loader=%p url=%s status=%d\n", this, loader, spec, aStatus); -#endif - /* - *Fire the OnEndDocumentLoad of the webshell observer - */ - if ((nsnull != mContainer) && (nsnull != mDocLoaderObserver)) - { - mDocLoaderObserver->OnEndURLLoad(mDocLoader, channel, aStatus); - } - return NS_OK; -} - - // // Routines for selection and clipboard // @@ -1430,9 +1400,6 @@ NS_IMETHODIMP nsWebShell::Create() // Set the webshell as the default IContentViewerContainer for the loader... mDocLoader->SetContainer(NS_STATIC_CAST(nsIContentViewerContainer*, (nsIWebShell*)this)); - //Register ourselves as an observer for the new doc loader - mDocLoader->AddObserver((nsIDocumentLoaderObserver*)this); - return nsDocShell::Create(); } diff --git a/mozilla/docshell/base/nsWebShell.h b/mozilla/docshell/base/nsWebShell.h index cdcc28b50a0..20998508efb 100644 --- a/mozilla/docshell/base/nsWebShell.h +++ b/mozilla/docshell/base/nsWebShell.h @@ -4,7 +4,6 @@ #include "nsIWebShellServices.h" #include "nsIWebShell.h" #include "nsILinkHandler.h" -#include "nsIDocumentLoaderObserver.h" #include "nsIClipboardCommands.h" #include "nsDocShell.h" @@ -21,7 +20,6 @@ class nsWebShell : public nsDocShell, public nsIWebShellContainer, public nsIWebShellServices, public nsILinkHandler, - public nsIDocumentLoaderObserver, public nsIClipboardCommands { public: @@ -32,7 +30,6 @@ public: NS_DECL_ISUPPORTS_INHERITED NS_DECL_NSIINTERFACEREQUESTOR - NS_DECL_NSIDOCUMENTLOADEROBSERVER NS_DECL_NSICLIPBOARDCOMMANDS NS_DECL_NSIWEBSHELLSERVICES @@ -121,6 +118,12 @@ public: NS_IMETHOD SetURL(const PRUnichar* aURL); + // XXX: Temporary - until I can get rid of SetDocLoaderObserver :-) + NS_IMETHOD OnStateChange(nsIWebProgress *aProgress, + nsIRequest *aRequest, + PRInt32 aStateFlags, + nsresult aStatus); + protected: void GetRootWebShellEvenIfChrome(nsIWebShell** aResult); void InitFrameData(); @@ -130,6 +133,14 @@ protected: virtual nsresult IsCommandEnabled ( const nsAReadableString & inCommand, PRBool* outEnabled ) ; virtual nsresult DoCommand ( const nsAReadableString & inCommand ) ; + // + // Helper method that is called when a new document (including any + // sub-documents - ie. frames) has been completely loaded. + // + virtual nsresult EndPageLoad(nsIWebProgress *aProgress, + nsIChannel *aChannel, + nsresult aStatus); + nsIEventQueue* mThreadEventQueue; nsIWebShellContainer* mContainer;