ReactOS 0.4.17-dev-357-ga8f14ff
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(testobj_getidfail_d);
115DEFINE_EXPECT(testobj_tolocalestr_d);
116DEFINE_EXPECT(testobj_tolocalestr_i);
117DEFINE_EXPECT(test_caller_get);
118DEFINE_EXPECT(test_caller_null);
119DEFINE_EXPECT(test_caller_obj);
120DEFINE_EXPECT(testdestrobj);
121DEFINE_EXPECT(enumvariant_next_0);
122DEFINE_EXPECT(enumvariant_next_1);
123DEFINE_EXPECT(enumvariant_reset);
124DEFINE_EXPECT(GetItemInfo_testVal);
126DEFINE_EXPECT(invoke_func);
127DEFINE_EXPECT(DeleteMemberByDispID);
128DEFINE_EXPECT(DeleteMemberByDispID_false);
129DEFINE_EXPECT(DeleteMemberByDispID_error);
130DEFINE_EXPECT(BindHandler);
131
132#define JS_E_SUBSCRIPT_OUT_OF_RANGE 0x800a0009
133#define JS_E_INVALID_ACTION 0x800a01bd
134#define JS_E_OBJECT_EXPECTED 0x800a138f
135#define JS_E_UNDEFINED_VARIABLE 0x800a1391
136#define JS_E_EXCEPTION_THROWN 0x800a139e
137#define JS_E_SYNTAX 0x800a03ea
138#define JS_E_MISSING_RBRACKET 0x800a03ee
139#define JS_E_MISPLACED_RETURN 0x800a03fa
140
141#define DISPID_GLOBAL_TESTPROPGET 0x1000
142#define DISPID_GLOBAL_TESTPROPPUT 0x1001
143#define DISPID_GLOBAL_REPORTSUCCESS 0x1002
144#define DISPID_GLOBAL_TRACE 0x1003
145#define DISPID_GLOBAL_OK 0x1004
146#define DISPID_GLOBAL_GETVT 0x1005
147#define DISPID_GLOBAL_TESTOBJ 0x1006
148#define DISPID_GLOBAL_GETNULLBSTR 0x1007
149#define DISPID_GLOBAL_NULL_DISP 0x1008
150#define DISPID_GLOBAL_TESTTHIS 0x1009
151#define DISPID_GLOBAL_TESTTHIS2 0x100a
152#define DISPID_GLOBAL_INVOKEVERSION 0x100b
153#define DISPID_GLOBAL_CREATEARRAY 0x100c
154#define DISPID_GLOBAL_PROPGETFUNC 0x100d
155#define DISPID_GLOBAL_OBJECT_FLAG 0x100e
156#define DISPID_GLOBAL_ISWIN64 0x100f
157#define DISPID_GLOBAL_PUREDISP 0x1010
158#define DISPID_GLOBAL_ISNULLBSTR 0x1011
159#define DISPID_GLOBAL_PROPARGPUT 0x1012
160#define DISPID_GLOBAL_SHORTPROP 0x1013
161#define DISPID_GLOBAL_GETSHORT 0x1014
162#define DISPID_GLOBAL_TESTARGTYPES 0x1015
163#define DISPID_GLOBAL_INTPROP 0x1016
164#define DISPID_GLOBAL_DISPUNK 0x1017
165#define DISPID_GLOBAL_TESTRES 0x1018
166#define DISPID_GLOBAL_TESTNORES 0x1019
167#define DISPID_GLOBAL_DISPEXFUNC 0x101a
168#define DISPID_GLOBAL_TESTPROPPUTREF 0x101b
169#define DISPID_GLOBAL_GETSCRIPTSTATE 0x101c
170#define DISPID_GLOBAL_BINDEVENTHANDLER 0x101d
171#define DISPID_GLOBAL_TESTENUMOBJ 0x101e
172#define DISPID_GLOBAL_CALLEVAL 0x101f
173#define DISPID_GLOBAL_PROPARGPUTOP 0x1020
174#define DISPID_GLOBAL_THROWINT 0x1021
175#define DISPID_GLOBAL_THROWEI 0x1022
176#define DISPID_GLOBAL_VDATE 0x1023
177#define DISPID_GLOBAL_VCY 0x1024
178#define DISPID_GLOBAL_TODOWINE 0x1025
179#define DISPID_GLOBAL_TESTDESTROBJ 0x1026
180
181#define DISPID_GLOBAL_TESTPROPDELETE 0x2000
182#define DISPID_GLOBAL_TESTNOPROPDELETE 0x2001
183#define DISPID_GLOBAL_TESTPROPDELETEERROR 0x2002
184
185#define DISPID_TESTOBJ_PROP 0x2000
186#define DISPID_TESTOBJ_ONLYDISPID 0x2001
187#define DISPID_TESTOBJ_WITHPROP 0x2002
188#define DISPID_TESTOBJ_TOLOCALESTR 0x2003
189
190#define JS_E_OUT_OF_MEMORY 0x800a03ec
191#define JS_E_INVALID_CHAR 0x800a03f6
192
194static const char *test_name = "(null)";
196static int invoke_version;
201
202/* Returns true if the user interface is in English. Note that this does not
203 * presume of the formatting of dates, numbers, etc.
204 */
206{
207 static HMODULE hkernel32 = NULL;
208 static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
209 static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
210
211 if (!hkernel32)
212 {
213 hkernel32 = GetModuleHandleA("kernel32.dll");
214 pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
215 pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
216 }
217 if (pGetThreadUILanguage)
218 return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
219 if (pGetUserDefaultUILanguage)
220 return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
221
223}
224
225#define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
226static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
227{
228 expect |= invoke_version << 28;
229 ok_(__FILE__,line)(grfdex == expect, "grfdex = %lx, expected %lx\n", grfdex, expect);
230}
231
233{
235 ULONG ref;
236
237 hres = IActiveScript_Close(script);
238 ok(hres == S_OK, "Close failed: %08lx\n", hres);
239
240 ref = IActiveScript_Release(script);
241 ok(!ref, "ref=%lu\n", ref);
242}
243
245{
246 *ppv = NULL;
247
248 if (IsEqualGUID(riid, &IID_IEnumVARIANT))
249 *ppv = iface;
250 else
251 return E_NOINTERFACE;
252
253 return S_OK;
254}
255
257{
258 return 2;
259}
260
262{
263 return 1;
264}
265
266static int EnumVARIANT_index = 0;
270 ULONG celt,
271 VARIANT *rgVar,
272 ULONG *pCeltFetched)
273{
274 ok(rgVar != NULL, "rgVar is NULL\n");
275 ok(celt == 1, "celt = %ld\n", celt);
276 ok(pCeltFetched == NULL, "pCeltFetched is not NULL\n");
277
278 if (!rgVar)
279 return S_FALSE;
280
281 if (EnumVARIANT_index == 0)
282 {
285 CHECK_EXPECT(enumvariant_next_0);
286
287 V_VT(rgVar) = VT_I4;
288 V_I4(rgVar) = 123;
289
290 if (pCeltFetched)
291 *pCeltFetched = 1;
293 return S_OK;
294 }
295
296 CHECK_EXPECT(enumvariant_next_1);
297
298 if (pCeltFetched)
299 *pCeltFetched = 0;
300 return S_FALSE;
301
302}
303
306 ULONG celt)
307{
308 ok(0, "EnumVariant_Skip: unexpected call\n");
309 return E_NOTIMPL;
310}
313{
314 CHECK_EXPECT(enumvariant_reset);
316 return S_OK;
317}
318
321 IEnumVARIANT **ppEnum)
322{
323 ok(0, "EnumVariant_Clone: unexpected call\n");
324 return E_NOTIMPL;
325}
326
327static IEnumVARIANTVtbl testEnumVARIANTVtbl = {
335};
336
338
340{
341 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IServiceProvider, riid)) {
342 *ppv = iface;
343 return S_OK;
344 }
345
346 ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid));
347 *ppv = NULL;
348 return E_NOTIMPL;
349}
350
352{
353 return 2;
354}
355
357{
358 return 1;
359}
360
362{
363 ok(0, "unexpected call %s\n", wine_dbgstr_guid(guidService));
364 *ppv = NULL;
365 return E_NOTIMPL;
366}
367
368static const IServiceProviderVtbl sp_vtbl = {
370 sp_AddRef,
373};
374
376
378{
379 *ppv = NULL;
380
383 || IsEqualGUID(riid, &IID_IDispatchEx))
384 *ppv = iface;
385 else
386 return E_NOINTERFACE;
387
388 IUnknown_AddRef((IUnknown *)*ppv);
389 return S_OK;
390}
391
393{
394 return 2;
395}
396
398{
399 return 1;
400}
401
403{
404 ok(0, "unexpected call\n");
405 return E_NOTIMPL;
406}
407
409 LCID lcid, ITypeInfo **ppTInfo)
410{
411 return E_NOTIMPL;
412}
413
415 LPOLESTR *rgszNames, UINT cNames,
416 LCID lcid, DISPID *rgDispId)
417{
418 ok(0, "unexpected call\n");
419 return E_NOTIMPL;
420}
421
423 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
424 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
425{
426 ok(0, "unexpected call\n");
427 return E_NOTIMPL;
428}
429
431{
432 ok(0, "unexpected call\n");
433 return E_NOTIMPL;
434}
435
437 VARIANT *res, EXCEPINFO *pei, IServiceProvider *pspCaller)
438{
439 ok(0, "unexpected call\n");
440 return E_NOTIMPL;
441}
442
444{
445 ok(0, "unexpected call %s %lx\n", wine_dbgstr_w(bstrName), grfdex);
446 return E_NOTIMPL;
447}
448
450{
451 ok(0, "unexpected call\n");
452 return E_NOTIMPL;
453}
454
456{
457 ok(0, "unexpected call\n");
458 return E_NOTIMPL;
459}
460
462{
463 ok(0, "unexpected call\n");
464 return E_NOTIMPL;
465}
466
468{
469 ok(0, "unexpected call\n");
470 return E_NOTIMPL;
471}
472
474{
475 ok(0, "unexpected call\n");
476 return E_NOTIMPL;
477}
478
480 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
481 VARIANT *pvarRes, EXCEPINFO *pei, UINT *puArgErr)
482{
483 switch(id) {
484 case DISPID_NEWENUM:
485 ok(wFlags == (DISPATCH_METHOD | DISPATCH_PROPERTYGET), "wFlags = %x\n", wFlags);
486 ok(pdp != NULL, "pdp == NULL\n");
487 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
488 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
489 ok(pvarRes != NULL, "pvarRes == NULL\n");
490 ok(pei == NULL, "pei != NULL\n");
491
492 CHECK_EXPECT(testobj_newenum);
493 V_VT(pvarRes) = VT_DISPATCH;
495 return S_OK;
496 }
497
498 ok(0, "unexpected call %lx\n", id);
500}
501
502static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
503{
504 if(!lstrcmpW(bstrName, L"prop")) {
505 CHECK_EXPECT(testobj_prop_d);
506 test_grfdex(grfdex, fdexNameCaseSensitive);
508 return S_OK;
509 }
510 if(!lstrcmpW(bstrName, L"withProp")) {
511 CHECK_EXPECT(testobj_withprop_d);
512 test_grfdex(grfdex, fdexNameCaseSensitive|fdexNameImplicit);
514 return S_OK;
515 }
516 if(!lstrcmpW(bstrName, L"noprop")) {
517 CHECK_EXPECT(testobj_noprop_d);
518 test_grfdex(grfdex, fdexNameCaseSensitive);
519 return DISP_E_UNKNOWNNAME;
520 }
521 if(!lstrcmpW(bstrName, L"onlyDispID")) {
523 CHECK_EXPECT(testobj_onlydispid_d);
524 test_grfdex(grfdex, fdexNameCaseSensitive);
526 return S_OK;
527 }
528 if(!lstrcmpW(bstrName, L"toLocaleString")) {
529 CHECK_EXPECT(testobj_tolocalestr_d);
530 test_grfdex(grfdex, fdexNameCaseSensitive);
532 return S_OK;
533 }
534 if(!lstrcmpW(bstrName, L"notExists")) {
535 CHECK_EXPECT(testobj_notexists_d);
536 test_grfdex(grfdex, fdexNameCaseSensitive);
537 return DISP_E_UNKNOWNNAME;
538 }
539 if(!lstrcmpW(bstrName, L"getIDFail")) {
540 CHECK_EXPECT(testobj_getidfail_d);
541 return E_FAIL;
542 }
543
544 ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName));
545 return E_NOTIMPL;
546}
547
548static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
549 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
550{
551 ok(pspCaller != NULL, "pspCaller = NULL\n");
552
553 switch(id) {
554 case DISPID_VALUE:
555 ok(pdp != NULL, "pdp == NULL\n");
556 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
557 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
558 ok(pvarRes != NULL, "pvarRes == NULL\n");
559 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
560 ok(pei != NULL, "pei == NULL\n");
561
562 switch(wFlags) {
563 case INVOKE_PROPERTYGET:
564 CHECK_EXPECT(testobj_value);
565 ok(!pdp->rgvarg, "rgvarg != NULL\n");
566 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
567 break;
568 case INVOKE_FUNC:
569 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
570 break;
571 case INVOKE_FUNC|INVOKE_PROPERTYGET:
572 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
573 break;
574 case DISPATCH_CONSTRUCT:
575 CHECK_EXPECT(testobj_construct);
576 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
577 break;
578 default:
579 ok(0, "invalid flag (%x)\n", wFlags);
580 }
581
582 V_VT(pvarRes) = VT_I4;
583 V_I4(pvarRes) = 1;
584 return S_OK;
587 CHECK_EXPECT(testobj_onlydispid_i);
588 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
589 ok(pdp != NULL, "pdp == NULL\n");
590 ok(!pdp->rgvarg, "rgvarg != NULL\n");
591 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
592 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
593 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
594 ok(pvarRes != NULL, "pvarRes == NULL\n");
595 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
596 ok(pei != NULL, "pei == NULL\n");
599 CHECK_EXPECT(testobj_withprop_i);
600
601 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
602 ok(pdp != NULL, "pdp == NULL\n");
603 ok(!pdp->rgvarg, "rgvarg != NULL\n");
604 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
605 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
606 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
607 ok(pvarRes != NULL, "pvarRes == NULL\n");
608 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
609 ok(pei != NULL, "pei == NULL\n");
610
611 V_VT(pvarRes) = VT_I4;
612 V_I4(pvarRes) = 1;
613
614 return S_OK;
616 CHECK_EXPECT(testobj_tolocalestr_i);
617
618 ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
619 ok(pdp != NULL, "pdp == NULL\n");
620 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
621 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
622 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
623 ok(pvarRes != NULL, "pvarRes == NULL\n");
624 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
625 ok(pei != NULL, "pei == NULL\n");
626
627 V_VT(pvarRes) = VT_I4;
628 V_I4(pvarRes) = 1234;
629
630 return S_OK;
631 }
632
633 ok(0, "unexpected call %lx\n", id);
635}
636
638{
639 if(!lstrcmpW(bstrName, L"deleteTest")) {
640 CHECK_EXPECT(testobj_delete_test);
641 test_grfdex(grfdex, fdexNameCaseSensitive);
642 return S_OK;
643 }
644 if(!lstrcmpW(bstrName, L"noDeleteTest")) {
645 CHECK_EXPECT(testobj_delete_nodelete);
646 test_grfdex(grfdex, fdexNameCaseSensitive);
647 return S_FALSE;
648 }
649
650 ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName));
651 return E_FAIL;
652}
653
654static IDispatchExVtbl testObjVtbl = {
670};
671
673
675 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
676{
677 ok(id == DISPID_VALUE, "id = %ld\n", id);
678 ok(pdp != NULL, "pdp == NULL\n");
679 ok(pvarRes != NULL, "pvarRes == NULL\n");
680 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
682 CHECK_EXPECT(test_caller_get);
683 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
684 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
685 ok(pei != NULL, "pei == NULL\n");
686 ok(pspCaller != NULL, "pspCaller == NULL\n");
687 ok(pspCaller != &sp_obj, "pspCaller == sp_obj\n");
688 V_VT(pvarRes) = VT_DISPATCH;
689 V_DISPATCH(pvarRes) = (IDispatch*)iface;
690 }else if(pspCaller) {
691 CHECK_EXPECT(test_caller_obj);
692 ok(wFlags == DISPATCH_METHOD, "wFlags = %04x\n", wFlags);
693 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
694 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
695 ok(pspCaller == &sp_obj, "pspCaller != sp_obj\n");
696 V_VT(pvarRes) = VT_I4;
697 V_I4(pvarRes) = 137;
698 }else {
699 CHECK_EXPECT(test_caller_null);
700 ok(wFlags == DISPATCH_METHOD, "wFlags = %04x\n", wFlags);
701 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
702 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
703 V_VT(pvarRes) = VT_I4;
704 V_I4(pvarRes) = 42;
705 }
706 return S_OK;
707}
708
709static IDispatchExVtbl testcallerobj_vtbl = {
725};
726
728
730
732{
733 return ++test_destr_ref;
734}
735
737{
738 if (!--test_destr_ref)
739 CHECK_EXPECT(testdestrobj);
740 return test_destr_ref;
741}
742
743static IDispatchExVtbl testDestrObjVtbl = {
759};
760
762
764 VARIANT *res, EXCEPINFO *pei, IServiceProvider *pspCaller)
765{
766 ok(pspCaller != NULL, "pspCaller = NULL\n");
767
768 switch(id) {
769 case DISPID_VALUE:
770 CHECK_EXPECT(dispexfunc_value);
771
772 ok(pdp != NULL, "pdp == NULL\n");
773 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
774 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs != NULL\n");
775 ok(*pdp->rgdispidNamedArgs == DISPID_THIS, "*rgdispidNamedArgs = %ld\n", *pdp->rgdispidNamedArgs);
776 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
777 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
778 ok(res != NULL, "res == NULL\n");
779 ok(pei != NULL, "pei == NULL\n");
780
781 ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
782
783 if(V_BOOL(pdp->rgvarg+1))
784 /* NOTE: If called by Function.apply(), native doesn't set DISPATCH_PROPERTYGET flag. */
785 todo_wine ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
786 else
787 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
788
789 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
790 ok(V_DISPATCH(pdp->rgvarg) != NULL, "V_DISPATCH(pdp->rgvarg) == NULL\n");
791
792 if(res)
793 V_VT(res) = VT_NULL;
794 return S_OK;
795 default:
796 ok(0, "unexpected call %lx\n", id);
798 }
799}
800
801static IDispatchExVtbl dispexFuncVtbl = {
817};
818
820
822{
824 *ppv = iface;
825 return S_OK;
826 }
827
828 *ppv = NULL;
829 return E_NOINTERFACE;
830}
831
833 LPOLESTR *rgszNames, UINT cNames,
834 LCID lcid, DISPID *rgDispId)
835{
836 ok(IsEqualGUID(riid, &IID_NULL), "Expected IID_NULL\n");
837 ok(cNames==1, "cNames = %d\n", cNames);
838
839 if(!lstrcmpW(*rgszNames, L"prop")) {
840 CHECK_EXPECT(puredisp_prop_d);
841 *rgDispId = DISPID_TESTOBJ_PROP;
842 return S_OK;
843 } else if(!lstrcmpW(*rgszNames, L"noprop")) {
844 CHECK_EXPECT(puredisp_noprop_d);
845 return DISP_E_UNKNOWNNAME;
846 }
847
848 ok(0, "unexpected call\n");
849 return E_NOTIMPL;
850}
851
853 WORD wFlags, DISPPARAMS *pdp, VARIANT *res, EXCEPINFO *ei, UINT *puArgErr)
854{
855 ok(IsEqualGUID(&IID_NULL, riid), "unexpected riid\n");
856
857 switch(dispIdMember) {
858 case DISPID_VALUE:
859 CHECK_EXPECT(puredisp_value);
860
861 ok(pdp != NULL, "pdp == NULL\n");
862 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
863 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
864 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
865 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
866 ok(res != NULL, "res == NULL\n");
867 ok(ei != NULL, "ei == NULL\n");
868 ok(puArgErr != NULL, "puArgErr == NULL\n");
869
870 ok(V_VT(pdp->rgvarg) == VT_BOOL, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
871
872 if(V_BOOL(pdp->rgvarg))
873 todo_wine ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
874 else
875 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
876
877 if(res)
878 V_VT(res) = VT_NULL;
879 return S_OK;
880 default:
881 ok(0, "unexpected call\n");
882 return E_NOTIMPL;
883 }
884}
885
886static IDispatchExVtbl pureDispVtbl = {
894};
895
897
899{
900 ok(0, "unexpected call\n");
901 return E_NOINTERFACE;
902}
903
905{
906 return 2;
907}
908
910{
911 return 1;
912}
913
915{
916 CHECK_EXPECT(BindHandler);
917 ok(!lstrcmpW(event, L"eventName"), "event = %s\n", wine_dbgstr_w(event));
918 ok(disp != NULL, "disp = NULL\n");
919 return S_OK;
920}
921
922static const IBindEventHandlerVtbl BindEventHandlerVtbl = {
927};
928
930
932{
933 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch) || IsEqualGUID(riid, &IID_IDispatchEx)) {
934 *ppv = iface;
935 return S_OK;
936 }
937
938 if(IsEqualGUID(riid, &IID_IBindEventHandler)) {
940 return S_OK;
941 }
942
943 *ppv = NULL;
944 return E_NOINTERFACE;
945}
946
947static IDispatchExVtbl bindEventHandlerDispVtbl = {
963};
964
966
967static HRESULT CALLBACK test_deferred_fill_in(struct tagEXCEPINFO *ei)
968{
969 ok(ei->pfnDeferredFillIn == test_deferred_fill_in, "pfnDeferredFillIn != test_deferred_fill_in\n");
970 ok(!wcscmp(ei->bstrSource, L"source before defer"), "bstrSource = %s\n", wine_dbgstr_w(ei->bstrSource));
971 ok(!wcscmp(ei->bstrDescription, L"desc before defer"), "bstrDescription = %s\n", wine_dbgstr_w(ei->bstrDescription));
972 ok(!wcscmp(ei->bstrHelpFile, L"help before defer"), "bstrHelpFile = %s\n", wine_dbgstr_w(ei->bstrHelpFile));
973 ok(ei->dwHelpContext == 1337, "dwHelpContext = %lu\n", ei->dwHelpContext);
974
975 SysFreeString(ei->bstrSource);
976 SysFreeString(ei->bstrDescription);
977 SysFreeString(ei->bstrHelpFile);
978 ei->pfnDeferredFillIn = NULL;
979 ei->bstrSource = SysAllocString(L"source after defer");
980 ei->bstrDescription = SysAllocString(L"desc after defer");
981 ei->bstrHelpFile = SysAllocString(L"help after defer");
982 ei->dwHelpContext = 1234567890;
983
984 return E_FAIL; /* return code ignored */
985}
986
987static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
988{
989 if(!lstrcmpW(bstrName, L"ok")) {
990 test_grfdex(grfdex, fdexNameCaseSensitive);
992 return S_OK;
993 }
994 if(!lstrcmpW(bstrName, L"trace")) {
995 test_grfdex(grfdex, fdexNameCaseSensitive);
997 return S_OK;
998 }
999 if(!lstrcmpW(bstrName, L"todo_wine_ok")) {
1000 test_grfdex(grfdex, fdexNameCaseSensitive);
1002 return S_OK;
1003 }
1004 if(!lstrcmpW(bstrName, L"reportSuccess")) {
1005 CHECK_EXPECT(global_success_d);
1006 test_grfdex(grfdex, fdexNameCaseSensitive);
1008 return S_OK;
1009 }
1010 if(!lstrcmpW(bstrName, L"testPropGet")) {
1011 CHECK_EXPECT(global_propget_d);
1012 test_grfdex(grfdex, fdexNameCaseSensitive);
1014 return S_OK;
1015 }
1016 if(!lstrcmpW(bstrName, L"testPropPut")) {
1017 CHECK_EXPECT(global_propput_d);
1018 test_grfdex(grfdex, fdexNameCaseSensitive);
1020 return S_OK;
1021 }
1022 if(!lstrcmpW(bstrName, L"testPropPutRef")) {
1023 CHECK_EXPECT(global_propputref_d);
1024 test_grfdex(grfdex, fdexNameCaseSensitive);
1026 return S_OK;
1027 }
1028 if(!lstrcmpW(bstrName, L"testPropDelete")) {
1029 CHECK_EXPECT(global_propdelete_d);
1030 test_grfdex(grfdex, fdexNameCaseSensitive);
1032 return S_OK;
1033 }
1034 if(!lstrcmpW(bstrName, L"testNoPropDelete")) {
1035 CHECK_EXPECT(global_nopropdelete_d);
1036 test_grfdex(grfdex, fdexNameCaseSensitive);
1038 return S_OK;
1039 }
1040 if(!lstrcmpW(bstrName, L"testPropDeleteError")) {
1041 CHECK_EXPECT(global_propdeleteerror_d);
1042 test_grfdex(grfdex, fdexNameCaseSensitive);
1044 return S_OK;
1045 }
1046 if(!lstrcmpW(bstrName, L"getVT")) {
1047 test_grfdex(grfdex, fdexNameCaseSensitive);
1049 return S_OK;
1050 }
1051 if(!lstrcmpW(bstrName, L"testObj")) {
1052 test_grfdex(grfdex, fdexNameCaseSensitive);
1054 return S_OK;
1055 }
1056 if(!lstrcmpW(bstrName, L"getNullBSTR")) {
1058 return S_OK;
1059 }
1060 if(!lstrcmpW(bstrName, L"isNullBSTR")) {
1062 return S_OK;
1063 }
1064 if(!lstrcmpW(bstrName, L"nullDisp")) {
1066 return S_OK;
1067 }
1068 if(!lstrcmpW(bstrName, L"notExists")) {
1069 CHECK_EXPECT(global_notexists_d);
1070 test_grfdex(grfdex, fdexNameCaseSensitive);
1071 return DISP_E_UNKNOWNNAME;
1072 }
1073
1074 if(!lstrcmpW(bstrName, L"testThis")) {
1075 test_grfdex(grfdex, fdexNameCaseSensitive);
1077 return S_OK;
1078 }
1079
1080 if(!lstrcmpW(bstrName, L"testThis2")) {
1081 test_grfdex(grfdex, fdexNameCaseSensitive);
1083 return S_OK;
1084 }
1085
1086 if(!lstrcmpW(bstrName, L"invokeVersion")) {
1087 test_grfdex(grfdex, fdexNameCaseSensitive);
1089 return S_OK;
1090 }
1091 if(!lstrcmpW(bstrName, L"createArray")) {
1092 test_grfdex(grfdex, fdexNameCaseSensitive);
1094 return S_OK;
1095 }
1096 if(!lstrcmpW(bstrName, L"propGetFunc")) {
1097 test_grfdex(grfdex, fdexNameCaseSensitive);
1099 return S_OK;
1100 }
1101 if(!lstrcmpW(bstrName, L"objectFlag")) {
1102 test_grfdex(grfdex, fdexNameCaseSensitive);
1104 return S_OK;
1105 }
1106
1107 if(!lstrcmpW(bstrName, L"isWin64")) {
1108 test_grfdex(grfdex, fdexNameCaseSensitive);
1110 return S_OK;
1111 }
1112
1113 if(!lstrcmpW(bstrName, L"pureDisp")) {
1114 test_grfdex(grfdex, fdexNameCaseSensitive);
1116 return S_OK;
1117 }
1118
1119 if(!lstrcmpW(bstrName, L"propArgPutG")) {
1120 CHECK_EXPECT(global_propargput_d);
1121 test_grfdex(grfdex, fdexNameCaseSensitive);
1123 return S_OK;
1124 }
1125
1126 if(!lstrcmpW(bstrName, L"propArgPutOp")) {
1127 CHECK_EXPECT(global_propargputop_d);
1128 test_grfdex(grfdex, fdexNameCaseSensitive);
1130 return S_OK;
1131 }
1132
1133 if(!lstrcmpW(bstrName, L"throwInt")) {
1134 test_grfdex(grfdex, fdexNameCaseSensitive);
1136 return S_OK;
1137 }
1138
1139 if(!lstrcmpW(bstrName, L"throwEI")) {
1140 test_grfdex(grfdex, fdexNameCaseSensitive);
1142 return S_OK;
1143 }
1144
1145 if(!lstrcmpW(bstrName, L"propArgPutO")) {
1146 CHECK_EXPECT(global_propargput_d);
1147 test_grfdex(grfdex, fdexNameEnsure|fdexNameCaseSensitive);
1149 return S_OK;
1150 }
1151
1152 if(!lstrcmpW(bstrName, L"shortProp")) {
1154 return S_OK;
1155 }
1156
1157 if(!lstrcmpW(bstrName, L"getShort")) {
1159 return S_OK;
1160 }
1161
1162 if(!lstrcmpW(bstrName, L"v_date")) {
1164 return S_OK;
1165 }
1166
1167 if(!lstrcmpW(bstrName, L"v_cy")) {
1169 return S_OK;
1170 }
1171
1172 if(!lstrcmpW(bstrName, L"testArgTypes")) {
1174 return S_OK;
1175 }
1176
1177 if(!lstrcmpW(bstrName, L"intProp")) {
1179 return S_OK;
1180 }
1181
1182 if(!lstrcmpW(bstrName, L"dispUnk")) {
1184 return S_OK;
1185 }
1186
1187 if(!lstrcmpW(bstrName, L"testRes")) {
1189 return S_OK;
1190 }
1191
1192 if(!lstrcmpW(bstrName, L"testNoRes")) {
1194 return S_OK;
1195 }
1196
1197 if(!lstrcmpW(bstrName, L"dispexFunc")) {
1199 return S_OK;
1200 }
1201
1202 if(!lstrcmpW(bstrName, L"getScriptState")) {
1204 return S_OK;
1205 }
1206
1207 if(!lstrcmpW(bstrName, L"bindEventHandler")) {
1209 return S_OK;
1210 }
1211
1212 if(!lstrcmpW(bstrName, L"testEnumObj")) {
1214 return S_OK;
1215 }
1216
1217 if(!lstrcmpW(bstrName, L"callEval")) {
1219 return S_OK;
1220 }
1221
1222 if(!lstrcmpW(bstrName, L"testDestrObj")) {
1224 return S_OK;
1225 }
1226
1227 if(strict_dispid_check && lstrcmpW(bstrName, L"t"))
1228 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
1229 return DISP_E_UNKNOWNNAME;
1230}
1231
1232static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
1233 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
1234{
1235 ok(pspCaller != NULL, "pspCaller = NULL\n");
1236
1237 switch(id) {
1238 case DISPID_GLOBAL_OK:
1239 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1240 ok(pdp != NULL, "pdp == NULL\n");
1241 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1242 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1243 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1244 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1245 if(wFlags & INVOKE_PROPERTYGET)
1246 ok(pvarRes != NULL, "pvarRes == NULL\n");
1247 else
1248 ok(!pvarRes, "pvarRes != NULL\n");
1249 ok(pei != NULL, "pei == NULL\n");
1250
1251 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1252 ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1253#ifndef __REACTOS__ // Fails on Windows 2003
1254 ok(V_BOOL(pdp->rgvarg+1), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
1255#endif
1256
1257 return S_OK;
1258
1260 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1261 ok(pdp != NULL, "pdp == NULL\n");
1262 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1263 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1264 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1265 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1266 if(wFlags & INVOKE_PROPERTYGET)
1267 ok(pvarRes != NULL, "pvarRes == NULL\n");
1268 else
1269 ok(!pvarRes, "pvarRes != NULL\n");
1270 ok(pei != NULL, "pei == NULL\n");
1271
1272 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1273 ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1274 todo_wine ok(V_BOOL(pdp->rgvarg+1), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
1275
1276 return S_OK;
1277
1279 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1280 ok(pdp != NULL, "pdp == NULL\n");
1281 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1282 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1283 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1284 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1285 ok(!pvarRes, "pvarRes != NULL\n");
1286 ok(pei != NULL, "pei == NULL\n");
1287
1288 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1289 if(V_VT(pdp->rgvarg) == VT_BSTR)
1290 trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
1291
1292 return S_OK;
1293
1295 CHECK_EXPECT(global_success_i);
1296
1297 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1298 ok(pdp != NULL, "pdp == NULL\n");
1299 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1300 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
1301 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1302 if(!testing_expr)
1303 ok(!pvarRes, "pvarRes != NULL\n");
1304 ok(pei != NULL, "pei == NULL\n");
1305
1306 return S_OK;
1307
1309 CHECK_EXPECT(global_propget_i);
1310
1311 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1312 ok(pdp != NULL, "pdp == NULL\n");
1313 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1314 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1315 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1316 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1317 ok(pvarRes != NULL, "pvarRes == NULL\n");
1318 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1319 ok(pei != NULL, "pei == NULL\n");
1320
1321 V_VT(pvarRes) = VT_I4;
1322 V_I4(pvarRes) = 1;
1323
1324 return S_OK;
1325
1327 CHECK_EXPECT(global_propput_i);
1328
1329 ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags);
1330 ok(pdp != NULL, "pdp == NULL\n");
1331 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1332 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1333 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1334 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1335 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
1336 ok(!pvarRes, "pvarRes != NULL\n");
1337
1338 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg));
1339 ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg)=%ld\n", V_I4(pdp->rgvarg));
1340 return S_OK;
1341
1343 CHECK_EXPECT(global_propputref_i);
1344
1345 ok(wFlags == (INVOKE_PROPERTYPUT|INVOKE_PROPERTYPUTREF), "wFlags = %x\n", wFlags);
1346 ok(pdp != NULL, "pdp == NULL\n");
1347 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1348 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1349 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1350 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1351 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
1352 ok(!pvarRes, "pvarRes != NULL\n");
1353
1354 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg));
1355 return S_OK;
1356
1358 ok(pdp != NULL, "pdp == NULL\n");
1359 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1360 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1361 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1362 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1363 ok(pvarRes != NULL, "pvarRes == NULL\n");
1364 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1365 ok(pei != NULL, "pei == NULL\n");
1366
1367 V_VT(pvarRes) = VT_BSTR;
1368 switch(V_VT(pdp->rgvarg)) {
1369 case VT_EMPTY:
1370 V_BSTR(pvarRes) = SysAllocString(L"VT_EMPTY");
1371 break;
1372 case VT_NULL:
1373 V_BSTR(pvarRes) = SysAllocString(L"VT_NULL");
1374 break;
1375 case VT_I4:
1376 V_BSTR(pvarRes) = SysAllocString(L"VT_I4");
1377 break;
1378 case VT_R8:
1379 V_BSTR(pvarRes) = SysAllocString(L"VT_R8");
1380 break;
1381 case VT_BSTR:
1382 V_BSTR(pvarRes) = SysAllocString(L"VT_BSTR");
1383 break;
1384 case VT_DISPATCH:
1385 V_BSTR(pvarRes) = SysAllocString(L"VT_DISPATCH");
1386 break;
1387 case VT_BOOL:
1388 V_BSTR(pvarRes) = SysAllocString(L"VT_BOOL");
1389 break;
1390 case VT_ARRAY|VT_VARIANT:
1391 V_BSTR(pvarRes) = SysAllocString(L"VT_ARRAY|VT_VARIANT");
1392 break;
1393 case VT_DATE:
1394 V_BSTR(pvarRes) = SysAllocString(L"VT_DATE");
1395 break;
1396 default:
1397 ok(0, "unknown vt %d\n", V_VT(pdp->rgvarg));
1398 return E_FAIL;
1399 }
1400
1401 return S_OK;
1402
1404 ok(pvarRes != NULL, "pvarRes = NULL\n");
1405 if(pvarRes) {
1406 V_VT(pvarRes) = VT_BOOL;
1407 V_BOOL(pvarRes) = VARIANT_TRUE;
1408 }
1409 return S_OK;
1410
1412 ok(!pvarRes, "pvarRes != NULL\n");
1413 if(pvarRes)
1414 V_VT(pvarRes) = VT_NULL;
1415 return S_OK;
1416
1418 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1419 ok(pdp != NULL, "pdp == NULL\n");
1420 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1421 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1422 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1423 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1424 ok(pvarRes != NULL, "pvarRes == NULL\n");
1425 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1426 ok(pei != NULL, "pei == NULL\n");
1427
1428 V_VT(pvarRes) = VT_DISPATCH;
1429 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
1430 return S_OK;
1431
1433 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1434 ok(pdp != NULL, "pdp == NULL\n");
1435 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1436 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1437 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1438 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1439 ok(pvarRes != NULL, "pvarRes == NULL\n");
1440 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1441 ok(pei != NULL, "pei == NULL\n");
1442
1443 V_VT(pvarRes) = VT_DISPATCH;
1444 V_DISPATCH(pvarRes) = (IDispatch*)&testDestrObj;
1445 IDispatch_AddRef(V_DISPATCH(pvarRes));
1446 return S_OK;
1447
1449 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1450 ok(pdp != NULL, "pdp == NULL\n");
1451 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1452 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1453 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1454 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1455 ok(pvarRes != NULL, "pvarRes == NULL\n");
1456 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1457 ok(pei != NULL, "pei == NULL\n");
1458
1459 V_VT(pvarRes) = VT_DISPATCH;
1460 V_DISPATCH(pvarRes) = (IDispatch*)&pureDisp;
1461 return S_OK;
1462
1464 V_VT(pvarRes) = VT_DISPATCH;
1465 V_DISPATCH(pvarRes) = (IDispatch*)&dispexFunc;
1466 return S_OK;
1467
1469 if(pvarRes) {
1470 V_VT(pvarRes) = VT_BSTR;
1471 V_BSTR(pvarRes) = NULL;
1472 }
1473 return S_OK;
1474
1476 ok(pdp != NULL, "pdp == NULL\n");
1477 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1478 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1479 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1480 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1481 ok(pvarRes != NULL, "pvarRes == NULL\n");
1482 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1483 ok(pei != NULL, "pei == NULL\n");
1484 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1485
1486 V_VT(pvarRes) = VT_BOOL;
1487 V_BOOL(pvarRes) = V_BSTR(pdp->rgvarg) ? VARIANT_FALSE : VARIANT_TRUE;
1488 return S_OK;
1489
1491 if(pvarRes) {
1492 V_VT(pvarRes) = VT_BOOL;
1493 V_BOOL(pvarRes) = sizeof(void*) == 8 ? VARIANT_TRUE : VARIANT_FALSE;
1494 }
1495 return S_OK;
1496
1498 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1499 ok(pdp != NULL, "pdp == NULL\n");
1500 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1501 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1502 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1503 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1504 ok(pvarRes != NULL, "pvarRes == NULL\n");
1505 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1506 ok(pei != NULL, "pei == NULL\n");
1507
1508 V_VT(pvarRes) = VT_DISPATCH;
1509 V_DISPATCH(pvarRes) = NULL;
1510 return S_OK;
1511
1513 ok(pdp != NULL, "pdp == NULL\n");
1514 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1515 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1516 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1517 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1518 ok(pvarRes == NULL, "pvarRes != NULL\n");
1519 ok(pei != NULL, "pei == NULL\n");
1520
1521 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1522 ok(V_DISPATCH(pdp->rgvarg) == (IDispatch*)iface, "disp != iface\n");
1523
1524 return S_OK;
1525
1527 ok(pdp != NULL, "pdp == NULL\n");
1528 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1529 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1530 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1531 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1532 ok(pvarRes == NULL, "pvarRes != NULL\n");
1533 ok(pei != NULL, "pei == NULL\n");
1534
1535 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
1536 ok(V_DISPATCH(pdp->rgvarg) != (IDispatch*)iface, "disp == iface\n");
1537 ok(V_DISPATCH(pdp->rgvarg) == script_disp, "disp != script_disp\n");
1538
1539 return S_OK;
1540
1542 ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
1543 ok(pdp != NULL, "pdp == NULL\n");
1544 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1545 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1546 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1547 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1548 ok(pvarRes != NULL, "pvarRes == NULL\n");
1549 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1550 ok(pei != NULL, "pei == NULL\n");
1551
1552 V_VT(pvarRes) = VT_I4;
1553 V_I4(pvarRes) = invoke_version;
1554
1555 return S_OK;
1556
1558 SAFEARRAYBOUND bound[2];
1559 VARIANT *data;
1560 int i,j;
1561
1562 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1563 ok(pdp != NULL, "pdp == NULL\n");
1564 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1565 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1566 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1567 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1568 ok(pvarRes != NULL, "pvarRes == NULL\n");
1569 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1570 ok(pei != NULL, "pei == NULL\n");
1571
1572 bound[0].lLbound = 0;
1573 bound[0].cElements = 5;
1574 bound[1].lLbound = 2;
1575 bound[1].cElements = 2;
1576
1577 V_VT(pvarRes) = VT_ARRAY|VT_VARIANT;
1578 V_ARRAY(pvarRes) = SafeArrayCreate(VT_VARIANT, 2, bound);
1579
1580 SafeArrayAccessData(V_ARRAY(pvarRes), (void**)&data);
1581 for(i=0; i<5; i++) {
1582 for(j=2; j<4; j++) {
1583 V_VT(data) = VT_I4;
1584 V_I4(data) = i*10+j;
1585 data++;
1586 }
1587 }
1589
1590 return S_OK;
1591 }
1592
1594 switch(wFlags) {
1595 case INVOKE_FUNC:
1596 CHECK_EXPECT(invoke_func);
1597 break;
1598 case INVOKE_FUNC|INVOKE_PROPERTYGET:
1599 ok(pdp->cArgs != 0, "pdp->cArgs = %d\n", pdp->cArgs);
1600 ok(pvarRes != NULL, "pdp->pvarRes == NULL\n");
1601 break;
1602 default:
1603 ok(0, "invalid flag (%x)\n", wFlags);
1604 }
1605
1606 ok(pdp != NULL, "pdp == NULL\n");
1607 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1608 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1609 ok(pei != NULL, "pei == NULL\n");
1610
1611 if(pvarRes) {
1612 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1613 V_VT(pvarRes) = VT_I4;
1614 V_I4(pvarRes) = pdp->cArgs;
1615 }
1616
1617 return S_OK;
1618
1621 HRESULT hres;
1622
1623 hres = IActiveScript_GetScriptState(script_engine, &state);
1624 ok(hres == S_OK, "GetScriptState failed: %08lx\n", hres);
1625
1626 V_VT(pvarRes) = VT_I4;
1627 V_I4(pvarRes) = state;
1628 return S_OK;
1629 }
1630
1632 V_VT(pvarRes) = VT_DISPATCH;
1634 return S_OK;
1635
1637 CHECK_EXPECT(global_propargput_i);
1638 ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags);
1639 ok(pdp != NULL, "pdp == NULL\n");
1640 ok(pdp->rgvarg != NULL, "rgvarg != NULL\n");
1641 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1642 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1643 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1644 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
1645 ok(!pvarRes, "pvarRes != NULL\n");
1646 ok(pei != NULL, "pei == NULL\n");
1647
1648 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1649 ok(V_I4(pdp->rgvarg) == 2, "V_I4(pdp->rgvarg) = %ld\n", V_I4(pdp->rgvarg));
1650
1651 ok(V_VT(pdp->rgvarg+1) == VT_I4, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1652 ok(V_I4(pdp->rgvarg+1) == 1, "V_I4(pdp->rgvarg+1) = %ld\n", V_I4(pdp->rgvarg+1));
1653
1654 ok(V_VT(pdp->rgvarg+2) == VT_I4, "V_VT(pdp->rgvarg+2) = %d\n", V_VT(pdp->rgvarg+2));
1655 ok(V_I4(pdp->rgvarg+2) == 0, "V_I4(pdp->rgvarg+2) = %ld\n", V_I4(pdp->rgvarg+2));
1656 return S_OK;
1657
1659 ok(pdp != NULL, "pdp == NULL\n");
1660 ok(pdp->rgvarg != NULL, "rgvarg != NULL\n");
1661 ok(pei != NULL, "pei == NULL\n");
1662
1663 switch(wFlags) {
1664 case INVOKE_PROPERTYGET | INVOKE_FUNC:
1665 CHECK_EXPECT(global_propargputop_get_i);
1666
1667 ok(pdp->cNamedArgs == 0, "cNamedArgs = %d\n", pdp->cNamedArgs);
1668 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1669 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1670 ok(pdp->cNamedArgs == 0, "cNamedArgs = %d\n", pdp->cNamedArgs);
1671 ok(pvarRes != NULL, "pvarRes = NULL\n");
1672
1673 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1674 ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg) = %ld\n", V_I4(pdp->rgvarg));
1675
1676 ok(V_VT(pdp->rgvarg+1) == VT_I4, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1677 ok(V_I4(pdp->rgvarg+1) == 0, "V_I4(pdp->rgvarg+1) = %ld\n", V_I4(pdp->rgvarg+1));
1678
1679 V_VT(pvarRes) = VT_I4;
1680 V_I4(pvarRes) = 6;
1681 break;
1682 case INVOKE_PROPERTYPUT:
1683 CHECK_EXPECT(global_propargputop_put_i);
1684
1685 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1686 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %ld\n", pdp->rgdispidNamedArgs[0]);
1687 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1688 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1689 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1690 ok(!pvarRes, "pvarRes != NULL\n");
1691
1692 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1693 ok(V_I4(pdp->rgvarg) == 8, "V_I4(pdp->rgvarg) = %ld\n", V_I4(pdp->rgvarg));
1694
1695 ok(V_VT(pdp->rgvarg+1) == VT_I4, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1696 ok(V_I4(pdp->rgvarg+1) == 1, "V_I4(pdp->rgvarg+1) = %ld\n", V_I4(pdp->rgvarg+1));
1697
1698 ok(V_VT(pdp->rgvarg+2) == VT_I4, "V_VT(pdp->rgvarg+2) = %d\n", V_VT(pdp->rgvarg+2));
1699 ok(V_I4(pdp->rgvarg+2) == 0, "V_I4(pdp->rgvarg+2) = %ld\n", V_I4(pdp->rgvarg+2));
1700 break;
1701 default:
1702 ok(0, "wFlags = %x\n", wFlags);
1703 }
1704
1705 return S_OK;
1706
1708 IDispatchEx *dispex;
1709 BSTR str;
1710 HRESULT hres;
1711
1712 hres = IDispatch_QueryInterface(script_disp, &IID_IDispatchEx, (void**)&dispex);
1713 ok(hres == S_OK, "hres = %lx\n", hres);
1714
1715 str = SysAllocString(L"Object");
1716 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
1718 ok(hres == S_OK, "hres = %lx\n", hres);
1719
1720 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, NULL, pei, pspCaller);
1721 ok(hres == S_OK, "hres = %lx\n", hres);
1722
1723 V_VT(pvarRes) = VT_EMPTY;
1724 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, pvarRes, pei, pspCaller);
1725 ok(hres == S_OK, "hres = %lx\n", hres);
1726 ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1727 VariantClear(pvarRes);
1728
1729 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD|DISPATCH_PROPERTYGET, pdp, NULL, pei, pspCaller);
1730 ok(hres == S_OK, "hres = %lx\n", hres);
1731
1732 V_VT(pvarRes) = VT_EMPTY;
1733 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, pvarRes, pei, pspCaller);
1734 ok(hres == S_OK, "hres = %lx\n", hres);
1735 ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1736 VariantClear(pvarRes);
1737
1738 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, NULL, pei, pspCaller);
1739 ok(hres == S_OK, "hres = %lx\n", hres);
1740
1741 V_VT(pvarRes) = VT_EMPTY;
1742 hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT|DISPATCH_PROPERTYGET, pdp, pvarRes, pei, pspCaller);
1743 ok(hres == E_INVALIDARG, "hres = %lx\n", hres);
1744
1745 V_VT(pvarRes) = VT_EMPTY;
1746 hres = IDispatchEx_InvokeEx(dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
1747 ok(hres == S_OK, "hres = %lx\n", hres);
1748 ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1749 IDispatchEx_Release(dispex);
1750 return S_OK;
1751 }
1754 V_VT(pvarRes) = VT_I2;
1755 V_I2(pvarRes) = 10;
1756 return S_OK;
1757
1759 ok(wFlags == (DISPATCH_METHOD|DISPATCH_PROPERTYGET), "wFlags = %x\n", wFlags);
1760 ok(pdp != NULL, "pdp == NULL\n");
1761 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1762 ok(pvarRes != NULL, "pvarRes != NULL\n");
1763 V_VT(pvarRes) = VT_DATE;
1764 switch(V_VT(pdp->rgvarg))
1765 {
1766 case VT_I4:
1767 V_DATE(pvarRes) = V_I4(pdp->rgvarg);
1768 break;
1769 case VT_R8:
1770 V_DATE(pvarRes) = V_R8(pdp->rgvarg);
1771 break;
1772 default:
1773 ok(0, "vt = %u\n", V_VT(pdp->rgvarg));
1774 return E_INVALIDARG;
1775 }
1776 return S_OK;
1777
1778 case DISPID_GLOBAL_VCY:
1779 ok(wFlags == (DISPATCH_METHOD|DISPATCH_PROPERTYGET), "wFlags = %x\n", wFlags);
1780 ok(pdp != NULL, "pdp == NULL\n");
1781 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1782 ok(pvarRes != NULL, "pvarRes != NULL\n");
1783 V_VT(pvarRes) = VT_CY;
1784 switch(V_VT(pdp->rgvarg))
1785 {
1786 case VT_I4:
1787 V_CY(pvarRes).int64 = V_I4(pdp->rgvarg);
1788 break;
1789 case VT_R8:
1790 V_CY(pvarRes).int64 = V_R8(pdp->rgvarg);
1791 break;
1792 default:
1793 ok(0, "vt = %u\n", V_VT(pdp->rgvarg));
1794 return E_INVALIDARG;
1795 }
1796 return S_OK;
1797
1799 V_VT(pvarRes) = VT_INT;
1800 V_INT(pvarRes) = 22;
1801 return S_OK;
1802
1804 V_VT(pvarRes) = VT_UNKNOWN;
1805 V_UNKNOWN(pvarRes) = (IUnknown*)&testObj;
1806 return S_OK;
1807
1809 VARIANT args[10], v;
1810 DISPPARAMS dp = {args, NULL, ARRAY_SIZE(args), 0};
1811 HRESULT hres;
1812
1813 CHECK_EXPECT(global_testargtypes_i);
1814 ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
1815 ok(pdp != NULL, "pdp == NULL\n");
1816 ok(pdp->rgvarg != NULL, "rgvarg != NULL\n");
1817 ok(pdp->cArgs == 6, "cArgs = %d\n", pdp->cArgs);
1818 ok(!pvarRes, "pvarRes != NULL\n");
1819
1820 ok(V_VT(pdp->rgvarg+1) == VT_I4, "V_VT(pdp->rgvarg+1) = %d\n", V_VT(pdp->rgvarg+1));
1821 ok(V_I4(pdp->rgvarg+1) == 10, "V_I4(pdp->rgvarg+1) = %ld\n", V_I4(pdp->rgvarg+1));
1822
1823 ok(V_VT(pdp->rgvarg+2) == VT_I4, "V_VT(pdp->rgvarg+2) = %d\n", V_VT(pdp->rgvarg+2));
1824 ok(V_I4(pdp->rgvarg+2) == 10, "V_I4(pdp->rgvarg+2) = %ld\n", V_I4(pdp->rgvarg+2));
1825
1826 ok(V_VT(pdp->rgvarg+3) == VT_I4, "V_VT(pdp->rgvarg+3) = %d\n", V_VT(pdp->rgvarg+3));
1827 ok(V_I4(pdp->rgvarg+3) == 22, "V_I4(pdp->rgvarg+3) = %ld\n", V_I4(pdp->rgvarg+3));
1828
1829 ok(V_VT(pdp->rgvarg+4) == VT_I4, "V_VT(pdp->rgvarg+4) = %d\n", V_VT(pdp->rgvarg+4));
1830 ok(V_I4(pdp->rgvarg+4) == 22, "V_I4(pdp->rgvarg+4) = %ld\n", V_I4(pdp->rgvarg+4));
1831
1832 ok(V_VT(pdp->rgvarg+5) == VT_DISPATCH, "V_VT(pdp->rgvarg+5) = %d\n", V_VT(pdp->rgvarg+5));
1833 ok(V_DISPATCH(pdp->rgvarg+5) == (IDispatch*)&testObj, "V_DISPATCH(pdp->rgvarg+5) != testObj\n");
1834
1835 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1836
1837 V_VT(args) = VT_I2;
1838 V_I2(args) = 2;
1839 V_VT(args+1) = VT_INT;
1840 V_INT(args+1) = 22;
1841 V_VT(args+2) = VT_UNKNOWN;
1843 V_VT(args+3) = VT_UNKNOWN;
1844 V_UNKNOWN(args+3) = NULL;
1845 V_VT(args+4) = VT_UI4;
1846 V_UI4(args+4) = 0xffffffff;
1848 V_VARIANTREF(args+5) = &v;
1849 V_VT(args+6) = VT_R4;
1850 V_R4(args+6) = 0.5;
1851 V_VT(args+7) = VT_UI2;
1852 V_UI2(args+7) = 3;
1853 V_VT(args+8) = VT_UI1;
1854 V_UI1(args+8) = 4;
1855 V_VT(args+9) = VT_I1;
1856 V_I1(args+9) = 5;
1857 V_VT(&v) = VT_I4;
1858 V_I4(&v) = 2;
1859 hres = IDispatch_Invoke(V_DISPATCH(pdp->rgvarg), DISPID_VALUE, &IID_NULL, 0, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
1860 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
1861
1862 return S_OK;
1863 }
1864
1866 IDispatchEx *eval_func;
1867 DISPPARAMS params;
1868 VARIANT arg, res;
1869 HRESULT hres;
1870
1871 CHECK_EXPECT(global_calleval_i);
1872
1873 ok(pdp != NULL, "pdp == NULL\n");
1874 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1875 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1876 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1877 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1878 ok(pvarRes == NULL, "pvarRes != NULL\n");
1879 ok(pei != NULL, "pei == NULL\n");
1880
1881 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
1882 hres = IDispatch_QueryInterface(V_DISPATCH(pdp->rgvarg), &IID_IDispatchEx, (void**)&eval_func);
1883 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
1884
1885 params.rgvarg = &arg;
1886 params.rgdispidNamedArgs = NULL;
1887 params.cArgs = 1;
1888 params.cNamedArgs = 0;
1889 V_VT(&arg) = VT_BSTR;
1890
1891 V_BSTR(&arg) = SysAllocString(L"var x = 5; v");
1892 V_VT(&res) = VT_ERROR;
1893 hres = IDispatchEx_InvokeEx(eval_func, DISPID_VALUE, 0, DISPATCH_METHOD, &params, &res, NULL, NULL);
1894 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
1895 ok(V_VT(&res) == VT_I4, "eval returned type %u\n", V_VT(&res));
1896 ok(V_I4(&res) == 2, "eval returned %ld\n", V_I4(&res));
1898 IDispatchEx_Release(eval_func);
1899 return S_OK;
1900 }
1902 VARIANT *v = pdp->rgvarg;
1903 HRESULT hres;
1904
1905 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1906 ok(pdp != NULL, "pdp == NULL\n");
1907 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1908 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1909 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1910 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1911 ok(pei != NULL, "pei == NULL\n");
1912 if(pvarRes) {
1913 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1914 V_VT(pvarRes) = VT_BOOL;
1915 V_BOOL(pvarRes) = VARIANT_FALSE;
1916 }
1917
1918 switch(V_VT(v)) {
1919 case VT_I4:
1920 hres = V_I4(v);
1921 break;
1922 case VT_R8:
1923 hres = (HRESULT)V_R8(v);
1924 break;
1925 default:
1926 ok(0, "unexpected vt %d\n", V_VT(v));
1927 return E_INVALIDARG;
1928 }
1929 return hres;
1930 }
1931
1932 case DISPID_GLOBAL_THROWEI: {
1933 VARIANT *v = pdp->rgvarg + pdp->cArgs - 1;
1934 HRESULT hres;
1935
1936 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1937 ok(pdp != NULL, "pdp == NULL\n");
1938 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1939 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1940 ok(pdp->cArgs == 1 || pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1941 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1942 ok(pei != NULL, "pei == NULL\n");
1943 if(pvarRes) {
1944 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1945 V_VT(pvarRes) = VT_BOOL;
1946 V_BOOL(pvarRes) = VARIANT_FALSE;
1947 }
1948
1949 switch(V_VT(v)) {
1950 case VT_I4:
1951 hres = V_I4(v);
1952 break;
1953 case VT_R8:
1954 hres = (HRESULT)V_R8(v);
1955 break;
1956 default:
1957 ok(0, "unexpected vt %d\n", V_VT(v));
1958 return E_INVALIDARG;
1959 }
1960
1961 pei->scode = hres;
1962 if(pdp->cArgs == 1) {
1963 pei->bstrSource = SysAllocString(L"test source");
1964 pei->bstrDescription = SysAllocString(L"test description");
1965 }else if(V_VT(pdp->rgvarg) == VT_BOOL && V_BOOL(pdp->rgvarg)) {
1966 pei->pfnDeferredFillIn = test_deferred_fill_in;
1967 pei->bstrSource = SysAllocString(L"source before defer");
1968 pei->bstrDescription = SysAllocString(L"desc before defer");
1969 pei->bstrHelpFile = SysAllocString(L"help before defer");
1970 pei->dwHelpContext = 1337;
1971 }
1972 return DISP_E_EXCEPTION;
1973 }
1974 }
1975
1976 ok(0, "unexpected call %lx\n", id);
1977 return DISP_E_MEMBERNOTFOUND;
1978}
1979
1981{
1982 switch(id) {
1984 CHECK_EXPECT(DeleteMemberByDispID);
1985 return S_OK;
1987 CHECK_EXPECT(DeleteMemberByDispID_false);
1988 return S_FALSE;
1990 CHECK_EXPECT(DeleteMemberByDispID_error);
1991 return E_FAIL;
1992 default:
1993 ok(0, "id = %ld\n", id);
1994 }
1995
1996 return E_FAIL;
1997}
1998
1999static IDispatchExVtbl GlobalVtbl = {
2015};
2016
2018
2020{
2021 *ppv = NULL;
2022
2024 *ppv = iface;
2025 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
2026 *ppv = iface;
2027 else
2028 return E_NOINTERFACE;
2029
2030 IUnknown_AddRef((IUnknown*)*ppv);
2031 return S_OK;
2032}
2033
2035{
2036 return 2;
2037}
2038
2040{
2041 return 1;
2042}
2043
2045{
2047 return S_OK;
2048}
2049
2051 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
2052{
2053 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %lx\n", dwReturnMask);
2054 ok(!ppti, "ppti != NULL\n");
2055
2056 if(!lstrcmpW(pstrName, L"testVal"))
2057 CHECK_EXPECT(GetItemInfo_testVal);
2058 else if(lstrcmpW(pstrName, L"test"))
2059 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
2060
2061 *ppiunkItem = (IUnknown*)&Global;
2062 return S_OK;
2063}
2064
2066{
2067 return E_NOTIMPL;
2068}
2069
2071 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
2072{
2073 return E_NOTIMPL;
2074}
2075
2077{
2078 return E_NOTIMPL;
2079}
2080
2082{
2083 return E_NOTIMPL;
2084}
2085
2087{
2088 return E_NOTIMPL;
2089}
2090
2092{
2093 return E_NOTIMPL;
2094}
2095
2096static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
2108};
2109
2111
2113{
2114 ok(pscripterror != NULL, "ActiveScriptSite_OnScriptError -- expected pscripterror to be set, got NULL\n");
2115
2116 script_error = pscripterror;
2117 IActiveScriptError_AddRef(script_error);
2118
2120
2121 return S_OK;
2122}
2123
2124static const IActiveScriptSiteVtbl ActiveScriptSite_CheckErrorVtbl = {
2136};
2137
2139
2141{
2142 IActiveScriptProperty *script_prop;
2143 HRESULT hres;
2144
2145 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty,
2146 (void**)&script_prop);
2147 ok(hres == S_OK, "Could not get IActiveScriptProperty iface: %08lx\n", hres);
2148
2149 hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
2150 IActiveScriptProperty_Release(script_prop);
2151
2152 return hres;
2153}
2154
2156{
2158 VARIANT v;
2159 HRESULT hres;
2160
2161 hres = CoCreateInstance(engine_clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
2162 &IID_IActiveScript, (void**)&script);
2163 ok(hres == S_OK, "CoCreateInstance failed: %08lx\n", hres);
2164
2165 V_VT(&v) = VT_I4;
2166 V_I4(&v) = invoke_version;
2167 hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
2168 ok(hres == S_OK || broken(hres == E_NOTIMPL), "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08lx\n", hres);
2169 if(invoke_version && FAILED(hres)) {
2170 IActiveScript_Release(script);
2171 return NULL;
2172 }
2173
2174 return script;
2175}
2176
2177static HRESULT parse_script(DWORD flags, const WCHAR *script_str)
2178{
2179 IActiveScriptParse *parser;
2180 IActiveScript *engine;
2181 HRESULT hres;
2182
2183 engine = create_script();
2184 if(!engine)
2185 return S_OK;
2186
2187 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2188 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2189 if (FAILED(hres))
2190 {
2191 IActiveScript_Release(engine);
2192 return hres;
2193 }
2194
2196 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2197
2198 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2199 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2200
2201 hres = IActiveScript_AddNamedItem(engine, L"test",
2202 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
2203 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
2204
2205 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2206 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2207
2208 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
2209 ok(hres == S_OK, "GetScriptDispatch failed: %08lx\n", hres);
2210 ok(script_disp != NULL, "script_disp == NULL\n");
2211 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
2212
2213 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2214
2215 IDispatch_Release(script_disp);
2216 IActiveScript_Release(engine);
2218
2219 return hres;
2220}
2221
2222static HRESULT invoke_procedure(const WCHAR *args, const WCHAR *source, DISPPARAMS *dp)
2223{
2224 IActiveScriptParseProcedure2 *parse_proc;
2225 IActiveScriptParse *parser;
2226 IActiveScript *engine;
2227 IDispatchEx *dispex;
2228 EXCEPINFO ei = {0};
2229 IDispatch *disp;
2230 VARIANT res;
2231 HRESULT hres;
2232
2233 engine = create_script();
2234 if(!engine)
2235 return S_OK;
2236
2237 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2238 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2239
2241 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2242
2243 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2244 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2245
2246 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2247 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2248
2249 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
2250 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2251
2253 SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS, &disp);
2254 ok(hres == S_OK, "ParseProcedureText failed: %08lx\n", hres);
2255
2256 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
2257 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
2258 IDispatch_Release(disp);
2259
2260 V_VT(&res) = VT_EMPTY;
2261 hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, 0, DISPATCH_METHOD, dp, &res, &ei, NULL);
2262 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
2263 ok(V_VT(&res) == VT_BOOL && V_BOOL(&res), "InvokeEx returned vt %d (%lx)\n", V_VT(&res), V_I4(&res));
2264 IDispatchEx_Release(dispex);
2265
2267 IActiveScript_Release(engine);
2269
2270 return hres;
2271}
2272
2273static HRESULT parse_htmlscript(const WCHAR *script_str)
2274{
2275 IActiveScriptParse *parser;
2276 IActiveScript *engine;
2277 HRESULT hres;
2278
2279 engine = create_script();
2280 if(!engine)
2281 return E_FAIL;
2282
2283 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2284 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2285 if (FAILED(hres))
2286 {
2287 IActiveScript_Release(engine);
2288 return E_FAIL;
2289 }
2290
2292 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2293
2294 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2295 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2296
2297 hres = IActiveScript_AddNamedItem(engine, L"test",
2298 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2299 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
2300
2301 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2302 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2303
2304 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, L"</SCRIPT>", 0, 0, 0, NULL, NULL);
2305
2306 IActiveScript_Release(engine);
2308 return hres;
2309}
2310
2311#define ERROR_TODO_PARSE 0x0001
2312#define ERROR_TODO_SCODE 0x0002
2313#define ERROR_TODO_DESCRIPTION 0x0004
2314#define ERROR_TODO_HELPFILE 0x0008
2315
2316static void test_error_reports(void)
2317{
2318 IActiveScriptParse *parser;
2319 IActiveScript *engine;
2320 unsigned i;
2321 HRESULT hres;
2322
2323 static const struct {
2324 const WCHAR *script;
2325 HRESULT error;
2326 unsigned line;
2327 unsigned character;
2328 const WCHAR *error_source;
2329 const WCHAR *description;
2330 const WCHAR *help_file;
2331 DWORD help_context;
2332 const WCHAR *line_text;
2333 BOOL todo_flags;
2334 BOOL reserved_lcid;
2335 } tests[] = {
2336 {
2337 L"?",
2338 JS_E_SYNTAX, 0, 0,
2339 L"Microsoft JScript compilation error",
2340 L"Syntax error",
2341 NULL, 0,
2342 L"?"
2343 },
2344 {
2345 L"var a=1;\nif(a\n-->0) a=5;\n",
2347 L"Microsoft JScript compilation error",
2348 L"Expected ')'",
2349 NULL, 0,
2350 L"-->0) a=5;",
2352 },
2353 {
2354 L"new 3;",
2355 JS_E_INVALID_ACTION, 0, 0,
2356 L"Microsoft JScript runtime error",
2357 L"Object doesn't support this action"
2358 },
2359 {
2360 L"new null;",
2362 L"Microsoft JScript runtime error",
2363 L"Object expected"
2364 },
2365 {
2366 L"var a;\nnew null;",
2368 L"Microsoft JScript runtime error",
2369 L"Object expected"
2370 },
2371 {
2372 L"var a; new null;",
2374 L"Microsoft JScript runtime error",
2375 L"Object expected"
2376 },
2377 {
2378 L"var a;\na=\n new null;",
2380 L"Microsoft JScript runtime error",
2381 L"Object expected"
2382 },
2383 {
2384 L"var a;\nif(na=\n new null) {}",
2386 L"Microsoft JScript runtime error",
2387 L"Object expected"
2388 },
2389 {
2390 L"not_existing_variable.something();",
2392 L"Microsoft JScript runtime error",
2393 L"'not_existing_variable' is undefined"
2394 },
2395 {
2396 L" throw 1;",
2398 L"Microsoft JScript runtime error",
2399 L"Exception thrown and not caught"
2400 },
2401 {
2402 L"var f = function() { throw 1; };\n"
2403 L"f();\n",
2404 JS_E_EXCEPTION_THROWN, 0, 21,
2405 L"Microsoft JScript runtime error",
2406 L"Exception thrown and not caught"
2407 },
2408 {
2409 L"var f = function() { throw 1; };\n"
2410 L"try { f(); } finally { 2; }\n",
2411 JS_E_EXCEPTION_THROWN, 1, 21,
2412 L"Microsoft JScript runtime error",
2413 L"Exception thrown and not caught"
2414 },
2415 {
2416 L" throwInt(-2146827270);",
2418 L"Microsoft JScript runtime error",
2419 L"'return' statement outside of function"
2420 },
2421 {
2422 L" throwEI(-2146827270);",
2424 L"test source",
2425 L"test description"
2426 },
2427 {
2428 L" throwEI(-2146827270, false);",
2430 L"Microsoft JScript runtime error",
2431 L"'return' statement outside of function"
2432 },
2433 {
2434 L" throwEI(-2147467259 /* E_FAIL */, false);",
2435 E_FAIL, 0, 1
2436 },
2437 {
2438 L" throwInt(-2147467259 /* E_FAIL */);",
2439 E_FAIL, 0, 1,
2440 NULL,
2441 NULL,
2442 NULL, 0,
2443 NULL,
2444 FALSE,
2445 0x409
2446 },
2447 {
2448 L" throwEI(-2147467259 /* E_FAIL */);",
2449 E_FAIL, 0, 1,
2450 L"test source",
2451 L"test description"
2452 },
2453 {
2454 L" throwEI(-2147467259 /* E_FAIL */, true);",
2455 E_FAIL, 0, 1,
2456 L"source after defer",
2457 L"desc after defer",
2458 L"help after defer", 1234567890,
2459 NULL,
2461 },
2462 {
2463 L"switch(2) {\n"
2464 L" case 1: break;\n"
2465 L" case 0: break;\n"
2466 L" case new null: break;\n"
2467 L" default: throw 1;\n"
2468 L"}\n",
2470 L"Microsoft JScript runtime error",
2471 L"Object expected"
2472 },
2473 {
2474 L"do {\n"
2475 L" 1;\n"
2476 L"} while ( new null );\n",
2478 L"Microsoft JScript runtime error",
2479 L"Object expected"
2480 },
2481 {
2482 L"for (var i = 0; i < 100; new null) { i++ }",
2483 JS_E_OBJECT_EXPECTED, 0, 25,
2484 L"Microsoft JScript runtime error",
2485 L"Object expected"
2486 },
2487 {
2488 L"for (var i = 0; new null; i++) { i++ }",
2489 JS_E_OBJECT_EXPECTED, 0, 16,
2490 L"Microsoft JScript runtime error",
2491 L"Object expected"
2492 },
2493 {
2494 L"for (new null; i < 100; i++) { i++ }",
2496 L"Microsoft JScript runtime error",
2497 L"Object expected"
2498 },
2499 {
2500 L"var e = new Error();\n"
2501 L"e.number = -2146828279;\n"
2502 L"e.description = 'test';\n"
2503 L"throw e;",
2505 L"Microsoft JScript runtime error",
2506 L"test",
2507 NULL, 0,
2508 NULL,
2509 FALSE,
2510 TRUE
2511 },
2512 {
2513 L"var e = new Error();\n"
2514 L"e.number = -2146828279;\n"
2515 L"e.message = 'test';\n"
2516 L"throw e;",
2518 L"Microsoft JScript runtime error",
2519 L"",
2520 NULL, 0,
2521 NULL,
2522 FALSE,
2523 TRUE
2524 },
2525 {
2526 L"var e = new Error();\n"
2527 L"throw e;",
2528 E_FAIL, 1, 0,
2529 NULL,
2530 L"",
2531 NULL, 0,
2532 NULL,
2533 FALSE,
2534 TRUE
2535 },
2536 {
2537 L"var e = new Object();\n"
2538 L"e.number = -2146828279;\n"
2539 L"e.description = 'test';\n"
2540 L"throw e;",
2542 L"Microsoft JScript runtime error",
2543 L"Exception thrown and not caught",
2544 NULL, 0,
2545 NULL,
2547 },
2548 {
2549 L"f(1\n,\n2,\n ,,3\n);\n",
2550 JS_E_SYNTAX, 3, 1,
2551 L"Microsoft JScript compilation error",
2552 L"Syntax error",
2553 NULL, 0,
2554 L" ,,3"
2555 },
2556 };
2557
2558 if (!is_lang_english())
2559 skip("Non-english UI (test with hardcoded strings)\n");
2560
2561 for (i = 0; i < ARRAY_SIZE(tests); i++)
2562 {
2563 engine = create_script();
2564
2565 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2566 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2567
2569 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2570
2571 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite_CheckError);
2572 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2573
2574 hres = IActiveScript_AddNamedItem(engine, L"test",
2575 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2576 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
2577
2578 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2579 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2580
2581 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
2582 ok(hres == S_OK, "GetScriptDispatch failed: %08lx\n", hres);
2583 ok(script_disp != NULL, "script_disp == NULL\n");
2584 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
2585
2589 todo_wine_if(tests[i].todo_flags & ERROR_TODO_PARSE)
2590 ok(hres == SCRIPT_E_REPORTED || (tests[i].error == JS_E_EXCEPTION_THROWN && hres == SCRIPT_E_PROPAGATE),
2591 "[%u] got: 0x%08lx for %s\n", i, hres, wine_dbgstr_w(tests[i].script));
2592 todo_wine_if(tests[i].todo_flags & ERROR_TODO_PARSE)
2594
2595 if (script_error)
2596 {
2597 DWORD source_context;
2599 LONG character;
2600 BSTR line_text;
2601 EXCEPINFO ei;
2602
2603 hres = IActiveScriptError_GetSourcePosition(script_error, NULL, NULL, NULL);
2604 ok(hres == S_OK, "GetSourcePosition failed %08lx\n", hres);
2605
2606 source_context = 0xdeadbeef;
2607 hres = IActiveScriptError_GetSourcePosition(script_error, &source_context, NULL, NULL);
2608 ok(hres == S_OK, "GetSourcePosition failed0x%08lx\n", hres);
2609 ok(source_context == 10, "source_context = %lx\n", source_context);
2610
2611 line_number = 0xdeadbeef;
2612 hres = IActiveScriptError_GetSourcePosition(script_error, NULL, &line_number, NULL);
2613 ok(hres == S_OK, "GetSourcePosition failed%08lx\n", hres);
2614 ok(line_number == tests[i].line, "[%u] line = %lu expected %u\n", i, line_number, tests[i].line);
2615
2616 character = 0xdeadbeef;
2617 hres = IActiveScriptError_GetSourcePosition(script_error, NULL, NULL, &character);
2618 ok(hres == S_OK, "GetSourcePosition failed: %08lx\n", hres);
2619 ok(character == tests[i].character, "[%u] character = %lu expected %u\n", i, character, tests[i].character);
2620
2621 hres = IActiveScriptError_GetSourceLineText(script_error, NULL);
2622 ok(hres == E_POINTER, "GetSourceLineText returned %08lx\n", hres);
2623
2624 line_text = (BSTR)0xdeadbeef;
2625 hres = IActiveScriptError_GetSourceLineText(script_error, &line_text);
2626 if (tests[i].line_text)
2627 {
2628 ok(hres == S_OK, "GetSourceLineText failed: %08lx\n", hres);
2629 ok(line_text != NULL && !lstrcmpW(line_text, tests[i].line_text), "[%u] GetSourceLineText returned %s expected %s\n",
2630 i, wine_dbgstr_w(line_text), wine_dbgstr_w(tests[i].line_text));
2631 }
2632 else
2633 {
2634 ok(hres == E_FAIL, "GetSourceLineText failed: %08lx\n", hres);
2635 }
2636 if (SUCCEEDED(hres))
2637 SysFreeString(line_text);
2638
2639 hres = IActiveScriptError_GetExceptionInfo(script_error, NULL);
2640 ok(hres == E_POINTER, "GetExceptionInfo failed: %08lx\n", hres);
2641
2642 ei.wCode = 0xdead;
2643 ei.wReserved = 0xdead;
2644 ei.bstrSource = (BSTR)0xdeadbeef;
2645 ei.bstrDescription = (BSTR)0xdeadbeef;
2646 ei.bstrHelpFile = (BSTR)0xdeadbeef;
2647 ei.dwHelpContext = 0xdeadbeef;
2648 ei.pvReserved = (void *)0xdeadbeef;
2649 ei.pfnDeferredFillIn = (void *)0xdeadbeef;
2650 ei.scode = 0xdeadbeef;
2651
2652 hres = IActiveScriptError_GetExceptionInfo(script_error, &ei);
2653 ok(hres == S_OK, "GetExceptionInfo failed: %08lx\n", hres);
2654
2655 todo_wine_if(tests[i].todo_flags & ERROR_TODO_SCODE)
2656 ok(ei.scode == tests[i].error, "[%u] scode = %08lx, expected %08lx\n", i, ei.scode, tests[i].error);
2657 ok(ei.wCode == 0, "wCode = %x\n", ei.wCode);
2658 todo_wine_if(tests[i].reserved_lcid)
2659 ok(ei.wReserved == (tests[i].reserved_lcid ? GetUserDefaultLCID() : 0), "[%u] wReserved = %x expected %lx\n",
2660 i, ei.wReserved, (tests[i].reserved_lcid ? GetUserDefaultLCID() : 0));
2661 if (is_lang_english())
2662 {
2663 if(tests[i].error_source)
2664 ok(ei.bstrSource && !lstrcmpW(ei.bstrSource, tests[i].error_source), "[%u] bstrSource = %s expected %s\n",
2665 i, wine_dbgstr_w(ei.bstrSource), wine_dbgstr_w(tests[i].error_source));
2666 else
2667 ok(!ei.bstrSource, "[%u] bstrSource = %s expected NULL\n", i, wine_dbgstr_w(ei.bstrSource));
2668 if(tests[i].description)
2670 ok(ei.bstrDescription && !lstrcmpW(ei.bstrDescription, tests[i].description),
2671 "[%u] bstrDescription = %s expected %s\n", i, wine_dbgstr_w(ei.bstrDescription), wine_dbgstr_w(tests[i].description));
2672 else
2673 ok(!ei.bstrDescription, "[%u] bstrDescription = %s expected NULL\n", i, wine_dbgstr_w(ei.bstrDescription));
2674 }
2675 if(tests[i].help_file)
2677 ok(ei.bstrHelpFile && !lstrcmpW(ei.bstrHelpFile, tests[i].help_file),
2678 "[%u] bstrHelpFile = %s expected %s\n", i, wine_dbgstr_w(ei.bstrHelpFile), wine_dbgstr_w(tests[i].help_file));
2679 else
2680 ok(!ei.bstrHelpFile, "[%u] bstrHelpFile = %s expected NULL\n", i, wine_dbgstr_w(ei.bstrHelpFile));
2682 ok(ei.dwHelpContext == tests[i].help_context, "dwHelpContext = %lu, expected %lu\n", ei.dwHelpContext, tests[i].help_context);
2683 ok(!ei.pvReserved, "pvReserved = %p\n", ei.pvReserved);
2684 ok(!ei.pfnDeferredFillIn, "pfnDeferredFillIn = %p\n", ei.pfnDeferredFillIn);
2685
2686 SysFreeString(ei.bstrSource);
2687 SysFreeString(ei.bstrDescription);
2688 SysFreeString(ei.bstrHelpFile);
2689
2690 IActiveScriptError_Release(script_error);
2691 }
2692
2693 IDispatch_Release(script_disp);
2694 IActiveScript_Release(engine);
2696 }
2697}
2698
2699#define run_script(a) _run_script(__LINE__,a)
2700static void _run_script(unsigned line, const WCHAR *src)
2701{
2702 HRESULT hres;
2703
2704 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
2705 ok_(__FILE__,line)(hres == S_OK, "script %s failed: %08lx\n", wine_dbgstr_w(src), hres);
2706}
2707
2709{
2710 DWORD size, len;
2711 HANDLE file, map;
2712 const char *file_map;
2713 BSTR ret;
2714
2716 if(file == INVALID_HANDLE_VALUE) {
2717 trace("Could not open file: %lu\n", GetLastError());
2718 return NULL;
2719 }
2720
2722
2725 if(map == INVALID_HANDLE_VALUE) {
2726 trace("Could not create file mapping: %lu\n", GetLastError());
2727 return NULL;
2728 }
2729
2730 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
2732 if(!file_map) {
2733 trace("MapViewOfFile failed: %lu\n", GetLastError());
2734 return NULL;
2735 }
2736
2737 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
2739 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
2740
2741 UnmapViewOfFile(file_map);
2742
2743 return ret;
2744}
2745
2746static void run_from_file(const char *filename)
2747{
2748 BSTR script_str;
2749 HRESULT hres;
2750
2751 script_str = get_script_from_file(filename);
2752 if(!script_str)
2753 return;
2754
2756 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
2757 SysFreeString(script_str);
2758 ok(hres == S_OK, "parse_script failed: %08lx\n", hres);
2759}
2760
2761static BSTR load_res(const char *name)
2762{
2763 const char *data;
2764 DWORD size, len;
2765 BSTR str;
2766 HRSRC src;
2767
2769 test_name = name;
2770
2771 src = FindResourceA(NULL, name, (LPCSTR)40);
2772 ok(src != NULL, "Could not find resource %s\n", name);
2773
2776
2780
2781 return str;
2782}
2783
2784static void run_from_res(const char *name)
2785{
2786 BSTR str;
2787 HRESULT hres;
2788
2789 str = load_res(name);
2790
2791 SET_EXPECT(global_success_d);
2792 SET_EXPECT(global_success_i);
2793 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
2794 CHECK_CALLED(global_success_d);
2795 CHECK_CALLED(global_success_i);
2796
2797 ok(hres == S_OK, "parse_script failed: %08lx\n", hres);
2799}
2800
2801static void test_isvisible(BOOL global_members)
2802{
2803 IActiveScriptParse *parser;
2804 IActiveScript *engine;
2805 HRESULT hres;
2806
2807 engine = create_script();
2808 if(!engine)
2809 return;
2810
2811 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2812 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2813 if (FAILED(hres))
2814 {
2815 IActiveScript_Release(engine);
2816 return;
2817 }
2818
2820 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2821
2822 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2823 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2824
2825 if(global_members)
2826 SET_EXPECT(GetItemInfo_testVal);
2827 hres = IActiveScript_AddNamedItem(engine, L"testVal",
2828 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|
2829 (global_members ? SCRIPTITEM_GLOBALMEMBERS : 0));
2830 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
2831 if(global_members)
2832 CHECK_CALLED(GetItemInfo_testVal);
2833
2834 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2835 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2836
2837 if(!global_members)
2838 SET_EXPECT(GetItemInfo_testVal);
2839 hres = IActiveScriptParse_ParseScriptText(parser, L"var v = testVal;", NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2840 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2841 if(!global_members)
2842 CHECK_CALLED(GetItemInfo_testVal);
2843
2844 hres = IActiveScriptParse_ParseScriptText(parser, L"var v = testVal;", NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
2845 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2846
2847 IActiveScript_Release(engine);
2849}
2850
2851static void test_start(void)
2852{
2853 IActiveScriptParse *parser;
2854 IActiveScript *engine;
2855 BSTR str;
2856 HRESULT hres;
2857
2858 script_engine = engine = create_script();
2859 if(!engine)
2860 return;
2861
2862 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2863 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2864
2866 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2867
2868 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2869 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2870
2871 hres = IActiveScript_AddNamedItem(engine, L"test", SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2872 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
2873
2874 str = SysAllocString(L"ok(getScriptState() === 5, \"getScriptState = \" + getScriptState());\n"
2875 L"reportSuccess();");
2877 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2879
2880 SET_EXPECT(global_success_d);
2881 SET_EXPECT(global_success_i);
2882 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2883 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2884 CHECK_CALLED(global_success_d);
2885 CHECK_CALLED(global_success_i);
2886
2887 IActiveScript_Release(engine);
2890}
2891
2892static void test_automagic(void)
2893{
2894 IActiveScriptParse *parser;
2895 IActiveScript *engine;
2896 BSTR str;
2897 HRESULT hres;
2898
2899 script_engine = engine = create_script();
2900 if(!engine)
2901 return;
2902
2903 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2904 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2905
2907 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2908
2909 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2910 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2911
2912 hres = IActiveScript_AddNamedItem(engine, L"test", SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2913 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
2914
2915 str = SysAllocString(L"function bindEventHandler::eventName() {}\n"
2916 L"reportSuccess();");
2918 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
2920
2921 SET_EXPECT(BindHandler);
2922 SET_EXPECT(global_success_d);
2923 SET_EXPECT(global_success_i);
2924 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2925 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2926 CHECK_CALLED(BindHandler);
2927 CHECK_CALLED(global_success_d);
2928 CHECK_CALLED(global_success_i);
2929
2930 IActiveScript_Release(engine);
2933}
2934
2936{
2937 IActiveScriptParse *parser;
2938 IActiveScript *engine;
2939 HRESULT hres;
2940
2941 engine = create_script();
2942 if(!engine)
2943 return E_FAIL;
2944
2945 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2946 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2947
2949 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2950
2951 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2952 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2953
2954 SET_EXPECT(GetItemInfo_testVal);
2955 hres = IActiveScript_AddNamedItem(engine, L"testVal",
2956 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2957 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
2958 CHECK_CALLED(GetItemInfo_testVal);
2959
2960 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
2961 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
2962
2963 hres = IActiveScriptParse_ParseScriptText(parser, expr, NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, res, NULL);
2965
2966 if(engine_ret)
2967 *engine_ret = engine;
2968 else
2969 close_script(engine);
2970
2971 return hres;
2972}
2973
2974static void test_retval(void)
2975{
2976 IActiveScriptParse *parser;
2977 IActiveScript *engine;
2979 VARIANT res;
2980 HRESULT hres;
2981 BSTR str;
2982
2983 engine = create_script();
2984 if(!engine)
2985 return;
2986
2987 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
2988 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
2989
2991 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
2992
2993 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
2994 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
2995
2996 SET_EXPECT(GetItemInfo_testVal);
2997 hres = IActiveScript_AddNamedItem(engine, L"testVal",
2998 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
2999 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
3000 CHECK_CALLED(GetItemInfo_testVal);
3001
3002 str = SysAllocString(L"reportSuccess(), true");
3003 V_VT(&res) = VT_NULL;
3004 SET_EXPECT(global_success_d);
3005 SET_EXPECT(global_success_i);
3007 CHECK_CALLED(global_success_d);
3008 CHECK_CALLED(global_success_i);
3009 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3010 ok(V_VT(&res) == VT_EMPTY, "V_VT(&res) = %d\n", V_VT(&res));
3012
3013 hres = IActiveScript_GetScriptState(engine, &state);
3014 ok(hres == S_OK, "GetScriptState failed: %08lx\n", hres);
3015 ok(state == SCRIPTSTATE_INITIALIZED, "state = %d\n", state);
3016
3017 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
3018 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
3019
3021
3022 close_script(engine);
3023}
3024
3025static void test_propputref(void)
3026{
3027 static DISPID propput_dispid = DISPID_PROPERTYPUT;
3028 DISPPARAMS dp = {0}, dp_get = {0};
3029 IActiveScript *script, *script2;
3030 IDispatch *disp, *obj;
3031 HRESULT hres;
3032 VARIANT v;
3033 DISPID id;
3034 BSTR str;
3035
3036 hres = parse_script_expr(L"new Object()", &v, &script2);
3037 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3038 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3039 obj = V_DISPATCH(&v);
3040
3041 hres = parse_script_expr(L"var disp = new Object(); disp.a = disp; disp", &v, &script);
3042 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3043 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3044 disp = V_DISPATCH(&v);
3045
3046 str = SysAllocString(L"a");
3047 hres = IDispatch_GetIDsOfNames(disp, &IID_NULL, &str, 1, 0, &id);
3048 ok(hres == S_OK, "GetIDsOfNames failed: %08lx\n", hres);
3050
3051 dp.cArgs = dp.cNamedArgs = 1;
3052 dp.rgdispidNamedArgs = &propput_dispid;
3053 dp.rgvarg = &v;
3054 V_VT(&v) = VT_DISPATCH;
3055 V_DISPATCH(&v) = obj;
3056 hres = IDispatch_Invoke(disp, id, &IID_NULL, 0, DISPATCH_PROPERTYPUTREF, &dp, NULL, NULL, NULL);
3057 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3058 V_VT(&v) = VT_EMPTY;
3059 hres = IDispatch_Invoke(disp, id, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp_get, &v, NULL, NULL);
3060 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3061 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3062 ok(V_DISPATCH(&v) == obj, "V_DISPATCH(v) = %p\n", V_DISPATCH(&v));
3063 VariantClear(&v);
3064
3065 V_VT(&v) = VT_DISPATCH;
3066 V_DISPATCH(&v) = obj;
3067 hres = IDispatch_Invoke(disp, id, &IID_NULL, 0, DISPATCH_PROPERTYPUTREF | DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
3068 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3069 V_VT(&v) = VT_EMPTY;
3070 hres = IDispatch_Invoke(disp, id, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp_get, &v, NULL, NULL);
3071 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3072 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3073 ok(V_DISPATCH(&v) == obj, "V_DISPATCH(v) = %p\n", V_DISPATCH(&v));
3074 IDispatch_Release(obj);
3075 close_script(script2);
3076 VariantClear(&v);
3077
3078 V_VT(&v) = VT_DISPATCH;
3079 V_DISPATCH(&v) = NULL;
3080 hres = IDispatch_Invoke(disp, id, &IID_NULL, 0, DISPATCH_PROPERTYPUTREF, &dp, NULL, NULL, NULL);
3081 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3082 V_VT(&v) = VT_EMPTY;
3083 hres = IDispatch_Invoke(disp, id, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp_get, &v, NULL, NULL);
3084 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3085 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3086 ok(!V_DISPATCH(&v), "V_DISPATCH(v) = %p\n", V_DISPATCH(&v));
3087
3088 V_VT(&v) = VT_EMPTY;
3089 hres = IDispatch_Invoke(disp, id, &IID_NULL, 0, DISPATCH_PROPERTYPUTREF, &dp, NULL, NULL, NULL);
3090 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3091 V_VT(&v) = VT_EMPTY;
3092 hres = IDispatch_Invoke(disp, id, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp_get, &v, NULL, NULL);
3093 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3094 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
3095
3096 V_VT(&v) = VT_I4;
3097 V_I4(&v) = 42;
3098 hres = IDispatch_Invoke(disp, id, &IID_NULL, 0, DISPATCH_PROPERTYPUTREF, &dp, NULL, NULL, NULL);
3099 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3100 V_VT(&v) = VT_EMPTY;
3101 hres = IDispatch_Invoke(disp, id, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp_get, &v, NULL, NULL);
3102 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3103 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3104 ok(V_I4(&v) == 42, "V_I4(v) = %ld\n", V_I4(&v));
3105
3106 IDispatch_Release(disp);
3108}
3109
3110static void test_default_value(void)
3111{
3112 static DISPID propput_dispid = DISPID_PROPERTYPUT;
3114 DISPPARAMS dp = {0};
3115 IDispatch *disp;
3116 VARIANT v;
3117 HRESULT hres;
3118
3119 hres = parse_script_expr(L"new Date()", &v, NULL);
3120 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3121 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3122 disp = V_DISPATCH(&v);
3123
3124 V_VT(&v) = VT_EMPTY;
3125 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3126 ok(hres == E_UNEXPECTED, "Invoke failed: %08lx\n", hres);
3127 IDispatch_Release(disp);
3128
3129 hres = parse_script_expr(L"new Date()", &v, &script);
3130 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3131 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3132 disp = V_DISPATCH(&v);
3133
3134 V_VT(&v) = VT_EMPTY;
3135 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3136 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3137 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3138 VariantClear(&v);
3139 IDispatch_Release(disp);
3141
3142 hres = parse_script_expr(L"var arr = [5]; arr.toString = function() {return \"foo\";}; arr.valueOf = function() {return 42;}; arr", &v, &script);
3143 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3144 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3145 disp = V_DISPATCH(&v);
3146
3147 V_VT(&v) = VT_EMPTY;
3148 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3149 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3150 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3151 ok(V_I4(&v) == 42, "V_I4(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
3152 IDispatch_Release(disp);
3154
3155 hres = parse_script_expr(L"var arr = [5]; arr.toString = function() {return \"foo\";}; arr", &v, &script);
3156 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3157 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3158 disp = V_DISPATCH(&v);
3159
3160 V_VT(&v) = VT_EMPTY;
3161 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3162 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3163 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3164 ok(!lstrcmpW(V_BSTR(&v), L"foo"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
3165 VariantClear(&v);
3166 IDispatch_Release(disp);
3168
3169 hres = parse_script_expr(L"var arr = [5]; arr", &v, &script);
3170 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3171 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3172 disp = V_DISPATCH(&v);
3173
3174 V_VT(&v) = VT_EMPTY;
3175 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3176 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3177 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3178 ok(!lstrcmpW(V_BSTR(&v), L"5"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
3179 VariantClear(&v);
3180 IDispatch_Release(disp);
3182
3183 hres = parse_script_expr(L"var obj = Object.prototype; delete obj.valueOf; obj", &v, &script);
3184 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3185 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3186 disp = V_DISPATCH(&v);
3187
3188 V_VT(&v) = VT_EMPTY;
3189 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3190 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3191 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3192 ok(!lstrcmpW(V_BSTR(&v), L"[object Object]"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
3193 VariantClear(&v);
3194 IDispatch_Release(disp);
3196
3197 hres = parse_script_expr(L"var obj = Object.prototype; delete obj.toString; obj", &v, &script);
3198 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3199 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3200 disp = V_DISPATCH(&v);
3201
3202 V_VT(&v) = VT_EMPTY;
3203 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3204 ok(hres == DISP_E_MEMBERNOTFOUND, "Invoke failed: %08lx\n", hres);
3205 IDispatch_Release(disp);
3207
3208 hres = parse_script_expr(L"Object.prototype", &v, &script);
3209 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3210 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3211 disp = V_DISPATCH(&v);
3212
3213 dp.cArgs = dp.cNamedArgs = 1;
3214 dp.rgdispidNamedArgs = &propput_dispid;
3215 dp.rgvarg = &v;
3216 V_VT(&v) = VT_EMPTY;
3217 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
3218 ok(hres == DISP_E_MEMBERNOTFOUND, "Invoke failed: %08lx\n", hres);
3219 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYPUTREF, &dp, NULL, NULL, NULL);
3220 ok(hres == DISP_E_MEMBERNOTFOUND, "Invoke failed: %08lx\n", hres);
3221 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYPUTREF | DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
3222 ok(hres == DISP_E_MEMBERNOTFOUND, "Invoke failed: %08lx\n", hres);
3223 IDispatch_Release(disp);
3225
3226 hres = parse_script_expr(L"var f = function() {return 42;}; f", &v, &script);
3227 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3228 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3229 disp = V_DISPATCH(&v);
3230
3231 V_VT(&v) = VT_EMPTY;
3232 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
3233 ok(hres == DISP_E_MEMBERNOTFOUND, "Invoke failed: %08lx\n", hres);
3234 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYPUTREF, &dp, NULL, NULL, NULL);
3235 ok(hres == DISP_E_MEMBERNOTFOUND, "Invoke failed: %08lx\n", hres);
3236 hres = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 0, DISPATCH_PROPERTYPUTREF | DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
3237 ok(hres == DISP_E_MEMBERNOTFOUND, "Invoke failed: %08lx\n", hres);
3238 IDispatch_Release(disp);
3240}
3241
3243{
3244 static struct {
3245 const WCHAR *num;
3246 const WCHAR *expect;
3247 } tests[] = {
3248 { L"0", L"0.00" },
3249 { L"+1234.5", L"1,234.50" },
3250 { L"-1337.7331", L"-1,337.73" },
3251 { L"-0.0123", L"-0.01" },
3252 { L"-0.0198", L"-0.02" },
3253 { L"0.004", L"0.00" },
3254 { L"65536.5", L"65,536.50" },
3255 { L"NaN", L"NaN" }
3256 };
3257 static const WCHAR fmt[] = L"Number.prototype.toLocaleString.call(%s)";
3258 WCHAR script_buf[ARRAY_SIZE(fmt) + 32];
3259 HRESULT hres;
3260 unsigned i;
3261 VARIANT v;
3262
3263 use_english = TRUE;
3264 for(i = 0; i < ARRAY_SIZE(tests); i++) {
3265 swprintf(script_buf, ARRAY_SIZE(script_buf), fmt, tests[i].num);
3266 hres = parse_script_expr(script_buf, &v, NULL);
3267 ok(hres == S_OK, "[%u] parse_script_expr failed: %08lx\n", i, hres);
3268 ok(V_VT(&v) == VT_BSTR, "[%u] V_VT(v) = %d\n", i, V_VT(&v));
3269 ok(!lstrcmpW(V_BSTR(&v), tests[i].expect), "[%u] got %s\n", i, wine_dbgstr_w(V_BSTR(&v)));
3270 VariantClear(&v);
3271 }
3273}
3274
3275static void test_script_exprs(void)
3276{
3277 WCHAR buf[64], sep[4];
3278 VARIANT v;
3279 HRESULT hres;
3280
3282
3283 hres = parse_script_expr(L"true", &v, NULL);
3284 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3285 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
3286 ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v));
3287
3288 hres = parse_script_expr(L"false, true", &v, NULL);
3289 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3290 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
3291 ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v));
3292
3293 SET_EXPECT(global_success_d);
3294 SET_EXPECT(global_success_i);
3295 hres = parse_script_expr(L"reportSuccess(); true", &v, NULL);
3296 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3297 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
3298 ok(V_BOOL(&v) == VARIANT_TRUE, "V_BOOL(v) = %x\n", V_BOOL(&v));
3299 CHECK_CALLED(global_success_d);
3300 CHECK_CALLED(global_success_i);
3301
3302 hres = parse_script_expr(L"if(false) true", &v, NULL);
3303 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3304 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
3305
3306 hres = parse_script_expr(L"return testPropGet", &v, NULL);
3307 ok(hres == 0x800a03fa, "parse_script_expr failed: %08lx\n", hres);
3308
3309 hres = parse_script_expr(L"reportSuccess(); return true", &v, NULL);
3310 ok(hres == 0x800a03fa, "parse_script_expr failed: %08lx\n", hres);
3311
3312 SET_EXPECT(global_success_d);
3313 SET_EXPECT(global_success_i);
3314 hres = parse_script_expr(L"reportSuccess(); true", NULL, NULL);
3315 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3316 CHECK_CALLED(global_success_d);
3317 CHECK_CALLED(global_success_i);
3318
3319 hres = parse_script_expr(L"var o=new Object(); Object.prototype.toLocaleString.call(o)", &v, NULL);
3320 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3321 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3322 ok(!lstrcmpW(V_BSTR(&v), L"[object Object]"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
3323 VariantClear(&v);
3324
3325 hres = parse_script_expr(L"var o=new Object(); Object.prototype.toString = function() {return \"wine\";}; Object.prototype.toLocaleString.call(o)", &v, NULL);
3326 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3327 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3328 ok(!lstrcmpW(V_BSTR(&v), L"wine"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
3329 VariantClear(&v);
3330
3331 hres = parse_script_expr(L"var o=new Object(); delete Object.prototype.toString; Object.prototype.toLocaleString.call(o)", &v, NULL);
3332 ok(hres == 0x800a01b6, "parse_script_expr failed: %08lx\n", hres);
3333
3334 hres = parse_script_expr(L"var o=new Object(); o.toString = function() {return \"wine\";}; Object.prototype.toLocaleString.call(o)", &v, NULL);
3335 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3336 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3337 ok(!lstrcmpW(V_BSTR(&v), L"wine"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
3338 VariantClear(&v);
3339
3340 if(!GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_SLIST, sep, ARRAY_SIZE(sep))) wcscpy(sep, L",");
3341 swprintf(buf, ARRAY_SIZE(buf), L"12%s 12%s undefined undefined undefined%s 12", sep, sep, sep);
3342 hres = parse_script_expr(L"var arr = [5]; arr.toLocaleString = function(a,b,c) {return a+' '+b+' '+c;};"
3343 L"Number.prototype.toLocaleString = function() {return 12;};"
3344 L"[1,2,arr,3].toLocaleString('foo','bar','baz')", &v, NULL);
3345 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3346 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3347 ok(!lstrcmpW(V_BSTR(&v), buf), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
3348 VariantClear(&v);
3349
3350 hres = parse_script_expr(L"delete Object.prototype.toLocaleString; Array.prototype.toLocaleString.call([])", &v, NULL);
3351 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3352 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3353 ok(!lstrcmpW(V_BSTR(&v), L""), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
3354 VariantClear(&v);
3355
3356 hres = parse_script_expr(L"delete Object.prototype.toLocaleString; Array.prototype.toLocaleString.call(['a'])", &v, NULL);
3357 ok(hres == 0x800a01b6, "parse_script_expr failed: %08lx\n", hres);
3358
3362 test_retval();
3363
3365}
3366
3367static void test_invokeex(void)
3368{
3369 static DISPID propput_dispid = DISPID_PROPERTYPUT;
3370 DISPPARAMS dp = {NULL}, dp_max = {NULL};
3371 DISPID func_id, max_id, prop_id;
3373 IDispatchEx *dispex;
3374 VARIANT v, arg;
3375 BSTR str;
3376 HRESULT hres;
3377
3378 hres = parse_script_expr(L"var o = {func: function() {return 3;}, max: Math.max, prop: 6}; o", &v, &script);
3379 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3380 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3381
3382 hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex);
3383 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
3384 VariantClear(&v);
3385
3386 str = SysAllocString(L"func");
3387 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
3389 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3390
3391 str = SysAllocString(L"max");
3392 hres = IDispatchEx_GetDispID(dispex, str, 0, &max_id);
3394 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3395
3396 str = SysAllocString(L"prop");
3397 hres = IDispatchEx_GetDispID(dispex, str, 0, &prop_id);
3399 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3400
3401 dp_max.rgvarg = &arg;
3402 dp_max.cArgs = 1;
3403 V_VT(&arg) = VT_I4;
3404 V_I4(&arg) = 42;
3405
3406 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, NULL);
3407 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3408 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3409 ok(V_I4(&v) == 3, "V_I4(v) = %ld\n", V_I4(&v));
3410
3411 hres = IDispatchEx_InvokeEx(dispex, max_id, 0, DISPATCH_METHOD, &dp_max, &v, NULL, NULL);
3412 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3413 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3414 ok(V_I4(&v) == 42, "V_I4(v) = %ld\n", V_I4(&v));
3415
3416 hres = IDispatchEx_InvokeEx(dispex, prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3417 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3418 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3419 ok(V_I4(&v) == 6, "V_I4(v) = %ld\n", V_I4(&v));
3420
3421 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
3422 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
3423
3424 str = SysAllocString(L"func");
3425 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
3427 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3428
3429 V_VT(&v) = VT_EMPTY;
3430 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, NULL);
3431 ok(hres == E_UNEXPECTED || broken(hres == 0x800a1393), "InvokeEx failed: %08lx\n", hres);
3432
3433 V_VT(&v) = VT_EMPTY;
3434 hres = IDispatchEx_InvokeEx(dispex, max_id, 0, DISPATCH_METHOD, &dp_max, &v, NULL, NULL);
3435 ok(hres == E_UNEXPECTED || broken(hres == 0x800a1393), "InvokeEx failed: %08lx\n", hres);
3436
3437 V_VT(&v) = VT_EMPTY;
3438 hres = IDispatchEx_InvokeEx(dispex, prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3439 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3440 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3441 ok(V_I4(&v) == 6, "V_I4(v) = %ld\n", V_I4(&v));
3442
3443 IActiveScript_Close(script);
3444
3445 V_VT(&v) = VT_EMPTY;
3446 hres = IDispatchEx_InvokeEx(dispex, prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3447 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3448 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3449 ok(V_I4(&v) == 6, "V_I4(v) = %ld\n", V_I4(&v));
3450
3451 IDispatchEx_Release(dispex);
3452 IActiveScript_Release(script);
3453
3454 hres = parse_script_expr(L"Math.max", &v, &script);
3455 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3456 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3457
3458 hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex);
3459 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
3460 VariantClear(&v);
3461
3462 str = SysAllocString(L"call");
3463 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
3465 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3466
3467 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
3468 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
3469
3470 str = SysAllocString(L"call");
3471 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
3473 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3474
3475 str = SysAllocString(L"length");
3476 hres = IDispatchEx_GetDispID(dispex, str, 0, &prop_id);
3478 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3479
3480 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3481 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3482 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3483 VariantClear(&v);
3484
3485 hres = IDispatchEx_InvokeEx(dispex, prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3486 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3487 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3488 ok(V_I4(&v) == 2, "V_I4(v) = %ld\n", V_I4(&v));
3489
3490 IDispatchEx_Release(dispex);
3491 IActiveScript_Release(script);
3492
3493 hres = parse_script_expr(L"Math.max", &v, &script);
3494 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3495 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3496
3497 hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex);
3498 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
3499 VariantClear(&v);
3500
3501 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
3502 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
3503
3504 str = SysAllocString(L"call");
3505 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
3507 ok(hres == E_UNEXPECTED, "GetDispID failed: %08lx\n", hres);
3508
3509 IDispatchEx_Release(dispex);
3510 IActiveScript_Release(script);
3511
3512 /* test InvokeEx following prototype chain of builtin object (PROP_PROTREF) */
3513 hres = parse_script_expr(L"o = new Array(); o.push(\"foo\"); o", &v, &script);
3514 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3515 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3516
3517 hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex);
3518 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
3519 VariantClear(&v);
3520
3521 str = SysAllocString(L"push");
3522 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
3524 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3525
3526 dp.rgvarg = &arg;
3527 dp.cArgs = 1;
3528 V_VT(&arg) = VT_BSTR;
3529 V_BSTR(&arg) = SysAllocString(L"bar");
3530
3531 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, NULL);
3532 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3534
3535 str = SysAllocString(L"join");
3536 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
3538 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3539
3540 V_BSTR(&arg) = SysAllocString(L";");
3541 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, NULL);
3542 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3544 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
3545 ok(!lstrcmpW(V_BSTR(&v), L"foo;bar"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
3546
3547 VariantClear(&v);
3548
3549 dp.rgvarg = NULL;
3550 dp.cArgs = 0;
3551
3552 IDispatchEx_Release(dispex);
3553 IActiveScript_Release(script);
3554
3555 /* test InvokeEx following prototype chain of JScript objects (PROP_JSVAL) */
3556 hres = parse_script_expr(L"function c() { this.func = function() { return this.prop1 * this.prop2 };"
3557 L"this.prop1 = 6; this.prop2 = 9; }; var o = new c(); o.prop2 = 7; o",
3558 &v, &script);
3559 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3560 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3561
3562 hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex);
3563 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
3564 VariantClear(&v);
3565
3566 str = SysAllocString(L"prop1");
3567 hres = IDispatchEx_GetDispID(dispex, str, 0, &prop_id);
3569 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3570
3571 hres = IDispatchEx_InvokeEx(dispex, prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3572 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3573 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3574 ok(V_I4(&v) == 6, "V_I4(v) = %ld\n", V_I4(&v));
3575
3576 str = SysAllocString(L"prop2");
3577 hres = IDispatchEx_GetDispID(dispex, str, 0, &prop_id);
3579 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3580
3581 hres = IDispatchEx_InvokeEx(dispex, prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL);
3582 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3583 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3584 ok(V_I4(&v) == 7, "V_I4(v) = %ld\n", V_I4(&v));
3585
3586 str = SysAllocString(L"func");
3587 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
3589 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3590
3591 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, NULL);
3592 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3593 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3594 ok(V_I4(&v) == 42, "V_I4(v) = %s\n", wine_dbgstr_variant(&v));
3595
3596 IDispatchEx_Release(dispex);
3597 IActiveScript_Release(script);
3598
3599 /* test InvokeEx with host prop and custom caller */
3600 hres = parse_script_expr(L"var o = {}; o", &v, &script);
3601 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3602 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3603
3604 hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex);
3605 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
3606 VariantClear(&v);
3607
3608 str = SysAllocString(L"caller");
3609 hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &func_id);
3611 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3612
3613 SET_EXPECT(test_caller_get);
3614 dp.cArgs = dp.cNamedArgs = 1;
3615 dp.rgvarg = &arg;
3616 dp.rgdispidNamedArgs = &propput_dispid;
3617 V_VT(&arg) = VT_DISPATCH;
3619 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
3620 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3621 todo_wine
3622 CHECK_CALLED(test_caller_get);
3623
3624 SET_EXPECT(test_caller_null);
3625 dp.cArgs = dp.cNamedArgs = 0;
3626 dp.rgvarg = NULL;
3627 dp.rgdispidNamedArgs = NULL;
3628 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, NULL);
3629 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3630 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3631 ok(V_I4(&v) == 42, "V_I4(v) = %s\n", wine_dbgstr_variant(&v));
3632 CHECK_CALLED(test_caller_null);
3633 V_VT(&v) = VT_EMPTY;
3634
3635 SET_EXPECT(test_caller_obj);
3636 hres = IDispatchEx_InvokeEx(dispex, func_id, 0, DISPATCH_METHOD, &dp, &v, NULL, &sp_obj);
3637 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3638 ok(V_VT(&v) == VT_I4, "V_VT(v) = %d\n", V_VT(&v));
3639 ok(V_I4(&v) == 137, "V_I4(v) = %s\n", wine_dbgstr_variant(&v));
3640 CHECK_CALLED(test_caller_obj);
3641
3642 IDispatchEx_Release(dispex);
3643 IActiveScript_Release(script);
3644}
3645
3646static void test_members(void)
3647{
3648 DISPID func_id, prop_id;
3650 IDispatchEx *dispex;
3651 DWORD propflags;
3652 HRESULT hres;
3653 VARIANT v;
3654 BSTR str;
3655
3656 hres = parse_script_expr(L"var o = { func: function() {}, prop: 1 }; o", &v, &script);
3657 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3658 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3659
3660 hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex);
3661 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
3662 VariantClear(&v);
3663
3664 str = SysAllocString(L"func");
3665 hres = IDispatchEx_GetDispID(dispex, str, 0, &func_id);
3667 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3668
3669 str = SysAllocString(L"prop");
3670 hres = IDispatchEx_GetDispID(dispex, str, 0, &prop_id);
3672 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3673
3674 hres = IDispatchEx_GetMemberName(dispex, func_id, &str);
3675 ok(hres == S_OK, "GetMemberName failed: %08lx\n", hres);
3676 ok(!wcscmp(str, L"func"), "GetMemberName returned %s\n", wine_dbgstr_w(str));
3678
3679 hres = IDispatchEx_GetMemberName(dispex, prop_id, &str);
3680 ok(hres == S_OK, "GetMemberName failed: %08lx\n", hres);
3681 ok(!wcscmp(str, L"prop"), "GetMemberName returned %s\n", wine_dbgstr_w(str));
3683
3684 propflags = 0xdeadbeef;
3685 hres = IDispatchEx_GetMemberProperties(dispex, func_id, 0, &propflags);
3686 ok(hres == S_OK, "GetMemberProperties failed: %08lx\n", hres);
3687 ok(propflags == 0, "propflags = %08lx", propflags);
3688
3689 propflags = 0xdeadbeef;
3690 hres = IDispatchEx_GetMemberProperties(dispex, prop_id, 0, &propflags);
3691 ok(hres == S_OK, "GetMemberProperties failed: %08lx\n", hres);
3692 ok(propflags == 0, "propflags = %08lx", propflags);
3693
3694 hres = IDispatchEx_DeleteMemberByDispID(dispex, func_id);
3695 ok(hres == S_OK, "DeleteMemberByDispID failed: %08lx\n", hres);
3696
3697 hres = IDispatchEx_GetMemberName(dispex, func_id, &str);
3698 ok(hres == DISP_E_MEMBERNOTFOUND, "GetMemberName failed: %08lx\n", hres);
3699 hres = IDispatchEx_GetMemberProperties(dispex, func_id, 0, &propflags);
3700 ok(hres == DISP_E_MEMBERNOTFOUND, "GetMemberProperties failed: %08lx\n", hres);
3701
3702 hres = IDispatchEx_GetMemberName(dispex, prop_id, &str);
3703 ok(hres == S_OK, "GetMemberName failed: %08lx\n", hres);
3704 ok(!wcscmp(str, L"prop"), "GetMemberName returned %s\n", wine_dbgstr_w(str));
3706 propflags = 0xdeadbeef;
3707 hres = IDispatchEx_GetMemberProperties(dispex, prop_id, 0, &propflags);
3708 ok(hres == S_OK, "GetMemberProperties failed: %08lx\n", hres);
3709 ok(propflags == 0, "propflags = %08lx", propflags);
3710
3711 str = SysAllocString(L"prop");
3712 hres = IDispatchEx_DeleteMemberByName(dispex, str, 0);
3713 ok(hres == S_OK, "DeleteMemberByName failed: %08lx\n", hres);
3715
3716 hres = IDispatchEx_GetMemberName(dispex, prop_id, &str);
3717 ok(hres == DISP_E_MEMBERNOTFOUND, "GetMemberName failed: %08lx\n", hres);
3718 hres = IDispatchEx_GetMemberProperties(dispex, prop_id, 0, &propflags);
3719 ok(hres == DISP_E_MEMBERNOTFOUND, "GetMemberProperties failed: %08lx\n", hres);
3720
3721 IDispatchEx_Release(dispex);
3722 IActiveScript_Release(script);
3723}
3724
3725static void test_destructors(void)
3726{
3727 static const WCHAR cyclic_refs[] = L"(function() {\n"
3728 "var a = function() {}, c = { 'a': a, 'ref': Math }, b = { 'a': a, 'c': c };\n"
3729 "Math.ref = { 'obj': testDestrObj, 'ref': Math, 'a': a, 'b': b };\n"
3730 "a.ref = { 'ref': Math, 'a': a }; b.ref = Math.ref;\n"
3731 "a.self = a; b.self = b; c.self = c;\n"
3732 "})(), true";
3733 static DISPID propput_dispid = DISPID_PROPERTYPUT;
3734 IActiveScript *script, *script2;
3735 IDispatchEx *dispex, *dispex2;
3736 IActiveScriptParse *parser;
3737 DISPPARAMS dp = { 0 };
3738 VARIANT v;
3739 DISPID id;
3740 BSTR str;
3741 HRESULT hres;
3742
3743 V_VT(&v) = VT_EMPTY;
3744 hres = parse_script_expr(L"Math.ref = testDestrObj, isNaN.ref = testDestrObj, true", &v, &script);
3745 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3746 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
3747
3748 SET_EXPECT(testdestrobj);
3749 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
3750 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08lx\n", hres);
3751 CHECK_CALLED(testdestrobj);
3752
3753 IActiveScript_Release(script);
3754
3755 V_VT(&v) = VT_EMPTY;
3756 hres = parse_script_expr(cyclic_refs, &v, &script);
3757 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3758 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
3759
3760 SET_EXPECT(testdestrobj);
3761 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_UNINITIALIZED);
3762 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_UNINITIALIZED) failed: %08lx\n", hres);
3763 CHECK_CALLED(testdestrobj);
3764
3765 IActiveScript_Release(script);
3766
3767 V_VT(&v) = VT_EMPTY;
3768 hres = parse_script_expr(cyclic_refs, &v, &script);
3769 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3770 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
3771
3772 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser);
3773 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
3774
3775 SET_EXPECT(testdestrobj);
3776 V_VT(&v) = VT_EMPTY;
3777 hres = IActiveScriptParse_ParseScriptText(parser, L"Math.ref = undefined, CollectGarbage(), true",
3778 NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &v, NULL);
3779 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3780 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
3782 CHECK_CALLED(testdestrobj);
3783
3784 IActiveScript_Release(script);
3785
3786 /* Create a cyclic ref across two jscript engines */
3787 V_VT(&v) = VT_EMPTY;
3788 hres = parse_script_expr(cyclic_refs, &v, &script);
3789 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3790 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
3791
3792 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser);
3793 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
3794
3795 V_VT(&v) = VT_EMPTY;
3796 hres = IActiveScriptParse_ParseScriptText(parser, L"Math.ref", NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &v, NULL);
3797 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3798 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3799 ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(v) = NULL\n");
3800
3801 hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex);
3802 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
3803 VariantClear(&v);
3804
3805 V_VT(&v) = VT_EMPTY;
3806 hres = parse_script_expr(L"new Object()", &v, &script2);
3807 ok(hres == S_OK, "parse_script_expr failed: %08lx\n", hres);
3808 ok(V_VT(&v) == VT_DISPATCH, "V_VT(v) = %d\n", V_VT(&v));
3809 ok(V_DISPATCH(&v) != NULL, "V_DISPATCH(v) = NULL\n");
3810
3811 hres = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IDispatchEx, (void**)&dispex2);
3812 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
3813 VariantClear(&v);
3814
3815 dp.cArgs = dp.cNamedArgs = 1;
3816 dp.rgdispidNamedArgs = &propput_dispid;
3817 dp.rgvarg = &v;
3818
3819 str = SysAllocString(L"diff_ctx");
3820 hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
3821 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3823
3824 V_VT(&v) = VT_DISPATCH;
3825 V_DISPATCH(&v) = (IDispatch*)dispex2;
3826 hres = IDispatchEx_Invoke(dispex, id, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
3827 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3828
3829 str = SysAllocString(L"ref");
3830 hres = IDispatchEx_GetDispID(dispex2, str, fdexNameEnsure, &id);
3831 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
3833
3834 V_VT(&v) = VT_DISPATCH;
3835 V_DISPATCH(&v) = (IDispatch*)dispex;
3836 hres = IDispatchEx_Invoke(dispex2, id, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
3837 ok(hres == S_OK, "Invoke failed: %08lx\n", hres);
3838
3839 IDispatchEx_Release(dispex2);
3840 IDispatchEx_Release(dispex);
3841
3842 SET_EXPECT(testdestrobj);
3843 V_VT(&v) = VT_EMPTY;
3844 hres = IActiveScriptParse_ParseScriptText(parser, L"Math.ref = undefined, CollectGarbage(), true",
3845 NULL, NULL, NULL, 0, 0, SCRIPTTEXT_ISEXPRESSION, &v, NULL);
3846 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3847 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
3849 CHECK_CALLED(testdestrobj);
3850
3851 IActiveScript_Release(script2);
3852 IActiveScript_Release(script);
3853}
3854
3855static void test_eval(void)
3856{
3857 IActiveScriptParse *parser;
3858 IDispatchEx *script_dispex;
3860 IActiveScript *engine;
3861 VARIANT arg, res;
3862 DISPPARAMS params;
3863 DISPID id, v_id;
3864 BSTR str;
3865 HRESULT hres;
3866
3867 engine = create_script();
3868
3869 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
3870 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
3871
3873 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
3874
3875 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
3876 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
3877
3878 SET_EXPECT(GetItemInfo_testVal);
3879 hres = IActiveScript_AddNamedItem(engine, L"testVal",
3880 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
3881 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
3882 CHECK_CALLED(GetItemInfo_testVal);
3883
3884 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
3885 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
3886
3887 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
3888 ok(hres == S_OK, "GetScriptDispatch failed: %08lx\n", hres);
3889 ok(script_disp != NULL, "script_disp == NULL\n");
3890
3891 hres = IDispatch_QueryInterface(script_disp, &IID_IDispatchEx, (void**)&script_dispex);
3892 ok(hres == S_OK, "Could not get IDispatchEx iface: %08lx\n", hres);
3893 IDispatch_Release(script_disp);
3894
3895 str = SysAllocString(L"eval");
3896 hres = IDispatchEx_GetDispID(script_dispex, str, 0, &id);
3897 ok(hres == S_OK, "Could not get eval dispid: %08lx\n", hres);
3899
3900 params.rgvarg = &arg;
3901 params.rgdispidNamedArgs = NULL;
3902 params.cArgs = 1;
3903 params.cNamedArgs = 0;
3904 V_VT(&arg) = VT_BSTR;
3905
3906 V_BSTR(&arg) = SysAllocString(L"var v = 1;");
3907 V_VT(&res) = VT_ERROR;
3908 hres = IDispatchEx_InvokeEx(script_dispex, id, 0, DISPATCH_METHOD, &params, &res, NULL, NULL);
3909 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3910 ok(V_VT(&res) == VT_EMPTY, "eval returned type %u\n", V_VT(&res));
3912
3913 V_BSTR(&arg) = SysAllocString(L"v");
3914 V_VT(&res) = VT_ERROR;
3915 hres = IDispatchEx_InvokeEx(script_dispex, id, 0, DISPATCH_METHOD, &params, &res, NULL, NULL);
3916 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3917 ok(V_VT(&res) == VT_I4, "eval returned type %u\n", V_VT(&res));
3918 ok(V_I4(&res) == 1, "eval returned %ld\n", V_I4(&res));
3920
3921 str = SysAllocString(L"v");
3922 hres = IDispatchEx_GetDispID(script_dispex, str, 0, &v_id);
3923 ok(hres == S_OK, "Could not get v dispid: %08lx\n", hres);
3925
3926 params.rgvarg = NULL;
3927 params.cArgs = 0;
3928 V_VT(&res) = VT_ERROR;
3929 hres = IDispatchEx_InvokeEx(script_dispex, v_id, 0, DISPATCH_PROPERTYGET, &params, &res, NULL, NULL);
3930 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
3931 ok(V_VT(&res) == VT_I4, "eval returned type %u\n", V_VT(&res));
3932 ok(V_I4(&res) == 1, "eval returned %ld\n", V_I4(&res));
3933
3934 SET_EXPECT(global_calleval_i);
3936 L"(function(){"
3937 L" var v = 2;"
3938 L" callEval(eval);"
3939 L" ok(x === 5, 'x = ' + x);"
3940 L"})();",
3941 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
3942 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
3943 CHECK_CALLED(global_calleval_i);
3944
3945 str = SysAllocString(L"x");
3946 hres = IDispatchEx_GetDispID(script_dispex, str, 0, &id);
3947 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(x) returned %08lx\n", hres);
3949
3950 IDispatchEx_Release(script_dispex);
3952 close_script(engine);
3953}
3954
3956{
3957 WCHAR str[1024];
3959};
3960
3961static void run_bom_tests(void)
3962{
3963 BSTR src;
3964 int i;
3965 HRESULT hres;
3966 struct bom_test bom_tests[] = {
3967 {L"var a = 1; reportSuccess();", S_OK},
3968 {L"\xfeffvar a = 1; reportSuccess();", S_OK},
3969 {L"v\xfeff" "ar a = 1; reportSuccess();", JS_E_OUT_OF_MEMORY},
3970 {L"var\xfeff a = 1; reportSuccess();", S_OK},
3971 {L"var a = 1; \xfeffreportSuccess();", S_OK},
3972 {L"var a = 1; report\xfeffSuccess();", JS_E_OUT_OF_MEMORY},
3973 {L"var a = 1; reportSuccess\xfeff();", S_OK},
3974 {L"var a = 1; reportSuccess(\xfeff);", S_OK},
3975 {L"var a =\xfeff 1; reportSuccess(\xfeff);", S_OK},
3976 {L"\xfeffvar a =\xfeff\xfeff 1; reportSuccess(\xfeff);", S_OK},
3977 {L""}
3978 };
3979
3981
3982 for (i = 0; bom_tests[i].str[0]; i++)
3983 {
3984 if(bom_tests[i].hres == S_OK)
3985 {
3986 SET_EXPECT(global_success_d);
3987 SET_EXPECT(global_success_i);
3988 src = SysAllocString(bom_tests[i].str);
3989 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
3990 ok(hres == S_OK, "test %s failed with %08lx\n", wine_dbgstr_w(src), hres);
3992 CHECK_CALLED(global_success_d);
3993 CHECK_CALLED(global_success_i);
3994 }
3995 else
3996 {
3997 src = SysAllocString(bom_tests[i].str);
3998 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
3999 todo_wine ok(hres == bom_tests[i].hres, "test %s returned with %08lx\n", wine_dbgstr_w(src), hres);
4001 }
4002 }
4003}
4004
4005static BOOL run_tests(void)
4006{
4007 HRESULT hres;
4008
4009 if(invoke_version) {
4011
4013 if(!script) {
4014 win_skip("Could not create script\n");
4015 return FALSE;
4016 }
4017 IActiveScript_Release(script);
4018 }
4019
4021
4022 run_script(L"");
4023 run_script(L"/* empty */ ;");
4024
4025 SET_EXPECT(global_propget_d);
4026 SET_EXPECT(global_propget_i);
4027 run_script(L"testPropGet;");
4028 CHECK_CALLED(global_propget_d);
4029 CHECK_CALLED(global_propget_i);
4030
4031 SET_EXPECT(global_propput_d);
4032 SET_EXPECT(global_propput_i);
4033 run_script(L"testPropPut = 1;");
4034 CHECK_CALLED(global_propput_d);
4035 CHECK_CALLED(global_propput_i);
4036
4037 SET_EXPECT(global_propputref_d);
4038 SET_EXPECT(global_propputref_i);
4039 run_script(L"testPropPutRef = new Object();");
4040 CHECK_CALLED(global_propputref_d);
4041 CHECK_CALLED(global_propputref_i);
4042
4043 SET_EXPECT(global_propputref_d);
4044 SET_EXPECT(global_propputref_i);
4045 run_script(L"testPropPutRef = testObj;");
4046 CHECK_CALLED(global_propputref_d);
4047 CHECK_CALLED(global_propputref_i);
4048
4049 SET_EXPECT(global_success_d);
4050 SET_EXPECT(global_success_i);
4051 run_script(L"reportSuccess();");
4052 CHECK_CALLED(global_success_d);
4053 CHECK_CALLED(global_success_i);
4054
4055 SET_EXPECT(testobj_delete_test);
4056 run_script(L"ok((delete testObj.deleteTest) === true, 'delete testObj.deleteTest did not return true');");
4057 CHECK_CALLED(testobj_delete_test);
4058
4059 SET_EXPECT(testobj_delete_nodelete);
4060 run_script(L"ok((delete testObj.noDeleteTest) === false, 'delete testObj.noDeleteTest did not return false');");
4061 CHECK_CALLED(testobj_delete_nodelete);
4062
4063 SET_EXPECT(global_propdelete_d);
4064 SET_EXPECT(DeleteMemberByDispID);
4065 run_script(L"ok((delete testPropDelete) === true, 'delete testPropDelete did not return true');");
4066 CHECK_CALLED(global_propdelete_d);
4067 CHECK_CALLED(DeleteMemberByDispID);
4068
4069 SET_EXPECT(global_nopropdelete_d);
4070 SET_EXPECT(DeleteMemberByDispID_false);
4071 run_script(L"ok((delete testNoPropDelete) === false, 'delete testPropDelete did not return false');");
4072 CHECK_CALLED(global_nopropdelete_d);
4073 CHECK_CALLED(DeleteMemberByDispID_false);
4074
4075 SET_EXPECT(global_propdeleteerror_d);
4076 SET_EXPECT(DeleteMemberByDispID_error);
4077 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, L"delete testPropDeleteError;");
4078 ok(hres == E_FAIL, "unexpected result %08lx\n", hres);
4079 CHECK_CALLED(global_propdeleteerror_d);
4080 CHECK_CALLED(DeleteMemberByDispID_error);
4081
4082 SET_EXPECT(puredisp_prop_d);
4083 run_script(L"ok((delete pureDisp.prop) === false, 'delete pureDisp.prop did not return true');");
4084 CHECK_CALLED(puredisp_prop_d);
4085
4086 SET_EXPECT(puredisp_noprop_d);
4087 run_script(L"ok((delete pureDisp.noprop) === true, 'delete pureDisp.noprop did not return false');");
4088 CHECK_CALLED(puredisp_noprop_d);
4089
4090 SET_EXPECT(puredisp_value);
4091 run_script(L"var t=pureDisp; t=t(false);");
4092 CHECK_CALLED(puredisp_value);
4093
4094 SET_EXPECT(puredisp_value);
4095 run_script(L"var t = {func: pureDisp}; t = t.func(false);");
4096 CHECK_CALLED(puredisp_value);
4097
4098 SET_EXPECT(dispexfunc_value);
4099 run_script(L"var t = dispexFunc; t = t(false);");
4100 CHECK_CALLED(dispexfunc_value);
4101
4102 SET_EXPECT(dispexfunc_value);
4103 run_script(L"var t = {func: dispexFunc}; t = t.func(false);");
4104 CHECK_CALLED(dispexfunc_value);
4105
4106 SET_EXPECT(dispexfunc_value);
4107 run_script(L"Function.prototype.apply.call(dispexFunc, testObj, [true]);");
4108 CHECK_CALLED(dispexfunc_value);
4109
4110 SET_EXPECT(puredisp_value);
4111 run_script(L"Function.prototype.apply.call(pureDisp, testObj, [true]);");
4112 CHECK_CALLED(puredisp_value);
4113
4114 run_script(L"(function reportSuccess() {})()");
4115
4116 run_script(L"ok(typeof(test) === 'object', \"typeof(test) != 'object'\");");
4117
4118 run_script(L"function reportSuccess() {}; reportSuccess();");
4119
4120 SET_EXPECT(global_propget_d);
4121 run_script(L"var testPropGet");
4122 CHECK_CALLED(global_propget_d);
4123
4124 SET_EXPECT(global_propget_d);
4125 run_script(L"eval('var testPropGet;');");
4126 CHECK_CALLED(global_propget_d);
4127
4128 run_script(L"var testPropGet; function testPropGet() {}");
4129
4130 SET_EXPECT(global_notexists_d);
4131 run_script(L"var notExists; notExists = 1;");
4132 CHECK_CALLED(global_notexists_d);
4133
4134 SET_EXPECT(testobj_notexists_d);
4135 run_script(L"testObj.notExists;");
4136 CHECK_CALLED(testobj_notexists_d);
4137
4138 run_script(L"function f() { var testPropGet; }");
4139 run_script(L"(function () { var testPropGet; })();");
4140 run_script(L"(function () { eval('var testPropGet;'); })();");
4141
4142 SET_EXPECT(invoke_func);
4143 run_script(L"ok(propGetFunc() == 0, \"Incorrect propGetFunc value\");");
4144 CHECK_CALLED(invoke_func);
4145 run_script(L"ok(propGetFunc(1) == 1, \"Incorrect propGetFunc value\");");
4146 run_script(L"ok(propGetFunc(1, 2) == 2, \"Incorrect propGetFunc value\");");
4147 SET_EXPECT(invoke_func);
4148 run_script(L"ok(propGetFunc().toString() == 0, \"Incorrect propGetFunc value\");");
4149 CHECK_CALLED(invoke_func);
4150 run_script(L"ok(propGetFunc(1).toString() == 1, \"Incorrect propGetFunc value\");");
4151 SET_EXPECT(invoke_func);
4152 run_script(L"propGetFunc(1);");
4153 CHECK_CALLED(invoke_func);
4154
4155 run_script(L"objectFlag(1).toString();");
4156
4157 run_script(L"(function() { var tmp = (function () { return testObj; })()(1);})();");
4158 run_script(L"(function() { var tmp = (function () { return testObj; })()();})();");
4159
4160 run_script(L"ok((testObj instanceof Object) === false, 'testObj is instance of Object');");
4161
4162 SET_EXPECT(testobj_prop_d);
4163 run_script(L"ok(('prop' in testObj) === true, 'prop is not in testObj');");
4164 CHECK_CALLED(testobj_prop_d);
4165
4166 SET_EXPECT(testobj_noprop_d);
4167 run_script(L"ok(('noprop' in testObj) === false, 'noprop is in testObj');");
4168 CHECK_CALLED(testobj_noprop_d);
4169
4170 SET_EXPECT(testobj_prop_d);
4171 run_script(L"ok(Object.prototype.hasOwnProperty.call(testObj, 'prop') === true, 'hasOwnProperty(\\\"prop\\\") returned false');");
4172 CHECK_CALLED(testobj_prop_d);
4173
4174 SET_EXPECT(testobj_noprop_d);
4175 run_script(L"ok(Object.prototype.hasOwnProperty.call(testObj, 'noprop') === false, 'hasOwnProperty(\\\"noprop\\\") returned true');");
4176 CHECK_CALLED(testobj_noprop_d);
4177
4178 SET_EXPECT(puredisp_prop_d);
4179 run_script(L"ok(Object.prototype.hasOwnProperty.call(pureDisp, 'prop') === true, 'hasOwnProperty(\\\"noprop\\\") returned false');");
4180 CHECK_CALLED(puredisp_prop_d);
4181
4182 SET_EXPECT(puredisp_noprop_d);
4183 run_script(L"ok(Object.prototype.hasOwnProperty.call(pureDisp, 'noprop') === false, 'hasOwnProperty(\\\"noprop\\\") returned true');");
4184 CHECK_CALLED(puredisp_noprop_d);
4185
4186 SET_EXPECT(testobj_value);
4187 run_script(L"ok(String(testObj) === '1', 'wrong testObj value');");
4188 CHECK_CALLED(testobj_value);
4189
4190 SET_EXPECT(testobj_value);
4191 run_script(L"ok(String.prototype.concat.call(testObj, ' OK') === '1 OK', 'wrong concat result');");
4192 CHECK_CALLED(testobj_value);
4193
4194 SET_EXPECT(testobj_construct);
4195 run_script(L"var t = new testObj(1);");
4196 CHECK_CALLED(testobj_construct);
4197
4198 SET_EXPECT(global_propget_d);
4199 SET_EXPECT(global_propget_i);
4200 run_script(L"this.testPropGet;");
4201 CHECK_CALLED(global_propget_d);
4202 CHECK_CALLED(global_propget_i);
4203
4204 SET_EXPECT(global_propputref_d);
4205 SET_EXPECT(global_propputref_i);
4206 run_script(L"testPropPutRef = nullDisp;");
4207 CHECK_CALLED(global_propputref_d);
4208 CHECK_CALLED(global_propputref_i);
4209
4210 SET_EXPECT(global_propget_d);
4211 SET_EXPECT(global_propget_i);
4212 run_script(L"(function () { this.testPropGet; })();");
4213 CHECK_CALLED(global_propget_d);
4214 CHECK_CALLED(global_propget_i);
4215
4216 run_script(L"testThis(this);");
4217 run_script(L"(function () { testThis(this); })();");
4218 run_script(L"function x() { testThis(this); }; x();");
4219 run_script(L"var t = {func: function () { ok(this === t, 'this !== t'); }}; with(t) { func(); }");
4220 run_script(L"function x() { testThis(this); }; with({y: 1}) { x(); }");
4221 run_script(L"(function () { function x() { testThis(this);} x(); })();");
4222
4223 SET_EXPECT(testobj_onlydispid_d);
4224 SET_EXPECT(testobj_onlydispid_i);
4225 run_script(L"ok(typeof(testObj.onlyDispID) === 'unknown', 'unexpected typeof(testObj.onlyDispID)');");
4226 CHECK_CALLED(testobj_onlydispid_d);
4227 CHECK_CALLED(testobj_onlydispid_i);
4228
4229 SET_EXPECT(testobj_getidfail_d);
4230 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, L"testObj.notExists = testObj.getIDFail;");
4231 ok(hres == E_FAIL, "parse_script returned %08lx\n", hres);
4232 CHECK_CALLED(testobj_getidfail_d);
4233
4234 SET_EXPECT(global_propget_d);
4235 SET_EXPECT(global_propget_i);
4236 SET_EXPECT(testobj_getidfail_d);
4237 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, L"testObj.getIDFail = testPropGet;");
4238 ok(hres == E_FAIL, "parse_script returned %08lx\n", hres);
4239 CHECK_CALLED(global_propget_d);
4240 CHECK_CALLED(global_propget_i);
4241 CHECK_CALLED(testobj_getidfail_d);
4242
4243 SET_EXPECT(global_propargput_d);
4244 SET_EXPECT(global_propargput_i);
4245 run_script(L"var t=0; propArgPutG(t++, t++) = t++;");
4246 CHECK_CALLED(global_propargput_d);
4247 CHECK_CALLED(global_propargput_i);
4248
4249 SET_EXPECT(global_propargput_d);
4250 SET_EXPECT(global_propargput_i);
4251 run_script(L"var t=0; test.propArgPutO(t++, t++) = t++;");
4252 CHECK_CALLED(global_propargput_d);
4253 CHECK_CALLED(global_propargput_i);
4254
4255 SET_EXPECT(global_propargputop_d);
4256 SET_EXPECT(global_propargputop_get_i);
4257 SET_EXPECT(global_propargputop_put_i);
4258 run_script(L"var t=0; propArgPutOp(t++, t++) += t++;");
4259 CHECK_CALLED(global_propargputop_d);
4260 CHECK_CALLED(global_propargputop_get_i);
4261 CHECK_CALLED(global_propargputop_put_i);
4262
4263 SET_EXPECT(global_propargputop_d);
4264 SET_EXPECT(global_propargputop_get_i);
4265 SET_EXPECT(global_propargputop_put_i);
4266 run_script(L"var t=0; propArgPutOp(t++, t++) ^= 14;");
4267 CHECK_CALLED(global_propargputop_d);
4268 CHECK_CALLED(global_propargputop_get_i);
4269 CHECK_CALLED(global_propargputop_put_i);
4270
4271 SET_EXPECT(global_testargtypes_i);
4272 run_script(L"testArgTypes(dispUnk, intProp(), intProp, getShort(), shortProp,"
4273 L"function(i1,ui1,ui2,r4,i4ref,ui4,nullunk,d,i,s) {"
4274 L" ok(getVT(i) === 'VT_I4', 'getVT(i) = ' + getVT(i));"
4275 L" ok(getVT(s) === 'VT_I4', 'getVT(s) = ' + getVT(s));"
4276 L" ok(getVT(d) === 'VT_DISPATCH', 'getVT(d) = ' + getVT(d));"
4277 L" ok(getVT(nullunk) === 'VT_DISPATCH', 'getVT(nullunk) = ' + getVT(nullunk));"
4278 L" ok(nullunk === null, 'nullunk !== null');"
4279 L" ok(getVT(ui4) === 'VT_R8', 'getVT(ui4) = ' + getVT(ui4));"
4280 L" ok(ui4 > 0, 'ui4 = ' + ui4);"
4281 L" ok(getVT(i4ref) === 'VT_I4', 'getVT(i4ref) = ' + getVT(i4ref));"
4282 L" ok(i4ref === 2, 'i4ref = ' + i4ref);"
4283 L" ok(r4 === 0.5, 'r4 = ' + r4);"
4284 L" ok(getVT(r4) === 'VT_R8', 'getVT(r4) = ' + getVT(r4));"
4285 L" ok(getVT(ui2) === 'VT_I4', 'getVT(ui2) = ' + getVT(ui2));"
4286 L" ok(getVT(ui1) === 'VT_I4', 'getVT(ui1) = ' + getVT(ui1));"
4287 L" ok(ui1 === 4, 'ui1 = ' + ui1);"
4288 L" ok(getVT(i1) === 'VT_I4', 'getVT(i1) = ' + getVT(i1));"
4289 L" ok(i1 === 5, 'i1 = ' + i1);"
4290 L"});");
4291 CHECK_CALLED(global_testargtypes_i);
4292
4293 SET_EXPECT(testobj_withprop_d);
4294 SET_EXPECT(testobj_withprop_i);
4295 run_script(L"var t = (function () { with(testObj) { return withProp; }})(); ok(t === 1, 't = ' + t);");
4296 CHECK_CALLED(testobj_withprop_d);
4297 CHECK_CALLED(testobj_withprop_i);
4298
4299 SET_EXPECT(testobj_tolocalestr_d);
4300 SET_EXPECT(testobj_tolocalestr_i);
4301 run_script(L"var t = [testObj].toLocaleString(); ok(t === '1234', 't = ' + t);");
4302 CHECK_CALLED(testobj_tolocalestr_d);
4303 CHECK_CALLED(testobj_tolocalestr_i);
4304
4305 run_script(L"@set @t=2\nok(@t === 2, '@t = ' + @t);");
4306
4307 SET_EXPECT(global_success_d);
4308 SET_EXPECT(global_success_i);
4309 run_script(L"@if(true)\nif(@_jscript) reportSuccess();\n@end");
4310 CHECK_CALLED(global_success_d);
4311 CHECK_CALLED(global_success_i);
4312
4315 SET_EXPECT(testobj_newenum);
4316 SET_EXPECT(enumvariant_next_0);
4317 run_script(L"new Enumerator(testObj);");
4318 CHECK_CALLED(testobj_newenum);
4319 CHECK_CALLED(enumvariant_next_0);
4320
4323 SET_EXPECT(testobj_newenum);
4324 SET_EXPECT(enumvariant_next_0);
4325 SET_EXPECT(enumvariant_reset);
4326 run_script(L"(function () {"
4327 L" var testEnumObj = new Enumerator(testObj);"
4328 L" var tmp = testEnumObj.moveFirst();"
4329 L" ok(tmp == undefined, \"testEnumObj.moveFirst() = \" + tmp);"
4330 L"})()");
4331 CHECK_CALLED(testobj_newenum);
4332 CHECK_CALLED(enumvariant_next_0);
4333 CHECK_CALLED(enumvariant_reset);
4334
4337 SET_EXPECT(testobj_newenum);
4338 SET_EXPECT(enumvariant_next_0);
4339 SET_EXPECT(enumvariant_next_1);
4340 run_script(L"(function () {"
4341 L" var testEnumObj = new Enumerator(testObj);"
4342 L" while (!testEnumObj.atEnd())"
4343 L" {"
4344 L" ok(testEnumObj.item() == 123, "
4345 L" \"testEnumObj.item() = \"+testEnumObj.item());"
4346 L" testEnumObj.moveNext();"
4347 L" }"
4348 L"})()");
4349 CHECK_CALLED(testobj_newenum);
4350 CHECK_CALLED(enumvariant_next_0);
4351 CHECK_CALLED(enumvariant_next_1);
4352
4353 run_from_res("lang.js");
4354 run_from_res("api.js");
4355 run_from_res("regexp.js");
4356 run_from_res("cc.js");
4357
4360 test_start();
4362
4363 hres = parse_script(0, L"test.testThis2(this);");
4364 ok(hres == S_OK, "unexpected result %08lx\n", hres);
4365 hres = parse_script(0, L"(function () { test.testThis2(this); })();");
4366 ok(hres == S_OK, "unexpected result %08lx\n", hres);
4367
4368 hres = parse_htmlscript(L"<!--");
4369 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
4370 hres = parse_htmlscript(L"-->");
4371 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
4372 hres = parse_htmlscript(L"<!--\nvar a=1;\n-->\n");
4373 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
4374 hres = parse_htmlscript(L"<!--\n<!-- ignore this\n-->\n");
4375 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
4376 hres = parse_htmlscript(L"var a=1;\nif(a-->0) a=5;\n");
4377 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
4378 hres = parse_htmlscript(L"var a=1;\nif(a\n-->0) a=5;\n");
4379 ok(hres != S_OK, "ParseScriptText have not failed\n");
4380
4382 test_invokeex();
4383 test_members();
4385 test_eval();
4387
4388 run_bom_tests();
4389
4390 return TRUE;
4391}
4392
4393static void test_parse_proc(void)
4394{
4395 VARIANT args[2];
4396 DISPPARAMS dp = {args};
4397
4398 dp.cArgs = 0;
4399 invoke_procedure(NULL, L"return true;", &dp);
4400
4401 dp.cArgs = 1;
4402 V_VT(args) = VT_EMPTY;
4403 invoke_procedure(NULL, L"return arguments.length == 1;", &dp);
4404
4405 V_VT(args) = VT_BOOL;
4406 V_BOOL(args) = VARIANT_TRUE;
4407 invoke_procedure(L" x ", L"return x;", &dp);
4408
4409 dp.cArgs = 2;
4410 V_VT(args) = VT_I4;
4411 V_I4(args) = 2;
4412 V_VT(args+1) = VT_I4;
4413 V_I4(args+1) = 1;
4414 invoke_procedure(L" _x1 , y_2", L"return _x1 === 1 && y_2 === 2;", &dp);
4415}
4416
4417static void run_encoded_tests(void)
4418{
4419 BSTR src;
4420 HRESULT hres;
4421
4423
4424 SET_EXPECT(global_success_d);
4425 SET_EXPECT(global_success_i);
4426 /* |reportSuccess(); | */
4427 run_script(L"#@~^EAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
4428 CHECK_CALLED(global_success_d);
4429 CHECK_CALLED(global_success_i);
4430
4431 SET_EXPECT(global_success_d);
4432 SET_EXPECT(global_success_i);
4433 run_script(L"reportSuccess();");
4434 CHECK_CALLED(global_success_d);
4435 CHECK_CALLED(global_success_i);
4436
4437 SET_EXPECT(global_success_d);
4438 SET_EXPECT(global_success_i);
4439 /* |Success | */
4440 run_script(L"report#@~^BwAAAA==j!m^\x7f/k2QIAAA==^#~@();");
4441 CHECK_CALLED(global_success_d);
4442 CHECK_CALLED(global_success_i);
4443
4444 SET_EXPECT(global_success_d);
4445 SET_EXPECT(global_success_i);
4446 /* |\r\n\treportSuccess();\r\n | */
4447 run_script(L"#@~^GQAAAA==@#@&d.\x7fwKDYUE1^+k/c#p@#@&OAYAAA==^#~@");
4448 CHECK_CALLED(global_success_d);
4449 CHECK_CALLED(global_success_i);
4450
4451 /* v */
4452 src = SysAllocString(L"#@~^EAA*AA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
4453 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
4455 ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08lx\n", hres);
4456
4457 /* vv */
4458 src = SysAllocString(L"#@~^EAAAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
4459 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
4461 ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08lx\n", hres);
4462
4463 /* v */
4464 src = SysAllocString(L"#@~^EAAAAA^=.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
4465 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
4467 ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08lx\n", hres);
4468
4469 /* v */
4470 src = SysAllocString(L"#@~^EAAAAA==.\x7fwGMYUEm1ekd`*iAQYAAA==^#~@");
4471 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
4473 ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08lx\n", hres);
4474
4475 /* vv */
4476 src = SysAllocString(L"#@~^EAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^~#@");
4477 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
4479 ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08lx\n", hres);
4480}
4481
4482static void run_benchmark(const char *script_name)
4483{
4484 IActiveScriptParse *parser;
4485 IActiveScript *engine;
4486 ULONG start, end;
4487 BSTR src;
4488 HRESULT hres;
4489
4490 engine = create_script();
4491 if(!engine)
4492 return;
4493
4494 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
4495 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
4496 if (FAILED(hres)) {
4497 IActiveScript_Release(engine);
4498 return;
4499 }
4500
4502 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
4503
4504 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
4505 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
4506
4507 hres = IActiveScript_AddNamedItem(engine, L"test",
4508 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE);
4509 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
4510
4511 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
4512 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
4513
4515
4516 start = GetTickCount();
4518 end = GetTickCount();
4519 ok(hres == S_OK, "%s: ParseScriptText failed: %08lx\n", script_name, hres);
4520
4521 trace("%s ran in %lu ms\n", script_name, end-start);
4522
4523 IActiveScript_Release(engine);
4526}
4527
4528static void run_benchmarks(void)
4529{
4530 trace("Running benchmarks...\n");
4531
4532 run_benchmark("dna.js");
4533 run_benchmark("base64.js");
4534 run_benchmark("validateinput.js");
4535}
4536
4538{
4539 IActiveScriptProperty *script_prop;
4540 HRESULT hres;
4541
4542 hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
4543 &IID_IActiveScriptProperty, (void**)&script_prop);
4544 if(FAILED(hres))
4545 return FALSE;
4546 IActiveScriptProperty_Release(script_prop);
4547
4548 return parse_script(0, L"if(!('localeCompare' in String.prototype)) throw 1;") == S_OK;
4549}
4550
4552{
4553 int argc;
4554 char **argv;
4555
4557
4559
4560 if(!check_jscript()) {
4561 win_skip("Broken engine, probably too old\n");
4562 }else if(argc > 2) {
4563 invoke_version = 2;
4564 run_from_file(argv[2]);
4565 }else {
4566 trace("invoke version 0\n");
4567 invoke_version = 0;
4568 run_tests();
4569
4570 trace("invoke version 2\n");
4571 invoke_version = 2;
4572 if(run_tests()) {
4573 trace("JSctipt.Encode tests...\n");
4575 trace("ParseProcedureText tests...\n");
4577 }
4578
4581 }
4582
4584}
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
@ 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 broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
#define ARRAY_SIZE(A)
Definition: main.h:20
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
int const char const *const int const line_number
Definition: debug_heap.cpp:499
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
#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 CALLBACK
Definition: compat.h:35
#define MapViewOfFile
Definition: compat.h:745
#define MultiByteToWideChar
Definition: compat.h:110
@ 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
@ VT_R8
Definition: compat.h:2300
@ VT_CY
Definition: compat.h:2301
@ VT_VARIANT
Definition: compat.h:2307
@ VT_I1
Definition: compat.h:2310
@ VT_I4
Definition: compat.h:2298
@ VT_DATE
Definition: compat.h:2302
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_UI4
Definition: compat.h:2313
@ VT_EMPTY
Definition: compat.h:2295
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HRSRC WINAPI FindResourceA(HMODULE hModule, LPCSTR name, LPCSTR type)
Definition: res.c:155
DWORD WINAPI SizeofResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:568
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
LCID WINAPI GetUserDefaultLCID(void)
Definition: locale.c:1216
LANGID WINAPI GetUserDefaultLangID(void)
Definition: locale.c:1182
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1675
LCID lcid
Definition: locale.c:5660
ULONG WINAPI DECLSPEC_HOTPATCH GetTickCount(void)
Definition: sync.c:182
MonoAssembly int argc
Definition: metahost.c:107
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
Definition: safearray.c:1137
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
Definition: safearray.c:1168
SAFEARRAY *WINAPI SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsabound)
Definition: safearray.c:600
#define swprintf
Definition: precomp.h:40
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint start
Definition: gl.h:1545
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
struct _cl_event * event
Definition: glext.h:7739
GLuint res
Definition: glext.h:9613
GLenum src
Definition: glext.h:6340
GLsizeiptr size
Definition: glext.h:5919
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLuint GLfloat * val
Definition: glext.h:7180
GLuint GLuint num
Definition: glext.h:9618
GLenum GLsizei len
Definition: glext.h:6722
GLuint id
Definition: glext.h:5910
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
static DISPID propput_dispid
Definition: interp.c:27
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
const char * filename
Definition: ioapi.h:137
#define wine_dbgstr_w
Definition: kernel32.h:34
USHORT LANGID
Definition: mui.h:9
#define win_skip
Definition: minitest.h:67
int winetest_interactive
#define todo_wine_if(is_todo)
Definition: minitest.h:81
#define todo_wine
Definition: minitest.h:80
#define error(str)
Definition: mkdosfs.c:1605
static struct test_info tests[]
static void test_isvisible(void)
HRESULT hres
Definition: protocol.c:465
#define parse_script(p, s)
Definition: activex.c:681
static void test_error_reports(void)
Definition: run.c:2316
static BOOL check_jscript(void)
Definition: run.c:4537
#define DISPID_GLOBAL_VDATE
Definition: run.c:176
#define SET_EXPECT(func)
Definition: run.c:58
static BOOL use_english
Definition: run.c:197
static HRESULT WINAPI testObj_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
Definition: run.c:637
static HRESULT WINAPI pureDisp_GetIDsOfNames(IDispatchEx *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: run.c:832
static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
Definition: run.c:2039
#define test_grfdex(a, b)
Definition: run.c:225
static BOOL run_tests(void)
Definition: run.c:4005
static void test_invokeex(void)
Definition: run.c:3367
#define DISPID_GLOBAL_NULL_DISP
Definition: run.c:149
#define DISPID_GLOBAL_INTPROP
Definition: run.c:163
#define DISPID_GLOBAL_PROPARGPUTOP
Definition: run.c:173
static HRESULT WINAPI pureDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
Definition: run.c:821
static void test_eval(void)
Definition: run.c:3855
static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
Definition: run.c:2091
static ULONG WINAPI testDestrObj_Release(IDispatchEx *iface)
Definition: run.c:736
#define JS_E_INVALID_CHAR
Definition: run.c:191
static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
Definition: run.c:548
static ULONG WINAPI sp_AddRef(IServiceProvider *iface)
Definition: run.c:351
#define DISPID_GLOBAL_OBJECT_FLAG
Definition: run.c:155
static HRESULT WINAPI bindEventHandlerDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
Definition: run.c:931
static HRESULT WINAPI BindEventHandler_QueryInterface(IBindEventHandler *iface, REFIID riid, void **ppv)
Definition: run.c:898
#define DISPID_GLOBAL_TESTTHIS2
Definition: run.c:151
#define JS_E_SYNTAX
Definition: run.c:137
#define DISPID_GLOBAL_ISWIN64
Definition: run.c:156
static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *res, EXCEPINFO *pei, IServiceProvider *pspCaller)
Definition: run.c:436
static const IActiveScriptSiteVtbl ActiveScriptSite_CheckErrorVtbl
Definition: run.c:2124
static IDispatchEx testDestrObj
Definition: run.c:761
static const IServiceProviderVtbl sp_vtbl
Definition: run.c:368
static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
Definition: run.c:2076
#define DISPID_GLOBAL_TESTPROPPUTREF
Definition: run.c:168
static HRESULT WINAPI EnumVARIANT_Skip(IEnumVARIANT *This, ULONG celt)
Definition: run.c:304
#define ERROR_TODO_DESCRIPTION
Definition: run.c:2313
static ULONG WINAPI sp_Release(IServiceProvider *iface)
Definition: run.c:356
#define JS_E_OBJECT_EXPECTED
Definition: run.c:134
static HRESULT WINAPI sp_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: run.c:361
static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
Definition: run.c:455
static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
Definition: run.c:397
#define JS_E_MISSING_RBRACKET
Definition: run.c:138
static void _run_script(unsigned line, const WCHAR *src)
Definition: run.c:2700
static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: run.c:414
static const CLSID CLSID_JScript
Definition: run.c:50
static IActiveScript * script_engine
Definition: run.c:199
#define JS_E_SUBSCRIPT_OUT_OF_RANGE
Definition: run.c:132
static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
Definition: run.c:449
static ULONG WINAPI EnumVARIANT_Release(IEnumVARIANT *iface)
Definition: run.c:261
#define DISPID_GLOBAL_TESTNOPROPDELETE
Definition: run.c:182
static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
Definition: run.c:473
static HRESULT WINAPI pureDisp_Invoke(IDispatchEx *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *res, EXCEPINFO *ei, UINT *puArgErr)
Definition: run.c:852
static IDispatchExVtbl pureDispVtbl
Definition: run.c:886
static IDispatchExVtbl GlobalVtbl
Definition: run.c:1999
#define run_script(a)
Definition: run.c:2699
static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
Definition: run.c:430
#define JS_E_OUT_OF_MEMORY
Definition: run.c:190
#define DISPID_GLOBAL_DISPEXFUNC
Definition: run.c:167
#define DISPID_GLOBAL_TESTRES
Definition: run.c:165
static IDispatchEx pureDisp
Definition: run.c:896
static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: run.c:422
#define IActiveScriptParseProcedure2_ParseProcedureText
Definition: run.c:46
#define ERROR_TODO_PARSE
Definition: run.c:2311
static IServiceProvider sp_obj
Definition: run.c:375
#define CHECK_EXPECT(func)
Definition: run.c:67
#define JS_E_MISPLACED_RETURN
Definition: run.c:139
static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
Definition: run.c:2065
static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
Definition: run.c:2050
static HRESULT parse_script_expr(const WCHAR *expr, VARIANT *res, IActiveScript **engine_ret)
Definition: run.c:2935
#define DISPID_TESTOBJ_TOLOCALESTR
Definition: run.c:188
#define DISPID_TESTOBJ_WITHPROP
Definition: run.c:187
static HRESULT WINAPI EnumVARIANT_Clone(IEnumVARIANT *This, IEnumVARIANT **ppEnum)
Definition: run.c:319
#define DEFINE_EXPECT(func)
Definition: run.c:55
static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
Definition: run.c:461
static HRESULT WINAPI testObj_Invoke(IDispatchEx *iface, DISPID id, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, UINT *puArgErr)
Definition: run.c:479
#define IActiveScriptParse_InitNew
Definition: run.c:43
#define DISPID_GLOBAL_REPORTSUCCESS
Definition: run.c:143
static BOOL is_lang_english(void)
Definition: run.c:205
static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
Definition: run.c:244
#define DISPID_GLOBAL_THROWINT
Definition: run.c:174
#define IActiveScriptParse_ParseScriptText
Definition: run.c:44
#define DISPID_GLOBAL_TESTOBJ
Definition: run.c:147
#define IActiveScriptParseProcedure2_Release
Definition: run.c:45
static void test_number_localization(void)
Definition: run.c:3242
static HRESULT invoke_procedure(const WCHAR *args, const WCHAR *source, DISPPARAMS *dp)
Definition: run.c:2222
#define DISPID_GLOBAL_THROWEI
Definition: run.c:175
#define DISPID_TESTOBJ_PROP
Definition: run.c:185
#define IActiveScriptParse_Release
Definition: run.c:42
static HRESULT WINAPI EnumVARIANT_Reset(IEnumVARIANT *This)
Definition: run.c:311
#define DISPID_GLOBAL_TESTARGTYPES
Definition: run.c:162
#define DISPID_GLOBAL_TRACE
Definition: run.c:144
static void test_parse_proc(void)
Definition: run.c:4393
static IDispatchExVtbl testcallerobj_vtbl
Definition: run.c:709
#define DISPID_GLOBAL_OK
Definition: run.c:145
#define DISPID_GLOBAL_CREATEARRAY
Definition: run.c:153
static ULONG WINAPI testDestrObj_AddRef(IDispatchEx *iface)
Definition: run.c:731
static IDispatchExVtbl bindEventHandlerDispVtbl
Definition: run.c:947
static IDispatchEx dispexFunc
Definition: run.c:819
#define DISPID_GLOBAL_PUREDISP
Definition: run.c:157
#define DISPID_GLOBAL_TESTPROPGET
Definition: run.c:141
#define DISPID_GLOBAL_SHORTPROP
Definition: run.c:160
static void test_destructors(void)
Definition: run.c:3725
#define DISPID_GLOBAL_TESTPROPDELETE
Definition: run.c:181
static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
Definition: run.c:467
static IBindEventHandler BindEventHandler
Definition: run.c:929
#define DISPID_GLOBAL_TESTTHIS
Definition: run.c:150
static HRESULT WINAPI Global_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
Definition: run.c:1980
static IDispatch * script_disp
Definition: run.c:195
static void close_script(IActiveScript *script)
Definition: run.c:232
static IDispatchEx testcallerobj
Definition: run.c:727
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
Definition: run.c:377
static HRESULT WINAPI dispexFunc_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *res, EXCEPINFO *pei, IServiceProvider *pspCaller)
Definition: run.c:763
static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
Definition: run.c:2019
static void run_from_res(const char *name)
Definition: run.c:2784
static void run_benchmarks(void)
Definition: run.c:4528
#define DISPID_GLOBAL_TESTPROPPUT
Definition: run.c:142
#define DISPID_GLOBAL_TESTNORES
Definition: run.c:166
static int EnumVARIANT_next_0_count
Definition: run.c:267
static HRESULT CALLBACK test_deferred_fill_in(struct tagEXCEPINFO *ei)
Definition: run.c:967
static IEnumVARIANT testEnumVARIANT
Definition: run.c:337
static IDispatchEx bindEventHandlerDisp
Definition: run.c:965
static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
Definition: run.c:226
static IActiveScriptSite ActiveScriptSite_CheckError
Definition: run.c:2138
static void test_retval(void)
Definition: run.c:2974
#define ERROR_TODO_SCODE
Definition: run.c:2312
static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
Definition: run.c:2086
#define DISPID_GLOBAL_VCY
Definition: run.c:177
static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *This, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
Definition: run.c:268
static int invoke_version
Definition: run.c:196
static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
Definition: run.c:392
#define DISPID_GLOBAL_GETVT
Definition: run.c:146
static void test_script_exprs(void)
Definition: run.c:3275
#define DISPID_GLOBAL_TODOWINE
Definition: run.c:178
static IEnumVARIANTVtbl testEnumVARIANTVtbl
Definition: run.c:327
static HRESULT WINAPI ActiveScriptSite_OnScriptError_CheckError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
Definition: run.c:2112
#define DISPID_GLOBAL_TESTDESTROBJ
Definition: run.c:179
#define CHECK_CALLED(func)
Definition: run.c:73
#define DISPID_GLOBAL_PROPGETFUNC
Definition: run.c:154
static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
Definition: run.c:2034
static const char * test_name
Definition: run.c:194
static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
Definition: run.c:502
static const CLSID CLSID_JScriptEncode
Definition: run.c:52
static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
Definition: run.c:2070
static HRESULT WINAPI testcallerobj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
Definition: run.c:674
static void run_encoded_tests(void)
Definition: run.c:4417
#define DISPID_GLOBAL_PROPARGPUT
Definition: run.c:159
#define DISPID_GLOBAL_BINDEVENTHANDLER
Definition: run.c:170
static int EnumVARIANT_index
Definition: run.c:266
#define JS_E_UNDEFINED_VARIABLE
Definition: run.c:135
#define DISPID_GLOBAL_TESTENUMOBJ
Definition: run.c:171
static void run_benchmark(const char *script_name)
Definition: run.c:4482
static BSTR load_res(const char *name)
Definition: run.c:2761
#define DISPID_GLOBAL_GETSHORT
Definition: run.c:161
static ULONG WINAPI EnumVARIANT_AddRef(IEnumVARIANT *iface)
Definition: run.c:256
static IDispatchExVtbl dispexFuncVtbl
Definition: run.c:801
#define ERROR_TODO_HELPFILE
Definition: run.c:2314
static void run_from_file(const char *filename)
Definition: run.c:2746
#define DISPID_GLOBAL_DISPUNK
Definition: run.c:164
static void test_default_value(void)
Definition: run.c:3110
static const CLSID * engine_clsid
Definition: run.c:200
static LONG test_destr_ref
Definition: run.c:729
static const IBindEventHandlerVtbl BindEventHandlerVtbl
Definition: run.c:922
static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: run.c:408
#define DISPID_GLOBAL_CALLEVAL
Definition: run.c:172
static HRESULT WINAPI sp_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: run.c:339
static void test_propputref(void)
Definition: run.c:3025
static IDispatchExVtbl testDestrObjVtbl
Definition: run.c:743
static ULONG WINAPI BindEventHandler_Release(IBindEventHandler *iface)
Definition: run.c:909
static IActiveScriptError * script_error
Definition: run.c:198
static IDispatchEx testObj
Definition: run.c:672
#define JS_E_EXCEPTION_THROWN
Definition: run.c:136
static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl
Definition: run.c:2096
static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
Definition: run.c:1232
static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
Definition: run.c:443
static BSTR get_script_from_file(const char *filename)
Definition: run.c:2708
#define DISPID_GLOBAL_TESTPROPDELETEERROR
Definition: run.c:183
static BOOL testing_expr
Definition: run.c:193
static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
Definition: run.c:2044
static HRESULT WINAPI BindEventHandler_BindHandler(IBindEventHandler *iface, const WCHAR *event, IDispatch *disp)
Definition: run.c:914
static IActiveScript * create_script(void)
Definition: run.c:2155
static HRESULT set_script_prop(IActiveScript *engine, DWORD property, VARIANT *val)
Definition: run.c:2140
#define DISPID_GLOBAL_GETSCRIPTSTATE
Definition: run.c:169
#define DISPID_GLOBAL_INVOKEVERSION
Definition: run.c:152
#define JS_E_INVALID_ACTION
Definition: run.c:133
#define DISPID_GLOBAL_GETNULLBSTR
Definition: run.c:148
static IDispatchEx Global
Definition: run.c:2017
static void run_bom_tests(void)
Definition: run.c:3961
static IActiveScriptSite ActiveScriptSite
Definition: run.c:2110
static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
Definition: run.c:2081
#define DISPID_TESTOBJ_ONLYDISPID
Definition: run.c:186
static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
Definition: run.c:402
static IDispatchExVtbl testObjVtbl
Definition: run.c:654
static void test_members(void)
Definition: run.c:3646
#define DISPID_GLOBAL_ISNULLBSTR
Definition: run.c:158
static void test_automagic(void)
Definition: run.c:2892
static BOOL strict_dispid_check
Definition: run.c:193
static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
Definition: run.c:987
static void test_start(void)
Definition: run.c:2851
static ULONG WINAPI BindEventHandler_AddRef(IBindEventHandler *iface)
Definition: run.c:904
static HINSTANCE hkernel32
Definition: process.c:68
static VARIANTARG static DISPID
Definition: ordinal.c:49
#define parse_htmlscript(a)
Definition: run.c:2208
static const char * script_name
Definition: run.c:74
#define argv
Definition: mplay32.c:18
script
Definition: msipriv.h:383
unsigned int UINT
Definition: ndis.h:50
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define SORT_DEFAULT
#define MAKELCID(lgid, srtid)
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339
#define V_UI1(A)
Definition: oleauto.h:266
#define V_BOOL(A)
Definition: oleauto.h:224
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_INT(A)
Definition: oleauto.h:251
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define V_UI2(A)
Definition: oleauto.h:268
#define V_I1(A)
Definition: oleauto.h:243
#define DISPATCH_PROPERTYPUT
Definition: oleauto.h:1008
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define V_VARIANTREF(A)
Definition: oleauto.h:283
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
#define V_R4(A)
Definition: oleauto.h:260
#define V_CY(A)
Definition: oleauto.h:229
#define V_UI4(A)
Definition: oleauto.h:270
#define V_DISPATCH(A)
Definition: oleauto.h:239
#define V_R8(A)
Definition: oleauto.h:262
#define DISPATCH_PROPERTYGET
Definition: oleauto.h:1007
#define V_DATE(A)
Definition: oleauto.h:231
#define DISPATCH_PROPERTYPUTREF
Definition: oleauto.h:1009
#define V_I2(A)
Definition: oleauto.h:245
#define DISPID_THIS
Definition: olectl.h:395
const GUID IID_IDispatch
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
const WCHAR * str
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
DWORD LCID
Definition: nls.h:13
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define SUBLANG_ENGLISH_US
Definition: nls.h:222
wcscpy
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:171
int winetest_get_mainargs(char ***pargv)
#define args
Definition: format.c:66
Definition: scsiwmi.h:51
Definition: match.c:390
Definition: run.c:3956
WCHAR str[1024]
Definition: run.c:3957
HRESULT hres
Definition: run.c:3958
Definition: query.h:86
Definition: fci.c:127
Definition: dsound.c:943
Definition: parser.c:49
Definition: name.c:39
Definition: import.c:81
Definition: send.c:48
const char * LPCSTR
Definition: typedefs.h:52
uint32_t ULONG
Definition: typedefs.h:59
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3837
void * arg
Definition: msvc.h:10
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
const char * description
Definition: directx.c:2497
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define DISP_E_MEMBERNOTFOUND
Definition: winerror.h:3615
#define E_UNEXPECTED
Definition: winerror.h:3528
#define DISP_E_EXCEPTION
Definition: winerror.h:3621
#define E_POINTER
Definition: winerror.h:3480
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618
#define LOCALE_SLIST
Definition: winnls.h:50