Jacek Caban : mshtml: Added support for document events in fire_event.

Alexandre Julliard julliard at winehq.org
Wed Sep 9 09:56:23 CDT 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Sep  8 22:31:35 2009 +0200

mshtml: Added support for document events in fire_event.

---

 dlls/mshtml/htmlevent.c |   45 +++++++++++++++++++++++++--------------------
 1 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 22043ed..3ba45da 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -739,43 +739,48 @@ void fire_event(HTMLDocument *doc, eventid_t eid, nsIDOMNode *target, nsIDOMEven
     HTMLDOMNode *node;
     PRUint16 node_type;
 
-    nsIDOMNode_GetNodeType(target, &node_type);
-    if(node_type != ELEMENT_NODE) {
-        FIXME("node type %d node supported\n", node_type);
-        return;
-    }
+    TRACE("(%p) %s\n", doc, debugstr_w(event_info[eid].name));
 
     prev_event = doc->window->event;
     event_obj = doc->window->event = create_event(get_node(doc, target, TRUE), eid, nsevent);
+
+    nsIDOMNode_GetNodeType(target, &node_type);
     nsnode = target;
     nsIDOMNode_AddRef(nsnode);
 
-    while(1) {
-        node = get_node(doc, nsnode, FALSE);
+    switch(node_type) {
+    case ELEMENT_NODE:
+        do {
+            node = get_node(doc, nsnode, FALSE);
+            if(node)
+                call_event_handlers(doc, event_obj, *get_node_event_target(node), eid, (IDispatch*)HTMLDOMNODE(node));
+
+            if(!(event_info[eid].flags & EVENT_BUBBLE))
+                break;
 
-        if(node)
-            call_event_handlers(doc, event_obj, *get_node_event_target(node), eid, (IDispatch*)HTMLDOMNODE(node));
+            nsIDOMNode_GetParentNode(nsnode, &parent);
+            nsIDOMNode_Release(nsnode);
+            nsnode = parent;
+            if(!nsnode)
+                break;
+
+            nsIDOMNode_GetNodeType(nsnode, &node_type);
+        }while(node_type == ELEMENT_NODE);
 
         if(!(event_info[eid].flags & EVENT_BUBBLE))
             break;
 
-        nsIDOMNode_GetParentNode(nsnode, &parent);
-        nsIDOMNode_Release(nsnode);
-        nsnode = parent;
-        if(!nsnode)
-            break;
+    case DOCUMENT_NODE:
+        call_event_handlers(doc, event_obj, doc->event_target, eid, (IDispatch*)HTMLDOC(doc));
+        break;
 
-        nsIDOMNode_GetNodeType(nsnode, &node_type);
-        if(node_type != ELEMENT_NODE)
-            break;
+    default:
+        FIXME("unimplemented node type %d\n", node_type);
     }
 
     if(nsnode)
         nsIDOMNode_Release(nsnode);
 
-    if(event_info[eid].flags & EVENT_BUBBLE)
-        call_event_handlers(doc, event_obj, doc->event_target, eid, (IDispatch*)HTMLDOC(doc));
-
     IHTMLEventObj_Release(event_obj);
     doc->window->event = prev_event;
 }




More information about the wine-cvs mailing list