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