diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 22043ed03cb..3ba45da427e 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(node)
- call_event_handlers(doc, event_obj, *get_node_event_target(node), eid, (IDispatch*)HTMLDOMNODE(node));
+ if(!(event_info[eid].flags & EVENT_BUBBLE))
+ break;
+
+ 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;
}