Add Init method to nsIStreamLoader to take an nsIChannel, so that we can set up the channel ourselves (for bug 165774). Similar patch has already landed on trunk. DO NOT LAND THIS ON THE TRUNK.
git-svn-id: svn://10.0.0.236/branches/CHIMERA_M1_0_1_BRANCH@133717 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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<nsIStreamLoader> 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,
|
||||
|
||||
@@ -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<nsIProxyObjectManager> pIProxyObjectManager =
|
||||
do_GetService(kProxyObjectManagerCID, &rv2);
|
||||
if (NS_FAILED(rv2)) return rv2;
|
||||
|
||||
nsCOMPtr<nsIStreamLoaderObserver> 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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user