Module: wine Branch: master Commit: 73bf0d8f9a315810194dee87939484233c68febb URL: http://source.winehq.org/git/wine.git/?a=commit;h=73bf0d8f9a315810194dee8793...
Author: Jacek Caban jacek@codeweavers.com Date: Sun Nov 1 19:24:34 2009 +0100
mshtml: Handle EndLoad via script runner.
---
dlls/mshtml/mutation.c | 99 +++++++++++++++++++++++++++-------------------- 1 files changed, 57 insertions(+), 42 deletions(-)
diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index f550809..03f3e90 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -37,6 +37,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
enum { MUTATION_COMMENT, + MUTATION_ENDLOAD, MUTATION_FRAME, MUTATION_IFRAME, MUTATION_SCRIPT @@ -231,6 +232,26 @@ static nsrefcnt NSAPI nsRunnable_Release(nsIRunnable *iface) return htmldoc_release(&This->basedoc); }
+static void push_mutation_queue(HTMLDocumentNode *doc, DWORD type, nsISupports *nsiface) +{ + mutation_queue_t *elem; + + elem = heap_alloc(sizeof(mutation_queue_t)); + if(!elem) + return; + + elem->next = NULL; + elem->type = type; + elem->nsiface = nsiface; + if(nsiface) + nsISupports_AddRef(nsiface); + + if(doc->mutation_queue_tail) + doc->mutation_queue_tail = doc->mutation_queue_tail->next = elem; + else + doc->mutation_queue = doc->mutation_queue_tail = elem; +} + static void pop_mutation_queue(HTMLDocumentNode *doc) { mutation_queue_t *tmp = doc->mutation_queue; @@ -242,7 +263,8 @@ static void pop_mutation_queue(HTMLDocumentNode *doc) if(!tmp->next) doc->mutation_queue_tail = NULL;
- nsISupports_Release(tmp->nsiface); + if(tmp->nsiface) + nsISupports_Release(tmp->nsiface); heap_free(tmp); }
@@ -329,6 +351,34 @@ static nsresult init_frame_window(HTMLDocumentNode *doc, nsISupports *nsunk) return nsres; }
+static void parse_complete_proc(task_t *_task) +{ + docobj_task_t *task = (docobj_task_t*)_task; + parse_complete(task->doc); +} + +static void handle_end_load(HTMLDocumentNode *This) +{ + docobj_task_t *task; + + TRACE("\n"); + + if(This != This->basedoc.doc_obj->basedoc.doc_node) + return; + + task = heap_alloc(sizeof(docobj_task_t)); + if(!task) + return; + + task->doc = This->basedoc.doc_obj; + + /* + * This should be done in the worker thread that parses HTML, + * but we don't have such thread (Gecko parses HTML for us). + */ + push_task(&task->header, &parse_complete_proc, This->basedoc.doc_obj->basedoc.task_magic); +} + static nsresult NSAPI nsRunnable_Run(nsIRunnable *iface) { HTMLDocumentNode *This = NSRUNNABLE_THIS(iface); @@ -385,6 +435,10 @@ static nsresult NSAPI nsRunnable_Run(nsIRunnable *iface) break; }
+ case MUTATION_ENDLOAD: + handle_end_load(This); + break; + case MUTATION_FRAME: init_frame_window(This, This->mutation_queue->nsiface); break; @@ -522,12 +576,6 @@ static void NSAPI nsDocumentObserver_BeginLoad(nsIDocumentObserver *iface, nsIDo { }
-static void parse_complete_proc(task_t *_task) -{ - docobj_task_t *task = (docobj_task_t*)_task; - parse_complete(task->doc); -} - static void NSAPI nsDocumentObserver_EndLoad(nsIDocumentObserver *iface, nsIDocument *aDocument) { HTMLDocumentNode *This = NSDOCOBS_THIS(iface); @@ -535,22 +583,8 @@ static void NSAPI nsDocumentObserver_EndLoad(nsIDocumentObserver *iface, nsIDocu TRACE("\n");
This->content_ready = TRUE; - - if(This == This->basedoc.doc_obj->basedoc.doc_node) { - docobj_task_t *task; - - task = heap_alloc(sizeof(docobj_task_t)); - if(!task) - return; - - task->doc = This->basedoc.doc_obj; - - /* - * This should be done in the worker thread that parses HTML, - * but we don't have such thread (Gecko parses HTML for us). - */ - push_task(&task->header, &parse_complete_proc, This->basedoc.doc_obj->basedoc.task_magic); - } + push_mutation_queue(This, MUTATION_ENDLOAD, NULL); + add_script_runner(This); }
static void NSAPI nsDocumentObserver_ContentStatesChanged(nsIDocumentObserver *iface, nsIDocument *aDocument, @@ -588,25 +622,6 @@ static void NSAPI nsDocumentObserver_StyleRuleRemoved(nsIDocumentObserver *iface { }
-static void push_mutation_queue(HTMLDocumentNode *doc, DWORD type, nsISupports *nsiface) -{ - mutation_queue_t *elem; - - elem = heap_alloc(sizeof(mutation_queue_t)); - if(!elem) - return; - - elem->next = NULL; - elem->type = type; - elem->nsiface = nsiface; - nsISupports_AddRef(nsiface); - - if(doc->mutation_queue_tail) - doc->mutation_queue_tail = doc->mutation_queue_tail->next = elem; - else - doc->mutation_queue = doc->mutation_queue_tail = elem; -} - static void NSAPI nsDocumentObserver_BindToDocument(nsIDocumentObserver *iface, nsIDocument *aDocument, nsIContent *aContent) {