Gecko can cancel an async request sometime between async_start_doc_binding registers it and on_start_nsrequest actually processes it. The latter should not attempt to continue in this case.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/binding.h | 1 + dlls/mshtml/navigate.c | 4 ++++ dlls/mshtml/nsio.c | 3 +++ 3 files changed, 8 insertions(+)
diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h index 26a337f..9a04386 100644 --- a/dlls/mshtml/binding.h +++ b/dlls/mshtml/binding.h @@ -51,6 +51,7 @@ typedef struct { nsIURI *referrer; char *content_type; char *charset; + nsresult status; UINT32 response_status; char *response_status_text; REQUEST_METHOD request_method; diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index d5ec368..e6f2035 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -981,6 +981,10 @@ static HRESULT on_start_nsrequest(nsChannelBSC *This) { nsresult nsres;
+ /* Async request can be cancelled before we got to it */ + if(NS_FAILED(This->nschannel->status)) + return E_ABORT; /* FIXME: map status to HRESULT */ + This->nschannel->binding = This;
/* FIXME: it's needed for http connections from BindToObject. */ diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index e0b8bed..e1a1d6e 100644 --- a/dlls/mshtml/nsio.c +++ b/dlls/mshtml/nsio.c @@ -610,6 +610,9 @@ static nsresult NSAPI nsChannel_Cancel(nsIHttpChannel *iface, nsresult aStatus)
TRACE("(%p)->(%08lx)\n", This, aStatus);
+ if(NS_FAILED(aStatus)) + This->status = aStatus; + if(This->binding && This->binding->bsc.binding) IBinding_Abort(This->binding->bsc.binding); else