Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700/* * Copyright 2008 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
#define COBJMACROS#define CONST_VTABLE
#include <initguid.h>#include <ole2.h>#include <activscp.h>#include <objsafe.h>#include <dispex.h>
#include "wine/test.h"
#ifdef _WIN64
#define IActiveScriptParse_QueryInterface IActiveScriptParse64_QueryInterface#define IActiveScriptParse_Release IActiveScriptParse64_Release#define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew#define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
#else
#define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface#define IActiveScriptParse_Release IActiveScriptParse32_Release#define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew#define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
#endif
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
static const CLSID CLSID_JScript = {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};static const CLSID CLSID_JScriptEncode = {0xf414c262,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
#define DEFINE_EXPECT(func) \ static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
#define SET_EXPECT(func) \ expect_ ## func = TRUE
#define CHECK_EXPECT2(func) \ do { \ ok(expect_ ##func, "unexpected call " #func "\n"); \ called_ ## func = TRUE; \ }while(0)
#define CHECK_EXPECT(func) \ do { \ CHECK_EXPECT2(func); \ expect_ ## func = FALSE; \ }while(0)
#define CHECK_CALLED(func) \ do { \ ok(called_ ## func, "expected " #func "\n"); \ expect_ ## func = called_ ## func = FALSE; \ }while(0)
DEFINE_EXPECT(GetLCID);DEFINE_EXPECT(OnStateChange_UNINITIALIZED);DEFINE_EXPECT(OnStateChange_STARTED);DEFINE_EXPECT(OnStateChange_CONNECTED);DEFINE_EXPECT(OnStateChange_DISCONNECTED);DEFINE_EXPECT(OnStateChange_CLOSED);DEFINE_EXPECT(OnStateChange_INITIALIZED);DEFINE_EXPECT(OnEnterScript);DEFINE_EXPECT(OnLeaveScript);
static const CLSID *engine_clsid = &CLSID_JScript;
static BSTR a2bstr(const char *str){ BSTR ret; int len;
len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); ret = SysAllocStringLen(NULL, len-1); MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
return ret;}
#define test_state(s,ss) _test_state(__LINE__,s,ss)static void _test_state(unsigned line, IActiveScript *script, SCRIPTSTATE exstate){ SCRIPTSTATE state = -1; HRESULT hres;
hres = IActiveScript_GetScriptState(script, &state); ok_(__FILE__,line) (hres == S_OK, "GetScriptState failed: %08x\n", hres); ok_(__FILE__,line) (state == exstate, "state=%d, expected %d\n", state, exstate);}
static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv){ *ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) *ppv = iface; else if(IsEqualGUID(&IID_IActiveScriptSite, riid)) *ppv = iface; else return E_NOINTERFACE;
IUnknown_AddRef((IUnknown*)*ppv); return S_OK;}
static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface){ return 2;}
static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface){ return 1;}
static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid){ CHECK_EXPECT(GetLCID); return E_NOTIMPL;}
static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState){ switch(ssScriptState) { case SCRIPTSTATE_UNINITIALIZED: CHECK_EXPECT(OnStateChange_UNINITIALIZED); return S_OK; case SCRIPTSTATE_STARTED: CHECK_EXPECT(OnStateChange_STARTED); return S_OK; case SCRIPTSTATE_CONNECTED: CHECK_EXPECT(OnStateChange_CONNECTED); return S_OK; case SCRIPTSTATE_DISCONNECTED: CHECK_EXPECT(OnStateChange_DISCONNECTED); return S_OK; case SCRIPTSTATE_CLOSED: CHECK_EXPECT(OnStateChange_CLOSED); return S_OK; case SCRIPTSTATE_INITIALIZED: CHECK_EXPECT(OnStateChange_INITIALIZED); return S_OK; default: ok(0, "unexpected call %d\n", ssScriptState); }
return E_NOTIMPL;}
static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror){ ok(0, "unexpected call\n"); return E_NOTIMPL;}
static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface){ CHECK_EXPECT(OnEnterScript); return S_OK;}
static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface){ CHECK_EXPECT(OnLeaveScript); return S_OK;}
static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = { ActiveScriptSite_QueryInterface, ActiveScriptSite_AddRef, ActiveScriptSite_Release, ActiveScriptSite_GetLCID, ActiveScriptSite_GetItemInfo, ActiveScriptSite_GetDocVersionString, ActiveScriptSite_OnScriptTerminate, ActiveScriptSite_OnStateChange, ActiveScriptSite_OnScriptError, ActiveScriptSite_OnEnterScript, ActiveScriptSite_OnLeaveScript};
static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
static void test_script_dispatch(IDispatchEx *dispex){ DISPPARAMS dp = {NULL,NULL,0,0}; EXCEPINFO ei; BSTR str; DISPID id; VARIANT v; HRESULT hres;
str = a2bstr("ActiveXObject"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id); SysFreeString(str); ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
str = a2bstr("Math"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id); SysFreeString(str); ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
memset(&ei, 0, sizeof(ei)); hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v)); ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(v) = NULL\n"); VariantClear(&v);
str = a2bstr("String"); hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id); SysFreeString(str); ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
memset(&ei, 0, sizeof(ei)); hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v)); ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(v) = NULL\n"); VariantClear(&v);}
static IDispatchEx *get_script_dispatch(IActiveScript *script){ IDispatchEx *dispex; IDispatch *disp; HRESULT hres;
disp = (void*)0xdeadbeef; hres = IActiveScript_GetScriptDispatch(script, NULL, &disp); ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); IDispatch_Release(disp); ok(hres == S_OK, "Could not get IDispatch iface: %08x\n", hres); return dispex;}
static void test_no_script_dispatch(IActiveScript *script){ IDispatch *disp; HRESULT hres;
disp = (void*)0xdeadbeef; hres = IActiveScript_GetScriptDispatch(script, NULL, &disp); ok(hres == E_UNEXPECTED, "hres = %08x, expected E_UNEXPECTED\n", hres); ok(!disp, "disp != NULL\n");}
static void test_safety(IUnknown *unk){ IObjectSafety *safety; DWORD supported, enabled; HRESULT hres;
hres = IUnknown_QueryInterface(unk, &IID_IObjectSafety, (void**)&safety); ok(hres == S_OK, "Could not get IObjectSafety: %08x\n", hres); if(FAILED(hres)) return;
hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, NULL); ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres); hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, NULL, &enabled); ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
supported = enabled = 0xdeadbeef; hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, &enabled); ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres); ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "supported=%x\n", supported); ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
supported = enabled = 0xdeadbeef; hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScript, &supported, &enabled); ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres); ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "supported=%x\n", supported); ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
supported = enabled = 0xdeadbeef; hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled); ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres); ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "supported=%x\n", supported); ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER |INTERFACESAFE_FOR_UNTRUSTED_CALLER, INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER); ok(hres == E_FAIL, "SetInterfaceSafetyOptions failed: %08x, expected E_FAIL\n", hres);
hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER, INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER); ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
supported = enabled = 0xdeadbeef; hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled); ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres); ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "supported=%x\n", supported); ok(enabled == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "enabled=%x\n", enabled);
hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA, 0); ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
supported = enabled = 0xdeadbeef; hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled); ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres); ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "supported=%x\n", supported); ok(enabled == (INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "enabled=%x\n", enabled);
hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER, 0); ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
supported = enabled = 0xdeadbeef; hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled); ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres); ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "supported=%x\n", supported); ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, INTERFACE_USES_DISPEX, 0); ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
supported = enabled = 0xdeadbeef; hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled); ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres); ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "supported=%x\n", supported); ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
IObjectSafety_Release(safety);}
static HRESULT set_script_prop(IActiveScript *engine, DWORD property, VARIANT *val){ IActiveScriptProperty *script_prop; HRESULT hres;
hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty, (void**)&script_prop); ok(hres == S_OK, "Could not get IActiveScriptProperty: %08x\n", hres); if(FAILED(hres)) return hres;
hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val); IActiveScriptProperty_Release(script_prop); return hres;}
static void test_invoke_versioning(IActiveScript *script){ VARIANT v; HRESULT hres;
V_VT(&v) = VT_NULL; hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v); if(hres == E_NOTIMPL) { win_skip("SCRIPTPROP_INVOKESTRING not supported\n"); return; } ok(hres == E_INVALIDARG, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
V_VT(&v) = VT_I2; V_I2(&v) = 0; hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v); ok(hres == E_INVALIDARG, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
V_VT(&v) = VT_I4; V_I4(&v) = 16; hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v); ok(hres == E_INVALIDARG, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
V_VT(&v) = VT_I4; V_I4(&v) = 2; hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v); ok(hres == S_OK, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);}
static IActiveScript *create_jscript(void){ IActiveScript *ret; HRESULT hres;
hres = CoCreateInstance(engine_clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IActiveScript, (void**)&ret); ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
return ret;}
static void test_jscript(void){ IActiveScriptParse *parse; IActiveScript *script; IDispatchEx *dispex; ULONG ref; HRESULT hres;
script = create_jscript();
hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse); ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
test_state(script, SCRIPTSTATE_UNINITIALIZED); test_safety((IUnknown*)script); test_invoke_versioning(script);
hres = IActiveScriptParse_InitNew(parse); ok(hres == S_OK, "InitNew failed: %08x\n", hres);
hres = IActiveScriptParse_InitNew(parse); ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres);
hres = IActiveScript_SetScriptSite(script, NULL); ok(hres == E_POINTER, "SetScriptSite failed: %08x, expected E_POINTER\n", hres);
test_state(script, SCRIPTSTATE_UNINITIALIZED); test_no_script_dispatch(script);
SET_EXPECT(GetLCID); SET_EXPECT(OnStateChange_INITIALIZED); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); CHECK_CALLED(GetLCID); CHECK_CALLED(OnStateChange_INITIALIZED);
test_state(script, SCRIPTSTATE_INITIALIZED);
hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
dispex = get_script_dispatch(script); test_script_dispatch(dispex);
SET_EXPECT(OnStateChange_STARTED); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_STARTED);
test_state(script, SCRIPTSTATE_STARTED);
SET_EXPECT(OnStateChange_CLOSED); hres = IActiveScript_Close(script); ok(hres == S_OK, "Close failed: %08x\n", hres); CHECK_CALLED(OnStateChange_CLOSED);
test_state(script, SCRIPTSTATE_CLOSED); test_no_script_dispatch(script); test_script_dispatch(dispex); IDispatchEx_Release(dispex);
IActiveScriptParse_Release(parse);
ref = IActiveScript_Release(script); ok(!ref, "ref = %d\n", ref);}
static void test_jscript2(void){ IActiveScriptParse *parse; IActiveScript *script; ULONG ref; HRESULT hres;
script = create_jscript();
hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse); ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
test_state(script, SCRIPTSTATE_UNINITIALIZED);
SET_EXPECT(GetLCID); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); CHECK_CALLED(GetLCID);
test_state(script, SCRIPTSTATE_UNINITIALIZED);
SET_EXPECT(OnStateChange_INITIALIZED); hres = IActiveScriptParse_InitNew(parse); ok(hres == S_OK, "InitNew failed: %08x\n", hres); CHECK_CALLED(OnStateChange_INITIALIZED);
hres = IActiveScriptParse_InitNew(parse); ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres);
SET_EXPECT(OnStateChange_CONNECTED); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_CONNECTED);
test_state(script, SCRIPTSTATE_CONNECTED);
SET_EXPECT(OnStateChange_DISCONNECTED); SET_EXPECT(OnStateChange_INITIALIZED); SET_EXPECT(OnStateChange_CLOSED); hres = IActiveScript_Close(script); ok(hres == S_OK, "Close failed: %08x\n", hres); CHECK_CALLED(OnStateChange_DISCONNECTED); CHECK_CALLED(OnStateChange_INITIALIZED); CHECK_CALLED(OnStateChange_CLOSED);
test_state(script, SCRIPTSTATE_CLOSED); test_no_script_dispatch(script);
IActiveScriptParse_Release(parse);
ref = IActiveScript_Release(script); ok(!ref, "ref = %d\n", ref);}
static void test_jscript_uninitializing(void){ IActiveScriptParse *parse; IActiveScript *script; IDispatchEx *dispex; ULONG ref; HRESULT hres;
static const WCHAR script_textW[] = {'f','u','n','c','t','i','o','n',' ','f','(',')',' ','{','}',0};
script = create_jscript();
hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse); ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
test_state(script, SCRIPTSTATE_UNINITIALIZED);
hres = IActiveScriptParse_InitNew(parse); ok(hres == S_OK, "InitNew failed: %08x\n", hres);
SET_EXPECT(GetLCID); SET_EXPECT(OnStateChange_INITIALIZED); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); CHECK_CALLED(GetLCID); CHECK_CALLED(OnStateChange_INITIALIZED);
test_state(script, SCRIPTSTATE_INITIALIZED);
hres = IActiveScriptParse_ParseScriptText(parse, script_textW, NULL, NULL, NULL, 0, 1, 0x42, NULL, NULL); ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
SET_EXPECT(OnStateChange_UNINITIALIZED); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_UNINITIALIZED);
test_state(script, SCRIPTSTATE_UNINITIALIZED);
hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
SET_EXPECT(GetLCID); SET_EXPECT(OnStateChange_INITIALIZED); hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); CHECK_CALLED(GetLCID); CHECK_CALLED(OnStateChange_INITIALIZED);
SET_EXPECT(OnStateChange_CONNECTED); SET_EXPECT(OnEnterScript); SET_EXPECT(OnLeaveScript); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_CONNECTED); CHECK_CALLED(OnEnterScript); CHECK_CALLED(OnLeaveScript);
test_state(script, SCRIPTSTATE_CONNECTED);
dispex = get_script_dispatch(script); ok(dispex != NULL, "dispex == NULL\n"); IDispatchEx_Release(dispex);
SET_EXPECT(OnStateChange_DISCONNECTED); SET_EXPECT(OnStateChange_INITIALIZED); SET_EXPECT(OnStateChange_UNINITIALIZED); hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED); ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres); CHECK_CALLED(OnStateChange_DISCONNECTED); CHECK_CALLED(OnStateChange_INITIALIZED); CHECK_CALLED(OnStateChange_UNINITIALIZED);
test_state(script, SCRIPTSTATE_UNINITIALIZED);
hres = IActiveScript_Close(script); ok(hres == S_OK, "Close failed: %08x\n", hres);
test_state(script, SCRIPTSTATE_CLOSED);
hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED); ok(hres == E_UNEXPECTED, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x, expected E_UNEXPECTED\n", hres);
test_state(script, SCRIPTSTATE_CLOSED);
IActiveScriptParse_Release(parse);
ref = IActiveScript_Release(script); ok(!ref, "ref = %d\n", ref);}
static void test_aggregation(void){ IUnknown *unk = (IUnknown*)0xdeadbeef; HRESULT hres;
hres = CoCreateInstance(&CLSID_JScript, (IUnknown*)0xdeadbeef, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void**)&unk); ok(hres == CLASS_E_NOAGGREGATION, "CoCreateInstance failed: %08x, expected CLASS_E_NOAGGREGATION\n", hres); ok(!unk || broken(unk != NULL), "unk = %p\n", unk);}
static BOOL check_jscript(void){ IActiveScriptProperty *script_prop; HRESULT hres;
hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IActiveScriptProperty, (void**)&script_prop); if(SUCCEEDED(hres)) IActiveScriptProperty_Release(script_prop);
return hres == S_OK;}
START_TEST(jscript){ CoInitialize(NULL);
if(check_jscript()) { trace("Testing JScript object...\n"); test_jscript(); test_jscript2(); test_jscript_uninitializing(); test_aggregation();
trace("Testing JScriptEncode object...\n"); engine_clsid = &CLSID_JScriptEncode; test_jscript(); }else { win_skip("Broken engine, probably too old\n"); }
CoUninitialize();}