mshtml: Store body event target in window object.
authorJacek Caban <jacek@codeweavers.com>
Tue, 8 Sep 2009 20:29:39 +0000 (22:29 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 9 Sep 2009 10:08:32 +0000 (12:08 +0200)
dlls/mshtml/htmlbody.c
dlls/mshtml/htmlelem2.c
dlls/mshtml/htmlevent.c
dlls/mshtml/htmlevent.h
dlls/mshtml/htmlinput.c
dlls/mshtml/htmlselect.c
dlls/mshtml/htmltextarea.c
dlls/mshtml/htmlwindow.c
dlls/mshtml/mshtml_private.h

index b8e0f95c65b6a0fd51a1bd04cc07a89bac90cf90..da5d70a2209d9a86b57e491299177445ea8471d2 100644 (file)
@@ -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[] = {
index 542baa7d11e9dd08a2e910fa723c6d72d9617cb5..1120c792d099f04f70b4bd4999c26dd9ffcf624c 100644 (file)
@@ -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)
index 4bde49a91fc22e95128416d7b5a1338fe5a81d2f..5804615e1e863bf83035cee8790d4bdaa3641ac1 100644 (file)
@@ -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);
             }
         }
index 3ea3d9d2784c6a19eccf8995bba2a45317745764..f1d208ca7f6b13b20080e3e192ba817ec89c0719 100644 (file)
@@ -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)
index df7cb5fb304e6cd4b3a269b8d7eab44d175d56b3..48f19c82f8c5dc5f7876ad31ac9281ad953bbf79 100644 (file)
@@ -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,
 };
index 2264dfae13aaac9d84aaa33ed93cb78d29863ba0..21afc92d86e58eacc8f7847585de6d66813577e9 100644 (file)
@@ -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
 };
index e72a761c66f837cdc410d70702d0175d6ec5f56e..bec4a2fd90d761da4352b03b5ac7a21bfe31e03e 100644 (file)
@@ -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
 };
index d50eca17758068490419937c6d6c503f22e7e984..3a52db6607fffa3b1e2d3145b9a29dfc4b5bc59d 100644 (file)
@@ -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);
index d2b0ef8f54672bf2df4b6db1deccfc962a9d56bf..4cf12b035d4c307a78f0fbb45e3e793a8b72705d 100644 (file)
@@ -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;