diff --git a/mozilla/chrome/src/nsChromeProtocolHandler.cpp b/mozilla/chrome/src/nsChromeProtocolHandler.cpp index 033bec62eaf..943a41890a6 100644 --- a/mozilla/chrome/src/nsChromeProtocolHandler.cpp +++ b/mozilla/chrome/src/nsChromeProtocolHandler.cpp @@ -140,6 +140,7 @@ nsChromeProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, NS_IMETHODIMP nsChromeProtocolHandler::NewChannel(const char* verb, nsIURI* uri, + nsILoadGroup *aGroup, nsIEventSinkGetter* eventSinkGetter, nsIChannel* *result) { @@ -171,7 +172,8 @@ nsChromeProtocolHandler::NewChannel(const char* verb, nsIURI* uri, return rv; } - rv = serv->NewChannelFromURI(verb, chromeURI, eventSinkGetter, result); + rv = serv->NewChannelFromURI(verb, chromeURI, aGroup, eventSinkGetter, + result); NS_RELEASE(chromeURI); return NS_OK; } diff --git a/mozilla/chrome/src/nsChromeProtocolHandler.h b/mozilla/chrome/src/nsChromeProtocolHandler.h index e79061a89f4..e283dde3d4d 100644 --- a/mozilla/chrome/src/nsChromeProtocolHandler.h +++ b/mozilla/chrome/src/nsChromeProtocolHandler.h @@ -42,6 +42,7 @@ public: NS_IMETHOD NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval); NS_IMETHOD NewChannel(const char* verb, nsIURI* url, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **_retval); diff --git a/mozilla/docshell/base/nsWebShell.cpp b/mozilla/docshell/base/nsWebShell.cpp index c7652c580e7..3ccf2d2de9e 100644 --- a/mozilla/docshell/base/nsWebShell.cpp +++ b/mozilla/docshell/base/nsWebShell.cpp @@ -2056,7 +2056,7 @@ nsWebShell::DoLoadURL(const nsString& aUrlSpec, // Pass notifications to BrowserAppCore just to be consistent with // regular page loads thro' necko nsCOMPtr dummyChannel; - rv = NS_OpenURI(getter_AddRefs(dummyChannel), url); + rv = NS_OpenURI(getter_AddRefs(dummyChannel), url, nsnull); if (NS_FAILED(rv)) return rv; mProcessedEndDocumentLoad = PR_FALSE; @@ -2084,7 +2084,7 @@ nsWebShell::DoLoadURL(const nsString& aUrlSpec, // Pass notifications to BrowserAppCore just to be consistent with // regular necko loads. nsCOMPtr dummyChannel; - rv = NS_OpenURI(getter_AddRefs(dummyChannel), url); + rv = NS_OpenURI(getter_AddRefs(dummyChannel), url, nsnull); if (NS_FAILED(rv)) return rv; mProcessedEndDocumentLoad = PR_FALSE; diff --git a/mozilla/modules/libimg/public/ilIURL.h b/mozilla/modules/libimg/public/ilIURL.h index 7744b10729f..f3f49cc354a 100644 --- a/mozilla/modules/libimg/public/ilIURL.h +++ b/mozilla/modules/libimg/public/ilIURL.h @@ -44,6 +44,8 @@ public: virtual time_t GetExpires()=0; + virtual PRBool GetBackgroundLoad()=0; + virtual void SetBackgroundLoad(PRBool aBgload)=0; virtual int GetOwnerId()=0; diff --git a/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp b/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp index cb74315362c..a7b5b8b3eb5 100644 --- a/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp +++ b/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp @@ -1136,7 +1136,8 @@ nsresult nsPluginStreamListenerPeer::SetUpCache(nsIURI* aURL) { nsPluginCacheListener* cacheListener = new nsPluginCacheListener(this); #ifdef NECKO - return NS_OpenURI(cacheListener, nsnull, aURL); + // XXX: Null LoadGroup? + return NS_OpenURI(cacheListener, nsnull, aURL, nsnull); #else return NS_OpenURL(aURL, cacheListener); #endif @@ -2294,7 +2295,8 @@ NS_IMETHODIMP nsPluginHostImpl::NewPluginURLStream(const nsString& aURL, if (NS_OK == rv) { #ifdef NECKO - rv = NS_OpenURI(listenerPeer, nsnull, url); + // XXX: Null LoadGroup? + rv = NS_OpenURI(listenerPeer, nsnull, url, nsnull); #else rv = NS_OpenURL(url, listenerPeer); #endif @@ -2351,7 +2353,8 @@ nsresult nsPluginHostImpl::NewEmbededPluginStream(nsIURI* aURL, if (NS_OK == rv) { #ifdef NECKO - rv = NS_OpenURI(listener, nsnull, aURL); + // XXX: Null LoadGroup? + rv = NS_OpenURI(listener, nsnull, aURL, nsnull); #else rv = NS_OpenURL(aURL, listener); #endif diff --git a/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp b/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp index cb74315362c..a7b5b8b3eb5 100644 --- a/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp +++ b/mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp @@ -1136,7 +1136,8 @@ nsresult nsPluginStreamListenerPeer::SetUpCache(nsIURI* aURL) { nsPluginCacheListener* cacheListener = new nsPluginCacheListener(this); #ifdef NECKO - return NS_OpenURI(cacheListener, nsnull, aURL); + // XXX: Null LoadGroup? + return NS_OpenURI(cacheListener, nsnull, aURL, nsnull); #else return NS_OpenURL(aURL, cacheListener); #endif @@ -2294,7 +2295,8 @@ NS_IMETHODIMP nsPluginHostImpl::NewPluginURLStream(const nsString& aURL, if (NS_OK == rv) { #ifdef NECKO - rv = NS_OpenURI(listenerPeer, nsnull, url); + // XXX: Null LoadGroup? + rv = NS_OpenURI(listenerPeer, nsnull, url, nsnull); #else rv = NS_OpenURL(url, listenerPeer); #endif @@ -2351,7 +2353,8 @@ nsresult nsPluginHostImpl::NewEmbededPluginStream(nsIURI* aURL, if (NS_OK == rv) { #ifdef NECKO - rv = NS_OpenURI(listener, nsnull, aURL); + // XXX: Null LoadGroup? + rv = NS_OpenURI(listener, nsnull, aURL, nsnull); #else rv = NS_OpenURL(aURL, listener); #endif diff --git a/mozilla/netwerk/base/public/nsIChannel.idl b/mozilla/netwerk/base/public/nsIChannel.idl index 55e5170a55b..28ae1e08bd5 100644 --- a/mozilla/netwerk/base/public/nsIChannel.idl +++ b/mozilla/netwerk/base/public/nsIChannel.idl @@ -120,7 +120,7 @@ interface nsIChannel : nsIRequest /** * Returns the load group in which the channel is a currently a member. */ - attribute nsILoadGroup LoadGroup; + readonly attribute nsILoadGroup LoadGroup; }; diff --git a/mozilla/netwerk/base/public/nsIIOService.idl b/mozilla/netwerk/base/public/nsIIOService.idl index 92849484f65..9f13717d165 100644 --- a/mozilla/netwerk/base/public/nsIIOService.idl +++ b/mozilla/netwerk/base/public/nsIIOService.idl @@ -61,6 +61,7 @@ interface nsIIOService : nsISupports */ nsIChannel NewChannelFromURI(in string verb, in nsIURI aURI, + in nsILoadGroup aLoadGroup, in nsIEventSinkGetter eventSinkGetter); /** @@ -70,6 +71,7 @@ interface nsIIOService : nsISupports nsIChannel NewChannel(in string verb, in string aSpec, in nsIURI aBaseURI, + in nsILoadGroup aLoadGroup, in nsIEventSinkGetter eventSinkGetter); /** diff --git a/mozilla/netwerk/base/public/nsILoadGroup.idl b/mozilla/netwerk/base/public/nsILoadGroup.idl index 4868afbe385..6442e68af38 100644 --- a/mozilla/netwerk/base/public/nsILoadGroup.idl +++ b/mozilla/netwerk/base/public/nsILoadGroup.idl @@ -24,6 +24,14 @@ interface nsIStreamObserver; interface nsIStreamListener; interface nsIInputStream; + +[scriptable, uuid(60fdf550-5392-11d3-9a97-0080c7cb1080)] +interface nsILoadGroupListenerFactory : nsISupports +{ + nsIStreamListener CreateLoadGroupListener(in nsIStreamListener alistener); +}; + + /** * A load group maintains a collection of active URL requests. */ @@ -40,6 +48,13 @@ interface nsILoadGroup : nsIRequest */ attribute unsigned long DefaultLoadAttributes; + /** + * Accesses the default load channel for the group. Each time a number + * of channels are added to a group, the DefaultLoadChannel may be set + * to indicate that all of the channels are related to a particular URL. + */ + attribute nsIChannel DefaultLoadChannel; + /** * Adds a new channel to the group. This will cause the default load * attributes to be applied to that channel. If the channel added is @@ -80,6 +95,8 @@ interface nsILoadGroup : nsIRequest * Enumerator element type: nsILoadGroup. */ readonly attribute nsISimpleEnumerator SubGroups; + + attribute nsILoadGroupListenerFactory GroupListenerFactory; }; %{C++ diff --git a/mozilla/netwerk/base/public/nsIProtocolHandler.idl b/mozilla/netwerk/base/public/nsIProtocolHandler.idl index 550c6cdd533..c527ddfc4ab 100644 --- a/mozilla/netwerk/base/public/nsIProtocolHandler.idl +++ b/mozilla/netwerk/base/public/nsIProtocolHandler.idl @@ -21,6 +21,7 @@ interface nsIURI; interface nsIEventSinkGetter; interface nsIChannel; +interface nsILoadGroup; [scriptable, uuid(8984a6f0-1893-11d3-9337-00104ba0fd40)] interface nsIProtocolHandler : nsISupports @@ -41,6 +42,7 @@ interface nsIProtocolHandler : nsISupports nsIChannel NewChannel(in string verb, in nsIURI aURI, + in nsILoadGroup aLoadGroup, in nsIEventSinkGetter eventSinkGetter); }; diff --git a/mozilla/netwerk/base/src/nsIOService.cpp b/mozilla/netwerk/base/src/nsIOService.cpp index bc3afb47e15..265aed0543e 100644 --- a/mozilla/netwerk/base/src/nsIOService.cpp +++ b/mozilla/netwerk/base/src/nsIOService.cpp @@ -210,6 +210,7 @@ nsIOService::NewURI(const char* aSpec, nsIURI* aBaseURI, NS_IMETHODIMP nsIOService::NewChannelFromURI(const char* verb, nsIURI *aURI, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **result) { @@ -224,7 +225,7 @@ nsIOService::NewChannelFromURI(const char* verb, nsIURI *aURI, if (NS_FAILED(rv)) return rv; nsIChannel* channel; - rv = handler->NewChannel(verb, aURI, eventSinkGetter, &channel); + rv = handler->NewChannel(verb, aURI, aGroup, eventSinkGetter, &channel); if (NS_FAILED(rv)) return rv; *result = channel; @@ -234,6 +235,7 @@ nsIOService::NewChannelFromURI(const char* verb, nsIURI *aURI, NS_IMETHODIMP nsIOService::NewChannel(const char* verb, const char *aSpec, nsIURI *aBaseURI, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **result) { @@ -241,7 +243,7 @@ nsIOService::NewChannel(const char* verb, const char *aSpec, nsIURI* uri; rv = NewURI(aSpec, aBaseURI, &uri); if (NS_FAILED(rv)) return rv; - rv = NewChannelFromURI(verb, uri, eventSinkGetter, result); + rv = NewChannelFromURI(verb, uri, aGroup, eventSinkGetter, result); NS_RELEASE(uri); return rv; } diff --git a/mozilla/netwerk/base/src/nsIOService.h b/mozilla/netwerk/base/src/nsIOService.h index b32d97a866b..ab82222b4ac 100644 --- a/mozilla/netwerk/base/src/nsIOService.h +++ b/mozilla/netwerk/base/src/nsIOService.h @@ -36,10 +36,12 @@ public: NS_IMETHOD NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval); NS_IMETHOD NewChannelFromURI(const char* verb, nsIURI *aURI, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **_retval); NS_IMETHOD NewChannel(const char* verb, const char *aSpec, nsIURI *aBaseURI, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **_retval); NS_IMETHOD GetAppCodeName(PRUnichar* *aAppCodeName); diff --git a/mozilla/netwerk/base/src/nsLoadGroup.cpp b/mozilla/netwerk/base/src/nsLoadGroup.cpp index 85d3a9c184d..80b17cf2b3c 100644 --- a/mozilla/netwerk/base/src/nsLoadGroup.cpp +++ b/mozilla/netwerk/base/src/nsLoadGroup.cpp @@ -51,7 +51,8 @@ PRLogModuleInfo* gLoadGroupLog = nsnull; nsLoadGroup::nsLoadGroup(nsISupports* outer) : mChannels(nsnull), mSubGroups(nsnull), mDefaultLoadAttributes(nsIChannel::LOAD_NORMAL), - mObserver(nsnull), mParent(nsnull), mForegroundCount(0) + mObserver(nsnull), mParent(nsnull), mForegroundCount(0), + mIsActive(PR_FALSE) { NS_INIT_AGGREGATED(outer); @@ -94,6 +95,31 @@ nsLoadGroup::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult) return rv; } +nsresult nsLoadGroup::SubGroupIsEmpty(nsresult aStatus) +{ + nsresult rv; + + if (mIsActive && mForegroundCount == 0) { + PRBool busy; + + (void) IsPending(&busy); + if (!busy) { + mIsActive = PR_FALSE; + PR_LOG(gLoadGroupLog, PR_LOG_DEBUG, + ("LOADGROUP: %x Firing OnStopRequest(...).\n", + this)); + rv = mObserver->OnStopRequest(mDefaultLoadChannel, nsnull, + aStatus, nsnull); + + if (mParent) { + mParent->SubGroupIsEmpty(aStatus); + } + } + } + + return NS_OK; +} + NS_IMPL_AGGREGATED(nsLoadGroup); NS_IMETHODIMP @@ -189,9 +215,9 @@ nsLoadGroup::IsPending(PRBool *result) nsresult rv; if (mForegroundCount > 0) { *result = PR_TRUE; - LOG(gLoadGroupLog, PR_LOG_DEBUG, - (depth, "LOADGROUP: %x IsPending TRUE (foreground-count=%d)\n", - this, mForegroundCount)); +/// LOG(gLoadGroupLog, PR_LOG_DEBUG, +/// (depth, "LOADGROUP: %x IsPending TRUE (foreground-count=%d)\n", +/// this, mForegroundCount)); return NS_OK; } @@ -203,8 +229,8 @@ nsLoadGroup::IsPending(PRBool *result) if (NS_FAILED(rv)) return rv; } #ifdef DEBUG - LOG(gLoadGroupLog, PR_LOG_DEBUG, - (depth, "LOADGROUP: %x IsPending ...\n", this)); +/// LOG(gLoadGroupLog, PR_LOG_DEBUG, +/// (depth, "LOADGROUP: %x IsPending ...\n", this)); depth++; #endif for (i = 0; i < count; i++) { @@ -218,9 +244,9 @@ nsLoadGroup::IsPending(PRBool *result) if (NS_FAILED(rv)) return rv; if (pending) { *result = PR_TRUE; - LOG(gLoadGroupLog, PR_LOG_DEBUG, - (--depth, "LOADGROUP: %x IsPending TRUE (subgroup %x is pending)\n", - this, x)); +/// LOG(gLoadGroupLog, PR_LOG_DEBUG, +/// (--depth, "LOADGROUP: %x IsPending TRUE (subgroup %x is pending)\n", +/// this, x)); return NS_OK; } } @@ -229,8 +255,8 @@ nsLoadGroup::IsPending(PRBool *result) #endif *result = PR_FALSE; - LOG(gLoadGroupLog, PR_LOG_DEBUG, - (depth, "LOADGROUP: %x IsPending FALSE\n", this)); +/// LOG(gLoadGroupLog, PR_LOG_DEBUG, +/// (depth, "LOADGROUP: %x IsPending FALSE\n", this)); return NS_OK; } @@ -331,6 +357,7 @@ nsLoadGroup::Init(nsIStreamObserver *observer, nsILoadGroup *parent) NS_IF_RELEASE(mObserver); if (observer) { +/* nsCOMPtr eventQueue; NS_WITH_SERVICE(nsIEventQueueService, eventQService, kEventQueueService, &rv); if (NS_FAILED(rv)) return rv; @@ -344,6 +371,8 @@ nsLoadGroup::Init(nsIStreamObserver *observer, nsILoadGroup *parent) if (NS_FAILED(rv)) return rv; mObserver = asyncObserver; +*/ +mObserver = observer; NS_ADDREF(mObserver); } @@ -368,6 +397,22 @@ nsLoadGroup::SetDefaultLoadAttributes(PRUint32 aDefaultLoadAttributes) return NS_OK; } +NS_IMETHODIMP +nsLoadGroup::GetDefaultLoadChannel(nsIChannel * *aChannel) +{ + *aChannel = mDefaultLoadChannel; + NS_IF_ADDREF(*aChannel); + return NS_OK; +} + +NS_IMETHODIMP +nsLoadGroup::SetDefaultLoadChannel(nsIChannel *aChannel) +{ + mDefaultLoadChannel = aChannel; + return NS_OK; +} + + NS_IMETHODIMP nsLoadGroup::AddChannel(nsIChannel *channel, nsISupports* ctxt) { @@ -393,14 +438,14 @@ nsLoadGroup::AddChannel(nsIChannel *channel, nsISupports* ctxt) nsCRT::free(uriStr); #endif - rv = channel->SetLoadGroup(this); - if (NS_FAILED(rv)) return rv; +/// rv = channel->SetLoadGroup(this); +/// if (NS_FAILED(rv)) return rv; rv = mChannels->AppendElement(channel) ? NS_OK : NS_ERROR_FAILURE; // XXX this method incorrectly returns a bool if (NS_FAILED(rv)) return rv; - rv = channel->SetLoadAttributes(mDefaultLoadAttributes); - if (NS_FAILED(rv)) return rv; +/// rv = channel->SetLoadAttributes(mDefaultLoadAttributes); +/// if (NS_FAILED(rv)) return rv; nsLoadFlags flags; rv = channel->GetLoadAttributes(&flags); @@ -420,9 +465,19 @@ nsLoadGroup::AddChannel(nsIChannel *channel, nsISupports* ctxt) ("LOADGROUP: %x First channel %x %s.\n", this, channel, uriStr)); nsCRT::free(uriStr); #endif - rv = mObserver->OnStartRequest(channel, ctxt); + if (!mIsActive) { + // + // Only fire the start notification if *all* subgroups are + // empty too... + // + PR_LOG(gLoadGroupLog, PR_LOG_DEBUG, + ("LOADGROUP: %x Firing OnStartRequest(...).\n", + this)); + rv = mObserver->OnStartRequest(channel, ctxt); + } // return with rv, below } + mIsActive = PR_TRUE; } } @@ -458,26 +513,35 @@ nsLoadGroup::RemoveChannel(nsIChannel *channel, nsISupports* ctxt, if (!(flags & nsIChannel::LOAD_BACKGROUND)) { NS_ASSERTION(mForegroundCount > 0, "mForegroundCount messed up"); --mForegroundCount; - if (mObserver) { - PRBool pending; - rv = IsPending(&pending); - if (NS_SUCCEEDED(rv) && !pending) { + + PRBool pending; + rv = IsPending(&pending); + if (NS_SUCCEEDED(rv) && !pending) { #ifdef DEBUG - char* uriStr; - nsCOMPtr uri; - rv = channel->GetURI(getter_AddRefs(uri)); - if (NS_SUCCEEDED(rv)) - rv = uri->GetSpec(&uriStr); - if (NS_FAILED(rv)) - uriStr = nsCRT::strdup("?"); - PR_LOG(gLoadGroupLog, PR_LOG_DEBUG, - ("LOADGROUP: %x Last channel %x %s status %d.\n", - this, channel, uriStr, status)); - nsCRT::free(uriStr); + char* uriStr; + nsCOMPtr uri; + rv = channel->GetURI(getter_AddRefs(uri)); + if (NS_SUCCEEDED(rv)) + rv = uri->GetSpec(&uriStr); + if (NS_FAILED(rv)) + uriStr = nsCRT::strdup("?"); + PR_LOG(gLoadGroupLog, PR_LOG_DEBUG, + ("LOADGROUP: %x Last channel %x %s status %d.\n", + this, channel, uriStr, status)); + nsCRT::free(uriStr); #endif + mIsActive = PR_FALSE; + + if (mObserver) { + PR_LOG(gLoadGroupLog, PR_LOG_DEBUG, + ("LOADGROUP: %x Firing OnStopRequest(...).\n", + this)); rv = mObserver->OnStopRequest(channel, ctxt, status, errorMsg); // return with rv, below } + if (mParent) { + mParent->SubGroupIsEmpty(status); + } } } } @@ -552,4 +616,20 @@ nsLoadGroup::GetSubGroups(nsISimpleEnumerator * *aSubGroups) return NS_NewArrayEnumerator(aSubGroups, mSubGroups); } + +NS_IMETHODIMP +nsLoadGroup::GetGroupListenerFactory(nsILoadGroupListenerFactory * *aFactory) +{ + *aFactory = mGroupListenerFactory; + NS_IF_ADDREF(*aFactory); + return NS_OK; +} + +NS_IMETHODIMP +nsLoadGroup::SetGroupListenerFactory(nsILoadGroupListenerFactory *aFactory) +{ + mGroupListenerFactory = aFactory; + return NS_OK; +} + //////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/netwerk/base/src/nsLoadGroup.h b/mozilla/netwerk/base/src/nsLoadGroup.h index 1d5da6af6b9..c46d60a1ee8 100644 --- a/mozilla/netwerk/base/src/nsLoadGroup.h +++ b/mozilla/netwerk/base/src/nsLoadGroup.h @@ -22,6 +22,7 @@ #include "nsILoadGroup.h" #include "nsIStreamListener.h" #include "nsAgg.h" +#include "nsCOMPtr.h" class nsISupportsArray; class nsLoadGroupEntry; @@ -56,6 +57,10 @@ public: NS_IMETHOD GetDefaultLoadAttributes(PRUint32 *aDefaultLoadAttributes); NS_IMETHOD SetDefaultLoadAttributes(PRUint32 aDefaultLoadAttributes); + /* attribute nsIChannel DefaultLoadChannel; */ + NS_IMETHOD GetDefaultLoadChannel(nsIChannel * *aChannel); + NS_IMETHOD SetDefaultLoadChannel(nsIChannel *aChannel); + /* void AddChannel (in nsIChannel channel, in nsISupports ctxt); */ NS_IMETHOD AddChannel(nsIChannel *channel, nsISupports* ctxt); @@ -75,6 +80,10 @@ public: /* readonly attribute nsISimpleEnumerator SubGroups; */ NS_IMETHOD GetSubGroups(nsISimpleEnumerator * *aSubGroups); + /* attribute nsILoadGroupListenerFactory GroupListenerFactory; */ + NS_IMETHOD GetGroupListenerFactory(nsILoadGroupListenerFactory * *aFactory); + NS_IMETHOD SetGroupListenerFactory(nsILoadGroupListenerFactory* aFactory); + //////////////////////////////////////////////////////////////////////////// // nsLoadGroup methods: @@ -90,6 +99,8 @@ protected: typedef nsresult (*PropagateDownFun)(nsIRequest* request); nsresult PropagateDown(PropagateDownFun fun); + nsresult SubGroupIsEmpty(nsresult aStatus); + protected: PRUint32 mDefaultLoadAttributes; nsISupportsArray* mChannels; @@ -97,6 +108,11 @@ protected: nsIStreamObserver* mObserver; nsLoadGroup* mParent; // weak ref PRUint32 mForegroundCount; + PRBool mIsActive; + + nsCOMPtr mDefaultLoadChannel; + + nsCOMPtr mGroupListenerFactory; }; #endif // nsLoadGroup_h__ diff --git a/mozilla/netwerk/base/src/nsSocketTransport.cpp b/mozilla/netwerk/base/src/nsSocketTransport.cpp index 0e912a9a53b..e34e4201fc8 100644 --- a/mozilla/netwerk/base/src/nsSocketTransport.cpp +++ b/mozilla/netwerk/base/src/nsSocketTransport.cpp @@ -273,6 +273,7 @@ nsresult nsSocketTransport::Process(PRInt16 aSelectFlags) ("Operation failed via PR_POLL_EXCEPT. [this=%x].\n", this)); // An error has occurred, so cancel the read and/or write operation... mCurrentState = eSocketState_Error; + rv = NS_BINDING_FAILED; } while (!done) diff --git a/mozilla/netwerk/protocol/about/public/nsIAboutModule.idl b/mozilla/netwerk/protocol/about/public/nsIAboutModule.idl index 6e688686447..c32630ed739 100644 --- a/mozilla/netwerk/protocol/about/public/nsIAboutModule.idl +++ b/mozilla/netwerk/protocol/about/public/nsIAboutModule.idl @@ -20,6 +20,7 @@ interface nsIChannel; interface nsIURI; +interface nsILoadGroup; interface nsIEventSinkGetter; interface nsIEventQueue; @@ -28,6 +29,7 @@ interface nsIAboutModule : nsISupports { nsIChannel NewChannel(in string verb, in nsIURI aURI, + in nsILoadGroup aGroup, in nsIEventSinkGetter eventSinkGetter); }; diff --git a/mozilla/netwerk/protocol/about/src/nsAboutBlank.cpp b/mozilla/netwerk/protocol/about/src/nsAboutBlank.cpp index e3ea0d974f5..1fb98448f57 100644 --- a/mozilla/netwerk/protocol/about/src/nsAboutBlank.cpp +++ b/mozilla/netwerk/protocol/about/src/nsAboutBlank.cpp @@ -30,6 +30,7 @@ static const char kBlankPage[] = ""; NS_IMETHODIMP nsAboutBlank::NewChannel(const char *verb, nsIURI *aURI, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **result) { diff --git a/mozilla/netwerk/protocol/about/src/nsAboutBlank.h b/mozilla/netwerk/protocol/about/src/nsAboutBlank.h index aa8cb53b6fd..d5af7ac6d6f 100644 --- a/mozilla/netwerk/protocol/about/src/nsAboutBlank.h +++ b/mozilla/netwerk/protocol/about/src/nsAboutBlank.h @@ -28,6 +28,7 @@ public: NS_IMETHOD NewChannel(const char *verb, nsIURI *aURI, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **result); diff --git a/mozilla/netwerk/protocol/about/src/nsAboutProtocolHandler.cpp b/mozilla/netwerk/protocol/about/src/nsAboutProtocolHandler.cpp index 5a96fa74844..cdb2bdec2ed 100644 --- a/mozilla/netwerk/protocol/about/src/nsAboutProtocolHandler.cpp +++ b/mozilla/netwerk/protocol/about/src/nsAboutProtocolHandler.cpp @@ -130,6 +130,7 @@ nsAboutProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, NS_IMETHODIMP nsAboutProtocolHandler::NewChannel(const char* verb, nsIURI* uri, + nsILoadGroup *aGroup, nsIEventSinkGetter* eventSinkGetter, nsIChannel* *result) { @@ -155,7 +156,8 @@ nsAboutProtocolHandler::NewChannel(const char* verb, nsIURI* uri, nsCRT::free(progIDStr); if (NS_SUCCEEDED(rv)) { // The standard return case: - return aboutMod->NewChannel(verb, uri, eventSinkGetter, result); + return aboutMod->NewChannel(verb, uri, aGroup, eventSinkGetter, + result); } // mumble... diff --git a/mozilla/netwerk/protocol/about/src/nsAboutProtocolHandler.h b/mozilla/netwerk/protocol/about/src/nsAboutProtocolHandler.h index 72cde99bb38..25f07032eb8 100644 --- a/mozilla/netwerk/protocol/about/src/nsAboutProtocolHandler.h +++ b/mozilla/netwerk/protocol/about/src/nsAboutProtocolHandler.h @@ -42,6 +42,7 @@ public: NS_IMETHOD NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval); NS_IMETHOD NewChannel(const char* verb, nsIURI* url, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **_retval); diff --git a/mozilla/netwerk/protocol/file/src/nsFileChannel.cpp b/mozilla/netwerk/protocol/file/src/nsFileChannel.cpp index 30eb663559d..7f4ef5b655a 100644 --- a/mozilla/netwerk/protocol/file/src/nsFileChannel.cpp +++ b/mozilla/netwerk/protocol/file/src/nsFileChannel.cpp @@ -76,7 +76,7 @@ nsFileChannel::nsFileChannel() mBufferInputStream(nsnull), mBufferOutputStream(nsnull), mStatus(NS_OK), mHandler(nsnull), mSourceOffset(0), mLoadAttributes(LOAD_NORMAL), - mReadFixedAmount(PR_FALSE), mLoadGroup(nsnull) + mReadFixedAmount(PR_FALSE), mLoadGroup(nsnull), mRealListener(nsnull) { NS_INIT_REFCNT(); #if defined(PR_LOGGING) @@ -92,7 +92,8 @@ nsFileChannel::nsFileChannel() nsresult nsFileChannel::Init(nsFileProtocolHandler* handler, - const char* verb, nsIURI* uri, nsIEventSinkGetter* getter) + const char* verb, nsIURI* uri, nsILoadGroup *aGroup, + nsIEventSinkGetter* getter) { nsresult rv; @@ -114,6 +115,12 @@ nsFileChannel::Init(nsFileProtocolHandler* handler, mURI = uri; NS_ADDREF(mURI); + mLoadGroup = aGroup; + NS_IF_ADDREF(mLoadGroup); + if (mLoadGroup) { + mLoadGroup->GetDefaultLoadAttributes(&mLoadAttributes); + } + // if we support the nsIURL interface then use it to get just // the file path with no other garbage! nsCOMPtr aUrl = do_QueryInterface(mURI, &rv); @@ -374,6 +381,10 @@ nsFileChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount, #ifdef STREAM_CONVERTER_HACK nsXPIDLCString aContentType; + + + mRealListener = listener; + rv = GetContentType(getter_Copies(aContentType)); if (NS_SUCCEEDED(rv) && PL_strcasecmp("message/rfc822", aContentType) == 0) { @@ -399,7 +410,7 @@ nsFileChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount, // (1) and (2) nsCOMPtr proxiedConsumerListener; - rv = serv->NewAsyncStreamListener(listener, mEventQueue, getter_AddRefs(proxiedConsumerListener)); + rv = serv->NewAsyncStreamListener(this, mEventQueue, getter_AddRefs(proxiedConsumerListener)); if (NS_FAILED(rv)) return rv; // (3) set the stream converter as the listener on the channel @@ -411,9 +422,9 @@ nsFileChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount, mStreamConverter->GetContentType(getter_Copies(mStreamConverterOutType)); } else - rv = serv->NewAsyncStreamListener(listener, mEventQueue, &mListener); + rv = serv->NewAsyncStreamListener(this, mEventQueue, &mListener); #else - rv = serv->NewAsyncStreamListener(listener, mEventQueue, &mListener); + rv = serv->NewAsyncStreamListener(this, mEventQueue, &mListener); #endif if (NS_FAILED(rv)) return rv; @@ -442,6 +453,25 @@ nsFileChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount, else mAmount = 0; // don't worry we'll ignore this parameter from here on out because mReadFixedAmount is false + if (mLoadGroup) { + nsCOMPtr factory; + // + // Create a load group "proxy" listener... + // + rv = mLoadGroup->GetGroupListenerFactory(getter_AddRefs(factory)); + if (factory) { + nsIStreamListener *newListener; + rv = factory->CreateLoadGroupListener(mRealListener, &newListener); + if (NS_SUCCEEDED(rv)) { + mRealListener = newListener; + NS_RELEASE(newListener); + } + } + + rv = mLoadGroup->AddChannel(this, nsnull); + if (NS_FAILED(rv)) return rv; + } + PR_LOG(gFileTransportLog, PR_LOG_DEBUG, ("nsFileTransport: AsyncRead [this=%x %s]", this, (const char*)mSpec)); @@ -519,14 +549,6 @@ nsFileChannel::GetLoadGroup(nsILoadGroup * *aLoadGroup) return NS_OK; } -NS_IMETHODIMP -nsFileChannel::SetLoadGroup(nsILoadGroup * aLoadGroup) -{ - NS_IF_RELEASE(mLoadGroup); - mLoadGroup = aLoadGroup; - NS_IF_ADDREF(mLoadGroup); - return NS_OK; -} //////////////////////////////////////////////////////////////////////////////// // nsIRunnable methods: @@ -739,6 +761,45 @@ nsFileChannel::OnEmpty(nsIBuffer* buffer) return Resume(); } +//////////////////////////////////////////////////////////////////////////////// +// nsIStreamListener methods: +//////////////////////////////////////////////////////////////////////////////// + +NS_IMETHODIMP +nsFileChannel::OnDataAvailable(nsIChannel* channel, nsISupports* context, + nsIInputStream *aIStream, + PRUint32 aSourceOffset, + PRUint32 aLength) +{ + return mRealListener->OnDataAvailable(channel, context, aIStream, + aSourceOffset, aLength); +} + +NS_IMETHODIMP +nsFileChannel::OnStartRequest(nsIChannel* channel, nsISupports* context) +{ + NS_ASSERTION(mRealListener, "No listener..."); + return mRealListener->OnStartRequest(channel, context); +} + +NS_IMETHODIMP +nsFileChannel::OnStopRequest(nsIChannel* channel, nsISupports* context, + nsresult aStatus, + const PRUnichar* aMsg) +{ + nsresult rv; + + rv = mRealListener->OnStopRequest(channel, context, aStatus, aMsg); + + if (mLoadGroup) { + mLoadGroup->RemoveChannel(channel, context, aStatus, aMsg); + } + + // Release the reference to the consumer stream listener... + mRealListener = null_nsCOMPtr(); + return rv; +} + //////////////////////////////////////////////////////////////////////////////// // From nsIFileChannel //////////////////////////////////////////////////////////////////////////////// @@ -781,6 +842,7 @@ nsFileChannel::GetParent(nsIFileChannel * *aParent) nsIChannel* channel; rv = serv->NewChannel("load", // XXX what should this be? urlStr, nsnull, + mLoadGroup, mGetter, &channel); if (NS_FAILED(rv)) return rv; diff --git a/mozilla/netwerk/protocol/file/src/nsFileChannel.h b/mozilla/netwerk/protocol/file/src/nsFileChannel.h index 90cd80e7ea6..880b621ae94 100644 --- a/mozilla/netwerk/protocol/file/src/nsFileChannel.h +++ b/mozilla/netwerk/protocol/file/src/nsFileChannel.h @@ -35,6 +35,7 @@ #include "nsIEventQueueService.h" #include "nsIBuffer.h" #include "nsILoadGroup.h" +#include "nsIStreamListener.h" #include "nsCOMPtr.h" #ifdef STREAM_CONVERTER_HACK @@ -52,7 +53,8 @@ class nsIBufferOutputStream; class nsFileChannel : public nsIFileChannel, public nsIRunnable, - public nsIBufferObserver + public nsIBufferObserver, + public nsIStreamListener { public: @@ -99,7 +101,6 @@ public: NS_IMETHOD GetContentType(char * *aContentType); NS_IMETHOD GetLoadGroup(nsILoadGroup * *aLoadGroup); - NS_IMETHOD SetLoadGroup(nsILoadGroup * aLoadGroup); //////////////////////////////////////////////////////////////////////////// // from nsIFileChannel: @@ -169,6 +170,21 @@ public: NS_IMETHOD OnEmpty(nsIBuffer* buffer); + //////////////////////////////////////////////////////////////////////////// + // nsIStreamListener: + + NS_IMETHOD OnDataAvailable(nsIChannel* channel, nsISupports* context, + nsIInputStream *aIStream, + PRUint32 aSourceOffset, + PRUint32 aLength); + + + NS_IMETHOD OnStartRequest(nsIChannel* channel, nsISupports* context); + + NS_IMETHOD OnStopRequest(nsIChannel* channel, nsISupports* context, + nsresult aStatus, + const PRUnichar* aMsg); + //////////////////////////////////////////////////////////////////////////// // nsFileChannel: @@ -181,7 +197,8 @@ public: Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult); nsresult Init(nsFileProtocolHandler* handler, - const char* verb, nsIURI* uri, nsIEventSinkGetter* getter); + const char* verb, nsIURI* uri, nsILoadGroup *aGroup, + nsIEventSinkGetter* getter); void Process(void); @@ -219,6 +236,7 @@ protected: PRMonitor* mMonitor; PRUint32 mLoadAttributes; nsILoadGroup* mLoadGroup; + nsCOMPtr mRealListener; #ifdef STREAM_CONVERTER_HACK nsCOMPtr mStreamConverter; diff --git a/mozilla/netwerk/protocol/file/src/nsFileProtocolHandler.cpp b/mozilla/netwerk/protocol/file/src/nsFileProtocolHandler.cpp index f44725da47e..61e0408efc6 100644 --- a/mozilla/netwerk/protocol/file/src/nsFileProtocolHandler.cpp +++ b/mozilla/netwerk/protocol/file/src/nsFileProtocolHandler.cpp @@ -149,6 +149,7 @@ nsFileProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, NS_IMETHODIMP nsFileProtocolHandler::NewChannel(const char* verb, nsIURI* url, + nsILoadGroup *aGroup, nsIEventSinkGetter* eventSinkGetter, nsIChannel* *result) { @@ -158,7 +159,7 @@ nsFileProtocolHandler::NewChannel(const char* verb, nsIURI* url, rv = nsFileChannel::Create(nsnull, nsCOMTypeInfo::GetIID(), (void**)&channel); if (NS_FAILED(rv)) return rv; - rv = channel->Init(this, verb, url, eventSinkGetter); + rv = channel->Init(this, verb, url, aGroup, eventSinkGetter); if (NS_FAILED(rv)) { NS_RELEASE(channel); return rv; @@ -185,6 +186,7 @@ nsFileProtocolHandler::NewChannelFromNativePath(const char* nativePath, rv = NewChannel("load", // XXX what should this be? uri, + nsnull, // XXX bogus load group nsnull, // XXX bogus getter (nsIChannel**)result); NS_RELEASE(uri); diff --git a/mozilla/netwerk/protocol/file/src/nsFileProtocolHandler.h b/mozilla/netwerk/protocol/file/src/nsFileProtocolHandler.h index 368c01df8b2..927952f3f3c 100644 --- a/mozilla/netwerk/protocol/file/src/nsFileProtocolHandler.h +++ b/mozilla/netwerk/protocol/file/src/nsFileProtocolHandler.h @@ -50,6 +50,7 @@ public: NS_IMETHOD NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval); NS_IMETHOD NewChannel(const char* verb, nsIURI* url, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **_retval); diff --git a/mozilla/netwerk/protocol/ftp/src/nsFTPChannel.cpp b/mozilla/netwerk/protocol/ftp/src/nsFTPChannel.cpp index 17ba4b05a00..1a57316227a 100644 --- a/mozilla/netwerk/protocol/ftp/src/nsFTPChannel.cpp +++ b/mozilla/netwerk/protocol/ftp/src/nsFTPChannel.cpp @@ -94,7 +94,8 @@ nsFTPChannel::QueryInterface(const nsIID& aIID, void** aInstancePtr) { } nsresult -nsFTPChannel::Init(const char* verb, nsIURI* uri, nsIEventSinkGetter* getter) +nsFTPChannel::Init(const char* verb, nsIURI* uri, nsILoadGroup *aGroup, + nsIEventSinkGetter* getter) { nsresult rv; @@ -104,6 +105,9 @@ nsFTPChannel::Init(const char* verb, nsIURI* uri, nsIEventSinkGetter* getter) mUrl = uri; NS_ADDREF(mUrl); + mLoadGroup = aGroup; + NS_IF_ADDREF(mLoadGroup); + if (getter) { nsIProgressEventSink* eventSink; rv = getter->GetEventSink(verb, nsCOMTypeInfo::GetIID(), @@ -362,15 +366,6 @@ nsFTPChannel::GetLoadGroup(nsILoadGroup * *aLoadGroup) return NS_OK; } -NS_IMETHODIMP -nsFTPChannel::SetLoadGroup(nsILoadGroup * aLoadGroup) -{ - NS_IF_RELEASE(mLoadGroup); - mLoadGroup = aLoadGroup; - NS_IF_ADDREF(mLoadGroup); - return NS_OK; -} - //////////////////////////////////////////////////////////////////////////////// // nsIFTPChannel methods: diff --git a/mozilla/netwerk/protocol/ftp/src/nsFTPChannel.h b/mozilla/netwerk/protocol/ftp/src/nsFTPChannel.h index 31185c11323..6a6a109bfa3 100644 --- a/mozilla/netwerk/protocol/ftp/src/nsFTPChannel.h +++ b/mozilla/netwerk/protocol/ftp/src/nsFTPChannel.h @@ -65,7 +65,6 @@ public: NS_IMETHOD SetLoadAttributes(PRUint32 aLoadAttributes); NS_IMETHOD GetContentType(char * *aContentType); NS_IMETHOD GetLoadGroup(nsILoadGroup * *aLoadGroup); - NS_IMETHOD SetLoadGroup(nsILoadGroup * aLoadGroup); // nsIFTPChannel methods: NS_IMETHOD Get(void); @@ -92,7 +91,8 @@ public: static NS_METHOD Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult); - nsresult Init(const char* verb, nsIURI* uri, nsIEventSinkGetter* getter); + nsresult Init(const char* verb, nsIURI* uri, nsILoadGroup *aGroup, + nsIEventSinkGetter* getter); protected: nsIURI* mUrl; diff --git a/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolHandler.cpp b/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolHandler.cpp index e2cdb6059c8..d562926efbf 100644 --- a/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolHandler.cpp +++ b/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolHandler.cpp @@ -127,6 +127,7 @@ nsFtpProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, NS_IMETHODIMP nsFtpProtocolHandler::NewChannel(const char* verb, nsIURI* url, + nsILoadGroup *aGroup, nsIEventSinkGetter* eventSinkGetter, nsIChannel* *result) { @@ -136,7 +137,7 @@ nsFtpProtocolHandler::NewChannel(const char* verb, nsIURI* url, rv = nsFTPChannel::Create(nsnull, nsCOMTypeInfo::GetIID(), (void**)&channel); if (NS_FAILED(rv)) return rv; - rv = channel->Init(verb, url, eventSinkGetter); + rv = channel->Init(verb, url, aGroup, eventSinkGetter); if (NS_FAILED(rv)) { NS_RELEASE(channel); return rv; diff --git a/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolHandler.h b/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolHandler.h index eae3c0a48d7..72d357816f0 100644 --- a/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolHandler.h +++ b/mozilla/netwerk/protocol/ftp/src/nsFtpProtocolHandler.h @@ -38,6 +38,7 @@ public: NS_IMETHOD NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval); NS_IMETHOD NewChannel(const char* verb, nsIURI* url, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **_retval); diff --git a/mozilla/netwerk/protocol/http/src/nsHTTPChannel.cpp b/mozilla/netwerk/protocol/http/src/nsHTTPChannel.cpp index 91c128a372e..812122b1272 100644 --- a/mozilla/netwerk/protocol/http/src/nsHTTPChannel.cpp +++ b/mozilla/netwerk/protocol/http/src/nsHTTPChannel.cpp @@ -80,7 +80,11 @@ nsHTTPChannel::~nsHTTPChannel() NS_IF_RELEASE(m_pResponse); NS_IF_RELEASE(mPostStream); NS_IF_RELEASE(m_pResponseDataListener); - NS_IF_RELEASE(mLoadGroup); + + m_pHandler = null_nsCOMPtr(); + m_pEventSink = null_nsCOMPtr(); + mResponseContext = null_nsCOMPtr(); + mLoadGroup = null_nsCOMPtr(); } NS_IMETHODIMP @@ -306,15 +310,6 @@ nsHTTPChannel::GetLoadGroup(nsILoadGroup * *aLoadGroup) return NS_OK; } -NS_IMETHODIMP -nsHTTPChannel::SetLoadGroup(nsILoadGroup * aLoadGroup) -{ - NS_IF_RELEASE(mLoadGroup); - mLoadGroup = aLoadGroup; - NS_IF_ADDREF(mLoadGroup); - return NS_OK; -} - //////////////////////////////////////////////////////////////////////////////// // nsIHTTPChannel methods: @@ -444,7 +439,7 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID); // nsHTTPChannel methods: nsresult -nsHTTPChannel::Init() +nsHTTPChannel::Init(nsILoadGroup *aGroup) { //TODO think if we need to make a copy of the URL and keep it here //since it might get deleted off the creators thread. And the @@ -456,6 +451,14 @@ nsHTTPChannel::Init() */ nsresult rv; + // + // Initialize the load group and copy any default load attributes... + // + mLoadGroup = aGroup; + if (mLoadGroup) { + mLoadGroup->GetDefaultLoadAttributes(&mLoadAttributes); + } + m_pRequest = new nsHTTPRequest(m_URI); if (m_pRequest == nsnull) return NS_ERROR_OUT_OF_MEMORY; @@ -481,10 +484,33 @@ nsHTTPChannel::Open(void) if (m_bConnected || (m_State > HS_WAITING_FOR_OPEN)) return NS_ERROR_ALREADY_CONNECTED; - // Set up a new request observer and a response listener and pass to the transport + // Set up a new request observer and a response listener and pass + // to the transport nsresult rv = NS_OK; nsCOMPtr channel; + // If this is the first time, then add the channel to its load group + if (m_State == HS_IDLE) { + if (mLoadGroup) { + nsCOMPtr factory; + // + // Create a load group "proxy" listener... + // + rv = mLoadGroup->GetGroupListenerFactory(getter_AddRefs(factory)); + if (factory) { + nsIStreamListener *newListener; + rv = factory->CreateLoadGroupListener(m_pResponseDataListener, + &newListener); + if (NS_SUCCEEDED(rv)) { + NS_RELEASE(m_pResponseDataListener); + // Already AddRefed from the factory... + m_pResponseDataListener = newListener; + } + } + mLoadGroup->AddChannel(this, nsnull); + } + } + rv = m_pHandler->RequestTransport(m_URI, this, getter_AddRefs(channel)); if (NS_ERROR_BUSY == rv) { m_State = HS_WAITING_FOR_OPEN; @@ -600,13 +626,24 @@ nsHTTPChannel::Open(void) return rv; } -nsresult nsHTTPChannel::ResponseCompleted(nsIChannel* aTransport) +nsresult nsHTTPChannel::ResponseCompleted(nsIChannel* aTransport, + nsresult aStatus) { + nsresult rv = NS_OK; + // Null out pointers that are no longer needed... mResponseContext = null_nsCOMPtr(); NS_IF_RELEASE(m_pResponseDataListener); - return m_pHandler->ReleaseTransport(aTransport); + if (aTransport) { + rv = m_pHandler->ReleaseTransport(aTransport); + } + + // Remove the channel from its load group... + if (mLoadGroup) { + (void)mLoadGroup->RemoveChannel(this, nsnull, aStatus, nsnull); + } + return rv; } nsresult nsHTTPChannel::SetResponse(nsHTTPResponse* i_pResp) diff --git a/mozilla/netwerk/protocol/http/src/nsHTTPChannel.h b/mozilla/netwerk/protocol/http/src/nsHTTPChannel.h index df0ca8f0397..8522dba975c 100644 --- a/mozilla/netwerk/protocol/http/src/nsHTTPChannel.h +++ b/mozilla/netwerk/protocol/http/src/nsHTTPChannel.h @@ -79,7 +79,6 @@ public: NS_IMETHOD SetLoadAttributes(PRUint32 aLoadAttributes); NS_IMETHOD GetContentType(char * *aContentType); NS_IMETHOD GetLoadGroup(nsILoadGroup * *aLoadGroup); - NS_IMETHOD SetLoadGroup(nsILoadGroup * aLoadGroup); // nsIHTTPChannel methods: NS_IMETHOD GetRequestHeader(nsIAtom *headerName, char **_retval); @@ -99,13 +98,15 @@ public: NS_IMETHOD GetResponseDataListener(nsIStreamListener* *aListener); // nsHTTPChannel methods: - nsresult Init(); + nsresult Init(nsILoadGroup *aGroup); nsresult Open(); - nsresult ResponseCompleted(nsIChannel* aTransport); + nsresult ResponseCompleted(nsIChannel* aTransport, + nsresult aStatus); nsresult SetResponse(nsHTTPResponse* i_pResp); nsresult GetResponseContext(nsISupports** aContext); nsresult SetContentType(const char* aContentType); + protected: nsCOMPtr m_URI; PRBool m_bConnected; @@ -118,7 +119,7 @@ protected: PRUint32 mLoadAttributes; nsCOMPtr mResponseContext; - nsILoadGroup* mLoadGroup; + nsCOMPtr mLoadGroup; nsCString mContentType; nsIInputStream* mPostStream; diff --git a/mozilla/netwerk/protocol/http/src/nsHTTPHandler.cpp b/mozilla/netwerk/protocol/http/src/nsHTTPHandler.cpp index e8577bcf355..1676dc721e1 100644 --- a/mozilla/netwerk/protocol/http/src/nsHTTPHandler.cpp +++ b/mozilla/netwerk/protocol/http/src/nsHTTPHandler.cpp @@ -120,6 +120,7 @@ NS_IMPL_ADDREF(nsHTTPHandler); NS_METHOD nsHTTPHandler::NewChannel(const char* verb, nsIURI* i_URL, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **o_Instance) { @@ -178,7 +179,7 @@ nsHTTPHandler::NewChannel(const char* verb, nsIURI* i_URL, this); if (pChannel) { NS_ADDREF(pChannel); - pChannel->Init(); + pChannel->Init(aGroup); rv = pChannel->QueryInterface(nsCOMTypeInfo::GetIID(), (void**)o_Instance); // add this instance to the active list of connections // TODO! diff --git a/mozilla/netwerk/protocol/http/src/nsHTTPHandler.h b/mozilla/netwerk/protocol/http/src/nsHTTPHandler.h index b10f479b704..cf2d8083603 100644 --- a/mozilla/netwerk/protocol/http/src/nsHTTPHandler.h +++ b/mozilla/netwerk/protocol/http/src/nsHTTPHandler.h @@ -82,6 +82,7 @@ public: char **_retval); NS_IMETHOD NewChannel(const char* verb, nsIURI* url, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **_retval); diff --git a/mozilla/netwerk/protocol/http/src/nsHTTPRequest.cpp b/mozilla/netwerk/protocol/http/src/nsHTTPRequest.cpp index 7fb4aab9621..d04caaa8103 100644 --- a/mozilla/netwerk/protocol/http/src/nsHTTPRequest.cpp +++ b/mozilla/netwerk/protocol/http/src/nsHTTPRequest.cpp @@ -458,6 +458,8 @@ nsHTTPRequest::OnStopRequest(nsIChannel* channel, nsISupports* i_pContext, if (consumer) { consumer->OnStopRequest(m_pConnection, consumerContext, iStatus, i_pMsg); } + // Notify the channel that the request has finished + m_pConnection->ResponseCompleted(nsnull, iStatus); rv = iStatus; } diff --git a/mozilla/netwerk/protocol/http/src/nsHTTPResponseListener.cpp b/mozilla/netwerk/protocol/http/src/nsHTTPResponseListener.cpp index 254bdec5fd6..0aa48236c8c 100644 --- a/mozilla/netwerk/protocol/http/src/nsHTTPResponseListener.cpp +++ b/mozilla/netwerk/protocol/http/src/nsHTTPResponseListener.cpp @@ -153,7 +153,16 @@ nsHTTPResponseListener::OnDataAvailable(nsIChannel* channel, } } - if (NS_SUCCEEDED(rv) && m_pConsumer) { + // + // Abort the connection if the consumer has been released. This will + // happen if a redirect has been processed... + // + if (!m_pConsumer) { + // XXX: What should the return code be? + rv = NS_BINDING_ABORTED; + } + + if (NS_SUCCEEDED(rv)) { if (i_Length) { PR_LOG(gHTTPLog, PR_LOG_DEBUG, ("\tOnDataAvailable [this=%x]. Calling consumer " @@ -223,7 +232,7 @@ nsHTTPResponseListener::OnStopRequest(nsIChannel* channel, // Notify the HTTPChannel that the response has completed... NS_ASSERTION(m_pConnection, "HTTPChannel is null."); if (m_pConnection) { - m_pConnection->ResponseCompleted(channel); + m_pConnection->ResponseCompleted(channel, i_Status); } // The Consumer is no longer needed... @@ -780,21 +789,27 @@ nsresult nsHTTPResponseListener::ProcessRedirection(PRInt32 aStatusCode) // Expanded inline to avoid linking with neckoutils.... (temporary) rv = NS_OpenURI(m_pConsumer, m_ResponseContext, newURL); #else - nsIChannel* channel; - rv = serv->NewChannelFromURI("load", newURL, nsnull, &channel); + nsCOMPtr channel; + nsCOMPtr group; + + (void) m_pConnection->GetLoadGroup(getter_AddRefs(group)); + rv = serv->NewChannelFromURI("load", newURL, group, nsnull, + getter_AddRefs(channel)); if (NS_SUCCEEDED(rv)) { - nsCOMPtr group; - rv = m_pConnection->GetLoadGroup(getter_AddRefs(group)); - if (group) { + PRUint32 loadAttributes; + + // Copy the load attributes into the new channel... + m_pConnection->GetLoadAttributes(&loadAttributes); + channel->SetLoadAttributes(loadAttributes); +/// if (group) { // Add the new channel first. That way we don't run the risk // of emptying the group and firing off the OnEndDocumentLoad // notification. - (void)group->AddChannel(channel, m_ResponseContext); - (void)group->RemoveChannel(m_pConnection, m_ResponseContext, - aStatusCode, nsnull); // XXX error message - } +/// (void)group->AddChannel(channel, m_ResponseContext); +/// (void)group->RemoveChannel(m_pConnection, m_ResponseContext, +/// aStatusCode, nsnull); // XXX error message +/// } rv = channel->AsyncRead(0, -1, m_ResponseContext, m_pConsumer); - NS_RELEASE(channel); } #endif if (NS_SUCCEEDED(rv)) { diff --git a/mozilla/netwerk/protocol/resource/src/nsResourceProtocolHandler.cpp b/mozilla/netwerk/protocol/resource/src/nsResourceProtocolHandler.cpp index c939c5bb265..802c1e2a859 100644 --- a/mozilla/netwerk/protocol/resource/src/nsResourceProtocolHandler.cpp +++ b/mozilla/netwerk/protocol/resource/src/nsResourceProtocolHandler.cpp @@ -293,6 +293,7 @@ MangleResourceIntoFileURL(const char* aResourceFileName) NS_IMETHODIMP nsResourceProtocolHandler::NewChannel(const char* verb, nsIURI* uri, + nsILoadGroup *aGroup, nsIEventSinkGetter* eventSinkGetter, nsIChannel* *result) { @@ -316,7 +317,8 @@ nsResourceProtocolHandler::NewChannel(const char* verb, nsIURI* uri, return NS_ERROR_OUT_OF_MEMORY; nsIChannel* channel; - rv = serv->NewChannel(verb, filePath, uri, eventSinkGetter, &channel); + rv = serv->NewChannel(verb, filePath, uri, aGroup, eventSinkGetter, + &channel); nsCRT::free(filePath); if (NS_FAILED(rv)) return rv; diff --git a/mozilla/netwerk/protocol/resource/src/nsResourceProtocolHandler.h b/mozilla/netwerk/protocol/resource/src/nsResourceProtocolHandler.h index 850504f9490..c1c63a2546a 100644 --- a/mozilla/netwerk/protocol/resource/src/nsResourceProtocolHandler.h +++ b/mozilla/netwerk/protocol/resource/src/nsResourceProtocolHandler.h @@ -42,6 +42,7 @@ public: NS_IMETHOD NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval); NS_IMETHOD NewChannel(const char* verb, nsIURI* url, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **_retval); diff --git a/mozilla/netwerk/test/TestProtocols.cpp b/mozilla/netwerk/test/TestProtocols.cpp index 639e973d019..7c7a08ca42b 100644 --- a/mozilla/netwerk/test/TestProtocols.cpp +++ b/mozilla/netwerk/test/TestProtocols.cpp @@ -449,7 +449,7 @@ nsresult StartLoadingURL(const char* aUrlString) } // Async reading thru the calls of the event sink interface - rv = pService->NewChannelFromURI("load", pURL, pMySink, + rv = pService->NewChannelFromURI("load", pURL, nsnull, pMySink, getter_AddRefs(pChannel)); if (NS_FAILED(rv)) { printf("ERROR: NewChannelFromURI failed for %s\n", aUrlString); diff --git a/mozilla/netwerk/test/TestSocketTransport.cpp b/mozilla/netwerk/test/TestSocketTransport.cpp index 0338b68e004..73456ec3b69 100644 --- a/mozilla/netwerk/test/TestSocketTransport.cpp +++ b/mozilla/netwerk/test/TestSocketTransport.cpp @@ -55,7 +55,7 @@ static PRTime gElapsedTime; static int gKeepRunning = 1; static nsIEventQueue* gEventQ = nsnull; -#define NUM_TEST_THREADS 5 +#define NUM_TEST_THREADS 1 static TestConnection* gConnections[NUM_TEST_THREADS]; static nsIThread* gThreads[NUM_TEST_THREADS]; diff --git a/mozilla/netwerk/util/public/nsNeckoUtil.h b/mozilla/netwerk/util/public/nsNeckoUtil.h index f95bd1be099..6b3bb897558 100644 --- a/mozilla/netwerk/util/public/nsNeckoUtil.h +++ b/mozilla/netwerk/util/public/nsNeckoUtil.h @@ -44,13 +44,14 @@ extern nsresult NS_NewURI(nsIURI* *result, const nsString& spec, nsIURI* baseURI = nsnull); extern nsresult -NS_OpenURI(nsIChannel* *result, nsIURI* uri); +NS_OpenURI(nsIChannel* *result, nsIURI* uri, nsILoadGroup *aGroup); extern nsresult NS_OpenURI(nsIInputStream* *result, nsIURI* uri); extern nsresult -NS_OpenURI(nsIStreamListener* aConsumer, nsISupports* context, nsIURI* uri); +NS_OpenURI(nsIStreamListener* aConsumer, nsISupports* context, nsIURI* uri, + nsILoadGroup *aGroup); extern nsresult NS_MakeAbsoluteURI(const char* spec, nsIURI* baseURI, char* *result); diff --git a/mozilla/netwerk/util/src/nsNeckoUtil.cpp b/mozilla/netwerk/util/src/nsNeckoUtil.cpp index a0d16bd49fb..0885511d8e6 100644 --- a/mozilla/netwerk/util/src/nsNeckoUtil.cpp +++ b/mozilla/netwerk/util/src/nsNeckoUtil.cpp @@ -52,14 +52,14 @@ NS_NewURI(nsIURI* *result, const nsString& spec, nsIURI* baseURI) } NECKO_EXPORT(nsresult) -NS_OpenURI(nsIChannel* *result, nsIURI* uri) +NS_OpenURI(nsIChannel* *result, nsIURI* uri, nsILoadGroup *aGroup) { nsresult rv; NS_WITH_SERVICE(nsIIOService, serv, kIOServiceCID, &rv); if (NS_FAILED(rv)) return rv; nsIChannel* channel; - rv = serv->NewChannelFromURI("load", uri, nsnull, &channel); + rv = serv->NewChannelFromURI("load", uri, aGroup, nsnull, &channel); if (NS_FAILED(rv)) return rv; *result = channel; @@ -72,7 +72,7 @@ NS_OpenURI(nsIInputStream* *result, nsIURI* uri) nsresult rv; nsIChannel* channel; - rv = NS_OpenURI(&channel, uri); + rv = NS_OpenURI(&channel, uri, nsnull); if (NS_FAILED(rv)) return rv; nsIInputStream* inStr; @@ -85,12 +85,13 @@ NS_OpenURI(nsIInputStream* *result, nsIURI* uri) } NECKO_EXPORT(nsresult) -NS_OpenURI(nsIStreamListener* aConsumer, nsISupports* context, nsIURI* uri) +NS_OpenURI(nsIStreamListener* aConsumer, nsISupports* context, nsIURI* uri, + nsILoadGroup *aGroup) { nsresult rv; nsIChannel* channel; - rv = NS_OpenURI(&channel, uri); + rv = NS_OpenURI(&channel, uri, aGroup); if (NS_FAILED(rv)) return rv; rv = channel->AsyncRead(0, -1, context, aConsumer); diff --git a/mozilla/netwerk/util/src/nsNetStreamLoader.cpp b/mozilla/netwerk/util/src/nsNetStreamLoader.cpp index 17338edbd9b..162bb43e654 100644 --- a/mozilla/netwerk/util/src/nsNetStreamLoader.cpp +++ b/mozilla/netwerk/util/src/nsNetStreamLoader.cpp @@ -62,7 +62,7 @@ protected: nsStreamCompleteFunc mFunc; void* mRef; nsString* mData; - nsCOMPtr mLoadGroup; +/// nsCOMPtr mLoadGroup; }; @@ -74,12 +74,12 @@ nsUnicharStreamLoader::nsUnicharStreamLoader(nsIURI* aURL, nsILoadGroup* aLoadGr mFunc = aFunc; mRef = aRef; mData = new nsString(); - mLoadGroup = aLoadGroup; +/// mLoadGroup = aLoadGroup; // XXX This is vile vile vile!!! if (aURL) { nsCOMPtr channel; - *rv = NS_OpenURI(getter_AddRefs(channel), aURL); + *rv = NS_OpenURI(getter_AddRefs(channel), aURL, aLoadGroup); if (NS_FAILED(*rv) && (nsnull != mFunc)) { // Thou shalt not call out of scope whilst ones refcnt is zero mRefCnt = 999; @@ -88,8 +88,8 @@ nsUnicharStreamLoader::nsUnicharStreamLoader(nsIURI* aURL, nsILoadGroup* aLoadGr return; } - *rv = mLoadGroup->AddChannel(channel, nsnull); - if (NS_FAILED(*rv)) return; +/// *rv = mLoadGroup->AddChannel(channel, nsnull); +/// if (NS_FAILED(*rv)) return; *rv = channel->AsyncRead(0, -1, nsnull, this); if (NS_FAILED(*rv)) return; @@ -159,7 +159,8 @@ nsUnicharStreamLoader::OnStopRequest(nsIChannel* channel, nsISupports *ctxt, nsresult status, const PRUnichar *errorMsg) { (*mFunc)(this, *mData, mRef, status); - return mLoadGroup->RemoveChannel(channel, ctxt, status, errorMsg); +/// return mLoadGroup->RemoveChannel(channel, ctxt, status, errorMsg); + return NS_OK; } #define BUF_SIZE 1024 diff --git a/mozilla/rdf/base/src/nsRDFXMLDataSource.cpp b/mozilla/rdf/base/src/nsRDFXMLDataSource.cpp index 26f1b6c97d7..2078899bfad 100644 --- a/mozilla/rdf/base/src/nsRDFXMLDataSource.cpp +++ b/mozilla/rdf/base/src/nsRDFXMLDataSource.cpp @@ -557,7 +557,8 @@ rdf_BlockingParse(nsIURI* aURL, nsIStreamListener* aConsumer) #ifdef NECKO nsCOMPtr channel; - rv = NS_OpenURI(getter_AddRefs(channel), aURL); + // Null LoadGroup ? + rv = NS_OpenURI(getter_AddRefs(channel), aURL, nsnull); if (NS_FAILED(rv)) { NS_ERROR("unable to open channel"); @@ -933,7 +934,8 @@ RDFXMLDataSourceImpl::Refresh(PRBool aBlocking) } else { #ifdef NECKO - rv = NS_OpenURI(lsnr, nsnull, mURL); + // Null LoadGroup ? + rv = NS_OpenURI(lsnr, nsnull, mURL, nsnull); #else rv = NS_OpenURL(mURL, lsnr); #endif diff --git a/mozilla/rdf/chrome/src/nsChromeProtocolHandler.cpp b/mozilla/rdf/chrome/src/nsChromeProtocolHandler.cpp index 033bec62eaf..943a41890a6 100644 --- a/mozilla/rdf/chrome/src/nsChromeProtocolHandler.cpp +++ b/mozilla/rdf/chrome/src/nsChromeProtocolHandler.cpp @@ -140,6 +140,7 @@ nsChromeProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, NS_IMETHODIMP nsChromeProtocolHandler::NewChannel(const char* verb, nsIURI* uri, + nsILoadGroup *aGroup, nsIEventSinkGetter* eventSinkGetter, nsIChannel* *result) { @@ -171,7 +172,8 @@ nsChromeProtocolHandler::NewChannel(const char* verb, nsIURI* uri, return rv; } - rv = serv->NewChannelFromURI(verb, chromeURI, eventSinkGetter, result); + rv = serv->NewChannelFromURI(verb, chromeURI, aGroup, eventSinkGetter, + result); NS_RELEASE(chromeURI); return NS_OK; } diff --git a/mozilla/rdf/chrome/src/nsChromeProtocolHandler.h b/mozilla/rdf/chrome/src/nsChromeProtocolHandler.h index e79061a89f4..e283dde3d4d 100644 --- a/mozilla/rdf/chrome/src/nsChromeProtocolHandler.h +++ b/mozilla/rdf/chrome/src/nsChromeProtocolHandler.h @@ -42,6 +42,7 @@ public: NS_IMETHOD NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval); NS_IMETHOD NewChannel(const char* verb, nsIURI* url, + nsILoadGroup *aGroup, nsIEventSinkGetter *eventSinkGetter, nsIChannel **_retval); diff --git a/mozilla/rdf/datasource/src/nsFTPDataSource.cpp b/mozilla/rdf/datasource/src/nsFTPDataSource.cpp index a685753b538..055e08a55c2 100644 --- a/mozilla/rdf/datasource/src/nsFTPDataSource.cpp +++ b/mozilla/rdf/datasource/src/nsFTPDataSource.cpp @@ -833,7 +833,7 @@ FTPDataSource::GetFTPListing(nsIRDFResource *source, nsISimpleEnumerator** aResu FTPDataSourceCallback *callback = new FTPDataSourceCallback(mInner, source); if (nsnull != callback) { - rv = NS_OpenURI(NS_STATIC_CAST(nsIStreamListener *, callback), nsnull, url); + rv = NS_OpenURI(NS_STATIC_CAST(nsIStreamListener *, callback), nsnull, url, nsnull); } NS_RELEASE(url); } diff --git a/mozilla/rdf/datasource/src/nsSearchDataSource.cpp b/mozilla/rdf/datasource/src/nsSearchDataSource.cpp index 119b05301d3..e6cf4fffe7d 100755 --- a/mozilla/rdf/datasource/src/nsSearchDataSource.cpp +++ b/mozilla/rdf/datasource/src/nsSearchDataSource.cpp @@ -1097,7 +1097,8 @@ SearchDataSource::DoSearch(nsIRDFResource *source, nsIRDFResource *engine, nsStr if (method.EqualsIgnoreCase("post")) { nsCOMPtr channel; - if (NS_SUCCEEDED(rv = NS_OpenURI(getter_AddRefs(channel), url))) + // XXX: Null LoadGroup ? + if (NS_SUCCEEDED(rv = NS_OpenURI(getter_AddRefs(channel), url, nsnull))) { nsCOMPtr httpChannel = do_QueryInterface(channel); if (httpChannel) @@ -1132,7 +1133,8 @@ SearchDataSource::DoSearch(nsIRDFResource *source, nsIRDFResource *engine, nsStr } else if (method.EqualsIgnoreCase("get")) { - rv = NS_OpenURI(NS_STATIC_CAST(nsIStreamListener *, callback), nsnull, url); + // XXX: Null LoadGroup? + rv = NS_OpenURI(NS_STATIC_CAST(nsIStreamListener *, callback), nsnull, url, nsnull); } } } diff --git a/mozilla/uriloader/base/nsDocLoader.cpp b/mozilla/uriloader/base/nsDocLoader.cpp index 67800509716..fcede741203 100644 --- a/mozilla/uriloader/base/nsDocLoader.cpp +++ b/mozilla/uriloader/base/nsDocLoader.cpp @@ -104,6 +104,37 @@ static NS_DEFINE_CID(kGenericFactoryCID, NS_GENERICFACTORY_CID); /* Forward declarations.... */ class nsDocLoaderImpl; + +#ifdef NECKO +class nsChannelListener : public nsIStreamListener +{ +public: + nsChannelListener(); + + nsresult Init(nsDocLoaderImpl *aDocLoader, nsIStreamListener *aListener); + + NS_DECL_ISUPPORTS + + // nsIStreamListener methods: + NS_IMETHOD OnStartRequest(nsIChannel* channel, nsISupports *ctxt); + NS_IMETHOD OnStopRequest(nsIChannel* channel, nsISupports *ctxt, nsresult status, + const PRUnichar *errorMsg); + + NS_IMETHOD OnDataAvailable(nsIChannel* channel, nsISupports *ctxt, nsIInputStream *inStr, + PRUint32 sourceOffset, PRUint32 count); + +protected: + virtual ~nsChannelListener(); + + nsDocLoaderImpl *mDocLoader; + nsCOMPtr mNextListener; +}; + +#endif // NECKO + + + + /* * The nsDocumentBindInfo contains the state required when a single document * is being loaded... Each instance remains alive until its target URL has @@ -137,6 +168,8 @@ public: nsresult Bind(nsIURI* aURL, nsIStreamListener* aListener, nsIInputStream *postDataStream = nsnull); #ifdef NECKO + nsresult Bind(nsIStreamListener *aListener); + // nsIStreamObserver methods: NS_IMETHOD OnStartRequest(nsIChannel* channel, nsISupports *ctxt); NS_IMETHOD OnStopRequest(nsIChannel* channel, nsISupports *ctxt, nsresult status, @@ -193,7 +226,9 @@ protected: #ifndef NECKO class nsDocLoaderImpl : public nsIDocumentLoader, public nsILoadGroup #else -class nsDocLoaderImpl : public nsIDocumentLoader, public nsIStreamObserver +class nsDocLoaderImpl : public nsIDocumentLoader, + public nsIStreamObserver, + public nsILoadGroupListenerFactory #endif // NECKO { public: @@ -264,6 +299,12 @@ public: NS_IMETHOD AddChildGroup(nsILoadGroup* aGroup); NS_IMETHOD RemoveChildGroup(nsILoadGroup* aGroup); +#ifdef NECKO + // nsILoadGroupListenerFactory methods... + NS_IMETHOD CreateLoadGroupListener(nsIStreamListener *aListener, + nsIStreamListener **aResult); +#endif + // Implementation specific methods... void FireOnStartDocumentLoad(nsIDocumentLoader* aLoadInitiator, nsIURI* aURL, @@ -440,6 +481,10 @@ nsDocLoaderImpl::Init() if (NS_FAILED(rv)) return rv; PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, ("DocLoader:%p: load group %x.\n", this, mLoadGroup)); + + rv = mLoadGroup->SetGroupListenerFactory( (nsILoadGroupListenerFactory*)this); + if (NS_FAILED(rv)) return rv; + #else rv = NS_NewISupportsArray(getter_AddRefs(m_LoadingDocsList)); if (NS_FAILED(rv)) return rv; @@ -498,6 +543,11 @@ nsDocLoaderImpl::QueryInterface(REFNSIID aIID, void** aInstancePtr) return NS_OK; } #else + if (aIID.Equals(nsCOMTypeInfo::GetIID())) { + *aInstancePtr = (void*)(nsILoadGroupListenerFactory*)this; + NS_ADDREF_THIS(); + return NS_OK; + } if (aIID.Equals(kIStreamObserverIID)) { *aInstancePtr = (void*)(nsIStreamObserver*)this; NS_ADDREF_THIS(); @@ -1018,7 +1068,8 @@ nsDocLoaderImpl::OnStartRequest(nsIChannel *channel, nsISupports *ctxt) nsCOMPtr uri; rv = channel->GetURI(getter_AddRefs(uri)); if (NS_FAILED(rv)) return rv; -// FireOnStartDocumentLoad(this, uri, "load"); // XXX fix command + + FireOnStartDocumentLoad(this, uri, "load"); // XXX fix command return NS_OK; } @@ -1026,6 +1077,9 @@ NS_IMETHODIMP nsDocLoaderImpl::OnStopRequest(nsIChannel *channel, nsISupports *ctxt, nsresult status, const PRUnichar *errorMsg) { + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: Is now idle...\n", this)); + // called when the group becomes empty FireOnEndDocumentLoad(this, status); return NS_OK; @@ -1060,6 +1114,26 @@ nsDocLoaderImpl::RemoveChildGroup(nsILoadGroup* aGroup) } +#ifdef NECKO +NS_IMETHODIMP +nsDocLoaderImpl::CreateLoadGroupListener(nsIStreamListener *aListener, + nsIStreamListener **aResult) +{ + nsChannelListener *newListener; + + NS_NEWXPCOM(newListener, nsChannelListener); + if (nsnull == newListener) { + return NS_ERROR_OUT_OF_MEMORY; + } + NS_ADDREF(newListener); + newListener->Init(this, aListener); + + *aResult = newListener; + + return NS_OK; +} +#endif + void nsDocLoaderImpl::FireOnStartDocumentLoad(nsIDocumentLoader* aLoadInitiator, nsIURI* aURL, const char* aCommand) @@ -1067,6 +1141,22 @@ void nsDocLoaderImpl::FireOnStartDocumentLoad(nsIDocumentLoader* aLoadInitiator, PRInt32 count = mDocObservers.Count(); PRInt32 index; +#if defined(DEBUG) +#ifdef NECKO + char *buffer; +#else + const char *buffer; +#endif + + aURL->GetSpec(&buffer); + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: Firing OnStartDocumentLoad(...) called for [DocLoader:%p] %s.\n", + this, aLoadInitiator, buffer)); +#ifdef NECKO + nsCRT::free(buffer); +#endif +#endif /* DEBUG */ + /* * First notify any observers that the URL load has begun... */ @@ -1087,22 +1177,20 @@ void nsDocLoaderImpl::FireOnEndDocumentLoad(nsIDocumentLoader* aLoadInitiator, nsresult aStatus) { - PRInt32 count = mDocObservers.Count(); - PRInt32 index; - #if defined(DEBUG) nsCOMPtr uri; nsresult rv = NS_OK; - if (mDocumentChannel) - rv = mDocumentChannel->GetURI(getter_AddRefs(uri)); + nsDocLoaderImpl* loader = (nsDocLoaderImpl*)aLoadInitiator; + if (loader->mDocumentChannel) + rv = loader->mDocumentChannel->GetURI(getter_AddRefs(uri)); if (NS_SUCCEEDED(rv)) { char* buffer = nsCRT::strdup("?"); if (uri) rv = uri->GetSpec(&buffer); if (NS_SUCCEEDED(rv)) { PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: Firing OnEndDocumentLoad(...) called for %s\n", - this, buffer)); + ("DocLoader:%p: Firing OnEndDocumentLoad(...) called for [DocLoader:%p] %s\n", + this, aLoadInitiator, buffer)); nsCRT::free(buffer); } } @@ -1111,6 +1199,9 @@ void nsDocLoaderImpl::FireOnEndDocumentLoad(nsIDocumentLoader* aLoadInitiator, /* * First notify any observers that the document load has finished... */ + PRInt32 count = mDocObservers.Count(); + PRInt32 index; + for (index = 0; index < count; index++) { nsIDocumentLoaderObserver* observer = (nsIDocumentLoaderObserver*) mDocObservers.ElementAt(index); @@ -1122,13 +1213,22 @@ void nsDocLoaderImpl::FireOnEndDocumentLoad(nsIDocumentLoader* aLoadInitiator, #endif aStatus, observer); } +#ifdef NECKO + /* + * Next notify the parent... + */ + if (nsnull != mParent) { + mParent->FireOnEndDocumentLoad(aLoadInitiator, aStatus); + } +#else // !NECKO /* * Finally notify the parent... */ if (nsnull != mParent) { mParent->ChildDocLoaderFiredEndDocumentLoad(this, aLoadInitiator, aStatus); } +#endif // !NECKO } void @@ -1357,13 +1457,14 @@ nsresult nsDocLoaderImpl::LoadURLComplete(nsIURI* aURL, nsISupports* aBindInfo, * Fire the OnEndURLLoad notification to any observers... */ #ifdef NECKO - FireOnEndURLLoad((nsIDocumentLoader *) this, channel, aStatus); +/// FireOnEndURLLoad((nsIDocumentLoader *) this, channel, aStatus); #else FireOnEndURLLoad((nsIDocumentLoader *) this, aURL, aStatus); #endif #ifdef NECKO - return GetLoadGroup()->RemoveChannel(channel, ctxt, aStatus, aMsg); +/// return GetLoadGroup()->RemoveChannel(channel, ctxt, aStatus, aMsg); + return NS_OK; #else // !NECKO /* * Fire the OnEndDocumentLoad notification to any observers... @@ -1610,11 +1711,12 @@ nsresult nsDocumentBindInfo::Bind(const nsString& aURLSpec, */ #ifndef NECKO m_DocLoader->SetDocumentUrl(url); -#endif + /* * Fire the OnStarDocumentLoad interfaces */ m_DocLoader->FireOnStartDocumentLoad((nsIDocumentLoader *) m_DocLoader, url, m_Command); +#endif /* * Initiate the network request... @@ -1635,22 +1737,6 @@ nsresult nsDocumentBindInfo::Bind(nsIURI* aURL, nsIStreamListener* aListener, ns NS_ADDREF(m_Url); #endif -#if defined(DEBUG) -#ifdef NECKO - char *buffer; -#else - const char *buffer; -#endif - - aURL->GetSpec(&buffer); - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocumentBindInfo:%p: OnStartDocumentLoad(...) called for %s.\n", - this, buffer)); -#ifdef NECKO - nsCRT::free(buffer); -#endif -#endif /* DEBUG */ - // m_DocLoader->FireOnStartDocumentLoad(aURL, m_Command); /* Set up the stream listener (if provided)... */ @@ -1676,7 +1762,7 @@ nsresult nsDocumentBindInfo::Bind(nsIURI* aURL, nsIStreamListener* aListener, ns } nsCOMPtr channel; - rv = NS_OpenURI(getter_AddRefs(channel), aURL); + rv = NS_OpenURI(getter_AddRefs(channel), aURL, loadGroup); if (NS_FAILED(rv)) return rv; if (postDataStream) @@ -1690,8 +1776,8 @@ nsresult nsDocumentBindInfo::Bind(nsIURI* aURL, nsIStreamListener* aListener, ns } m_DocLoader->SetDocumentChannel(channel); - rv = loadGroup->AddChannel(channel, nsnull); - if (NS_FAILED(rv)) return rv; +/// rv = loadGroup->AddChannel(channel, nsnull); +/// if (NS_FAILED(rv)) return rv; rv = channel->AsyncRead(0, -1, nsnull, this); if (NS_FAILED(rv)) return rv; #endif // NECKO @@ -1699,6 +1785,17 @@ nsresult nsDocumentBindInfo::Bind(nsIURI* aURL, nsIStreamListener* aListener, ns return rv; } +#ifdef NECKO +nsresult nsDocumentBindInfo::Bind(nsIStreamListener *aListener) +{ + m_NextStream = aListener; + NS_IF_ADDREF(m_NextStream); + + return NS_OK; +} + +#endif // NECKO + #ifndef NECKO nsresult nsDocumentBindInfo::Stop(void) { @@ -1977,7 +2074,7 @@ nsDocumentBindInfo::OnStartRequest(nsIURI* aURL, const char *aContentType) m_Container->GetContentViewer(&viewer); } #ifdef NECKO - m_DocLoader->FireOnStartURLLoad((nsIDocumentLoader *)m_DocLoader, channel, viewer); +/// m_DocLoader->FireOnStartURLLoad((nsIDocumentLoader *)m_DocLoader, channel, viewer); #else m_DocLoader->FireOnStartURLLoad((nsIDocumentLoader *)m_DocLoader, m_Url, aContentType, viewer); #endif @@ -2204,6 +2301,89 @@ nsDocumentBindInfo::CancelRefreshURLTimers(void) return PR_FALSE; } + + +#ifdef NECKO + +NS_IMPL_ISUPPORTS(nsChannelListener, nsCOMTypeInfo::GetIID()); + +nsChannelListener::nsChannelListener() +{ + NS_INIT_REFCNT(); + + mDocLoader = nsnull; +} + +nsresult nsChannelListener::Init(nsDocLoaderImpl *aDocLoader, + nsIStreamListener *aListener) +{ + mDocLoader = aDocLoader; + NS_ADDREF(mDocLoader); + + mNextListener = aListener; + + return NS_OK; +} + +nsChannelListener::~nsChannelListener() +{ + NS_RELEASE(mDocLoader); + mNextListener = null_nsCOMPtr(); +} + +NS_IMETHODIMP +nsChannelListener::OnStartRequest(nsIChannel *aChannel, nsISupports *aContext) +{ + nsresult rv; + nsCOMPtr container; + nsCOMPtr viewer; + + // Pass the notification to the next listener... + rv = mNextListener->OnStartRequest(aChannel, aContext); + + // + // Notify the document loader... + mDocLoader->GetContainer(getter_AddRefs(container)); + if (container) { + container->GetContentViewer(getter_AddRefs(viewer)); + } + + mDocLoader->FireOnStartURLLoad((nsIDocumentLoader *)mDocLoader, + aChannel, + viewer); + + return rv; +} + +NS_IMETHODIMP +nsChannelListener::OnStopRequest(nsIChannel *aChannel, nsISupports *aContext, + nsresult aStatus, const PRUnichar *aMsg) +{ + nsresult rv; + + rv = mNextListener->OnStopRequest(aChannel, aContext, aStatus, aMsg); + + mDocLoader->FireOnEndURLLoad((nsIDocumentLoader *) mDocLoader, + aChannel, + aStatus); + + return rv; +} + +NS_IMETHODIMP +nsChannelListener::OnDataAvailable(nsIChannel *aChannel, nsISupports *aContext, + nsIInputStream *aInStream, PRUint32 aOffset, + PRUint32 aCount) +{ + return mNextListener->OnDataAvailable(aChannel, aContext, aInStream, + aOffset, aCount); +} + + +#endif // NECKO + + + /******************************************* * nsDocLoaderServiceFactory *******************************************/ diff --git a/mozilla/webshell/src/nsDocLoader.cpp b/mozilla/webshell/src/nsDocLoader.cpp index 67800509716..fcede741203 100644 --- a/mozilla/webshell/src/nsDocLoader.cpp +++ b/mozilla/webshell/src/nsDocLoader.cpp @@ -104,6 +104,37 @@ static NS_DEFINE_CID(kGenericFactoryCID, NS_GENERICFACTORY_CID); /* Forward declarations.... */ class nsDocLoaderImpl; + +#ifdef NECKO +class nsChannelListener : public nsIStreamListener +{ +public: + nsChannelListener(); + + nsresult Init(nsDocLoaderImpl *aDocLoader, nsIStreamListener *aListener); + + NS_DECL_ISUPPORTS + + // nsIStreamListener methods: + NS_IMETHOD OnStartRequest(nsIChannel* channel, nsISupports *ctxt); + NS_IMETHOD OnStopRequest(nsIChannel* channel, nsISupports *ctxt, nsresult status, + const PRUnichar *errorMsg); + + NS_IMETHOD OnDataAvailable(nsIChannel* channel, nsISupports *ctxt, nsIInputStream *inStr, + PRUint32 sourceOffset, PRUint32 count); + +protected: + virtual ~nsChannelListener(); + + nsDocLoaderImpl *mDocLoader; + nsCOMPtr mNextListener; +}; + +#endif // NECKO + + + + /* * The nsDocumentBindInfo contains the state required when a single document * is being loaded... Each instance remains alive until its target URL has @@ -137,6 +168,8 @@ public: nsresult Bind(nsIURI* aURL, nsIStreamListener* aListener, nsIInputStream *postDataStream = nsnull); #ifdef NECKO + nsresult Bind(nsIStreamListener *aListener); + // nsIStreamObserver methods: NS_IMETHOD OnStartRequest(nsIChannel* channel, nsISupports *ctxt); NS_IMETHOD OnStopRequest(nsIChannel* channel, nsISupports *ctxt, nsresult status, @@ -193,7 +226,9 @@ protected: #ifndef NECKO class nsDocLoaderImpl : public nsIDocumentLoader, public nsILoadGroup #else -class nsDocLoaderImpl : public nsIDocumentLoader, public nsIStreamObserver +class nsDocLoaderImpl : public nsIDocumentLoader, + public nsIStreamObserver, + public nsILoadGroupListenerFactory #endif // NECKO { public: @@ -264,6 +299,12 @@ public: NS_IMETHOD AddChildGroup(nsILoadGroup* aGroup); NS_IMETHOD RemoveChildGroup(nsILoadGroup* aGroup); +#ifdef NECKO + // nsILoadGroupListenerFactory methods... + NS_IMETHOD CreateLoadGroupListener(nsIStreamListener *aListener, + nsIStreamListener **aResult); +#endif + // Implementation specific methods... void FireOnStartDocumentLoad(nsIDocumentLoader* aLoadInitiator, nsIURI* aURL, @@ -440,6 +481,10 @@ nsDocLoaderImpl::Init() if (NS_FAILED(rv)) return rv; PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, ("DocLoader:%p: load group %x.\n", this, mLoadGroup)); + + rv = mLoadGroup->SetGroupListenerFactory( (nsILoadGroupListenerFactory*)this); + if (NS_FAILED(rv)) return rv; + #else rv = NS_NewISupportsArray(getter_AddRefs(m_LoadingDocsList)); if (NS_FAILED(rv)) return rv; @@ -498,6 +543,11 @@ nsDocLoaderImpl::QueryInterface(REFNSIID aIID, void** aInstancePtr) return NS_OK; } #else + if (aIID.Equals(nsCOMTypeInfo::GetIID())) { + *aInstancePtr = (void*)(nsILoadGroupListenerFactory*)this; + NS_ADDREF_THIS(); + return NS_OK; + } if (aIID.Equals(kIStreamObserverIID)) { *aInstancePtr = (void*)(nsIStreamObserver*)this; NS_ADDREF_THIS(); @@ -1018,7 +1068,8 @@ nsDocLoaderImpl::OnStartRequest(nsIChannel *channel, nsISupports *ctxt) nsCOMPtr uri; rv = channel->GetURI(getter_AddRefs(uri)); if (NS_FAILED(rv)) return rv; -// FireOnStartDocumentLoad(this, uri, "load"); // XXX fix command + + FireOnStartDocumentLoad(this, uri, "load"); // XXX fix command return NS_OK; } @@ -1026,6 +1077,9 @@ NS_IMETHODIMP nsDocLoaderImpl::OnStopRequest(nsIChannel *channel, nsISupports *ctxt, nsresult status, const PRUnichar *errorMsg) { + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: Is now idle...\n", this)); + // called when the group becomes empty FireOnEndDocumentLoad(this, status); return NS_OK; @@ -1060,6 +1114,26 @@ nsDocLoaderImpl::RemoveChildGroup(nsILoadGroup* aGroup) } +#ifdef NECKO +NS_IMETHODIMP +nsDocLoaderImpl::CreateLoadGroupListener(nsIStreamListener *aListener, + nsIStreamListener **aResult) +{ + nsChannelListener *newListener; + + NS_NEWXPCOM(newListener, nsChannelListener); + if (nsnull == newListener) { + return NS_ERROR_OUT_OF_MEMORY; + } + NS_ADDREF(newListener); + newListener->Init(this, aListener); + + *aResult = newListener; + + return NS_OK; +} +#endif + void nsDocLoaderImpl::FireOnStartDocumentLoad(nsIDocumentLoader* aLoadInitiator, nsIURI* aURL, const char* aCommand) @@ -1067,6 +1141,22 @@ void nsDocLoaderImpl::FireOnStartDocumentLoad(nsIDocumentLoader* aLoadInitiator, PRInt32 count = mDocObservers.Count(); PRInt32 index; +#if defined(DEBUG) +#ifdef NECKO + char *buffer; +#else + const char *buffer; +#endif + + aURL->GetSpec(&buffer); + PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, + ("DocLoader:%p: Firing OnStartDocumentLoad(...) called for [DocLoader:%p] %s.\n", + this, aLoadInitiator, buffer)); +#ifdef NECKO + nsCRT::free(buffer); +#endif +#endif /* DEBUG */ + /* * First notify any observers that the URL load has begun... */ @@ -1087,22 +1177,20 @@ void nsDocLoaderImpl::FireOnEndDocumentLoad(nsIDocumentLoader* aLoadInitiator, nsresult aStatus) { - PRInt32 count = mDocObservers.Count(); - PRInt32 index; - #if defined(DEBUG) nsCOMPtr uri; nsresult rv = NS_OK; - if (mDocumentChannel) - rv = mDocumentChannel->GetURI(getter_AddRefs(uri)); + nsDocLoaderImpl* loader = (nsDocLoaderImpl*)aLoadInitiator; + if (loader->mDocumentChannel) + rv = loader->mDocumentChannel->GetURI(getter_AddRefs(uri)); if (NS_SUCCEEDED(rv)) { char* buffer = nsCRT::strdup("?"); if (uri) rv = uri->GetSpec(&buffer); if (NS_SUCCEEDED(rv)) { PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocLoader:%p: Firing OnEndDocumentLoad(...) called for %s\n", - this, buffer)); + ("DocLoader:%p: Firing OnEndDocumentLoad(...) called for [DocLoader:%p] %s\n", + this, aLoadInitiator, buffer)); nsCRT::free(buffer); } } @@ -1111,6 +1199,9 @@ void nsDocLoaderImpl::FireOnEndDocumentLoad(nsIDocumentLoader* aLoadInitiator, /* * First notify any observers that the document load has finished... */ + PRInt32 count = mDocObservers.Count(); + PRInt32 index; + for (index = 0; index < count; index++) { nsIDocumentLoaderObserver* observer = (nsIDocumentLoaderObserver*) mDocObservers.ElementAt(index); @@ -1122,13 +1213,22 @@ void nsDocLoaderImpl::FireOnEndDocumentLoad(nsIDocumentLoader* aLoadInitiator, #endif aStatus, observer); } +#ifdef NECKO + /* + * Next notify the parent... + */ + if (nsnull != mParent) { + mParent->FireOnEndDocumentLoad(aLoadInitiator, aStatus); + } +#else // !NECKO /* * Finally notify the parent... */ if (nsnull != mParent) { mParent->ChildDocLoaderFiredEndDocumentLoad(this, aLoadInitiator, aStatus); } +#endif // !NECKO } void @@ -1357,13 +1457,14 @@ nsresult nsDocLoaderImpl::LoadURLComplete(nsIURI* aURL, nsISupports* aBindInfo, * Fire the OnEndURLLoad notification to any observers... */ #ifdef NECKO - FireOnEndURLLoad((nsIDocumentLoader *) this, channel, aStatus); +/// FireOnEndURLLoad((nsIDocumentLoader *) this, channel, aStatus); #else FireOnEndURLLoad((nsIDocumentLoader *) this, aURL, aStatus); #endif #ifdef NECKO - return GetLoadGroup()->RemoveChannel(channel, ctxt, aStatus, aMsg); +/// return GetLoadGroup()->RemoveChannel(channel, ctxt, aStatus, aMsg); + return NS_OK; #else // !NECKO /* * Fire the OnEndDocumentLoad notification to any observers... @@ -1610,11 +1711,12 @@ nsresult nsDocumentBindInfo::Bind(const nsString& aURLSpec, */ #ifndef NECKO m_DocLoader->SetDocumentUrl(url); -#endif + /* * Fire the OnStarDocumentLoad interfaces */ m_DocLoader->FireOnStartDocumentLoad((nsIDocumentLoader *) m_DocLoader, url, m_Command); +#endif /* * Initiate the network request... @@ -1635,22 +1737,6 @@ nsresult nsDocumentBindInfo::Bind(nsIURI* aURL, nsIStreamListener* aListener, ns NS_ADDREF(m_Url); #endif -#if defined(DEBUG) -#ifdef NECKO - char *buffer; -#else - const char *buffer; -#endif - - aURL->GetSpec(&buffer); - PR_LOG(gDocLoaderLog, PR_LOG_DEBUG, - ("DocumentBindInfo:%p: OnStartDocumentLoad(...) called for %s.\n", - this, buffer)); -#ifdef NECKO - nsCRT::free(buffer); -#endif -#endif /* DEBUG */ - // m_DocLoader->FireOnStartDocumentLoad(aURL, m_Command); /* Set up the stream listener (if provided)... */ @@ -1676,7 +1762,7 @@ nsresult nsDocumentBindInfo::Bind(nsIURI* aURL, nsIStreamListener* aListener, ns } nsCOMPtr channel; - rv = NS_OpenURI(getter_AddRefs(channel), aURL); + rv = NS_OpenURI(getter_AddRefs(channel), aURL, loadGroup); if (NS_FAILED(rv)) return rv; if (postDataStream) @@ -1690,8 +1776,8 @@ nsresult nsDocumentBindInfo::Bind(nsIURI* aURL, nsIStreamListener* aListener, ns } m_DocLoader->SetDocumentChannel(channel); - rv = loadGroup->AddChannel(channel, nsnull); - if (NS_FAILED(rv)) return rv; +/// rv = loadGroup->AddChannel(channel, nsnull); +/// if (NS_FAILED(rv)) return rv; rv = channel->AsyncRead(0, -1, nsnull, this); if (NS_FAILED(rv)) return rv; #endif // NECKO @@ -1699,6 +1785,17 @@ nsresult nsDocumentBindInfo::Bind(nsIURI* aURL, nsIStreamListener* aListener, ns return rv; } +#ifdef NECKO +nsresult nsDocumentBindInfo::Bind(nsIStreamListener *aListener) +{ + m_NextStream = aListener; + NS_IF_ADDREF(m_NextStream); + + return NS_OK; +} + +#endif // NECKO + #ifndef NECKO nsresult nsDocumentBindInfo::Stop(void) { @@ -1977,7 +2074,7 @@ nsDocumentBindInfo::OnStartRequest(nsIURI* aURL, const char *aContentType) m_Container->GetContentViewer(&viewer); } #ifdef NECKO - m_DocLoader->FireOnStartURLLoad((nsIDocumentLoader *)m_DocLoader, channel, viewer); +/// m_DocLoader->FireOnStartURLLoad((nsIDocumentLoader *)m_DocLoader, channel, viewer); #else m_DocLoader->FireOnStartURLLoad((nsIDocumentLoader *)m_DocLoader, m_Url, aContentType, viewer); #endif @@ -2204,6 +2301,89 @@ nsDocumentBindInfo::CancelRefreshURLTimers(void) return PR_FALSE; } + + +#ifdef NECKO + +NS_IMPL_ISUPPORTS(nsChannelListener, nsCOMTypeInfo::GetIID()); + +nsChannelListener::nsChannelListener() +{ + NS_INIT_REFCNT(); + + mDocLoader = nsnull; +} + +nsresult nsChannelListener::Init(nsDocLoaderImpl *aDocLoader, + nsIStreamListener *aListener) +{ + mDocLoader = aDocLoader; + NS_ADDREF(mDocLoader); + + mNextListener = aListener; + + return NS_OK; +} + +nsChannelListener::~nsChannelListener() +{ + NS_RELEASE(mDocLoader); + mNextListener = null_nsCOMPtr(); +} + +NS_IMETHODIMP +nsChannelListener::OnStartRequest(nsIChannel *aChannel, nsISupports *aContext) +{ + nsresult rv; + nsCOMPtr container; + nsCOMPtr viewer; + + // Pass the notification to the next listener... + rv = mNextListener->OnStartRequest(aChannel, aContext); + + // + // Notify the document loader... + mDocLoader->GetContainer(getter_AddRefs(container)); + if (container) { + container->GetContentViewer(getter_AddRefs(viewer)); + } + + mDocLoader->FireOnStartURLLoad((nsIDocumentLoader *)mDocLoader, + aChannel, + viewer); + + return rv; +} + +NS_IMETHODIMP +nsChannelListener::OnStopRequest(nsIChannel *aChannel, nsISupports *aContext, + nsresult aStatus, const PRUnichar *aMsg) +{ + nsresult rv; + + rv = mNextListener->OnStopRequest(aChannel, aContext, aStatus, aMsg); + + mDocLoader->FireOnEndURLLoad((nsIDocumentLoader *) mDocLoader, + aChannel, + aStatus); + + return rv; +} + +NS_IMETHODIMP +nsChannelListener::OnDataAvailable(nsIChannel *aChannel, nsISupports *aContext, + nsIInputStream *aInStream, PRUint32 aOffset, + PRUint32 aCount) +{ + return mNextListener->OnDataAvailable(aChannel, aContext, aInStream, + aOffset, aCount); +} + + +#endif // NECKO + + + /******************************************* * nsDocLoaderServiceFactory *******************************************/ diff --git a/mozilla/webshell/src/nsWebShell.cpp b/mozilla/webshell/src/nsWebShell.cpp index c7652c580e7..3ccf2d2de9e 100644 --- a/mozilla/webshell/src/nsWebShell.cpp +++ b/mozilla/webshell/src/nsWebShell.cpp @@ -2056,7 +2056,7 @@ nsWebShell::DoLoadURL(const nsString& aUrlSpec, // Pass notifications to BrowserAppCore just to be consistent with // regular page loads thro' necko nsCOMPtr dummyChannel; - rv = NS_OpenURI(getter_AddRefs(dummyChannel), url); + rv = NS_OpenURI(getter_AddRefs(dummyChannel), url, nsnull); if (NS_FAILED(rv)) return rv; mProcessedEndDocumentLoad = PR_FALSE; @@ -2084,7 +2084,7 @@ nsWebShell::DoLoadURL(const nsString& aUrlSpec, // Pass notifications to BrowserAppCore just to be consistent with // regular necko loads. nsCOMPtr dummyChannel; - rv = NS_OpenURI(getter_AddRefs(dummyChannel), url); + rv = NS_OpenURI(getter_AddRefs(dummyChannel), url, nsnull); if (NS_FAILED(rv)) return rv; mProcessedEndDocumentLoad = PR_FALSE; diff --git a/mozilla/xpcom/tests/PropertiesTest.cpp b/mozilla/xpcom/tests/PropertiesTest.cpp index 3cbabe721ae..07bead6c548 100644 --- a/mozilla/xpcom/tests/PropertiesTest.cpp +++ b/mozilla/xpcom/tests/PropertiesTest.cpp @@ -140,8 +140,8 @@ main(int argc, char* argv[]) if (NS_FAILED(ret)) return ret; nsIChannel *channel = nsnull; - // XXX NECKO verb? getter? - ret = service->NewChannel("load", TEST_URL, nsnull, nsnull, &channel); + // XXX NECKO verb? loadgroup? getter? + ret = service->NewChannel("load", TEST_URL, nsnull, nsnull, nsnull, &channel); if (NS_FAILED(ret)) return ret; nsIEventQueue *eventQ = nsnull; diff --git a/mozilla/xpfe/components/related/src/nsRelatedLinksHandler.cpp b/mozilla/xpfe/components/related/src/nsRelatedLinksHandler.cpp index 36071cea3d5..b08f9deb912 100644 --- a/mozilla/xpfe/components/related/src/nsRelatedLinksHandler.cpp +++ b/mozilla/xpfe/components/related/src/nsRelatedLinksHandler.cpp @@ -853,7 +853,8 @@ RelatedLinksHandlerImpl::SetURL(char* aURL) if (NS_FAILED(rv)) return rv; #ifdef NECKO - rv = NS_OpenURI(listener, nsnull, url); + // XXX: Should there be a LoadGroup? + rv = NS_OpenURI(listener, nsnull, url, nsnull); #else rv = NS_OpenURL(url, listener); #endif diff --git a/mozilla/xpfe/components/xfer/src/nsStreamXferOp.cpp b/mozilla/xpfe/components/xfer/src/nsStreamXferOp.cpp index 7de423843ff..174ff9a433d 100644 --- a/mozilla/xpfe/components/xfer/src/nsStreamXferOp.cpp +++ b/mozilla/xpfe/components/xfer/src/nsStreamXferOp.cpp @@ -154,7 +154,9 @@ nsStreamXferOp::Start( void ) { #else rv = NS_NewURI( &url, mSource.GetBuffer() ); if ( NS_SUCCEEDED( rv ) && url ) { - nsresult rv = NS_OpenURI( this, nsnull, url ); + // XXX: Should there be a LoadGroup? + nsresult rv = NS_OpenURI( this, nsnull, url, nsnull + ); NS_RELEASE(url); if ( NS_FAILED( rv ) ) { diff --git a/mozilla/xpinstall/src/nsXPInstallManager.cpp b/mozilla/xpinstall/src/nsXPInstallManager.cpp index ec3202d6538..fb5fd6f406c 100644 --- a/mozilla/xpinstall/src/nsXPInstallManager.cpp +++ b/mozilla/xpinstall/src/nsXPInstallManager.cpp @@ -232,7 +232,8 @@ nsresult nsXPInstallManager::DownloadNext() #endif if (NS_SUCCEEDED(rv)) { #ifdef NECKO - rv = NS_OpenURI( this, nsnull, pURL ); + // XXX: Should there be a LoadGroup? + rv = NS_OpenURI( this, nsnull, pURL, nsnull ); NS_RELEASE(pURL); #else rv = NS_OpenURL( pURL, this );