Module: wine Branch: master Commit: 71ce8aaafe7c2989320d47424660056e0c523bf0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=71ce8aaafe7c2989320d474246...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Dec 24 13:10:10 2014 +0100
mshtml: Flush pending document node tasks before firing onload event.
---
dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/nsevents.c | 9 ++++++--- dlls/mshtml/task.c | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 5553bf2..4076f8d 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1038,6 +1038,7 @@ HWND get_thread_hwnd(void) DECLSPEC_HIDDEN; LONG get_task_target_magic(void) DECLSPEC_HIDDEN; HRESULT push_task(task_t*,task_proc_t,task_proc_t,LONG) DECLSPEC_HIDDEN; void remove_target_tasks(LONG) DECLSPEC_HIDDEN; +void flush_pending_tasks(LONG) DECLSPEC_HIDDEN;
HRESULT set_task_timer(HTMLInnerWindow*,DWORD,BOOL,IDispatch*,LONG*) DECLSPEC_HIDDEN; HRESULT clear_task_timer(HTMLInnerWindow*,BOOL,DWORD) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index fc6504b..1444b43 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -233,7 +233,6 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event { nsEventListener *This = impl_from_nsIDOMEventListener(iface); HTMLDocumentNode *doc = This->This->doc; - nsIDOMHTMLElement *nsbody = NULL; HTMLDocumentObj *doc_obj = NULL; nsresult nsres = NS_OK;
@@ -268,8 +267,12 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event &doc->basedoc.window->base.IHTMLWindow2_iface, 0);
if(doc->nsdoc) { - nsIDOMHTMLDocument_GetBody(doc->nsdoc, &nsbody); - if(nsbody) { + nsIDOMHTMLElement *nsbody; + + flush_pending_tasks(doc->basedoc.task_magic); + + nsres = nsIDOMHTMLDocument_GetBody(doc->nsdoc, &nsbody); + if(NS_SUCCEEDED(nsres) && nsbody) { fire_event(doc, EVENTID_LOAD, TRUE, (nsIDOMNode*)nsbody, event, (IDispatch*)&doc->window->base.IDispatchEx_iface); nsIDOMHTMLElement_Release(nsbody); } diff --git a/dlls/mshtml/task.c b/dlls/mshtml/task.c index d0c888f..a821031 100644 --- a/dlls/mshtml/task.c +++ b/dlls/mshtml/task.c @@ -102,6 +102,25 @@ static void release_task_timer(HWND thread_hwnd, task_timer_t *timer) heap_free(timer); }
+void flush_pending_tasks(LONG target) +{ + thread_data_t *thread_data = get_thread_data(FALSE); + struct list *liter, *ltmp; + task_t *task; + + if(!thread_data) + return; + + LIST_FOR_EACH_SAFE(liter, ltmp, &thread_data->task_list) { + task = LIST_ENTRY(liter, task_t, entry); + if(task->target_magic == target) { + list_remove(&task->entry); + task->proc(task); + task->destr(task); + } + } +} + void remove_target_tasks(LONG target) { thread_data_t *thread_data = get_thread_data(FALSE);