ReactOS 0.4.15-dev-5666-gc548b97
run.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 Jacek Caban for CodeWeavers
3 *
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.
8 *
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.
13 *
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
17 */
18
19#include <stdio.h>
20
21#define COBJMACROS
22#define CONST_VTABLE
23
24#include <ole2.h>
25#include <dispex.h>
26#include <activscp.h>
27
28#include "wine/test.h"
29
30#ifdef _WIN64
31
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
38
39#else
40
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
47
48#endif
49
50static const CLSID CLSID_JScript =
51 {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
53 {0xf414c262,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
54
55#define DEFINE_EXPECT(func) \
56 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
57
58#define SET_EXPECT(func) \
59 expect_ ## func = TRUE
60
61#define CHECK_EXPECT2(func) \
62 do { \
63 ok(expect_ ##func, "unexpected call " #func "\n"); \
64 called_ ## func = TRUE; \
65 }while(0)
66
67#define CHECK_EXPECT(func) \
68 do { \
69 CHECK_EXPECT2(func); \
70 expect_ ## func = FALSE; \
71 }while(0)
72
73#define CHECK_CALLED(func) \
74 do { \
75 ok(called_ ## func, "expected " #func "\n"); \
76 expect_ ## func = called_ ## func = FALSE; \
77 }while(0)
78
79DEFINE_EXPECT(global_propget_d);
80DEFINE_EXPECT(global_propget_i);
81DEFINE_EXPECT(global_propput_d);
82DEFINE_EXPECT(global_propput_i);
83DEFINE_EXPECT(global_propputref_d);
84DEFINE_EXPECT(global_propputref_i);
85DEFINE_EXPECT(global_propdelete_d);
86DEFINE_EXPECT(global_nopropdelete_d);
87DEFINE_EXPECT(global_propdeleteerror_d);
88DEFINE_EXPECT(global_success_d);
89DEFINE_EXPECT(global_success_i);
90DEFINE_EXPECT(global_notexists_d);
91DEFINE_EXPECT(global_propargput_d);
92DEFINE_EXPECT(global_propargput_i);
93DEFINE_EXPECT(global_propargputop_d);
94DEFINE_EXPECT(global_propargputop_get_i);
95DEFINE_EXPECT(global_propargputop_put_i);
96DEFINE_EXPECT(global_testargtypes_i);
97DEFINE_EXPECT(global_calleval_i);
98DEFINE_EXPECT(puredisp_prop_d);
99DEFINE_EXPECT(puredisp_noprop_d);
100DEFINE_EXPECT(puredisp_value);
101DEFINE_EXPECT(dispexfunc_value);
102DEFINE_EXPECT(testobj_delete_test);
103DEFINE_EXPECT(testobj_delete_nodelete);
104DEFINE_EXPECT(testobj_value);
105DEFINE_EXPECT(testobj_construct);
106DEFINE_EXPECT(testobj_prop_d);
107DEFINE_EXPECT(testobj_withprop_d);
108DEFINE_EXPECT(testobj_withprop_i);
109DEFINE_EXPECT(testobj_noprop_d);
110DEFINE_EXPECT(testobj_onlydispid_d);
111DEFINE_EXPECT(testobj_onlydispid_i);
112DEFINE_EXPECT(testobj_notexists_d);
113DEFINE_EXPECT(testobj_newenum);
114DEFINE_EXPECT(enumvariant_next_0);
115DEFINE_EXPECT(enumvariant_next_1);
116DEFINE_EXPECT(enumvariant_reset);
117DEFINE_EXPECT(GetItemInfo_testVal);
119DEFINE_EXPECT(invoke_func);
120DEFINE_EXPECT(DeleteMemberByDispID);
121DEFINE_EXPECT(DeleteMemberByDispID_false);
122DEFINE_EXPECT(DeleteMemberByDispID_error);
123DEFINE_EXPECT(BindHandler);
124
125#define DISPID_GLOBAL_TESTPROPGET 0x1000
126#define DISPID_GLOBAL_TESTPROPPUT 0x1001
127#define DISPID_GLOBAL_REPORTSUCCESS 0x1002
128#define DISPID_GLOBAL_TRACE 0x1003
129#define DISPID_GLOBAL_OK 0x1004
130#define DISPID_GLOBAL_GETVT 0x1005
131#define DISPID_GLOBAL_TESTOBJ 0x1006
132#define DISPID_GLOBAL_GETNULLBSTR 0x1007
133#define DISPID_GLOBAL_NULL_DISP 0x1008
134#define DISPID_GLOBAL_TESTTHIS 0x1009
135#define DISPID_GLOBAL_TESTTHIS2 0x100a
136#define DISPID_GLOBAL_INVOKEVERSION 0x100b
137#define DISPID_GLOBAL_CREATEARRAY 0x100c
138#define DISPID_GLOBAL_PROPGETFUNC 0x100d
139#define DISPID_GLOBAL_OBJECT_FLAG 0x100e
140#define DISPID_GLOBAL_ISWIN64 0x100f
141#define DISPID_GLOBAL_PUREDISP 0x1010
142#define DISPID_GLOBAL_ISNULLBSTR 0x1011
143#define DISPID_GLOBAL_PROPARGPUT 0x1012
144#define DISPID_GLOBAL_SHORTPROP 0x1013
145#define DISPID_GLOBAL_GETSHORT 0x1014
146#define DISPID_GLOBAL_TESTARGTYPES 0x1015
147#define DISPID_GLOBAL_INTPROP 0x1016
148#define DISPID_GLOBAL_DISPUNK 0x1017
149#define DISPID_GLOBAL_TESTRES 0x1018
150#define DISPID_GLOBAL_TESTNORES 0x1019
151#define DISPID_GLOBAL_DISPEXFUNC 0x101a
152#define DISPID_GLOBAL_TESTPROPPUTREF 0x101b
153#define DISPID_GLOBAL_GETSCRIPTSTATE 0x101c
154#define DISPID_GLOBAL_BINDEVENTHANDLER 0x101d
155#define DISPID_GLOBAL_TESTENUMOBJ 0x101e
156#define DISPID_GLOBAL_CALLEVAL 0x101f
157#define DISPID_GLOBAL_PROPARGPUTOP 0x1020
158
159#define DISPID_GLOBAL_TESTPROPDELETE 0x2000
160#define DISPID_GLOBAL_TESTNOPROPDELETE 0x2001
161#define DISPID_GLOBAL_TESTPROPDELETEERROR 0x2002
162
163#define DISPID_TESTOBJ_PROP 0x2000
164#define DISPID_TESTOBJ_ONLYDISPID 0x2001
165#define DISPID_TESTOBJ_WITHPROP 0x2002
166
167#define JS_E_OUT_OF_MEMORY 0x800a03ec
168#define JS_E_INVALID_CHAR 0x800a03f6
169
170static const WCHAR testW[] = {'t','e','s','t',0};
171static const CHAR testA[] = "test";
172static const WCHAR test_valW[] = {'t','e','s','t','V','a','l',0};
173static const CHAR test_valA[] = "testVal";
174static const WCHAR emptyW[] = {0};
175
177static const char *test_name = "(null)";
179static int invoke_version;
183
184/* Returns true if the user interface is in English. Note that this does not
185 * presume of the formatting of dates, numbers, etc.
186 */
188{
189 static HMODULE hkernel32 = NULL;
190 static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
191 static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
192
193 if (!hkernel32)
194 {
195 hkernel32 = GetModuleHandleA("kernel32.dll");
196 pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
197 pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
198 }
199 if (pGetThreadUILanguage)
200 return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
201 if (pGetUserDefaultUILanguage)
202 return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
203
205}
206
207static BSTR a2bstr(const char *str)
208{
209 BSTR ret;
210 int len;
211
212 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
215
216 return ret;
217}
218
219static int strcmp_wa(LPCWSTR strw, const char *stra)
220{
221 CHAR buf[512];
222 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
223 return lstrcmpA(buf, stra);
224}
225
226#define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
227static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
228{
229 expect |= invoke_version << 28;
230 ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
231}
232
234{
235 *ppv = NULL;
236
237 if (IsEqualGUID(riid, &IID_IEnumVARIANT))
238 *ppv = iface;
239 else
240 return E_NOINTERFACE;
241
242 return S_OK;
243}
244
246{
247 return 2;
248}
249
251{
252 return 1;
253}
254
255static int EnumVARIANT_index = 0;
259 ULONG celt,
260 VARIANT *rgVar,
261 ULONG *pCeltFetched)
262{
263 ok(rgVar != NULL, "rgVar is NULL\n");
264 ok(celt == 1, "celt = %d\n", celt);
265 ok(pCeltFetched == NULL, "pCeltFetched is not NULL\n");
266
267 if (!rgVar)
268 return S_FALSE;
269
270 if (EnumVARIANT_index == 0)
271 {
274 CHECK_EXPECT(enumvariant_next_0);
275
276 V_VT(rgVar) = VT_I4;
277 V_I4(rgVar) = 123;
278
279 if (pCeltFetched)
280 *pCeltFetched = 1;
282 return S_OK;
283 }
284
285 CHECK_EXPECT(enumvariant_next_1);
286
287 if (pCeltFetched)
288 *pCeltFetched = 0;
289 return S_FALSE;
290
291}
292
295 ULONG celt)
296{
297 ok(0, "EnumVariant_Skip: unexpected call\n");
298 return E_NOTIMPL;
299}
302{
303 CHECK_EXPECT(enumvariant_reset);
305 return S_OK;
306}
307
310 IEnumVARIANT **ppEnum)
311{
312 ok(0, "EnumVariant_Clone: unexpected call\n");
313 return E_NOTIMPL;
314}
315
316static IEnumVARIANTVtbl testEnumVARIANTVtbl = {
324};
325
327
329{
330 *ppv = NULL;
331
334 || IsEqualGUID(riid, &IID_IDispatchEx))
335 *ppv = iface;
336 else
337 return E_NOINTERFACE;
338
339 return S_OK;
340}
341
343{
344 return 2;
345}
346
348{
349 return 1;
350}
351
353{
354 ok(0, "unexpected call\n");
355 return E_NOTIMPL;
356}
357
359 LCID lcid, ITypeInfo **ppTInfo)
360{
361 return E_NOTIMPL;
362}
363
365 LPOLESTR *rgszNames, UINT cNames,
366 LCID lcid, DISPID *rgDispId)
367{
368 ok(0, "unexpected call\n");
369 return E_NOTIMPL;
370}
371
373 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
374 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
375{
376 ok(0, "unexpected call\n");
377 return E_NOTIMPL;
378}
379
381{
382 ok(0, "unexpected call\n");
383 return E_NOTIMPL;
384}
385
386static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
387 VARIANT *res, EXCEPINFO *pei, IServiceProvider *pspCaller)
388{
389 ok(0, "unexpected call\n");
390 return E_NOTIMPL;
391}
392
394{
395 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
396 return E_NOTIMPL;
397}
398
400{
401 ok(0, "unexpected call\n");
402 return E_NOTIMPL;
403}
404
406{
407 ok(0, "unexpected call\n");
408 return E_NOTIMPL;
409}
410
412{
413 ok(0, "unexpected call\n");
414 return E_NOTIMPL;
415}
416
418{
419 ok(0, "unexpected call\n");
420 return E_NOTIMPL;
421}
422
424{
425 ok(0, "unexpected call\n");
426 return E_NOTIMPL;
427}
428
430 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
431 VARIANT *pvarRes, EXCEPINFO *pei, UINT *puArgErr)
432{
433 switch(id) {
434 case DISPID_NEWENUM:
435 ok(pdp != NULL, "pdp == NULL\n");
436 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
437 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
438 ok(pvarRes != NULL, "pvarRes == NULL\n");
439 ok(pei == NULL, "pei != NULL\n");
440
441 CHECK_EXPECT(testobj_newenum);
442 V_VT(pvarRes) = VT_DISPATCH;
444 return S_OK;
445 }
446
447 ok(0, "unexpected call %x\n", id);
449}
450
451static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
452{
453 if(!strcmp_wa(bstrName, "prop")) {
454 CHECK_EXPECT(testobj_prop_d);
455 test_grfdex(grfdex, fdexNameCaseSensitive);
457 return S_OK;
458 }
459 if(!strcmp_wa(bstrName, "withProp")) {
460 CHECK_EXPECT(testobj_withprop_d);
461 test_grfdex(grfdex, fdexNameCaseSensitive|fdexNameImplicit);
463 return S_OK;
464 }
465 if(!strcmp_wa(bstrName, "noprop")) {
466 CHECK_EXPECT(testobj_noprop_d);
467 test_grfdex(grfdex, fdexNameCaseSensitive);
468 return DISP_E_UNKNOWNNAME;
469 }
470 if(!strcmp_wa(bstrName, "onlyDispID")) {
472 CHECK_EXPECT(testobj_onlydispid_d);
473 test_grfdex(grfdex, fdexNameCaseSensitive);
475 return S_OK;
476 }
477 if(!strcmp_wa(bstrName, "notExists")) {
478 CHECK_EXPECT(testobj_notexists_d);
479 test_grfdex(grfdex, fdexNameCaseSensitive);
480 return DISP_E_UNKNOWNNAME;
481 }
482
483 ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName));
484 return E_NOTIMPL;
485}
486
487static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
488 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
489{
490 ok(pspCaller != NULL, "pspCaller = NULL\n");
491
492 switch(id) {
493 case DISPID_VALUE:
494 ok(pdp != NULL, "pdp == NULL\n");
495 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
496 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
497 ok(pvarRes != NULL, "pvarRes == NULL\n");
498 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
499 ok(pei != NULL, "pei == NULL\n");
500
501 switch(wFlags) {
502 case INVOKE_PROPERTYGET:
503 CHECK_EXPECT(testobj_value);
504 ok(!pdp->rgvarg, "rgvarg != NULL\n");
505 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
506 break;
507 case INVOKE_FUNC:
508 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
509 break;
510 case INVOKE_FUNC|INVOKE_PROPERTYGET:
511 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
512 break;
513 case DISPATCH_CONSTRUCT:
514 CHECK_EXPECT(testobj_construct);
515 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
516 break;
517 default:
518 ok(0, "invalid flag (%x)\n", wFlags);
519 }
520
521 V_VT(pvarRes) = VT_I4;
522 V_I4(pvarRes) = 1;
523 return S_OK;
526 CHECK_EXPECT(testobj_onlydispid_i);
527 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
528 ok(pdp != NULL, "pdp == NULL\n");
529 ok(!pdp->rgvarg, "rgvarg != NULL\n");
530 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
531 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
532 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
533 ok(pvarRes != NULL, "pvarRes == NULL\n");
534 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
535 ok(pei != NULL, "pei == NULL\n");
538 CHECK_EXPECT(testobj_withprop_i);
539
540 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
541 ok(pdp != NULL, "pdp == NULL\n");
542 ok(!pdp->rgvarg, "rgvarg != NULL\n");
543 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
544 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
545 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
546 ok(pvarRes != NULL, "pvarRes == NULL\n");
547 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
548 ok(pei != NULL, "pei == NULL\n");
549
550 V_VT(pvarRes) = VT_I4;
551 V_I4(pvarRes) = 1;
552
553 return S_OK;
554 }
555
556 ok(0, "unexpected call %x\n", id);
558}
559
561{
562 if(!strcmp_wa(bstrName, "deleteTest")) {
563 CHECK_EXPECT(testobj_delete_test);
564 test_grfdex(grfdex, fdexNameCaseSensitive);
565 return S_OK;
566 }
567 if(!strcmp_wa(bstrName, "noDeleteTest")) {
568 CHECK_EXPECT(testobj_delete_nodelete);
569 test_grfdex(grfdex, fdexNameCaseSensitive);
570 return S_FALSE;
571 }
572
573 ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName));
574 return E_FAIL;
575}
576
577static IDispatchExVtbl testObjVtbl = {
593};
594
596
597static HRESULT WINAPI dispexFunc_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
598 VARIANT *res, EXCEPINFO *pei, IServiceProvider *pspCaller)
599{
600 ok(pspCaller != NULL, "pspCaller = NULL\n");
601
602 switch(id) {
603 case DISPID_VALUE:
604 CHECK_EXPECT(dispexfunc_value);
605
606 ok(pdp != NULL, "pdp == NULL\n");
607 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
608 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs != NULL\n");
609 ok(*pdp->rgdispidNamedArgs == DISPID_THIS, "*rgdispidNamedArgs = %d\n", *pdp->rgdispidNamedArgs);
610 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
611 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
612 ok(res != NULL, "res == NULL\n");
613 ok(pei != NULL, "pei == NULL\n");
614
615 ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
616
617 if(V_BOOL(pdp->rgvarg+1))
618 /* NOTE: If called by Function.apply(), native doesn't set DISPATCH_PROPERTYGET flag. */
619 todo_wine ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
620 else
621 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
622
623 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
624 ok(V_DISPATCH(pdp->rgvarg) != NULL, "V_DISPATCH(pdp->rgvarg) == NULL\n");
625
626 if(res)
627 V_VT(res) = VT_NULL;
628 return S_OK;
629 default:
630 ok(0, "unexpected call %x\n", id);
632 }
633}
634
635static IDispatchExVtbl dispexFuncVtbl = {
651};
652
654
656{
658 *ppv = iface;
659 return S_OK;
660 }
661
662 *ppv = NULL;
663 return E_NOINTERFACE;
664}
665
667 LPOLESTR *rgszNames, UINT cNames,
668 LCID lcid, DISPID *rgDispId)
669{
670 ok(IsEqualGUID(riid, &IID_NULL), "Expected IID_NULL\n");
671 ok(cNames==1, "cNames = %d\n", cNames);
672
673 if(!strcmp_wa(*rgszNames, "prop")) {
674 CHECK_EXPECT(puredisp_prop_d);
675 *rgDispId = DISPID_TESTOBJ_PROP;
676 return S_OK;
677 } else if(!strcmp_wa(*rgszNames, "noprop")) {
678 CHECK_EXPECT(puredisp_noprop_d);
679 return DISP_E_UNKNOWNNAME;
680 }
681
682 ok(0, "unexpected call\n");
683 return E_NOTIMPL;
684}
685
686static HRESULT WINAPI pureDisp_Invoke(IDispatchEx *iface, DISPID dispIdMember, REFIID riid, LCID lcid,
687 WORD wFlags, DISPPARAMS *pdp, VARIANT *res, EXCEPINFO *ei, UINT *puArgErr)
688{
689 ok(IsEqualGUID(&IID_NULL, riid), "unexpected riid\n");
690
691 switch(dispIdMember) {
692 case DISPID_VALUE:
693 CHECK_EXPECT(puredisp_value);
694
695 ok(pdp != NULL, "pdp == NULL\n");
696 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
697 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
698 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
699 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
700 ok(res != NULL, "res == NULL\n");
701 ok(ei != NULL, "ei == NULL\n");
702 ok(puArgErr != NULL, "puArgErr == NULL\n");
703
704 ok(V_VT(pdp->rgvarg) == VT_BOOL, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
705
706 if(V_BOOL(pdp->rgvarg))
707 todo_wine ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
708 else
709 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
710
711 if(res)
712 V_VT(res) = VT_NULL;
713 return S_OK;
714 default:
715 ok(0, "unexpected call\n");
716 return E_NOTIMPL;
717 }
718}
719
720static IDispatchExVtbl pureDispVtbl = {
728};
729
731
733{
734 ok(0, "unexpected call\n");
735 return E_NOINTERFACE;
736}
737
739{
740 return 2;
741}
742
744{
745 return 1;
746}
747
749{
750 CHECK_EXPECT(BindHandler);
751 ok(!strcmp_wa(event, "eventName"), "event = %s\n", wine_dbgstr_w(event));
752 ok(disp != NULL, "disp = NULL\n");
753 return S_OK;
754}
755
756static const IBindEventHandlerVtbl BindEventHandlerVtbl = {
761};
762
764
766{
767 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch) || IsEqualGUID(riid, &IID_IDispatchEx)) {
768 *ppv = iface;
769 return S_OK;
770 }
771
772 if(IsEqualGUID(riid, &IID_IBindEventHandler)) {
774 return S_OK;
775 }
776
777 *ppv = NULL;
778 return E_NOINTERFACE;
779}
780
781static IDispatchExVtbl bindEventHandlerDispVtbl = {
797};
798
800
801static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
802{
803 if(!strcmp_wa(bstrName, "ok")) {
804 test_grfdex(grfdex, fdexNameCaseSensitive);
806 return S_OK;
807 }
808 if(!strcmp_wa(bstrName, "trace")) {
809 test_grfdex(grfdex, fdexNameCaseSensitive);
811 return S_OK;
812 }
813 if(!strcmp_wa(bstrName, "reportSuccess")) {
814 CHECK_EXPECT(global_success_d);
815 test_grfdex(grfdex, fdexNameCaseSensitive);
817 return S_OK;
818 }
819 if(!strcmp_wa(bstrName, "testPropGet")) {
820 CHECK_EXPECT(global_propget_d);
821 test_grfdex(grfdex, fdexNameCaseSensitive);
823 return S_OK;
824 }
825 if(!strcmp_wa(bstrName, "testPropPut")) {
826 CHECK_EXPECT(global_propput_d);
827 test_grfdex(grfdex, fdexNameCaseSensitive);
829 return S_OK;
830 }
831 if(!strcmp_wa(bstrName, "testPropPutRef")) {
832 CHECK_EXPECT(global_propputref_d);
833 test_grfdex(grfdex, fdexNameCaseSensitive);
835 return S_OK;
836 }
837 if(!strcmp_wa(bstrName, "testPropDelete")) {
838 CHECK_EXPECT(global_propdelete_d);
839 test_grfdex(grfdex, fdexNameCaseSensitive);
841 return S_OK;
842 }
843 if(!strcmp_wa(bstrName, "testNoPropDelete")) {
844 CHECK_EXPECT(global_nopropdelete_d);
845 test_grfdex(grfdex, fdexNameCaseSensitive);
847 return S_OK;
848 }
849 if(!strcmp_wa(bstrName, "testPropDeleteError")) {
850 CHECK_EXPECT(global_propdeleteerror_d);
851 test_grfdex(grfdex, fdexNameCaseSensitive);
853 return S_OK;
854 }
855 if(!strcmp_wa(bstrName, "getVT")) {
856 test_grfdex(grfdex, fdexNameCaseSensitive);
858 return S_OK;
859 }
860 if(!strcmp_wa(bstrName, "testObj")) {
861 test_grfdex(grfdex, fdexNameCaseSensitive);
863 return S_OK;
864 }
865 if(!strcmp_wa(bstrName, "getNullBSTR")) {
867 return S_OK;
868 }
869 if(!strcmp_wa(bstrName, "isNullBSTR")) {
871 return S_OK;
872 }
873 if(!strcmp_wa(bstrName, "nullDisp")) {
875 return S_OK;
876 }
877 if(!strcmp_wa(bstrName, "notExists")) {
878 CHECK_EXPECT(global_notexists_d);
879 test_grfdex(grfdex, fdexNameCaseSensitive);
880 return DISP_E_UNKNOWNNAME;
881 }
882
883 if(!strcmp_wa(bstrName, "testThis")) {
884 test_grfdex(grfdex, fdexNameCaseSensitive);
886 return S_OK;
887 }
888
889 if(!strcmp_wa(bstrName, "testThis2")) {
890 test_grfdex(grfdex, fdexNameCaseSensitive);
892 return S_OK;
893 }
894
895 if(!strcmp_wa(bstrName, "invokeVersion")) {
896 test_grfdex(grfdex, fdexNameCaseSensitive);
898 return S_OK;
899 }
900 if(!strcmp_wa(bstrName, "createArray")) {
901 test_grfdex(grfdex, fdexNameCaseSensitive);
903 return S_OK;
904 }
905 if(!strcmp_wa(bstrName, "propGetFunc")) {
906 test_grfdex(grfdex, fdexNameCaseSensitive);
908 return S_OK;
909 }
910 if(!strcmp_wa(bstrName, "objectFlag")) {
911 test_grfdex(grfdex, fdexNameCaseSensitive);
913 return S_OK;
914 }
915
916 if(!strcmp_wa(bstrName, "isWin64")) {
917 test_grfdex(grfdex, fdexNameCaseSensitive);
919 return S_OK;
920 }
921
922 if(!strcmp_wa(bstrName, "pureDisp")) {
923 test_grfdex(grfdex, fdexNameCaseSensitive);
925 return S_OK;
926 }
927
928 if(!strcmp_wa(bstrName, "propArgPutG")) {
929 CHECK_EXPECT(global_propargput_d);
930 test_grfdex(grfdex, fdexNameCaseSensitive);
932 return S_OK;
933 }
934
935 if(!strcmp_wa(bstrName, "propArgPutOp")) {
936 CHECK_EXPECT(global_propargputop_d);
937 test_grfdex(grfdex, fdexNameCaseSensitive);
939 return S_OK;
940 }
941
942 if(!strcmp_wa(bstrName, "propArgPutO")) {
943 CHECK_EXPECT(global_propargput_d);
944 test_grfdex(grfdex, fdexNameEnsure|fdexNameCaseSensitive);
946 return S_OK;
947 }
948
949 if(!strcmp_wa(bstrName, "shortProp")) {
951 return S_OK;
952 }
953
954 if(!strcmp_wa(bstrName, "getShort")) {
956 return S_OK;
957 }
958
959 if(!strcmp_wa(bstrName, "testArgTypes")) {
961 return S_OK;
962 }
963
964 if(!strcmp_wa(bstrName, "intProp")) {
966 return S_OK;
967 }
968
969 if(!strcmp_wa(bstrName, "dispUnk")) {
971 return S_OK;
972 }
973
974 if(!strcmp_wa(bstrName, "testRes")) {
976 return S_OK;
977 }
978
979 if(!strcmp_wa(bstrName, "testNoRes")) {
981 return S_OK;
982 }
983
984 if(!strcmp_wa(bstrName, "dispexFunc")) {
986 return S_OK;
987 }
988
989 if(!strcmp_wa(bstrName, "getScriptState")) {
991 return S_OK;
992 }
993
994 if(!strcmp_wa(bstrName, "bindEventHandler")) {
996 return S_OK;
997 }
998
999 if(!strcmp_wa(bstrName, "testEnumObj")) {
1001 return S_OK;
1002 }
1003
1004 if(!strcmp_wa(bstrName, "callEval")) {
1006 return S_OK;
1007 }
1008
1009 if(strict_dispid_check && strcmp_wa(bstrName, "t"))
1010 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
1011 return DISP_E_UNKNOWNNAME;
1012}
1013
1014static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1015 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1016{
1017 ok(pspCaller != NULL, "pspCaller = NULL\n");
1018
1019 switch(id) {
1020 case DISPID_GLOBAL_OK:
1021 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1022 ok(pdp != NULL, "pdp == NULL\n");
1023 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1024 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1025 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1026 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1027 if(wFlags & INVOKE_PROPERTYGET)
1028 ok(pvarRes != NULL, "pvarRes == NULL\n");
1029 else
1030 ok(!pvarRes, "pvarRes != NULL\n");
1031 ok(pei != NULL, "pei == NULL\n");
1032
1033 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1034 ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1035 ok(V_BOOL(pdp->rgvarg+1), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
1036
1037 return S_OK;
1038
1040 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1041 ok(pdp != NULL, "pdp == NULL\n");
1042 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1043 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1044 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1045 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1046 ok(!pvarRes, "pvarRes != NULL\n");
1047 ok(pei != NULL, "pei == NULL\n");
1048
1049 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1050 if(V_VT(pdp->rgvarg) == VT_BSTR)
1051 trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
1052
1053 return S_OK;
1054
1056 CHECK_EXPECT(global_success_i);
1057
1058 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1059 ok(pdp != NULL, "pdp == NULL\n");
1060 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1061 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
1062 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1063 if(!testing_expr)
1064 ok(!pvarRes, "pvarRes != NULL\n");
1065 ok(pei != NULL, "pei == NULL\n");
1066
1067 return S_OK;
1068
1070 CHECK_EXPECT(global_propget_i);
1071
1072 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1073 ok(pdp != NULL, "pdp == NULL\n");
1074 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1075 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1076 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1077 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1078 ok(pvarRes != NULL, "pvarRes == NULL\n");
1079 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1080 ok(pei != NULL, "pei == NULL\n");
1081
1082 V_VT(pvarRes) = VT_I4;
1083 V_I4(pvarRes) = 1;
1084
1085 return S_OK;
1086
1088 CHECK_EXPECT(global_propput_i);
1089
1090 ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags);
1091 ok(pdp != NULL, "pdp == NULL\n");
1092 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1093 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1094 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1095 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1096 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1097 ok(!pvarRes, "pvarRes != NULL\n");
1098
1099 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg));
1100 ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg)=%d\n", V_I4(pdp->rgvarg));
1101 return S_OK;
1102
1104 CHECK_EXPECT(global_propputref_i);
1105
1106 ok(wFlags == (INVOKE_PROPERTYPUT|INVOKE_PROPERTYPUTREF), "wFlags = %x\n", wFlags);
1107 ok(pdp != NULL, "pdp == NULL\n");
1108 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1109 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1110 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1111 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1112 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1113 ok(!pvarRes, "pvarRes != NULL\n");
1114
1115 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg));
1116 return S_OK;
1117
1119 ok(pdp != NULL, "pdp == NULL\n");
1120 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1121 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1122 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1123 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1124 ok(pvarRes != NULL, "pvarRes == NULL\n");
1125 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1126 ok(pei != NULL, "pei == NULL\n");
1127
1128 V_VT(pvarRes) = VT_BSTR;
1129 switch(V_VT(pdp->rgvarg)) {
1130 case VT_EMPTY:
1131 V_BSTR(pvarRes) = a2bstr("VT_EMPTY");
1132 break;
1133 case VT_NULL:
1134 V_BSTR(pvarRes) = a2bstr("VT_NULL");
1135 break;
1136 case VT_I4:
1137 V_BSTR(pvarRes) = a2bstr("VT_I4");
1138 break;
1139 case VT_R8:
1140 V_BSTR(pvarRes) = a2bstr("VT_R8");
1141 break;
1142 case VT_BSTR:
1143 V_BSTR(pvarRes) = a2bstr("VT_BSTR");
1144 break;
1145 case VT_DISPATCH:
1146 V_BSTR(pvarRes) = a2bstr("VT_DISPATCH");
1147 break;
1148 case VT_BOOL:
1149 V_BSTR(pvarRes) = a2bstr("VT_BOOL");
1150 break;
1151 case VT_ARRAY|VT_VARIANT:
1152 V_BSTR(pvarRes) = a2bstr("VT_ARRAY|VT_VARIANT");
1153 break;
1154 default:
1155 ok(0, "unknown vt %d\n", V_VT(pdp->rgvarg));
1156 return E_FAIL;
1157 }
1158
1159 return S_OK;
1160
1162 ok(pvarRes != NULL, "pvarRes = NULL\n");
1163 if(pvarRes) {
1164 V_VT(pvarRes) = VT_BOOL;
1165 V_BOOL(pvarRes) = VARIANT_TRUE;
1166 }
1167 return S_OK;
1168
1170 ok(!pvarRes, "pvarRes != NULL\n");
1171 if(pvarRes)
1172 V_VT(pvarRes) = VT_NULL;
1173 return S_OK;
1174
1176 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1177 ok(pdp != NULL, "pdp == NULL\n");
1178 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1179 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1180 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1181 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1182 ok(pvarRes != NULL, "pvarRes == NULL\n");
1183 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1184 ok(pei != NULL, "pei == NULL\n");
1185
1186 V_VT(pvarRes) = VT_DISPATCH;
1187 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
1188 return S_OK;
1189
1191 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1192 ok(pdp != NULL, "pdp == NULL\n");
1193 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1194 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1195 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1196 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1197 ok(pvarRes != NULL, "pvarRes == NULL\n");
1198 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1199 ok(pei != NULL, "pei == NULL\n");
1200
1201 V_VT(pvarRes) = VT_DISPATCH;
1202 V_DISPATCH(pvarRes) = (IDispatch*)&pureDisp;
1203 return S_OK;
1204
1206 V_VT(pvarRes) = VT_DISPATCH;
1207 V_DISPATCH(pvarRes) = (IDispatch*)&dispexFunc;
1208 return S_OK;
1209
1211 if(pvarRes) {
1212 V_VT(pvarRes) = VT_BSTR;
1213 V_BSTR(pvarRes) = NULL;
1214 }
1215 return S_OK;
1216
1218 ok(pdp != NULL, "pdp == NULL\n");
1219 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1220 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1221 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1222 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1223 ok(pvarRes != NULL, "pvarRes == NULL\n");
1224 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1225 ok(pei != NULL, "pei == NULL\n");
1226 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1227
1228 V_VT(pvarRes) = VT_BOOL;
1229 V_BOOL(pvarRes) = V_BSTR(pdp->rgvarg) ? VARIANT_FALSE : VARIANT_TRUE;
1230 return S_OK;
1231
1233 if(pvarRes) {
1234 V_VT(pvarRes) = VT_BOOL;
1235 V_BOOL(pvarRes) = sizeof(void*) == 8 ? VARIANT_TRUE : VARIANT_FALSE;
1236 }
1237 return S_OK;
1238
1240 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1241 ok(pdp != NULL, "pdp == NULL\n");
1242 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1243 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1244 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1245 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1246 ok(pvarRes != NULL, "pvarRes == NULL\n");
1247 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1248 ok(pei != NULL, "pei == NULL\n");
1249
1250 V_VT(pvarRes) = VT_DISPATCH;
1251 V_DISPATCH(pvarRes) = NULL;
1252 return S_OK;
1253
1255 ok(pdp != NULL, "pdp == NULL\n");
1256 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1257 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1258 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1259 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1260 ok(pvarRes == NULL, "pvarRes != NULL\n");
1261 ok(pei != NULL, "pei == NULL\n");
1262
1263 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1264 ok(V_DISPATCH(pdp->rgvarg) == (IDispatch*)iface, "disp != iface\n");
1265
1266 return S_OK;
1267
1269 ok(pdp != NULL, "pdp == NULL\n");
1270 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1271 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1272 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1273 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1274 ok(pvarRes == NULL, "pvarRes != NULL\n");
1275 ok(pei != NULL, "pei == NULL\n");
1276
1277 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
1278 ok(V_DISPATCH(pdp->rgvarg) != (IDispatch*)iface, "disp == iface\n");
1279 ok(V_DISPATCH(pdp->rgvarg) == script_disp, "disp != script_disp\n");
1280
1281 return S_OK;
1282
1284 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1285 ok(pdp != NULL, "pdp == NULL\n");
1286 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1287 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1288 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1289 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1290 ok(pvarRes != NULL, "pvarRes == NULL\n");
1291 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1292 ok(pei != NULL, "pei == NULL\n");
1293
1294 V_VT(pvarRes) = VT_I4;
1295 V_I4(pvarRes) = invoke_version;
1296
1297 return S_OK;
1298
1300 SAFEARRAYBOUND bound[2];
1301 VARIANT *data;
1302 int i,j;
1303
1304 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1305 ok(pdp != NULL, "pdp == NULL\n");
1306 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1307 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1308 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1309 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1310 ok(pvarRes != NULL, "pvarRes == NULL\n");
1311 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1312 ok(pei != NULL, "pei == NULL\n");
1313
1314 bound[0].lLbound = 0;
1315 bound[0].cElements = 5;
1316 bound[1].lLbound = 2;
1317 bound[1].cElements = 2;
1318
1319 V_VT(pvarRes) = VT_ARRAY|VT_VARIANT;
1320 V_ARRAY(pvarRes) = SafeArrayCreate(VT_VARIANT, 2, bound);
1321
1322 SafeArrayAccessData(V_ARRAY(pvarRes), (void**)&data);
1323 for(i=0; i<5; i++) {
1324 for(j=2; j<4; j++) {
1325 V_VT(data) = VT_I4;
1326 V_I4(data) = i*10+j;
1327 data++;
1328 }
1329 }
1331
1332 return S_OK;
1333 }
1334
1336 switch(wFlags) {
1337 case INVOKE_FUNC:
1338 CHECK_EXPECT(invoke_func);
1339 break;
1340 case INVOKE_FUNC|INVOKE_PROPERTYGET:
1341 ok(pdp->cArgs != 0, "pdp->cArgs = %d\n", pdp->cArgs);
1342 ok(pvarRes != NULL, "pdp->pvarRes == NULL\n");
1343 break;
1344 default:
1345 ok(0, "invalid flag (%x)\n", wFlags);
1346 }
1347
1348 ok(pdp != NULL, "pdp == NULL\n");
1349 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1350 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1351 ok(pei != NULL, "pei == NULL\n");
1352
1353 if(pvarRes) {
1354 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1355 V_VT(pvarRes) = VT_I4;
1356 V_I4(pvarRes) = pdp->cArgs;
1357 }
1358
1359 return S_OK;
1360
1363 HRESULT hres;
1364
1365 hres = IActiveScript_GetScriptState(script_engine, &state);
1366 ok(hres == S_OK, "GetScriptState failed: %08x\n", hres);
1367
1368 V_VT(pvarRes) = VT_I4;
1369 V_I4(pvarRes) = state;
1370 return S_OK;
1371 }
1372
1374 V_VT(pvarRes) = VT_DISPATCH;
1376 return S_OK;
1377
1379 CHECK_EXPECT(global_propargput_i);
1380 ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags);
1381 ok(pdp != NULL, "pdp == NULL\n");
1382 ok(pdp->rgvarg != NULL, "rgvarg != NULL\n");
1383 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1384 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1385 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1386 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1387 ok(!pvarRes, "pvarRes != NULL\n");
1388 ok(pei != NULL, "pei == NULL\n");
1389
1390 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1391 ok(V_I4(pdp->rgvarg) == 2, "V_I4(pdp->rgvarg) = %d\n", V_I4(pdp->rgvarg));
1392
1393 ok(V_VT(pdp->rgvarg+1) == VT_I4, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1394 ok(V_I4(pdp->rgvarg+1) == 1, "V_I4(pdp->rgvarg+1) = %d\n", V_I4(pdp->rgvarg+1));
1395
1396 ok(V_VT(pdp->rgvarg+2) == VT_I4, "V_VT(pdp->rgvarg+2) = %d\n", V_VT(pdp->rgvarg+2));
1397 ok(V_I4(pdp->rgvarg+2) == 0, "V_I4(pdp->rgvarg+2) = %d\n", V_I4(pdp->rgvarg+2));
1398 return S_OK;
1399
1401 ok(pdp != NULL, "pdp == NULL\n");
1402 ok(pdp->rgvarg != NULL, "rgvarg != NULL\n");
1403 ok(pei != NULL, "pei == NULL\n");
1404
1405 switch(wFlags) {
1406 case INVOKE_PROPERTYGET | INVOKE_FUNC:
1407 CHECK_EXPECT(global_propargputop_get_i);
1408
1409 ok(pdp->cNamedArgs == 0, "cNamedArgs = %d\n", pdp->cNamedArgs);
1410 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1411 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1412 ok(pdp->cNamedArgs == 0, "cNamedArgs = %d\n", pdp->cNamedArgs);
1413 ok(pvarRes != NULL, "pvarRes = NULL\n");
1414
1415 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1416 ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg) = %d\n", V_I4(pdp->rgvarg));
1417
1418 ok(V_VT(pdp->rgvarg+1) == VT_I4, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1419 ok(V_I4(pdp->rgvarg+1) == 0, "V_I4(pdp->rgvarg+1) = %d\n", V_I4(pdp->rgvarg+1));
1420
1421 V_VT(pvarRes) = VT_I4;
1422 V_I4(pvarRes) = 6;
1423 break;
1424 case INVOKE_PROPERTYPUT:
1425 CHECK_EXPECT(global_propargputop_put_i);
1426
1427 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1428 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1429 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1430 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1431 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1432 ok(!pvarRes, "pvarRes != NULL\n");
1433
1434 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1435 ok(V_I4(pdp->rgvarg) == 8, "V_I4(pdp->rgvarg) = %d\n", V_I4(pdp->rgvarg));
1436
1437 ok(V_VT(pdp->rgvarg+1) == VT_I4, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1438 ok(V_I4(pdp->rgvarg+1) == 1, "V_I4(pdp->rgvarg+1) = %d\n", V_I4(pdp->rgvarg+1));
1439
1440 ok(V_VT(pdp->rgvarg+2) == VT_I4, "V_VT(pdp->rgvarg+2) = %d\n", V_VT(pdp->rgvarg+2));
1441 ok(V_I4(pdp->rgvarg+2) == 0, "V_I4(pdp->rgvarg+2) = %d\n", V_I4(pdp->rgvarg+2));
1442 break;
1443 default:
1444 ok(0, "wFlags = %x\n", wFlags);
1445 }
1446
1447 return S_OK;
1448
1450 IDispatchEx *dispex;
1451 BSTR str;
1452 HRESULT hres;
1453
1454 hres = IDispatch_QueryInterface(script_disp, &IID_IDispatchEx, (void**)&dispex);
1455 ok(hres == S_OK, "hres = %x\n", hres);
1456
1457 str = a2bstr("Object");
1458 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
1460 ok(hres == S_OK, "hres = %x\n", hres);
1461
1462 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, NULL, pei, pspCaller);
1463 ok(hres == S_OK, "hres = %x\n", hres);
1464
1465 V_VT(pvarRes) = VT_EMPTY;
1466 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, pvarRes, pei, pspCaller);
1467 ok(hres == S_OK, "hres = %x\n", hres);
1468 ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1469 VariantClear(pvarRes);
1470
1471 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD|DISPATCH_PROPERTYGET, pdp, NULL, pei, pspCaller);
1472 ok(hres == S_OK, "hres = %x\n", hres);
1473
1474 V_VT(pvarRes) = VT_EMPTY;
1475 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, pvarRes, pei, pspCaller);
1476 ok(hres == S_OK, "hres = %x\n", hres);
1477 ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1478 VariantClear(pvarRes);
1479
1480 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, NULL, pei, pspCaller);
1481 ok(hres == S_OK, "hres = %x\n", hres);
1482
1483 V_VT(pvarRes) = VT_EMPTY;
1484 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT|DISPATCH_PROPERTYGET, pdp, pvarRes, pei, pspCaller);
1485 ok(hres == E_INVALIDARG, "hres = %x\n", hres);
1486
1487 V_VT(pvarRes) = VT_EMPTY;
1488 hres = IDispatchEx_InvokeEx(dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
1489 ok(hres == S_OK, "hres = %x\n", hres);
1490 ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1491 IDispatchEx_Release(dispex);
1492 return S_OK;
1493 }
1496 V_VT(pvarRes) = VT_I2;
1497 V_I2(pvarRes) = 10;
1498 return S_OK;
1499
1501 V_VT(pvarRes) = VT_INT;
1502 V_INT(pvarRes) = 22;
1503 return S_OK;
1504
1506 V_VT(pvarRes) = VT_UNKNOWN;
1507 V_UNKNOWN(pvarRes) = (IUnknown*)&testObj;
1508 return S_OK;
1509
1511 VARIANT args[10], v;
1512 DISPPARAMS dp = {args, NULL, ARRAY_SIZE(args), 0};
1513 HRESULT hres;
1514
1515 CHECK_EXPECT(global_testargtypes_i);
1516 ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
1517 ok(pdp != NULL, "pdp == NULL\n");
1518 ok(pdp->rgvarg != NULL, "rgvarg != NULL\n");
1519 ok(pdp->cArgs == 6, "cArgs = %d\n", pdp->cArgs);
1520 ok(!pvarRes, "pvarRes != NULL\n");
1521
1522 ok(V_VT(pdp->rgvarg+1) == VT_I4, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1523 ok(V_I4(pdp->rgvarg+1) == 10, "V_I4(pdp->rgvarg+1) = %d\n", V_I4(pdp->rgvarg+1));
1524
1525 ok(V_VT(pdp->rgvarg+2) == VT_I4, "V_VT(pdp->rgvarg+2) = %d\n", V_VT(pdp->rgvarg+2));
1526 ok(V_I4(pdp->rgvarg+2) == 10, "V_I4(pdp->rgvarg+2) = %d\n", V_I4(pdp->rgvarg+2));
1527
1528 ok(V_VT(pdp->rgvarg+3) == VT_I4, "V_VT(pdp->rgvarg+3) = %d\n", V_VT(pdp->rgvarg+3));
1529 ok(V_I4(pdp->rgvarg+3) == 22, "V_I4(pdp->rgvarg+3) = %d\n", V_I4(pdp->rgvarg+3));
1530
1531 ok(V_VT(pdp->rgvarg+4) == VT_I4, "V_VT(pdp->rgvarg+4) = %d\n", V_VT(pdp->rgvarg+4));
1532 ok(V_I4(pdp->rgvarg+4) == 22, "V_I4(pdp->rgvarg+4) = %d\n", V_I4(pdp->rgvarg+4));
1533
1534 ok(V_VT(pdp->rgvarg+5) == VT_DISPATCH, "V_VT(pdp->rgvarg+5) = %d\n", V_VT(pdp->rgvarg+5));
1535 ok(V_DISPATCH(pdp->rgvarg+5) == (IDispatch*)&testObj, "V_DISPATCH(pdp->rgvarg+5) != testObj\n");
1536
1537 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1538
1539 V_VT(args) = VT_I2;
1540 V_I2(args) = 2;
1541 V_VT(args+1) = VT_INT;
1542 V_INT(args+1) = 22;
1543 V_VT(args+2) = VT_UNKNOWN;
1545 V_VT(args+3) = VT_UNKNOWN;
1546 V_UNKNOWN(args+3) = NULL;
1547 V_VT(args+4) = VT_UI4;
1548 V_UI4(args+4) = 0xffffffff;
1550 V_VARIANTREF(args+5) = &v;
1551 V_VT(args+6) = VT_R4;
1552 V_R4(args+6) = 0.5;
1553 V_VT(args+7) = VT_UI2;
1554 V_UI2(args+7) = 3;
1555 V_VT(args+8) = VT_UI1;
1556 V_UI1(args+8) = 4;
1557 V_VT(args+9) = VT_I1;
1558 V_I1(args+9) = 5;
1559 V_VT(&v) = VT_I4;
1560 V_I4(&v) = 2;
1561 hres = IDispatch_Invoke(V_DISPATCH(pdp->rgvarg), DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
1562 ok(hres == S_OK, "Invoke failed: %08x\n", hres);
1563
1564 return S_OK;
1565 }
1566
1568 IDispatchEx *eval_func;
1569 DISPPARAMS params;
1570 VARIANT arg, res;
1571 HRESULT hres;
1572
1573 CHECK_EXPECT(global_calleval_i);
1574
1575 ok(pdp != NULL, "pdp == NULL\n");
1576 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1577 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1578 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1579 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1580 ok(pvarRes == NULL, "pvarRes != NULL\n");
1581 ok(pei != NULL, "pei == NULL\n");
1582
1583 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
1584 hres = IDispatch_QueryInterface(V_DISPATCH(pdp->rgvarg), &IID_IDispatchEx, (void**)&eval_func);
1585 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
1586
1587 params.rgvarg = &arg;
1588 params.rgdispidNamedArgs = NULL;
1589 params.cArgs = 1;
1590 params.cNamedArgs = 0;
1591 V_VT(&arg) = VT_BSTR;
1592
1593 V_BSTR(&arg) = a2bstr("var x = 5; v");
1594 V_VT(&res) = VT_ERROR;
1595 hres = IDispatchEx_InvokeEx(eval_func, DISPID_VALUE, 0, DISPATCH_METHOD, &params, &res, NULL, NULL);
1596 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
1597 ok(V_VT(&res) == VT_I4, "eval returned type %u\n", V_VT(&res));
1598 ok(V_I4(&res) == 2, "eval returned %d\n", V_I4(&res));
1600 IDispatchEx_Release(eval_func);
1601 return S_OK;
1602 }
1603 }
1604
1605 ok(0, "unexpected call %x\n", id);
1606 return DISP_E_MEMBERNOTFOUND;
1607}
1608
1610{
1611 switch(id) {
1613 CHECK_EXPECT(DeleteMemberByDispID);
1614 return S_OK;
1616 CHECK_EXPECT(DeleteMemberByDispID_false);
1617 return S_FALSE;
1619 CHECK_EXPECT(DeleteMemberByDispID_error);
1620 return E_FAIL;
1621 default:
1622 ok(0, "id = %d\n", id);
1623 }
1624
1625 return E_FAIL;
1626}
1627
1628static IDispatchExVtbl GlobalVtbl = {
1644};
1645
1647
1649{
1650 *ppv = NULL;
1651
1653 *ppv = iface;
1654 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
1655 *ppv = iface;
1656 else
1657 return E_NOINTERFACE;
1658
1659 IUnknown_AddRef((IUnknown*)*ppv);
1660 return S_OK;
1661}
1662
1664{
1665 return 2;
1666}
1667
1669{
1670 return 1;
1671}
1672
1674{
1675 *plcid = GetUserDefaultLCID();
1676 return S_OK;
1677}
1678
1680 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1681{
1682 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
1683 ok(!ppti, "ppti != NULL\n");
1684
1685 if(!strcmp_wa(pstrName, test_valA))
1686 CHECK_EXPECT(GetItemInfo_testVal);
1687 else if(strcmp_wa(pstrName, testA))
1688 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1689
1690 *ppiunkItem = (IUnknown*)&Global;
1691 return S_OK;
1692}
1693
1695{
1696 return E_NOTIMPL;
1697}
1698
1700 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1701{
1702 return E_NOTIMPL;
1703}
1704
1706{
1707 return E_NOTIMPL;
1708}
1709
1711{
1712 return E_NOTIMPL;
1713}
1714
1716{
1717 return E_NOTIMPL;
1718}
1719
1721{
1722 return E_NOTIMPL;
1723}
1724
1725#undef ACTSCPSITE_THIS
1726
1727static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
1739};
1740
1742
1744{
1745 ok(pscripterror != NULL, "ActiveScriptSite_OnScriptError -- expected pscripterror to be set, got NULL\n");
1746
1747 script_error = pscripterror;
1748 IActiveScriptError_AddRef(script_error);
1749
1751
1752 return S_OK;
1753}
1754
1755static const IActiveScriptSiteVtbl ActiveScriptSite_CheckErrorVtbl = {
1767};
1768
1770
1772{
1773 IActiveScriptProperty *script_prop;
1774 HRESULT hres;
1775
1776 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty,
1777 (void**)&script_prop);
1778 ok(hres == S_OK, "Could not get IActiveScriptProperty iface: %08x\n", hres);
1779
1780 hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
1781 IActiveScriptProperty_Release(script_prop);
1782
1783 return hres;
1784}
1785
1787{
1789 VARIANT v;
1790 HRESULT hres;
1791
1792 hres = CoCreateInstance(engine_clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1793 &IID_IActiveScript, (void**)&script);
1794 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1795
1796 V_VT(&v) = VT_I4;
1797 V_I4(&v) = invoke_version;
1798 hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
1799 ok(hres == S_OK || broken(hres == E_NOTIMPL), "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
1800 if(invoke_version && FAILED(hres)) {
1801 IActiveScript_Release(script);
1802 return NULL;
1803 }
1804
1805 return script;
1806}
1807
1809{
1810 IActiveScriptParse *parser;
1811 IActiveScript *engine;
1812 HRESULT hres;
1813
1814 engine = create_script();
1815 if(!engine)
1816 return S_OK;
1817
1818 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1819 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1820 if (FAILED(hres))
1821 {
1822 IActiveScript_Release(engine);
1823 return hres;
1824 }
1825
1827 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1828
1829 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1830 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1831
1832 hres = IActiveScript_AddNamedItem(engine, testW,
1833 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1834 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1835
1836 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1837 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1838
1839 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1840 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1841 ok(script_disp != NULL, "script_disp == NULL\n");
1842 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1843
1844 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1845
1846 IDispatch_Release(script_disp);
1847 IActiveScript_Release(engine);
1849
1850 return hres;
1851}
1852
1853static HRESULT invoke_procedure(const char *argsa, const char *sourcea, DISPPARAMS *dp)
1854{
1855 IActiveScriptParseProcedure2 *parse_proc;
1856 IActiveScriptParse *parser;
1857 IActiveScript *engine;
1858 IDispatchEx *dispex;
1859 EXCEPINFO ei = {0};
1860 BSTR source, args;
1861 IDispatch *disp;
1862 VARIANT res;
1863 HRESULT hres;
1864
1865 engine = create_script();
1866 if(!engine)
1867 return S_OK;
1868
1869 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1870 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1871
1873 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1874
1875 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1876 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1877
1878 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1879 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1880
1881 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
1882 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1883
1884 source = a2bstr(sourcea);
1885 args = argsa ? a2bstr(argsa) : NULL;
1887 SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS, &disp);
1888 ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres);
1891
1892 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
1893 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
1894 IDispatch_Release(disp);
1895
1896 V_VT(&res) = VT_EMPTY;
1897 hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, 0, DISPATCH_METHOD, dp, &res, &ei, NULL);
1898 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
1899 ok(V_VT(&res) == VT_BOOL && V_BOOL(&res), "InvokeEx returned vt %d (%x)\n", V_VT(&res), V_I4(&res));
1900 IDispatchEx_Release(dispex);
1901
1903 IActiveScript_Release(engine);
1905
1906 return hres;
1907}
1908
1910{
1911 IActiveScriptParse *parser;
1912 IActiveScript *engine;
1913 HRESULT hres;
1914 BSTR tmp = a2bstr("</SCRIPT>");
1915
1916 engine = create_script();
1917 if(!engine)
1918 return E_FAIL;
1919
1920 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1921 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1922 if (FAILED(hres))
1923 {
1924 IActiveScript_Release(engine);
1925 return E_FAIL;
1926 }
1927
1929 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1930
1931 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1932 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1933
1934 hres = IActiveScript_AddNamedItem(engine, testW,
1935 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1936 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1937
1938 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1939 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1940
1941 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, tmp, 0, 0, 0, NULL, NULL);
1942
1943 IActiveScript_Release(engine);
1945 SysFreeString(tmp);
1946
1947 return hres;
1948}
1949
1950static void test_IActiveScriptError(IActiveScriptError *error, SCODE errorcode, ULONG line, LONG pos, BSTR script_source, BSTR description, BSTR line_text)
1951{
1952 HRESULT hres;
1953 DWORD source_context;
1955 LONG char_position;
1956 BSTR linetext;
1957 EXCEPINFO excep;
1958
1959 /* IActiveScriptError_GetSourcePosition */
1960
1961 hres = IActiveScriptError_GetSourcePosition(error, NULL, NULL, NULL);
1962 ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1963
1964 source_context = 0xdeadbeef;
1965 hres = IActiveScriptError_GetSourcePosition(error, &source_context, NULL, NULL);
1966 ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1967 ok(source_context == 0, "IActiveScriptError_GetSourcePosition -- source_context: expected 0, got 0x%08x\n", source_context);
1968
1969 line_number = 0xdeadbeef;
1970 hres = IActiveScriptError_GetSourcePosition(error, NULL, &line_number, NULL);
1971 ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1972 ok(line_number == line, "IActiveScriptError_GetSourcePosition -- line_number: expected %d, got %d\n", line, line_number);
1973
1974 char_position = 0xdeadbeef;
1975 hres = IActiveScriptError_GetSourcePosition(error, NULL, NULL, &char_position);
1976 ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1977 ok(char_position == pos, "IActiveScriptError_GetSourcePosition -- char_position: expected %d, got %d\n", pos, char_position);
1978
1979 /* IActiveScriptError_GetSourceLineText */
1980
1981 hres = IActiveScriptError_GetSourceLineText(error, NULL);
1982 ok(hres == E_POINTER, "IActiveScriptError_GetSourceLineText -- hres: expected E_POINTER, got 0x%08x\n", hres);
1983
1984 linetext = NULL;
1985 hres = IActiveScriptError_GetSourceLineText(error, &linetext);
1986 if (line_text) {
1987 ok(hres == S_OK, "IActiveScriptError_GetSourceLineText -- hres: expected S_OK, got 0x%08x\n", hres);
1988 ok(linetext != NULL && !lstrcmpW(linetext, line_text),
1989 "IActiveScriptError_GetSourceLineText -- expected %s, got %s\n", wine_dbgstr_w(line_text), wine_dbgstr_w(linetext));
1990 } else {
1991 ok(hres == E_FAIL, "IActiveScriptError_GetSourceLineText -- hres: expected S_OK, got 0x%08x\n", hres);
1992 ok(linetext == NULL,
1993 "IActiveScriptError_GetSourceLineText -- expected NULL, got %s\n", wine_dbgstr_w(linetext));
1994 }
1995 SysFreeString(linetext);
1996
1997 /* IActiveScriptError_GetExceptionInfo */
1998
1999 hres = IActiveScriptError_GetExceptionInfo(error, NULL);
2000 ok(hres == E_POINTER, "IActiveScriptError_GetExceptionInfo -- hres: expected E_POINTER, got 0x%08x\n", hres);
2001
2002 excep.wCode = 0xdead;
2003 excep.wReserved = 0xdead;
2004 excep.bstrSource = (BSTR)0xdeadbeef;
2005 excep.bstrDescription = (BSTR)0xdeadbeef;
2006 excep.bstrHelpFile = (BSTR)0xdeadbeef;
2007 excep.dwHelpContext = 0xdeadbeef;
2008 excep.pvReserved = (void *)0xdeadbeef;
2009 excep.pfnDeferredFillIn = (void *)0xdeadbeef;
2010 excep.scode = 0xdeadbeef;
2011
2012 hres = IActiveScriptError_GetExceptionInfo(error, &excep);
2013 ok(hres == S_OK, "IActiveScriptError_GetExceptionInfo -- hres: expected S_OK, got 0x%08x\n", hres);
2014
2015 ok(excep.wCode == 0, "IActiveScriptError_GetExceptionInfo -- excep.wCode: expected 0, got 0x%08x\n", excep.wCode);
2016 ok(excep.wReserved == 0, "IActiveScriptError_GetExceptionInfo -- excep.wReserved: expected 0, got %d\n", excep.wReserved);
2017 if (!is_lang_english())
2018 skip("Non-english UI (test with hardcoded strings)\n");
2019 else {
2020 ok(excep.bstrSource != NULL && !lstrcmpW(excep.bstrSource, script_source),
2021 "IActiveScriptError_GetExceptionInfo -- excep.bstrSource is not valid: expected %s, got %s\n",
2022 wine_dbgstr_w(script_source), wine_dbgstr_w(excep.bstrSource));
2023 ok(excep.bstrDescription != NULL && !lstrcmpW(excep.bstrDescription, description),
2024 "IActiveScriptError_GetExceptionInfo -- excep.bstrDescription is not valid: got %s\n", wine_dbgstr_w(excep.bstrDescription));
2025 }
2026 ok(excep.bstrHelpFile == NULL,
2027 "IActiveScriptError_GetExceptionInfo -- excep.bstrHelpFile: expected NULL, got %s\n", wine_dbgstr_w(excep.bstrHelpFile));
2028 ok(excep.dwHelpContext == 0, "IActiveScriptError_GetExceptionInfo -- excep.dwHelpContext: expected 0, got %d\n", excep.dwHelpContext);
2029 ok(excep.pvReserved == NULL, "IActiveScriptError_GetExceptionInfo -- excep.pvReserved: expected NULL, got %p\n", excep.pvReserved);
2030 ok(excep.pfnDeferredFillIn == NULL, "IActiveScriptError_GetExceptionInfo -- excep.pfnDeferredFillIn: expected NULL, got %p\n", excep.pfnDeferredFillIn);
2031 ok(excep.scode == errorcode, "IActiveScriptError_GetExceptionInfo -- excep.scode: expected 0x%08x, got 0x%08x\n", errorcode, excep.scode);
2032
2033 SysFreeString(excep.bstrSource);
2034 SysFreeString(excep.bstrDescription);
2035 SysFreeString(excep.bstrHelpFile);
2036}
2037
2038static void parse_script_with_error(DWORD flags, BSTR script_str, SCODE errorcode, ULONG line, LONG pos, BSTR script_source, BSTR description, BSTR line_text)
2039{
2040 IActiveScriptParse *parser;
2041 IActiveScript *engine;
2042 HRESULT hres;
2043
2044 engine = create_script();
2045 if(!engine)
2046 return;
2047
2048 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2049 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
2050 if (FAILED(hres))
2051 {
2052 IActiveScript_Release(engine);
2053 return;
2054 }
2055
2057 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
2058
2059 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite_CheckError);
2060 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
2061
2062 hres = IActiveScript_AddNamedItem(engine, testW,
2063 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
2064 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
2065
2066 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2067 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
2068
2069 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
2070 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
2071 ok(script_disp != NULL, "script_disp == NULL\n");
2072 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
2073
2076 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2077 todo_wine ok(hres == 0x80020101, "parse_script_with_error should have returned 0x80020101, got: 0x%08x\n", hres);
2079
2080 if (script_error)
2081 {
2082 test_IActiveScriptError(script_error, errorcode, line, pos, script_source, description, line_text);
2083
2084 IActiveScriptError_Release(script_error);
2085 }
2086
2087 IDispatch_Release(script_disp);
2088 IActiveScript_Release(engine);
2090}
2091
2092static void parse_script_af(DWORD flags, const char *src)
2093{
2094 BSTR tmp;
2095 HRESULT hres;
2096
2097 tmp = a2bstr(src);
2098 hres = parse_script(flags, tmp);
2099 SysFreeString(tmp);
2100 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
2101}
2102
2103static void parse_script_a(const char *src)
2104{
2105 parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
2106}
2107
2108static void parse_script_ae(const char *src, HRESULT exhres)
2109{
2110 BSTR tmp;
2111 HRESULT hres;
2112
2113 tmp = a2bstr(src);
2114 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, tmp);
2115 SysFreeString(tmp);
2116 ok(hres == exhres, "parse_script failed: %08x, expected %08x\n", hres, exhres);
2117}
2118
2119static void parse_script_with_error_a(const char *src, SCODE errorcode, ULONG line, LONG pos, LPCSTR source, LPCSTR desc, LPCSTR linetext)
2120{
2121 BSTR tmp, script_source, description, line_text;
2122
2123 tmp = a2bstr(src);
2124 script_source = a2bstr(source);
2126 line_text = a2bstr(linetext);
2127
2128 parse_script_with_error(SCRIPTITEM_GLOBALMEMBERS, tmp, errorcode, line, pos, script_source, description, line_text);
2129
2130 SysFreeString(line_text);
2132 SysFreeString(script_source);
2133 SysFreeString(tmp);
2134}
2135
2136static HRESULT parse_htmlscript_a(const char *src)
2137{
2138 HRESULT hres;
2139 BSTR tmp = a2bstr(src);
2140 hres = parse_htmlscript(tmp);
2141 SysFreeString(tmp);
2142
2143 return hres;
2144}
2145
2147{
2148 DWORD size, len;
2149 HANDLE file, map;
2150 const char *file_map;
2151 BSTR ret;
2152
2154 if(file == INVALID_HANDLE_VALUE) {
2155 trace("Could not open file: %u\n", GetLastError());
2156 return NULL;
2157 }
2158
2160
2163 if(map == INVALID_HANDLE_VALUE) {
2164 trace("Could not create file mapping: %u\n", GetLastError());
2165 return NULL;
2166 }
2167
2168 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
2170 if(!file_map) {
2171 trace("MapViewOfFile failed: %u\n", GetLastError());
2172 return NULL;
2173 }
2174
2175 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
2177 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
2178
2179 UnmapViewOfFile(file_map);
2180
2181 return ret;
2182}
2183
2184static void run_from_file(const char *filename)
2185{
2186 BSTR script_str;
2187 HRESULT hres;
2188
2189 script_str = get_script_from_file(filename);
2190 if(!script_str)
2191 return;
2192
2194 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
2195 SysFreeString(script_str);
2196 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
2197}
2198
2199static BSTR load_res(const char *name)
2200{
2201 const char *data;
2202 DWORD size, len;
2203 BSTR str;
2204 HRSRC src;
2205
2207 test_name = name;
2208
2209 src = FindResourceA(NULL, name, (LPCSTR)40);
2210 ok(src != NULL, "Could not find resource %s\n", name);
2211
2214
2218
2219 return str;
2220}
2221
2222static void run_from_res(const char *name)
2223{
2224 BSTR str;
2225 HRESULT hres;
2226
2227 str = load_res(name);
2228
2229 SET_EXPECT(global_success_d);
2230 SET_EXPECT(global_success_i);
2231 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
2232 CHECK_CALLED(global_success_d);
2233 CHECK_CALLED(global_success_i);
2234
2235 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
2237}
2238
2239static void test_isvisible(BOOL global_members)
2240{
2241 IActiveScriptParse *parser;
2242 IActiveScript *engine;
2243 HRESULT hres;
2244
2245 static const WCHAR script_textW[] =
2246 {'v','a','r',' ','v',' ','=',' ','t','e','s','t','V','a','l',';',0};
2247
2248 engine = create_script();
2249 if(!engine)
2250 return;
2251
2252 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2253 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
2254 if (FAILED(hres))
2255 {
2256 IActiveScript_Release(engine);
2257 return;
2258 }
2259
2261 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
2262
2263 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2264 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
2265
2266 if(global_members)
2267 SET_EXPECT(GetItemInfo_testVal);
2268 hres = IActiveScript_AddNamedItem(engine, test_valW,
2269 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|
2270 (global_members ? SCRIPTITEM_GLOBALMEMBERS : 0));
2271 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
2272 if(global_members)
2273 CHECK_CALLED(GetItemInfo_testVal);
2274
2275 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2276 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
2277
2278 if(!global_members)
2279 SET_EXPECT(GetItemInfo_testVal);
2280 hres = IActiveScriptParse_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2281 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
2282 if(!global_members)
2283 CHECK_CALLED(GetItemInfo_testVal);
2284
2285 hres = IActiveScriptParse_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2286 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
2287
2288 IActiveScript_Release(engine);
2290}
2291
2292static void test_start(void)
2293{
2294 IActiveScriptParse *parser;
2295 IActiveScript *engine;
2296 BSTR str;
2297 HRESULT hres;
2298
2299 script_engine = engine = create_script();
2300 if(!engine)
2301 return;
2302
2303 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2304 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
2305
2307 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
2308
2309 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2310 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
2311
2312 hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2313 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
2314
2315 str = a2bstr("ok(getScriptState() === 5, \"getScriptState = \" + getScriptState());\n"
2316 "reportSuccess();");
2318 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
2320
2321 SET_EXPECT(global_success_d);
2322 SET_EXPECT(global_success_i);
2323 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2324 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
2325 CHECK_CALLED(global_success_d);
2326 CHECK_CALLED(global_success_i);
2327
2328 IActiveScript_Release(engine);
2331}
2332
2333static void test_automagic(void)
2334{
2335 IActiveScriptParse *parser;
2336 IActiveScript *engine;
2337 BSTR str;
2338 HRESULT hres;
2339
2340 script_engine = engine = create_script();
2341 if(!engine)
2342 return;
2343
2344 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2345 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
2346
2348 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
2349
2350 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2351 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
2352
2353 hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2354 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
2355
2356 str = a2bstr("function bindEventHandler::eventName() {}\n"
2357 "reportSuccess();");
2359 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
2361
2362 SET_EXPECT(BindHandler);
2363 SET_EXPECT(global_success_d);
2364 SET_EXPECT(global_success_i);
2365 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2366 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
2367 CHECK_CALLED(BindHandler);
2368 CHECK_CALLED(global_success_d);
2369 CHECK_CALLED(global_success_i);
2370
2371 IActiveScript_Release(engine);
2374}
2375
2376static HRESULT parse_script_expr(const char *expr, VARIANT *res, IActiveScript **engine_ret)
2377{
2378 IActiveScriptParse *parser;
2379 IActiveScript *engine;
2380 BSTR str;
2381 HRESULT hres;
2382
2383 engine = create_script();
2384 if(!engine)
2385 return E_FAIL;
2386
2387 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2388 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
2389
2391 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
2392
2393 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2394 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
2395
2396 SET_EXPECT(GetItemInfo_testVal);
2397 hres = IActiveScript_AddNamedItem(engine, test_valW,
2398 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2399 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
2400 CHECK_CALLED(GetItemInfo_testVal);
2401
2402 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2403 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
2404
2405 str = a2bstr(expr);
2406 hres = IActiveScriptParse_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, res, NULL);
2408
2410
2411 if(engine_ret) {
2412 *engine_ret = engine;
2413 }else {
2414 IActiveScript_Close(engine);
2415 IActiveScript_Release(engine);
2416 }
2417 return hres;
2418}
2419
2420static void test_retval(void)
2421{
2422 BSTR str = a2bstr("reportSuccess(), true");
2423 IActiveScriptParse *parser;
2424 IActiveScript *engine;
2426 VARIANT res;
2427 HRESULT hres;
2428
2429 engine = create_script();
2430 if(!engine)
2431 return;
2432
2433 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2434 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
2435
2437 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
2438
2439 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2440 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
2441
2442 SET_EXPECT(GetItemInfo_testVal);
2443 hres = IActiveScript_AddNamedItem(engine, test_valW,
2444 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2445 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
2446 CHECK_CALLED(GetItemInfo_testVal);
2447
2448 V_VT(&res) = VT_NULL;
2449 SET_EXPECT(global_success_d);
2450 SET_EXPECT(global_success_i);
2452 CHECK_CALLED(global_success_d);
2453 CHECK_CALLED(global_success_i);
2454 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
2455 ok(V_VT(&res) == VT_EMPTY, "V_VT(&res) = %d\n", V_VT(&res));
2456
2457 hres = IActiveScript_GetScriptState(engine, &state);
2458 ok(hres == S_OK, "GetScriptState failed: %08x\n", hres);
2459 ok(state == SCRIPTSTATE_INITIALIZED, "state = %d\n", state);
2460
2461 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2462 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
2463
2464 hres = IActiveScript_Close(engine);
2465 ok(hres == S_OK, "Close failed: %08x\n", hres);
2466
2468 IActiveScript_Release(engine);
2470}
2471
2472static void test_default_value(void)
2473{
2474 DISPPARAMS dp = {0};
2475 IDispatch *disp;
2476 VARIANT v;
2477 HRESULT hres;
2478
2479 hres = parse_script_expr("new Date()", &v, NULL);
2480 ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres);
2481 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
2482 disp = V_DISPATCH(&v);
2483
2484 V_VT(&v) = VT_EMPTY;
2485 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
2486 ok(hres == S_OK || broken(hres == 0x8000ffff), "Invoke failed: %08x\n", hres);
2487 if(hres == S_OK)
2488 {
2489 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
2490 }
2491
2492 VariantClear(&v);
2493 IDispatch_Release(disp);
2494}
2495
2496static void test_script_exprs(void)
2497{
2498 VARIANT v;
2499 HRESULT hres;
2500
2502
2503 hres = parse_script_expr("true", &v, NULL);
2504 ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres);
2505 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
2506 ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v));
2507
2508 hres = parse_script_expr("false, true", &v, NULL);
2509 ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres);
2510 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
2511 ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v));
2512
2513 SET_EXPECT(global_success_d);
2514 SET_EXPECT(global_success_i);
2515 hres = parse_script_expr("reportSuccess(); true", &v, NULL);
2516 ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres);
2517 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
2518 ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v));
2519 CHECK_CALLED(global_success_d);
2520 CHECK_CALLED(global_success_i);
2521
2522 hres = parse_script_expr("if(false) true", &v, NULL);
2523 ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres);
2524 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
2525
2526 hres = parse_script_expr("return testPropGet", &v, NULL);
2527 ok(hres == 0x800a03fa, "parse_script_expr failed: %08x\n", hres);
2528
2529 hres = parse_script_expr("reportSuccess(); return true", &v, NULL);
2530 ok(hres == 0x800a03fa, "parse_script_expr failed: %08x\n", hres);
2531
2532 SET_EXPECT(global_success_d);
2533 SET_EXPECT(global_success_i);
2534 hres = parse_script_expr("reportSuccess(); true", NULL, NULL);
2535 ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres);
2536 CHECK_CALLED(global_success_d);
2537 CHECK_CALLED(global_success_i);
2538
2540 test_retval();
2541
2543}
2544
2545static void test_invokeex(void)
2546{
2547 DISPID func_id, prop_id;
2548 DISPPARAMS dp = {NULL};
2550 IDispatchEx *dispex;
2551 VARIANT v;
2552 BSTR str;
2553 HRESULT hres;
2554
2555 hres = parse_script_expr("var o = {func: function() {return 3;}, prop: 6}; o", &v, &script);
2556 ok(hres == S_OK, "parse_script_expr failed: %08x\n", hres);
2557 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
2558
2559 hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex);
2560 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
2561 VariantClear(&v);
2562
2563 str = a2bstr("func");
2564 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
2566 ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
2567
2568 str = a2bstr("prop");
2569 hres = IDispatchEx_GetDispID(dispex, str, 0, &prop_id);
2571 ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
2572
2573 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, NULL);
2574 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
2575 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
2576 ok(V_I4(&v) == 3, "V_I4(v) = %d\n", V_I4(&v));
2577
2578 hres = IDispatchEx_InvokeEx(dispex, prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
2579 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
2580 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
2581 ok(V_I4(&v) == 6, "V_I4(v) = %d\n", V_I4(&v));
2582
2583 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
2584 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
2585
2586 str = a2bstr("func");
2587 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
2589 ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
2590
2591 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, NULL);
2592 ok(hres == E_UNEXPECTED || broken(hres == 0x800a1393), "InvokeEx failed: %08x\n", hres);
2593
2594 hres = IDispatchEx_InvokeEx(dispex, prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
2595 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
2596 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
2597 ok(V_I4(&v) == 6, "V_I4(v) = %d\n", V_I4(&v));
2598
2599 IDispatchEx_Release(dispex);
2600 IActiveScript_Release(script);
2601}
2602
2603static void test_eval(void)
2604{
2605 IActiveScriptParse *parser;
2606 IDispatchEx *script_dispex;
2608 IActiveScript *engine;
2609 VARIANT arg, res;
2610 DISPPARAMS params;
2611 DISPID id, v_id;
2612 BSTR str;
2613 HRESULT hres;
2614
2615 engine = create_script();
2616
2617 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2618 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
2619
2621 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
2622
2623 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2624 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
2625
2626 SET_EXPECT(GetItemInfo_testVal);
2627 hres = IActiveScript_AddNamedItem(engine, test_valW,
2628 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2629 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
2630 CHECK_CALLED(GetItemInfo_testVal);
2631
2632 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2633 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
2634
2635 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
2636 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
2637 ok(script_disp != NULL, "script_disp == NULL\n");
2638
2639 hres = IDispatch_QueryInterface(script_disp, &IID_IDispatchEx, (void**)&script_dispex);
2640 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
2641 IDispatch_Release(script_disp);
2642
2643 str = a2bstr("eval");
2644 hres = IDispatchEx_GetDispID(script_dispex, str, 0, &id);
2645 ok(hres == S_OK, "Could not get eval dispid: %08x\n", hres);
2647
2648 params.rgvarg = &arg;
2649 params.rgdispidNamedArgs = NULL;
2650 params.cArgs = 1;
2651 params.cNamedArgs = 0;
2652 V_VT(&arg) = VT_BSTR;
2653
2654 V_BSTR(&arg) = a2bstr("var v = 1;");
2655 V_VT(&res) = VT_ERROR;
2656 hres = IDispatchEx_InvokeEx(script_dispex, id, 0, DISPATCH_METHOD, &params, &res, NULL, NULL);
2657 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
2658 ok(V_VT(&res) == VT_EMPTY, "eval returned type %u\n", V_VT(&res));
2660
2661 V_BSTR(&arg) = a2bstr("v");
2662 V_VT(&res) = VT_ERROR;
2663 hres = IDispatchEx_InvokeEx(script_dispex, id, 0, DISPATCH_METHOD, &params, &res, NULL, NULL);
2664 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
2665 ok(V_VT(&res) == VT_I4, "eval returned type %u\n", V_VT(&res));
2666 ok(V_I4(&res) == 1, "eval returned %d\n", V_I4(&res));
2668
2669 str = a2bstr("v");
2670 hres = IDispatchEx_GetDispID(script_dispex, str, 0, &v_id);
2671 ok(hres == S_OK, "Could not get v dispid: %08x\n", hres);
2673
2674 params.rgvarg = NULL;
2675 params.cArgs = 0;
2676 V_VT(&res) = VT_ERROR;
2677 hres = IDispatchEx_InvokeEx(script_dispex, v_id, 0, DISPATCH_PROPERTYGET, &params, &res, NULL, NULL);
2678 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
2679 ok(V_VT(&res) == VT_I4, "eval returned type %u\n", V_VT(&res));
2680 ok(V_I4(&res) == 1, "eval returned %d\n", V_I4(&res));
2681
2682 SET_EXPECT(global_calleval_i);
2683 str = a2bstr("(function(){"
2684 " var v = 2;"
2685 " callEval(eval);"
2686 " ok(x === 5, 'x = ' + x);"
2687 "})();");
2689 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
2691 CHECK_CALLED(global_calleval_i);
2692
2693 str = a2bstr("x");
2694 hres = IDispatchEx_GetDispID(script_dispex, str, 0, &id);
2695 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(x) returned %08x\n", hres);
2697
2698 IDispatchEx_Release(script_dispex);
2700 IActiveScript_Close(engine);
2701 IActiveScript_Release(engine);
2702}
2703
2705{
2706 WCHAR str[1024];
2708};
2709
2710static void run_bom_tests(void)
2711{
2712 BSTR src;
2713 int i;
2714 HRESULT hres;
2715 struct bom_test bom_tests[] = {
2716 {{'v','a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',')',';','\0'}, S_OK},
2717 {{0xFEFF,'v','a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',')',';','\0'}, S_OK},
2718 {{'v',0xFEFF,'a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',')',';','\0'}, JS_E_OUT_OF_MEMORY},
2719 {{'v','a','r',0xFEFF,' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',')',';','\0'}, S_OK},
2720 {{'v','a','r',' ','a',' ','=',' ','1',';',' ',0xFEFF,'r','e','p','o','r','t','S','u','c','c','e','s','s','(',')',';','\0'}, S_OK},
2721 {{'v','a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t',0xFEFF,'S','u','c','c','e','s','s','(',')',';','\0'}, JS_E_OUT_OF_MEMORY},
2722 {{'v','a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s',0xFEFF,'(',')',';','\0'}, S_OK},
2723 {{'v','a','r',' ','a',' ','=',' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',0xFEFF,')',';','\0'}, S_OK},
2724 {{'v','a','r',' ','a',' ','=',0xFEFF,' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',0xFEFF,')',';','\0'}, S_OK},
2725 {{0xFEFF,'v','a','r',' ','a',' ','=',0xFEFF,0xFEFF,' ','1',';',' ','r','e','p','o','r','t','S','u','c','c','e','s','s','(',0xFEFF,')',';','\0'}, S_OK},
2726 {{0}}
2727 };
2728
2730
2731 for (i = 0; bom_tests[i].str[0]; i++)
2732 {
2733 if(bom_tests[i].hres == S_OK)
2734 {
2735 SET_EXPECT(global_success_d);
2736 SET_EXPECT(global_success_i);
2737 src = SysAllocString(bom_tests[i].str);
2738 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
2739 ok(hres == S_OK, "test %s failed with %08x\n", wine_dbgstr_w(src), hres);
2741 CHECK_CALLED(global_success_d);
2742 CHECK_CALLED(global_success_i);
2743 }
2744 else
2745 {
2746 src = SysAllocString(bom_tests[i].str);
2747 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
2748 todo_wine ok(hres == bom_tests[i].hres, "test %s returned with %08x\n", wine_dbgstr_w(src), hres);
2750 }
2751 }
2752}
2753
2754static BOOL run_tests(void)
2755{
2756 HRESULT hres;
2757
2758 if(invoke_version) {
2760
2762 if(!script) {
2763 win_skip("Could not create script\n");
2764 return FALSE;
2765 }
2766 IActiveScript_Release(script);
2767 }
2768
2770
2771 parse_script_a("");
2772 parse_script_a("/* empty */ ;");
2773
2774 SET_EXPECT(global_propget_d);
2775 SET_EXPECT(global_propget_i);
2776 parse_script_a("testPropGet;");
2777 CHECK_CALLED(global_propget_d);
2778 CHECK_CALLED(global_propget_i);
2779
2780 SET_EXPECT(global_propput_d);
2781 SET_EXPECT(global_propput_i);
2782 parse_script_a("testPropPut = 1;");
2783 CHECK_CALLED(global_propput_d);
2784 CHECK_CALLED(global_propput_i);
2785
2786 SET_EXPECT(global_propputref_d);
2787 SET_EXPECT(global_propputref_i);
2788 parse_script_a("testPropPutRef = new Object();");
2789 CHECK_CALLED(global_propputref_d);
2790 CHECK_CALLED(global_propputref_i);
2791
2792 SET_EXPECT(global_propputref_d);
2793 SET_EXPECT(global_propputref_i);
2794 parse_script_a("testPropPutRef = testObj;");
2795 CHECK_CALLED(global_propputref_d);
2796 CHECK_CALLED(global_propputref_i);
2797
2798 SET_EXPECT(global_success_d);
2799 SET_EXPECT(global_success_i);
2800 parse_script_a("reportSuccess();");
2801 CHECK_CALLED(global_success_d);
2802 CHECK_CALLED(global_success_i);
2803
2804 SET_EXPECT(testobj_delete_test);
2805 parse_script_a("ok((delete testObj.deleteTest) === true, 'delete testObj.deleteTest did not return true');");
2806 CHECK_CALLED(testobj_delete_test);
2807
2808 SET_EXPECT(testobj_delete_nodelete);
2809 parse_script_a("ok((delete testObj.noDeleteTest) === false, 'delete testObj.noDeleteTest did not return false');");
2810 CHECK_CALLED(testobj_delete_nodelete);
2811
2812 SET_EXPECT(global_propdelete_d);
2813 SET_EXPECT(DeleteMemberByDispID);
2814 parse_script_a("ok((delete testPropDelete) === true, 'delete testPropDelete did not return true');");
2815 CHECK_CALLED(global_propdelete_d);
2816 CHECK_CALLED(DeleteMemberByDispID);
2817
2818 SET_EXPECT(global_nopropdelete_d);
2819 SET_EXPECT(DeleteMemberByDispID_false);
2820 parse_script_a("ok((delete testNoPropDelete) === false, 'delete testPropDelete did not return false');");
2821 CHECK_CALLED(global_nopropdelete_d);
2822 CHECK_CALLED(DeleteMemberByDispID_false);
2823
2824 SET_EXPECT(global_propdeleteerror_d);
2825 SET_EXPECT(DeleteMemberByDispID_error);
2826 parse_script_ae("delete testPropDeleteError;", E_FAIL);
2827 CHECK_CALLED(global_propdeleteerror_d);
2828 CHECK_CALLED(DeleteMemberByDispID_error);
2829
2830 SET_EXPECT(puredisp_prop_d);
2831 parse_script_a("ok((delete pureDisp.prop) === false, 'delete pureDisp.prop did not return true');");
2832 CHECK_CALLED(puredisp_prop_d);
2833
2834 SET_EXPECT(puredisp_noprop_d);
2835 parse_script_a("ok((delete pureDisp.noprop) === true, 'delete pureDisp.noprop did not return false');");
2836 CHECK_CALLED(puredisp_noprop_d);
2837
2838 SET_EXPECT(puredisp_value);
2839 parse_script_a("var t=pureDisp; t=t(false);");
2840 CHECK_CALLED(puredisp_value);
2841
2842 SET_EXPECT(puredisp_value);
2843 parse_script_a("var t = {func: pureDisp}; t = t.func(false);");
2844 CHECK_CALLED(puredisp_value);
2845
2846 SET_EXPECT(dispexfunc_value);
2847 parse_script_a("var t = dispexFunc; t = t(false);");
2848 CHECK_CALLED(dispexfunc_value);
2849
2850 SET_EXPECT(dispexfunc_value);
2851 parse_script_a("var t = {func: dispexFunc}; t = t.func(false);");
2852 CHECK_CALLED(dispexfunc_value);
2853
2854 SET_EXPECT(dispexfunc_value);
2855 parse_script_a("Function.prototype.apply.call(dispexFunc, testObj, [true]);");
2856 CHECK_CALLED(dispexfunc_value);
2857
2858 SET_EXPECT(puredisp_value);
2859 parse_script_a("Function.prototype.apply.call(pureDisp, testObj, [true]);");
2860 CHECK_CALLED(puredisp_value);
2861
2862 parse_script_a("(function reportSuccess() {})()");
2863
2864 parse_script_a("ok(typeof(test) === 'object', \"typeof(test) != 'object'\");");
2865
2866 parse_script_a("function reportSuccess() {}; reportSuccess();");
2867
2868 SET_EXPECT(global_propget_d);
2869 parse_script_a("var testPropGet");
2870 CHECK_CALLED(global_propget_d);
2871
2872 SET_EXPECT(global_propget_d);
2873 parse_script_a("eval('var testPropGet;');");
2874 CHECK_CALLED(global_propget_d);
2875
2876 parse_script_a("var testPropGet; function testPropGet() {}");
2877
2878 SET_EXPECT(global_notexists_d);
2879 parse_script_a("var notExists; notExists = 1;");
2880 CHECK_CALLED(global_notexists_d);
2881
2882 SET_EXPECT(testobj_notexists_d);
2883 parse_script_a("testObj.notExists;");
2884 CHECK_CALLED(testobj_notexists_d);
2885
2886 parse_script_a("function f() { var testPropGet; }");
2887 parse_script_a("(function () { var testPropGet; })();");
2888 parse_script_a("(function () { eval('var testPropGet;'); })();");
2889
2890 SET_EXPECT(invoke_func);
2891 parse_script_a("ok(propGetFunc() == 0, \"Incorrect propGetFunc value\");");
2892 CHECK_CALLED(invoke_func);
2893 parse_script_a("ok(propGetFunc(1) == 1, \"Incorrect propGetFunc value\");");
2894 parse_script_a("ok(propGetFunc(1, 2) == 2, \"Incorrect propGetFunc value\");");
2895 SET_EXPECT(invoke_func);
2896 parse_script_a("ok(propGetFunc().toString() == 0, \"Incorrect propGetFunc value\");");
2897 CHECK_CALLED(invoke_func);
2898 parse_script_a("ok(propGetFunc(1).toString() == 1, \"Incorrect propGetFunc value\");");
2899 SET_EXPECT(invoke_func);
2900 parse_script_a("propGetFunc(1);");
2901 CHECK_CALLED(invoke_func);
2902
2903 parse_script_a("objectFlag(1).toString();");
2904
2905 parse_script_a("(function() { var tmp = (function () { return testObj; })()(1);})();");
2906 parse_script_a("(function() { var tmp = (function () { return testObj; })()();})();");
2907
2908 parse_script_a("ok((testObj instanceof Object) === false, 'testObj is instance of Object');");
2909
2910 SET_EXPECT(testobj_prop_d);
2911 parse_script_a("ok(('prop' in testObj) === true, 'prop is not in testObj');");
2912 CHECK_CALLED(testobj_prop_d);
2913
2914 SET_EXPECT(testobj_noprop_d);
2915 parse_script_a("ok(('noprop' in testObj) === false, 'noprop is in testObj');");
2916 CHECK_CALLED(testobj_noprop_d);
2917
2918 SET_EXPECT(testobj_prop_d);
2919 parse_script_a("ok(Object.prototype.hasOwnProperty.call(testObj, 'prop') === true, 'hasOwnProperty(\\\"prop\\\") returned false');");
2920 CHECK_CALLED(testobj_prop_d);
2921
2922 SET_EXPECT(testobj_noprop_d);
2923 parse_script_a("ok(Object.prototype.hasOwnProperty.call(testObj, 'noprop') === false, 'hasOwnProperty(\\\"noprop\\\") returned true');");
2924 CHECK_CALLED(testobj_noprop_d);
2925
2926 SET_EXPECT(puredisp_prop_d);
2927 parse_script_a("ok(Object.prototype.hasOwnProperty.call(pureDisp, 'prop') === true, 'hasOwnProperty(\\\"noprop\\\") returned false');");
2928 CHECK_CALLED(puredisp_prop_d);
2929
2930 SET_EXPECT(puredisp_noprop_d);
2931 parse_script_a("ok(Object.prototype.hasOwnProperty.call(pureDisp, 'noprop') === false, 'hasOwnProperty(\\\"noprop\\\") returned true');");
2932 CHECK_CALLED(puredisp_noprop_d);
2933
2934 SET_EXPECT(testobj_value);
2935 parse_script_a("ok(String(testObj) === '1', 'wrong testObj value');");
2936 CHECK_CALLED(testobj_value);
2937
2938 SET_EXPECT(testobj_value);
2939 parse_script_a("ok(String.prototype.concat.call(testObj, ' OK') === '1 OK', 'wrong concat result');");
2940 CHECK_CALLED(testobj_value);
2941
2942 SET_EXPECT(testobj_construct);
2943 parse_script_a("var t = new testObj(1);");
2944 CHECK_CALLED(testobj_construct);
2945
2946 SET_EXPECT(global_propget_d);
2947 SET_EXPECT(global_propget_i);
2948 parse_script_a("this.testPropGet;");
2949 CHECK_CALLED(global_propget_d);
2950 CHECK_CALLED(global_propget_i);
2951
2952 SET_EXPECT(global_propputref_d);
2953 SET_EXPECT(global_propputref_i);
2954 parse_script_a("testPropPutRef = nullDisp;");
2955 CHECK_CALLED(global_propputref_d);
2956 CHECK_CALLED(global_propputref_i);
2957
2958 SET_EXPECT(global_propget_d);
2959 SET_EXPECT(global_propget_i);
2960 parse_script_a("(function () { this.testPropGet; })();");
2961 CHECK_CALLED(global_propget_d);
2962 CHECK_CALLED(global_propget_i);
2963
2964 parse_script_a("testThis(this);");
2965 parse_script_a("(function () { testThis(this); })();");
2966 parse_script_a("function x() { testThis(this); }; x();");
2967 parse_script_a("var t = {func: function () { ok(this === t, 'this !== t'); }}; with(t) { func(); }");
2968 parse_script_a("function x() { testThis(this); }; with({y: 1}) { x(); }");
2969 parse_script_a("(function () { function x() { testThis(this);} x(); })();");
2970
2971 SET_EXPECT(testobj_onlydispid_d);
2972 SET_EXPECT(testobj_onlydispid_i);
2973 parse_script_a("ok(typeof(testObj.onlyDispID) === 'unknown', 'unexpected typeof(testObj.onlyDispID)');");
2974 CHECK_CALLED(testobj_onlydispid_d);
2975 CHECK_CALLED(testobj_onlydispid_i);
2976
2977 SET_EXPECT(global_propargput_d);
2978 SET_EXPECT(global_propargput_i);
2979 parse_script_a("var t=0; propArgPutG(t++, t++) = t++;");
2980 CHECK_CALLED(global_propargput_d);
2981 CHECK_CALLED(global_propargput_i);
2982
2983 SET_EXPECT(global_propargput_d);
2984 SET_EXPECT(global_propargput_i);
2985 parse_script_a("var t=0; test.propArgPutO(t++, t++) = t++;");
2986 CHECK_CALLED(global_propargput_d);
2987 CHECK_CALLED(global_propargput_i);
2988
2989 SET_EXPECT(global_propargputop_d);
2990 SET_EXPECT(global_propargputop_get_i);
2991 SET_EXPECT(global_propargputop_put_i);
2992 parse_script_a("var t=0; propArgPutOp(t++, t++) += t++;");
2993 CHECK_CALLED(global_propargputop_d);
2994 CHECK_CALLED(global_propargputop_get_i);
2995 CHECK_CALLED(global_propargputop_put_i);
2996
2997 SET_EXPECT(global_propargputop_d);
2998 SET_EXPECT(global_propargputop_get_i);
2999 SET_EXPECT(global_propargputop_put_i);
3000 parse_script_a("var t=0; propArgPutOp(t++, t++) ^= 14;");
3001 CHECK_CALLED(global_propargputop_d);
3002 CHECK_CALLED(global_propargputop_get_i);
3003 CHECK_CALLED(global_propargputop_put_i);
3004
3005 SET_EXPECT(global_testargtypes_i);
3006 parse_script_a("testArgTypes(dispUnk, intProp(), intProp, getShort(), shortProp,"
3007 "function(i1,ui1,ui2,r4,i4ref,ui4,nullunk,d,i,s) {"
3008 " ok(getVT(i) === 'VT_I4', 'getVT(i) = ' + getVT(i));"
3009 " ok(getVT(s) === 'VT_I4', 'getVT(s) = ' + getVT(s));"
3010 " ok(getVT(d) === 'VT_DISPATCH', 'getVT(d) = ' + getVT(d));"
3011 " ok(getVT(nullunk) === 'VT_DISPATCH', 'getVT(nullunk) = ' + getVT(nullunk));"
3012 " ok(nullunk === null, 'nullunk !== null');"
3013 " ok(getVT(ui4) === 'VT_R8', 'getVT(ui4) = ' + getVT(ui4));"
3014 " ok(ui4 > 0, 'ui4 = ' + ui4);"
3015 " ok(getVT(i4ref) === 'VT_I4', 'getVT(i4ref) = ' + getVT(i4ref));"
3016 " ok(i4ref === 2, 'i4ref = ' + i4ref);"
3017 " ok(r4 === 0.5, 'r4 = ' + r4);"
3018 " ok(getVT(r4) === 'VT_R8', 'getVT(r4) = ' + getVT(r4));"
3019 " ok(getVT(ui2) === 'VT_I4', 'getVT(ui2) = ' + getVT(ui2));"
3020 " ok(getVT(ui1) === 'VT_I4', 'getVT(ui1) = ' + getVT(ui1));"
3021 " ok(ui1 === 4, 'ui1 = ' + ui1);"
3022 " ok(getVT(i1) === 'VT_I4', 'getVT(i1) = ' + getVT(i1));"
3023 " ok(i1 === 5, 'i1 = ' + i1);"
3024 "});");
3025 CHECK_CALLED(global_testargtypes_i);
3026
3027 SET_EXPECT(testobj_withprop_d);
3028 SET_EXPECT(testobj_withprop_i);
3029 parse_script_a("var t = (function () { with(testObj) { return withProp; }})(); ok(t === 1, 't = ' + t);");
3030 CHECK_CALLED(testobj_withprop_d);
3031 CHECK_CALLED(testobj_withprop_i);
3032
3033 parse_script_a("@set @t=2\nok(@t === 2, '@t = ' + @t);");
3034
3035 SET_EXPECT(global_success_d);
3036 SET_EXPECT(global_success_i);
3037 parse_script_a("@if(true)\nif(@_jscript) reportSuccess();\n@end");
3038 CHECK_CALLED(global_success_d);
3039 CHECK_CALLED(global_success_i);
3040
3043 SET_EXPECT(testobj_newenum);
3044 SET_EXPECT(enumvariant_next_0);
3045 parse_script_a("new Enumerator(testObj);");
3046 CHECK_CALLED(testobj_newenum);
3047 CHECK_CALLED(enumvariant_next_0);
3048
3051 SET_EXPECT(testobj_newenum);
3052 SET_EXPECT(enumvariant_next_0);
3053 SET_EXPECT(enumvariant_reset);
3054 parse_script_a("(function () {"
3055 " var testEnumObj = new Enumerator(testObj);"
3056 " var tmp = testEnumObj.moveFirst();"
3057 " ok(tmp == undefined, \"testEnumObj.moveFirst() = \" + tmp);"
3058 "})()");
3059 CHECK_CALLED(testobj_newenum);
3060 CHECK_CALLED(enumvariant_next_0);
3061 CHECK_CALLED(enumvariant_reset);
3062
3065 SET_EXPECT(testobj_newenum);
3066 SET_EXPECT(enumvariant_next_0);
3067 SET_EXPECT(enumvariant_next_1);
3068 parse_script_a("(function () {"
3069 " var testEnumObj = new Enumerator(testObj);"
3070 " while (!testEnumObj.atEnd())"
3071 " {"
3072 " ok(testEnumObj.item() == 123, "
3073 " \"testEnumObj.item() = \"+testEnumObj.item());"
3074 " testEnumObj.moveNext();"
3075 " }"
3076 "})()");
3077 CHECK_CALLED(testobj_newenum);
3078 CHECK_CALLED(enumvariant_next_0);
3079 CHECK_CALLED(enumvariant_next_1);
3080
3081 run_from_res("lang.js");
3082 run_from_res("api.js");
3083 run_from_res("regexp.js");
3084 run_from_res("cc.js");
3085
3088 test_start();
3090
3091 parse_script_af(0, "test.testThis2(this);");
3092 parse_script_af(0, "(function () { test.testThis2(this); })();");
3093
3094 hres = parse_htmlscript_a("<!--");
3095 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
3096 hres = parse_htmlscript_a("-->");
3097 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
3098 hres = parse_htmlscript_a("<!--\nvar a=1;\n-->\n");
3099 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
3100 hres = parse_htmlscript_a("<!--\n<!-- ignore this\n-->\n");
3101 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
3102 hres = parse_htmlscript_a("var a=1;\nif(a-->0) a=5;\n");
3103 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
3104 hres = parse_htmlscript_a("var a=1;\nif(a\n-->0) a=5;\n");
3105 ok(hres != S_OK, "ParseScriptText have not failed\n");
3106
3108 test_invokeex();
3109 test_eval();
3110
3112 "?",
3113 0x800a03ea, 0, 0,
3114 "Microsoft JScript compilation error",
3115 "Syntax error",
3116 "?");
3117
3119 "var a=1;\nif(a\n-->0) a=5;\n",
3120 0x800a03ee, 2, 0,
3121 "Microsoft JScript compilation error",
3122 "Expected ')'",
3123 "-->0) a=5;");
3124
3126 "new 3;",
3127 0x800a01bd, 0, 0,
3128 "Microsoft JScript runtime error",
3129 "Object doesn't support this action",
3130 NULL);
3131
3133 "new null;",
3134 0x800a138f, 0, 0,
3135 "Microsoft JScript runtime error",
3136 "Object expected",
3137 NULL);
3138
3140 "var a;\nnew null;",
3141 0x800a138f, 1, 0,
3142 "Microsoft JScript runtime error",
3143 "Object expected",
3144 NULL);
3145
3147 "var a; new null;",
3148 0x800a138f, 0, 7,
3149 "Microsoft JScript runtime error",
3150 "Object expected",
3151 NULL);
3152
3153 run_bom_tests();
3154
3155 return TRUE;
3156}
3157
3158static void test_parse_proc(void)
3159{
3160 VARIANT args[2];
3161 DISPPARAMS dp = {args};
3162
3163 dp.cArgs = 0;
3164 invoke_procedure(NULL, "return true;", &dp);
3165
3166 dp.cArgs = 1;
3167 V_VT(args) = VT_EMPTY;
3168 invoke_procedure(NULL, "return arguments.length == 1;", &dp);
3169
3170 V_VT(args) = VT_BOOL;
3171 V_BOOL(args) = VARIANT_TRUE;
3172 invoke_procedure(" x ", "return x;", &dp);
3173
3174 dp.cArgs = 2;
3175 V_VT(args) = VT_I4;
3176 V_I4(args) = 2;
3177 V_VT(args+1) = VT_I4;
3178 V_I4(args+1) = 1;
3179 invoke_procedure(" _x1 , y_2", "return _x1 === 1 && y_2 === 2;", &dp);
3180}
3181
3182static void run_encoded_tests(void)
3183{
3184 BSTR src;
3185 HRESULT hres;
3186
3188
3189 SET_EXPECT(global_success_d);
3190 SET_EXPECT(global_success_i);
3191 /* |reportSuccess(); | */
3192 parse_script_a("#@~^EAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
3193 CHECK_CALLED(global_success_d);
3194 CHECK_CALLED(global_success_i);
3195
3196 SET_EXPECT(global_success_d);
3197 SET_EXPECT(global_success_i);
3198 parse_script_a("reportSuccess();");
3199 CHECK_CALLED(global_success_d);
3200 CHECK_CALLED(global_success_i);
3201
3202 SET_EXPECT(global_success_d);
3203 SET_EXPECT(global_success_i);
3204 /* |Success | */
3205 parse_script_a("report#@~^BwAAAA==j!m^\x7f/k2QIAAA==^#~@();");
3206 CHECK_CALLED(global_success_d);
3207 CHECK_CALLED(global_success_i);
3208
3209 SET_EXPECT(global_success_d);
3210 SET_EXPECT(global_success_i);
3211 /* |\r\n\treportSuccess();\r\n | */
3212 parse_script_a("#@~^GQAAAA==@#@&d.\x7fwKDYUE1^+k/c#p@#@&OAYAAA==^#~@");
3213 CHECK_CALLED(global_success_d);
3214 CHECK_CALLED(global_success_i);
3215
3216 /* v */
3217 src = a2bstr("#@~^EAA*AA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
3218 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
3220 ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
3221
3222 /* vv */
3223 src = a2bstr("#@~^EAAAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
3224 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
3226 ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
3227
3228 /* v */
3229 src = a2bstr("#@~^EAAAAA^=.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
3230 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
3232 ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
3233
3234 /* v */
3235 src = a2bstr("#@~^EAAAAA==.\x7fwGMYUEm1ekd`*iAQYAAA==^#~@");
3236 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
3238 ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
3239
3240 /* vv */
3241 src = a2bstr("#@~^EAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^~#@");
3242 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
3244 ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
3245}
3246
3247static void run_benchmark(const char *script_name)
3248{
3249 IActiveScriptParse *parser;
3250 IActiveScript *engine;
3251 ULONG start, end;
3252 BSTR src;
3253 HRESULT hres;
3254
3255 engine = create_script();
3256 if(!engine)
3257 return;
3258
3259 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
3260 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
3261 if (FAILED(hres)) {
3262 IActiveScript_Release(engine);
3263 return;
3264 }
3265
3267 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
3268
3269 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
3270 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
3271
3272 hres = IActiveScript_AddNamedItem(engine, testW,
3273 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE);
3274 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
3275
3276 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
3277 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
3278
3280
3281 start = GetTickCount();
3283 end = GetTickCount();
3284 ok(hres == S_OK, "%s: ParseScriptText failed: %08x\n", script_name, hres);
3285
3286 trace("%s ran in %u ms\n", script_name, end-start);
3287
3288 IActiveScript_Release(engine);
3291}
3292
3293static void run_benchmarks(void)
3294{
3295 trace("Running benchmarks...\n");
3296
3297 run_benchmark("dna.js");
3298 run_benchmark("base64.js");
3299 run_benchmark("validateinput.js");
3300}
3301
3303{
3304 IActiveScriptProperty *script_prop;
3305 BSTR str;
3306 HRESULT hres;
3307
3308 hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
3309 &IID_IActiveScriptProperty, (void**)&script_prop);
3310 if(FAILED(hres))
3311 return FALSE;
3312 IActiveScriptProperty_Release(script_prop);
3313
3314 str = a2bstr("if(!('localeCompare' in String.prototype)) throw 1;");
3315 hres = parse_script(0, str);
3317
3318 return hres == S_OK;
3319}
3320
3322{
3323 int argc;
3324 char **argv;
3325
3327
3329
3330 if(!check_jscript()) {
3331 win_skip("Broken engine, probably too old\n");
3332 }else if(argc > 2) {
3333 invoke_version = 2;
3334 run_from_file(argv[2]);
3335 }else {
3336 trace("invoke version 0\n");
3337 invoke_version = 0;
3338 run_tests();
3339
3340 trace("invoke version 2\n");
3341 invoke_version = 2;
3342 if(run_tests()) {
3343 trace("JSctipt.Encode tests...\n");
3345 trace("ParseProcedureText tests...\n");
3347 }
3348
3351 }
3352
3354}
static int argc
Definition: ServiceArgs.c:12
#define broken(x)
Definition: _sntprintf.h:21
@ SCRIPTSTATE_INITIALIZED
Definition: activscp.idl:62
@ SCRIPTSTATE_STARTED
Definition: activscp.idl:58
@ SCRIPTSTATE_UNINITIALIZED
Definition: activscp.idl:57
enum tagSCRIPTSTATE SCRIPTSTATE
static int state
Definition: maze.c:121
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
#define ARRAY_SIZE(a)
Definition: main.h:24
const GUID IID_IUnknown
Definition: _map.h:48
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define PAGE_READONLY
Definition: compat.h:138
#define UnmapViewOfFile
Definition: compat.h:746
#define CP_ACP
Definition: compat.h:109
#define OPEN_EXISTING
Definition: compat.h:775
#define GetProcAddress(x, y)
Definition: compat.h:753
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
OLECHAR * BSTR
Definition: compat.h:2293
#define GENERIC_READ
Definition: compat.h:135
#define FILE_MAP_READ
Definition: compat.h:776
#define WideCharToMultiByte
Definition: compat.h:111
#define MapViewOfFile
Definition: compat.h:745
#define MultiByteToWideChar
Definition: compat.h:110
LONG SCODE
Definition: compat.h:2252
@ VT_BSTR
Definition: compat.h:2303
@ VT_INT
Definition: compat.h:2316
@ VT_R4
Definition: compat.h:2299
@ VT_NULL
Definition: compat.h:2296
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_BYREF
Definition: compat.h:2342
@ VT_UI2
Definition: compat.h:2312
@ VT_ERROR
Definition: compat.h:2305
@ VT_ARRAY
Definition: compat.h:2341