Module: wine Branch: master Commit: 24c3ce6f811e6fa1ba6a5bcad093c0a3f17518bd URL: https://gitlab.winehq.org/wine/wine/-/commit/24c3ce6f811e6fa1ba6a5bcad093c0a...
Author: Gabriel Ivăncescu gabrielopcode@gmail.com Date: Mon Jan 29 16:59:39 2024 +0200
mshtml: Forward the script site's QueryService to the document's.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com
---
dlls/mshtml/script.c | 23 +++-------------------- dlls/mshtml/service.c | 5 +++++ dlls/mshtml/tests/script.c | 27 ++++++++++++++++++++++----- 3 files changed, 30 insertions(+), 25 deletions(-)
diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c index cad0f17671a..4e15ed6c9b8 100644 --- a/dlls/mshtml/script.c +++ b/dlls/mshtml/script.c @@ -675,27 +675,10 @@ static HRESULT WINAPI ASServiceProvider_QueryService(IServiceProvider *iface, RE { ScriptHost *This = impl_from_IServiceProvider(iface);
- if(IsEqualGUID(&SID_SInternetHostSecurityManager, guidService)) { - TRACE("(%p)->(SID_SInternetHostSecurityManager)\n", This); - - if(!This->window || !This->window->doc) - return E_NOINTERFACE; - - return IInternetHostSecurityManager_QueryInterface(&This->window->doc->IInternetHostSecurityManager_iface, - riid, ppv); - } - - if(IsEqualGUID(&SID_SContainerDispatch, guidService)) { - TRACE("(%p)->(SID_SContainerDispatch)\n", This); - - if(!This->window || !This->window->doc) - return E_NOINTERFACE; - - return IHTMLDocument2_QueryInterface(&This->window->doc->IHTMLDocument2_iface, riid, ppv); - } + if(!This->window || !This->window->doc) + return E_NOINTERFACE;
- FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv); - return E_NOINTERFACE; + return IServiceProvider_QueryService(&This->window->doc->IServiceProvider_iface, guidService, riid, ppv); }
static const IServiceProviderVtbl ASServiceProviderVtbl = { diff --git a/dlls/mshtml/service.c b/dlls/mshtml/service.c index 1f440b846e8..01dd9fee836 100644 --- a/dlls/mshtml/service.c +++ b/dlls/mshtml/service.c @@ -360,6 +360,11 @@ static HRESULT WINAPI DocNodeServiceProvider_QueryService(IServiceProvider *ifac { HTMLDocumentNode *This = HTMLDocumentNode_from_IServiceProvider(iface);
+ if(IsEqualGUID(&SID_SInternetHostSecurityManager, guidService)) { + TRACE("SID_SInternetHostSecurityManager\n"); + return IInternetHostSecurityManager_QueryInterface(&This->IInternetHostSecurityManager_iface, riid, ppv); + } + if(IsEqualGUID(&SID_SContainerDispatch, guidService)) { TRACE("SID_SContainerDispatch\n"); return IHTMLDocument2_QueryInterface(&This->IHTMLDocument2_iface, riid, ppv); diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index 68ad3002a7f..35c3680093d 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -197,16 +197,16 @@ static BOOL skip_loadobject_tests; static IActiveScriptSite *site, *site2; static SCRIPTSTATE state, state2;
-static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2) +static BOOL iface_cmp(void *iface1, void *iface2) { IUnknown *unk1, *unk2;
if(iface1 == iface2) return TRUE;
- IUnknown_QueryInterface(iface1, &IID_IHTMLWindow2, (void**)&unk1); + IUnknown_QueryInterface((IUnknown*)iface1, &IID_IUnknown, (void**)&unk1); IUnknown_Release(unk1); - IUnknown_QueryInterface(iface2, &IID_IHTMLWindow2, (void**)&unk2); + IUnknown_QueryInterface((IUnknown*)iface2, &IID_IUnknown, (void**)&unk2); IUnknown_Release(unk2);
return unk1 == unk2; @@ -2265,8 +2265,10 @@ static void test_security_reg(IInternetHostSecurityManager *sec_mgr, DWORD polic
static void test_security(void) { - IInternetHostSecurityManager *sec_mgr; + IInternetHostSecurityManager *sec_mgr, *sec_mgr2; IServiceProvider *sp; + IHTMLWindow2 *window; + IHTMLDocument2 *doc; DWORD policy, policy_size; struct CONFIRMSAFETY cs; BYTE *ppolicy; @@ -2280,6 +2282,21 @@ static void test_security(void) IServiceProvider_Release(sp); ok(hres == S_OK, "QueryService failed: %08lx\n", hres);
+ hres = IDispatchEx_QueryInterface(window_dispex, &IID_IHTMLWindow2, (void**)&window); + ok(hres == S_OK, "Could not get IHTMLWindow2 iface: %08lx\n", hres); + hres = IHTMLWindow2_get_document(window, &doc); + ok(hres == S_OK, "get_document failed: %08lx\n", hres); + hres = IHTMLDocument2_QueryInterface(doc, &IID_IServiceProvider, (void**)&sp); + ok(hres == S_OK, "Could not get IServiceProvider iface: %08lx\n", hres); + IHTMLWindow2_Release(window); + IHTMLDocument2_Release(doc); + + hres = IServiceProvider_QueryService(sp, &SID_SInternetHostSecurityManager, &IID_IInternetHostSecurityManager, (void**)&sec_mgr2); + ok(hres == S_OK, "QueryService failed: %08lx\n", hres); + ok(iface_cmp(sec_mgr, sec_mgr2), "sec_mgr != sec_mgr2\n"); + IInternetHostSecurityManager_Release(sec_mgr2); + IServiceProvider_Release(sp); + hres = IInternetHostSecurityManager_ProcessUrlAction(sec_mgr, URLACTION_ACTIVEX_RUN, (BYTE*)&policy, sizeof(policy), (BYTE*)&CLSID_TestActiveX, sizeof(CLSID), 0, 0); ok(hres == S_OK, "ProcessUrlAction failed: %08lx\n", hres); @@ -4498,7 +4515,7 @@ static void test_exec_script(IHTMLDocument2 *doc, const WCHAR *codew, const WCHA hres = IHTMLDocument2_get_parentWindow(doc, &window); ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
- ok(iface_cmp((IUnknown *)window, (IUnknown *)window_dispex), "window != dispex_window\n"); + ok(iface_cmp(window, window_dispex), "window != dispex_window\n");
code = SysAllocString(codew); lang = SysAllocString(langw);