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.
From: Gabriel Ivăncescu gabrielopcode@gmail.com
The inner window is an implementation detail and should never be accessed directly by non-mshtml code. It's also needed to make a unified query_interface in the dispex.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 29 +++++++-- dlls/mshtml/htmlevent.h | 1 + dlls/mshtml/htmlwindow.c | 116 ++++++++++++++++++++++++++++++++++- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/tests/events.c | 18 ++++++ 5 files changed, 158 insertions(+), 7 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 59cb44a6475..3356a44a448 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,6 +3612,8 @@ 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);
TRACE("%p %s >>>\n", event_target, debugstr_w(event->type)); hres = call_disp_func(listener->function, &dp, &v); @@ -3673,6 +3690,9 @@ 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); + V_VT(args+1) = VT_DISPATCH; V_DISPATCH(args+1) = dispatch_mode == DISPATCH_LEGACY ? (IDispatch*)event->event_obj : (IDispatch*)&event->IDOMEvent_iface; @@ -3729,8 +3749,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; }
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 | 23 ++-- dlls/mshtml/htmlarea.c | 13 +-- dlls/mshtml/htmlbody.c | 27 ++--- dlls/mshtml/htmlcomment.c | 13 +-- dlls/mshtml/htmldoc.c | 203 +++++++++++++++++------------------ dlls/mshtml/htmlelem.c | 74 ++++++------- dlls/mshtml/htmlform.c | 27 ++--- dlls/mshtml/htmlframe.c | 45 ++++---- dlls/mshtml/htmlgeneric.c | 13 +-- dlls/mshtml/htmlhead.c | 54 ++++------ dlls/mshtml/htmlimg.c | 13 +-- dlls/mshtml/htmlinput.c | 65 +++++------ dlls/mshtml/htmllink.c | 11 +- dlls/mshtml/htmlnode.c | 51 +++++---- dlls/mshtml/htmlobject.c | 91 +++++++--------- dlls/mshtml/htmlscript.c | 23 ++-- dlls/mshtml/htmlselect.c | 46 +++----- dlls/mshtml/htmlstyleelem.c | 23 ++-- dlls/mshtml/htmltable.c | 73 +++++-------- dlls/mshtml/htmltextarea.c | 23 ++-- dlls/mshtml/htmltextnode.c | 15 ++- dlls/mshtml/ifacewrap.c | 2 +- dlls/mshtml/mshtml_private.h | 6 +- dlls/mshtml/svg.c | 48 ++++----- 24 files changed, 414 insertions(+), 568 deletions(-)
diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c index e784de12443..46766b9650c 100644 --- a/dlls/mshtml/htmlanchor.c +++ b/dlls/mshtml/htmlanchor.c @@ -797,29 +797,22 @@ 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; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLAnchorElement_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLAnchorElement_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &This->IHTMLAnchorElement_iface; }else if(IsEqualGUID(&IID_IHTMLAnchorElement, riid)) { - TRACE("(%p)->(IID_IHTMLAnchorElement %p)\n", This, ppv); - *ppv = &This->IHTMLAnchorElement_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + TRACE("(%p)->(IID_IHTMLAnchorElement)\n", This); + 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..dc7417783f4 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; - 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); + TRACE("(%p)->(IID_IHTMLAreaElement)\n", This); + 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..172c9331f39 100644 --- a/dlls/mshtml/htmlbody.c +++ b/dlls/mshtml/htmlbody.c @@ -890,32 +890,25 @@ 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; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLBodyElement_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLBodyElement_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &This->IHTMLBodyElement_iface; }else if(IsEqualGUID(&IID_IHTMLBodyElement, riid)) { - TRACE("(%p)->(IID_IHTMLBodyElement %p)\n", This, ppv); - *ppv = &This->IHTMLBodyElement_iface; + TRACE("(%p)->(IID_IHTMLBodyElement)\n", This); + return &This->IHTMLBodyElement_iface; }else if(IsEqualGUID(&IID_IHTMLTextContainer, riid)) { - TRACE("(%p)->(IID_IHTMLTextContainer %p)\n", This, ppv); - *ppv = &This->IHTMLTextContainer_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + TRACE("(%p)->(IID_IHTMLTextContainer)\n", This); + 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..d5f517f3891 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; - 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); + TRACE("(%p)->(IID_IHTMLCommentElement)\n", This); + 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 dd8c4b24a4a..a71bace23ab 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) @@ -5679,118 +5676,110 @@ 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; + TRACE("(%p)->(IID_IRunnableObject) returning NULL\n", This); + return NULL; }else if(IsEqualGUID(&IID_IPersistPropertyBag, riid)) { - TRACE("(%p)->(IID_IPersistPropertyBag %p) returning NULL\n", This, ppv); - *ppv = NULL; - return E_NOINTERFACE; + TRACE("(%p)->(IID_IPersistPropertyBag) returning NULL\n", This); + return NULL; }else if(IsEqualGUID(&IID_IExternalConnection, riid)) { - TRACE("(%p)->(IID_IExternalConnection %p) returning NULL\n", This, ppv); - *ppv = NULL; - return E_NOINTERFACE; + TRACE("(%p)->(IID_IExternalConnection) returning NULL\n", This); + 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); + TRACE("(%p)->(IID_IStdMarshalInfo) returning NULL\n", This); + 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..9f27fd3214c 100644 --- a/dlls/mshtml/htmlform.c +++ b/dlls/mshtml/htmlform.c @@ -773,32 +773,25 @@ static inline HTMLFormElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLFormElement, element.node); }
-static HRESULT HTMLFormElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLFormElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLFormElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLFormElement_iface; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLFormElement_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLFormElement_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &This->IHTMLFormElement_iface; }else if(IsEqualGUID(&IID_IHTMLFormElement, riid)) { - TRACE("(%p)->(IID_IHTMLFormElement %p)\n", This, ppv); - *ppv = &This->IHTMLFormElement_iface; + TRACE("(%p)->(IID_IHTMLFormElement)\n", This); + return &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; + TRACE("(%p)->(DIID_DispHTMLFormElement)\n", This); + 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..294f801f377 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -700,20 +700,17 @@ static const IHTMLFrameBase2Vtbl HTMLFrameBase2Vtbl = { HTMLFrameBase2_get_allowTransparency };
-static HRESULT HTMLFrameBase_QI(HTMLFrameBase *This, REFIID riid, void **ppv) +static void *HTMLFrameBase_QI(HTMLFrameBase *This, REFIID riid) { if(IsEqualGUID(&IID_IHTMLFrameBase, riid)) { - TRACE("(%p)->(IID_IHTMLFrameBase %p)\n", This, ppv); - *ppv = &This->IHTMLFrameBase_iface; + TRACE("(%p)->(IID_IHTMLFrameBase)\n", This); + return &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); + TRACE("(%p)->(IID_IHTMLFrameBase2)\n", This); + 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 +890,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)->(IID_IHTMLFrameElement3)\n", This); + return &This->IHTMLFrameElement3_iface; }
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLFrameBase_QI(&This->framebase, riid); }
static void HTMLFrameElement_destructor(HTMLDOMNode *iface) @@ -1471,25 +1465,22 @@ 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; + TRACE("(%p)->(IID_IHTMLIFrameElement)\n", This); + return &This->IHTMLIFrameElement_iface; }else if(IsEqualGUID(&IID_IHTMLIFrameElement2, riid)) { - TRACE("(%p)->(IID_IHTMLIFrameElement2 %p)\n", This, ppv); - *ppv = &This->IHTMLIFrameElement2_iface; + TRACE("(%p)->(IID_IHTMLIFrameElement2)\n", This); + return &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)->(IID_IHTMLIFrameElement3)\n", This); + return &This->IHTMLIFrameElement3_iface; }
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLFrameBase_QI(&This->framebase, riid); }
static void HTMLIFrame_destructor(HTMLDOMNode *iface) diff --git a/dlls/mshtml/htmlgeneric.c b/dlls/mshtml/htmlgeneric.c index 5836ebd208a..555b978c84c 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; - 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); + TRACE("(%p)->(IID_IHTMLGenericElement)\n", This); + 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..ce60d1a3e92 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,22 @@ 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; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLMetaElement_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLMetaElement_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &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)->(IID_IHTMLMetaElement)\n", This); + return &This->IHTMLMetaElement_iface; }
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLMetaElement_destructor(HTMLDOMNode *iface) @@ -718,21 +709,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; + return &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;
- 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..927ec1b7237 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; - 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); + TRACE("(%p)->(IID_IHTMLImgElement)\n", This); + 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..73b2e0b1503 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -1344,35 +1344,28 @@ 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; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLInputElement_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLInputElement_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &This->IHTMLInputElement_iface; }else if(IsEqualGUID(&IID_IHTMLInputElement, riid)) { - TRACE("(%p)->(IID_IHTMLInputElement %p)\n", This, ppv); - *ppv = &This->IHTMLInputElement_iface; + TRACE("(%p)->(IID_IHTMLInputElement)\n", This); + return &This->IHTMLInputElement_iface; }else if(IsEqualGUID(&IID_IHTMLInputTextElement, riid)) { - TRACE("(%p)->(IID_IHTMLInputTextElement %p)\n", This, ppv); - *ppv = &This->IHTMLInputTextElement_iface; + TRACE("(%p)->(IID_IHTMLInputTextElement)\n", This); + return &This->IHTMLInputTextElement_iface; }else if(IsEqualGUID(&IID_IHTMLInputTextElement2, riid)) { - TRACE("(%p)->(IID_IHTMLInputTextElement2 %p)\n", This, ppv); - *ppv = &This->IHTMLInputTextElement2_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + TRACE("(%p)->(IID_IHTMLInputTextElement2)\n", This); + 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 +1595,19 @@ static inline HTMLLabelElement *label_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLLabelElement, element.node); }
-static HRESULT HTMLLabelElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLLabelElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLLabelElement *This = label_from_HTMLDOMNode(iface);
- *ppv = NULL; - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLLabelElement_iface; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &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); + TRACE("(%p)->(IID_IHTMLLabelElement)\n", This); + return &This->IHTMLLabelElement_iface; }
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static const NodeImplVtbl HTMLLabelElementImplVtbl = { @@ -1901,24 +1889,19 @@ static inline HTMLButtonElement *button_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLButtonElement, element.node); }
-static HRESULT HTMLButtonElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLButtonElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLButtonElement *This = button_from_HTMLDOMNode(iface);
- *ppv = NULL; - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLButtonElement_iface; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &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); + TRACE("(%p)->(IID_IHTMLButtonElement)\n", This); + 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..3d7ae8355d4 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)->(IID_IHTMLLinkElement)\n", This); + return &This->IHTMLLinkElement_iface; }
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static HRESULT HTMLLinkElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v) diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index b7cd30c8c74..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..5a901d3c8dc 100644 --- a/dlls/mshtml/htmlscript.c +++ b/dlls/mshtml/htmlscript.c @@ -354,29 +354,22 @@ 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; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLScriptElement_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLScriptElement_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &This->IHTMLScriptElement_iface; }else if(IsEqualGUID(&IID_IHTMLScriptElement, riid)) { - TRACE("(%p)->(IID_IHTMLScriptElement %p)\n", This, ppv); - *ppv = &This->IHTMLScriptElement_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + TRACE("(%p)->(IID_IHTMLScriptElement)\n", This); + 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..e9889acb714 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -346,29 +346,22 @@ static inline HTMLOptionElement *HTMLOptionElement_from_HTMLDOMNode(HTMLDOMNode return CONTAINING_RECORD(iface, HTMLOptionElement, element.node); }
-static HRESULT HTMLOptionElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLOptionElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLOptionElement *This = HTMLOptionElement_from_HTMLDOMNode(iface);
- *ppv = NULL; - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLOptionElement_iface; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLOptionElement_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLOptionElement_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &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; + TRACE("(%p)->(IID_IHTMLOptionElement)\n", This); + 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 +1319,22 @@ static inline HTMLSelectElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface) return CONTAINING_RECORD(iface, HTMLSelectElement, element.node); }
-static HRESULT HTMLSelectElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +static void *HTMLSelectElement_QI(HTMLDOMNode *iface, REFIID riid) { HTMLSelectElement *This = impl_from_HTMLDOMNode(iface);
- *ppv = NULL; - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IHTMLSelectElement_iface; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLSelectElement_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLSelectElement_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &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; + TRACE("(%p)->(IID_IHTMLSelectElement)\n", This); + 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..9b796a92afa 100644 --- a/dlls/mshtml/htmlstyleelem.c +++ b/dlls/mshtml/htmlstyleelem.c @@ -365,28 +365,25 @@ 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; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLStyleElement_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLStyleElement_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &This->IHTMLStyleElement_iface; }else if(IsEqualGUID(&IID_IHTMLStyleElement, riid)) { - TRACE("(%p)->(IID_IHTMLStyleElement %p)\n", This, ppv); - *ppv = &This->IHTMLStyleElement_iface; + TRACE("(%p)->(IID_IHTMLStyleElement)\n", This); + return &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)->(IID_IHTMLStyleElement2)\n", This); + return &This->IHTMLStyleElement2_iface; }
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLStyleElement_destructor(HTMLDOMNode *iface) diff --git a/dlls/mshtml/htmltable.c b/dlls/mshtml/htmltable.c index 7f4c4fafb0e..dcc2b7e3b3e 100644 --- a/dlls/mshtml/htmltable.c +++ b/dlls/mshtml/htmltable.c @@ -446,25 +446,22 @@ 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; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLTableCell_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLTableCell_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &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)->(IID_IHTMLTableCell)\n", This); + return &This->IHTMLTableCell_iface; }
- IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLElement_QI(&This->element.node, riid); }
static void HTMLTableCell_destructor(HTMLDOMNode *iface) @@ -880,29 +877,22 @@ 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; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLTableRow_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLTableRow_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &This->IHTMLTableRow_iface; }else if(IsEqualGUID(&IID_IHTMLTableRow, riid)) { - TRACE("(%p)->(IID_IHTMLTableRow %p)\n", This, ppv); - *ppv = &This->IHTMLTableRow_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + TRACE("(%p)->(IID_IHTMLTableRow)\n", This); + 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 +1875,28 @@ 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; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLTable_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLTable_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &This->IHTMLTable_iface; }else if(IsEqualGUID(&IID_IHTMLTable, riid)) { - TRACE("(%p)->(IID_IHTMLTable %p)\n", This, ppv); - *ppv = &This->IHTMLTable_iface; + TRACE("(%p)->(IID_IHTMLTable)\n", This); + return &This->IHTMLTable_iface; }else if(IsEqualGUID(&IID_IHTMLTable2, riid)) { - TRACE("(%p)->(IID_IHTMLTable2 %p)\n", This, ppv); - *ppv = &This->IHTMLTable2_iface; + TRACE("(%p)->(IID_IHTMLTable2)\n", This); + return &This->IHTMLTable2_iface; }else if(IsEqualGUID(&IID_IHTMLTable3, riid)) { - TRACE("(%p)->(IID_IHTMLTable3 %p)\n", This, ppv); - *ppv = &This->IHTMLTable3_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + TRACE("(%p)->(IID_IHTMLTable3)\n", This); + 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..c2bc7ca08aa 100644 --- a/dlls/mshtml/htmltextarea.c +++ b/dlls/mshtml/htmltextarea.c @@ -390,29 +390,22 @@ 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; + TRACE("(%p)->(IID_IUnknown)\n", This); + return &This->IHTMLTextAreaElement_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { - TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); - *ppv = &This->IHTMLTextAreaElement_iface; + TRACE("(%p)->(IID_IDispatch)\n", This); + return &This->IHTMLTextAreaElement_iface; }else if(IsEqualGUID(&IID_IHTMLTextAreaElement, riid)) { - TRACE("(%p)->(IID_IHTMLTextAreaElement %p)\n", This, ppv); - *ppv = &This->IHTMLTextAreaElement_iface; - } - - if(*ppv) { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + TRACE("(%p)->(IID_IHTMLTextAreaElement)\n", This); + 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 | 133 +++++++++++++++++++---------------- dlls/mshtml/mshtml_private.h | 3 + 2 files changed, 76 insertions(+), 60 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index b5d8ac83346..7352a8f3922 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -89,7 +89,6 @@ typedef struct {
typedef struct { DispatchEx dispex; - IUnknown IUnknown_iface; DispatchEx *obj; func_info_t *info; } func_disp_t; @@ -754,6 +753,22 @@ static HRESULT dispex_value(DispatchEx *This, LCID lcid, WORD flags, DISPPARAMS return S_OK; }
+static HRESULT query_typeinfo_interface(DispatchEx *This, const func_info_t *func, void **ppv) +{ + if(This->outer) + return IUnknown_QueryInterface(This->outer, tid_ids[func->tid], ppv); + + if(This->info->desc->vtbl->query_interface) { + *ppv = This->info->desc->vtbl->query_interface(This, tid_ids[func->tid]); + if(*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + } + + return E_NOINTERFACE; +} + static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei) { @@ -774,7 +789,7 @@ static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags, return hres; }
- hres = IUnknown_QueryInterface(This->outer, tid_ids[func->tid], (void**)&unk); + hres = query_typeinfo_interface(This, func, (void**)&unk); if(FAILED(hres)) { ERR("Could not get iface %s: %08lx\n", debugstr_mshtml_guid(tid_ids[func->tid]), hres); return E_FAIL; @@ -786,56 +801,6 @@ static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags, return hres; }
-static inline func_disp_t *impl_from_IUnknown(IUnknown *iface) -{ - return CONTAINING_RECORD(iface, func_disp_t, IUnknown_iface); -} - -static HRESULT WINAPI Function_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) -{ - func_disp_t *This = impl_from_IUnknown(iface); - - TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - - if(IsEqualGUID(&IID_IUnknown, riid)) { - *ppv = &This->IUnknown_iface; - }else if(dispex_query_interface(&This->dispex, riid, ppv)) { - return *ppv ? S_OK : E_NOINTERFACE; - }else { - *ppv = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; -} - -static ULONG WINAPI Function_AddRef(IUnknown *iface) -{ - func_disp_t *This = impl_from_IUnknown(iface); - LONG ref = dispex_ref_incr(&This->dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; -} - -static ULONG WINAPI Function_Release(IUnknown *iface) -{ - func_disp_t *This = impl_from_IUnknown(iface); - LONG ref = dispex_ref_decr(&This->dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; -} - -static const IUnknownVtbl FunctionUnkVtbl = { - Function_QueryInterface, - Function_AddRef, - Function_Release -}; - static inline func_disp_t *impl_from_DispatchEx(DispatchEx *iface) { return CONTAINING_RECORD(iface, func_disp_t, dispex); @@ -925,8 +890,7 @@ static func_disp_t *create_func_disp(DispatchEx *obj, func_info_t *info) if(!ret) return NULL;
- ret->IUnknown_iface.lpVtbl = &FunctionUnkVtbl; - init_dispatch(&ret->dispex, &ret->IUnknown_iface, &function_dispex, dispex_compat_mode(obj)); + init_dispatch(&ret->dispex, NULL, &function_dispex, dispex_compat_mode(obj)); ret->obj = obj; ret->info = info;
@@ -1115,7 +1079,7 @@ static HRESULT builtin_propget(DispatchEx *This, func_info_t *func, DISPPARAMS *
assert(func->get_vtbl_off);
- hres = IUnknown_QueryInterface(This->outer, tid_ids[func->tid], (void**)&iface); + hres = query_typeinfo_interface(This, func, (void**)&iface); if(SUCCEEDED(hres)) { switch(func->prop_vt) { #define CASE_VT(vt,type,access) \ @@ -1172,7 +1136,7 @@ static HRESULT builtin_propput(DispatchEx *This, func_info_t *func, DISPPARAMS * v = &tmpv; }
- hres = IUnknown_QueryInterface(This->outer, tid_ids[func->tid], (void**)&iface); + hres = query_typeinfo_interface(This, func, (void**)&iface); if(SUCCEEDED(hres)) { switch(func->prop_vt) { #define CASE_VT(vt,type,access) \ @@ -1216,7 +1180,7 @@ static HRESULT invoke_builtin_function(DispatchEx *This, func_info_t *func, DISP return E_INVALIDARG; }
- hres = IUnknown_QueryInterface(This->outer, tid_ids[func->tid], (void**)&iface); + hres = query_typeinfo_interface(This, func, (void**)&iface); if(FAILED(hres)) return hres;
@@ -1591,21 +1555,70 @@ static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, { DispatchEx *This = impl_from_IDispatchEx(iface);
- return IUnknown_QueryInterface(This->outer, riid, ppv); + if(This->outer) + return IUnknown_QueryInterface(This->outer, riid, ppv); + + 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; + return S_OK; + }else if(IsEqualGUID(&IID_nsCycleCollectionISupports, riid)) { + *ppv = &This->IDispatchEx_iface; + return S_OK; + }else if(IsEqualGUID(&IID_IDispatchJS, riid) || + IsEqualGUID(&IID_UndocumentedScriptIface, riid) || + IsEqualGUID(&IID_IMarshal, riid) || + IsEqualGUID(&IID_IManagedObject, riid)) { + *ppv = NULL; + return E_NOINTERFACE; + }else { + WARN("(%p)->%s\n", This, debugstr_mshtml_guid(riid)); + *ppv = NULL; + return E_NOINTERFACE; + } + +ret: + IDispatchEx_AddRef(&This->IDispatchEx_iface); + return S_OK; }
static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface) { DispatchEx *This = impl_from_IDispatchEx(iface); + LONG ref; + + if(This->outer) + return IUnknown_AddRef(This->outer); + + ref = dispex_ref_incr(This);
- return IUnknown_AddRef(This->outer); + TRACE("(%p) ref=%ld\n", This, ref); + + return ref; }
static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface) { DispatchEx *This = impl_from_IDispatchEx(iface); + LONG ref; + + if(This->outer) + return IUnknown_Release(This->outer);
- return IUnknown_Release(This->outer); + ref = dispex_ref_decr(This); + + TRACE("(%p) ref=%ld\n", This, ref); + + return ref; }
static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index dfbbd3fec83..b29032e5840 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*);
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 2 +- dlls/mshtml/htmlnode.c | 2 +- dlls/mshtml/htmlwindow.c | 2 +- dlls/mshtml/mshtml_private.h | 2 +- dlls/mshtml/xmlhttprequest.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 3356a44a448..7cbe8333542 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -4558,7 +4558,7 @@ static HRESULT get_gecko_target(IEventTarget *target, nsIDOMEventTarget **ret) return S_OK; }
-HRESULT EventTarget_QI(EventTarget *event_target, REFIID riid, void **ppv) +HRESULT EventTarget_QI_with_dispex(EventTarget *event_target, REFIID riid, void **ppv) { if(IsEqualGUID(riid, &IID_IEventTarget)) { if(use_event_quirks(event_target)) { diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 38f90b3a637..3f127899563 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -1493,7 +1493,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); + hres = EventTarget_QI_with_dispex(&This->event_target, riid, (void**)&unk); if(hres != S_OK) return NULL;
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index de09a99000f..b9b55dbdeb3 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -220,7 +220,7 @@ static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID rii if(hres != S_FALSE) return hres;
- return EventTarget_QI(&This->event_target, riid, ppv); + return EventTarget_QI_with_dispex(&This->event_target, riid, ppv); }
static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index b29032e5840..9cb2e47d112 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1210,7 +1210,7 @@ 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); -HRESULT EventTarget_QI(EventTarget*,REFIID,void**); +HRESULT EventTarget_QI_with_dispex(EventTarget*,REFIID,void**); void EventTarget_init_dispex_info(dispex_data_t*,compat_mode_t);
void *HTMLDOMNode_QI(HTMLDOMNode*,REFIID); diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index c062b117c5d..d50e1b1ce7b 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -525,7 +525,7 @@ static HRESULT WINAPI HTMLXMLHttpRequest_QueryInterface(IHTMLXMLHttpRequest *ifa }else if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) { *ppv = &This->IProvideClassInfo2_iface; }else { - return EventTarget_QI(&This->event_target, riid, ppv); + return EventTarget_QI_with_dispex(&This->event_target, riid, ppv); }
IUnknown_AddRef((IUnknown*)*ppv);
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmldoc.c | 2 ++ dlls/mshtml/htmlelem.c | 1 + dlls/mshtml/htmlevent.c | 13 ++++++++++ dlls/mshtml/htmlnode.c | 46 ++++++++++-------------------------- dlls/mshtml/htmltextnode.c | 1 + dlls/mshtml/mshtml_private.h | 2 ++ 6 files changed, 32 insertions(+), 33 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index a71bace23ab..890b621ef95 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 @@ -6053,6 +6054,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 7cbe8333542..917411ccda9 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -4558,6 +4558,19 @@ static HRESULT get_gecko_target(IEventTarget *target, nsIDOMEventTarget **ret) return S_OK; }
+void *EventTarget_QI(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_with_dispex(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 3f127899563..11e611337d4 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -492,39 +492,19 @@ static HRESULT WINAPI HTMLDOMNode_QueryInterface(IHTMLDOMNode *iface, REFIID riid, void **ppv) { 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; - } - - return E_NOINTERFACE; + return IDispatchEx_QueryInterface(&This->event_target.dispex.IDispatchEx_iface, riid, ppv); }
static ULONG WINAPI HTMLDOMNode_AddRef(IHTMLDOMNode *iface) { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface); - LONG ref = dispex_ref_incr(&This->event_target.dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; + return IDispatchEx_AddRef(&This->event_target.dispex.IDispatchEx_iface); }
static ULONG WINAPI HTMLDOMNode_Release(IHTMLDOMNode *iface) { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface); - LONG ref = dispex_ref_decr(&This->event_target.dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; + return IDispatchEx_Release(&This->event_target.dispex.IDispatchEx_iface); }
static HRESULT WINAPI HTMLDOMNode_GetTypeInfoCount(IHTMLDOMNode *iface, UINT *pctinfo) @@ -1437,6 +1417,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 +1464,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 +1477,7 @@ void *HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid) if(IsEqualGUID(&IID_IHTMLDOMNode3, riid)) return &This->IHTMLDOMNode3_iface;
- hres = EventTarget_QI_with_dispex(&This->event_target, riid, (void**)&unk); - if(hres != S_OK) - return NULL; - - IUnknown_Release(unk); - return unk; + return EventTarget_QI(&This->event_target, riid); }
static HRESULT HTMLDOMNode_clone(HTMLDOMNode *This, nsIDOMNode *nsnode, HTMLDOMNode **ret) @@ -1530,7 +1509,7 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno node->IHTMLDOMNode2_iface.lpVtbl = &HTMLDOMNode2Vtbl; node->IHTMLDOMNode3_iface.lpVtbl = &HTMLDOMNode3Vtbl;
- EventTarget_Init(&node->event_target, (IUnknown*)&node->IHTMLDOMNode_iface, dispex_data, doc->document_mode); + EventTarget_Init(&node->event_target, NULL, dispex_data, doc->document_mode);
if(&doc->node != node) IHTMLDOMNode_AddRef(&doc->node.IHTMLDOMNode_iface); @@ -1544,6 +1523,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 9cb2e47d112..9d059c16315 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1210,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_QI(EventTarget*,REFIID); HRESULT EventTarget_QI_with_dispex(EventTarget*,REFIID,void**); void EventTarget_init_dispex_info(dispex_data_t*,compat_mode_t);
void *HTMLDOMNode_QI(HTMLDOMNode*,REFIID); +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 | 139 +++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 73 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index b9b55dbdeb3..10c95558203 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -157,102 +157,84 @@ 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; - - return EventTarget_QI_with_dispex(&This->event_target, riid, ppv); + return IDispatchEx_QueryInterface(&This->event_target.dispex.IDispatchEx_iface, riid, ppv); }
static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface) { HTMLInnerWindow *This = HTMLInnerWindow_from_IHTMLWindow2(iface); - LONG ref = dispex_ref_incr(&This->event_target.dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; + return IDispatchEx_AddRef(&This->event_target.dispex.IDispatchEx_iface); }
static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface) { HTMLInnerWindow *This = HTMLInnerWindow_from_IHTMLWindow2(iface); - LONG ref = dispex_ref_decr(&This->event_target.dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; + return IDispatchEx_Release(&This->event_target.dispex.IDispatchEx_iface); }
static HRESULT WINAPI 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 +3910,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_QI(&This->event_target, riid); +} + static void HTMLWindow_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); @@ -4294,6 +4287,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, @@ -4437,8 +4431,7 @@ static HRESULT create_inner_window(HTMLOuterWindow *outer_window, IMoniker *mon, window->base.outer_window = outer_window; window->base.inner_window = window;
- EventTarget_Init(&window->event_target, (IUnknown*)&window->base.IHTMLWindow2_iface, - &HTMLWindow_dispex, COMPAT_MODE_NONE); + EventTarget_Init(&window->event_target, NULL, &HTMLWindow_dispex, COMPAT_MODE_NONE);
window->task_magic = get_task_target_magic();
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 26 ++-------------- dlls/mshtml/htmlnode.c | 2 +- dlls/mshtml/htmlwindow.c | 2 +- dlls/mshtml/mshtml_private.h | 3 +- dlls/mshtml/xmlhttprequest.c | 60 +++++++++++++++--------------------- 5 files changed, 30 insertions(+), 63 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 917411ccda9..f4573cdaf95 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -4571,27 +4571,6 @@ void *EventTarget_QI(EventTarget *event_target, REFIID riid) return NULL; }
-HRESULT EventTarget_QI_with_dispex(EventTarget *event_target, REFIID riid, void **ppv) -{ - if(IsEqualGUID(riid, &IID_IEventTarget)) { - if(use_event_quirks(event_target)) { - WARN("IEventTarget queried, but not supported by in document mode\n"); - *ppv = NULL; - return E_NOINTERFACE; - } - IEventTarget_AddRef(&event_target->IEventTarget_iface); - *ppv = &event_target->IEventTarget_iface; - return S_OK; - } - - if(dispex_query_interface(&event_target->dispex, riid, ppv)) - return *ppv ? S_OK : E_NOINTERFACE; - - WARN("(%p)->(%s %p)\n", event_target, debugstr_mshtml_guid(riid), ppv); - *ppv = NULL; - return E_NOINTERFACE; -} - void EventTarget_init_dispex_info(dispex_data_t *dispex_info, compat_mode_t compat_mode) { static const dispex_hook_t IEventTarget_hooks[] = { @@ -4609,10 +4588,9 @@ static int event_id_cmp(const void *key, const struct wine_rb_entry *entry) return wcscmp(key, WINE_RB_ENTRY_VALUE(entry, listener_container_t, entry)->type); }
-void EventTarget_Init(EventTarget *event_target, IUnknown *outer, dispex_static_data_t *dispex_data, - compat_mode_t compat_mode) +void EventTarget_Init(EventTarget *event_target, dispex_static_data_t *dispex_data, compat_mode_t compat_mode) { - init_dispatch(&event_target->dispex, outer, dispex_data, compat_mode); + init_dispatch(&event_target->dispex, NULL, dispex_data, compat_mode); event_target->IEventTarget_iface.lpVtbl = &EventTargetVtbl; wine_rb_init(&event_target->handler_map, event_id_cmp); } diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 11e611337d4..0b1a69573e3 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -1509,7 +1509,7 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno node->IHTMLDOMNode2_iface.lpVtbl = &HTMLDOMNode2Vtbl; node->IHTMLDOMNode3_iface.lpVtbl = &HTMLDOMNode3Vtbl;
- EventTarget_Init(&node->event_target, NULL, dispex_data, doc->document_mode); + EventTarget_Init(&node->event_target, dispex_data, doc->document_mode);
if(&doc->node != node) IHTMLDOMNode_AddRef(&doc->node.IHTMLDOMNode_iface); diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 10c95558203..e505c02cbb2 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -4431,7 +4431,7 @@ static HRESULT create_inner_window(HTMLOuterWindow *outer_window, IMoniker *mon, window->base.outer_window = outer_window; window->base.inner_window = window;
- EventTarget_Init(&window->event_target, NULL, &HTMLWindow_dispex, COMPAT_MODE_NONE); + EventTarget_Init(&window->event_target, &HTMLWindow_dispex, COMPAT_MODE_NONE);
window->task_magic = get_task_target_magic();
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 9d059c16315..542d86106cd 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1209,9 +1209,8 @@ HRESULT create_svg_element(HTMLDocumentNode*,nsIDOMSVGElement*,const WCHAR*,HTML void HTMLDOMNode_Init(HTMLDocumentNode*,HTMLDOMNode*,nsIDOMNode*,dispex_static_data_t*); void HTMLElement_Init(HTMLElement*,HTMLDocumentNode*,nsIDOMElement*,dispex_static_data_t*);
-void EventTarget_Init(EventTarget*,IUnknown*,dispex_static_data_t*,compat_mode_t); +void EventTarget_Init(EventTarget*,dispex_static_data_t*,compat_mode_t); void *EventTarget_QI(EventTarget*,REFIID); -HRESULT EventTarget_QI_with_dispex(EventTarget*,REFIID,void**); void EventTarget_init_dispex_info(dispex_data_t*,compat_mode_t);
void *HTMLDOMNode_QI(HTMLDOMNode*,REFIID); diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index d50e1b1ce7b..91cb007d08c 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -507,49 +507,19 @@ static inline HTMLXMLHttpRequest *impl_from_IHTMLXMLHttpRequest(IHTMLXMLHttpRequ static HRESULT WINAPI HTMLXMLHttpRequest_QueryInterface(IHTMLXMLHttpRequest *iface, REFIID riid, void **ppv) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); - - TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - - if(IsEqualGUID(&IID_IUnknown, riid)) { - *ppv = &This->IHTMLXMLHttpRequest_iface; - }else if(IsEqualGUID(&IID_IDispatch, riid)) { - *ppv = &This->IHTMLXMLHttpRequest_iface; - }else if(IsEqualGUID(&IID_IHTMLXMLHttpRequest, riid)) { - *ppv = &This->IHTMLXMLHttpRequest_iface; - }else if(IsEqualGUID(&IID_IHTMLXMLHttpRequest2, riid)) { - *ppv = &This->IHTMLXMLHttpRequest2_iface; - }else if(IsEqualGUID(&IID_IWineXMLHttpRequestPrivate, riid)) { - *ppv = &This->IWineXMLHttpRequestPrivate_iface; - }else if(IsEqualGUID(&IID_IProvideClassInfo, riid)) { - *ppv = &This->IProvideClassInfo2_iface; - }else if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) { - *ppv = &This->IProvideClassInfo2_iface; - }else { - return EventTarget_QI_with_dispex(&This->event_target, riid, ppv); - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return IDispatchEx_QueryInterface(&This->event_target.dispex.IDispatchEx_iface, riid, ppv); }
static ULONG WINAPI HTMLXMLHttpRequest_AddRef(IHTMLXMLHttpRequest *iface) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); - LONG ref = dispex_ref_incr(&This->event_target.dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; + return IDispatchEx_AddRef(&This->event_target.dispex.IDispatchEx_iface); }
static ULONG WINAPI HTMLXMLHttpRequest_Release(IHTMLXMLHttpRequest *iface) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); - LONG ref = dispex_ref_decr(&This->event_target.dispex); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; + return IDispatchEx_Release(&This->event_target.dispex.IDispatchEx_iface); }
static HRESULT WINAPI HTMLXMLHttpRequest_GetTypeInfoCount(IHTMLXMLHttpRequest *iface, UINT *pctinfo) @@ -1517,6 +1487,26 @@ static inline HTMLXMLHttpRequest *impl_from_DispatchEx(DispatchEx *iface) return CONTAINING_RECORD(iface, HTMLXMLHttpRequest, event_target.dispex); }
+static void *HTMLXMLHttpRequest_query_interface(DispatchEx *dispex, REFIID riid) +{ + HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex); + + TRACE("(%p)->(%s)\n", This, debugstr_mshtml_guid(riid)); + + if(IsEqualGUID(&IID_IHTMLXMLHttpRequest, riid)) + return &This->IHTMLXMLHttpRequest_iface; + if(IsEqualGUID(&IID_IHTMLXMLHttpRequest2, riid)) + return &This->IHTMLXMLHttpRequest2_iface; + if(IsEqualGUID(&IID_IWineXMLHttpRequestPrivate, riid)) + return &This->IWineXMLHttpRequestPrivate_iface; + if(IsEqualGUID(&IID_IProvideClassInfo, riid)) + return &This->IProvideClassInfo2_iface; + if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) + return &This->IProvideClassInfo2_iface; + + return EventTarget_QI(&This->event_target, riid); +} + static void HTMLXMLHttpRequest_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb) { HTMLXMLHttpRequest *This = impl_from_DispatchEx(dispex); @@ -1606,6 +1596,7 @@ static void HTMLXMLHttpRequest_init_dispex_info(dispex_data_t *info, compat_mode
static const event_target_vtbl_t HTMLXMLHttpRequest_event_target_vtbl = { { + .query_interface = HTMLXMLHttpRequest_query_interface, .destructor = HTMLXMLHttpRequest_destructor, .traverse = HTMLXMLHttpRequest_traverse, .unlink = HTMLXMLHttpRequest_unlink, @@ -1748,8 +1739,7 @@ static HRESULT WINAPI HTMLXMLHttpRequestFactory_create(IHTMLXMLHttpRequestFactor ret->IHTMLXMLHttpRequest2_iface.lpVtbl = &HTMLXMLHttpRequest2Vtbl; ret->IWineXMLHttpRequestPrivate_iface.lpVtbl = &WineXMLHttpRequestPrivateVtbl; ret->IProvideClassInfo2_iface.lpVtbl = &ProvideClassInfo2Vtbl; - EventTarget_Init(&ret->event_target, (IUnknown*)&ret->IHTMLXMLHttpRequest_iface, - &HTMLXMLHttpRequest_dispex, This->window->doc->document_mode); + EventTarget_Init(&ret->event_target, &HTMLXMLHttpRequest_dispex, This->window->doc->document_mode);
/* Always register the handlers because we need them to track state */ event_listener->nsIDOMEventListener_iface.lpVtbl = &XMLHttpReqEventListenerVtbl;
The inner window is an implementation detail and should never be accessed directly by non-mshtml code.
This is not true. We currently pass inner window as a script global object and the attached [test](/uploads/2621613fc9e1ca17295d37b0b9cbb6b3/patch.diff) shows that we shouldn't use outer windows there. I don't remember details, but I recall seeing similar things in dom.c tests. It's likely that we don't handle it exactly like native does, so there may room for improvements, but generally it makes sense for the global script object to not follow navigation.
Jacek Caban (@jacek) commented about dlls/mshtml/htmlanchor.c:
-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;
TRACE("(%p)->(IID_IUnknown)\n", This);
}else if(IsEqualGUID(&IID_IDispatch, riid)) {return &This->IHTMLAnchorElement_iface;
TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
*ppv = &This->IHTMLAnchorElement_iface;
TRACE("(%p)->(IID_IDispatch)\n", This);
Let's get rid of those traces, we have `debugstr_mshtml_guid` now so they are no longer needed.
Jacek Caban (@jacek) commented about dlls/mshtml/dispex.c:
{ DispatchEx *This = impl_from_IDispatchEx(iface);
- return IUnknown_QueryInterface(This->outer, riid, ppv);
- if(This->outer)
return IUnknown_QueryInterface(This->outer, riid, ppv);
- TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
- if(This->info->desc->vtbl->query_interface) {
You could just call it from `dispex_query_interface` and keep outer pointer valid for now. This should simplify the transition and avoid all those `if(This->outer)` branches. Once all objects' QueryInterface implementations simply forward to `dispex_query_interface`, it will be easier to switch.
On Mon Sep 4 16:26:33 2023 +0000, Jacek Caban wrote:
The inner window is an implementation detail and should never be accessed directly by non-mshtml code.
This is not true. We currently pass inner window as a script global object and the attached [test](/uploads/2621613fc9e1ca17295d37b0b9cbb6b3/patch.diff) shows that we shouldn't use outer windows there. I don't remember details, but I recall seeing similar things in dom.c tests. It's likely that we don't handle it exactly like native does, so there may room for improvements, but generally it makes sense for the global script object to not follow navigation.
I'll have to look into this, but AFAIK it was exactly script hosts that I wrote tests for (well semi hackish for now) that required outer window, because they can get "moved" if e.g. initialized on initial empty doc. But at least for jscript code (not the engine) it seems it's always the outer window.
On Mon Sep 4 15:56:32 2023 +0000, Jacek Caban wrote:
You could just call it from `dispex_query_interface` and keep outer pointer valid for now. This should simplify the transition and avoid all those `if(This->outer)` branches. Once all objects' QueryInterface implementations simply forward to `dispex_query_interface`, it will be easier to switch.
Sorry, I don't get it. What's the point of calling it from `dispex_query_interface`? It's currently used in custom QI implementations, and the whole point is to get rid of those now, one at a time.
Do you mean to just have a `dispex_query_interface` call in each QueryInterface, but move all the other interfaces to the vtbl method? I don't think it will be exactly simpler than forwarding, but at least it keeps `outer` valid I guess.
But at least for jscript code (not the engine) it seems it's always the outer window.
Yes, the distinction should likely be hidden from js code, but there are other ways to do that, so tests written in js may not be conclusive. There is, for example, `IObjectIdentity` interface, see `disp_cmp` in jscript.
On Mon Sep 4 18:52:51 2023 +0000, Jacek Caban wrote:
But at least for jscript code (not the engine) it seems it's always
the outer window. Yes, the distinction should likely be hidden from js code, but there are other ways to do that, so tests written in js may not be conclusive. There is, for example, `IObjectIdentity` interface, see `disp_cmp` in jscript.
Ok, this is a bit confusing to me. According to your test, it fails on Windows, because the iface is actually equal (i.e. it *is* the outer window), see: https://testbot.winehq.org/JobDetails.pl?Key=137021
I tried to query for IHTMLWindow2 and so on as well. I know there's a bunch of messed up stuff on native, see `ActiveScript2_AddNamedItem` comment in the tests. But this does look to me like it gives the outer window to scripts? Am I missing something here?
BTW the reason it fails on wine (it's todo_wine in the testbot patch above) is because we return the inner window in `GetItemInfo` instead of the outer window. This would be a separate fix/change of course. But still, that means the outer window is given to script engines.
Jacek Caban (@jacek) commented about dlls/mshtml/htmlwindow.c:
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;
I think this needs `AddRef`, we don't own `outer_window` reference here.
Jacek Caban (@jacek) commented about dlls/mshtml/mshtml_private.h:
void HTMLElement_Init(HTMLElement*,HTMLDocumentNode*,nsIDOMElement*,dispex_static_data_t*);
void EventTarget_Init(EventTarget*,IUnknown*,dispex_static_data_t*,compat_mode_t); -HRESULT EventTarget_QI(EventTarget*,REFIID,void**); +HRESULT EventTarget_QI_with_dispex(EventTarget*,REFIID,void**);
Looking at how you change the code changes, we should probably name the new version `EventTarget_query_interface` (eg, we will ultimately get rid of things like `HTMLDOMNode_QI` and `HTMLElement_QI`, right?) for consistency. This means that we don't need this rename.
On Wed Sep 6 10:26:36 2023 +0000, Gabriel Ivăncescu wrote:
Ok, this is a bit confusing to me. According to your test, it fails on Windows, because the iface is actually equal (i.e. it *is* the outer window), see: https://testbot.winehq.org/JobDetails.pl?Key=137021 I tried to query for IHTMLWindow2 and so on as well. I know there's a bunch of messed up stuff on native, see `ActiveScript2_AddNamedItem` comment in the tests. But this does look to me like it gives the outer window to scripts? Am I missing something here? BTW the reason it fails on wine (it's todo_wine in the testbot patch above) is because we return the inner window in `GetItemInfo` instead of the outer window. This would be a separate fix/change of course. But still, that means the outer window is given to script engines.
Yeah, I messed up that test, sorry. That's probably fine.
On Wed Sep 6 10:27:38 2023 +0000, Gabriel Ivăncescu wrote:
Sorry, I don't get it. What's the point of calling it from `dispex_query_interface`? It's currently used in custom QI implementations, and the whole point is to get rid of those now, one at a time. Do you mean to just have a `dispex_query_interface` call in each QueryInterface, but move all the other interfaces to the vtbl method? I don't think it will be exactly simpler than forwarding, but at least it keeps `outer` valid I guess.
`dispex_query_interface` is indeed not the best choice. We could have another helper, but I think I can live with this solution as well.
On Wed Sep 6 10:25:59 2023 +0000, Jacek Caban wrote:
I think this needs `AddRef`, we don't own `outer_window` reference here.
I decided to put the `AddRef` at the caller because it avoids conditionally `AddRef`ing (when there's no method) and simplifies the other helper too.