From 0bccfa873db617254ad77b064ce66520f6f27170 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 3 Mar 2010 14:53:32 +0100 Subject: [PATCH] mshtml: Moved asynchronous document binding to separated function. --- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/navigate.c | 30 ++++++++++++++++++++++++++++++ dlls/mshtml/nsio.c | 21 ++------------------- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index f2ef1af1e84..8f91d38ae22 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -740,6 +740,7 @@ void add_nsevent_listener(HTMLDocumentNode*,LPCWSTR); void set_window_bscallback(HTMLWindow*,nsChannelBSC*); void set_current_mon(HTMLWindow*,IMoniker*); HRESULT start_binding(HTMLWindow*,HTMLDocumentNode*,BSCallback*,IBindCtx*); +HRESULT async_start_doc_binding(HTMLWindow*,nsChannelBSC*); void abort_document_bindings(HTMLDocumentNode*); HRESULT bind_mon_to_buffer(HTMLDocumentNode*,IMoniker*,void**,DWORD*); diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index f660c980a0d..b3ca1b0a0c2 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -1148,6 +1148,36 @@ void set_window_bscallback(HTMLWindow *window, nsChannelBSC *callback) } } +typedef struct { + task_t header; + HTMLWindow *window; + nsChannelBSC *bscallback; +} start_doc_binding_task_t; + +static void start_doc_binding_proc(task_t *_task) +{ + start_doc_binding_task_t *task = (start_doc_binding_task_t*)_task; + + start_binding(task->window, NULL, (BSCallback*)task->bscallback, NULL); + IBindStatusCallback_Release(STATUSCLB(&task->bscallback->bsc)); +} + +HRESULT async_start_doc_binding(HTMLWindow *window, nsChannelBSC *bscallback) +{ + start_doc_binding_task_t *task; + + task = heap_alloc(sizeof(start_doc_binding_task_t)); + if(!task) + return E_OUTOFMEMORY; + + task->window = window; + task->bscallback = bscallback; + IBindStatusCallback_AddRef(STATUSCLB(&bscallback->bsc)); + + push_task(&task->header, start_doc_binding_proc, window->task_magic); + return S_OK; +} + void abort_document_bindings(HTMLDocumentNode *doc) { BSCallback *iter; diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index fde132ac0c8..3a5c4fe22f0 100644 --- a/dlls/mshtml/nsio.c +++ b/dlls/mshtml/nsio.c @@ -808,19 +808,7 @@ static void start_binding_proc(task_t *_task) start_binding_task_t *task = (start_binding_task_t*)_task; start_binding(NULL, task->doc, (BSCallback*)task->bscallback, NULL); -} -typedef struct { - task_t header; - HTMLWindow *window; - nsChannelBSC *bscallback; -} start_doc_binding_task_t; - -static void start_doc_binding_proc(task_t *_task) -{ - start_doc_binding_task_t *task = (start_doc_binding_task_t*)_task; - - start_binding(task->window, NULL, (BSCallback*)task->bscallback, NULL); IUnknown_Release((IUnknown*)task->bscallback); } @@ -844,14 +832,9 @@ static nsresult async_open(nsChannel *This, HTMLWindow *window, BOOL is_doc_chan channelbsc_set_channel(bscallback, This, listener, context); if(is_doc_channel) { - start_doc_binding_task_t *task; - set_window_bscallback(window, bscallback); - - task = heap_alloc(sizeof(start_doc_binding_task_t)); - task->window = window; - task->bscallback = bscallback; - push_task(&task->header, start_doc_binding_proc, window->task_magic); + async_start_doc_binding(window, bscallback); + IUnknown_Release((IUnknown*)bscallback); }else { start_binding_task_t *task = heap_alloc(sizeof(start_binding_task_t));