From 19ec36c92b37725f70dbdd63303f7a51b91a238d Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Sun, 4 May 2008 19:20:40 +0200 Subject: [PATCH] mshtml: Added more script tests. --- dlls/mshtml/tests/script.c | 365 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 352 insertions(+), 13 deletions(-) diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index ac604cce06d..01a410e630a 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -26,8 +26,11 @@ #include "windef.h" #include "winbase.h" #include "ole2.h" +#include "dispex.h" #include "mshtml.h" #include "activscp.h" +#include "activdbg.h" +#include "objsafe.h" #define DEFINE_EXPECT(func) \ static BOOL expect_ ## func = FALSE, called_ ## func = FALSE @@ -64,7 +67,18 @@ DEFINE_EXPECT(CreateInstance); - +DEFINE_EXPECT(GetInterfaceSafetyOptions); +DEFINE_EXPECT(SetInterfaceSafetyOptions); +DEFINE_EXPECT(InitNew); +DEFINE_EXPECT(Close); +DEFINE_EXPECT(SetProperty); +DEFINE_EXPECT(SetScriptSite); +DEFINE_EXPECT(GetScriptState); +DEFINE_EXPECT(SetScriptState_STARTED); +DEFINE_EXPECT(SetScriptState_CONNECTED); +DEFINE_EXPECT(SetScriptState_DISCONNECTED); +DEFINE_EXPECT(AddNamedItem); +DEFINE_EXPECT(ParseScriptText); #define TESTSCRIPT_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80746}" @@ -74,6 +88,13 @@ static const GUID CLSID_TestScript = static IHTMLDocument2 *notif_doc; static BOOL doc_complete; +static const char *debugstr_w(LPCWSTR str) +{ + static char buf[1024]; + WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL); + return buf; +} + static const char *debugstr_guid(REFIID riid) { static char buf[50]; @@ -233,6 +254,202 @@ static IHTMLDocument2 *create_and_load_doc(const char *str) return doc; } +static IActiveScriptSite *site; +static SCRIPTSTATE state; + +static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI ObjectSafety_AddRef(IObjectSafety *iface) +{ + return 2; +} + +static ULONG WINAPI ObjectSafety_Release(IObjectSafety *iface) +{ + return 1; +} + +static HRESULT WINAPI ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid, + DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions) +{ + CHECK_EXPECT(GetInterfaceSafetyOptions); + + ok(IsEqualGUID(&IID_IActiveScriptParse, riid), "unexpected riid %s\n", debugstr_guid(riid)); + ok(pdwSupportedOptions != NULL, "pdwSupportedOptions == NULL\n"); + ok(pdwEnabledOptions != NULL, "pdwEnabledOptions == NULL\n"); + + *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER; + *pdwEnabledOptions = INTERFACE_USES_DISPEX; + + return S_OK; +} + +static HRESULT WINAPI ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid, + DWORD dwOptionSetMask, DWORD dwEnabledOptions) +{ + CHECK_EXPECT(SetInterfaceSafetyOptions); + + ok(IsEqualGUID(&IID_IActiveScriptParse, riid), "unexpected riid %s\n", debugstr_guid(riid)); + + ok(dwOptionSetMask == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), + "dwOptionSetMask=%x\n", dwOptionSetMask); + ok(dwEnabledOptions == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), + "dwEnabledOptions=%x\n", dwOptionSetMask); + + return S_OK; +} + +static const IObjectSafetyVtbl ObjectSafetyVtbl = { + ObjectSafety_QueryInterface, + ObjectSafety_AddRef, + ObjectSafety_Release, + ObjectSafety_GetInterfaceSafetyOptions, + ObjectSafety_SetInterfaceSafetyOptions +}; + +static IObjectSafety ObjectSafety = { &ObjectSafetyVtbl }; + +static HRESULT WINAPI ActiveScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI ActiveScriptProperty_AddRef(IActiveScriptProperty *iface) +{ + return 2; +} + +static ULONG WINAPI ActiveScriptProperty_Release(IActiveScriptProperty *iface) +{ + return 1; +} + +static HRESULT WINAPI ActiveScriptProperty_GetProperty(IActiveScriptProperty *iface, DWORD dwProperty, + VARIANT *pvarIndex, VARIANT *pvarValue) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty, + VARIANT *pvarIndex, VARIANT *pvarValue) +{ + CHECK_EXPECT(SetProperty); + + ok(dwProperty == SCRIPTPROP_HACK_TRIDENTEVENTSINK, "unexpected property %d\n", dwProperty); + ok(!pvarIndex, "pvarIndex != NULL\n"); + ok(pvarValue != NULL, "pvarValue == NULL\n"); + ok(V_VT(pvarValue) == VT_BOOL, "V_VT(pvarValue)=%d\n", V_VT(pvarValue)); + ok(V_BOOL(pvarValue) == VARIANT_TRUE, "V_BOOL(pvarValue)=%x\n", V_BOOL(pvarValue)); + + return E_NOTIMPL; +} + +static const IActiveScriptPropertyVtbl ActiveScriptPropertyVtbl = { + ActiveScriptProperty_QueryInterface, + ActiveScriptProperty_AddRef, + ActiveScriptProperty_Release, + ActiveScriptProperty_GetProperty, + ActiveScriptProperty_SetProperty +}; + +static IActiveScriptProperty ActiveScriptProperty = { &ActiveScriptPropertyVtbl }; + +static HRESULT WINAPI ActiveScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2 *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI ActiveScriptParseProcedure_AddRef(IActiveScriptParseProcedure2 *iface) +{ + return 2; +} + +static ULONG WINAPI ActiveScriptParseProcedure_Release(IActiveScriptParseProcedure2 *iface) +{ + return 1; +} + +static HRESULT WINAPI ActiveScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface, + LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName, + LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter, + DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static const IActiveScriptParseProcedure2Vtbl ActiveScriptParseProcedureVtbl = { + ActiveScriptParseProcedure_QueryInterface, + ActiveScriptParseProcedure_AddRef, + ActiveScriptParseProcedure_Release, + ActiveScriptParseProcedure_ParseProcedureText +}; + +static IActiveScriptParseProcedure2 ActiveScriptParseProcedure = { &ActiveScriptParseProcedureVtbl }; + +static HRESULT WINAPI ActiveScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + ok(0, "unexpected call\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI ActiveScriptParse_AddRef(IActiveScriptParse *iface) +{ + return 2; +} + +static ULONG WINAPI ActiveScriptParse_Release(IActiveScriptParse *iface) +{ + return 1; +} + +static HRESULT WINAPI ActiveScriptParse_InitNew(IActiveScriptParse *iface) +{ + CHECK_EXPECT(InitNew); + return S_OK; +} + +static HRESULT WINAPI ActiveScriptParse_AddScriptlet(IActiveScriptParse *iface, + LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, + LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter, + DWORD dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, + BSTR *pbstrName, EXCEPINFO *pexcepinfo) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *iface, + LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext, + LPCOLESTR pstrDelimiter, DWORD dwSourceContextCookie, ULONG ulStartingLine, + DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo) +{ + CHECK_EXPECT(ParseScriptText); + return E_NOTIMPL; +} + +static const IActiveScriptParseVtbl ActiveScriptParseVtbl = { + ActiveScriptParse_QueryInterface, + ActiveScriptParse_AddRef, + ActiveScriptParse_Release, + ActiveScriptParse_InitNew, + ActiveScriptParse_AddScriptlet, + ActiveScriptParse_ParseScriptText +}; + +static IActiveScriptParse ActiveScriptParse = { &ActiveScriptParseVtbl }; + static HRESULT WINAPI ActiveScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv) { *ppv = NULL; @@ -243,8 +460,23 @@ static HRESULT WINAPI ActiveScript_QueryInterface(IActiveScript *iface, REFIID r } if(IsEqualGUID(&IID_IActiveScriptParse, riid)) { - /* TODO */ - return E_NOINTERFACE; + *ppv = &ActiveScriptParse; + return S_OK; + } + + if(IsEqualGUID(&IID_IActiveScriptParseProcedure2, riid)) { + *ppv = &ActiveScriptParseProcedure; + return S_OK; + } + + if(IsEqualGUID(&IID_IActiveScriptProperty, riid)) { + *ppv = &ActiveScriptProperty; + return S_OK; + } + + if(IsEqualGUID(&IID_IObjectSafety, riid)) { + *ppv = &ObjectSafety; + return S_OK; } ok(0, "unexpected riid %s\n", debugstr_guid(riid)); @@ -263,8 +495,34 @@ static ULONG WINAPI ActiveScript_Release(IActiveScript *iface) static HRESULT WINAPI ActiveScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass) { - ok(0, "unexpected call\n"); - return E_NOTIMPL; + IActiveScriptSiteInterruptPoll *poll; + IActiveScriptSiteDebug *debug; + LCID lcid; + HRESULT hres; + + CHECK_EXPECT(SetScriptSite); + + ok(pass != NULL, "pass == NULL\n"); + + hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteInterruptPoll, (void**)&poll); + ok(hres == S_OK, "Could not get IActiveScriptSiteInterruptPoll interface: %08x\n", hres); + if(FAILED(hres)) + IActiveScriptSiteInterruptPoll_Release(poll); + + hres = IActiveScriptSite_GetLCID(pass, &lcid); + ok(hres == S_OK, "GetLCID failed: %08x\n", hres); + + hres = IActiveScriptSite_OnStateChange(pass, (state = SCRIPTSTATE_INITIALIZED)); + ok(hres == S_OK, "OnStateChange failed: %08x\n", hres); + + hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteDebug, (void**)&debug); + ok(hres == S_OK, "Could not get IActiveScriptSiteDebug interface: %08x\n", hres); + if(SUCCEEDED(hres)) + IActiveScriptSiteDebug32_Release(debug); + + site = pass; + IActiveScriptSite_AddRef(site); + return S_OK; } static HRESULT WINAPI ActiveScript_GetScriptSite(IActiveScript *iface, REFIID riid, @@ -276,27 +534,79 @@ static HRESULT WINAPI ActiveScript_GetScriptSite(IActiveScript *iface, REFIID ri static HRESULT WINAPI ActiveScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss) { - ok(0, "unexpected call\n"); - return E_NOTIMPL; + HRESULT hres; + + switch(ss) { + case SCRIPTSTATE_STARTED: + CHECK_EXPECT(SetScriptState_STARTED); + break; + case SCRIPTSTATE_CONNECTED: + CHECK_EXPECT(SetScriptState_CONNECTED); + break; + case SCRIPTSTATE_DISCONNECTED: + CHECK_EXPECT(SetScriptState_DISCONNECTED); + break; + default: + ok(0, "unexpected state %d\n", ss); + return E_NOTIMPL; + } + + hres = IActiveScriptSite_OnStateChange(site, (state = ss)); + return S_OK; } static HRESULT WINAPI ActiveScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState) { - ok(0, "unexpected call\n"); - return E_NOTIMPL; + CHECK_EXPECT(GetScriptState); + + *pssState = state; + return S_OK; } static HRESULT WINAPI ActiveScript_Close(IActiveScript *iface) { - ok(0, "unexpected call\n"); + CHECK_EXPECT(Close); return E_NOTIMPL; } static HRESULT WINAPI ActiveScript_AddNamedItem(IActiveScript *iface, - LPCOLESTR pstrName, DWORD dwFlags) + LPCOLESTR pstrName, DWORD dwFlags) { - ok(0, "unexpected call\n"); - return E_NOTIMPL; + IDispatchEx *dispex; + IDispatch *disp; + IUnknown *unk = NULL, *unk2; + HRESULT hres; + + static const WCHAR windowW[] = {'w','i','n','d','o','w',0}; + + static const IID unknown_iid = {0x719C3050,0xF9D3,0x11CF,{0xA4,0x93,0x00,0x40,0x05,0x23,0xA8,0xA0}}; + + CHECK_EXPECT(AddNamedItem); + + ok(!lstrcmpW(pstrName, windowW), "pstrName=%s\n", debugstr_w(pstrName)); + ok(dwFlags == (SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS), "dwFlags=%x\n", dwFlags); + + hres = IActiveScriptSite_GetItemInfo(site, windowW, SCRIPTINFO_IUNKNOWN, &unk, NULL); + ok(hres == S_OK, "GetItemInfo failed: %08x\n", hres); + ok(unk != NULL, "unk == NULL\n"); + + hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp); + ok(hres == S_OK, "Could not get IDispatch interface: %08x\n", hres); + if(SUCCEEDED(hres)) + IDispatch_Release(disp); + + hres = IUnknown_QueryInterface(unk, &unknown_iid, (void**)&unk2); + ok(hres == E_NOINTERFACE, "Got ?? interface: %p\n", unk2); + if(SUCCEEDED(hres)) + IUnknown_Release(unk2); + + hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex); + ok(hres == S_OK, "Could not get IDispatchEx interface: %08x\n", hres); + if(SUCCEEDED(hres)) + IDispatchEx_Release(dispex); + + IUnknown_Release(unk); + return S_OK; } static HRESULT WINAPI ActiveScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib, @@ -432,13 +742,42 @@ static void test_simple_script(void) IHTMLDocument2 *doc; SET_EXPECT(CreateInstance); + SET_EXPECT(GetInterfaceSafetyOptions); + SET_EXPECT(SetInterfaceSafetyOptions); + SET_EXPECT(SetProperty); + SET_EXPECT(InitNew); + SET_EXPECT(SetScriptSite); + SET_EXPECT(GetScriptState); + SET_EXPECT(SetScriptState_STARTED); + SET_EXPECT(AddNamedItem); + SET_EXPECT(ParseScriptText); + SET_EXPECT(SetScriptState_CONNECTED); doc = create_and_load_doc(simple_script_str); if(!doc) return; CHECK_CALLED(CreateInstance); + CHECK_CALLED(GetInterfaceSafetyOptions); + CHECK_CALLED(SetInterfaceSafetyOptions); + CHECK_CALLED(SetProperty); + CHECK_CALLED(InitNew); + CHECK_CALLED(SetScriptSite); + CHECK_CALLED(GetScriptState); + CHECK_CALLED(SetScriptState_STARTED); + CHECK_CALLED(AddNamedItem); + CHECK_CALLED(ParseScriptText); + CHECK_CALLED(SetScriptState_CONNECTED); + + if(site) + IActiveScriptSite_Release(site); + + SET_EXPECT(SetScriptState_DISCONNECTED); + SET_EXPECT(Close); IHTMLDocument2_Release(doc); + + CHECK_CALLED(SetScriptState_DISCONNECTED); + CHECK_CALLED(Close); } static BOOL init_key(const char *key_name, const char *def_value, BOOL init) -- 2.11.4.GIT