mshtml: Use query_interface in the dispex vtbl for inner windows.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode@gmail.com>
This commit is contained in:
Gabriel Ivăncescu 2023-09-07 16:07:00 +03:00 committed by Alexandre Julliard
parent 47393c300e
commit 070b51d7b7

View file

@ -157,70 +157,64 @@ static inline HTMLOuterWindow *HTMLOuterWindow_from_IHTMLWindow2(IHTMLWindow2 *i
return CONTAINING_RECORD(iface, HTMLOuterWindow, base.IHTMLWindow2_iface);
}
static HRESULT base_query_interface(HTMLWindow *This, REFIID riid, void **ppv)
static void *base_query_interface(HTMLWindow *This, REFIID riid)
{
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;
if(IsEqualGUID(&IID_IUnknown, riid))
return &This->IHTMLWindow2_iface;
if(IsEqualGUID(&IID_IDispatch, riid))
return &This->IHTMLWindow2_iface;
if(IsEqualGUID(&IID_IDispatchEx, riid))
return &This->IDispatchEx_iface;
if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid))
return &This->IHTMLWindow2_iface;
if(IsEqualGUID(&IID_IHTMLWindow2, riid))
return &This->IHTMLWindow2_iface;
if(IsEqualGUID(&IID_IHTMLWindow3, riid))
return &This->IHTMLWindow3_iface;
if(IsEqualGUID(&IID_IHTMLWindow4, riid))
return &This->IHTMLWindow4_iface;
if(IsEqualGUID(&IID_IHTMLWindow5, riid))
return &This->IHTMLWindow5_iface;
if(IsEqualGUID(&IID_IHTMLWindow6, riid))
return &This->IHTMLWindow6_iface;
if(IsEqualGUID(&IID_IHTMLWindow7, riid))
return &This->IHTMLWindow7_iface;
if(IsEqualGUID(&IID_IHTMLPrivateWindow, riid))
return &This->IHTMLPrivateWindow_iface;
if(IsEqualGUID(&IID_IServiceProvider, riid))
return &This->IServiceProvider_iface;
if(IsEqualGUID(&IID_ITravelLogClient, riid))
return &This->ITravelLogClient_iface;
if(IsEqualGUID(&IID_IObjectIdentity, riid))
return &This->IObjectIdentity_iface;
if(IsEqualGUID(&IID_IProvideClassInfo, riid))
return &This->IProvideMultipleClassInfo_iface;
if(IsEqualGUID(&IID_IProvideClassInfo2, riid))
return &This->IProvideMultipleClassInfo_iface;
if(IsEqualGUID(&IID_IProvideMultipleClassInfo, riid))
return &This->IProvideMultipleClassInfo_iface;
if(IsEqualGUID(&IID_IWineHTMLWindowPrivate, riid))
return &This->IWineHTMLWindowPrivate_iface;
if(IsEqualGUID(&IID_IWineHTMLWindowCompatPrivate, riid))
return &This->IWineHTMLWindowCompatPrivate_iface;
if(IsEqualGUID(&IID_IMarshal, riid)) {
FIXME("(%p)->(IID_IMarshal)\n", This);
return NULL;
}
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
return NULL;
}
static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
{
HTMLInnerWindow *This = HTMLInnerWindow_from_IHTMLWindow2(iface);
HRESULT hres;
TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
if(dispex_query_interface(&This->event_target.dispex, riid, ppv))
return *ppv ? S_OK : E_NOINTERFACE;
hres = base_query_interface(&This->base, riid, ppv);
if(hres != S_FALSE)
return hres;
return EventTarget_QI(&This->event_target, riid, ppv);
*ppv = NULL;
WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
return E_NOINTERFACE;
}
static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface)
@ -246,13 +240,15 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
static HRESULT WINAPI outer_window_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
{
HTMLOuterWindow *This = HTMLOuterWindow_from_IHTMLWindow2(iface);
HRESULT hres;
IUnknown *base_iface;
TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
hres = base_query_interface(&This->base, riid, ppv);
if(hres != S_FALSE)
return hres;
if((base_iface = base_query_interface(&This->base, riid))) {
*ppv = base_iface;
IUnknown_AddRef(base_iface);
return S_OK;
}
if(IsEqualGUID(&IID_nsXPCOMCycleCollectionParticipant, riid)) {
*ppv = &outer_window_ccp;
@ -3928,6 +3924,13 @@ static inline HTMLInnerWindow *impl_from_DispatchEx(DispatchEx *iface)
return CONTAINING_RECORD(iface, HTMLInnerWindow, event_target.dispex);
}
static void *HTMLWindow_query_interface(DispatchEx *dispex, REFIID riid)
{
HTMLInnerWindow *This = impl_from_DispatchEx(dispex);
void *iface = base_query_interface(&This->base, riid);
return iface ? iface : EventTarget_query_interface(&This->event_target, riid);
}
static void HTMLWindow_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCallback *cb)
{
HTMLInnerWindow *This = impl_from_DispatchEx(dispex);
@ -4294,6 +4297,7 @@ static IHTMLEventObj *HTMLWindow_set_current_event(DispatchEx *dispex, IHTMLEven
static const event_target_vtbl_t HTMLWindow_event_target_vtbl = {
{
.query_interface = HTMLWindow_query_interface,
.destructor = HTMLWindow_destructor,
.traverse = HTMLWindow_traverse,
.unlink = HTMLWindow_unlink,