mshtml: Flush pending document node tasks before firing onload event.
This commit is contained in:
parent
94fcaad703
commit
71ce8aaafe
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue