diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 7768b2b7fe5..16ada42bc57 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -629,67 +629,62 @@ static HRESULT create_mon_for_nschannel(nsChannel *channel, IMoniker **mon)
return hres;
}
-static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListener *aListener,
- nsISupports *aContext)
+static nsresult async_open_doc_uri(nsChannel *This, NSContainer *container,
+ nsIStreamListener *listener, nsISupports *context, BOOL *open)
+{
+ IMoniker *mon;
+ HRESULT hres;
+
+ *open = FALSE;
+
+ if(container->bscallback) {
+ nsIChannel_AddRef(NSCHANNEL(This));
+ container->bscallback->nschannel = This;
+
+ nsIStreamListener_AddRef(listener);
+ container->bscallback->nslistener = listener;
+
+ if(context) {
+ nsISupports_AddRef(context);
+ container->bscallback->nscontext = context;
+ }
+
+ if(do_load_from_moniker_hack(This))
+ return WINE_NS_LOAD_FROM_MONIKER;
+ }else {
+ BOOL cont = before_async_open(This, container);
+
+ if(!cont) {
+ TRACE("canceled\n");
+ return NS_ERROR_UNEXPECTED;
+ }
+
+ if(!container->doc) {
+ return This->channel
+ ? nsIChannel_AsyncOpen(This->channel, listener, context)
+ : NS_ERROR_UNEXPECTED;
+ }
+
+ hres = create_mon_for_nschannel(This, &mon);
+ if(FAILED(hres)) {
+ return NS_ERROR_UNEXPECTED;
+ }
+ set_current_mon(container->doc, mon);
+ }
+
+ *open = TRUE;
+ return NS_OK;
+}
+
+static nsresult async_open(nsChannel *This, NSContainer *container, nsIStreamListener *listener,
+ nsISupports *context)
{
- nsChannel *This = NSCHANNEL_THIS(iface);
BSCallback *bscallback;
IMoniker *mon = NULL;
- PRBool is_doc_uri;
nsresult nsres;
task_t *task;
HRESULT hres;
- TRACE("(%p)->(%p %p)\n", This, aListener, aContext);
-
- nsIWineURI_GetIsDocumentURI(This->uri, &is_doc_uri);
-
- if(is_doc_uri && (This->load_flags & LOAD_INITIAL_DOCUMENT_URI)) {
- NSContainer *container;
-
- nsIWineURI_GetNSContainer(This->uri, &container);
- if(!container) {
- TRACE("container = NULL\n");
- return nsIChannel_AsyncOpen(This->channel, aListener, aContext);
- }
-
- if(container->bscallback) {
- nsIChannel_AddRef(NSCHANNEL(This));
- container->bscallback->nschannel = This;
-
- nsIStreamListener_AddRef(aListener);
- container->bscallback->nslistener = aListener;
-
- if(aContext) {
- nsISupports_AddRef(aContext);
- container->bscallback->nscontext = aContext;
- }
-
- nsIWebBrowserChrome_Release(NSWBCHROME(container));
-
- if(do_load_from_moniker_hack(This))
- return WINE_NS_LOAD_FROM_MONIKER;
- }else {
- BOOL cont = before_async_open(This, container);
- nsIWebBrowserChrome_Release(NSWBCHROME(container));
-
- if(!cont) {
- TRACE("canceled\n");
- return NS_ERROR_UNEXPECTED;
- }
-
- if(!container->doc)
- return This->channel
- ? nsIChannel_AsyncOpen(This->channel, aListener, aContext)
- : NS_ERROR_UNEXPECTED;
-
- hres = create_mon_for_nschannel(This, &mon);
- if(FAILED(hres))
- return NS_ERROR_UNEXPECTED;
- set_current_mon(container->doc, mon);
- }
- }
-
if(This->channel) {
if(This->post_data_stream) {
nsIUploadChannel *upload_channel;
@@ -710,7 +705,7 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
}
}
- nsres = nsIChannel_AsyncOpen(This->channel, aListener, aContext);
+ nsres = nsIChannel_AsyncOpen(This->channel, listener, context);
if(mon)
IMoniker_Release(mon);
@@ -732,17 +727,17 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
nsIChannel_AddRef(NSCHANNEL(This));
bscallback->nschannel = This;
- nsIStreamListener_AddRef(aListener);
- bscallback->nslistener = aListener;
+ nsIStreamListener_AddRef(listener);
+ bscallback->nslistener = listener;
- if(aContext) {
- nsISupports_AddRef(aContext);
- bscallback->nscontext = aContext;
+ if(context) {
+ nsISupports_AddRef(context);
+ bscallback->nscontext = context;
}
task = mshtml_alloc(sizeof(task_t));
- task->doc = bscallback->doc;
+ task->doc = container->doc;
task->task_id = TASK_START_BINDING;
task->next = NULL;
task->bscallback = bscallback;
@@ -752,6 +747,35 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
return NS_OK;
}
+static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListener *aListener,
+ nsISupports *aContext)
+{
+ nsChannel *This = NSCHANNEL_THIS(iface);
+ NSContainer *container;
+ PRBool is_doc_uri;
+ BOOL open = TRUE;
+ nsresult nsres = NS_OK;
+
+ TRACE("(%p)->(%p %p)\n", This, aListener, aContext);
+
+ nsIWineURI_GetNSContainer(This->uri, &container);
+ if(!container) {
+ TRACE("container = NULL\n");
+ return nsIChannel_AsyncOpen(This->channel, aListener, aContext);
+ }
+
+ nsIWineURI_GetIsDocumentURI(This->uri, &is_doc_uri);
+
+ if(is_doc_uri && (This->load_flags & LOAD_INITIAL_DOCUMENT_URI))
+ nsres = async_open_doc_uri(This, container, aListener, aContext, &open);
+
+ if(open)
+ nsres = async_open(This, container, aListener, aContext);
+
+ nsIWebBrowserChrome_Release(NSWBCHROME(container));
+ return nsres;
+}
+
static nsresult NSAPI nsChannel_GetRequestMethod(nsIHttpChannel *iface, nsACString *aRequestMethod)
{
nsChannel *This = NSCHANNEL_THIS(iface);