Jacek Caban : mshtml: Call on_stop_nsrequest asynchronously.
Alexandre Julliard
julliard at winehq.org
Wed Aug 18 12:10:00 CDT 2010
Module: wine
Branch: master
Commit: d607976a7446107528b2c68fc82272718547aa92
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d607976a7446107528b2c68fc82272718547aa92
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Aug 18 13:39:15 2010 +0200
mshtml: Call on_stop_nsrequest asynchronously.
---
dlls/mshtml/navigate.c | 55 +++++++++++++++++++++++++++++++++++------------
1 files changed, 41 insertions(+), 14 deletions(-)
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 60e67d0..2ddadae 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -1142,23 +1142,46 @@ static HRESULT nsChannelBSC_init_bindinfo(BSCallback *bsc)
return S_OK;
}
-static HRESULT nsChannelBSC_stop_binding(BSCallback *bsc, HRESULT result)
+typedef struct {
+ task_t header;
+ nsChannelBSC *bsc;
+} stop_request_task_t;
+
+static void stop_request_proc(task_t *_task)
{
- nsChannelBSC *This = NSCHANNELBSC_THIS(bsc);
+ stop_request_task_t *task = (stop_request_task_t*)_task;
- on_stop_nsrequest(This, result);
+ TRACE("(%p)\n", task->bsc);
- if(This->nslistener) {
- if(This->nschannel->load_group) {
- nsresult nsres;
+ on_stop_nsrequest(task->bsc, S_OK);
+ IBindStatusCallback_Release(STATUSCLB(&task->bsc->bsc));
+}
- nsres = nsILoadGroup_RemoveRequest(This->nschannel->load_group,
- (nsIRequest*)NSCHANNEL(This->nschannel), NULL, NS_OK);
- if(NS_FAILED(nsres))
- ERR("RemoveRequest failed: %08x\n", nsres);
- }
+static HRESULT async_stop_request(nsChannelBSC *This)
+{
+ stop_request_task_t *task;
+
+ task = heap_alloc(sizeof(*task));
+ if(!task)
+ return E_OUTOFMEMORY;
+
+ IBindStatusCallback_AddRef(STATUSCLB(&This->bsc));
+ task->bsc = This;
+ push_task(&task->header, stop_request_proc, This->bsc.doc->basedoc.doc_obj->basedoc.task_magic);
+ return S_OK;
+}
+
+static HRESULT nsChannelBSC_stop_binding(BSCallback *bsc, HRESULT result)
+{
+ nsChannelBSC *This = NSCHANNELBSC_THIS(bsc);
+
+ if(This->window && SUCCEEDED(result)) {
+ result = async_stop_request(This);
+ if(SUCCEEDED(result))
+ return S_OK;
}
+ on_stop_nsrequest(This, result);
return S_OK;
}
@@ -1382,7 +1405,7 @@ void abort_document_bindings(HTMLDocumentNode *doc)
HRESULT channelbsc_load_stream(nsChannelBSC *bscallback, IStream *stream)
{
- HRESULT hres;
+ HRESULT hres = S_OK;
if(!bscallback->nschannel) {
ERR("NULL nschannel\n");
@@ -1393,8 +1416,12 @@ HRESULT channelbsc_load_stream(nsChannelBSC *bscallback, IStream *stream)
if(!bscallback->nschannel->content_type)
return E_OUTOFMEMORY;
- hres = read_stream_data(bscallback, stream);
- IBindStatusCallback_OnStopBinding(STATUSCLB(&bscallback->bsc), hres, ERROR_SUCCESS);
+ if(stream)
+ hres = read_stream_data(bscallback, stream);
+ if(SUCCEEDED(hres))
+ hres = async_stop_request(bscallback);
+ if(FAILED(hres))
+ IBindStatusCallback_OnStopBinding(STATUSCLB(&bscallback->bsc), hres, ERROR_SUCCESS);
return hres;
}
More information about the wine-cvs
mailing list