jscript: Lookup host global object on demand instead of storing it in script context.
[wine.git] / dlls / jscript / tests / jscript.c
blob8d4f6e1673a3c7c16dab5b117b1de22d79a5ebc9
1 /*
2 * Copyright 2008 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #define COBJMACROS
20 #define CONST_VTABLE
22 #include <initguid.h>
23 #include <ole2.h>
24 #include <activscp.h>
25 #include <objsafe.h>
26 #include <dispex.h>
28 #include "wine/test.h"
30 #ifdef _WIN64
32 #define IActiveScriptParse_QueryInterface IActiveScriptParse64_QueryInterface
33 #define IActiveScriptParse_Release IActiveScriptParse64_Release
34 #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
35 #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
36 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_64_Release
37 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_64_ParseProcedureText
39 #else
41 #define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface
42 #define IActiveScriptParse_Release IActiveScriptParse32_Release
43 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
44 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
45 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_32_Release
46 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_32_ParseProcedureText
48 #endif
50 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
51 DEFINE_GUID(IID_IScriptTypeInfo, 0xc59c6b12, 0xf6c1, 0x11cf, 0x88,0x35, 0x00,0xa0,0xc9,0x11,0xe8,0xb2);
53 static const CLSID CLSID_JScript =
54 {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
55 static const CLSID CLSID_JScriptEncode =
56 {0xf414c262,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
58 #define DEFINE_EXPECT(func) \
59 static int expect_ ## func = 0, called_ ## func = 0
61 #define SET_EXPECT(func) \
62 expect_ ## func = 1
64 #define SET_EXPECT_MULTI(func, num) \
65 expect_ ## func = num
67 #define CHECK_EXPECT2(func) \
68 do { \
69 ok(expect_ ##func, "unexpected call " #func "\n"); \
70 called_ ## func++; \
71 }while(0)
73 #define CHECK_EXPECT(func) \
74 do { \
75 CHECK_EXPECT2(func); \
76 expect_ ## func--; \
77 }while(0)
79 #define CHECK_CALLED(func) \
80 do { \
81 ok(called_ ## func, "expected " #func "\n"); \
82 expect_ ## func = called_ ## func = 0; \
83 }while(0)
85 #define CHECK_NOT_CALLED(func) \
86 do { \
87 ok(!called_ ## func, "unexpected " #func "\n"); \
88 expect_ ## func = called_ ## func = FALSE; \
89 }while(0)
91 #define CHECK_CALLED_MULTI(func, num) \
92 do { \
93 ok(called_ ## func == num, "expected " #func " %d times (got %d)\n", num, called_ ## func); \
94 expect_ ## func = called_ ## func = 0; \
95 }while(0)
97 DEFINE_EXPECT(GetLCID);
98 DEFINE_EXPECT(OnStateChange_UNINITIALIZED);
99 DEFINE_EXPECT(OnStateChange_STARTED);
100 DEFINE_EXPECT(OnStateChange_CONNECTED);
101 DEFINE_EXPECT(OnStateChange_DISCONNECTED);
102 DEFINE_EXPECT(OnStateChange_CLOSED);
103 DEFINE_EXPECT(OnStateChange_INITIALIZED);
104 DEFINE_EXPECT(OnEnterScript);
105 DEFINE_EXPECT(OnLeaveScript);
106 DEFINE_EXPECT(OnScriptError);
107 DEFINE_EXPECT(GetIDsOfNames);
108 DEFINE_EXPECT(GetItemInfo_global);
109 DEFINE_EXPECT(GetItemInfo_global_code);
110 DEFINE_EXPECT(GetItemInfo_visible);
111 DEFINE_EXPECT(GetItemInfo_visible_code);
112 DEFINE_EXPECT(testCall);
114 static const CLSID *engine_clsid = &CLSID_JScript;
116 #define test_state(s,ss) _test_state(__LINE__,s,ss)
117 static void _test_state(unsigned line, IActiveScript *script, SCRIPTSTATE exstate)
119 SCRIPTSTATE state = -1;
120 HRESULT hres;
122 hres = IActiveScript_GetScriptState(script, &state);
123 ok_(__FILE__,line) (hres == S_OK, "GetScriptState failed: %08x\n", hres);
124 ok_(__FILE__,line) (state == exstate, "state=%d, expected %d\n", state, exstate);
127 static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
129 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDispatch, riid)) {
130 *ppv = iface;
131 IDispatch_AddRef(iface);
132 return S_OK;
135 *ppv = NULL;
136 return E_NOINTERFACE;
139 static ULONG WINAPI Dispatch_AddRef(IDispatch *iface)
141 return 2;
144 static ULONG WINAPI Dispatch_Release(IDispatch *iface)
146 return 1;
149 static ULONG global_named_item_ref, visible_named_item_ref, visible_code_named_item_ref;
151 static ULONG WINAPI global_AddRef(IDispatch *iface)
153 return ++global_named_item_ref;
156 static ULONG WINAPI global_Release(IDispatch *iface)
158 return --global_named_item_ref;
161 static ULONG WINAPI visible_AddRef(IDispatch *iface)
163 return ++visible_named_item_ref;
166 static ULONG WINAPI visible_Release(IDispatch *iface)
168 return --visible_named_item_ref;
171 static ULONG WINAPI visible_code_AddRef(IDispatch *iface)
173 return ++visible_code_named_item_ref;
176 static ULONG WINAPI visible_code_Release(IDispatch *iface)
178 return --visible_code_named_item_ref;
181 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
183 ok(0, "unexpected call\n");
184 return E_NOTIMPL;
187 static HRESULT WINAPI Dispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
189 return DISP_E_BADINDEX;
192 static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *names, UINT name_cnt,
193 LCID lcid, DISPID *ids)
195 ok(name_cnt == 1, "name_cnt = %u\n", name_cnt);
196 if(!wcscmp(names[0], L"testCall")) {
197 *ids = 1;
198 return S_OK;
201 CHECK_EXPECT2(GetIDsOfNames);
202 return DISP_E_UNKNOWNNAME;
205 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID id, REFIID riid, LCID lcid, WORD flags,
206 DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, UINT *err)
208 CHECK_EXPECT(testCall);
209 ok(id == 1, "id = %u\n", id);
210 ok(flags == DISPATCH_METHOD, "flags = %x\n", flags);
211 ok(!dp->cArgs, "cArgs = %u\n", dp->cArgs);
212 ok(!res, "res = %p\n", res);
213 return S_OK;
216 static const IDispatchVtbl dispatch_vtbl = {
217 Dispatch_QueryInterface,
218 Dispatch_AddRef,
219 Dispatch_Release,
220 Dispatch_GetTypeInfoCount,
221 Dispatch_GetTypeInfo,
222 Dispatch_GetIDsOfNames,
223 Dispatch_Invoke
226 static IDispatch dispatch_object = { &dispatch_vtbl };
228 static const IDispatchVtbl global_named_item_vtbl = {
229 Dispatch_QueryInterface,
230 global_AddRef,
231 global_Release,
232 Dispatch_GetTypeInfoCount,
233 Dispatch_GetTypeInfo,
234 Dispatch_GetIDsOfNames,
235 Dispatch_Invoke
238 static IDispatch global_named_item = { &global_named_item_vtbl };
240 static const IDispatchVtbl visible_named_item_vtbl = {
241 Dispatch_QueryInterface,
242 visible_AddRef,
243 visible_Release,
244 Dispatch_GetTypeInfoCount,
245 Dispatch_GetTypeInfo,
246 Dispatch_GetIDsOfNames,
247 Dispatch_Invoke
250 static IDispatch visible_named_item = { &visible_named_item_vtbl };
252 static const IDispatchVtbl visible_code_named_item_vtbl = {
253 Dispatch_QueryInterface,
254 visible_code_AddRef,
255 visible_code_Release,
256 Dispatch_GetTypeInfoCount,
257 Dispatch_GetTypeInfo,
258 Dispatch_GetIDsOfNames,
259 Dispatch_Invoke
262 static IDispatch visible_code_named_item = { &visible_code_named_item_vtbl };
264 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
266 *ppv = NULL;
268 if(IsEqualGUID(&IID_IUnknown, riid))
269 *ppv = iface;
270 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
271 *ppv = iface;
272 else
273 return E_NOINTERFACE;
275 IUnknown_AddRef((IUnknown*)*ppv);
276 return S_OK;
279 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
281 return 2;
284 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
286 return 1;
289 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
291 CHECK_EXPECT(GetLCID);
292 return E_NOTIMPL;
295 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
296 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
298 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "dwReturnMask = %x\n", dwReturnMask);
299 if(!wcscmp(pstrName, L"globalItem")) {
300 CHECK_EXPECT(GetItemInfo_global);
301 IDispatch_AddRef(&global_named_item);
302 *ppiunkItem = (IUnknown*)&global_named_item;
303 return S_OK;
305 if(!wcscmp(pstrName, L"globalCodeItem")) {
306 CHECK_EXPECT(GetItemInfo_global_code);
307 IDispatch_AddRef(&dispatch_object);
308 *ppiunkItem = (IUnknown*)&dispatch_object;
309 return S_OK;
311 if(!wcscmp(pstrName, L"visibleItem")) {
312 CHECK_EXPECT(GetItemInfo_visible);
313 IDispatch_AddRef(&visible_named_item);
314 *ppiunkItem = (IUnknown*)&visible_named_item;
315 return S_OK;
317 if(!wcscmp(pstrName, L"visibleCodeItem")) {
318 CHECK_EXPECT(GetItemInfo_visible_code);
319 IDispatch_AddRef(&visible_code_named_item);
320 *ppiunkItem = (IUnknown*)&visible_code_named_item;
321 return S_OK;
323 ok(0, "unexpected call %s\n", wine_dbgstr_w(pstrName));
324 return E_NOTIMPL;
327 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
329 ok(0, "unexpected call\n");
330 return E_NOTIMPL;
333 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
334 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
336 ok(0, "unexpected call\n");
337 return E_NOTIMPL;
340 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
342 switch(ssScriptState) {
343 case SCRIPTSTATE_UNINITIALIZED:
344 CHECK_EXPECT(OnStateChange_UNINITIALIZED);
345 return S_OK;
346 case SCRIPTSTATE_STARTED:
347 CHECK_EXPECT(OnStateChange_STARTED);
348 return S_OK;
349 case SCRIPTSTATE_CONNECTED:
350 CHECK_EXPECT(OnStateChange_CONNECTED);
351 return S_OK;
352 case SCRIPTSTATE_DISCONNECTED:
353 CHECK_EXPECT(OnStateChange_DISCONNECTED);
354 return S_OK;
355 case SCRIPTSTATE_CLOSED:
356 CHECK_EXPECT(OnStateChange_CLOSED);
357 return S_OK;
358 case SCRIPTSTATE_INITIALIZED:
359 CHECK_EXPECT(OnStateChange_INITIALIZED);
360 return S_OK;
361 default:
362 ok(0, "unexpected call %d\n", ssScriptState);
365 return E_NOTIMPL;
368 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
370 CHECK_EXPECT(OnScriptError);
371 return S_OK;
374 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
376 CHECK_EXPECT(OnEnterScript);
377 return S_OK;
380 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
382 CHECK_EXPECT(OnLeaveScript);
383 return S_OK;
386 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
387 ActiveScriptSite_QueryInterface,
388 ActiveScriptSite_AddRef,
389 ActiveScriptSite_Release,
390 ActiveScriptSite_GetLCID,
391 ActiveScriptSite_GetItemInfo,
392 ActiveScriptSite_GetDocVersionString,
393 ActiveScriptSite_OnScriptTerminate,
394 ActiveScriptSite_OnStateChange,
395 ActiveScriptSite_OnScriptError,
396 ActiveScriptSite_OnEnterScript,
397 ActiveScriptSite_OnLeaveScript
400 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
402 static void test_script_dispatch(IDispatchEx *dispex)
404 DISPPARAMS dp = {NULL,NULL,0,0};
405 EXCEPINFO ei;
406 BSTR str;
407 DISPID id;
408 VARIANT v;
409 HRESULT hres;
411 str = SysAllocString(L"ActiveXObject");
412 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
413 SysFreeString(str);
414 ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
416 str = SysAllocString(L"Math");
417 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
418 SysFreeString(str);
419 ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
421 memset(&ei, 0, sizeof(ei));
422 hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
423 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
424 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
425 ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(v) = NULL\n");
426 VariantClear(&v);
428 str = SysAllocString(L"String");
429 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
430 SysFreeString(str);
431 ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
433 memset(&ei, 0, sizeof(ei));
434 hres = IDispatchEx_InvokeEx(dispex, id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
435 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
436 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
437 ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(v) = NULL\n");
438 VariantClear(&v);
441 static IDispatchEx *get_script_dispatch(IActiveScript *script, const WCHAR *item_name)
443 IDispatchEx *dispex;
444 IDispatch *disp;
445 HRESULT hres;
447 disp = (void*)0xdeadbeef;
448 hres = IActiveScript_GetScriptDispatch(script, item_name, &disp);
449 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
451 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
452 IDispatch_Release(disp);
453 ok(hres == S_OK, "Could not get IDispatch iface: %08x\n", hres);
454 return dispex;
457 static void parse_script(IActiveScriptParse *parser, const WCHAR *src)
459 HRESULT hres;
461 SET_EXPECT(OnEnterScript);
462 SET_EXPECT(OnLeaveScript);
464 hres = IActiveScriptParse_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
465 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
467 CHECK_CALLED(OnEnterScript);
468 CHECK_CALLED(OnLeaveScript);
471 #define get_disp_id(a,b,c,d) _get_disp_id(__LINE__,a,b,c,d)
472 static void _get_disp_id(unsigned line, IDispatchEx *dispex, const WCHAR *name, HRESULT exhr, DISPID *id)
474 DISPID id2;
475 HRESULT hr;
476 BSTR str;
478 str = SysAllocString(name);
479 hr = IDispatchEx_GetDispID(dispex, str, 0, id);
480 ok_(__FILE__,line)(hr == exhr, "GetDispID(%s) returned %08x, expected %08x\n",
481 wine_dbgstr_w(name), hr, exhr);
483 hr = IDispatchEx_GetIDsOfNames(dispex, &IID_NULL, &str, 1, 0, &id2);
484 SysFreeString(str);
485 ok_(__FILE__,line)(hr == exhr, "GetIDsOfNames(%s) returned %08x, expected %08x\n",
486 wine_dbgstr_w(name), hr, exhr);
487 ok_(__FILE__,line)(*id == id2, "GetIDsOfNames(%s) id != id2\n", wine_dbgstr_w(name));
490 static void test_no_script_dispatch(IActiveScript *script)
492 IDispatch *disp;
493 HRESULT hres;
495 disp = (void*)0xdeadbeef;
496 hres = IActiveScript_GetScriptDispatch(script, NULL, &disp);
497 ok(hres == E_UNEXPECTED, "hres = %08x, expected E_UNEXPECTED\n", hres);
498 ok(!disp, "disp != NULL\n");
501 static void test_safety(IUnknown *unk)
503 IObjectSafety *safety;
504 DWORD supported, enabled;
505 HRESULT hres;
507 hres = IUnknown_QueryInterface(unk, &IID_IObjectSafety, (void**)&safety);
508 ok(hres == S_OK, "Could not get IObjectSafety: %08x\n", hres);
509 if(FAILED(hres))
510 return;
512 hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, NULL);
513 ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
514 hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, NULL, &enabled);
515 ok(hres == E_POINTER, "GetInterfaceSafetyOptions failed: %08x, expected E_POINTER\n", hres);
517 supported = enabled = 0xdeadbeef;
518 hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_NULL, &supported, &enabled);
519 ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
520 ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
521 "supported=%x\n", supported);
522 ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
524 supported = enabled = 0xdeadbeef;
525 hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScript, &supported, &enabled);
526 ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
527 ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
528 "supported=%x\n", supported);
529 ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
531 supported = enabled = 0xdeadbeef;
532 hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
533 ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
534 ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
535 "supported=%x\n", supported);
536 ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
538 hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
539 INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER
540 |INTERFACESAFE_FOR_UNTRUSTED_CALLER,
541 INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
542 ok(hres == E_FAIL, "SetInterfaceSafetyOptions failed: %08x, expected E_FAIL\n", hres);
544 hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
545 INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER,
546 INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER);
547 ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
549 supported = enabled = 0xdeadbeef;
550 hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
551 ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
552 ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
553 "supported=%x\n", supported);
554 ok(enabled == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
555 "enabled=%x\n", enabled);
557 hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, INTERFACESAFE_FOR_UNTRUSTED_DATA, 0);
558 ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
560 supported = enabled = 0xdeadbeef;
561 hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
562 ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
563 ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
564 "supported=%x\n", supported);
565 ok(enabled == (INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER), "enabled=%x\n", enabled);
567 hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
568 INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER, 0);
569 ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
571 supported = enabled = 0xdeadbeef;
572 hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
573 ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
574 ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
575 "supported=%x\n", supported);
576 ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
578 hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse,
579 INTERFACE_USES_DISPEX, 0);
580 ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
582 supported = enabled = 0xdeadbeef;
583 hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
584 ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
585 ok(supported == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
586 "supported=%x\n", supported);
587 ok(enabled == INTERFACE_USES_DISPEX, "enabled=%x\n", enabled);
589 IObjectSafety_Release(safety);
592 static HRESULT set_script_prop(IActiveScript *engine, DWORD property, VARIANT *val)
594 IActiveScriptProperty *script_prop;
595 HRESULT hres;
597 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty,
598 (void**)&script_prop);
599 ok(hres == S_OK, "Could not get IActiveScriptProperty: %08x\n", hres);
600 if(FAILED(hres))
601 return hres;
603 hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
604 IActiveScriptProperty_Release(script_prop);
605 return hres;
608 static void test_invoke_versioning(IActiveScript *script)
610 VARIANT v;
611 HRESULT hres;
613 V_VT(&v) = VT_NULL;
614 hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
615 if(hres == E_NOTIMPL) {
616 win_skip("SCRIPTPROP_INVOKESTRING not supported\n");
617 return;
619 ok(hres == E_INVALIDARG, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
621 V_VT(&v) = VT_I2;
622 V_I2(&v) = 0;
623 hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
624 ok(hres == E_INVALIDARG, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
626 V_VT(&v) = VT_I4;
627 V_I4(&v) = 16;
628 hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
629 ok(hres == E_INVALIDARG, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
631 V_VT(&v) = VT_I4;
632 V_I4(&v) = 2;
633 hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
634 ok(hres == S_OK, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
637 static IActiveScript *create_jscript(void)
639 IActiveScript *ret;
640 HRESULT hres;
642 hres = CoCreateInstance(engine_clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
643 &IID_IActiveScript, (void**)&ret);
644 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
646 return ret;
649 static void test_jscript(void)
651 IActiveScriptParse *parse;
652 IActiveScript *script;
653 IDispatchEx *dispex;
654 ULONG ref;
655 HRESULT hres;
657 script = create_jscript();
659 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
660 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
662 test_state(script, SCRIPTSTATE_UNINITIALIZED);
663 test_safety((IUnknown*)script);
664 test_invoke_versioning(script);
666 hres = IActiveScriptParse_InitNew(parse);
667 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
669 hres = IActiveScriptParse_InitNew(parse);
670 ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres);
672 hres = IActiveScript_SetScriptSite(script, NULL);
673 ok(hres == E_POINTER, "SetScriptSite failed: %08x, expected E_POINTER\n", hres);
675 test_state(script, SCRIPTSTATE_UNINITIALIZED);
676 test_no_script_dispatch(script);
678 SET_EXPECT(GetLCID);
679 SET_EXPECT(OnStateChange_INITIALIZED);
680 hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
681 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
682 CHECK_CALLED(GetLCID);
683 CHECK_CALLED(OnStateChange_INITIALIZED);
685 test_state(script, SCRIPTSTATE_INITIALIZED);
687 hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
688 ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
690 dispex = get_script_dispatch(script, NULL);
691 test_script_dispatch(dispex);
693 SET_EXPECT(OnStateChange_STARTED);
694 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED);
695 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
696 CHECK_CALLED(OnStateChange_STARTED);
698 test_state(script, SCRIPTSTATE_STARTED);
700 SET_EXPECT(OnStateChange_CLOSED);
701 hres = IActiveScript_Close(script);
702 ok(hres == S_OK, "Close failed: %08x\n", hres);
703 CHECK_CALLED(OnStateChange_CLOSED);
705 test_state(script, SCRIPTSTATE_CLOSED);
706 test_no_script_dispatch(script);
707 test_script_dispatch(dispex);
708 IDispatchEx_Release(dispex);
710 IActiveScriptParse_Release(parse);
712 ref = IActiveScript_Release(script);
713 ok(!ref, "ref = %d\n", ref);
716 static void test_jscript2(void)
718 IActiveScriptParse *parse;
719 IActiveScript *script;
720 ULONG ref;
721 HRESULT hres;
723 script = create_jscript();
725 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
726 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
728 test_state(script, SCRIPTSTATE_UNINITIALIZED);
730 SET_EXPECT(GetLCID);
731 hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
732 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
733 CHECK_CALLED(GetLCID);
735 test_state(script, SCRIPTSTATE_UNINITIALIZED);
737 SET_EXPECT(OnStateChange_INITIALIZED);
738 hres = IActiveScriptParse_InitNew(parse);
739 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
740 CHECK_CALLED(OnStateChange_INITIALIZED);
742 hres = IActiveScriptParse_InitNew(parse);
743 ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres);
745 SET_EXPECT(OnStateChange_CONNECTED);
746 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
747 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
748 CHECK_CALLED(OnStateChange_CONNECTED);
750 test_state(script, SCRIPTSTATE_CONNECTED);
752 SET_EXPECT(OnStateChange_DISCONNECTED);
753 SET_EXPECT(OnStateChange_INITIALIZED);
754 SET_EXPECT(OnStateChange_CLOSED);
755 hres = IActiveScript_Close(script);
756 ok(hres == S_OK, "Close failed: %08x\n", hres);
757 CHECK_CALLED(OnStateChange_DISCONNECTED);
758 CHECK_CALLED(OnStateChange_INITIALIZED);
759 CHECK_CALLED(OnStateChange_CLOSED);
761 test_state(script, SCRIPTSTATE_CLOSED);
762 test_no_script_dispatch(script);
764 IActiveScriptParse_Release(parse);
766 ref = IActiveScript_Release(script);
767 ok(!ref, "ref = %d\n", ref);
770 static void test_jscript_uninitializing(void)
772 IActiveScriptParse *parse;
773 IActiveScript *script;
774 IDispatchEx *dispex;
775 ULONG ref;
776 HRESULT hres;
778 static const WCHAR script_textW[] =
779 {'f','u','n','c','t','i','o','n',' ','f','(',')',' ','{','}',0};
781 script = create_jscript();
783 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
784 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
786 test_state(script, SCRIPTSTATE_UNINITIALIZED);
788 hres = IActiveScriptParse_InitNew(parse);
789 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
791 SET_EXPECT(GetLCID);
792 SET_EXPECT(OnStateChange_INITIALIZED);
793 hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
794 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
795 CHECK_CALLED(GetLCID);
796 CHECK_CALLED(OnStateChange_INITIALIZED);
798 test_state(script, SCRIPTSTATE_INITIALIZED);
800 hres = IActiveScriptParse_ParseScriptText(parse, script_textW, NULL, NULL, NULL, 0, 1, 0x42, NULL, NULL);
801 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
803 hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
804 ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres);
806 SET_EXPECT(OnStateChange_UNINITIALIZED);
807 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
808 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
809 CHECK_CALLED(OnStateChange_UNINITIALIZED);
811 test_state(script, SCRIPTSTATE_UNINITIALIZED);
813 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
814 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
816 SET_EXPECT(GetLCID);
817 SET_EXPECT(OnStateChange_INITIALIZED);
818 hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
819 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
820 CHECK_CALLED(GetLCID);
821 CHECK_CALLED(OnStateChange_INITIALIZED);
823 SET_EXPECT(OnStateChange_CONNECTED);
824 SET_EXPECT(OnEnterScript);
825 SET_EXPECT(OnLeaveScript);
826 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
827 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres);
828 CHECK_CALLED(OnStateChange_CONNECTED);
829 CHECK_CALLED(OnEnterScript);
830 CHECK_CALLED(OnLeaveScript);
832 test_state(script, SCRIPTSTATE_CONNECTED);
834 dispex = get_script_dispatch(script, NULL);
835 ok(dispex != NULL, "dispex == NULL\n");
836 IDispatchEx_Release(dispex);
838 SET_EXPECT(OnStateChange_DISCONNECTED);
839 SET_EXPECT(OnStateChange_INITIALIZED);
840 SET_EXPECT(OnStateChange_UNINITIALIZED);
841 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
842 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hres);
843 CHECK_CALLED(OnStateChange_DISCONNECTED);
844 CHECK_CALLED(OnStateChange_INITIALIZED);
845 CHECK_CALLED(OnStateChange_UNINITIALIZED);
847 test_state(script, SCRIPTSTATE_UNINITIALIZED);
849 hres = IActiveScript_Close(script);
850 ok(hres == S_OK, "Close failed: %08x\n", hres);
852 test_state(script, SCRIPTSTATE_CLOSED);
854 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
855 ok(hres == E_UNEXPECTED, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x, expected E_UNEXPECTED\n", hres);
857 test_state(script, SCRIPTSTATE_CLOSED);
859 IActiveScriptParse_Release(parse);
861 ref = IActiveScript_Release(script);
862 ok(!ref, "ref = %d\n", ref);
865 static void test_aggregation(void)
867 IUnknown *unk = (IUnknown*)0xdeadbeef;
868 HRESULT hres;
870 hres = CoCreateInstance(&CLSID_JScript, (IUnknown*)0xdeadbeef, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
871 &IID_IUnknown, (void**)&unk);
872 ok(hres == CLASS_E_NOAGGREGATION,
873 "CoCreateInstance failed: %08x, expected CLASS_E_NOAGGREGATION\n", hres);
874 ok(!unk || broken(unk != NULL), "unk = %p\n", unk);
877 static void test_code_persistence(void)
879 IActiveScriptParse *parse;
880 IActiveScript *script;
881 IDispatchEx *dispex;
882 VARIANT var;
883 HRESULT hr;
884 DISPID id;
885 ULONG ref;
887 script = create_jscript();
889 hr = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
890 ok(hr == S_OK, "Could not get IActiveScriptParse iface: %08x\n", hr);
891 test_state(script, SCRIPTSTATE_UNINITIALIZED);
892 test_safety((IUnknown*)script);
894 SET_EXPECT(GetLCID);
895 hr = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
896 ok(hr == S_OK, "SetScriptSite failed: %08x\n", hr);
897 CHECK_CALLED(GetLCID);
899 SET_EXPECT(OnStateChange_INITIALIZED);
900 hr = IActiveScriptParse_InitNew(parse);
901 ok(hr == S_OK, "InitNew failed: %08x\n", hr);
902 CHECK_CALLED(OnStateChange_INITIALIZED);
903 test_state(script, SCRIPTSTATE_INITIALIZED);
905 hr = IActiveScriptParse_ParseScriptText(parse,
906 L"var x = 1;\n"
907 L"var y = 2;\n",
908 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
909 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
911 hr = IActiveScriptParse_ParseScriptText(parse,
912 L"var z = 3;\n"
913 L"var y = 42;\n"
914 L"var v = 10;\n",
915 NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISPERSISTENT, NULL, NULL);
916 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
918 /* Pending code does not add identifiers to the global scope */
919 dispex = get_script_dispatch(script, NULL);
920 id = 0;
921 get_disp_id(dispex, L"x", DISP_E_UNKNOWNNAME, &id);
922 ok(id == -1, "id = %d, expected -1\n", id);
923 id = 0;
924 get_disp_id(dispex, L"y", DISP_E_UNKNOWNNAME, &id);
925 ok(id == -1, "id = %d, expected -1\n", id);
926 id = 0;
927 get_disp_id(dispex, L"z", DISP_E_UNKNOWNNAME, &id);
928 ok(id == -1, "id = %d, expected -1\n", id);
929 IDispatchEx_Release(dispex);
931 /* Uninitialized state removes code without SCRIPTTEXT_ISPERSISTENT */
932 SET_EXPECT(OnStateChange_UNINITIALIZED);
933 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
934 ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hr);
935 CHECK_CALLED(OnStateChange_UNINITIALIZED);
936 test_no_script_dispatch(script);
938 SET_EXPECT(GetLCID);
939 SET_EXPECT(OnStateChange_INITIALIZED);
940 hr = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
941 ok(hr == S_OK, "SetScriptSite failed: %08x\n", hr);
942 CHECK_CALLED(GetLCID);
943 CHECK_CALLED(OnStateChange_INITIALIZED);
945 hr = IActiveScriptParse_ParseScriptText(parse, L"v = 20;\n", NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
946 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
948 SET_EXPECT(OnStateChange_CONNECTED);
949 SET_EXPECT_MULTI(OnEnterScript, 2);
950 SET_EXPECT_MULTI(OnLeaveScript, 2);
951 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
952 ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hr);
953 CHECK_CALLED(OnStateChange_CONNECTED);
954 CHECK_CALLED_MULTI(OnEnterScript, 2);
955 CHECK_CALLED_MULTI(OnLeaveScript, 2);
956 test_state(script, SCRIPTSTATE_CONNECTED);
958 dispex = get_script_dispatch(script, NULL);
959 id = 0;
960 get_disp_id(dispex, L"x", DISP_E_UNKNOWNNAME, &id);
961 ok(id == -1, "id = %d, expected -1\n", id);
962 id = 0;
963 get_disp_id(dispex, L"y", S_OK, &id);
964 ok(id != -1, "id = -1\n");
965 id = 0;
966 get_disp_id(dispex, L"z", S_OK, &id);
967 ok(id != -1, "id = -1\n");
968 IDispatchEx_Release(dispex);
970 SET_EXPECT(OnEnterScript);
971 SET_EXPECT(OnLeaveScript);
972 hr = IActiveScriptParse_ParseScriptText(parse, L"y", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
973 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
974 ok(V_VT(&var) == VT_I4 && V_I2(&var) == 42, "V_VT(y) = %d, V_I2(y) = %d\n", V_VT(&var), V_I2(&var));
975 CHECK_CALLED(OnEnterScript);
976 CHECK_CALLED(OnLeaveScript);
978 SET_EXPECT(OnEnterScript);
979 SET_EXPECT(OnLeaveScript);
980 hr = IActiveScriptParse_ParseScriptText(parse, L"v", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
981 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
982 ok(V_VT(&var) == VT_I4 && V_I2(&var) == 20, "V_VT(var) = %d, V_I2(var) = %d\n", V_VT(&var), V_I2(&var));
983 CHECK_CALLED(OnEnterScript);
984 CHECK_CALLED(OnLeaveScript);
986 /* Uninitialized state does not remove persistent code, even if it was executed */
987 SET_EXPECT(OnStateChange_DISCONNECTED);
988 SET_EXPECT(OnStateChange_INITIALIZED);
989 SET_EXPECT(OnStateChange_UNINITIALIZED);
990 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
991 ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hr);
992 CHECK_CALLED(OnStateChange_DISCONNECTED);
993 CHECK_CALLED(OnStateChange_INITIALIZED);
994 CHECK_CALLED(OnStateChange_UNINITIALIZED);
995 test_no_script_dispatch(script);
997 SET_EXPECT(GetLCID);
998 SET_EXPECT(OnStateChange_INITIALIZED);
999 hr = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
1000 ok(hr == S_OK, "SetScriptSite failed: %08x\n", hr);
1001 CHECK_CALLED(GetLCID);
1002 CHECK_CALLED(OnStateChange_INITIALIZED);
1004 dispex = get_script_dispatch(script, NULL);
1005 id = 0;
1006 get_disp_id(dispex, L"z", DISP_E_UNKNOWNNAME, &id);
1007 ok(id == -1, "id = %d, expected -1\n", id);
1008 IDispatchEx_Release(dispex);
1010 SET_EXPECT(OnStateChange_CONNECTED);
1011 SET_EXPECT(OnEnterScript);
1012 SET_EXPECT(OnLeaveScript);
1013 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
1014 ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hr);
1015 CHECK_CALLED(OnStateChange_CONNECTED);
1016 CHECK_CALLED(OnEnterScript);
1017 CHECK_CALLED(OnLeaveScript);
1018 test_state(script, SCRIPTSTATE_CONNECTED);
1020 dispex = get_script_dispatch(script, NULL);
1021 id = 0;
1022 get_disp_id(dispex, L"z", S_OK, &id);
1023 ok(id != -1, "id = -1\n");
1024 IDispatchEx_Release(dispex);
1026 SET_EXPECT(OnEnterScript);
1027 SET_EXPECT(OnLeaveScript);
1028 hr = IActiveScriptParse_ParseScriptText(parse, L"y", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
1029 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1030 ok(V_VT(&var) == VT_I4 && V_I2(&var) == 42, "V_VT(y) = %d, V_I2(y) = %d\n", V_VT(&var), V_I2(&var));
1031 CHECK_CALLED(OnEnterScript);
1032 CHECK_CALLED(OnLeaveScript);
1034 SET_EXPECT(OnEnterScript);
1035 SET_EXPECT(OnLeaveScript);
1036 hr = IActiveScriptParse_ParseScriptText(parse, L"v", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
1037 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1038 ok(V_VT(&var) == VT_I4 && V_I2(&var) == 10, "V_VT(var) = %d, V_I2(var) = %d\n", V_VT(&var), V_I2(&var));
1039 CHECK_CALLED(OnEnterScript);
1040 CHECK_CALLED(OnLeaveScript);
1042 SET_EXPECT(OnStateChange_DISCONNECTED);
1043 SET_EXPECT(OnStateChange_INITIALIZED);
1044 SET_EXPECT(OnStateChange_UNINITIALIZED);
1045 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
1046 ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hr);
1047 CHECK_CALLED(OnStateChange_DISCONNECTED);
1048 CHECK_CALLED(OnStateChange_INITIALIZED);
1049 CHECK_CALLED(OnStateChange_UNINITIALIZED);
1051 SET_EXPECT(GetLCID);
1052 SET_EXPECT(OnStateChange_INITIALIZED);
1053 hr = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
1054 ok(hr == S_OK, "SetScriptSite failed: %08x\n", hr);
1055 CHECK_CALLED(GetLCID);
1056 CHECK_CALLED(OnStateChange_INITIALIZED);
1058 hr = IActiveScriptParse_ParseScriptText(parse, L"y = 2;\n", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISPERSISTENT, NULL, NULL);
1059 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1061 /* Closing the script engine removes all code (even if it's pending and persistent) */
1062 SET_EXPECT(OnStateChange_CLOSED);
1063 hr = IActiveScript_Close(script);
1064 ok(hr == S_OK, "Close failed: %08x\n", hr);
1065 CHECK_CALLED(OnStateChange_CLOSED);
1066 test_state(script, SCRIPTSTATE_CLOSED);
1067 test_no_script_dispatch(script);
1069 SET_EXPECT(OnStateChange_INITIALIZED);
1070 SET_EXPECT(GetLCID);
1071 hr = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
1072 ok(hr == S_OK, "SetScriptSite failed: %08x\n", hr);
1073 CHECK_CALLED(OnStateChange_INITIALIZED);
1074 CHECK_CALLED(GetLCID);
1075 test_state(script, SCRIPTSTATE_INITIALIZED);
1077 SET_EXPECT(OnStateChange_CONNECTED);
1078 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
1079 ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hr);
1080 CHECK_CALLED(OnStateChange_CONNECTED);
1081 test_state(script, SCRIPTSTATE_CONNECTED);
1083 dispex = get_script_dispatch(script, NULL);
1084 id = 0;
1085 get_disp_id(dispex, L"y", DISP_E_UNKNOWNNAME, &id);
1086 ok(id == -1, "id = %d, expected -1\n", id);
1087 id = 0;
1088 get_disp_id(dispex, L"z", DISP_E_UNKNOWNNAME, &id);
1089 ok(id == -1, "id = %d, expected -1\n", id);
1090 IDispatchEx_Release(dispex);
1092 IActiveScriptParse_Release(parse);
1094 SET_EXPECT(OnStateChange_DISCONNECTED);
1095 SET_EXPECT(OnStateChange_INITIALIZED);
1096 SET_EXPECT(OnStateChange_CLOSED);
1097 ref = IActiveScript_Release(script);
1098 ok(!ref, "ref = %d\n", ref);
1099 CHECK_CALLED(OnStateChange_DISCONNECTED);
1100 CHECK_CALLED(OnStateChange_INITIALIZED);
1101 CHECK_CALLED(OnStateChange_CLOSED);
1104 static void test_named_items(void)
1106 static const WCHAR *global_idents[] =
1108 L"ActiveXObject",
1109 L"Array",
1110 L"Boolean",
1111 L"ReferenceError",
1112 L"RegExp",
1113 L"decodeURI",
1114 L"isNaN",
1116 L"global_this",
1117 L"globalCode_this",
1118 L"testFunc_global",
1119 L"testVar_global"
1121 static const WCHAR *global_code_test[] =
1123 L"testFunc_global();",
1124 L"if(testVar_global != 5) throw new Error();",
1125 L"var testObj = new testClassFunc();",
1126 L"eval(\"testFunc_global();\");",
1127 L"if(Math.abs(-17) != 17) throw new Error();"
1129 static const WCHAR *context_idents[] =
1131 L"testFunc",
1132 L"testVar"
1134 static const WCHAR *context_code_test[] =
1136 L"testFunc();",
1137 L"if(testVar != 42) throw new Error();",
1138 L"if(Math.abs(-testVar) != 42) throw new Error();"
1140 IDispatchEx *dispex, *dispex2;
1141 IActiveScriptParse *parse;
1142 IActiveScript *script;
1143 IDispatch *disp;
1144 VARIANT var;
1145 unsigned i;
1146 HRESULT hr;
1147 DISPID id;
1148 ULONG ref;
1149 BSTR bstr;
1151 script = create_jscript();
1153 hr = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parse);
1154 ok(hr == S_OK, "Could not get IActiveScriptParse: %08x\n", hr);
1156 test_state(script, SCRIPTSTATE_UNINITIALIZED);
1158 hr = IActiveScript_AddNamedItem(script, L"visibleItem", SCRIPTITEM_ISVISIBLE);
1159 ok(hr == E_UNEXPECTED, "AddNamedItem returned: %08x\n", hr);
1160 hr = IActiveScript_AddNamedItem(script, L"globalItem", SCRIPTITEM_GLOBALMEMBERS);
1161 ok(hr == E_UNEXPECTED, "AddNamedItem returned: %08x\n", hr);
1162 hr = IActiveScript_AddNamedItem(script, L"codeOnlyItem", SCRIPTITEM_CODEONLY);
1163 ok(hr == E_UNEXPECTED, "AddNamedItem returned: %08x\n", hr);
1165 SET_EXPECT(GetLCID);
1166 hr = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
1167 ok(hr == S_OK, "SetScriptSite failed: %08x\n", hr);
1168 CHECK_CALLED(GetLCID);
1170 SET_EXPECT(GetItemInfo_global);
1171 hr = IActiveScript_AddNamedItem(script, L"globalItem", SCRIPTITEM_GLOBALMEMBERS);
1172 ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
1173 CHECK_CALLED(GetItemInfo_global);
1175 hr = IActiveScript_AddNamedItem(script, L"visibleItem", SCRIPTITEM_ISVISIBLE);
1176 ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
1177 hr = IActiveScript_AddNamedItem(script, L"visibleCodeItem", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_CODEONLY);
1178 ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
1179 hr = IActiveScript_AddNamedItem(script, L"codeOnlyItem", SCRIPTITEM_CODEONLY);
1180 ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
1182 ok(global_named_item_ref > 0, "global_named_item_ref = %u\n", global_named_item_ref);
1183 ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
1184 ok(visible_code_named_item_ref == 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
1186 SET_EXPECT(GetItemInfo_global_code);
1187 hr = IActiveScript_AddNamedItem(script, L"globalCodeItem", SCRIPTITEM_GLOBALMEMBERS | SCRIPTITEM_CODEONLY);
1188 ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
1189 CHECK_CALLED(GetItemInfo_global_code);
1191 dispex = get_script_dispatch(script, NULL);
1192 dispex2 = get_script_dispatch(script, L"globalItem");
1193 ok(dispex == dispex2, "get_script_dispatch returned different dispatch objects.\n");
1194 IDispatchEx_Release(dispex2);
1195 dispex2 = get_script_dispatch(script, L"globalCodeItem");
1196 ok(dispex == dispex2, "get_script_dispatch returned different dispatch objects.\n");
1197 IDispatchEx_Release(dispex2);
1198 dispex2 = get_script_dispatch(script, L"codeOnlyItem");
1199 todo_wine
1200 ok(dispex != dispex2, "get_script_dispatch returned same dispatch objects.\n");
1202 SET_EXPECT(OnStateChange_INITIALIZED);
1203 hr = IActiveScriptParse_InitNew(parse);
1204 ok(hr == S_OK, "InitNew failed: %08x\n", hr);
1205 CHECK_CALLED(OnStateChange_INITIALIZED);
1207 SET_EXPECT(OnStateChange_CONNECTED);
1208 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
1209 ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hr);
1210 CHECK_CALLED(OnStateChange_CONNECTED);
1212 SET_EXPECT(testCall);
1213 parse_script(parse, L"testCall();");
1214 CHECK_CALLED(testCall);
1216 SET_EXPECT(GetItemInfo_visible);
1217 SET_EXPECT(testCall);
1218 parse_script(parse, L"visibleItem.testCall();");
1219 CHECK_CALLED(GetItemInfo_visible);
1220 CHECK_CALLED(testCall);
1222 SET_EXPECT(OnEnterScript);
1223 SET_EXPECT(OnLeaveScript);
1224 SET_EXPECT(testCall);
1225 hr = IActiveScriptParse_ParseScriptText(parse, L"testCall();", L"visibleCodeItem", NULL, NULL, 0, 0, 0, NULL, NULL);
1226 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1227 CHECK_CALLED(OnEnterScript);
1228 CHECK_CALLED(OnLeaveScript);
1229 CHECK_CALLED(testCall);
1231 SET_EXPECT(OnEnterScript);
1232 SET_EXPECT(GetIDsOfNames);
1233 SET_EXPECT(OnScriptError);
1234 SET_EXPECT(OnLeaveScript);
1235 hr = IActiveScriptParse_ParseScriptText(parse, L"codeOnlyItem();", L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
1236 ok(FAILED(hr), "ParseScriptText returned: %08x\n", hr);
1237 CHECK_CALLED(OnEnterScript);
1238 CHECK_CALLED(GetIDsOfNames);
1239 CHECK_CALLED(OnScriptError);
1240 CHECK_CALLED(OnLeaveScript);
1242 hr = IActiveScript_GetScriptDispatch(script, L"visibleCodeItem", &disp);
1243 ok(hr == S_OK, "GetScriptDispatch returned: %08x\n", hr);
1244 SET_EXPECT(OnEnterScript);
1245 SET_EXPECT(OnLeaveScript);
1246 hr = IActiveScriptParse_ParseScriptText(parse, L"this", L"visibleCodeItem", NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
1247 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1248 todo_wine
1249 ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == disp,
1250 "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
1251 VariantClear(&var);
1252 CHECK_CALLED(OnEnterScript);
1253 CHECK_CALLED(OnLeaveScript);
1254 IDispatch_Release(disp);
1256 SET_EXPECT(GetItemInfo_visible_code);
1257 SET_EXPECT(testCall);
1258 parse_script(parse, L"visibleCodeItem.testCall();");
1259 CHECK_CALLED(GetItemInfo_visible_code);
1260 CHECK_CALLED(testCall);
1262 ok(global_named_item_ref > 0, "global_named_item_ref = %u\n", global_named_item_ref);
1263 ok(visible_named_item_ref > 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
1264 ok(visible_code_named_item_ref > 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
1266 SET_EXPECT(testCall);
1267 parse_script(parse, L"visibleItem.testCall();");
1268 CHECK_CALLED(testCall);
1270 SET_EXPECT(OnEnterScript);
1271 SET_EXPECT(GetIDsOfNames);
1272 SET_EXPECT(OnLeaveScript);
1273 hr = IActiveScriptParse_ParseScriptText(parse, L""
1274 "var global_this = 0;\n"
1275 "var globalCode_this = 0;\n"
1276 "function testFunc_global() { }\n"
1277 "var testVar_global = 10;\n"
1278 "function testClassFunc() { this.x = 10; }\n",
1279 NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISPERSISTENT, NULL, NULL);
1280 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1281 CHECK_CALLED(OnEnterScript);
1282 CHECK_CALLED(GetIDsOfNames);
1283 CHECK_CALLED(OnLeaveScript);
1285 SET_EXPECT(OnEnterScript);
1286 SET_EXPECT(OnLeaveScript);
1287 hr = IActiveScriptParse_ParseScriptText(parse, L"function testFunc() { }\n", L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
1288 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1289 CHECK_CALLED(OnEnterScript);
1290 CHECK_CALLED(OnLeaveScript);
1292 SET_EXPECT(OnEnterScript);
1293 SET_EXPECT(OnLeaveScript);
1294 SET_EXPECT(GetIDsOfNames);
1295 hr = IActiveScriptParse_ParseScriptText(parse, L""
1296 "var testVar = 42;\n"
1297 "testVar_global = 5;\n",
1298 L"codeOnlyItem", NULL, NULL, 0, 0, SCRIPTTEXT_ISPERSISTENT, NULL, NULL);
1299 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1300 CHECK_CALLED(OnEnterScript);
1301 CHECK_CALLED(OnLeaveScript);
1302 todo_wine CHECK_NOT_CALLED(GetIDsOfNames);
1304 SET_EXPECT(OnEnterScript);
1305 SET_EXPECT(OnLeaveScript);
1306 hr = IActiveScriptParse_ParseScriptText(parse, L"global_this = this;\n", L"globalItem", NULL, NULL, 0, 0, SCRIPTTEXT_ISPERSISTENT, NULL, NULL);
1307 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1308 CHECK_CALLED(OnEnterScript);
1309 CHECK_CALLED(OnLeaveScript);
1311 SET_EXPECT(OnEnterScript);
1312 SET_EXPECT(OnLeaveScript);
1313 hr = IActiveScriptParse_ParseScriptText(parse, L"globalCode_this = this;\n", L"globalCodeItem", NULL, NULL, 0, 0, SCRIPTTEXT_ISPERSISTENT, NULL, NULL);
1314 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1315 CHECK_CALLED(OnEnterScript);
1316 CHECK_CALLED(OnLeaveScript);
1318 for (i = 0; i < ARRAY_SIZE(global_idents); i++)
1320 bstr = SysAllocString(global_idents[i]);
1321 id = 0;
1322 hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
1323 ok(hr == S_OK, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(global_idents[i]), hr);
1324 ok(id != -1, "[%s] id = -1\n", wine_dbgstr_w(global_idents[i]));
1326 id = 0;
1327 hr = IDispatchEx_GetDispID(dispex2, bstr, 0, &id);
1328 todo_wine
1329 ok(hr == DISP_E_UNKNOWNNAME, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(global_idents[i]), hr);
1330 todo_wine
1331 ok(id == -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(global_idents[i]), id);
1332 SysFreeString(bstr);
1335 for (i = 0; i < ARRAY_SIZE(context_idents); i++)
1337 bstr = SysAllocString(context_idents[i]);
1338 id = 0;
1339 hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
1340 todo_wine
1341 ok(hr == DISP_E_UNKNOWNNAME, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(context_idents[i]), hr);
1342 todo_wine
1343 ok(id == -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(context_idents[i]), id);
1344 id = 0;
1345 hr = IDispatchEx_GetDispID(dispex2, bstr, 0, &id);
1346 ok(hr == S_OK, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(context_idents[i]), hr);
1347 ok(id != -1, "[%s] id = -1\n", wine_dbgstr_w(context_idents[i]));
1348 SysFreeString(bstr);
1351 for (i = 0; i < ARRAY_SIZE(global_code_test); i++)
1353 SET_EXPECT(OnEnterScript);
1354 SET_EXPECT(OnLeaveScript);
1355 hr = IActiveScriptParse_ParseScriptText(parse, global_code_test[i], NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1356 ok(hr == S_OK, "ParseScriptText(%s) failed: %08x\n", wine_dbgstr_w(global_code_test[i]), hr);
1357 CHECK_CALLED(OnEnterScript);
1358 CHECK_CALLED(OnLeaveScript);
1360 SET_EXPECT(OnEnterScript);
1361 SET_EXPECT(GetIDsOfNames);
1362 SET_EXPECT(OnLeaveScript);
1363 hr = IActiveScriptParse_ParseScriptText(parse, global_code_test[i], L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
1364 ok(hr == S_OK, "ParseScriptText(%s) failed: %08x\n", wine_dbgstr_w(global_code_test[i]), hr);
1365 CHECK_CALLED(OnEnterScript);
1366 CHECK_CALLED(OnLeaveScript);
1369 for (i = 0; i < ARRAY_SIZE(context_code_test); i++)
1371 SET_EXPECT(OnEnterScript);
1372 SET_EXPECT(GetIDsOfNames);
1373 SET_EXPECT(OnScriptError);
1374 SET_EXPECT(OnLeaveScript);
1375 hr = IActiveScriptParse_ParseScriptText(parse, context_code_test[i], NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1376 todo_wine
1377 ok(FAILED(hr), "ParseScriptText(%s) returned: %08x\n", wine_dbgstr_w(context_code_test[i]), hr);
1378 CHECK_CALLED(OnEnterScript);
1379 todo_wine_if(i != 0)
1380 CHECK_CALLED(GetIDsOfNames);
1381 todo_wine
1382 CHECK_CALLED(OnScriptError);
1383 CHECK_CALLED(OnLeaveScript);
1385 SET_EXPECT(OnEnterScript);
1386 SET_EXPECT(OnLeaveScript);
1387 hr = IActiveScriptParse_ParseScriptText(parse, context_code_test[i], L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
1388 ok(hr == S_OK, "ParseScriptText(%s) failed: %08x\n", wine_dbgstr_w(context_code_test[i]), hr);
1389 CHECK_CALLED(OnEnterScript);
1390 CHECK_CALLED(OnLeaveScript);
1393 SET_EXPECT(OnEnterScript);
1394 SET_EXPECT(OnLeaveScript);
1395 hr = IActiveScriptParse_ParseScriptText(parse, L"this", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
1396 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1397 ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == &global_named_item,
1398 "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
1399 VariantClear(&var);
1400 CHECK_CALLED(OnEnterScript);
1401 CHECK_CALLED(OnLeaveScript);
1403 SET_EXPECT(OnEnterScript);
1404 SET_EXPECT(OnLeaveScript);
1405 hr = IActiveScriptParse_ParseScriptText(parse, L"this", L"visibleItem", NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
1406 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1407 todo_wine
1408 ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == &visible_named_item,
1409 "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
1410 VariantClear(&var);
1411 CHECK_CALLED(OnEnterScript);
1412 CHECK_CALLED(OnLeaveScript);
1414 SET_EXPECT(OnEnterScript);
1415 SET_EXPECT(OnLeaveScript);
1416 hr = IActiveScriptParse_ParseScriptText(parse, L"this", L"codeOnlyItem", NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
1417 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1418 todo_wine
1419 ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == (IDispatch*)dispex2,
1420 "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
1421 VariantClear(&var);
1422 CHECK_CALLED(OnEnterScript);
1423 CHECK_CALLED(OnLeaveScript);
1425 SET_EXPECT(OnEnterScript);
1426 SET_EXPECT(OnLeaveScript);
1427 hr = IActiveScriptParse_ParseScriptText(parse, L"globalCode_this", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
1428 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1429 ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == &global_named_item,
1430 "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
1431 VariantClear(&var);
1432 CHECK_CALLED(OnEnterScript);
1433 CHECK_CALLED(OnLeaveScript);
1435 IDispatchEx_Release(dispex2);
1436 IDispatchEx_Release(dispex);
1438 /* reinitialize script engine */
1440 SET_EXPECT(OnStateChange_DISCONNECTED);
1441 SET_EXPECT(OnStateChange_INITIALIZED);
1442 SET_EXPECT(OnStateChange_UNINITIALIZED);
1443 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
1444 ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08x\n", hr);
1445 CHECK_CALLED(OnStateChange_DISCONNECTED);
1446 CHECK_CALLED(OnStateChange_INITIALIZED);
1447 CHECK_CALLED(OnStateChange_UNINITIALIZED);
1448 test_no_script_dispatch(script);
1450 ok(global_named_item_ref == 0, "global_named_item_ref = %u\n", global_named_item_ref);
1451 ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
1452 ok(visible_code_named_item_ref == 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
1454 hr = IActiveScript_GetScriptDispatch(script, L"codeOnlyItem", &disp);
1455 ok(hr == E_UNEXPECTED, "hr = %08x, expected E_UNEXPECTED\n", hr);
1457 SET_EXPECT(GetLCID);
1458 SET_EXPECT(OnStateChange_INITIALIZED);
1459 hr = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
1460 ok(hr == S_OK, "SetScriptSite failed: %08x\n", hr);
1461 CHECK_CALLED(GetLCID);
1462 CHECK_CALLED(OnStateChange_INITIALIZED);
1464 hr = IActiveScript_AddNamedItem(script, L"codeOnlyItem", SCRIPTITEM_CODEONLY);
1465 ok(hr == S_OK, "AddNamedItem failed: %08x\n", hr);
1467 SET_EXPECT(OnStateChange_CONNECTED);
1468 SET_EXPECT_MULTI(OnEnterScript, 4);
1469 SET_EXPECT_MULTI(OnLeaveScript, 4);
1470 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
1471 ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hr);
1472 CHECK_CALLED(OnStateChange_CONNECTED);
1473 CHECK_CALLED_MULTI(OnEnterScript, 4);
1474 CHECK_CALLED_MULTI(OnLeaveScript, 4);
1475 test_state(script, SCRIPTSTATE_CONNECTED);
1477 dispex = get_script_dispatch(script, NULL);
1478 for (i = 0; i < ARRAY_SIZE(global_idents); i++)
1480 bstr = SysAllocString(global_idents[i]);
1481 id = 0;
1482 hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
1483 ok(hr == S_OK, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(global_idents[i]), hr);
1484 ok(id != -1, "[%s] id = -1\n", wine_dbgstr_w(global_idents[i]));
1485 SysFreeString(bstr);
1488 for (i = 0; i < ARRAY_SIZE(context_idents); i++)
1490 bstr = SysAllocString(context_idents[i]);
1491 id = 0;
1492 hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
1493 todo_wine_if(i != 0)
1494 ok(hr == DISP_E_UNKNOWNNAME, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(context_idents[i]), hr);
1495 todo_wine_if(i != 0)
1496 ok(id == -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(context_idents[i]), id);
1497 SysFreeString(bstr);
1500 SET_EXPECT(OnEnterScript);
1501 SET_EXPECT(OnLeaveScript);
1502 hr = IActiveScriptParse_ParseScriptText(parse, L"global_this", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
1503 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1504 ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == (IDispatch*)dispex,
1505 "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
1506 VariantClear(&var);
1507 CHECK_CALLED(OnEnterScript);
1508 CHECK_CALLED(OnLeaveScript);
1510 SET_EXPECT(OnEnterScript);
1511 SET_EXPECT(OnLeaveScript);
1512 hr = IActiveScriptParse_ParseScriptText(parse, L"globalCode_this", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &var, NULL);
1513 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1514 ok(V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == (IDispatch*)dispex,
1515 "Unexpected 'this': V_VT = %d, V_DISPATCH = %p\n", V_VT(&var), V_DISPATCH(&var));
1516 VariantClear(&var);
1517 CHECK_CALLED(OnEnterScript);
1518 CHECK_CALLED(OnLeaveScript);
1520 SET_EXPECT(OnEnterScript);
1521 SET_EXPECT(OnLeaveScript);
1522 hr = IActiveScriptParse_ParseScriptText(parse, L"global_this = 0; globalCode_this = 0;\n", NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1523 ok(hr == S_OK, "ParseScriptText failed: %08x\n", hr);
1524 CHECK_CALLED(OnEnterScript);
1525 CHECK_CALLED(OnLeaveScript);
1526 IDispatchEx_Release(dispex);
1528 dispex = get_script_dispatch(script, L"codeOnlyItem");
1529 for (i = 0; i < ARRAY_SIZE(global_idents); i++)
1531 bstr = SysAllocString(global_idents[i]);
1532 id = 0;
1533 hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
1534 todo_wine
1535 ok(hr == DISP_E_UNKNOWNNAME, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(global_idents[i]), hr);
1536 todo_wine
1537 ok(id == -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(global_idents[i]), id);
1538 SysFreeString(bstr);
1541 for (i = 0; i < ARRAY_SIZE(context_idents); i++)
1543 bstr = SysAllocString(context_idents[i]);
1544 id = 0;
1545 hr = IDispatchEx_GetDispID(dispex, bstr, 0, &id);
1546 todo_wine_if(i != 0)
1547 ok(hr == DISP_E_UNKNOWNNAME, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(context_idents[i]), hr);
1548 todo_wine_if(i != 0)
1549 ok(id == -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(context_idents[i]), id);
1550 SysFreeString(bstr);
1552 IDispatchEx_Release(dispex);
1554 for (i = 0; i < ARRAY_SIZE(global_code_test); i++)
1556 SET_EXPECT(OnEnterScript);
1557 SET_EXPECT(OnLeaveScript);
1558 hr = IActiveScriptParse_ParseScriptText(parse, global_code_test[i], NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1559 ok(hr == S_OK, "ParseScriptText(%s) failed: %08x\n", wine_dbgstr_w(global_code_test[i]), hr);
1560 CHECK_CALLED(OnEnterScript);
1561 CHECK_CALLED(OnLeaveScript);
1562 SET_EXPECT(OnEnterScript);
1563 SET_EXPECT(OnLeaveScript);
1564 hr = IActiveScriptParse_ParseScriptText(parse, global_code_test[i], L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
1565 ok(hr == S_OK, "ParseScriptText(%s) failed: %08x\n", wine_dbgstr_w(global_code_test[i]), hr);
1566 CHECK_CALLED(OnEnterScript);
1567 CHECK_CALLED(OnLeaveScript);
1570 for (i = 0; i < ARRAY_SIZE(context_code_test); i++)
1572 SET_EXPECT(OnEnterScript);
1573 SET_EXPECT(OnScriptError);
1574 SET_EXPECT(OnLeaveScript);
1575 hr = IActiveScriptParse_ParseScriptText(parse, context_code_test[i], NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1576 todo_wine_if(i != 0)
1577 ok(FAILED(hr), "ParseScriptText(%s) returned: %08x\n", wine_dbgstr_w(context_code_test[i]), hr);
1578 CHECK_CALLED(OnEnterScript);
1579 todo_wine_if(i != 0)
1580 CHECK_CALLED(OnScriptError);
1581 CHECK_CALLED(OnLeaveScript);
1583 SET_EXPECT(OnEnterScript);
1584 SET_EXPECT(OnScriptError);
1585 SET_EXPECT(OnLeaveScript);
1586 hr = IActiveScriptParse_ParseScriptText(parse, context_code_test[i], L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
1587 todo_wine_if(i != 0)
1588 ok(FAILED(hr), "ParseScriptText(%s) returned: %08x\n", wine_dbgstr_w(context_code_test[i]), hr);
1589 CHECK_CALLED(OnEnterScript);
1590 todo_wine_if(i != 0)
1591 CHECK_CALLED(OnScriptError);
1592 CHECK_CALLED(OnLeaveScript);
1595 SET_EXPECT(OnStateChange_DISCONNECTED);
1596 SET_EXPECT(OnStateChange_INITIALIZED);
1597 SET_EXPECT(OnStateChange_CLOSED);
1598 hr = IActiveScript_Close(script);
1599 ok(hr == S_OK, "Close failed: %08x\n", hr);
1600 CHECK_CALLED(OnStateChange_DISCONNECTED);
1601 CHECK_CALLED(OnStateChange_INITIALIZED);
1602 CHECK_CALLED(OnStateChange_CLOSED);
1604 ok(global_named_item_ref == 0, "global_named_item_ref = %u\n", global_named_item_ref);
1605 ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
1606 ok(visible_code_named_item_ref == 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
1608 test_state(script, SCRIPTSTATE_CLOSED);
1609 IActiveScriptParse_Release(parse);
1611 ref = IActiveScript_Release(script);
1612 ok(!ref, "ref = %d\n", ref);
1615 static void test_typeinfo(const WCHAR *parse_func_name)
1617 static struct
1619 const WCHAR *name;
1620 UINT num_args;
1621 } func[] =
1623 { L"emptyfn", 0 },
1624 { L"voidfn", 0 },
1625 { L"math", 2 },
1626 { L"foobar", 1 },
1627 { L"C", 0 },
1628 { L"funcvar", 2 },
1629 { L"f1", 1 },
1630 { L"f2", 1 }
1632 static struct
1634 const WCHAR *name;
1635 } var[] =
1637 { L"global_var" },
1638 { L"uninit" },
1639 { L"obj" }
1641 const WCHAR *source = L""
1642 "var global_var = 42;\n"
1644 "function emptyfn() { }\n"
1645 "function voidfn() { return void(0); }\n"
1646 "function math(x, y) { return x - y; }\n"
1647 "function foobar(x) { return \"foobar\"; }\n"
1649 "function C() {\n"
1650 " this.x;\n"
1651 " this.strret = function() { return \"ret\"; }\n"
1652 "}\n"
1654 "var uninit;\n"
1655 "var obj = new C();\n"
1657 "var funcvar = function(x, y) { return x * y; };\n"
1658 "var native_func = decodeURI;\n"
1660 "(function() {\n"
1661 " f1 = function infuncexpr(x) { return 1; }\n"
1662 " f2 = function infuncexpr(x) { return 2; }\n"
1663 "})();\n";
1664 UINT expected_funcs_cnt = parse_func_name ? 0 : ARRAY_SIZE(func);
1665 UINT expected_vars_cnt = parse_func_name ? 0 : ARRAY_SIZE(var);
1667 ITypeInfo *typeinfo, *typeinfo2;
1668 ITypeComp *typecomp, *typecomp2;
1669 IActiveScriptParse *parser;
1670 IActiveScript *script;
1671 FUNCDESC *funcdesc;
1672 VARDESC *vardesc;
1673 IDispatchEx *disp;
1674 DESCKIND desckind;
1675 INT implTypeFlags;
1676 UINT count, index;
1677 HREFTYPE reftype;
1678 BINDPTR bindptr;
1679 MEMBERID memid;
1680 TYPEATTR *attr;
1681 HRESULT hr;
1682 WCHAR str[64], *names = str;
1683 BSTR bstr, bstrs[5];
1684 void *obj;
1685 int i;
1687 if (parse_func_name)
1688 trace("Testing TypeInfo for function %s...\n", wine_dbgstr_w(parse_func_name));
1689 else
1690 trace("Testing TypeInfo for script dispatch...\n");
1692 script = create_jscript();
1694 hr = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser);
1695 ok(hr == S_OK, "Could not get IActiveScriptParse iface: %08x\n", hr);
1697 SET_EXPECT(GetLCID);
1698 hr = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
1699 ok(hr == S_OK, "SetScriptSite failed: %08x\n", hr);
1700 CHECK_CALLED(GetLCID);
1702 SET_EXPECT(OnStateChange_INITIALIZED);
1703 hr = IActiveScriptParse_InitNew(parser);
1704 ok(hr == S_OK, "InitNew failed: %08x\n", hr);
1705 CHECK_CALLED(OnStateChange_INITIALIZED);
1707 SET_EXPECT(OnStateChange_CONNECTED);
1708 hr = IActiveScript_SetScriptState(script, SCRIPTSTATE_CONNECTED);
1709 ok(hr == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hr);
1710 CHECK_CALLED(OnStateChange_CONNECTED);
1712 if (parse_func_name)
1714 IActiveScriptParseProcedure2 *parse_proc;
1715 IDispatch *proc_disp;
1717 hr = IActiveScript_QueryInterface(script, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
1718 ok(hr == S_OK, "Could not get IActiveScriptParse: %08x\n", hr);
1720 hr = IActiveScriptParseProcedure2_ParseProcedureText(parse_proc, source, NULL, parse_func_name,
1721 NULL, NULL, NULL, 0, 0, SCRIPTPROC_IMPLICIT_THIS | SCRIPTPROC_IMPLICIT_PARENTS, &proc_disp);
1722 ok(hr == S_OK, "ParseProcedureText failed: %08x\n", hr);
1723 IActiveScriptParseProcedure2_Release(parse_proc);
1725 hr = IDispatch_QueryInterface(proc_disp, &IID_IDispatchEx, (void**)&disp);
1726 ok(hr == S_OK, "Could not get IDispatchEx: %08x\n", hr);
1727 IDispatch_Release(proc_disp);
1729 else
1731 parse_script(parser, source);
1732 disp = get_script_dispatch(script, NULL);
1735 hr = IDispatchEx_QueryInterface(disp, &IID_ITypeInfo, (void**)&typeinfo);
1736 ok(hr == E_NOINTERFACE, "QueryInterface(IID_ITypeInfo) returned: %08x\n", hr);
1737 hr = IDispatchEx_GetTypeInfo(disp, 1, LOCALE_USER_DEFAULT, &typeinfo);
1738 ok(hr == DISP_E_BADINDEX, "GetTypeInfo returned: %08x\n", hr);
1739 hr = IDispatchEx_GetTypeInfo(disp, 0, LOCALE_USER_DEFAULT, &typeinfo);
1740 ok(hr == S_OK, "GetTypeInfo failed: %08x\n", hr);
1741 hr = IDispatchEx_GetTypeInfo(disp, 0, LOCALE_USER_DEFAULT, &typeinfo2);
1742 ok(hr == S_OK, "GetTypeInfo failed: %08x\n", hr);
1743 ok(typeinfo != typeinfo2, "TypeInfo was not supposed to be shared.\n");
1744 ITypeInfo_Release(typeinfo2);
1746 obj = (void*)0xdeadbeef;
1747 hr = ITypeInfo_CreateInstance(typeinfo, NULL, NULL, NULL);
1748 ok(hr == E_INVALIDARG, "CreateInstance returned: %08x\n", hr);
1749 hr = ITypeInfo_CreateInstance(typeinfo, NULL, NULL, &obj);
1750 ok(hr == TYPE_E_BADMODULEKIND, "CreateInstance returned: %08x\n", hr);
1751 hr = ITypeInfo_CreateInstance(typeinfo, NULL, &IID_IDispatch, &obj);
1752 ok(hr == TYPE_E_BADMODULEKIND, "CreateInstance returned: %08x\n", hr);
1753 ok(!obj, "Unexpected non-null obj %p.\n", obj);
1755 hr = ITypeInfo_GetDocumentation(typeinfo, MEMBERID_NIL, &bstr, NULL, NULL, NULL);
1756 ok(hr == S_OK, "GetDocumentation(MEMBERID_NIL) failed: %08x\n", hr);
1757 ok(!lstrcmpW(bstr, L"JScriptTypeInfo"), "Unexpected TypeInfo name %s\n", wine_dbgstr_w(bstr));
1758 SysFreeString(bstr);
1760 hr = ITypeInfo_GetTypeAttr(typeinfo, &attr);
1761 ok(hr == S_OK, "GetTypeAttr failed: %08x\n", hr);
1762 ok(IsEqualGUID(&attr->guid, &IID_IScriptTypeInfo), "Unexpected GUID %s\n", wine_dbgstr_guid(&attr->guid));
1763 ok(attr->lcid == LOCALE_USER_DEFAULT, "Unexpected LCID %u\n", attr->lcid);
1764 ok(attr->memidConstructor == MEMBERID_NIL, "Unexpected constructor memid %u\n", attr->memidConstructor);
1765 ok(attr->memidDestructor == MEMBERID_NIL, "Unexpected destructor memid %u\n", attr->memidDestructor);
1766 ok(attr->cbSizeInstance == 4, "Unexpected cbSizeInstance %u\n", attr->cbSizeInstance);
1767 ok(attr->typekind == TKIND_DISPATCH, "Unexpected typekind %u\n", attr->typekind);
1768 ok(attr->cFuncs == expected_funcs_cnt, "Unexpected cFuncs %u\n", attr->cFuncs);
1769 ok(attr->cVars == expected_vars_cnt, "Unexpected cVars %u\n", attr->cVars);
1770 ok(attr->cImplTypes == 1, "Unexpected cImplTypes %u\n", attr->cImplTypes);
1771 ok(attr->cbSizeVft == sizeof(IDispatchVtbl), "Unexpected cbSizeVft %u\n", attr->cbSizeVft);
1772 ok(attr->cbAlignment == 4, "Unexpected cbAlignment %u\n", attr->cbAlignment);
1773 ok(attr->wTypeFlags == TYPEFLAG_FDISPATCHABLE, "Unexpected wTypeFlags 0x%x\n", attr->wTypeFlags);
1774 ok(attr->tdescAlias.vt == VT_EMPTY, "Unexpected tdescAlias.vt %d\n", attr->tdescAlias.vt);
1775 ok(attr->idldescType.wIDLFlags == IDLFLAG_NONE, "Unexpected idldescType.wIDLFlags 0x%x\n", attr->idldescType.wIDLFlags);
1776 ITypeInfo_ReleaseTypeAttr(typeinfo, attr);
1778 /* The type inherits from IDispatch */
1779 hr = ITypeInfo_GetImplTypeFlags(typeinfo, 0, NULL);
1780 ok(hr == E_INVALIDARG, "GetImplTypeFlags returned: %08x\n", hr);
1781 hr = ITypeInfo_GetImplTypeFlags(typeinfo, 1, &implTypeFlags);
1782 ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetImplTypeFlags returned: %08x\n", hr);
1783 hr = ITypeInfo_GetImplTypeFlags(typeinfo, -1, &implTypeFlags);
1784 ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetImplTypeFlags returned: %08x\n", hr);
1785 hr = ITypeInfo_GetImplTypeFlags(typeinfo, 0, &implTypeFlags);
1786 ok(hr == S_OK, "GetImplTypeFlags failed: %08x\n", hr);
1787 ok(implTypeFlags == 0, "Unexpected implTypeFlags 0x%x\n", implTypeFlags);
1789 hr = ITypeInfo_GetRefTypeOfImplType(typeinfo, 0, NULL);
1790 ok(hr == E_INVALIDARG, "GetRefTypeOfImplType returned: %08x\n", hr);
1791 hr = ITypeInfo_GetRefTypeOfImplType(typeinfo, 1, &reftype);
1792 ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetRefTypeOfImplType returned: %08x\n", hr);
1793 hr = ITypeInfo_GetRefTypeOfImplType(typeinfo, -1, &reftype);
1794 ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetRefTypeOfImplType failed: %08x\n", hr);
1795 hr = ITypeInfo_GetRefTypeOfImplType(typeinfo, 0, &reftype);
1796 ok(hr == S_OK, "GetRefTypeOfImplType failed: %08x\n", hr);
1797 ok(reftype == 1, "Unexpected reftype %d\n", reftype);
1799 hr = ITypeInfo_GetRefTypeInfo(typeinfo, reftype, NULL);
1800 ok(hr == E_INVALIDARG, "GetRefTypeInfo returned: %08x\n", hr);
1801 hr = ITypeInfo_GetRefTypeInfo(typeinfo, -1, &typeinfo2);
1802 ok(hr == E_INVALIDARG, "GetRefTypeInfo returned: %08x\n", hr);
1803 hr = ITypeInfo_GetRefTypeInfo(typeinfo, 4, &typeinfo2);
1804 ok(hr == E_FAIL, "GetRefTypeInfo returned: %08x\n", hr);
1805 hr = ITypeInfo_GetRefTypeInfo(typeinfo, 0, &typeinfo2);
1806 ok(hr == S_OK, "GetRefTypeInfo failed: %08x\n", hr);
1807 ok(typeinfo == typeinfo2, "Unexpected TypeInfo %p (expected %p)\n", typeinfo2, typeinfo);
1808 ITypeInfo_Release(typeinfo2);
1809 hr = ITypeInfo_GetRefTypeInfo(typeinfo, reftype, &typeinfo2);
1810 ok(hr == S_OK, "GetRefTypeInfo failed: %08x\n", hr);
1811 hr = ITypeInfo_GetDocumentation(typeinfo2, MEMBERID_NIL, &bstr, NULL, NULL, NULL);
1812 ok(hr == S_OK, "GetDocumentation(MEMBERID_NIL) failed: %08x\n", hr);
1813 ok(!lstrcmpW(bstr, L"IDispatch"), "Unexpected TypeInfo name %s\n", wine_dbgstr_w(bstr));
1814 ITypeInfo_Release(typeinfo2);
1815 SysFreeString(bstr);
1817 /* GetIDsOfNames looks into the inherited types as well */
1818 wcscpy(str, L"queryinterface");
1819 hr = ITypeInfo_GetIDsOfNames(typeinfo, NULL, 1, &memid);
1820 ok(hr == E_INVALIDARG, "GetIDsOfNames returned: %08x\n", hr);
1821 hr = ITypeInfo_GetIDsOfNames(typeinfo, &names, 1, NULL);
1822 ok(hr == E_INVALIDARG, "GetIDsOfNames returned: %08x\n", hr);
1823 hr = ITypeInfo_GetIDsOfNames(typeinfo, &names, 0, &memid);
1824 ok(hr == E_INVALIDARG, "GetIDsOfNames returned: %08x\n", hr);
1825 hr = ITypeInfo_GetIDsOfNames(typeinfo, &names, 1, &memid);
1826 ok(hr == S_OK, "GetIDsOfNames failed: %08x\n", hr);
1827 ok(!lstrcmpW(str, L"queryinterface"), "Unexpected string %s\n", wine_dbgstr_w(str));
1828 if (expected_funcs_cnt)
1830 wcscpy(str, L"Math");
1831 hr = ITypeInfo_GetIDsOfNames(typeinfo, &names, 1, &memid);
1832 ok(hr == S_OK, "GetIDsOfNames failed: %08x\n", hr);
1833 ok(!lstrcmpW(str, L"Math"), "Unexpected string %s\n", wine_dbgstr_w(str));
1834 hr = ITypeInfo_GetNames(typeinfo, memid, NULL, 1, &count);
1835 ok(hr == E_INVALIDARG, "GetNames returned: %08x\n", hr);
1836 hr = ITypeInfo_GetNames(typeinfo, memid, bstrs, 1, NULL);
1837 ok(hr == E_INVALIDARG, "GetNames returned: %08x\n", hr);
1838 hr = ITypeInfo_GetNames(typeinfo, memid, bstrs, 0, &count);
1839 ok(hr == S_OK, "GetNames failed: %08x\n", hr);
1840 ok(count == 0, "Unexpected count %u\n", count);
1841 hr = ITypeInfo_GetNames(typeinfo, memid, bstrs, ARRAY_SIZE(bstrs), &count);
1842 ok(hr == S_OK, "GetNames failed: %08x\n", hr);
1843 ok(count == 3, "Unexpected count %u\n", count);
1844 ok(!lstrcmpW(bstrs[0], L"math"), "Unexpected function name %s\n", wine_dbgstr_w(bstrs[0]));
1845 ok(!lstrcmpW(bstrs[1], L"x"), "Unexpected function first param name %s\n", wine_dbgstr_w(bstrs[1]));
1846 ok(!lstrcmpW(bstrs[2], L"y"), "Unexpected function second param name %s\n", wine_dbgstr_w(bstrs[2]));
1847 for (i = 0; i < count; i++) SysFreeString(bstrs[i]);
1849 hr = ITypeInfo_GetMops(typeinfo, memid, NULL);
1850 ok(hr == E_INVALIDARG, "GetMops returned: %08x\n", hr);
1851 hr = ITypeInfo_GetMops(typeinfo, memid, &bstr);
1852 ok(hr == S_OK, "GetMops failed: %08x\n", hr);
1853 ok(!bstr, "Unexpected non-null string %s\n", wine_dbgstr_w(bstr));
1854 hr = ITypeInfo_GetMops(typeinfo, MEMBERID_NIL, &bstr);
1855 ok(hr == S_OK, "GetMops failed: %08x\n", hr);
1856 ok(!bstr, "Unexpected non-null string %s\n", wine_dbgstr_w(bstr));
1858 /* These always fail */
1859 obj = (void*)0xdeadbeef;
1860 hr = ITypeInfo_AddressOfMember(typeinfo, memid, INVOKE_FUNC, NULL);
1861 ok(hr == E_INVALIDARG, "AddressOfMember returned: %08x\n", hr);
1862 hr = ITypeInfo_AddressOfMember(typeinfo, memid, INVOKE_FUNC, &obj);
1863 ok(hr == TYPE_E_BADMODULEKIND, "AddressOfMember returned: %08x\n", hr);
1864 ok(!obj, "Unexpected non-null obj %p.\n", obj);
1865 bstr = (BSTR)0xdeadbeef;
1866 hr = ITypeInfo_GetDllEntry(typeinfo, memid, INVOKE_FUNC, &bstr, NULL, NULL);
1867 ok(hr == TYPE_E_BADMODULEKIND, "GetDllEntry returned: %08x\n", hr);
1868 ok(!bstr, "Unexpected non-null str %p.\n", bstr);
1869 wcscpy(str, L"Invoke");
1870 hr = ITypeInfo_GetIDsOfNames(typeinfo, &names, 1, &memid);
1871 ok(hr == S_OK, "GetIDsOfNames failed: %08x\n", hr);
1872 obj = (void*)0xdeadbeef;
1873 hr = ITypeInfo_AddressOfMember(typeinfo, memid, INVOKE_FUNC, &obj);
1874 ok(hr == TYPE_E_BADMODULEKIND, "AddressOfMember returned: %08x\n", hr);
1875 ok(!obj, "Unexpected non-null obj %p.\n", obj);
1876 bstr = (BSTR)0xdeadbeef;
1877 hr = ITypeInfo_GetDllEntry(typeinfo, memid, INVOKE_FUNC, &bstr, NULL, NULL);
1878 ok(hr == TYPE_E_BADMODULEKIND, "GetDllEntry returned: %08x\n", hr);
1879 ok(!bstr, "Unexpected non-null str %p.\n", bstr);
1882 /* Check variable descriptions */
1883 hr = ITypeInfo_GetVarDesc(typeinfo, 0, NULL);
1884 ok(hr == E_INVALIDARG, "GetVarDesc returned: %08x\n", hr);
1885 hr = ITypeInfo_GetVarDesc(typeinfo, 1337, &vardesc);
1886 ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetVarDesc returned: %08x\n", hr);
1887 for (i = 0; i < expected_vars_cnt; i++)
1889 hr = ITypeInfo_GetVarDesc(typeinfo, i, &vardesc);
1890 ok(hr == S_OK, "GetVarDesc(%u) failed: %08x\n", i, hr);
1891 hr = ITypeInfo_GetDocumentation(typeinfo, vardesc->memid, &bstr, &bstrs[0], NULL, NULL);
1892 ok(hr == S_OK, "[%u] GetDocumentation failed: %08x\n", i, hr);
1893 ok(!lstrcmpW(bstr, var[i].name), "[%u] Unexpected variable name %s (expected %s)\n",
1894 i, wine_dbgstr_w(bstr), wine_dbgstr_w(var[i].name));
1895 ok(!bstrs[0], "[%u] Unexpected doc string %s\n", i, wine_dbgstr_w(bstrs[0]));
1896 SysFreeString(bstr);
1897 ok(vardesc->memid <= 0xFFFF, "[%u] Unexpected memid 0x%x\n", i, vardesc->memid);
1898 ok(vardesc->lpstrSchema == NULL, "[%u] Unexpected lpstrSchema %p\n", i, vardesc->lpstrSchema);
1899 ok(vardesc->oInst == 0, "[%u] Unexpected oInst %u\n", i, vardesc->oInst);
1900 ok(vardesc->varkind == VAR_DISPATCH, "[%u] Unexpected varkind %d\n", i, vardesc->varkind);
1901 ok(vardesc->wVarFlags == 0, "[%u] Unexpected wVarFlags 0x%x\n", i, vardesc->wVarFlags);
1902 ok(vardesc->elemdescVar.tdesc.vt == VT_VARIANT,
1903 "[%u] Unexpected variable type vt %d (expected %d)\n", i, vardesc->elemdescVar.tdesc.vt, 0);
1904 ok(vardesc->elemdescVar.paramdesc.pparamdescex == NULL,
1905 "[%u] Unexpected variable type pparamdescex %p\n", i, vardesc->elemdescVar.paramdesc.pparamdescex);
1906 ok(vardesc->elemdescVar.paramdesc.wParamFlags == PARAMFLAG_NONE,
1907 "[%u] Unexpected variable type wParamFlags 0x%x\n", i, vardesc->elemdescVar.paramdesc.wParamFlags);
1908 ITypeInfo_ReleaseVarDesc(typeinfo, vardesc);
1911 /* Check function descriptions */
1912 hr = ITypeInfo_GetFuncDesc(typeinfo, 0, NULL);
1913 ok(hr == E_INVALIDARG, "GetFuncDesc returned: %08x\n", hr);
1914 hr = ITypeInfo_GetFuncDesc(typeinfo, 1337, &funcdesc);
1915 ok(hr == TYPE_E_ELEMENTNOTFOUND, "GetFuncDesc returned: %08x\n", hr);
1916 for (i = 0; i < expected_funcs_cnt; i++)
1918 hr = ITypeInfo_GetFuncDesc(typeinfo, i, &funcdesc);
1919 ok(hr == S_OK, "GetFuncDesc(%u) failed: %08x\n", i, hr);
1920 hr = ITypeInfo_GetDocumentation(typeinfo, funcdesc->memid, &bstr, &bstrs[0], NULL, NULL);
1921 ok(hr == S_OK, "[%u] GetDocumentation failed: %08x\n", i, hr);
1922 ok(!lstrcmpW(bstr, func[i].name), "[%u] Unexpected function name %s (expected %s)\n",
1923 i, wine_dbgstr_w(bstr), wine_dbgstr_w(func[i].name));
1924 ok(!bstrs[0], "[%u] Unexpected doc string %s\n", i, wine_dbgstr_w(bstrs[0]));
1925 SysFreeString(bstr);
1926 ok(funcdesc->memid <= 0xFFFF, "[%u] Unexpected memid 0x%x\n", i, funcdesc->memid);
1927 ok(funcdesc->lprgscode == NULL, "[%u] Unexpected lprgscode %p\n", i, funcdesc->lprgscode);
1928 ok(func[i].num_args ? (funcdesc->lprgelemdescParam != NULL) : (funcdesc->lprgelemdescParam == NULL),
1929 "[%u] Unexpected lprgelemdescParam %p\n", i, funcdesc->lprgelemdescParam);
1930 ok(funcdesc->funckind == FUNC_DISPATCH, "[%u] Unexpected funckind %u\n", i, funcdesc->funckind);
1931 ok(funcdesc->invkind == INVOKE_FUNC, "[%u] Unexpected invkind %u\n", i, funcdesc->invkind);
1932 ok(funcdesc->callconv == CC_STDCALL, "[%u] Unexpected callconv %u\n", i, funcdesc->callconv);
1933 ok(funcdesc->cParams == func[i].num_args, "[%u] Unexpected cParams %d (expected %d)\n",
1934 i, funcdesc->cParams, func[i].num_args);
1935 ok(funcdesc->cParamsOpt == 0, "[%u] Unexpected cParamsOpt %d\n", i, funcdesc->cParamsOpt);
1936 ok(funcdesc->cScodes == 0, "[%u] Unexpected cScodes %d\n", i, funcdesc->cScodes);
1937 ok(funcdesc->wFuncFlags == 0, "[%u] Unexpected wFuncFlags 0x%x\n", i, funcdesc->wFuncFlags);
1938 ok(funcdesc->elemdescFunc.tdesc.vt == VT_VARIANT,
1939 "[%u] Unexpected return type vt %d\n", i, funcdesc->elemdescFunc.tdesc.vt);
1940 ok(funcdesc->elemdescFunc.paramdesc.pparamdescex == NULL,
1941 "[%u] Unexpected return type pparamdescex %p\n", i, funcdesc->elemdescFunc.paramdesc.pparamdescex);
1942 ok(funcdesc->elemdescFunc.paramdesc.wParamFlags == PARAMFLAG_NONE,
1943 "[%u] Unexpected return type wParamFlags 0x%x\n", i, funcdesc->elemdescFunc.paramdesc.wParamFlags);
1944 if (funcdesc->lprgelemdescParam)
1945 for (index = 0; index < funcdesc->cParams; index++)
1947 ok(funcdesc->lprgelemdescParam[index].tdesc.vt == VT_VARIANT,
1948 "[%u] Unexpected parameter %u vt %d\n", i, index, funcdesc->lprgelemdescParam[index].tdesc.vt);
1949 ok(funcdesc->lprgelemdescParam[index].paramdesc.pparamdescex == NULL,
1950 "[%u] Unexpected parameter %u pparamdescex %p\n", i, index, funcdesc->lprgelemdescParam[index].paramdesc.pparamdescex);
1951 ok(funcdesc->lprgelemdescParam[index].paramdesc.wParamFlags == PARAMFLAG_NONE,
1952 "[%u] Unexpected parameter %u wParamFlags 0x%x\n", i, index, funcdesc->lprgelemdescParam[index].paramdesc.wParamFlags);
1954 ITypeInfo_ReleaseFuncDesc(typeinfo, funcdesc);
1957 /* Test TypeComp Binds */
1958 hr = ITypeInfo_QueryInterface(typeinfo, &IID_ITypeComp, (void**)&typecomp);
1959 ok(hr == S_OK, "QueryInterface(IID_ITypeComp) failed: %08x\n", hr);
1960 hr = ITypeInfo_GetTypeComp(typeinfo, NULL);
1961 ok(hr == E_INVALIDARG, "GetTypeComp returned: %08x\n", hr);
1962 hr = ITypeInfo_GetTypeComp(typeinfo, &typecomp2);
1963 ok(hr == S_OK, "GetTypeComp failed: %08x\n", hr);
1964 ok(typecomp == typecomp2, "QueryInterface(IID_ITypeComp) and GetTypeComp returned different TypeComps\n");
1965 ITypeComp_Release(typecomp2);
1966 wcscpy(str, L"not_found");
1967 hr = ITypeComp_Bind(typecomp, NULL, 0, 0, &typeinfo2, &desckind, &bindptr);
1968 ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr);
1969 hr = ITypeComp_Bind(typecomp, str, 0, 0, NULL, &desckind, &bindptr);
1970 ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr);
1971 hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, NULL, &bindptr);
1972 ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr);
1973 hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, &desckind, NULL);
1974 ok(hr == E_INVALIDARG, "Bind returned: %08x\n", hr);
1975 hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, &desckind, &bindptr);
1976 ok(hr == S_OK, "Bind failed: %08x\n", hr);
1977 ok(desckind == DESCKIND_NONE, "Unexpected desckind %u\n", desckind);
1978 wcscpy(str, L"addRef");
1979 hr = ITypeComp_Bind(typecomp, str, 0, 0, &typeinfo2, &desckind, &bindptr);
1980 ok(hr == S_OK, "Bind failed: %08x\n", hr);
1981 ok(desckind == DESCKIND_FUNCDESC, "Unexpected desckind %u\n", desckind);
1982 ok(!lstrcmpW(str, L"addRef"), "Unexpected string %s\n", wine_dbgstr_w(str));
1983 ITypeInfo_ReleaseFuncDesc(typeinfo2, bindptr.lpfuncdesc);
1984 ITypeInfo_Release(typeinfo2);
1985 for (i = 0; i < expected_vars_cnt; i++)
1987 wcscpy(str, var[i].name);
1988 hr = ITypeComp_Bind(typecomp, str, 0, INVOKE_PROPERTYGET, &typeinfo2, &desckind, &bindptr);
1989 ok(hr == S_OK, "Bind failed: %08x\n", hr);
1990 ok(desckind == DESCKIND_VARDESC, "Unexpected desckind %u\n", desckind);
1991 ITypeInfo_ReleaseVarDesc(typeinfo2, bindptr.lpvardesc);
1992 ITypeInfo_Release(typeinfo2);
1994 for (i = 0; i < expected_funcs_cnt; i++)
1996 wcscpy(str, func[i].name);
1997 hr = ITypeComp_Bind(typecomp, str, 0, INVOKE_FUNC, &typeinfo2, &desckind, &bindptr);
1998 ok(hr == S_OK, "Bind failed: %08x\n", hr);
1999 ok(desckind == DESCKIND_FUNCDESC, "Unexpected desckind %u\n", desckind);
2000 ITypeInfo_ReleaseFuncDesc(typeinfo2, bindptr.lpfuncdesc);
2001 ITypeInfo_Release(typeinfo2);
2003 wcscpy(str, L"JScriptTypeInfo");
2004 hr = ITypeComp_BindType(typecomp, NULL, 0, &typeinfo2, &typecomp2);
2005 ok(hr == E_INVALIDARG, "BindType returned: %08x\n", hr);
2006 hr = ITypeComp_BindType(typecomp, str, 0, NULL, &typecomp2);
2007 ok(hr == E_INVALIDARG, "BindType returned: %08x\n", hr);
2008 hr = ITypeComp_BindType(typecomp, str, 0, &typeinfo2, NULL);
2009 ok(hr == E_INVALIDARG, "BindType returned: %08x\n", hr);
2010 hr = ITypeComp_BindType(typecomp, str, 0, &typeinfo2, &typecomp2);
2011 ok(hr == S_OK, "BindType failed: %08x\n", hr);
2012 ok(!typeinfo2, "Unexpected TypeInfo %p (expected null)\n", typeinfo2);
2013 ok(!typecomp2, "Unexpected TypeComp %p (expected null)\n", typecomp2);
2014 wcscpy(str, L"C");
2015 hr = ITypeComp_BindType(typecomp, str, 0, &typeinfo2, &typecomp2);
2016 ok(hr == S_OK, "BindType failed: %08x\n", hr);
2017 ok(!typeinfo2, "Unexpected TypeInfo %p (expected null)\n", typeinfo2);
2018 ok(!typecomp2, "Unexpected TypeComp %p (expected null)\n", typecomp2);
2019 wcscpy(str, L"IDispatch");
2020 hr = ITypeComp_BindType(typecomp, str, 0, &typeinfo2, &typecomp2);
2021 ok(hr == S_OK, "BindType failed: %08x\n", hr);
2022 ok(!typeinfo2, "Unexpected TypeInfo %p (expected null)\n", typeinfo2);
2023 ok(!typecomp2, "Unexpected TypeComp %p (expected null)\n", typecomp2);
2024 ITypeComp_Release(typecomp);
2026 /* Updating the script won't update the typeinfo obtained before,
2027 but it will be reflected in any typeinfo obtained afterwards. */
2028 if (!parse_func_name)
2030 parse_script(parser, L""
2031 "var new_var;\n"
2032 "function new_func() { }\n");
2034 hr = IDispatchEx_GetTypeInfo(disp, 0, LOCALE_USER_DEFAULT, &typeinfo2);
2035 ok(hr == S_OK, "GetTypeInfo failed: %08x\n", hr);
2036 hr = ITypeInfo_GetTypeAttr(typeinfo, &attr);
2037 ok(hr == S_OK, "GetTypeAttr failed: %08x\n", hr);
2038 ok(attr->cFuncs == expected_funcs_cnt, "Unexpected cFuncs %u\n", attr->cFuncs);
2039 ok(attr->cVars == expected_vars_cnt, "Unexpected cVars %u\n", attr->cVars);
2040 ITypeInfo_ReleaseTypeAttr(typeinfo, attr);
2041 hr = ITypeInfo_GetTypeAttr(typeinfo2, &attr);
2042 ok(hr == S_OK, "GetTypeAttr failed: %08x\n", hr);
2043 ok(attr->cFuncs == expected_funcs_cnt + 1, "Unexpected cFuncs %u\n", attr->cFuncs);
2044 ok(attr->cVars == expected_vars_cnt + 1, "Unexpected cVars %u\n", attr->cVars);
2045 ITypeInfo_ReleaseTypeAttr(typeinfo2, attr);
2046 ITypeInfo_Release(typeinfo2);
2048 /* Adding an identifier that differs only in case gives an error
2049 when retrieving the TypeInfo, even though it is valid jscript. */
2050 parse_script(parser, L"var NEW_FUNC;\n");
2051 hr = IDispatchEx_GetTypeInfo(disp, 0, LOCALE_USER_DEFAULT, &typeinfo2);
2052 ok(hr == TYPE_E_AMBIGUOUSNAME, "GetTypeInfo returned: %08x\n", hr);
2055 ITypeInfo_Release(typeinfo);
2056 IDispatchEx_Release(disp);
2057 IActiveScriptParse_Release(parser);
2059 SET_EXPECT(OnStateChange_DISCONNECTED);
2060 SET_EXPECT(OnStateChange_INITIALIZED);
2061 SET_EXPECT(OnStateChange_CLOSED);
2062 hr = IActiveScript_Close(script);
2063 ok(hr == S_OK, "Close failed: %08x\n", hr);
2064 CHECK_CALLED(OnStateChange_DISCONNECTED);
2065 CHECK_CALLED(OnStateChange_INITIALIZED);
2066 CHECK_CALLED(OnStateChange_CLOSED);
2068 IActiveScript_Release(script);
2071 static BOOL check_jscript(void)
2073 IActiveScriptProperty *script_prop;
2074 HRESULT hres;
2076 hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
2077 &IID_IActiveScriptProperty, (void**)&script_prop);
2078 if(SUCCEEDED(hres))
2079 IActiveScriptProperty_Release(script_prop);
2081 return hres == S_OK;
2084 START_TEST(jscript)
2086 CoInitialize(NULL);
2088 if(check_jscript()) {
2089 trace("Testing JScript object...\n");
2090 test_jscript();
2091 test_jscript2();
2092 test_jscript_uninitializing();
2093 test_aggregation();
2094 test_code_persistence();
2095 test_named_items();
2096 test_typeinfo(NULL);
2097 test_typeinfo(L"some_func_name");
2099 trace("Testing JScriptEncode object...\n");
2100 engine_clsid = &CLSID_JScriptEncode;
2101 test_jscript();
2102 }else {
2103 win_skip("Broken engine, probably too old\n");
2106 CoUninitialize();