diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 2b30c67cd8e..b293367b72a 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -2042,7 +2042,7 @@ static HRESULT WINAPI HTMLDocument3_detachEvent(IHTMLDocument3 *iface, BSTR even TRACE("(%p)->(%s %p)\n", This, debugstr_w(event), pDisp); - return detach_event(This->doc_node->node.event_target.ptr, This, event, pDisp); + return detach_event(&This->doc_node->node.event_target, This, event, pDisp); } static HRESULT WINAPI HTMLDocument3_put_onrowsdelete(IHTMLDocument3 *iface, VARIANT v) diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 8777e453b75..d2ae0bee16e 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -2575,7 +2575,7 @@ static HRESULT WINAPI HTMLElement2_detachEvent(IHTMLElement2 *iface, BSTR event, TRACE("(%p)->(%s %p)\n", This, debugstr_w(event), pDisp); - return detach_event(*get_node_event_target(&This->node), &This->node.doc->basedoc, event, pDisp); + return detach_event(&This->node.event_target, &This->node.doc->basedoc, event, pDisp); } static HRESULT WINAPI HTMLElement2_get_readyState(IHTMLElement2 *iface, VARIANT *p) diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 527bed2873e..18bca41ffec 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -1518,27 +1518,29 @@ HRESULT attach_event(EventTarget *event_target, HTMLDocument *doc, BSTR name, return ensure_nsevent_handler(doc->doc_node, data, eid); } -HRESULT detach_event(event_target_t *event_target, HTMLDocument *doc, BSTR name, IDispatch *disp) +HRESULT detach_event(EventTarget *event_target, HTMLDocument *doc, BSTR name, IDispatch *disp) { + event_target_t *data; eventid_t eid; DWORD i = 0; - if(!event_target) - return S_OK; - eid = attr_to_eid(name); if(eid == EVENTID_LAST) { WARN("Unknown event\n"); return S_OK; } - if(!event_target->event_table[eid]) + data = get_event_target_data(event_target, FALSE); + if(!data) return S_OK; - while(i < event_target->event_table[eid]->handler_cnt) { - if(event_target->event_table[eid]->handlers[i] == disp) { - IDispatch_Release(event_target->event_table[eid]->handlers[i]); - event_target->event_table[eid]->handlers[i] = NULL; + if(!data->event_table[eid]) + return S_OK; + + while(i < data->event_table[eid]->handler_cnt) { + if(data->event_table[eid]->handlers[i] == disp) { + IDispatch_Release(data->event_table[eid]->handlers[i]); + data->event_table[eid]->handlers[i] = NULL; } i++; } diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index e3a4e7fad4b..8c3163ec9e7 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -57,7 +57,7 @@ void fire_event(HTMLDocumentNode*,eventid_t,BOOL,nsIDOMNode*,nsIDOMEvent*,IDispa HRESULT set_event_handler(EventTarget*,HTMLDocumentNode*,eventid_t,VARIANT*) DECLSPEC_HIDDEN; HRESULT get_event_handler(EventTarget*,eventid_t,VARIANT*) DECLSPEC_HIDDEN; HRESULT attach_event(EventTarget*,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*) DECLSPEC_HIDDEN; -HRESULT detach_event(event_target_t*,HTMLDocument*,BSTR,IDispatch*) DECLSPEC_HIDDEN; +HRESULT detach_event(EventTarget*,HTMLDocument*,BSTR,IDispatch*) DECLSPEC_HIDDEN; HRESULT dispatch_event(HTMLDOMNode*,const WCHAR*,VARIANT*,VARIANT_BOOL*) DECLSPEC_HIDDEN; HRESULT call_fire_event(HTMLDOMNode*,eventid_t) DECLSPEC_HIDDEN; void update_cp_events(HTMLInnerWindow*,event_target_t**,cp_static_data_t*) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index b98d6185f87..01ce10e5992 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -1669,7 +1669,7 @@ static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, I return E_FAIL; } - return detach_event(window->doc->body_event_target, &window->doc->basedoc, event, pDisp); + return detach_event(&window->event_target, &window->doc->basedoc, event, pDisp); } static HRESULT window_set_timer(HTMLInnerWindow *This, VARIANT *expr, LONG msec, VARIANT *language,