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
28 #include "wine/test.h"
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
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
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) \
64 #define SET_EXPECT_MULTI(func, num) \
67 #define CHECK_EXPECT2(func) \
69 ok(expect_ ##func, "unexpected call " #func "\n"); \
73 #define CHECK_EXPECT(func) \
75 CHECK_EXPECT2(func); \
79 #define CHECK_CALLED(func) \
81 ok(called_ ## func, "expected " #func "\n"); \
82 expect_ ## func = called_ ## func = 0; \
85 #define CHECK_NOT_CALLED(func) \
87 ok(!called_ ## func, "unexpected " #func "\n"); \
88 expect_ ## func = called_ ## func = FALSE; \
91 #define CHECK_CALLED_MULTI(func, num) \
93 ok(called_ ## func == num, "expected " #func " %d times (got %d)\n", num, called_ ## func); \
94 expect_ ## func = called_ ## func = 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;
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
)) {
131 IDispatch_AddRef(iface
);
136 return E_NOINTERFACE
;
139 static ULONG WINAPI
Dispatch_AddRef(IDispatch
*iface
)
144 static ULONG WINAPI
Dispatch_Release(IDispatch
*iface
)
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");
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")) {
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
);
216 static const IDispatchVtbl dispatch_vtbl
= {
217 Dispatch_QueryInterface
,
220 Dispatch_GetTypeInfoCount
,
221 Dispatch_GetTypeInfo
,
222 Dispatch_GetIDsOfNames
,
226 static IDispatch dispatch_object
= { &dispatch_vtbl
};
228 static const IDispatchVtbl global_named_item_vtbl
= {
229 Dispatch_QueryInterface
,
232 Dispatch_GetTypeInfoCount
,
233 Dispatch_GetTypeInfo
,
234 Dispatch_GetIDsOfNames
,
238 static IDispatch global_named_item
= { &global_named_item_vtbl
};
240 static const IDispatchVtbl visible_named_item_vtbl
= {
241 Dispatch_QueryInterface
,
244 Dispatch_GetTypeInfoCount
,
245 Dispatch_GetTypeInfo
,
246 Dispatch_GetIDsOfNames
,
250 static IDispatch visible_named_item
= { &visible_named_item_vtbl
};
252 static const IDispatchVtbl visible_code_named_item_vtbl
= {
253 Dispatch_QueryInterface
,
255 visible_code_Release
,
256 Dispatch_GetTypeInfoCount
,
257 Dispatch_GetTypeInfo
,
258 Dispatch_GetIDsOfNames
,
262 static IDispatch visible_code_named_item
= { &visible_code_named_item_vtbl
};
264 static HRESULT WINAPI
ActiveScriptSite_QueryInterface(IActiveScriptSite
*iface
, REFIID riid
, void **ppv
)
268 if(IsEqualGUID(&IID_IUnknown
, riid
))
270 else if(IsEqualGUID(&IID_IActiveScriptSite
, riid
))
273 return E_NOINTERFACE
;
275 IUnknown_AddRef((IUnknown
*)*ppv
);
279 static ULONG WINAPI
ActiveScriptSite_AddRef(IActiveScriptSite
*iface
)
284 static ULONG WINAPI
ActiveScriptSite_Release(IActiveScriptSite
*iface
)
289 static HRESULT WINAPI
ActiveScriptSite_GetLCID(IActiveScriptSite
*iface
, LCID
*plcid
)
291 CHECK_EXPECT(GetLCID
);
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
;
305 if(!wcscmp(pstrName
, L
"globalCodeItem")) {
306 CHECK_EXPECT(GetItemInfo_global_code
);
307 IDispatch_AddRef(&dispatch_object
);
308 *ppiunkItem
= (IUnknown
*)&dispatch_object
;
311 if(!wcscmp(pstrName
, L
"visibleItem")) {
312 CHECK_EXPECT(GetItemInfo_visible
);
313 IDispatch_AddRef(&visible_named_item
);
314 *ppiunkItem
= (IUnknown
*)&visible_named_item
;
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
;
323 ok(0, "unexpected call %s\n", wine_dbgstr_w(pstrName
));
327 static HRESULT WINAPI
ActiveScriptSite_GetDocVersionString(IActiveScriptSite
*iface
, BSTR
*pbstrVersion
)
329 ok(0, "unexpected call\n");
333 static HRESULT WINAPI
ActiveScriptSite_OnScriptTerminate(IActiveScriptSite
*iface
,
334 const VARIANT
*pvarResult
, const EXCEPINFO
*pexcepinfo
)
336 ok(0, "unexpected call\n");
340 static HRESULT WINAPI
ActiveScriptSite_OnStateChange(IActiveScriptSite
*iface
, SCRIPTSTATE ssScriptState
)
342 switch(ssScriptState
) {
343 case SCRIPTSTATE_UNINITIALIZED
:
344 CHECK_EXPECT(OnStateChange_UNINITIALIZED
);
346 case SCRIPTSTATE_STARTED
:
347 CHECK_EXPECT(OnStateChange_STARTED
);
349 case SCRIPTSTATE_CONNECTED
:
350 CHECK_EXPECT(OnStateChange_CONNECTED
);
352 case SCRIPTSTATE_DISCONNECTED
:
353 CHECK_EXPECT(OnStateChange_DISCONNECTED
);
355 case SCRIPTSTATE_CLOSED
:
356 CHECK_EXPECT(OnStateChange_CLOSED
);
358 case SCRIPTSTATE_INITIALIZED
:
359 CHECK_EXPECT(OnStateChange_INITIALIZED
);
362 ok(0, "unexpected call %d\n", ssScriptState
);
368 static HRESULT WINAPI
ActiveScriptSite_OnScriptError(IActiveScriptSite
*iface
, IActiveScriptError
*pscripterror
)
370 CHECK_EXPECT(OnScriptError
);
374 static HRESULT WINAPI
ActiveScriptSite_OnEnterScript(IActiveScriptSite
*iface
)
376 CHECK_EXPECT(OnEnterScript
);
380 static HRESULT WINAPI
ActiveScriptSite_OnLeaveScript(IActiveScriptSite
*iface
)
382 CHECK_EXPECT(OnLeaveScript
);
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};
411 str
= SysAllocString(L
"ActiveXObject");
412 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseSensitive
, &id
);
414 ok(hres
== S_OK
, "GetDispID failed: %08x\n", hres
);
416 str
= SysAllocString(L
"Math");
417 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseSensitive
, &id
);
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");
428 str
= SysAllocString(L
"String");
429 hres
= IDispatchEx_GetDispID(dispex
, str
, fdexNameCaseSensitive
, &id
);
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");
441 static IDispatchEx
*get_script_dispatch(IActiveScript
*script
, const WCHAR
*item_name
)
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
);
457 static void parse_script(IActiveScriptParse
*parser
, const WCHAR
*src
)
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
)
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
);
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
)
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
;
507 hres
= IUnknown_QueryInterface(unk
, &IID_IObjectSafety
, (void**)&safety
);
508 ok(hres
== S_OK
, "Could not get IObjectSafety: %08x\n", hres
);
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
;
597 hres
= IActiveScript_QueryInterface(engine
, &IID_IActiveScriptProperty
,
598 (void**)&script_prop
);
599 ok(hres
== S_OK
, "Could not get IActiveScriptProperty: %08x\n", hres
);
603 hres
= IActiveScriptProperty_SetProperty(script_prop
, property
, NULL
, val
);
604 IActiveScriptProperty_Release(script_prop
);
608 static void test_invoke_versioning(IActiveScript
*script
)
614 hres
= set_script_prop(script
, SCRIPTPROP_INVOKEVERSIONING
, &v
);
615 if(hres
== E_NOTIMPL
) {
616 win_skip("SCRIPTPROP_INVOKESTRING not supported\n");
619 ok(hres
== E_INVALIDARG
, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres
);
623 hres
= set_script_prop(script
, SCRIPTPROP_INVOKEVERSIONING
, &v
);
624 ok(hres
== E_INVALIDARG
, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres
);
628 hres
= set_script_prop(script
, SCRIPTPROP_INVOKEVERSIONING
, &v
);
629 ok(hres
== E_INVALIDARG
, "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres
);
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)
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
);
649 static void test_jscript(void)
651 IActiveScriptParse
*parse
;
652 IActiveScript
*script
;
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
);
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
;
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
);
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
;
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
);
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
);
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;
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
;
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
);
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
,
908 NULL
, NULL
, NULL
, 0, 0, 0, NULL
, NULL
);
909 ok(hr
== S_OK
, "ParseScriptText failed: %08x\n", hr
);
911 hr
= IActiveScriptParse_ParseScriptText(parse
,
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
);
921 get_disp_id(dispex
, L
"x", DISP_E_UNKNOWNNAME
, &id
);
922 ok(id
== -1, "id = %d, expected -1\n", id
);
924 get_disp_id(dispex
, L
"y", DISP_E_UNKNOWNNAME
, &id
);
925 ok(id
== -1, "id = %d, expected -1\n", id
);
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
);
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
);
960 get_disp_id(dispex
, L
"x", DISP_E_UNKNOWNNAME
, &id
);
961 ok(id
== -1, "id = %d, expected -1\n", id
);
963 get_disp_id(dispex
, L
"y", S_OK
, &id
);
964 ok(id
!= -1, "id = -1\n");
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
);
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
);
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
);
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
);
1085 get_disp_id(dispex
, L
"y", DISP_E_UNKNOWNNAME
, &id
);
1086 ok(id
== -1, "id = %d, expected -1\n", id
);
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
[] =
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
[] =
1134 static const WCHAR
*context_code_test
[] =
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
;
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");
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
);
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
));
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
]);
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
]));
1327 hr
= IDispatchEx_GetDispID(dispex2
, bstr
, 0, &id
);
1329 ok(hr
== DISP_E_UNKNOWNNAME
, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(global_idents
[i
]), hr
);
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
]);
1339 hr
= IDispatchEx_GetDispID(dispex
, bstr
, 0, &id
);
1341 ok(hr
== DISP_E_UNKNOWNNAME
, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(context_idents
[i
]), hr
);
1343 ok(id
== -1, "[%s] id = %d, expected -1\n", wine_dbgstr_w(context_idents
[i
]), id
);
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
);
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
);
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
));
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
);
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
));
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
);
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
));
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
));
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
]);
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
]);
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
));
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
));
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
]);
1533 hr
= IDispatchEx_GetDispID(dispex
, bstr
, 0, &id
);
1535 ok(hr
== DISP_E_UNKNOWNNAME
, "GetDispID(%s) returned %08x\n", wine_dbgstr_w(global_idents
[i
]), hr
);
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
]);
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
)
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"
1651 " this.strret = function() { return \"ret\"; }\n"
1655 "var obj = new C();\n"
1657 "var funcvar = function(x, y) { return x * y; };\n"
1658 "var native_func = decodeURI;\n"
1661 " f1 = function infuncexpr(x) { return 1; }\n"
1662 " f2 = function infuncexpr(x) { return 2; }\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
;
1682 WCHAR str
[64], *names
= str
;
1683 BSTR bstr
, bstrs
[5];
1687 if (parse_func_name
)
1688 trace("Testing TypeInfo for function %s...\n", wine_dbgstr_w(parse_func_name
));
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
);
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
);
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
""
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
;
2076 hres
= CoCreateInstance(&CLSID_JScript
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
2077 &IID_IActiveScriptProperty
, (void**)&script_prop
);
2079 IActiveScriptProperty_Release(script_prop
);
2081 return hres
== S_OK
;
2088 if(check_jscript()) {
2089 trace("Testing JScript object...\n");
2092 test_jscript_uninitializing();
2094 test_code_persistence();
2096 test_typeinfo(NULL
);
2097 test_typeinfo(L
"some_func_name");
2099 trace("Testing JScriptEncode object...\n");
2100 engine_clsid
= &CLSID_JScriptEncode
;
2103 win_skip("Broken engine, probably too old\n");