Jacek Caban : mshtml: Store body event target in window object.

Alexandre Julliard julliard at winehq.org
Wed Sep 9 09:56:14 CDT 2009


Module: wine
Branch: master
Commit: b481b09248cae25d3f771161d32ad403a5e0aaa9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b481b09248cae25d3f771161d32ad403a5e0aaa9

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Sep  8 22:29:39 2009 +0200

mshtml: Store body event target in window object.

---

 dlls/mshtml/htmlbody.c       |   12 +++++++++++-
 dlls/mshtml/htmlelem2.c      |    2 +-
 dlls/mshtml/htmlevent.c      |    4 ++--
 dlls/mshtml/htmlevent.h      |    9 +++++++--
 dlls/mshtml/htmlinput.c      |    1 +
 dlls/mshtml/htmlselect.c     |    1 +
 dlls/mshtml/htmltextarea.c   |    1 +
 dlls/mshtml/htmlwindow.c     |    3 +++
 dlls/mshtml/mshtml_private.h |    2 ++
 9 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c
index b8e0f95..da5d70a 100644
--- a/dlls/mshtml/htmlbody.c
+++ b/dlls/mshtml/htmlbody.c
@@ -718,11 +718,21 @@ static void HTMLBodyElement_destructor(HTMLDOMNode *iface)
     HTMLElement_destructor(&This->textcont.element.node);
 }
 
+static event_target_t **HTMLBodyElement_get_event_target(HTMLDOMNode *iface)
+{
+    HTMLBodyElement *This = HTMLBODY_NODE_THIS(iface);
+
+    return This->textcont.element.node.doc && This->textcont.element.node.doc->window
+        ? &This->textcont.element.node.doc->window->event_target
+        : &This->textcont.element.node.event_target;
+}
+
 #undef HTMLBODY_NODE_THIS
 
 static const NodeImplVtbl HTMLBodyElementImplVtbl = {
     HTMLBodyElement_QI,
-    HTMLBodyElement_destructor
+    HTMLBodyElement_destructor,
+    HTMLBodyElement_get_event_target
 };
 
 static const tid_t HTMLBodyElement_iface_tids[] = {
diff --git a/dlls/mshtml/htmlelem2.c b/dlls/mshtml/htmlelem2.c
index 542baa7..1120c79 100644
--- a/dlls/mshtml/htmlelem2.c
+++ b/dlls/mshtml/htmlelem2.c
@@ -608,7 +608,7 @@ static HRESULT WINAPI HTMLElement2_attachEvent(IHTMLElement2 *iface, BSTR event,
 
     TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
 
-    return attach_event(&This->node.event_target, This->node.doc, event, pDisp, pfResult);
+    return attach_event(get_node_event_target(&This->node), This->node.doc, event, pDisp, pfResult);
 }
 
 static HRESULT WINAPI HTMLElement2_detachEvent(IHTMLElement2 *iface, BSTR event, IDispatch *pDisp)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 4bde49a..5804615 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -750,7 +750,7 @@ void fire_event(HTMLDocument *doc, eventid_t eid, nsIDOMNode *target, nsIDOMEven
         node = get_node(doc, nsnode, FALSE);
 
         if(node)
-            call_event_handlers(doc, event_obj, node->event_target, eid, (IDispatch*)HTMLDOMNODE(node));
+            call_event_handlers(doc, event_obj, *get_node_event_target(node), eid, (IDispatch*)HTMLDOMNODE(node));
 
         if(!(event_info[eid].flags & EVENT_BUBBLE))
             break;
@@ -931,7 +931,7 @@ void check_event_attr(HTMLDocument *doc, nsIDOMElement *nselem)
             disp = script_parse_event(doc, attr_value);
             if(disp) {
                 node = get_node(doc, (nsIDOMNode*)nselem, TRUE);
-                set_event_handler_disp(&node->event_target, node->doc, i, disp);
+                set_event_handler_disp(get_node_event_target(node), node->doc, i, disp);
                 IDispatch_Release(disp);
             }
         }
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 3ea3d9d..f1d208c 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -43,14 +43,19 @@ HRESULT set_event_handler(event_target_t**,HTMLDocument*,eventid_t,VARIANT*);
 HRESULT get_event_handler(event_target_t**,eventid_t,VARIANT*);
 HRESULT attach_event(event_target_t**,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*);
 
+static inline event_target_t **get_node_event_target(HTMLDOMNode *node)
+{
+    return node->vtbl->get_event_target ? node->vtbl->get_event_target(node) : &node->event_target;
+}
+
 static inline HRESULT set_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)
 {
-    return set_event_handler(&node->event_target, node->doc, eid, var);
+    return set_event_handler(get_node_event_target(node), node->doc, eid, var);
 }
 
 static inline HRESULT get_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)
 {
-    return get_event_handler(&node->event_target, eid, var);
+    return get_event_handler(get_node_event_target(node), eid, var);
 }
 
 static inline HRESULT set_doc_event(HTMLDocument *doc, eventid_t eid, VARIANT *var)
diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c
index df7cb5f..48f19c8 100644
--- a/dlls/mshtml/htmlinput.c
+++ b/dlls/mshtml/htmlinput.c
@@ -1119,6 +1119,7 @@ static HRESULT HTMLInputElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BOO
 static const NodeImplVtbl HTMLInputElementImplVtbl = {
     HTMLInputElement_QI,
     HTMLInputElement_destructor,
+    NULL,
     HTMLInputElementImpl_put_disabled,
     HTMLInputElementImpl_get_disabled,
 };
diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c
index 2264dfa..21afc92 100644
--- a/dlls/mshtml/htmlselect.c
+++ b/dlls/mshtml/htmlselect.c
@@ -480,6 +480,7 @@ static HRESULT HTMLSelectElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BO
 static const NodeImplVtbl HTMLSelectElementImplVtbl = {
     HTMLSelectElement_QI,
     HTMLSelectElement_destructor,
+    NULL,
     HTMLSelectElementImpl_put_disabled,
     HTMLSelectElementImpl_get_disabled
 };
diff --git a/dlls/mshtml/htmltextarea.c b/dlls/mshtml/htmltextarea.c
index e72a761..bec4a2f 100644
--- a/dlls/mshtml/htmltextarea.c
+++ b/dlls/mshtml/htmltextarea.c
@@ -405,6 +405,7 @@ static HRESULT HTMLTextAreaElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_
 static const NodeImplVtbl HTMLTextAreaElementImplVtbl = {
     HTMLTextAreaElement_QI,
     HTMLTextAreaElement_destructor,
+    NULL,
     HTMLTextAreaElementImpl_put_disabled,
     HTMLTextAreaElementImpl_get_disabled
 };
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index d50eca1..3a52db6 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -29,6 +29,7 @@
 #include "wine/unicode.h"
 
 #include "mshtml_private.h"
+#include "htmlevent.h"
 #include "resource.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
@@ -92,6 +93,8 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
     TRACE("(%p) ref=%d\n", This, ref);
 
     if(!ref) {
+        if(This->event_target)
+            release_event_target(This->event_target);
         list_remove(&This->entry);
         release_dispex(&This->dispex);
         heap_free(This);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index d2b0ef8..4cf12b0 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -164,6 +164,7 @@ typedef struct {
     HTMLDocument *doc;
     nsIDOMWindow *nswindow;
 
+    event_target_t *event_target;
     IHTMLEventObj *event;
 
     struct list entry;
@@ -382,6 +383,7 @@ typedef struct {
 typedef struct {
     HRESULT (*qi)(HTMLDOMNode*,REFIID,void**);
     void (*destructor)(HTMLDOMNode*);
+    event_target_t **(*get_event_target)(HTMLDOMNode*);
     HRESULT (*put_disabled)(HTMLDOMNode*,VARIANT_BOOL);
     HRESULT (*get_disabled)(HTMLDOMNode*,VARIANT_BOOL*);
 } NodeImplVtbl;




More information about the wine-cvs mailing list