diff --git a/mozilla/netwerk/base/public/nsIStreamLoader.idl b/mozilla/netwerk/base/public/nsIStreamLoader.idl index 0eaeaff38ad..39799a188bd 100644 --- a/mozilla/netwerk/base/public/nsIStreamLoader.idl +++ b/mozilla/netwerk/base/public/nsIStreamLoader.idl @@ -66,6 +66,10 @@ interface nsIStreamLoader : nsISupports in nsIURI referrer, in unsigned long refererFlags); + void initWithChannel(in nsIChannel aChannel, + in nsIStreamLoaderObserver aObserver, + in nsISupports aContext); + /** * Gets the number of bytes read so far. */ diff --git a/mozilla/netwerk/base/public/nsNetUtil.h b/mozilla/netwerk/base/public/nsNetUtil.h index d8dd661f954..7394a66dcd3 100644 --- a/mozilla/netwerk/base/public/nsNetUtil.h +++ b/mozilla/netwerk/base/public/nsNetUtil.h @@ -434,6 +434,28 @@ NS_NewStreamLoader(nsIStreamLoader* *result, return rv; } +inline nsresult +NS_NewStreamLoader(nsIStreamLoader* *result, + nsIChannel* channel, + nsIStreamLoaderObserver* observer, + nsISupports* context = nsnull) +{ + nsresult rv; + nsCOMPtr loader; + static NS_DEFINE_CID(kStreamLoaderCID, NS_STREAMLOADER_CID); + rv = nsComponentManager::CreateInstance(kStreamLoaderCID, + nsnull, + NS_GET_IID(nsIStreamLoader), + getter_AddRefs(loader)); + if (NS_FAILED(rv)) return rv; + rv = loader->InitWithChannel(channel, observer, context); + + if (NS_FAILED(rv)) return rv; + *result = loader; + NS_ADDREF(*result); + return rv; +} + inline nsresult NS_NewRequestObserverProxy(nsIRequestObserver **aResult, nsIRequestObserver *aObserver, diff --git a/mozilla/netwerk/base/src/nsStreamLoader.cpp b/mozilla/netwerk/base/src/nsStreamLoader.cpp index 51450b38ad9..bf8b0ac89c3 100644 --- a/mozilla/netwerk/base/src/nsStreamLoader.cpp +++ b/mozilla/netwerk/base/src/nsStreamLoader.cpp @@ -97,6 +97,39 @@ nsStreamLoader::Init(nsIURI* aURL, return rv; } +NS_IMETHODIMP +nsStreamLoader::InitWithChannel(nsIChannel* channel, + nsIStreamLoaderObserver* observer, + nsISupports* context) +{ + NS_ENSURE_ARG_POINTER(channel); + NS_ENSURE_ARG_POINTER(observer); + + nsresult rv = channel->AsyncOpen(this, context); + + if (NS_FAILED(rv) && observer) { + // don't callback synchronously as it puts the caller + // in a recursive situation and breaks the asynchronous + // semantics of nsIStreamLoader + nsresult rv2 = NS_OK; + nsCOMPtr pIProxyObjectManager = + do_GetService(kProxyObjectManagerCID, &rv2); + if (NS_FAILED(rv2)) return rv2; + + nsCOMPtr pObserver; + rv2 = pIProxyObjectManager->GetProxyForObject(NS_CURRENT_EVENTQ, + NS_GET_IID(nsIStreamLoaderObserver), observer, + PROXY_ASYNC | PROXY_ALWAYS, getter_AddRefs(pObserver)); + if (NS_FAILED(rv2)) return rv2; + + rv = pObserver->OnStreamComplete(this, context, rv, 0, nsnull); + } + + mObserver = observer; + mContext = context; + return rv; +} + NS_METHOD nsStreamLoader::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult) {