Module: wine Branch: master Commit: e4a936a2d2f81d027945c787861e786578300928 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e4a936a2d2f81d027945c78786...
Author: Jacek Caban jacek@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;