Jacek Caban : mshtml: Fixed binding event scripts to window objects.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Apr 20 08:24:42 CDT 2015


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Apr 17 16:35:24 2015 +0200

mshtml: Fixed binding event scripts to window objects.

---

 dlls/mshtml/htmlevent.c |  7 ++++---
 dlls/mshtml/htmlevent.h |  2 +-
 dlls/mshtml/script.c    | 32 ++++++++++++++++++--------------
 3 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index a14ce72..30ce6b1 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -1529,11 +1529,12 @@ HRESULT detach_event(event_target_t *event_target, HTMLDocument *doc, BSTR name,
     return S_OK;
 }
 
-void bind_node_event(HTMLDocumentNode *doc, event_target_t **event_target, HTMLDOMNode *node, const WCHAR *event, IDispatch *disp)
+void bind_target_event(HTMLDocumentNode *doc, event_target_t **event_target, DispatchEx *dispex,
+        const WCHAR *event, IDispatch *disp)
 {
     eventid_t eid;
 
-    TRACE("(%p %p %p %s %p)\n", doc, event_target, node, debugstr_w(event), disp);
+    TRACE("(%p %p %p %s %p)\n", doc, event_target, dispex, debugstr_w(event), disp);
 
     eid = attr_to_eid(event);
     if(eid == EVENTID_LAST) {
@@ -1541,7 +1542,7 @@ void bind_node_event(HTMLDocumentNode *doc, event_target_t **event_target, HTMLD
         return;
     }
 
-    set_event_handler_disp(&node->dispex, event_target, doc, eid, disp);
+    set_event_handler_disp(dispex, event_target, doc, eid, disp);
 }
 
 void update_cp_events(HTMLInnerWindow *window, event_target_t **event_target_ptr, cp_static_data_t *cp)
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 0517834..86d5816 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -64,7 +64,7 @@ void update_cp_events(HTMLInnerWindow*,event_target_t**,cp_static_data_t*) DECLS
 HRESULT doc_init_events(HTMLDocumentNode*) DECLSPEC_HIDDEN;
 void detach_events(HTMLDocumentNode *doc) DECLSPEC_HIDDEN;
 HRESULT create_event_obj(IHTMLEventObj**) DECLSPEC_HIDDEN;
-void bind_node_event(HTMLDocumentNode*,event_target_t**,HTMLDOMNode*,const WCHAR*,IDispatch*) DECLSPEC_HIDDEN;
+void bind_target_event(HTMLDocumentNode*,event_target_t**,DispatchEx*,const WCHAR*,IDispatch*) DECLSPEC_HIDDEN;
 
 void init_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN;
 void release_nsevents(HTMLDocumentNode*) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c
index 4590854..e3c9498 100644
--- a/dlls/mshtml/script.c
+++ b/dlls/mshtml/script.c
@@ -1314,9 +1314,9 @@ IDispatch *get_script_disp(ScriptHost *script_host)
     return disp;
 }
 
-static event_target_t **find_event_target(HTMLDocumentNode *doc, HTMLScriptElement *script_elem, HTMLDOMNode **ret_target_node)
+static event_target_t **find_event_target(HTMLDocumentNode *doc, HTMLScriptElement *script_elem, DispatchEx **ret_target_dispex)
 {
-    HTMLDOMNode *target_node = NULL;
+    DispatchEx *target_dispex = NULL;
     event_target_t **target = NULL;
     const PRUnichar *target_id;
     nsAString target_id_str;
@@ -1336,22 +1336,26 @@ static event_target_t **find_event_target(HTMLDocumentNode *doc, HTMLScriptEleme
         FIXME("Empty for attribute\n");
     }else if(!strcmpW(target_id, documentW)) {
         target = &doc->node.event_target;
-        target_node = &doc->node;
-        IHTMLDOMNode_AddRef(&target_node->IHTMLDOMNode_iface);
+        target_dispex = &doc->node.dispex;
+        htmldoc_addref(&doc->basedoc);
     }else if(!strcmpW(target_id, windowW)) {
-        target = &doc->body_event_target;
+        if(doc->window) {
+            target_dispex = &doc->window->dispex;
+            IDispatchEx_AddRef(&target_dispex->IDispatchEx_iface);
+            target = &doc->body_event_target;
+        }
     }else {
         HTMLElement *target_elem;
 
         hres = get_doc_elem_by_id(doc, target_id, &target_elem);
         if(SUCCEEDED(hres) && target_elem) {
-            target_node = &target_elem->node;
+            target_dispex = &target_elem->node.dispex;
             target = &target_elem->node.event_target;
         }
     }
     nsAString_Finish(&target_id_str);
 
-    *ret_target_node = target_node;
+    *ret_target_dispex = target_dispex;
     return target;
 }
 
@@ -1449,7 +1453,7 @@ void bind_event_scripts(HTMLDocumentNode *doc)
     HTMLScriptElement *script_elem;
     event_target_t **event_target;
     nsIDOMNodeList *node_list;
-    HTMLDOMNode *target_node;
+    DispatchEx *target_dispex;
     nsIDOMNode *script_node;
     nsAString selector_str;
     IDispatch *event_disp;
@@ -1496,10 +1500,10 @@ void bind_event_scripts(HTMLDocumentNode *doc)
 
         event_disp = parse_event_elem(doc, script_elem, &event);
         if(event_disp) {
-            event_target = find_event_target(doc, script_elem, &target_node);
+            event_target = find_event_target(doc, script_elem, &target_dispex);
             if(event_target) {
-                if(target_node)
-                    hres = IHTMLDOMNode_QueryInterface(&target_node->IHTMLDOMNode_iface, &IID_HTMLPluginContainer,
+                if(target_dispex)
+                    hres = IDispatchEx_QueryInterface(&target_dispex->IDispatchEx_iface, &IID_HTMLPluginContainer,
                             (void**)&plugin_container);
                 else
                     hres = E_NOINTERFACE;
@@ -1507,10 +1511,10 @@ void bind_event_scripts(HTMLDocumentNode *doc)
                 if(SUCCEEDED(hres))
                     bind_activex_event(doc, plugin_container, event, event_disp);
                 else
-                    bind_node_event(doc, event_target, target_node, event, event_disp);
+                    bind_target_event(doc, event_target, target_dispex, event, event_disp);
 
-                if(target_node) {
-                    IHTMLDOMNode_Release(&target_node->IHTMLDOMNode_iface);
+                if(target_dispex) {
+                    IDispatchEx_Release(&target_dispex->IDispatchEx_iface);
                     if(plugin_container)
                         node_release(&plugin_container->element.node);
                 }




More information about the wine-cvs mailing list