Jacek Caban : mshtml: Store body event target in HTMLDocumentNode.
Alexandre Julliard
julliard at winehq.org
Mon Jan 4 10:54:16 CST 2010
Module: wine
Branch: master
Commit: e4a936a2d2f81d027945c787861e786578300928
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e4a936a2d2f81d027945c787861e786578300928
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Jan 4 00:39:31 2010 +0100
mshtml: Store body event target in HTMLDocumentNode.
---
dlls/mshtml/htmlbody.c | 4 ++--
dlls/mshtml/htmldoc.c | 2 ++
dlls/mshtml/htmlevent.c | 2 +-
dlls/mshtml/htmlevent.h | 10 ----------
dlls/mshtml/htmlwindow.c | 29 ++++++++++++++++++++++++++---
dlls/mshtml/mshtml_private.h | 2 +-
6 files changed, 32 insertions(+), 17 deletions(-)
diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c
index 1aa7313..7f22a4e 100644
--- a/dlls/mshtml/htmlbody.c
+++ b/dlls/mshtml/htmlbody.c
@@ -783,8 +783,8 @@ 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->basedoc.window
- ? &This->textcont.element.node.doc->basedoc.window->event_target
+ return This->textcont.element.node.doc
+ ? &This->textcont.element.node.doc->body_event_target
: &This->textcont.element.node.event_target;
}
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 54d3ca3..ac67a84 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1842,6 +1842,8 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
{
HTMLDocumentNode *This = HTMLDOCNODE_NODE_THIS(iface);
+ if(This->body_event_target)
+ release_event_target(This->body_event_target);
if(This->nsevent_listener)
release_nsevents(This);
if(This->catmgr)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index 2e2f1c9..d04b2e6 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -934,7 +934,7 @@ void fire_event(HTMLDocumentNode *doc, eventid_t eid, nsIDOMNode *target, nsIDOM
}
}
- call_event_handlers(doc, event_obj, doc->basedoc.doc_node->node.event_target, &doc->basedoc.cp_container, eid,
+ call_event_handlers(doc, event_obj, doc->node.event_target, &doc->basedoc.cp_container, eid,
(IDispatch*)HTMLDOC(&doc->basedoc));
break;
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index a0fb198..1a8572f 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -74,13 +74,3 @@ static inline HRESULT get_doc_event(HTMLDocument *doc, eventid_t eid, VARIANT *v
{
return get_node_event(&doc->doc_node->node, eid, var);
}
-
-static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
-{
- return set_event_handler(&window->event_target, window->doc, eid, var);
-}
-
-static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
-{
- return get_event_handler(&window->event_target, eid, var);
-}
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 6db3148..4a2babe 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -117,6 +117,26 @@ static HRESULT get_location(HTMLWindow *This, HTMLLocation **ret)
return S_OK;
}
+static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
+{
+ if(!window->doc) {
+ FIXME("No document\n");
+ return E_FAIL;
+ }
+
+ return set_event_handler(&window->doc->body_event_target, window->doc, eid, var);
+}
+
+static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
+{
+ if(!window->doc) {
+ FIXME("No document\n");
+ return E_FAIL;
+ }
+
+ return get_event_handler(&window->doc->body_event_target, eid, var);
+}
+
#define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface)
static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
@@ -206,8 +226,6 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
if(This->screen)
IHTMLScreen_Release(This->screen);
- if(This->event_target)
- release_event_target(This->event_target);
for(i=0; i < This->global_prop_cnt; i++)
heap_free(This->global_props[i].name);
@@ -1391,7 +1409,12 @@ static HRESULT WINAPI HTMLWindow3_attachEvent(IHTMLWindow3 *iface, BSTR event, I
TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
- return attach_event(&This->event_target, &This->doc_obj->basedoc, event, pDisp, pfResult);
+ if(!This->doc) {
+ FIXME("No document\n");
+ return E_FAIL;
+ }
+
+ return attach_event(&This->doc->body_event_target, &This->doc->basedoc, event, pDisp, pfResult);
}
static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 491bc2a..68b3393 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -242,7 +242,6 @@ struct HTMLWindow {
IMoniker *mon;
LPOLESTR url;
- event_target_t *event_target;
IHTMLEventObj *event;
SCRIPTMODE scriptmode;
@@ -531,6 +530,7 @@ struct HTMLDocumentNode {
nsIDOMHTMLDocument *nsdoc;
HTMLDOMNode *nodes;
BOOL content_ready;
+ event_target_t *body_event_target;
IInternetSecurityManager *secmgr;
ICatInformation *catmgr;
More information about the wine-cvs
mailing list