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