From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 26 ++-------------- dlls/mshtml/htmlnode.c | 2 +- dlls/mshtml/htmlwindow.c | 2 +- dlls/mshtml/mshtml_private.h | 3 +- dlls/mshtml/xmlhttprequest.c | 60 +++++++++++++++--------------------- 5 files changed, 30 insertions(+), 63 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 917411ccda9..f4573cdaf95 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -4571,27 +4571,6 @@ void *EventTarget_QI(EventTarget *event_target, REFIID riid) return NULL; }
-HRESULT EventTarget_QI_with_dispex(EventTarget *event_target, REFIID riid, void **ppv) -{ - if(IsEqualGUID(riid, &IID_IEventTarget)) { - if(use_event_quirks(event_target)) { - WARN("IEventTarget queried, but not supported by in document mode\n"); - *ppv = NULL; - return E_NOINTERFACE; - } - IEventTarget_AddRef(&event_target->IEventTarget_iface); - *ppv = &event_target->IEventTarget_iface; - return S_OK; - } - - if(dispex_query_interface(&event_target->dispex, riid, ppv)) - return *ppv ? S_OK : E_NOINTERFACE; - - WARN("(%p)->(%s %p)\n", event_target, debugstr_mshtml_guid(riid), ppv); - *ppv = NULL; - return E_NOINTERFACE; -} - void EventTarget_init_dispex_info(dispex_data_t *dispex_info, compat_mode_t compat_mode) { static const dispex_hook_t IEventTarget_hooks[] = { @@ -4609,10 +4588,9 @@ static int event_id_cmp(const void *key, const struct wine_rb_entry *entry) return wcscmp(key, WINE_RB_ENTRY_VALUE(entry, listener_container_t, entry)->type); }
-void EventTarget_Init(EventTarget *event_target, IUnknown *outer, dispex_static_data_t *dispex_data, - compat_mode_t compat_mode) +void EventTarget_Init(EventTarget *event_target, dispex_static_data_t *dispex_data, compat_mode_t compat_mode) { - init_dispatch(&event_target->dispex, outer, dispex_data, compat_mode); + init_dispatch(&event_target->dispex, NULL, dispex_data, compat_mode); event_target->IEventTarget_iface.lpVtbl = &EventTargetVtbl; wine_rb_init(&event_target->handler_map, event_id_cmp); } diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 11e611337d4..0b1a69573e3 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -1509,7 +1509,7 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno node->IHTMLDOMNode2_iface.lpVtbl = &HTMLDOMNode2Vtbl; node->IHTMLDOMNode3_iface.lpVtbl = &HTMLDOMNode3Vtbl;
- EventTarget_Init(&node->event_target, NULL, dispex_data, doc->document_mode); + EventTarget_Init(&node->event_target, dispex_data, doc->document_mode);
if(&doc->node != node) IHTMLDOMNode_AddRef(&doc->node.IHTMLDOMNode_iface); diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 10c95558203..e505c02cbb2 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -4431,7 +4431,7 @@ static HRESULT create_inner_window(HTMLOuterWindow *outer_window, IMoniker *mon, window->base.outer_window = outer_window; window->base.inner_window = window;
- EventTarget_Init(&window->event_target, NULL, &HTMLWindow_dispex, COMPAT_MODE_NONE); + EventTarget_Init(&window->event_target, &HTMLWindow_dispex, COMPAT_MODE_NONE);
window->task_magic = get_task_target_magic();
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 9d059c16315..542d86106cd 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1209,9 +1209,8 @@ HRESULT create_svg_element(HTMLDocumentNode*,nsIDOMSVGElement*,const WCHAR*,HTML void HTMLDOMNode_Init(HTMLDocumentNode*,HTMLDOMNode*,nsIDOMNode*,dispex_static_data_t*); void HTMLElement_Init(HTMLElement*,HTMLDocumentNode*,nsIDOMElement*,dispex_static_data_t*);
-void EventTarget_Init(EventTarget*,IUnknown*,dispex_static_data_t*,compat_mode_t); +void EventTarget_Init(EventTarget*,dispex_static_data_t*,compat_mode_t); void *EventTarget_QI(EventTarget*,REFIID); -HRESULT EventTarget_QI_with_dispex(EventTarget*,REFIID,void**); void EventTarget_init_dispex_info(dispex_data_t*,compat_mode_t);
void *HTMLDOMNode_QI(HTMLDOMNode*,REFIID); diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index d50e1b1ce7b..91cb007d08c 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -507,49 +507,19 @@ static inline HTMLXMLHttpRequest *impl_from_IHTMLXMLHttpRequest(IHTMLXMLHttpRequ static HRESULT WINAPI HTMLXMLHttpRequest_QueryInterface(IHTMLXMLHttpRequest *iface, REFIID riid, void **ppv) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); - - TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - - if(IsEqualGUID(&IID_IUnknown, riid)) { - *ppv = &This->IHTMLXMLHttpRequest_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - *ppv = &This->IHTMLXMLHttpRequest_iface; - }else if(IsEqualGUID(&IID_IHTMLXMLHttpRequest, riid)) { - *ppv = &This->IHTMLXMLHttpRequest_iface; - }else if(IsEqualGUID(&IID_IHTMLXMLHttpRequest2, riid)) { - *ppv = &This->IHTMLXMLHttpRequest2_iface; - }else if(IsEqualGUID(&IID_IWineXMLHttpRequestPrivate, riid)) { - *ppv = &This->IWineXMLHttpRequestPrivate_iface; - }else if(IsEqualGUID(&IID_IProvideClassInfo, riid)) { - *ppv = &This->IProvideClassInfo2_iface; - }else if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) { - *ppv = &This->IProvideClassInfo2_iface; - }else { - return EventTarget_QI_with_dispex(&This->event_target, riid, ppv); - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return IDispatchEx_QueryInterface(&This->event_target.dispex.IDispatchEx_iface, riid, ppv); }
static ULONG WINAPI HTMLXMLHttpRequest_AddRef(IHTMLXMLHttpRequest *iface) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); - LONG ref = dispex_ref_incr(&This->event_target.dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; + return IDispatchEx_AddRef(&This->event_target.dispex.IDispatchEx_iface); }
static ULONG WINAPI HTMLXMLHttpRequest_Release(IHTMLXMLHttpRequest *iface) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); - LONG ref = dispex_ref_decr(&This->event_target.dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; + return IDispatchEx_Release(&This->event_target.dispex.IDispatchEx_iface); }
static HRESULT WINAPI HTMLXMLHttpRequest_GetTypeInfoCount(IHTMLXMLHttpRequest *iface, UINT *pctinfo) @@ -1517,6 +1487,26 @@ static inline HTMLXMLHttpRequest *impl_from_DispatchEx(DispatchEx *iface) return CONTAINING_RECORD(iface, HTMLXMLHttpRequest, event_target.dispex); }
+static void *HTMLXMLHttpRequest_query_interface(DispatchEx *dispex, REFIID riid) +{ + HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex); + + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid)); + + if(IsEqualGUID(&IID_IHTMLXMLHttpRequest, riid)) + return &This->IHTMLXMLHttpRequest_iface; + if(IsEqualGUID(&IID_IHTMLXMLHttpRequest2, riid)) + return &This->IHTMLXMLHttpRequest2_iface; + if(IsEqualGUID(&IID_IWineXMLHttpRequestPrivate, riid)) + return &This->IWineXMLHttpRequestPrivate_iface; + if(IsEqualGUID(&IID_IProvideClassInfo, riid)) + return &This->IProvideClassInfo2_iface; + if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) + return &This->IProvideClassInfo2_iface; + + return EventTarget_QI(&This->event_target, riid); +} + static void HTMLXMLHttpRequest_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex); @@ -1606,6 +1596,7 @@ static void HTMLXMLHttpRequest_init_dispex_info(dispex_data_t *info, compat_mode
static const event_target_vtbl_t HTMLXMLHttpRequest_event_target_vtbl = { { + .query_interface = HTMLXMLHttpRequest_query_interface, .destructor = HTMLXMLHttpRequest_destructor, .traverse = HTMLXMLHttpRequest_traverse, .unlink = HTMLXMLHttpRequest_unlink, @@ -1748,8 +1739,7 @@ static HRESULT WINAPI HTMLXMLHttpRequestFactory_create(IHTMLXMLHttpRequestFactor ret->IHTMLXMLHttpRequest2_iface.lpVtbl = &HTMLXMLHttpRequest2Vtbl; ret->IWineXMLHttpRequestPrivate_iface.lpVtbl = &WineXMLHttpRequestPrivateVtbl; ret->IProvideClassInfo2_iface.lpVtbl = &ProvideClassInfo2Vtbl; - EventTarget_Init(&ret->event_target, (IUnknown*)&ret->IHTMLXMLHttpRequest_iface, - &HTMLXMLHttpRequest_dispex, This->window->doc->document_mode); + EventTarget_Init(&ret->event_target, &HTMLXMLHttpRequest_dispex, This->window->doc->document_mode);
/* Always register the handlers because we need them to track state */ event_listener->nsIDOMEventListener_iface.lpVtbl = &XMLHttpReqEventListenerVtbl;