Module: wine Branch: master Commit: d09692d18795c3f2b27d45e3e7b008976072d7ac URL: http://source.winehq.org/git/wine.git/?a=commit;h=d09692d18795c3f2b27d45e3e7...
Author: Jacek Caban jacek@codeweavers.com Date: Sun Jun 10 11:42:37 2007 +0200
mshtml: Push TASK_PARSECOMPLETE in load event if Gecko is available.
---
dlls/mshtml/navigate.c | 4 +- dlls/mshtml/nsembed.c | 54 +++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 7 deletions(-)
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index dd7d78d..2303baf 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -404,7 +404,7 @@ static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *ifac } }
- if(This->doc) { + if(This->doc && !This->doc->nscontainer) { task_t *task = mshtml_alloc(sizeof(task_t));
task->doc = This->doc; @@ -413,7 +413,7 @@ static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *ifac
/* * This should be done in the worker thread that parses HTML, - * but we don't have such thread (Gecko parses HTML for us). + * but we don't have such thread. */ push_task(task); } diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index a5dd2d5..5c4cfd3 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -628,6 +628,28 @@ void set_ns_editmode(NSContainer *This) nsIWebBrowser_SetParentURIContentListener(This->webbrowser, NSURICL(This)); }
+static void handle_load_event(NSContainer *This, nsIDOMEvent *event) +{ + task_t *task; + + TRACE("(%p)\n", This); + + if(!This->doc) + return; + + task = mshtml_alloc(sizeof(task_t)); + + task->doc = This->doc; + task->task_id = TASK_PARSECOMPLETE; + task->next = NULL; + + /* + * 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); +} + void close_gecko(void) { TRACE("()\n"); @@ -1283,11 +1305,24 @@ static nsrefcnt NSAPI nsDOMEventListener_Release(nsIDOMEventListener *iface) static nsresult NSAPI nsDOMEventListener_HandleEvent(nsIDOMEventListener *iface, nsIDOMEvent *event) { NSContainer *This = NSEVENTLIST_THIS(iface); + nsAString type_str; + const PRUnichar *type;
- TRACE("(%p)->(%p)\n", This, event); + static const PRUnichar loadW[] = {'l','o','a','d',0};
- if(This->doc->usermode == EDITMODE) - handle_edit_event(This->doc, event); + nsAString_Init(&type_str, NULL); + nsIDOMEvent_GetType(event, &type_str); + nsAString_GetData(&type_str, &type, NULL); + + TRACE("(%p)->(%p) %s\n", This, event, debugstr_w(type)); + + if(!strcmpW(loadW, type)) { + handle_load_event(This, event); + }else if(This->doc && This->doc->usermode == EDITMODE) { + handle_edit_event(This->doc, event); + } + + nsAString_Finish(&type_str);
return NS_OK; } @@ -1519,14 +1554,23 @@ NSContainer *NSContainer_Create(HTMLDocument *doc, NSContainer *parent) nsres = nsIDOMWindow_QueryInterface(dom_window, &IID_nsIDOMEventTarget, (void**)&target); nsIDOMWindow_Release(dom_window); if(NS_SUCCEEDED(nsres)) { - nsAString keypress_str; + nsAString keypress_str, load_str; static const PRUnichar wsz_keypress[] = {'k','e','y','p','r','e','s','s',0}; + static const PRUnichar wsz_load[] = {'l','o','a','d',0}; + nsAString_Init(&keypress_str, wsz_keypress); nsres = nsIDOMEventTarget_AddEventListener(target, &keypress_str, NSEVENTLIST(ret), TRUE); nsAString_Finish(&keypress_str); - nsIDOMEventTarget_Release(target); if(NS_FAILED(nsres)) ERR("AddEventTarget failed: %08x\n", nsres); + + nsAString_Init(&load_str, wsz_load); + nsres = nsIDOMEventTarget_AddEventListener(target, &load_str, NSEVENTLIST(ret), TRUE); + nsAString_Finish(&load_str); + if(NS_FAILED(nsres)) + ERR("AddEventTarget failed: %08x\n", nsres); + + nsIDOMEventTarget_Release(target); }else { ERR("Could not get nsIDOMEventTarget interface: %08x\n", nsres); }