Jacek Caban : mshtml: Bind events directly to document node for documents with no window associated.
Alexandre Julliard
julliard at winehq.org
Wed Mar 13 18:10:52 CDT 2019
Module: wine
Branch: master
Commit: b574cd98bd91f4d2e52247b5d77da3bb1644b34a
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b574cd98bd91f4d2e52247b5d77da3bb1644b34a
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Mar 13 17:54:11 2019 +0100
mshtml: Bind events directly to document node for documents with no window associated.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mshtml/nsevents.c | 40 ++++++++++++++++++++++------------------
1 file changed, 22 insertions(+), 18 deletions(-)
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c
index 4fc557d..0ba0bb9 100644
--- a/dlls/mshtml/nsevents.c
+++ b/dlls/mshtml/nsevents.c
@@ -19,6 +19,7 @@
#include "config.h"
#include <stdarg.h>
+#include <assert.h>
#define COBJMACROS
@@ -384,18 +385,29 @@ static void init_listener(nsEventListener *This, nsDocumentEventListener *listen
This->This = listener;
}
+static nsIDOMEventTarget *get_default_document_target(HTMLDocumentNode *doc)
+{
+ nsIDOMEventTarget *target;
+ nsISupports *target_iface;
+ nsresult nsres;
+
+ target_iface = doc->window ? (nsISupports*)doc->basedoc.window->nswindow : (nsISupports*)doc->nsdoc;
+ nsres = nsISupports_QueryInterface(target_iface, &IID_nsIDOMEventTarget, (void**)&target);
+ return NS_SUCCEEDED(nsres) ? target : NULL;
+}
+
void add_nsevent_listener(HTMLDocumentNode *doc, nsIDOMNode *nsnode, LPCWSTR type)
{
nsIDOMEventTarget *target;
nsresult nsres;
- if(nsnode)
+ if(nsnode) {
nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMEventTarget, (void**)&target);
- else
- nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target);
- if(NS_FAILED(nsres)) {
- ERR("Could not get nsIDOMEventTarget interface: %08x\n", nsres);
- return;
+ assert(nsres == NS_OK);
+ }else {
+ target = get_default_document_target(doc);
+ if(!target)
+ return;
}
init_event(target, type, &doc->nsevent_listener->htmlevent_listener.nsIDOMEventListener_iface,
@@ -409,14 +421,9 @@ static void detach_nslistener(HTMLDocumentNode *doc, const WCHAR *type, nsEventL
nsAString type_str;
nsresult nsres;
- if(!doc->basedoc.window)
- return;
-
- nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target);
- if(NS_FAILED(nsres)) {
- ERR("Could not get nsIDOMEventTarget interface: %08x\n", nsres);
+ target = get_default_document_target(doc);
+ if(!target)
return;
- }
nsAString_InitDepend(&type_str, type);
nsres = nsIDOMEventTarget_RemoveEventListener(target, &type_str,
@@ -455,7 +462,6 @@ void init_nsevents(HTMLDocumentNode *doc)
{
nsDocumentEventListener *listener;
nsIDOMEventTarget *target;
- nsresult nsres;
listener = heap_alloc(sizeof(nsDocumentEventListener));
if(!listener)
@@ -474,11 +480,9 @@ void init_nsevents(HTMLDocumentNode *doc)
doc->nsevent_listener = listener;
- nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target);
- if(NS_FAILED(nsres)) {
- ERR("Could not get nsIDOMEventTarget interface: %08x\n", nsres);
+ target = get_default_document_target(doc);
+ if(!target)
return;
- }
init_event(target, blurW, &listener->blur_listener.nsIDOMEventListener_iface, TRUE);
init_event(target, focusW, &listener->focus_listener.nsIDOMEventListener_iface, TRUE);
More information about the wine-cvs
mailing list