From: Gabriel Ivăncescu gabrielopcode@gmail.com
The window itself is not a DOM node, so this is perfectly normal to fail here. In fact, we weren't dispatching any gecko events sent to the window.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/nsevents.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index 65de8c8c2e3..17904963188 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -287,6 +287,7 @@ static nsresult NSAPI handle_htmlevent(nsIDOMEventListener *iface, nsIDOMEvent * nsEventListener *This = impl_from_nsIDOMEventListener(iface); HTMLDocumentNode *doc = This->This->doc; nsIDOMEventTarget *event_target; + EventTarget *target; nsIDOMNode *nsnode; HTMLDOMNode *node; DOMEvent *event; @@ -309,18 +310,22 @@ static nsresult NSAPI handle_htmlevent(nsIDOMEventListener *iface, nsIDOMEvent * nsres = nsIDOMEventTarget_QueryInterface(event_target, &IID_nsIDOMNode, (void**)&nsnode); nsIDOMEventTarget_Release(event_target); if(NS_FAILED(nsres)) { - ERR("Could not get nsIDOMNode: %08lx\n", nsres); - return NS_OK; + if(!doc->window) + return S_OK; + target = &doc->window->event_target; + node = NULL; + }else { + hres = get_node(nsnode, TRUE, &node); + nsIDOMNode_Release(nsnode); + if(FAILED(hres)) + return NS_OK; + target = &node->event_target; }
- hres = get_node(nsnode, TRUE, &node); - nsIDOMNode_Release(nsnode); - if(FAILED(hres)) - return NS_OK; - hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&doc->node.event_target.dispex), &event); if(FAILED(hres)) { - node_release(node); + if(node) + node_release(node); return NS_OK; }
@@ -330,15 +335,16 @@ static nsresult NSAPI handle_htmlevent(nsIDOMEventListener *iface, nsIDOMEvent *
hres = create_document_event(doc, event->event_id == EVENTID_FOCUS ? EVENTID_FOCUSIN : EVENTID_FOCUSOUT, &focus_event); if(SUCCEEDED(hres)) { - dispatch_event(&node->event_target, focus_event); + dispatch_event(target, focus_event); IDOMEvent_Release(&focus_event->IDOMEvent_iface); } }
- dispatch_event(&node->event_target, event); + dispatch_event(target, event);
IDOMEvent_Release(&event->IDOMEvent_iface); - node_release(node); + if(node) + node_release(node); return NS_OK; }