Jacek Caban : mshtml: Reimplemented check_event_attr to iterate though declared attributes instead of all known events.

Alexandre Julliard julliard at winehq.org
Fri Feb 17 14:37:12 CST 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Feb 17 13:16:56 2017 +0100

mshtml: Reimplemented check_event_attr to iterate though declared attributes instead of all known events.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/htmlevent.c | 84 ++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 66 insertions(+), 18 deletions(-)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 77c998f..13fda24 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -1596,34 +1596,82 @@ void update_doc_cp_events(HTMLDocumentNode *doc, cp_static_data_t *cp)
 
 void check_event_attr(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem)
 {
-    const PRUnichar *attr_value;
-    nsAString attr_value_str;
+    nsIDOMMozNamedAttrMap *attr_map;
+    const PRUnichar *name, *value;
+    nsAString name_str, value_str;
+    HTMLDOMNode *node = NULL;
+    cpp_bool has_attrs;
+    nsIDOMAttr *attr;
     IDispatch *disp;
-    HTMLDOMNode *node;
-    int i;
+    UINT32 length, i;
+    eventid_t eid;
     nsresult nsres;
     HRESULT hres;
 
-    for(i=0; i < EVENTID_LAST; i++) {
-        nsres = get_elem_attr_value(nselem, event_info[i].attr_name, &attr_value_str, &attr_value);
-        if(NS_SUCCEEDED(nsres)) {
-            if(!*attr_value)
-                continue;
+    nsres = nsIDOMHTMLElement_HasAttributes(nselem, &has_attrs);
+    if(NS_FAILED(nsres) || !has_attrs)
+        return;
 
-            TRACE("%p.%s = %s\n", nselem, debugstr_w(event_info[i].attr_name), debugstr_w(attr_value));
+    nsres = nsIDOMHTMLElement_GetAttributes(nselem, &attr_map);
+    if(NS_FAILED(nsres))
+        return;
 
-            disp = script_parse_event(doc->window, attr_value);
-            if(disp) {
-                hres = get_node(doc, (nsIDOMNode*)nselem, TRUE, &node);
-                if(SUCCEEDED(hres)) {
-                    set_event_handler_disp(&node->event_target, i, disp);
-                    node_release(node);
-                }
+    nsres = nsIDOMMozNamedAttrMap_GetLength(attr_map, &length);
+    assert(nsres == NS_OK);
+
+    nsAString_Init(&name_str, NULL);
+    nsAString_Init(&value_str, NULL);
+
+    for(i = 0; i < length; i++) {
+        nsres = nsIDOMMozNamedAttrMap_Item(attr_map, i, &attr);
+        if(NS_FAILED(nsres))
+            continue;
+
+        nsres = nsIDOMAttr_GetName(attr, &name_str);
+        if(NS_FAILED(nsres)) {
+            nsIDOMAttr_Release(attr);
+            continue;
+        }
+
+        nsAString_GetData(&name_str, &name);
+        eid = attr_to_eid(name);
+        if(eid == EVENTID_LAST) {
+            nsIDOMAttr_Release(attr);
+            continue;
+        }
+
+        nsres = nsIDOMAttr_GetValue(attr, &value_str);
+        nsIDOMAttr_Release(attr);
+        if(NS_FAILED(nsres))
+            continue;
+
+        nsAString_GetData(&value_str, &value);
+        if(!*value)
+            continue;
+
+        TRACE("%p.%s = %s\n", nselem, debugstr_w(name), debugstr_w(value));
+
+        disp = script_parse_event(doc->window, value);
+        if(!disp)
+            continue;
+
+        if(!node) {
+            hres = get_node(doc, (nsIDOMNode*)nselem, TRUE, &node);
+            if(FAILED(hres)) {
                 IDispatch_Release(disp);
+                break;
             }
-            nsAString_Finish(&attr_value_str);
         }
+
+        set_event_handler_disp(&node->event_target, eid, disp);
+        IDispatch_Release(disp);
     }
+
+    if(node)
+        node_release(node);
+    nsAString_Finish(&name_str);
+    nsAString_Finish(&value_str);
+    nsIDOMMozNamedAttrMap_Release(attr_map);
 }
 
 HRESULT doc_init_events(HTMLDocumentNode *doc)




More information about the wine-cvs mailing list