Jacek Caban : mshtml: Push TASK_PARSECOMPLETE in load event if Gecko is available.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 11 08:46:39 CDT 2007


Module: wine
Branch: master
Commit: d09692d18795c3f2b27d45e3e7b008976072d7ac
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d09692d18795c3f2b27d45e3e7b008976072d7ac

Author: Jacek Caban <jacek at 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);
         }




More information about the wine-cvs mailing list