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