This begins the initial implementation of a unified QueryInterface on the dispex. There's a couple of hacks used to make the conversion split up easier, but they're all resolved within this MR.
-- v3: mshtml: Trace the object name in dispex methods. mshtml: Use query_interface in the dispex vtbl for XMLHttpRequest. mshtml: Use query_interface in the dispex vtbl for inner windows. mshtml: Introduce query_interface in dispex vtbl and use it for DOM Nodes. mshtml: Return interface directly from node vtbl's QI instead of HRESULT, mshtml: Expose an EventTarget interface on the outer window for events'
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 35 +++++++++-- dlls/mshtml/htmlevent.h | 1 + dlls/mshtml/htmlwindow.c | 116 ++++++++++++++++++++++++++++++++++- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/tests/events.c | 18 ++++++ dlls/mshtml/tests/script.c | 18 ++++++ 6 files changed, 182 insertions(+), 7 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 59cb44a6475..2ba912f5fb3 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -318,6 +318,21 @@ static void remove_event_listener(EventTarget *event_target, const WCHAR *type_n } }
+static IEventTarget *get_event_target_iface(EventTarget *event_target) +{ + const event_target_vtbl_t *vtbl = dispex_get_vtbl(&event_target->dispex); + IEventTarget *ret; + + if(vtbl->get_dispatch_this) { + IDispatch *disp = vtbl->get_dispatch_this(&event_target->dispex); + IDispatch_QueryInterface(disp, &IID_IEventTarget, (void**)&ret); + }else { + ret = &event_target->IEventTarget_iface; + IEventTarget_AddRef(ret); + } + return ret; +} + static HRESULT get_gecko_target(IEventTarget*,nsIDOMEventTarget**);
typedef struct { @@ -1049,7 +1064,7 @@ static HRESULT WINAPI DOMEvent_get_currentTarget(IDOMEvent *iface, IEventTarget TRACE("(%p)->(%p)\n", This, p);
if(This->current_target) - IEventTarget_AddRef(*p = &This->current_target->IEventTarget_iface); + *p = get_event_target_iface(This->current_target); else *p = NULL; return S_OK; @@ -1082,7 +1097,7 @@ static HRESULT WINAPI DOMEvent_get_target(IDOMEvent *iface, IEventTarget **p) TRACE("(%p)->(%p)\n", This, p);
if(This->target) - IEventTarget_AddRef(*p = &This->target->IEventTarget_iface); + *p = get_event_target_iface(This->target); else *p = NULL; return S_OK; @@ -3573,10 +3588,10 @@ static BOOL is_cp_event(cp_static_data_t *data, DISPID dispid) static void call_event_handlers(EventTarget *event_target, DOMEvent *event, dispatch_mode_t dispatch_mode) { const listener_container_t *container = get_listener_container(event_target, event->type, FALSE); + const event_target_vtbl_t *vtbl = dispex_get_vtbl(&event_target->dispex); event_listener_t *listener, listeners_buf[8], *listeners = listeners_buf; unsigned listeners_cnt, listeners_size; ConnectionPointContainer *cp_container = NULL; - const event_target_vtbl_t *vtbl = NULL; BOOL skip_onevent_listener = FALSE; VARIANT v; HRESULT hres; @@ -3597,9 +3612,14 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event, disp V_VT(&arg) = VT_DISPATCH; V_DISPATCH(&arg) = (IDispatch*)&event_target->dispex.IDispatchEx_iface; V_VT(&v) = VT_EMPTY; + if(vtbl->get_dispatch_this) + V_DISPATCH(&arg) = vtbl->get_dispatch_this(&event_target->dispex); + IDispatch_AddRef(V_DISPATCH(&arg));
TRACE("%p %s >>>\n", event_target, debugstr_w(event->type)); hres = call_disp_func(listener->function, &dp, &v); + IDispatch_Release(V_DISPATCH(&arg)); + if(hres == S_OK) { TRACE("%p %s <<< %s\n", event_target, debugstr_w(event->type), debugstr_variant(&v));
@@ -3673,6 +3693,10 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event, disp
V_VT(args) = VT_DISPATCH; V_DISPATCH(args) = (IDispatch*)&event_target->dispex.IDispatchEx_iface; + if(vtbl->get_dispatch_this) + V_DISPATCH(args) = vtbl->get_dispatch_this(&event_target->dispex); + IDispatch_AddRef(V_DISPATCH(args)); + V_VT(args+1) = VT_DISPATCH; V_DISPATCH(args+1) = dispatch_mode == DISPATCH_LEGACY ? (IDispatch*)event->event_obj : (IDispatch*)&event->IDOMEvent_iface; @@ -3680,6 +3704,8 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event, disp
TRACE("%p %s >>>\n", event_target, debugstr_w(event->type)); hres = call_disp_func(listener->function, &dp, &v); + IDispatch_Release(V_DISPATCH(args)); + if(hres == S_OK) { TRACE("%p %s <<< %s\n", event_target, debugstr_w(event->type), debugstr_variant(&v)); @@ -3729,8 +3755,7 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event, disp if(listeners != listeners_buf) free(listeners);
- if(event->phase != DEP_CAPTURING_PHASE && event_info[event->event_id].dispid - && (vtbl = dispex_get_vtbl(&event_target->dispex))->get_cp_container) + if(event->phase != DEP_CAPTURING_PHASE && event_info[event->event_id].dispid && vtbl->get_cp_container) cp_container = vtbl->get_cp_container(&event_target->dispex); if(cp_container) { if(cp_container->cps) { diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index cf33daa4709..9150e04b239 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -128,6 +128,7 @@ void detach_nsevent(HTMLDocumentNode*,const WCHAR*); /* We extend dispex vtbl for EventTarget functions to avoid separated vtbl. */ typedef struct { dispex_static_data_vtbl_t dispex_vtbl; + IDispatch *(*get_dispatch_this)(DispatchEx*); nsISupports *(*get_gecko_target)(DispatchEx*); void (*bind_event)(DispatchEx*,eventid_t); EventTarget *(*get_parent_event_target)(DispatchEx*); diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 1c97e63789a..de09a99000f 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -260,9 +260,19 @@ static HRESULT WINAPI outer_window_QueryInterface(IHTMLWindow2 *iface, REFIID ri }else if(IsEqualGUID(&IID_nsCycleCollectionISupports, riid)) { *ppv = &This->base.IHTMLWindow2_iface; return S_OK; - }else { - return EventTarget_QI(&This->base.inner_window->event_target, riid, ppv); + }else if(IsEqualGUID(&IID_IEventTarget, riid)) { + if(!This->base.inner_window->doc || This->base.inner_window->doc->document_mode < COMPAT_MODE_IE9) { + *ppv = NULL; + return E_NOINTERFACE; + } + *ppv = &This->IEventTarget_iface; + IHTMLWindow2_AddRef(&This->base.IHTMLWindow2_iface); + return S_OK; } + + WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); + *ppv = NULL; + return E_NOINTERFACE; }
static ULONG WINAPI outer_window_AddRef(IHTMLWindow2 *iface) @@ -3771,6 +3781,100 @@ static const IDispatchExVtbl WindowDispExVtbl = { WindowDispEx_GetNameSpaceParent };
+static inline HTMLOuterWindow *impl_from_IEventTarget(IEventTarget *iface) +{ + return CONTAINING_RECORD(iface, HTMLOuterWindow, IEventTarget_iface); +} + +static HRESULT WINAPI WindowEventTarget_QueryInterface(IEventTarget *iface, REFIID riid, void **ppv) +{ + HTMLOuterWindow *This = impl_from_IEventTarget(iface); + + return IHTMLWindow2_QueryInterface(&This->base.IHTMLWindow2_iface, riid, ppv); +} + +static ULONG WINAPI WindowEventTarget_AddRef(IEventTarget *iface) +{ + HTMLOuterWindow *This = impl_from_IEventTarget(iface); + + return IHTMLWindow2_AddRef(&This->base.IHTMLWindow2_iface); +} + +static ULONG WINAPI WindowEventTarget_Release(IEventTarget *iface) +{ + HTMLOuterWindow *This = impl_from_IEventTarget(iface); + + return IHTMLWindow2_Release(&This->base.IHTMLWindow2_iface); +} + +static HRESULT WINAPI WindowEventTarget_GetTypeInfoCount(IEventTarget *iface, UINT *pctinfo) +{ + HTMLOuterWindow *This = impl_from_IEventTarget(iface); + + return IDispatchEx_GetTypeInfoCount(&This->base.IDispatchEx_iface, pctinfo); +} + +static HRESULT WINAPI WindowEventTarget_GetTypeInfo(IEventTarget *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLOuterWindow *This = impl_from_IEventTarget(iface); + + return IDispatchEx_GetTypeInfo(&This->base.IDispatchEx_iface, iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI WindowEventTarget_GetIDsOfNames(IEventTarget *iface, REFIID riid, LPOLESTR *rgszNames, + UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLOuterWindow *This = impl_from_IEventTarget(iface); + + return IDispatchEx_GetIDsOfNames(&This->base.IDispatchEx_iface, riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI WindowEventTarget_Invoke(IEventTarget *iface, DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLOuterWindow *This = impl_from_IEventTarget(iface); + + return IDispatchEx_Invoke(&This->base.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI WindowEventTarget_addEventListener(IEventTarget *iface, BSTR type, IDispatch *listener, + VARIANT_BOOL capture) +{ + HTMLOuterWindow *This = impl_from_IEventTarget(iface); + + return IEventTarget_addEventListener(&This->base.inner_window->event_target.IEventTarget_iface, type, listener, capture); +} + +static HRESULT WINAPI WindowEventTarget_removeEventListener(IEventTarget *iface, BSTR type, IDispatch *listener, + VARIANT_BOOL capture) +{ + HTMLOuterWindow *This = impl_from_IEventTarget(iface); + + return IEventTarget_removeEventListener(&This->base.inner_window->event_target.IEventTarget_iface, type, listener, capture); +} + +static HRESULT WINAPI WindowEventTarget_dispatchEvent(IEventTarget *iface, IDOMEvent *event_iface, VARIANT_BOOL *result) +{ + HTMLOuterWindow *This = impl_from_IEventTarget(iface); + + return IEventTarget_dispatchEvent(&This->base.inner_window->event_target.IEventTarget_iface, event_iface, result); +} + +static const IEventTargetVtbl EventTargetVtbl = { + WindowEventTarget_QueryInterface, + WindowEventTarget_AddRef, + WindowEventTarget_Release, + WindowEventTarget_GetTypeInfoCount, + WindowEventTarget_GetTypeInfo, + WindowEventTarget_GetIDsOfNames, + WindowEventTarget_Invoke, + WindowEventTarget_addEventListener, + WindowEventTarget_removeEventListener, + WindowEventTarget_dispatchEvent +}; + static inline HTMLWindow *impl_from_IServiceProvider(IServiceProvider *iface) { return CONTAINING_RECORD(iface, HTMLWindow, IServiceProvider_iface); @@ -4075,6 +4179,12 @@ static compat_mode_t HTMLWindow_get_compat_mode(DispatchEx *dispex) return lock_document_mode(This->doc); }
+static IDispatch *HTMLWindow_get_dispatch_this(DispatchEx *dispex) +{ + HTMLInnerWindow *This = impl_from_DispatchEx(dispex); + return (IDispatch*)&This->base.outer_window->base.IHTMLWindow2_iface; +} + static nsISupports *HTMLWindow_get_gecko_target(DispatchEx *dispex) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); @@ -4193,6 +4303,7 @@ static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { .next_dispid = HTMLWindow_next_dispid, .get_compat_mode = HTMLWindow_get_compat_mode, }, + .get_dispatch_this = HTMLWindow_get_dispatch_this, .get_gecko_target = HTMLWindow_get_gecko_target, .bind_event = HTMLWindow_bind_event, .set_current_event = HTMLWindow_set_current_event @@ -4351,6 +4462,7 @@ HRESULT create_outer_window(GeckoBrowser *browser, mozIDOMWindowProxy *mozwindow if(!window) return E_OUTOFMEMORY; window->base.IHTMLWindow2_iface.lpVtbl = &outer_window_HTMLWindow2Vtbl; + window->IEventTarget_iface.lpVtbl = &EventTargetVtbl;
window->base.outer_window = window; window->base.inner_window = NULL; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 1ea9e79a18a..859ce374951 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -551,6 +551,7 @@ struct HTMLWindow {
struct HTMLOuterWindow { HTMLWindow base; + IEventTarget IEventTarget_iface;
nsCycleCollectingAutoRefCnt ccref; LONG task_magic; diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c index 7f7515bbcef..f972c2a8316 100644 --- a/dlls/mshtml/tests/events.c +++ b/dlls/mshtml/tests/events.c @@ -1469,8 +1469,26 @@ EVENT_HANDLER_FUNC_OBJ(onvisibilitychange); static HRESULT WINAPI onbeforeunload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { + IEventTarget *event_target; + IHTMLWindow2 *window2; + IDOMEvent *event; + HRESULT hres; + CHECK_EXPECT(onbeforeunload); test_event_args(NULL, id, wFlags, pdp, pvarRes, pei, pspCaller); + + hres = IDispatch_QueryInterface(V_DISPATCH(&pdp->rgvarg[1]), &IID_IDOMEvent, (void**)&event); + ok(hres == S_OK, "Could not get IDOMEvent iface: %08lx\n", hres); + hres = IDOMEvent_get_target(event, &event_target); + ok(hres == S_OK, "get_target failed: %08lx\n", hres); + IDOMEvent_Release(event); + + hres = IEventTarget_QueryInterface(event_target, &IID_IHTMLWindow2, (void**)&window2); + ok(hres == S_OK, "Could not get IHTMLWindow2 iface: %08lx\n", hres); + ok(window2 == window, "event_target's window iface != window\n"); + IHTMLWindow2_Release(window2); + + IEventTarget_Release(event_target); return S_OK; }
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index ec4cf8a8587..dc5dac98ee7 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -197,6 +197,21 @@ static BOOL skip_loadobject_tests; static IActiveScriptSite *site, *site2; static SCRIPTSTATE state, state2;
+static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2) +{ + IUnknown *unk1, *unk2; + + if(iface1 == iface2) + return TRUE; + + IUnknown_QueryInterface(iface1, &IID_IHTMLWindow2, (void**)&unk1); + IUnknown_Release(unk1); + IUnknown_QueryInterface(iface2, &IID_IHTMLWindow2, (void**)&unk2); + IUnknown_Release(unk2); + + return unk1 == unk2; +} + static BOOL init_key(const WCHAR *key_name, const WCHAR *def_value, BOOL init) { HKEY hkey; @@ -4483,6 +4498,9 @@ static void test_exec_script(IHTMLDocument2 *doc, const WCHAR *codew, const WCHA hres = IHTMLDocument2_get_parentWindow(doc, &window); ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
+ todo_wine + ok(iface_cmp((IUnknown *)window, (IUnknown *)window_dispex), "window != dispex_window\n"); + code = SysAllocString(codew); lang = SysAllocString(langw);
From: Gabriel Ivăncescu gabrielopcode@gmail.com
This will simplify it when the QI moves to the dispex's vtbl. The node's QI does have a temporary workaround right now that will get removed.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlanchor.c | 27 ++--- dlls/mshtml/htmlarea.c | 15 +-- dlls/mshtml/htmlbody.c | 32 ++---- dlls/mshtml/htmlcomment.c | 15 +-- dlls/mshtml/htmldoc.c | 199 ++++++++++++++++------------------- dlls/mshtml/htmlelem.c | 74 ++++++------- dlls/mshtml/htmlform.c | 32 ++---- dlls/mshtml/htmlframe.c | 56 ++++------ dlls/mshtml/htmlgeneric.c | 15 +-- dlls/mshtml/htmlhead.c | 60 ++++------- dlls/mshtml/htmlimg.c | 15 +-- dlls/mshtml/htmlinput.c | 77 +++++--------- dlls/mshtml/htmllink.c | 13 +-- dlls/mshtml/htmlnode.c | 49 +++++---- dlls/mshtml/htmlobject.c | 89 +++++++--------- dlls/mshtml/htmlscript.c | 27 ++--- dlls/mshtml/htmlselect.c | 54 +++------- dlls/mshtml/htmlstyleelem.c | 28 ++--- dlls/mshtml/htmltable.c | 89 +++++----------- dlls/mshtml/htmltextarea.c | 27 ++--- dlls/mshtml/htmltextnode.c | 15 +-- dlls/mshtml/ifacewrap.c | 2 +- dlls/mshtml/mshtml_private.h | 6 +- dlls/mshtml/svg.c | 48 +++------ 24 files changed, 399 insertions(+), 665 deletions(-)
diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c index e784de12443..580db759d78 100644 --- a/dlls/mshtml/htmlanchor.c +++ b/dlls/mshtml/htmlanchor.c @@ -797,29 +797,18 @@ static inline HTMLAnchorElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLAnchorElement, element.node); }
-static HRESULT HTMLAnchorElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLAnchorElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLAnchorElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLAnchorElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLAnchorElement_iface; - }else if(IsEqualGUID(&IID_IHTMLAnchorElement, riid)) { - TRACE("(%p)->(IID_IHTMLAnchorElement %p)\n", This, ppv); - *ppv = &This->IHTMLAnchorElement_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLAnchorElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLAnchorElement_iface; + if(IsEqualGUID(&IID_IHTMLAnchorElement, riid)) + return &This->IHTMLAnchorElement_iface;
- return HTMLElement_QI(&This->element.node, riid, ppv); + return HTMLElement_QI(&This->element.node, riid); }
static HRESULT HTMLAnchorElement_handle_event(HTMLDOMNode *iface, DWORD eid, nsIDOMEvent *event, BOOL *prevent_default) diff --git a/dlls/mshtml/htmlarea.c b/dlls/mshtml/htmlarea.c index d0e377ba96c..0a3a7efee2e 100644 --- a/dlls/mshtml/htmlarea.c +++ b/dlls/mshtml/htmlarea.c @@ -413,21 +413,14 @@ static inline HTMLAreaElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLAreaElement, element.node); }
-static HRESULT HTMLAreaElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLAreaElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLAreaElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; + if(IsEqualGUID(&IID_IHTMLAreaElement, riid)) + return &This->IHTMLAreaElement_iface;
- if(IsEqualGUID(&IID_IHTMLAreaElement, riid)) { - TRACE("(%p)->(IID_IHTMLAreaElement %p)\n", This, ppv); - *ppv = &This->IHTMLAreaElement_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static HRESULT HTMLAreaElement_handle_event(HTMLDOMNode *iface, DWORD eid, nsIDOMEvent *event, BOOL *prevent_default) diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c index 277b9ed8cf0..19875915efe 100644 --- a/dlls/mshtml/htmlbody.c +++ b/dlls/mshtml/htmlbody.c @@ -890,32 +890,20 @@ static inline HTMLBodyElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLBodyElement, element.node); }
-static HRESULT HTMLBodyElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLBodyElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLBodyElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLBodyElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLBodyElement_iface; - }else if(IsEqualGUID(&IID_IHTMLBodyElement, riid)) { - TRACE("(%p)->(IID_IHTMLBodyElement %p)\n", This, ppv); - *ppv = &This->IHTMLBodyElement_iface; - }else if(IsEqualGUID(&IID_IHTMLTextContainer, riid)) { - TRACE("(%p)->(IID_IHTMLTextContainer %p)\n", This, ppv); - *ppv = &This->IHTMLTextContainer_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLBodyElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLBodyElement_iface; + if(IsEqualGUID(&IID_IHTMLBodyElement, riid)) + return &This->IHTMLBodyElement_iface; + if(IsEqualGUID(&IID_IHTMLTextContainer, riid)) + return &This->IHTMLTextContainer_iface;
- return HTMLElement_QI(&This->element.node, riid, ppv); + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLBodyElement_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb) diff --git a/dlls/mshtml/htmlcomment.c b/dlls/mshtml/htmlcomment.c index f9c945bee8a..1ac331e8c31 100644 --- a/dlls/mshtml/htmlcomment.c +++ b/dlls/mshtml/htmlcomment.c @@ -146,21 +146,14 @@ static inline HTMLCommentElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLCommentElement, element.node); }
-static HRESULT HTMLCommentElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLCommentElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLCommentElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; + if(IsEqualGUID(&IID_IHTMLCommentElement, riid)) + return &This->IHTMLCommentElement_iface;
- if(IsEqualGUID(&IID_IHTMLCommentElement, riid)) { - TRACE("(%p)->(IID_IHTMLCommentElement %p)\n", This, ppv); - *ppv = &This->IHTMLCommentElement_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLCommentElement_destructor(HTMLDOMNode *iface) diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 2a0c25f9132..01199ab4304 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -295,17 +295,14 @@ static inline DocumentType *DocumentType_from_DispatchEx(DispatchEx *iface) return CONTAINING_RECORD(iface, DocumentType, node.event_target.dispex); }
-static HRESULT DocumentType_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *DocumentType_QI(HTMLDOMNode *iface, REFIID riid) { DocumentType *This = DocumentType_from_HTMLDOMNode(iface);
if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid) || IsEqualGUID(&IID_IDOMDocumentType, riid)) - *ppv = &This->IDOMDocumentType_iface; - else - return HTMLDOMNode_QI(&This->node, riid, ppv); + return &This->IDOMDocumentType_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLDOMNode_QI(&This->node, riid); }
static HRESULT DocumentType_clone(HTMLDOMNode *iface, nsIDOMNode *nsnode, HTMLDOMNode **ret) @@ -5699,118 +5696,104 @@ static inline HTMLDocumentNode *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLDocumentNode, node); }
-static HRESULT HTMLDocumentNode_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLDocumentNode_QI(HTMLDOMNode *iface, REFIID riid) { HTMLDocumentNode *This = impl_from_HTMLDOMNode(iface);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - if(IsEqualGUID(&IID_IUnknown, riid)) - *ppv = &This->IHTMLDocument2_iface; - else if(IsEqualGUID(&IID_IDispatch, riid) || IsEqualGUID(&IID_IDispatchEx, riid)) - *ppv = &This->IDispatchEx_iface; - else if(IsEqualGUID(&IID_IHTMLDocument, riid) || IsEqualGUID(&IID_IHTMLDocument2, riid)) - *ppv = &This->IHTMLDocument2_iface; - else if(IsEqualGUID(&IID_IHTMLDocument3, riid)) - *ppv = &This->IHTMLDocument3_iface; - else if(IsEqualGUID(&IID_IHTMLDocument4, riid)) - *ppv = &This->IHTMLDocument4_iface; - else if(IsEqualGUID(&IID_IHTMLDocument5, riid)) - *ppv = &This->IHTMLDocument5_iface; - else if(IsEqualGUID(&IID_IHTMLDocument6, riid)) - *ppv = &This->IHTMLDocument6_iface; - else if(IsEqualGUID(&IID_IHTMLDocument7, riid)) - *ppv = &This->IHTMLDocument7_iface; - else if(IsEqualGUID(&IID_IDocumentSelector, riid)) - *ppv = &This->IDocumentSelector_iface; - else if(IsEqualGUID(&IID_IDocumentEvent, riid)) - *ppv = &This->IDocumentEvent_iface; - else if(IsEqualGUID(&DIID_DispHTMLDocument, riid)) - *ppv = &This->IHTMLDocument2_iface; - else if(IsEqualGUID(&IID_ISupportErrorInfo, riid)) - *ppv = &This->ISupportErrorInfo_iface; - else if(IsEqualGUID(&IID_IProvideClassInfo, riid)) - *ppv = &This->IProvideMultipleClassInfo_iface; - else if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) - *ppv = &This->IProvideMultipleClassInfo_iface; - else if(IsEqualGUID(&IID_IProvideMultipleClassInfo, riid)) - *ppv = &This->IProvideMultipleClassInfo_iface; - else if(IsEqualGUID(&IID_IMarkupServices, riid)) - *ppv = &This->IMarkupServices_iface; - else if(IsEqualGUID(&IID_IMarkupContainer, riid)) - *ppv = &This->IMarkupContainer_iface; - else if(IsEqualGUID(&IID_IDisplayServices, riid)) - *ppv = &This->IDisplayServices_iface; - else if(IsEqualGUID(&IID_IDocumentRange, riid)) - *ppv = &This->IDocumentRange_iface; - else if(IsEqualGUID(&IID_IPersist, riid)) - *ppv = &This->IPersistFile_iface; - else if(IsEqualGUID(&IID_IPersistMoniker, riid)) - *ppv = &This->IPersistMoniker_iface; - else if(IsEqualGUID(&IID_IPersistFile, riid)) - *ppv = &This->IPersistFile_iface; - else if(IsEqualGUID(&IID_IMonikerProp, riid)) - *ppv = &This->IMonikerProp_iface; - else if(IsEqualGUID(&IID_IPersistStreamInit, riid)) - *ppv = &This->IPersistStreamInit_iface; - else if(IsEqualGUID(&IID_IPersistHistory, riid)) - *ppv = &This->IPersistHistory_iface; - else if(IsEqualGUID(&IID_IHlinkTarget, riid)) - *ppv = &This->IHlinkTarget_iface; - else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) - *ppv = &This->IOleCommandTarget_iface; - else if(IsEqualGUID(&IID_IOleObject, riid)) - *ppv = &This->IOleObject_iface; - else if(IsEqualGUID(&IID_IOleDocument, riid)) - *ppv = &This->IOleDocument_iface; - else if(IsEqualGUID(&IID_IOleInPlaceActiveObject, riid)) - *ppv = &This->IOleInPlaceActiveObject_iface; - else if(IsEqualGUID(&IID_IOleWindow, riid)) - *ppv = &This->IOleInPlaceActiveObject_iface; - else if(IsEqualGUID(&IID_IOleInPlaceObject, riid)) - *ppv = &This->IOleInPlaceObjectWindowless_iface; - else if(IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) - *ppv = &This->IOleInPlaceObjectWindowless_iface; - else if(IsEqualGUID(&IID_IOleControl, riid)) - *ppv = &This->IOleControl_iface; - else if(IsEqualGUID(&IID_IObjectWithSite, riid)) - *ppv = &This->IObjectWithSite_iface; - else if(IsEqualGUID(&IID_IOleContainer, riid)) - *ppv = &This->IOleContainer_iface; - else if(IsEqualGUID(&IID_IObjectSafety, riid)) - *ppv = &This->IObjectSafety_iface; - else if(IsEqualGUID(&IID_IServiceProvider, riid)) - *ppv = &This->IServiceProvider_iface; - else if(IsEqualGUID(&IID_IInternetHostSecurityManager, riid)) - *ppv = &This->IInternetHostSecurityManager_iface; - else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) - *ppv = &This->cp_container.IConnectionPointContainer_iface; - else if(IsEqualGUID(&CLSID_CMarkup, riid)) { - FIXME("(%p)->(CLSID_CMarkup %p)\n", This, ppv); - *ppv = NULL; - return E_NOINTERFACE; + return &This->IHTMLDocument2_iface; + if(IsEqualGUID(&IID_IDispatch, riid) || IsEqualGUID(&IID_IDispatchEx, riid)) + return &This->IDispatchEx_iface; + if(IsEqualGUID(&IID_IHTMLDocument, riid) || IsEqualGUID(&IID_IHTMLDocument2, riid)) + return &This->IHTMLDocument2_iface; + if(IsEqualGUID(&IID_IHTMLDocument3, riid)) + return &This->IHTMLDocument3_iface; + if(IsEqualGUID(&IID_IHTMLDocument4, riid)) + return &This->IHTMLDocument4_iface; + if(IsEqualGUID(&IID_IHTMLDocument5, riid)) + return &This->IHTMLDocument5_iface; + if(IsEqualGUID(&IID_IHTMLDocument6, riid)) + return &This->IHTMLDocument6_iface; + if(IsEqualGUID(&IID_IHTMLDocument7, riid)) + return &This->IHTMLDocument7_iface; + if(IsEqualGUID(&IID_IDocumentSelector, riid)) + return &This->IDocumentSelector_iface; + if(IsEqualGUID(&IID_IDocumentEvent, riid)) + return &This->IDocumentEvent_iface; + if(IsEqualGUID(&DIID_DispHTMLDocument, riid)) + return &This->IHTMLDocument2_iface; + if(IsEqualGUID(&IID_ISupportErrorInfo, riid)) + return &This->ISupportErrorInfo_iface; + if(IsEqualGUID(&IID_IProvideClassInfo, riid)) + return &This->IProvideMultipleClassInfo_iface; + if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) + return &This->IProvideMultipleClassInfo_iface; + if(IsEqualGUID(&IID_IProvideMultipleClassInfo, riid)) + return &This->IProvideMultipleClassInfo_iface; + if(IsEqualGUID(&IID_IMarkupServices, riid)) + return &This->IMarkupServices_iface; + if(IsEqualGUID(&IID_IMarkupContainer, riid)) + return &This->IMarkupContainer_iface; + if(IsEqualGUID(&IID_IDisplayServices, riid)) + return &This->IDisplayServices_iface; + if(IsEqualGUID(&IID_IDocumentRange, riid)) + return &This->IDocumentRange_iface; + if(IsEqualGUID(&IID_IPersist, riid)) + return &This->IPersistFile_iface; + if(IsEqualGUID(&IID_IPersistMoniker, riid)) + return &This->IPersistMoniker_iface; + if(IsEqualGUID(&IID_IPersistFile, riid)) + return &This->IPersistFile_iface; + if(IsEqualGUID(&IID_IMonikerProp, riid)) + return &This->IMonikerProp_iface; + if(IsEqualGUID(&IID_IPersistStreamInit, riid)) + return &This->IPersistStreamInit_iface; + if(IsEqualGUID(&IID_IPersistHistory, riid)) + return &This->IPersistHistory_iface; + if(IsEqualGUID(&IID_IHlinkTarget, riid)) + return &This->IHlinkTarget_iface; + if(IsEqualGUID(&IID_IOleCommandTarget, riid)) + return &This->IOleCommandTarget_iface; + if(IsEqualGUID(&IID_IOleObject, riid)) + return &This->IOleObject_iface; + if(IsEqualGUID(&IID_IOleDocument, riid)) + return &This->IOleDocument_iface; + if(IsEqualGUID(&IID_IOleInPlaceActiveObject, riid)) + return &This->IOleInPlaceActiveObject_iface; + if(IsEqualGUID(&IID_IOleWindow, riid)) + return &This->IOleInPlaceActiveObject_iface; + if(IsEqualGUID(&IID_IOleInPlaceObject, riid)) + return &This->IOleInPlaceObjectWindowless_iface; + if(IsEqualGUID(&IID_IOleInPlaceObjectWindowless, riid)) + return &This->IOleInPlaceObjectWindowless_iface; + if(IsEqualGUID(&IID_IOleControl, riid)) + return &This->IOleControl_iface; + if(IsEqualGUID(&IID_IObjectWithSite, riid)) + return &This->IObjectWithSite_iface; + if(IsEqualGUID(&IID_IOleContainer, riid)) + return &This->IOleContainer_iface; + if(IsEqualGUID(&IID_IObjectSafety, riid)) + return &This->IObjectSafety_iface; + if(IsEqualGUID(&IID_IServiceProvider, riid)) + return &This->IServiceProvider_iface; + if(IsEqualGUID(&IID_IInternetHostSecurityManager, riid)) + return &This->IInternetHostSecurityManager_iface; + if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) + return &This->cp_container.IConnectionPointContainer_iface; + if(IsEqualGUID(&CLSID_CMarkup, riid)) { + FIXME("(%p)->(CLSID_CMarkup)\n", This); + return NULL; }else if(IsEqualGUID(&IID_IRunnableObject, riid)) { - TRACE("(%p)->(IID_IRunnableObject %p) returning NULL\n", This, ppv); - *ppv = NULL; - return E_NOINTERFACE; + return NULL; }else if(IsEqualGUID(&IID_IPersistPropertyBag, riid)) { - TRACE("(%p)->(IID_IPersistPropertyBag %p) returning NULL\n", This, ppv); - *ppv = NULL; - return E_NOINTERFACE; + return NULL; }else if(IsEqualGUID(&IID_IExternalConnection, riid)) { - TRACE("(%p)->(IID_IExternalConnection %p) returning NULL\n", This, ppv); - *ppv = NULL; - return E_NOINTERFACE; + return NULL; }else if(IsEqualGUID(&IID_IStdMarshalInfo, riid)) { - TRACE("(%p)->(IID_IStdMarshalInfo %p) returning NULL\n", This, ppv); - *ppv = NULL; - return E_NOINTERFACE; - }else { - return HTMLDOMNode_QI(&This->node, riid, ppv); + return NULL; }
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLDOMNode_QI(&This->node, riid); }
void detach_document_node(HTMLDocumentNode *doc) diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 991f960f0ca..af6551cc9fc 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -6807,48 +6807,44 @@ static inline HTMLElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLElement, node); }
-HRESULT HTMLElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +void *HTMLElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLElement *This = impl_from_HTMLDOMNode(iface);
- if(IsEqualGUID(&IID_IUnknown, riid)) { - *ppv = &This->IHTMLElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - *ppv = &This->IHTMLElement_iface; - }else if(IsEqualGUID(&IID_IHTMLElement, riid)) { - *ppv = &This->IHTMLElement_iface; - }else if(IsEqualGUID(&IID_IHTMLElement2, riid)) { - *ppv = &This->IHTMLElement2_iface; - }else if(IsEqualGUID(&IID_IHTMLElement3, riid)) { - *ppv = &This->IHTMLElement3_iface; - }else if(IsEqualGUID(&IID_IHTMLElement4, riid)) { - *ppv = &This->IHTMLElement4_iface; - }else if(IsEqualGUID(&IID_IHTMLElement6, riid)) { - *ppv = &This->IHTMLElement6_iface; - }else if(IsEqualGUID(&IID_IHTMLElement7, riid)) { - *ppv = &This->IHTMLElement7_iface; - }else if(IsEqualGUID(&IID_IHTMLUniqueName, riid)) { - *ppv = &This->IHTMLUniqueName_iface; - }else if(IsEqualGUID(&IID_IElementSelector, riid)) { - *ppv = &This->IElementSelector_iface; - }else if(IsEqualGUID(&IID_IElementTraversal, riid)) { - *ppv = &This->IElementTraversal_iface; - }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) { - *ppv = &This->cp_container.IConnectionPointContainer_iface; - }else if(IsEqualGUID(&IID_IProvideClassInfo, riid)) { - *ppv = &This->IProvideMultipleClassInfo_iface; - }else if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) { - *ppv = &This->IProvideMultipleClassInfo_iface; - }else if(IsEqualGUID(&IID_IProvideMultipleClassInfo, riid)) { - *ppv = &This->IProvideMultipleClassInfo_iface; - }else if(IsEqualGUID(&IID_IWineHTMLElementPrivate, riid)) { - *ppv = &This->IWineHTMLElementPrivate_iface; - }else { - return HTMLDOMNode_QI(&This->node, riid, ppv); - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLElement_iface; + if(IsEqualGUID(&IID_IHTMLElement, riid)) + return &This->IHTMLElement_iface; + if(IsEqualGUID(&IID_IHTMLElement2, riid)) + return &This->IHTMLElement2_iface; + if(IsEqualGUID(&IID_IHTMLElement3, riid)) + return &This->IHTMLElement3_iface; + if(IsEqualGUID(&IID_IHTMLElement4, riid)) + return &This->IHTMLElement4_iface; + if(IsEqualGUID(&IID_IHTMLElement6, riid)) + return &This->IHTMLElement6_iface; + if(IsEqualGUID(&IID_IHTMLElement7, riid)) + return &This->IHTMLElement7_iface; + if(IsEqualGUID(&IID_IHTMLUniqueName, riid)) + return &This->IHTMLUniqueName_iface; + if(IsEqualGUID(&IID_IElementSelector, riid)) + return &This->IElementSelector_iface; + if(IsEqualGUID(&IID_IElementTraversal, riid)) + return &This->IElementTraversal_iface; + if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) + return &This->cp_container.IConnectionPointContainer_iface; + if(IsEqualGUID(&IID_IProvideClassInfo, riid)) + return &This->IProvideMultipleClassInfo_iface; + if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) + return &This->IProvideMultipleClassInfo_iface; + if(IsEqualGUID(&IID_IProvideMultipleClassInfo, riid)) + return &This->IProvideMultipleClassInfo_iface; + if(IsEqualGUID(&IID_IWineHTMLElementPrivate, riid)) + return &This->IWineHTMLElementPrivate_iface; + + return HTMLDOMNode_QI(&This->node, riid); }
void HTMLElement_destructor(HTMLDOMNode *iface) diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c index b8497fd224d..86c176f9eb1 100644 --- a/dlls/mshtml/htmlform.c +++ b/dlls/mshtml/htmlform.c @@ -773,32 +773,20 @@ static inline HTMLFormElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLFormElement, element.node); }
-static HRESULT HTMLFormElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLFormElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLFormElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLFormElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLFormElement_iface; + if(IsEqualGUID(&IID_IHTMLFormElement, riid)) + return &This->IHTMLFormElement_iface; + if(IsEqualGUID(&DIID_DispHTMLFormElement, riid)) + return &This->IHTMLFormElement_iface;
- if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLFormElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLFormElement_iface; - }else if(IsEqualGUID(&IID_IHTMLFormElement, riid)) { - TRACE("(%p)->(IID_IHTMLFormElement %p)\n", This, ppv); - *ppv = &This->IHTMLFormElement_iface; - }else if(IsEqualGUID(&DIID_DispHTMLFormElement, riid)) { - TRACE("(%p)->(DIID_DispHTMLFormElement %p)\n", This, ppv); - *ppv = &This->IHTMLFormElement_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } - - return HTMLElement_QI(&This->element.node, riid, ppv); + return HTMLElement_QI(&This->element.node, riid); }
static HRESULT HTMLFormElement_get_dispid(HTMLDOMNode *iface, diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c index e5e43e55c65..a97040d270d 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -700,20 +700,14 @@ static const IHTMLFrameBase2Vtbl HTMLFrameBase2Vtbl = { HTMLFrameBase2_get_allowTransparency };
-static HRESULT HTMLFrameBase_QI(HTMLFrameBase *This, REFIID riid, void **ppv) -{ - if(IsEqualGUID(&IID_IHTMLFrameBase, riid)) { - TRACE("(%p)->(IID_IHTMLFrameBase %p)\n", This, ppv); - *ppv = &This->IHTMLFrameBase_iface; - }else if(IsEqualGUID(&IID_IHTMLFrameBase2, riid)) { - TRACE("(%p)->(IID_IHTMLFrameBase2 %p)\n", This, ppv); - *ppv = &This->IHTMLFrameBase2_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } +static void *HTMLFrameBase_QI(HTMLFrameBase *This, REFIID riid) +{ + if(IsEqualGUID(&IID_IHTMLFrameBase, riid)) + return &This->IHTMLFrameBase_iface; + if(IsEqualGUID(&IID_IHTMLFrameBase2, riid)) + return &This->IHTMLFrameBase2_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLFrameBase_destructor(HTMLFrameBase *This) @@ -893,19 +887,14 @@ static inline HTMLFrameElement *frame_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLFrameElement, framebase.element.node); }
-static HRESULT HTMLFrameElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLFrameElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLFrameElement *This = frame_from_HTMLDOMNode(iface);
- if(IsEqualGUID(&IID_IHTMLFrameElement3, riid)) { - TRACE("(%p)->(IID_IHTMLFrameElement3 %p)\n", This, ppv); - *ppv = &This->IHTMLFrameElement3_iface; - }else { - return HTMLFrameBase_QI(&This->framebase, riid, ppv); - } + if(IsEqualGUID(&IID_IHTMLFrameElement3, riid)) + return &This->IHTMLFrameElement3_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLFrameBase_QI(&This->framebase, riid); }
static void HTMLFrameElement_destructor(HTMLDOMNode *iface) @@ -1471,25 +1460,18 @@ static inline HTMLIFrame *iframe_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLIFrame, framebase.element.node); }
-static HRESULT HTMLIFrame_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLIFrame_QI(HTMLDOMNode *iface, REFIID riid) { HTMLIFrame *This = iframe_from_HTMLDOMNode(iface);
- if(IsEqualGUID(&IID_IHTMLIFrameElement, riid)) { - TRACE("(%p)->(IID_IHTMLIFrameElement %p)\n", This, ppv); - *ppv = &This->IHTMLIFrameElement_iface; - }else if(IsEqualGUID(&IID_IHTMLIFrameElement2, riid)) { - TRACE("(%p)->(IID_IHTMLIFrameElement2 %p)\n", This, ppv); - *ppv = &This->IHTMLIFrameElement2_iface; - }else if(IsEqualGUID(&IID_IHTMLIFrameElement3, riid)) { - TRACE("(%p)->(IID_IHTMLIFrameElement3 %p)\n", This, ppv); - *ppv = &This->IHTMLIFrameElement3_iface; - }else { - return HTMLFrameBase_QI(&This->framebase, riid, ppv); - } + if(IsEqualGUID(&IID_IHTMLIFrameElement, riid)) + return &This->IHTMLIFrameElement_iface; + if(IsEqualGUID(&IID_IHTMLIFrameElement2, riid)) + return &This->IHTMLIFrameElement2_iface; + if(IsEqualGUID(&IID_IHTMLIFrameElement3, riid)) + return &This->IHTMLIFrameElement3_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLFrameBase_QI(&This->framebase, riid); }
static void HTMLIFrame_destructor(HTMLDOMNode *iface) diff --git a/dlls/mshtml/htmlgeneric.c b/dlls/mshtml/htmlgeneric.c index 5836ebd208a..7cae4026c47 100644 --- a/dlls/mshtml/htmlgeneric.c +++ b/dlls/mshtml/htmlgeneric.c @@ -128,21 +128,14 @@ static inline HTMLGenericElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLGenericElement, element.node); }
-static HRESULT HTMLGenericElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLGenericElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLGenericElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; + if(IsEqualGUID(&IID_IHTMLGenericElement, riid)) + return &This->IHTMLGenericElement_iface;
- if(IsEqualGUID(&IID_IHTMLGenericElement, riid)) { - TRACE("(%p)->(IID_IHTMLGenericElement %p)\n", This, ppv); - *ppv = &This->IHTMLGenericElement_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLGenericElement_destructor(HTMLDOMNode *iface) diff --git a/dlls/mshtml/htmlhead.c b/dlls/mshtml/htmlhead.c index e11e0f05f7e..4703553e818 100644 --- a/dlls/mshtml/htmlhead.c +++ b/dlls/mshtml/htmlhead.c @@ -146,19 +146,14 @@ static inline HTMLTitleElement *HTMLTitleElement_from_HTMLDOMNode(HTMLDOMNode *i return CONTAINING_RECORD(iface, HTMLTitleElement, element.node); }
-static HRESULT HTMLTitleElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLTitleElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLTitleElement *This = HTMLTitleElement_from_HTMLDOMNode(iface);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - if(IsEqualGUID(&IID_IHTMLTitleElement, riid)) - *ppv = &This->IHTMLTitleElement_iface; - else - return HTMLElement_QI(&This->element.node, riid, ppv); + return &This->IHTMLTitleElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLTitleElement_destructor(HTMLDOMNode *iface) @@ -308,19 +303,14 @@ static inline HTMLHtmlElement *HTMLHtmlElement_from_HTMLDOMNode(HTMLDOMNode *ifa return CONTAINING_RECORD(iface, HTMLHtmlElement, element.node); }
-static HRESULT HTMLHtmlElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLHtmlElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLHtmlElement *This = HTMLHtmlElement_from_HTMLDOMNode(iface);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - if(IsEqualGUID(&IID_IHTMLHtmlElement, riid)) - *ppv = &This->IHTMLHtmlElement_iface; - else - return HTMLElement_QI(&This->element.node, riid, ppv); + return &This->IHTMLHtmlElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLHtmlElement_destructor(HTMLDOMNode *iface) @@ -549,25 +539,18 @@ static inline HTMLMetaElement *HTMLMetaElement_from_HTMLDOMNode(HTMLDOMNode *ifa return CONTAINING_RECORD(iface, HTMLMetaElement, element.node); }
-static HRESULT HTMLMetaElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLMetaElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLMetaElement *This = HTMLMetaElement_from_HTMLDOMNode(iface);
- if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLMetaElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLMetaElement_iface; - }else if(IsEqualGUID(&IID_IHTMLMetaElement, riid)) { - TRACE("(%p)->(IID_IHTMLMetaElement %p)\n", This, ppv); - *ppv = &This->IHTMLMetaElement_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLMetaElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLMetaElement_iface; + if(IsEqualGUID(&IID_IHTMLMetaElement, riid)) + return &This->IHTMLMetaElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLMetaElement_destructor(HTMLDOMNode *iface) @@ -718,21 +701,16 @@ static inline HTMLHeadElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLHeadElement, element.node); }
-static HRESULT HTMLHeadElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLHeadElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLHeadElement *This = impl_from_HTMLDOMNode(iface);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - if(IsEqualGUID(&IID_IHTMLHeadElement, riid)) - *ppv = &This->IHTMLHeadElement_iface; - else if(IsEqualGUID(&DIID_DispHTMLHeadElement, riid)) - *ppv = &This->IHTMLHeadElement_iface; - else - return HTMLElement_QI(&This->element.node, riid, ppv); + return &This->IHTMLHeadElement_iface; + if(IsEqualGUID(&DIID_DispHTMLHeadElement, riid)) + return &This->IHTMLHeadElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLHeadElement_destructor(HTMLDOMNode *iface) diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c index b8d20fdbf91..554df3e6b1e 100644 --- a/dlls/mshtml/htmlimg.c +++ b/dlls/mshtml/htmlimg.c @@ -658,21 +658,14 @@ static inline HTMLImg *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLImg, element.node); }
-static HRESULT HTMLImgElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLImgElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLImg *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; + if(IsEqualGUID(&IID_IHTMLImgElement, riid)) + return &This->IHTMLImgElement_iface;
- if(IsEqualGUID(&IID_IHTMLImgElement, riid)) { - TRACE("(%p)->(IID_IHTMLImgElement %p)\n", This, ppv); - *ppv = &This->IHTMLImgElement_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static HRESULT HTMLImgElement_get_readystate(HTMLDOMNode *iface, BSTR *p) diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c index d71e5e0a5d5..a317eb2a3a4 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -1344,35 +1344,22 @@ static inline HTMLInputElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLInputElement, element.node); }
-static HRESULT HTMLInputElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLInputElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLInputElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLInputElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLInputElement_iface; - }else if(IsEqualGUID(&IID_IHTMLInputElement, riid)) { - TRACE("(%p)->(IID_IHTMLInputElement %p)\n", This, ppv); - *ppv = &This->IHTMLInputElement_iface; - }else if(IsEqualGUID(&IID_IHTMLInputTextElement, riid)) { - TRACE("(%p)->(IID_IHTMLInputTextElement %p)\n", This, ppv); - *ppv = &This->IHTMLInputTextElement_iface; - }else if(IsEqualGUID(&IID_IHTMLInputTextElement2, riid)) { - TRACE("(%p)->(IID_IHTMLInputTextElement2 %p)\n", This, ppv); - *ppv = &This->IHTMLInputTextElement2_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLInputElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLInputElement_iface; + if(IsEqualGUID(&IID_IHTMLInputElement, riid)) + return &This->IHTMLInputElement_iface; + if(IsEqualGUID(&IID_IHTMLInputTextElement, riid)) + return &This->IHTMLInputTextElement_iface; + if(IsEqualGUID(&IID_IHTMLInputTextElement2, riid)) + return &This->IHTMLInputTextElement2_iface;
- return HTMLElement_QI(&This->element.node, riid, ppv); + return HTMLElement_QI(&This->element.node, riid); }
static HRESULT HTMLInputElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v) @@ -1602,24 +1589,16 @@ static inline HTMLLabelElement *label_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLLabelElement, element.node); }
-static HRESULT HTMLLabelElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLLabelElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLLabelElement *This = label_from_HTMLDOMNode(iface);
- *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLLabelElement_iface; - }else if(IsEqualGUID(&IID_IHTMLLabelElement, riid)) { - TRACE("(%p)->(IID_IHTMLLabelElement %p)\n", This, ppv); - *ppv = &This->IHTMLLabelElement_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLLabelElement_iface; + if(IsEqualGUID(&IID_IHTMLLabelElement, riid)) + return &This->IHTMLLabelElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static const NodeImplVtbl HTMLLabelElementImplVtbl = { @@ -1901,24 +1880,16 @@ static inline HTMLButtonElement *button_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLButtonElement, element.node); }
-static HRESULT HTMLButtonElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLButtonElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLButtonElement *This = button_from_HTMLDOMNode(iface);
- *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLButtonElement_iface; - }else if(IsEqualGUID(&IID_IHTMLButtonElement, riid)) { - TRACE("(%p)->(IID_IHTMLButtonElement %p)\n", This, ppv); - *ppv = &This->IHTMLButtonElement_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLButtonElement_iface; + if(IsEqualGUID(&IID_IHTMLButtonElement, riid)) + return &This->IHTMLButtonElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static HRESULT HTMLButtonElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v) diff --git a/dlls/mshtml/htmllink.c b/dlls/mshtml/htmllink.c index a13024f61cc..3edc36ed96b 100644 --- a/dlls/mshtml/htmllink.c +++ b/dlls/mshtml/htmllink.c @@ -374,19 +374,14 @@ static inline HTMLLinkElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLLinkElement, element.node); }
-static HRESULT HTMLLinkElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLLinkElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLLinkElement *This = impl_from_HTMLDOMNode(iface);
- if(IsEqualGUID(&IID_IHTMLLinkElement, riid)) { - TRACE("(%p)->(IID_IHTMLLinkElement %p)\n", This, ppv); - *ppv = &This->IHTMLLinkElement_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } + if(IsEqualGUID(&IID_IHTMLLinkElement, riid)) + return &This->IHTMLLinkElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static HRESULT HTMLLinkElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v) diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index b7cd30c8c74..d9c955691d5 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -493,7 +493,18 @@ static HRESULT WINAPI HTMLDOMNode_QueryInterface(IHTMLDOMNode *iface, { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface);
- return This->vtbl->qi(This, riid, ppv); + /* FIXME: Get rid of this when dispex handles QI */ + if(IsEqualGUID(&IID_nsXPCOMCycleCollectionParticipant, riid) || IsEqualGUID(&IID_nsCycleCollectionISupports, riid)) { + dispex_query_interface(&This->event_target.dispex, riid, ppv); + return S_OK; + } + + if((*ppv = This->vtbl->qi(This, riid))) { + IHTMLDOMNode_AddRef(&This->IHTMLDOMNode_iface); + return S_OK; + } + + return E_NOINTERFACE; }
static ULONG WINAPI HTMLDOMNode_AddRef(IHTMLDOMNode *iface) @@ -1464,26 +1475,28 @@ void HTMLDOMNode_destructor(DispatchEx *dispex) free(This); }
-HRESULT HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid, void **ppv) +void *HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid) { - TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); + IUnknown *unk; + HRESULT hres;
- if(IsEqualGUID(&IID_IUnknown, riid)) { - *ppv = &This->IHTMLDOMNode_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - *ppv = &This->IHTMLDOMNode_iface; - }else if(IsEqualGUID(&IID_IHTMLDOMNode, riid)) { - *ppv = &This->IHTMLDOMNode_iface; - }else if(IsEqualGUID(&IID_IHTMLDOMNode2, riid)) { - *ppv = &This->IHTMLDOMNode2_iface; - }else if(IsEqualGUID(&IID_IHTMLDOMNode3, riid)) { - *ppv = &This->IHTMLDOMNode3_iface; - }else { - return EventTarget_QI(&This->event_target, riid, ppv); - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLDOMNode_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLDOMNode_iface; + if(IsEqualGUID(&IID_IHTMLDOMNode, riid)) + return &This->IHTMLDOMNode_iface; + if(IsEqualGUID(&IID_IHTMLDOMNode2, riid)) + return &This->IHTMLDOMNode2_iface; + if(IsEqualGUID(&IID_IHTMLDOMNode3, riid)) + return &This->IHTMLDOMNode3_iface; + + hres = EventTarget_QI(&This->event_target, riid, (void**)&unk); + if(hres != S_OK) + return NULL;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + IUnknown_Release(unk); + return unk; }
static HRESULT HTMLDOMNode_clone(HTMLDOMNode *This, nsIDOMNode *nsnode, HTMLDOMNode **ret) diff --git a/dlls/mshtml/htmlobject.c b/dlls/mshtml/htmlobject.c index 5d5e5e9ec33..9ded29ffc83 100644 --- a/dlls/mshtml/htmlobject.c +++ b/dlls/mshtml/htmlobject.c @@ -637,50 +637,43 @@ static inline HTMLObjectElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLObjectElement, plugin_container.element.node); }
-static HRESULT HTMLObjectElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLObjectElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLObjectElement *This = impl_from_HTMLDOMNode(iface); + void *elem_iface; + + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLObjectElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLObjectElement_iface; + if(IsEqualGUID(&IID_IHTMLObjectElement, riid)) + return &This->IHTMLObjectElement_iface; + if(IsEqualGUID(&IID_IHTMLObjectElement2, riid)) + return &This->IHTMLObjectElement2_iface; + if(IsEqualGUID(&IID_HTMLPluginContainer, riid)) { + /* Special pseudo-interface returning HTMLPluginContainer struct. */ + return &This->plugin_container; + }
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - - if(IsEqualGUID(&IID_IUnknown, riid)) { - *ppv = &This->IHTMLObjectElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - *ppv = &This->IHTMLObjectElement_iface; - }else if(IsEqualGUID(&IID_IHTMLObjectElement, riid)) { - *ppv = &This->IHTMLObjectElement_iface; - }else if(IsEqualGUID(&IID_IHTMLObjectElement2, riid)) { - *ppv = &This->IHTMLObjectElement2_iface; - }else if(IsEqualGUID(&IID_HTMLPluginContainer, riid)) { - /* Special pseudo-interface returning HTMLPluginContainse struct. */ - *ppv = &This->plugin_container; - node_addref(&This->plugin_container.element.node); - return S_OK; - }else { - HRESULT hres; - - hres = HTMLElement_QI(&This->plugin_container.element.node, riid, ppv); - if(hres == E_NOINTERFACE && This->plugin_container.plugin_host && This->plugin_container.plugin_host->plugin_unk) { - IUnknown *plugin_iface, *ret; - - hres = IUnknown_QueryInterface(This->plugin_container.plugin_host->plugin_unk, riid, (void**)&plugin_iface); - if(hres == S_OK) { - hres = wrap_iface(plugin_iface, (IUnknown*)&This->IHTMLObjectElement_iface, &ret); - IUnknown_Release(plugin_iface); - if(FAILED(hres)) - return hres; - - TRACE("returning plugin iface %p wrapped to %p\n", plugin_iface, ret); - *ppv = ret; - return S_OK; + elem_iface = HTMLElement_QI(&This->plugin_container.element.node, riid); + if(!elem_iface && This->plugin_container.plugin_host && This->plugin_container.plugin_host->plugin_unk) { + IUnknown *plugin_iface, *ret; + HRESULT hres = IUnknown_QueryInterface(This->plugin_container.plugin_host->plugin_unk, riid, (void**)&plugin_iface); + + if(hres == S_OK) { + hres = wrap_iface(plugin_iface, (IUnknown*)&This->IHTMLObjectElement_iface, &ret); + IUnknown_Release(plugin_iface); + if(FAILED(hres)) { + ERR("wrap_iface failed: %08lx\n", hres); + return NULL; } - }
- return hres; + TRACE("returning plugin iface %p wrapped to %p\n", plugin_iface, ret); + return ret; + } }
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return elem_iface; }
static void HTMLObjectElement_destructor(HTMLDOMNode *iface) @@ -986,24 +979,18 @@ static inline HTMLEmbed *embed_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLEmbed, element.node); }
-static HRESULT HTMLEmbedElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLEmbedElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLEmbed *This = embed_from_HTMLDOMNode(iface);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLEmbedElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLEmbedElement_iface; + if(IsEqualGUID(&IID_IHTMLEmbedElement, riid)) + return &This->IHTMLEmbedElement_iface;
- if(IsEqualGUID(&IID_IUnknown, riid)) { - *ppv = &This->IHTMLEmbedElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - *ppv = &This->IHTMLEmbedElement_iface; - }else if(IsEqualGUID(&IID_IHTMLEmbedElement, riid)) { - *ppv = &This->IHTMLEmbedElement_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLEmbedElement_destructor(HTMLDOMNode *iface) diff --git a/dlls/mshtml/htmlscript.c b/dlls/mshtml/htmlscript.c index 7a9655150f8..84dd77dc13d 100644 --- a/dlls/mshtml/htmlscript.c +++ b/dlls/mshtml/htmlscript.c @@ -354,29 +354,18 @@ static inline HTMLScriptElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLScriptElement, element.node); }
-static HRESULT HTMLScriptElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLScriptElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLScriptElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLScriptElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLScriptElement_iface; - }else if(IsEqualGUID(&IID_IHTMLScriptElement, riid)) { - TRACE("(%p)->(IID_IHTMLScriptElement %p)\n", This, ppv); - *ppv = &This->IHTMLScriptElement_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLScriptElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLScriptElement_iface; + if(IsEqualGUID(&IID_IHTMLScriptElement, riid)) + return &This->IHTMLScriptElement_iface;
- return HTMLElement_QI(&This->element.node, riid, ppv); + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLScriptElement_destructor(HTMLDOMNode *iface) diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c index 5096ffafec7..808f91d6910 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -346,29 +346,18 @@ static inline HTMLOptionElement *HTMLOptionElement_from_HTMLDOMNode(HTMLDOMNode return CONTAINING_RECORD(iface, HTMLOptionElement, element.node); }
-static HRESULT HTMLOptionElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLOptionElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLOptionElement *This = HTMLOptionElement_from_HTMLDOMNode(iface);
- *ppv = NULL; + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLOptionElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLOptionElement_iface; + if(IsEqualGUID(&IID_IHTMLOptionElement, riid)) + return &This->IHTMLOptionElement_iface;
- if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLOptionElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLOptionElement_iface; - }else if(IsEqualGUID(&IID_IHTMLOptionElement, riid)) { - TRACE("(%p)->(IID_IHTMLOptionElement %p)\n", This, ppv); - *ppv = &This->IHTMLOptionElement_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } - - return HTMLElement_QI(&This->element.node, riid, ppv); + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLOptionElement_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb) @@ -1326,29 +1315,18 @@ static inline HTMLSelectElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLSelectElement, element.node); }
-static HRESULT HTMLSelectElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLSelectElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLSelectElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLSelectElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLSelectElement_iface; - }else if(IsEqualGUID(&IID_IHTMLSelectElement, riid)) { - TRACE("(%p)->(IID_IHTMLSelectElement %p)\n", This, ppv); - *ppv = &This->IHTMLSelectElement_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLSelectElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLSelectElement_iface; + if(IsEqualGUID(&IID_IHTMLSelectElement, riid)) + return &This->IHTMLSelectElement_iface;
- return HTMLElement_QI(&This->element.node, riid, ppv); + return HTMLElement_QI(&This->element.node, riid); }
static HRESULT HTMLSelectElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v) diff --git a/dlls/mshtml/htmlstyleelem.c b/dlls/mshtml/htmlstyleelem.c index 7f6eeb0132b..d030a81042d 100644 --- a/dlls/mshtml/htmlstyleelem.c +++ b/dlls/mshtml/htmlstyleelem.c @@ -365,28 +365,20 @@ static inline HTMLStyleElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLStyleElement, element.node); }
-static HRESULT HTMLStyleElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLStyleElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLStyleElement *This = impl_from_HTMLDOMNode(iface);
- if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLStyleElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLStyleElement_iface; - }else if(IsEqualGUID(&IID_IHTMLStyleElement, riid)) { - TRACE("(%p)->(IID_IHTMLStyleElement %p)\n", This, ppv); - *ppv = &This->IHTMLStyleElement_iface; - }else if(IsEqualGUID(&IID_IHTMLStyleElement2, riid)) { - TRACE("(%p)->(IID_IHTMLStyleElement2 %p)\n", This, ppv); - *ppv = &This->IHTMLStyleElement2_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLStyleElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLStyleElement_iface; + if(IsEqualGUID(&IID_IHTMLStyleElement, riid)) + return &This->IHTMLStyleElement_iface; + if(IsEqualGUID(&IID_IHTMLStyleElement2, riid)) + return &This->IHTMLStyleElement2_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLStyleElement_destructor(HTMLDOMNode *iface) diff --git a/dlls/mshtml/htmltable.c b/dlls/mshtml/htmltable.c index 7f4c4fafb0e..90fb255203b 100644 --- a/dlls/mshtml/htmltable.c +++ b/dlls/mshtml/htmltable.c @@ -446,25 +446,18 @@ static inline HTMLTableCell *HTMLTableCell_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLTableCell, element.node); }
-static HRESULT HTMLTableCell_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLTableCell_QI(HTMLDOMNode *iface, REFIID riid) { HTMLTableCell *This = HTMLTableCell_from_HTMLDOMNode(iface);
- if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLTableCell_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLTableCell_iface; - }else if(IsEqualGUID(&IID_IHTMLTableCell, riid)) { - TRACE("(%p)->(IID_IHTMLTableCell %p)\n", This, ppv); - *ppv = &This->IHTMLTableCell_iface; - }else { - return HTMLElement_QI(&This->element.node, riid, ppv); - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLTableCell_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLTableCell_iface; + if(IsEqualGUID(&IID_IHTMLTableCell, riid)) + return &This->IHTMLTableCell_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLTableCell_destructor(HTMLDOMNode *iface) @@ -880,29 +873,18 @@ static inline HTMLTableRow *HTMLTableRow_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLTableRow, element.node); }
-static HRESULT HTMLTableRow_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLTableRow_QI(HTMLDOMNode *iface, REFIID riid) { HTMLTableRow *This = HTMLTableRow_from_HTMLDOMNode(iface);
- *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLTableRow_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLTableRow_iface; - }else if(IsEqualGUID(&IID_IHTMLTableRow, riid)) { - TRACE("(%p)->(IID_IHTMLTableRow %p)\n", This, ppv); - *ppv = &This->IHTMLTableRow_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLTableRow_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLTableRow_iface; + if(IsEqualGUID(&IID_IHTMLTableRow, riid)) + return &This->IHTMLTableRow_iface;
- return HTMLElement_QI(&This->element.node, riid, ppv); + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLTableRow_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb) @@ -1885,35 +1867,22 @@ static inline HTMLTable *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLTable, element.node); }
-static HRESULT HTMLTable_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLTable_QI(HTMLDOMNode *iface, REFIID riid) { HTMLTable *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLTable_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLTable_iface; - }else if(IsEqualGUID(&IID_IHTMLTable, riid)) { - TRACE("(%p)->(IID_IHTMLTable %p)\n", This, ppv); - *ppv = &This->IHTMLTable_iface; - }else if(IsEqualGUID(&IID_IHTMLTable2, riid)) { - TRACE("(%p)->(IID_IHTMLTable2 %p)\n", This, ppv); - *ppv = &This->IHTMLTable2_iface; - }else if(IsEqualGUID(&IID_IHTMLTable3, riid)) { - TRACE("(%p)->(IID_IHTMLTable3 %p)\n", This, ppv); - *ppv = &This->IHTMLTable3_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } - - return HTMLElement_QI(&This->element.node, riid, ppv); + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLTable_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLTable_iface; + if(IsEqualGUID(&IID_IHTMLTable, riid)) + return &This->IHTMLTable_iface; + if(IsEqualGUID(&IID_IHTMLTable2, riid)) + return &This->IHTMLTable2_iface; + if(IsEqualGUID(&IID_IHTMLTable3, riid)) + return &This->IHTMLTable3_iface; + + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLTable_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb) diff --git a/dlls/mshtml/htmltextarea.c b/dlls/mshtml/htmltextarea.c index 472f2814ae4..bde78211773 100644 --- a/dlls/mshtml/htmltextarea.c +++ b/dlls/mshtml/htmltextarea.c @@ -390,29 +390,18 @@ static inline HTMLTextAreaElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLTextAreaElement, element.node); }
-static HRESULT HTMLTextAreaElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLTextAreaElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLTextAreaElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLTextAreaElement_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLTextAreaElement_iface; - }else if(IsEqualGUID(&IID_IHTMLTextAreaElement, riid)) { - TRACE("(%p)->(IID_IHTMLTextAreaElement %p)\n", This, ppv); - *ppv = &This->IHTMLTextAreaElement_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLTextAreaElement_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLTextAreaElement_iface; + if(IsEqualGUID(&IID_IHTMLTextAreaElement, riid)) + return &This->IHTMLTextAreaElement_iface;
- return HTMLElement_QI(&This->element.node, riid, ppv); + return HTMLElement_QI(&This->element.node, riid); }
static HRESULT HTMLTextAreaElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v) diff --git a/dlls/mshtml/htmltextnode.c b/dlls/mshtml/htmltextnode.c index dd4d078f055..6fd1a102612 100644 --- a/dlls/mshtml/htmltextnode.c +++ b/dlls/mshtml/htmltextnode.c @@ -324,21 +324,16 @@ static inline HTMLDOMTextNode *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLDOMTextNode, node); }
-static HRESULT HTMLDOMTextNode_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLDOMTextNode_QI(HTMLDOMNode *iface, REFIID riid) { HTMLDOMTextNode *This = impl_from_HTMLDOMNode(iface);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - if(IsEqualGUID(&IID_IHTMLDOMTextNode, riid)) - *ppv = &This->IHTMLDOMTextNode_iface; - else if(IsEqualGUID(&IID_IHTMLDOMTextNode2, riid)) - *ppv = &This->IHTMLDOMTextNode2_iface; - else - return HTMLDOMNode_QI(&This->node, riid, ppv); + return &This->IHTMLDOMTextNode_iface; + if(IsEqualGUID(&IID_IHTMLDOMTextNode2, riid)) + return &This->IHTMLDOMTextNode2_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLDOMNode_QI(&This->node, riid); }
static HRESULT HTMLDOMTextNode_clone(HTMLDOMNode *iface, nsIDOMNode *nsnode, HTMLDOMNode **ret) diff --git a/dlls/mshtml/ifacewrap.c b/dlls/mshtml/ifacewrap.c index c4cc773d024..8b4127daa52 100644 --- a/dlls/mshtml/ifacewrap.c +++ b/dlls/mshtml/ifacewrap.c @@ -337,7 +337,7 @@ HRESULT wrap_iface(IUnknown *iface, IUnknown *ref_unk, IUnknown **ret) IUnknown_AddRef(iface); wrapper->iface = iface;
- IUnknown_AddRef(ref_unk); + /* Caller AddRefs */ wrapper->ref_unk = ref_unk;
*ret = &wrapper->IUnknown_iface; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 859ce374951..dfbbd3fec83 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -818,7 +818,7 @@ struct GeckoBrowser {
typedef struct { const CLSID *clsid; - HRESULT (*qi)(HTMLDOMNode*,REFIID,void**); + void *(*qi)(HTMLDOMNode*,REFIID); void (*destructor)(HTMLDOMNode*); const cpc_entry_t *cpc_entries; HRESULT (*clone)(HTMLDOMNode*,nsIDOMNode*,HTMLDOMNode**); @@ -1210,13 +1210,13 @@ void EventTarget_Init(EventTarget*,IUnknown*,dispex_static_data_t*,compat_mode_t HRESULT EventTarget_QI(EventTarget*,REFIID,void**); void EventTarget_init_dispex_info(dispex_data_t*,compat_mode_t);
-HRESULT HTMLDOMNode_QI(HTMLDOMNode*,REFIID,void**); +void *HTMLDOMNode_QI(HTMLDOMNode*,REFIID); void HTMLDOMNode_destructor(DispatchEx*); void HTMLDOMNode_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*); void HTMLDOMNode_unlink(DispatchEx*); void HTMLDOMNode_init_dispex_info(dispex_data_t*,compat_mode_t);
-HRESULT HTMLElement_QI(HTMLDOMNode*,REFIID,void**); +void *HTMLElement_QI(HTMLDOMNode*,REFIID); void HTMLElement_destructor(HTMLDOMNode*); HRESULT HTMLElement_clone(HTMLDOMNode*,nsIDOMNode*,HTMLDOMNode**); HRESULT HTMLElement_get_attr_col(HTMLDOMNode*,HTMLAttributeCollection**); diff --git a/dlls/mshtml/svg.c b/dlls/mshtml/svg.c index 5fb83fd3597..84324cacf2d 100644 --- a/dlls/mshtml/svg.c +++ b/dlls/mshtml/svg.c @@ -177,19 +177,14 @@ static inline SVGElement *SVGElement_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, SVGElement, element.node); }
-static HRESULT SVGElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *SVGElement_QI(HTMLDOMNode *iface, REFIID riid) { SVGElement *This = SVGElement_from_HTMLDOMNode(iface);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - if(IsEqualGUID(&IID_ISVGElement, riid)) - *ppv = &This->ISVGElement_iface; - else - return HTMLElement_QI(&This->element.node, riid, ppv); + return &This->ISVGElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static const NodeImplVtbl SVGElementImplVtbl = { @@ -717,19 +712,14 @@ static inline SVGSVGElement *SVGSVGElement_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, SVGSVGElement, svg_element.element.node); }
-static HRESULT SVGSVGElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *SVGSVGElement_QI(HTMLDOMNode *iface, REFIID riid) { SVGSVGElement *This = SVGSVGElement_from_HTMLDOMNode(iface);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - if(IsEqualGUID(&IID_ISVGSVGElement, riid)) - *ppv = &This->ISVGSVGElement_iface; - else - return SVGElement_QI(&This->svg_element.element.node, riid, ppv); + return &This->ISVGSVGElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return SVGElement_QI(&This->svg_element.element.node, riid); }
static const NodeImplVtbl SVGSVGElementImplVtbl = { @@ -885,19 +875,14 @@ static inline SVGCircleElement *SVGCircleElement_from_HTMLDOMNode(HTMLDOMNode *i return CONTAINING_RECORD(iface, SVGCircleElement, svg_element.element.node); }
-static HRESULT SVGCircleElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *SVGCircleElement_QI(HTMLDOMNode *iface, REFIID riid) { SVGCircleElement *This = SVGCircleElement_from_HTMLDOMNode(iface);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - if(IsEqualGUID(&IID_ISVGCircleElement, riid)) - *ppv = &This->ISVGCircleElement_iface; - else - return SVGElement_QI(&This->svg_element.element.node, riid, ppv); + return &This->ISVGCircleElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return SVGElement_QI(&This->svg_element.element.node, riid); }
static const NodeImplVtbl SVGCircleElementImplVtbl = { @@ -1126,21 +1111,16 @@ static inline SVGTSpanElement *SVGTSpanElement_from_HTMLDOMNode(HTMLDOMNode *ifa return CONTAINING_RECORD(iface, SVGTSpanElement, svg_element.element.node); }
-static HRESULT SVGTSpanElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *SVGTSpanElement_QI(HTMLDOMNode *iface, REFIID riid) { SVGTSpanElement *This = SVGTSpanElement_from_HTMLDOMNode(iface);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - if(IsEqualGUID(&IID_ISVGTSpanElement, riid)) - *ppv = &This->svg_element.ISVGElement_iface; /* no additional methods */ - else if(IsEqualGUID(&IID_ISVGTextContentElement, riid)) - *ppv = &This->text_content.ISVGTextContentElement_iface; - else - return SVGElement_QI(&This->svg_element.element.node, riid, ppv); + return &This->svg_element.ISVGElement_iface; /* no additional methods */ + if(IsEqualGUID(&IID_ISVGTextContentElement, riid)) + return &This->text_content.ISVGTextContentElement_iface;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return SVGElement_QI(&This->svg_element.element.node, riid); }
static const NodeImplVtbl SVGTSpanElementImplVtbl = {
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 31 ++++++++++++++++++------------- dlls/mshtml/htmldoc.c | 2 ++ dlls/mshtml/htmlelem.c | 1 + dlls/mshtml/htmlevent.c | 13 +++++++++++++ dlls/mshtml/htmlnode.c | 32 +++++++++++++------------------- dlls/mshtml/htmltextnode.c | 1 + dlls/mshtml/mshtml_private.h | 5 +++++ 7 files changed, 53 insertions(+), 32 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index b5d8ac83346..ec781351291 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1968,9 +1968,15 @@ static IDispatchExVtbl DispatchExVtbl = {
BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv) { - if(IsEqualGUID(&IID_IDispatch, riid)) - *ppv = &This->IDispatchEx_iface; - else if(IsEqualGUID(&IID_IDispatchEx, riid)) + TRACE("%s (%p)->(%s %p)\n", This->info->desc->name, This, debugstr_mshtml_guid(riid), ppv); + + if(This->info->desc->vtbl->query_interface) { + *ppv = This->info->desc->vtbl->query_interface(This, riid); + if(*ppv) + goto ret; + } + + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid) || IsEqualGUID(&IID_IDispatchEx, riid)) *ppv = &This->IDispatchEx_iface; else if(IsEqualGUID(&IID_nsXPCOMCycleCollectionParticipant, riid)) { *ppv = &dispex_ccp; @@ -1978,19 +1984,18 @@ BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv) }else if(IsEqualGUID(&IID_nsCycleCollectionISupports, riid)) { *ppv = &This->IDispatchEx_iface; return TRUE; - }else if(IsEqualGUID(&IID_IDispatchJS, riid)) - *ppv = NULL; - else if(IsEqualGUID(&IID_UndocumentedScriptIface, riid)) - *ppv = NULL; - else if(IsEqualGUID(&IID_IMarshal, riid)) + }else if(IsEqualGUID(&IID_IDispatchJS, riid) || + IsEqualGUID(&IID_UndocumentedScriptIface, riid) || + IsEqualGUID(&IID_IMarshal, riid) || + IsEqualGUID(&IID_IManagedObject, riid)) { *ppv = NULL; - else if(IsEqualGUID(&IID_IManagedObject, riid)) - *ppv = NULL; - else + return TRUE; + }else { return FALSE; + }
- if(*ppv) - IUnknown_AddRef((IUnknown*)*ppv); +ret: + IDispatchEx_AddRef(&This->IDispatchEx_iface); return TRUE; }
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 01199ab4304..bff2452f4cd 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -355,6 +355,7 @@ static IHTMLEventObj *DocumentType_set_current_event(DispatchEx *dispex, IHTMLEv
static const event_target_vtbl_t DocumentType_event_target_vtbl = { { + .query_interface = HTMLDOMNode_query_interface, .destructor = HTMLDOMNode_destructor, .traverse = HTMLDOMNode_traverse, .unlink = HTMLDOMNode_unlink @@ -6067,6 +6068,7 @@ static HRESULT HTMLDocumentNode_location_hook(DispatchEx *dispex, WORD flags, DI
static const event_target_vtbl_t HTMLDocumentNode_event_target_vtbl = { { + .query_interface = HTMLDOMNode_query_interface, .destructor = HTMLDOMNode_destructor, .traverse = HTMLDOMNode_traverse, .unlink = HTMLDOMNode_unlink, diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index af6551cc9fc..ad71d128266 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -7350,6 +7350,7 @@ static const tid_t HTMLElement_iface_tids[] = {
const event_target_vtbl_t HTMLElement_event_target_vtbl = { { + .query_interface = HTMLDOMNode_query_interface, .destructor = HTMLDOMNode_destructor, .traverse = HTMLDOMNode_traverse, .unlink = HTMLDOMNode_unlink, diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 2ba912f5fb3..c64eded6a0a 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -4564,6 +4564,19 @@ static HRESULT get_gecko_target(IEventTarget *target, nsIDOMEventTarget **ret) return S_OK; }
+void *EventTarget_query_interface(EventTarget *event_target, REFIID riid) +{ + if(IsEqualGUID(riid, &IID_IEventTarget)) { + if(use_event_quirks(event_target)) { + WARN("IEventTarget queried, but not supported by in document mode\n"); + return NULL; + } + return &event_target->IEventTarget_iface; + } + + return NULL; +} + HRESULT EventTarget_QI(EventTarget *event_target, REFIID riid, void **ppv) { if(IsEqualGUID(riid, &IID_IEventTarget)) { diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index d9c955691d5..f0dc460d596 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -493,17 +493,11 @@ static HRESULT WINAPI HTMLDOMNode_QueryInterface(IHTMLDOMNode *iface, { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface);
- /* FIXME: Get rid of this when dispex handles QI */ - if(IsEqualGUID(&IID_nsXPCOMCycleCollectionParticipant, riid) || IsEqualGUID(&IID_nsCycleCollectionISupports, riid)) { - dispex_query_interface(&This->event_target.dispex, riid, ppv); - return S_OK; - } - - if((*ppv = This->vtbl->qi(This, riid))) { - IHTMLDOMNode_AddRef(&This->IHTMLDOMNode_iface); - return S_OK; - } + if(dispex_query_interface(&This->event_target.dispex, riid, ppv)) + return *ppv ? S_OK : E_NOINTERFACE;
+ *ppv = NULL; + WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); return E_NOINTERFACE; }
@@ -1437,6 +1431,13 @@ static inline HTMLDOMNode *HTMLDOMNode_from_DispatchEx(DispatchEx *iface) return CONTAINING_RECORD(iface, HTMLDOMNode, event_target.dispex); }
+void *HTMLDOMNode_query_interface(DispatchEx *dispex, REFIID riid) +{ + HTMLDOMNode *This = HTMLDOMNode_from_DispatchEx(dispex); + + return This->vtbl->qi(This, riid); +} + void HTMLDOMNode_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLDOMNode *This = HTMLDOMNode_from_DispatchEx(dispex); @@ -1477,9 +1478,6 @@ void HTMLDOMNode_destructor(DispatchEx *dispex)
void *HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid) { - IUnknown *unk; - HRESULT hres; - if(IsEqualGUID(&IID_IUnknown, riid)) return &This->IHTMLDOMNode_iface; if(IsEqualGUID(&IID_IDispatch, riid)) @@ -1491,12 +1489,7 @@ void *HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid) if(IsEqualGUID(&IID_IHTMLDOMNode3, riid)) return &This->IHTMLDOMNode3_iface;
- hres = EventTarget_QI(&This->event_target, riid, (void**)&unk); - if(hres != S_OK) - return NULL; - - IUnknown_Release(unk); - return unk; + return EventTarget_query_interface(&This->event_target, riid); }
static HRESULT HTMLDOMNode_clone(HTMLDOMNode *This, nsIDOMNode *nsnode, HTMLDOMNode **ret) @@ -1542,6 +1535,7 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno }
static const dispex_static_data_vtbl_t HTMLDOMNode_dispex_vtbl = { + .query_interface = HTMLDOMNode_query_interface, .destructor = HTMLDOMNode_destructor, .traverse = HTMLDOMNode_traverse, .unlink = HTMLDOMNode_unlink diff --git a/dlls/mshtml/htmltextnode.c b/dlls/mshtml/htmltextnode.c index 6fd1a102612..f3302fcaf6f 100644 --- a/dlls/mshtml/htmltextnode.c +++ b/dlls/mshtml/htmltextnode.c @@ -352,6 +352,7 @@ static const NodeImplVtbl HTMLDOMTextNodeImplVtbl = { };
static const dispex_static_data_vtbl_t HTMLDOMTextNode_dispex_vtbl = { + .query_interface = HTMLDOMNode_query_interface, .destructor = HTMLDOMNode_destructor, .traverse = HTMLDOMNode_traverse, .unlink = HTMLDOMNode_unlink diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index dfbbd3fec83..0e7ad70e9c2 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -352,6 +352,9 @@ typedef struct { - dynamic props: These props are generally allocated by external code (e.g. 'document.wine = 42' creates 'wine' dynamic prop on document) */ typedef struct { + /* Used to provide object specific interfaces (do not AddRef, just return the iface) */ + void *(*query_interface)(DispatchEx*,REFIID); + /* Used to implement Cycle Collection callbacks; note that the destructor is not optional! Unlike delete_cycle_collectable, unlink is called before the destructor (if available). */ void (*destructor)(DispatchEx*); @@ -1207,10 +1210,12 @@ void HTMLDOMNode_Init(HTMLDocumentNode*,HTMLDOMNode*,nsIDOMNode*,dispex_static_d void HTMLElement_Init(HTMLElement*,HTMLDocumentNode*,nsIDOMElement*,dispex_static_data_t*);
void EventTarget_Init(EventTarget*,IUnknown*,dispex_static_data_t*,compat_mode_t); +void *EventTarget_query_interface(EventTarget*,REFIID); HRESULT EventTarget_QI(EventTarget*,REFIID,void**); void EventTarget_init_dispex_info(dispex_data_t*,compat_mode_t);
void *HTMLDOMNode_QI(HTMLDOMNode*,REFIID); +void *HTMLDOMNode_query_interface(DispatchEx*,REFIID); void HTMLDOMNode_destructor(DispatchEx*); void HTMLDOMNode_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*); void HTMLDOMNode_unlink(DispatchEx*);
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlwindow.c | 122 ++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 59 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index de09a99000f..f12bae6c2b5 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -157,70 +157,64 @@ static inline HTMLOuterWindow *HTMLOuterWindow_from_IHTMLWindow2(IHTMLWindow2 *i return CONTAINING_RECORD(iface, HTMLOuterWindow, base.IHTMLWindow2_iface); }
-static HRESULT base_query_interface(HTMLWindow *This, REFIID riid, void **ppv) -{ - if(IsEqualGUID(&IID_IUnknown, riid)) { - *ppv = &This->IHTMLWindow2_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - *ppv = &This->IHTMLWindow2_iface; - }else if(IsEqualGUID(&IID_IDispatchEx, riid)) { - *ppv = &This->IDispatchEx_iface; - }else if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) { - *ppv = &This->IHTMLWindow2_iface; - }else if(IsEqualGUID(&IID_IHTMLWindow2, riid)) { - *ppv = &This->IHTMLWindow2_iface; - }else if(IsEqualGUID(&IID_IHTMLWindow3, riid)) { - *ppv = &This->IHTMLWindow3_iface; - }else if(IsEqualGUID(&IID_IHTMLWindow4, riid)) { - *ppv = &This->IHTMLWindow4_iface; - }else if(IsEqualGUID(&IID_IHTMLWindow5, riid)) { - *ppv = &This->IHTMLWindow5_iface; - }else if(IsEqualGUID(&IID_IHTMLWindow6, riid)) { - *ppv = &This->IHTMLWindow6_iface; - }else if(IsEqualGUID(&IID_IHTMLWindow7, riid)) { - *ppv = &This->IHTMLWindow7_iface; - }else if(IsEqualGUID(&IID_IHTMLPrivateWindow, riid)) { - *ppv = &This->IHTMLPrivateWindow_iface; - }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { - *ppv = &This->IServiceProvider_iface; - }else if(IsEqualGUID(&IID_ITravelLogClient, riid)) { - *ppv = &This->ITravelLogClient_iface; - }else if(IsEqualGUID(&IID_IObjectIdentity, riid)) { - *ppv = &This->IObjectIdentity_iface; - }else if(IsEqualGUID(&IID_IProvideClassInfo, riid)) { - *ppv = &This->IProvideMultipleClassInfo_iface; - }else if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) { - *ppv = &This->IProvideMultipleClassInfo_iface; - }else if(IsEqualGUID(&IID_IProvideMultipleClassInfo, riid)) { - *ppv = &This->IProvideMultipleClassInfo_iface; - }else if(IsEqualGUID(&IID_IWineHTMLWindowPrivate, riid)) { - *ppv = &This->IWineHTMLWindowPrivate_iface; - }else if(IsEqualGUID(&IID_IWineHTMLWindowCompatPrivate, riid)) { - *ppv = &This->IWineHTMLWindowCompatPrivate_iface; - }else if(IsEqualGUID(&IID_IMarshal, riid)) { - *ppv = NULL; - FIXME("(%p)->(IID_IMarshal %p)\n", This, ppv); - return E_NOINTERFACE; - }else { - return S_FALSE; +static void *base_query_interface(HTMLWindow *This, REFIID riid) +{ + if(IsEqualGUID(&IID_IUnknown, riid)) + return &This->IHTMLWindow2_iface; + if(IsEqualGUID(&IID_IDispatch, riid)) + return &This->IHTMLWindow2_iface; + if(IsEqualGUID(&IID_IDispatchEx, riid)) + return &This->IDispatchEx_iface; + if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) + return &This->IHTMLWindow2_iface; + if(IsEqualGUID(&IID_IHTMLWindow2, riid)) + return &This->IHTMLWindow2_iface; + if(IsEqualGUID(&IID_IHTMLWindow3, riid)) + return &This->IHTMLWindow3_iface; + if(IsEqualGUID(&IID_IHTMLWindow4, riid)) + return &This->IHTMLWindow4_iface; + if(IsEqualGUID(&IID_IHTMLWindow5, riid)) + return &This->IHTMLWindow5_iface; + if(IsEqualGUID(&IID_IHTMLWindow6, riid)) + return &This->IHTMLWindow6_iface; + if(IsEqualGUID(&IID_IHTMLWindow7, riid)) + return &This->IHTMLWindow7_iface; + if(IsEqualGUID(&IID_IHTMLPrivateWindow, riid)) + return &This->IHTMLPrivateWindow_iface; + if(IsEqualGUID(&IID_IServiceProvider, riid)) + return &This->IServiceProvider_iface; + if(IsEqualGUID(&IID_ITravelLogClient, riid)) + return &This->ITravelLogClient_iface; + if(IsEqualGUID(&IID_IObjectIdentity, riid)) + return &This->IObjectIdentity_iface; + if(IsEqualGUID(&IID_IProvideClassInfo, riid)) + return &This->IProvideMultipleClassInfo_iface; + if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) + return &This->IProvideMultipleClassInfo_iface; + if(IsEqualGUID(&IID_IProvideMultipleClassInfo, riid)) + return &This->IProvideMultipleClassInfo_iface; + if(IsEqualGUID(&IID_IWineHTMLWindowPrivate, riid)) + return &This->IWineHTMLWindowPrivate_iface; + if(IsEqualGUID(&IID_IWineHTMLWindowCompatPrivate, riid)) + return &This->IWineHTMLWindowCompatPrivate_iface; + if(IsEqualGUID(&IID_IMarshal, riid)) { + FIXME("(%p)->(IID_IMarshal)\n", This); + return NULL; }
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return NULL; }
static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv) { HTMLInnerWindow *This = HTMLInnerWindow_from_IHTMLWindow2(iface); - HRESULT hres;
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); + if(dispex_query_interface(&This->event_target.dispex, riid, ppv)) + return *ppv ? S_OK : E_NOINTERFACE;
- hres = base_query_interface(&This->base, riid, ppv); - if(hres != S_FALSE) - return hres; - - return EventTarget_QI(&This->event_target, riid, ppv); + *ppv = NULL; + WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); + return E_NOINTERFACE; }
static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface) @@ -246,13 +240,15 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface) static HRESULT WINAPI outer_window_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv) { HTMLOuterWindow *This = HTMLOuterWindow_from_IHTMLWindow2(iface); - HRESULT hres; + IUnknown *base_iface;
TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
- hres = base_query_interface(&This->base, riid, ppv); - if(hres != S_FALSE) - return hres; + if((base_iface = base_query_interface(&This->base, riid))) { + *ppv = base_iface; + IUnknown_AddRef(base_iface); + return S_OK; + }
if(IsEqualGUID(&IID_nsXPCOMCycleCollectionParticipant, riid)) { *ppv = &outer_window_ccp; @@ -3928,6 +3924,13 @@ static inline HTMLInnerWindow *impl_from_DispatchEx(DispatchEx *iface) return CONTAINING_RECORD(iface, HTMLInnerWindow, event_target.dispex); }
+static void *HTMLWindow_query_interface(DispatchEx *dispex, REFIID riid) +{ + HTMLInnerWindow *This = impl_from_DispatchEx(dispex); + void *iface = base_query_interface(&This->base, riid); + return iface ? iface : EventTarget_query_interface(&This->event_target, riid); +} + static void HTMLWindow_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); @@ -4294,6 +4297,7 @@ static IHTMLEventObj *HTMLWindow_set_current_event(DispatchEx *dispex, IHTMLEven
static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { { + .query_interface = HTMLWindow_query_interface, .destructor = HTMLWindow_destructor, .traverse = HTMLWindow_traverse, .unlink = HTMLWindow_unlink,
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 21 ----------------- dlls/mshtml/mshtml_private.h | 1 - dlls/mshtml/xmlhttprequest.c | 45 +++++++++++++++++++----------------- 3 files changed, 24 insertions(+), 43 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index c64eded6a0a..f8a418a8027 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -4577,27 +4577,6 @@ void *EventTarget_query_interface(EventTarget *event_target, REFIID riid) return NULL; }
-HRESULT EventTarget_QI(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[] = { diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 0e7ad70e9c2..3c5fc6de949 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1211,7 +1211,6 @@ void HTMLElement_Init(HTMLElement*,HTMLDocumentNode*,nsIDOMElement*,dispex_stati
void EventTarget_Init(EventTarget*,IUnknown*,dispex_static_data_t*,compat_mode_t); void *EventTarget_query_interface(EventTarget*,REFIID); -HRESULT EventTarget_QI(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 c062b117c5d..832acc33aef 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -508,28 +508,12 @@ static HRESULT WINAPI HTMLXMLHttpRequest_QueryInterface(IHTMLXMLHttpRequest *ifa { 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(&This->event_target, riid, ppv); - } + if(dispex_query_interface(&This->event_target.dispex, riid, ppv)) + return *ppv ? S_OK : E_NOINTERFACE;
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + *ppv = NULL; + WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); + return E_NOINTERFACE; }
static ULONG WINAPI HTMLXMLHttpRequest_AddRef(IHTMLXMLHttpRequest *iface) @@ -1517,6 +1501,24 @@ 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); + + 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_query_interface(&This->event_target, riid); +} + static void HTMLXMLHttpRequest_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex); @@ -1606,6 +1608,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,
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index ec781351291..b2af8722b45 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1612,7 +1612,7 @@ static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pcti { DispatchEx *This = impl_from_IDispatchEx(iface);
- TRACE("(%p)->(%p)\n", This, pctinfo); + TRACE("%s (%p)->(%p)\n", This->info->desc->name, This, pctinfo);
*pctinfo = 1; return S_OK; @@ -1624,7 +1624,7 @@ static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, DispatchEx *This = impl_from_IDispatchEx(iface); HRESULT hres;
- TRACE("(%p)->(%u %lu %p)\n", This, iTInfo, lcid, ppTInfo); + TRACE("%s (%p)->(%u %lu %p)\n", This->info->desc->name, This, iTInfo, lcid, ppTInfo);
hres = get_typeinfo(This->info->desc->disp_tid, ppTInfo); if(FAILED(hres)) @@ -1641,8 +1641,8 @@ static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, DispatchEx *This = impl_from_IDispatchEx(iface); HRESULT hres = S_OK;
- TRACE("(%p)->(%s %p %u %lu %p)\n", This, debugstr_guid(riid), rgszNames, cNames, - lcid, rgDispId); + TRACE("%s (%p)->(%s %p %u %lu %p)\n", This->info->desc->name, This, debugstr_guid(riid), rgszNames, + cNames, lcid, rgDispId);
/* Native ignores all cNames > 1, and doesn't even fill them */ if(cNames) @@ -1657,8 +1657,8 @@ static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, { DispatchEx *This = impl_from_IDispatchEx(iface);
- TRACE("(%p)->(%ld %s %ld %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), - lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); + TRACE("%s (%p)->(%ld %s %ld %d %p %p %p %p)\n", This->info->desc->name, This, dispIdMember, + debugstr_guid(riid), lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return IDispatchEx_InvokeEx(&This->IDispatchEx_iface, dispIdMember, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, NULL); @@ -1670,7 +1670,7 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW dynamic_prop_t *dprop; HRESULT hres;
- TRACE("(%p)->(%s %lx %p)\n", This, debugstr_w(bstrName), grfdex, pid); + TRACE("%s (%p)->(%s %lx %p)\n", This->info->desc->name, This, debugstr_w(bstrName), grfdex, pid);
if(grfdex & ~(fdexNameCaseSensitive|fdexNameCaseInsensitive|fdexNameEnsure|fdexNameImplicit|FDEX_VERSION_MASK)) FIXME("Unsupported grfdex %lx\n", grfdex); @@ -1696,7 +1696,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc DispatchEx *This = impl_from_IDispatchEx(iface); HRESULT hres;
- TRACE("(%p)->(%lx %lx %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + TRACE("%s (%p)->(%lx %lx %x %p %p %p %p)\n", This->info->desc->name, This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
if(!ensure_real_info(This)) return E_OUTOFMEMORY; @@ -1782,7 +1782,7 @@ static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR nam DISPID id; HRESULT hres;
- TRACE("(%p)->(%s %lx)\n", This, debugstr_w(name), grfdex); + TRACE("%s (%p)->(%s %lx)\n", This->info->desc->name, This, debugstr_w(name), grfdex);
hres = IDispatchEx_GetDispID(&This->IDispatchEx_iface, name, grfdex & ~fdexNameEnsure, &id); if(FAILED(hres)) { @@ -1799,7 +1799,7 @@ static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID { DispatchEx *This = impl_from_IDispatchEx(iface);
- TRACE("(%p)->(%lx)\n", This, id); + TRACE("%s (%p)->(%lx)\n", This->info->desc->name, This, id);
if(is_custom_dispid(id) && This->info->desc->vtbl->delete) return This->info->desc->vtbl->delete(This, id); @@ -1828,7 +1828,7 @@ static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) { DispatchEx *This = impl_from_IDispatchEx(iface); - FIXME("(%p)->(%lx %lx %p)\n", This, id, grfdexFetch, pgrfdex); + FIXME("%s (%p)->(%lx %lx %p)\n", This->info->desc->name, This, id, grfdexFetch, pgrfdex); return E_NOTIMPL; }
@@ -1838,7 +1838,7 @@ static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BS func_info_t *func; HRESULT hres;
- TRACE("(%p)->(%lx %p)\n", This, id, pbstrName); + TRACE("%s (%p)->(%lx %p)\n", This->info->desc->name, This, id, pbstrName);
if(!ensure_real_info(This)) return E_OUTOFMEMORY; @@ -1893,7 +1893,7 @@ static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, func_info_t *func; HRESULT hres;
- TRACE("(%p)->(%lx %lx %p)\n", This, grfdex, id, pid); + TRACE("%s (%p)->(%lx %lx %p)\n", This->info->desc->name, This, grfdex, id, pid);
if(!ensure_real_info(This)) return E_OUTOFMEMORY; @@ -1944,7 +1944,7 @@ static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) { DispatchEx *This = impl_from_IDispatchEx(iface); - FIXME("(%p)->(%p)\n", This, ppunk); + FIXME("%s (%p)->(%p)\n", This->info->desc->name, This, ppunk); return E_NOTIMPL; }
This merge request was approved by Jacek Caban.