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.
-- v2: 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 | 60 ++++------- dlls/mshtml/htmlgeneric.c | 15 +-- dlls/mshtml/htmlhead.c | 62 +++++------ dlls/mshtml/htmlimg.c | 15 +-- dlls/mshtml/htmlinput.c | 77 +++++--------- dlls/mshtml/htmllink.c | 15 ++- dlls/mshtml/htmlnode.c | 51 +++++---- dlls/mshtml/htmlobject.c | 91 ++++++++-------- dlls/mshtml/htmlscript.c | 27 ++--- dlls/mshtml/htmlselect.c | 54 ++++------ dlls/mshtml/htmlstyleelem.c | 30 +++--- 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, 440 insertions(+), 638 deletions(-)
diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c index e784de12443..fe7e609da3d 100644 --- a/dlls/mshtml/htmlanchor.c +++ b/dlls/mshtml/htmlanchor.c @@ -797,29 +797,20 @@ 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; - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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..4c0778cb1b3 100644 --- a/dlls/mshtml/htmlarea.c +++ b/dlls/mshtml/htmlarea.c @@ -413,21 +413,16 @@ 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; + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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); - } + if(IsEqualGUID(&IID_IHTMLAreaElement, riid)) + return &This->IHTMLAreaElement_iface;
- 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..99799f693df 100644 --- a/dlls/mshtml/htmlbody.c +++ b/dlls/mshtml/htmlbody.c @@ -890,32 +890,22 @@ 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; - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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..21e4030b049 100644 --- a/dlls/mshtml/htmlcomment.c +++ b/dlls/mshtml/htmlcomment.c @@ -146,21 +146,16 @@ 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; + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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); - } + if(IsEqualGUID(&IID_IHTMLCommentElement, riid)) + return &This->IHTMLCommentElement_iface;
- 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..952f79e9445 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,106 @@ 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); + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
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..86fbb14cc26 100644 --- a/dlls/mshtml/htmlform.c +++ b/dlls/mshtml/htmlform.c @@ -773,32 +773,22 @@ 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; + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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; - } + 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;
- 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..d591304caa2 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,16 @@ 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); - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + if(IsEqualGUID(&IID_IHTMLFrameElement3, riid)) + return &This->IHTMLFrameElement3_iface; + + return HTMLFrameBase_QI(&This->framebase, riid); }
static void HTMLFrameElement_destructor(HTMLDOMNode *iface) @@ -1471,25 +1462,20 @@ 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); - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + 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; + + 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..92b0ffe3008 100644 --- a/dlls/mshtml/htmlgeneric.c +++ b/dlls/mshtml/htmlgeneric.c @@ -128,21 +128,16 @@ 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; + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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); - } + if(IsEqualGUID(&IID_IHTMLGenericElement, riid)) + return &This->IHTMLGenericElement_iface;
- 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..ec3fbd77a50 100644 --- a/dlls/mshtml/htmlhead.c +++ b/dlls/mshtml/htmlhead.c @@ -146,19 +146,16 @@ 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); + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
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 +305,16 @@ 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); + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
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 +543,20 @@ 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); - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + 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; + + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLMetaElement_destructor(HTMLDOMNode *iface) @@ -718,21 +707,18 @@ 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); + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
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..aea6279963b 100644 --- a/dlls/mshtml/htmlimg.c +++ b/dlls/mshtml/htmlimg.c @@ -658,21 +658,16 @@ 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; + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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); - } + if(IsEqualGUID(&IID_IHTMLImgElement, riid)) + return &This->IHTMLImgElement_iface;
- 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..8e2494d7849 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -1344,35 +1344,24 @@ 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; - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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 +1591,18 @@ 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; + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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 +1884,18 @@ 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; + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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..d09a21a52c8 100644 --- a/dlls/mshtml/htmllink.c +++ b/dlls/mshtml/htmllink.c @@ -374,19 +374,16 @@ 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); - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + if(IsEqualGUID(&IID_IHTMLLinkElement, riid)) + return &This->IHTMLLinkElement_iface; + + 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..38f90b3a637 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,30 @@ 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); - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid)); + + 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..7d59e1b4beb 100644 --- a/dlls/mshtml/htmlobject.c +++ b/dlls/mshtml/htmlobject.c @@ -637,50 +637,45 @@ 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; + + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid)); + + 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 +981,20 @@ 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); + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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); - } + 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;
- 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..4e747a70f62 100644 --- a/dlls/mshtml/htmlscript.c +++ b/dlls/mshtml/htmlscript.c @@ -354,29 +354,20 @@ 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; - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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..40e42a56e6a 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -346,29 +346,20 @@ 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; + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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; - } + 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;
- 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 +1317,20 @@ 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; + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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..4c5236a0cc8 100644 --- a/dlls/mshtml/htmlstyleelem.c +++ b/dlls/mshtml/htmlstyleelem.c @@ -365,28 +365,22 @@ 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); - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + 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; + + 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..729c37f95c1 100644 --- a/dlls/mshtml/htmltable.c +++ b/dlls/mshtml/htmltable.c @@ -446,25 +446,20 @@ 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); - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + 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; + + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLTableCell_destructor(HTMLDOMNode *iface) @@ -880,29 +875,20 @@ 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; - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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 +1871,24 @@ 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; - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; - } + 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, ppv); + 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..d07da8d925a 100644 --- a/dlls/mshtml/htmltextarea.c +++ b/dlls/mshtml/htmltextarea.c @@ -390,29 +390,20 @@ 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; - } + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
- 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..20cb55a584c 100644 --- a/dlls/mshtml/htmltextnode.c +++ b/dlls/mshtml/htmltextnode.c @@ -324,21 +324,18 @@ 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); + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
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..2d6a5437722 100644 --- a/dlls/mshtml/svg.c +++ b/dlls/mshtml/svg.c @@ -177,19 +177,16 @@ 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); + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
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 +714,16 @@ 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); + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
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 +879,16 @@ 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); + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
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 +1117,18 @@ 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); + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
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..f3c117e4bc6 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("(%p)->(%s %p)\n", 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)) + }else if(IsEqualGUID(&IID_IDispatchJS, riid) || + IsEqualGUID(&IID_UndocumentedScriptIface, riid) || + IsEqualGUID(&IID_IMarshal, riid) || + IsEqualGUID(&IID_IManagedObject, riid)) { *ppv = NULL; - else if(IsEqualGUID(&IID_IMarshal, 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 952f79e9445..0388374cc57 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 @@ -6069,6 +6070,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 38f90b3a637..c700b19632f 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; - TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
if(IsEqualGUID(&IID_IUnknown, riid)) @@ -1493,12 +1491,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) @@ -1544,6 +1537,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 20cb55a584c..71d9ce65465 100644 --- a/dlls/mshtml/htmltextnode.c +++ b/dlls/mshtml/htmltextnode.c @@ -354,6 +354,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 | 126 +++++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 59 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index de09a99000f..e3f3e23e9f8 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); - - hres = base_query_interface(&This->base, riid, ppv); - if(hres != S_FALSE) - return hres; + if(dispex_query_interface(&This->event_target.dispex, riid, ppv)) + return *ppv ? S_OK : E_NOINTERFACE;
- 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,17 @@ 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; + + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid)); + + 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 +4301,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 | 47 ++++++++++++++++++++---------------- 3 files changed, 26 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..7facfa32b46 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,26 @@ static inline HTMLXMLHttpRequest *impl_from_DispatchEx(DispatchEx *iface) return CONTAINING_RECORD(iface, HTMLXMLHttpRequest, event_target.dispex); }
+static void *HTMLXMLHttpRequest_query_interface(DispatchEx *dispex, REFIID riid) +{ + HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex); + + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid)); + + if(IsEqualGUID(&IID_IHTMLXMLHttpRequest, riid)) + return &This->IHTMLXMLHttpRequest_iface; + if(IsEqualGUID(&IID_IHTMLXMLHttpRequest2, riid)) + return &This->IHTMLXMLHttpRequest2_iface; + if(IsEqualGUID(&IID_IWineXMLHttpRequestPrivate, riid)) + return &This->IWineXMLHttpRequestPrivate_iface; + if(IsEqualGUID(&IID_IProvideClassInfo, riid)) + return &This->IProvideClassInfo2_iface; + if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) + return &This->IProvideClassInfo2_iface; + + return EventTarget_query_interface(&This->event_target, riid); +} + static void HTMLXMLHttpRequest_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex); @@ -1606,6 +1610,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,
Jacek Caban (@jacek) commented about dlls/mshtml/xmlhttprequest.c:
return CONTAINING_RECORD(iface, HTMLXMLHttpRequest, event_target.dispex);
}
+static void *HTMLXMLHttpRequest_query_interface(DispatchEx *dispex, REFIID riid) +{
- HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex);
- TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid));
It looks mostly good to me now, but can we move traces like this to dispex_query_interface as well? I know that it's useful to know what kind of object it's called on, but we could just print the name from dispex_static_data_t there. It may be convenient to add it to more dispex.c traces, BTW.
On Wed Sep 6 21:11:31 2023 +0000, Jacek Caban wrote:
It looks mostly good to me now, but can we move traces like this to dispex_query_interface as well? I know that it's useful to know what kind of object it's called on, but we could just print the name from dispex_static_data_t there. It may be convenient to add it to more dispex.c traces, BTW.
Not sure if that's a good idea. Personally, I like tracing through object addresses to see where they end up used, and the dispex itself has a slightly different address, it's not just the name, so it won't find all the other object TRACEs (only the dispex ones).
On Thu Sep 7 12:11:36 2023 +0000, Gabriel Ivăncescu wrote:
Not sure if that's a good idea. Personally, I like tracing through object addresses to see where they end up used, and the dispex itself has a slightly different address, it's not just the name, so it won't find all the other object TRACEs (only the dispex ones).
In what cases do those addresses differ? I can think of only inner windows, for which we could probably just make DispatchEx the first entry now (and hopefully get rid of base HTMLWindow at some point anyway).
On Thu Sep 7 12:38:49 2023 +0000, Jacek Caban wrote:
In what cases do those addresses differ? I can think of only inner windows, for which we could probably just make DispatchEx the first entry now (and hopefully get rid of base HTMLWindow at some point anyway).
Yeah, you're probably right, I didn't really look if all of them had it as first member. Also I guess that's only going to apply to query_interface since we'll eventually end up forwarding the AddRef/Release. I'll remove the traces then.