mshtml: Added better IHTMLWindow2::get_opener stub.
[wine] / dlls / jscript / tests / run.c
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 static const CLSID CLSID_JScript =
31     {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
32 static const CLSID CLSID_JScriptEncode =
33     {0xf414c262,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
34
35 #define DEFINE_EXPECT(func) \
36     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
37
38 #define SET_EXPECT(func) \
39     expect_ ## func = TRUE
40
41 #define CHECK_EXPECT2(func) \
42     do { \
43         ok(expect_ ##func, "unexpected call " #func "\n"); \
44         called_ ## func = TRUE; \
45     }while(0)
46
47 #define CHECK_EXPECT(func) \
48     do { \
49         CHECK_EXPECT2(func); \
50         expect_ ## func = FALSE; \
51     }while(0)
52
53 #define CHECK_CALLED(func) \
54     do { \
55         ok(called_ ## func, "expected " #func "\n"); \
56         expect_ ## func = called_ ## func = FALSE; \
57     }while(0)
58
59 DEFINE_EXPECT(global_propget_d);
60 DEFINE_EXPECT(global_propget_i);
61 DEFINE_EXPECT(global_propput_d);
62 DEFINE_EXPECT(global_propput_i);
63 DEFINE_EXPECT(global_propdelete_d);
64 DEFINE_EXPECT(global_success_d);
65 DEFINE_EXPECT(global_success_i);
66 DEFINE_EXPECT(global_notexists_d);
67 DEFINE_EXPECT(puredisp_prop_d);
68 DEFINE_EXPECT(puredisp_noprop_d);
69 DEFINE_EXPECT(testobj_delete);
70 DEFINE_EXPECT(testobj_value);
71 DEFINE_EXPECT(testobj_prop_d);
72 DEFINE_EXPECT(testobj_noprop_d);
73 DEFINE_EXPECT(testobj_onlydispid_d);
74 DEFINE_EXPECT(testobj_onlydispid_i);
75 DEFINE_EXPECT(GetItemInfo_testVal);
76 DEFINE_EXPECT(ActiveScriptSite_OnScriptError);
77 DEFINE_EXPECT(invoke_func);
78 DEFINE_EXPECT(DeleteMemberByDispID);
79
80 #define DISPID_GLOBAL_TESTPROPGET   0x1000
81 #define DISPID_GLOBAL_TESTPROPPUT   0x1001
82 #define DISPID_GLOBAL_REPORTSUCCESS 0x1002
83 #define DISPID_GLOBAL_TRACE         0x1003
84 #define DISPID_GLOBAL_OK            0x1004
85 #define DISPID_GLOBAL_GETVT         0x1005
86 #define DISPID_GLOBAL_TESTOBJ       0x1006
87 #define DISPID_GLOBAL_GETNULLBSTR   0x1007
88 #define DISPID_GLOBAL_NULL_DISP     0x1008
89 #define DISPID_GLOBAL_TESTTHIS      0x1009
90 #define DISPID_GLOBAL_TESTTHIS2     0x100a
91 #define DISPID_GLOBAL_INVOKEVERSION 0x100b
92 #define DISPID_GLOBAL_CREATEARRAY   0x100c
93 #define DISPID_GLOBAL_PROPGETFUNC   0x100d
94 #define DISPID_GLOBAL_OBJECT_FLAG   0x100e
95 #define DISPID_GLOBAL_ISWIN64       0x100f
96 #define DISPID_GLOBAL_PUREDISP      0x1010
97 #define DISPID_GLOBAL_TESTPROPDELETE  0x1010
98 #define DISPID_GLOBAL_ISNULLBSTR    0x1011
99
100 #define DISPID_TESTOBJ_PROP         0x2000
101 #define DISPID_TESTOBJ_ONLYDISPID   0x2001
102
103 #define JS_E_INVALID_CHAR 0x800a03f6
104
105 static const WCHAR testW[] = {'t','e','s','t',0};
106 static const CHAR testA[] = "test";
107 static const WCHAR test_valW[] = {'t','e','s','t','V','a','l',0};
108 static const CHAR test_valA[] = "testVal";
109
110 static BOOL strict_dispid_check;
111 static const char *test_name = "(null)";
112 static IDispatch *script_disp;
113 static int invoke_version;
114 static IActiveScriptError *script_error;
115 static const CLSID *engine_clsid = &CLSID_JScript;
116
117 /* Returns true if the user interface is in English. Note that this does not
118  * presume of the formatting of dates, numbers, etc.
119  */
120 static BOOL is_lang_english(void)
121 {
122     static HMODULE hkernel32 = NULL;
123     static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
124     static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
125
126     if (!hkernel32)
127     {
128         hkernel32 = GetModuleHandleA("kernel32.dll");
129         pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
130         pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
131     }
132     if (pGetThreadUILanguage)
133         return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
134     if (pGetUserDefaultUILanguage)
135         return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
136
137     return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
138 }
139
140 static BSTR a2bstr(const char *str)
141 {
142     BSTR ret;
143     int len;
144
145     len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
146     ret = SysAllocStringLen(NULL, len-1);
147     MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
148
149     return ret;
150 }
151
152 static int strcmp_wa(LPCWSTR strw, const char *stra)
153 {
154     CHAR buf[512];
155     WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
156     return lstrcmpA(buf, stra);
157 }
158
159 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
160 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
161 {
162     expect |= invoke_version << 28;
163     ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
164 }
165
166 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
167 {
168     *ppv = NULL;
169
170     if(IsEqualGUID(riid, &IID_IUnknown)
171        || IsEqualGUID(riid, &IID_IDispatch)
172        || IsEqualGUID(riid, &IID_IDispatchEx))
173         *ppv = iface;
174     else
175         return E_NOINTERFACE;
176
177     return S_OK;
178 }
179
180 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
181 {
182     return 2;
183 }
184
185 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
186 {
187     return 1;
188 }
189
190 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
191 {
192     ok(0, "unexpected call\n");
193     return E_NOTIMPL;
194 }
195
196 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
197                                               LCID lcid, ITypeInfo **ppTInfo)
198 {
199     ok(0, "unexpected call\n");
200     return E_NOTIMPL;
201 }
202
203 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
204                                                 LPOLESTR *rgszNames, UINT cNames,
205                                                 LCID lcid, DISPID *rgDispId)
206 {
207     ok(IsEqualGUID(riid, &IID_NULL), "Expected IID_NULL\n");
208     ok(cNames==1, "cNames = %d\n", cNames);
209
210     if(!strcmp_wa(*rgszNames, "prop")) {
211         CHECK_EXPECT(puredisp_prop_d);
212         *rgDispId = DISPID_TESTOBJ_PROP;
213         return S_OK;
214     } else if(!strcmp_wa(*rgszNames, "noprop")) {
215         CHECK_EXPECT(puredisp_noprop_d);
216         return DISP_E_UNKNOWNNAME;
217     }
218
219     ok(0, "unexpected call\n");
220     return E_NOTIMPL;
221 }
222
223 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
224                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
225                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
226 {
227     ok(0, "unexpected call\n");
228     return E_NOTIMPL;
229 }
230
231 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
232 {
233     ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
234     return E_NOTIMPL;
235 }
236
237 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
238 {
239     ok(0, "unexpected call\n");
240     return E_NOTIMPL;
241 }
242
243 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
244 {
245     ok(0, "unexpected call\n");
246     return E_NOTIMPL;
247 }
248
249 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
250 {
251     ok(0, "unexpected call\n");
252     return E_NOTIMPL;
253 }
254
255 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
256 {
257     ok(0, "unexpected call\n");
258     return E_NOTIMPL;
259 }
260
261 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
262 {
263     ok(0, "unexpected call\n");
264     return E_NOTIMPL;
265 }
266
267 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
268 {
269     if(!strcmp_wa(bstrName, "prop")) {
270         CHECK_EXPECT(testobj_prop_d);
271         test_grfdex(grfdex, fdexNameCaseSensitive);
272         *pid = DISPID_TESTOBJ_PROP;
273         return S_OK;
274     }
275     if(!strcmp_wa(bstrName, "noprop")) {
276         CHECK_EXPECT(testobj_noprop_d);
277         test_grfdex(grfdex, fdexNameCaseSensitive);
278         return DISP_E_UNKNOWNNAME;
279     }
280     if(!strcmp_wa(bstrName, "onlyDispID")) {
281         if(strict_dispid_check)
282             CHECK_EXPECT(testobj_onlydispid_d);
283         test_grfdex(grfdex, fdexNameCaseSensitive);
284         *pid = DISPID_TESTOBJ_ONLYDISPID;
285         return S_OK;
286     }
287
288     ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName));
289     return E_NOTIMPL;
290 }
291
292 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
293         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
294 {
295     ok(pspCaller != NULL, "pspCaller = NULL\n");
296
297     switch(id) {
298     case DISPID_VALUE:
299         ok(pdp != NULL, "pdp == NULL\n");
300         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
301         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
302         ok(pvarRes != NULL, "pvarRes == NULL\n");
303         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
304         ok(pei != NULL, "pei == NULL\n");
305
306         switch(wFlags) {
307         case INVOKE_PROPERTYGET:
308             CHECK_EXPECT(testobj_value);
309             ok(!pdp->rgvarg, "rgvarg != NULL\n");
310             ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
311             break;
312         case INVOKE_FUNC:
313             ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
314             break;
315         case INVOKE_FUNC|INVOKE_PROPERTYGET:
316             ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
317             break;
318         default:
319             ok(0, "invalid flag (%x)\n", wFlags);
320         }
321
322         V_VT(pvarRes) = VT_I4;
323         V_I4(pvarRes) = 1;
324         return S_OK;
325     case DISPID_TESTOBJ_ONLYDISPID:
326         if(strict_dispid_check)
327             CHECK_EXPECT(testobj_onlydispid_i);
328         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
329         ok(pdp != NULL, "pdp == NULL\n");
330         ok(!pdp->rgvarg, "rgvarg != NULL\n");
331         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
332         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
333         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
334         ok(pvarRes != NULL, "pvarRes == NULL\n");
335         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
336         ok(pei != NULL, "pei == NULL\n");
337         return DISP_E_MEMBERNOTFOUND;
338     }
339
340     ok(0, "unexpected call %x\n", id);
341     return DISP_E_MEMBERNOTFOUND;
342 }
343
344 static HRESULT WINAPI testObj_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
345 {
346     CHECK_EXPECT(testobj_delete);
347
348     ok(!strcmp_wa(bstrName, "deleteTest"), "unexpected name %s\n", wine_dbgstr_w(bstrName));
349     test_grfdex(grfdex, fdexNameCaseSensitive);
350     return S_OK;
351 }
352
353 static IDispatchExVtbl testObjVtbl = {
354     DispatchEx_QueryInterface,
355     DispatchEx_AddRef,
356     DispatchEx_Release,
357     DispatchEx_GetTypeInfoCount,
358     DispatchEx_GetTypeInfo,
359     DispatchEx_GetIDsOfNames,
360     DispatchEx_Invoke,
361     testObj_GetDispID,
362     testObj_InvokeEx,
363     testObj_DeleteMemberByName,
364     DispatchEx_DeleteMemberByDispID,
365     DispatchEx_GetMemberProperties,
366     DispatchEx_GetMemberName,
367     DispatchEx_GetNextDispID,
368     DispatchEx_GetNameSpaceParent
369 };
370
371 static IDispatchEx testObj = { &testObjVtbl };
372
373 static HRESULT WINAPI pureDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
374 {
375     if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch)) {
376         *ppv = iface;
377         return S_OK;
378     }
379
380     *ppv = NULL;
381     return E_NOINTERFACE;
382 }
383
384 static IDispatchExVtbl pureDispVtbl = {
385     pureDisp_QueryInterface,
386     DispatchEx_AddRef,
387     DispatchEx_Release,
388     DispatchEx_GetTypeInfoCount,
389     DispatchEx_GetTypeInfo,
390     DispatchEx_GetIDsOfNames,
391     DispatchEx_Invoke
392 };
393
394 static IDispatchEx pureDisp = { &pureDispVtbl };
395
396 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
397 {
398     if(!strcmp_wa(bstrName, "ok")) {
399         test_grfdex(grfdex, fdexNameCaseSensitive);
400         *pid = DISPID_GLOBAL_OK;
401         return S_OK;
402     }
403     if(!strcmp_wa(bstrName, "trace")) {
404         test_grfdex(grfdex, fdexNameCaseSensitive);
405         *pid = DISPID_GLOBAL_TRACE;
406         return S_OK;
407     }
408     if(!strcmp_wa(bstrName, "reportSuccess")) {
409         CHECK_EXPECT(global_success_d);
410         test_grfdex(grfdex, fdexNameCaseSensitive);
411         *pid = DISPID_GLOBAL_REPORTSUCCESS;
412         return S_OK;
413     }
414     if(!strcmp_wa(bstrName, "testPropGet")) {
415         CHECK_EXPECT(global_propget_d);
416         test_grfdex(grfdex, fdexNameCaseSensitive);
417         *pid = DISPID_GLOBAL_TESTPROPGET;
418         return S_OK;
419     }
420     if(!strcmp_wa(bstrName, "testPropPut")) {
421         CHECK_EXPECT(global_propput_d);
422         test_grfdex(grfdex, fdexNameCaseSensitive);
423         *pid = DISPID_GLOBAL_TESTPROPPUT;
424         return S_OK;
425     }
426     if(!strcmp_wa(bstrName, "testPropDelete")) {
427         CHECK_EXPECT(global_propdelete_d);
428         test_grfdex(grfdex, fdexNameCaseSensitive);
429         *pid = DISPID_GLOBAL_TESTPROPDELETE;
430         return S_OK;
431     }
432     if(!strcmp_wa(bstrName, "getVT")) {
433         test_grfdex(grfdex, fdexNameCaseSensitive);
434         *pid = DISPID_GLOBAL_GETVT;
435         return S_OK;
436     }
437     if(!strcmp_wa(bstrName, "testObj")) {
438         test_grfdex(grfdex, fdexNameCaseSensitive);
439         *pid = DISPID_GLOBAL_TESTOBJ;
440         return S_OK;
441     }
442     if(!strcmp_wa(bstrName, "getNullBSTR")) {
443         *pid = DISPID_GLOBAL_GETNULLBSTR;
444         return S_OK;
445     }
446     if(!strcmp_wa(bstrName, "isNullBSTR")) {
447         *pid = DISPID_GLOBAL_ISNULLBSTR;
448         return S_OK;
449     }
450     if(!strcmp_wa(bstrName, "nullDisp")) {
451         *pid = DISPID_GLOBAL_NULL_DISP;
452         return S_OK;
453     }
454     if(!strcmp_wa(bstrName, "notExists")) {
455         CHECK_EXPECT(global_notexists_d);
456         test_grfdex(grfdex, fdexNameCaseSensitive);
457         return DISP_E_UNKNOWNNAME;
458     }
459
460     if(!strcmp_wa(bstrName, "testThis")) {
461         test_grfdex(grfdex, fdexNameCaseSensitive);
462         *pid = DISPID_GLOBAL_TESTTHIS;
463         return S_OK;
464     }
465
466     if(!strcmp_wa(bstrName, "testThis2")) {
467         test_grfdex(grfdex, fdexNameCaseSensitive);
468         *pid = DISPID_GLOBAL_TESTTHIS2;
469         return S_OK;
470     }
471
472     if(!strcmp_wa(bstrName, "invokeVersion")) {
473         test_grfdex(grfdex, fdexNameCaseSensitive);
474         *pid = DISPID_GLOBAL_INVOKEVERSION;
475         return S_OK;
476     }
477     if(!strcmp_wa(bstrName, "createArray")) {
478         test_grfdex(grfdex, fdexNameCaseSensitive);
479         *pid = DISPID_GLOBAL_CREATEARRAY;
480         return S_OK;
481     }
482     if(!strcmp_wa(bstrName, "propGetFunc")) {
483         test_grfdex(grfdex, fdexNameCaseSensitive);
484         *pid = DISPID_GLOBAL_PROPGETFUNC;
485         return S_OK;
486     }
487     if(!strcmp_wa(bstrName, "objectFlag")) {
488         test_grfdex(grfdex, fdexNameCaseSensitive);
489         *pid = DISPID_GLOBAL_OBJECT_FLAG;
490         return S_OK;
491     }
492
493     if(!strcmp_wa(bstrName, "isWin64")) {
494         test_grfdex(grfdex, fdexNameCaseSensitive);
495         *pid = DISPID_GLOBAL_ISWIN64;
496         return S_OK;
497     }
498
499     if(!strcmp_wa(bstrName, "pureDisp")) {
500         test_grfdex(grfdex, fdexNameCaseSensitive);
501         *pid = DISPID_GLOBAL_PUREDISP;
502         return S_OK;
503     }
504
505     if(strict_dispid_check)
506         ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
507     return DISP_E_UNKNOWNNAME;
508 }
509
510 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
511         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
512 {
513     ok(pspCaller != NULL, "pspCaller = NULL\n");
514
515     switch(id) {
516     case DISPID_GLOBAL_OK:
517         ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
518         ok(pdp != NULL, "pdp == NULL\n");
519         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
520         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
521         ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
522         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
523         if(wFlags & INVOKE_PROPERTYGET)
524             ok(pvarRes != NULL, "pvarRes == NULL\n");
525         else
526             ok(!pvarRes, "pvarRes != NULL\n");
527         ok(pei != NULL, "pei == NULL\n");
528
529         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
530         ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg));
531         ok(V_BOOL(pdp->rgvarg+1), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
532
533         return S_OK;
534
535      case DISPID_GLOBAL_TRACE:
536         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
537         ok(pdp != NULL, "pdp == NULL\n");
538         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
539         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
540         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
541         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
542         ok(!pvarRes, "pvarRes != NULL\n");
543         ok(pei != NULL, "pei == NULL\n");
544
545         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
546         if(V_VT(pdp->rgvarg) == VT_BSTR)
547             trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
548
549         return S_OK;
550
551     case DISPID_GLOBAL_REPORTSUCCESS:
552         CHECK_EXPECT(global_success_i);
553
554         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
555         ok(pdp != NULL, "pdp == NULL\n");
556         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
557         ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
558         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
559         ok(!pvarRes, "pvarRes != NULL\n");
560         ok(pei != NULL, "pei == NULL\n");
561
562         return S_OK;
563
564      case DISPID_GLOBAL_TESTPROPGET:
565         CHECK_EXPECT(global_propget_i);
566
567         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
568         ok(pdp != NULL, "pdp == NULL\n");
569         ok(!pdp->rgvarg, "rgvarg != NULL\n");
570         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
571         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
572         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
573         ok(pvarRes != NULL, "pvarRes == NULL\n");
574         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
575         ok(pei != NULL, "pei == NULL\n");
576
577         V_VT(pvarRes) = VT_I4;
578         V_I4(pvarRes) = 1;
579
580         return S_OK;
581
582     case DISPID_GLOBAL_TESTPROPPUT:
583         CHECK_EXPECT(global_propput_i);
584
585         ok(wFlags == INVOKE_PROPERTYPUT, "wFlags = %x\n", wFlags);
586         ok(pdp != NULL, "pdp == NULL\n");
587         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
588         ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
589         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
590         ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
591         ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
592         ok(!pvarRes, "pvarRes != NULL\n");
593
594         ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(pdp->rgvarg)=%d\n", V_VT(pdp->rgvarg));
595         ok(V_I4(pdp->rgvarg) == 1, "V_I4(pdp->rgvarg)=%d\n", V_I4(pdp->rgvarg));
596         return S_OK;
597
598      case DISPID_GLOBAL_GETVT:
599         ok(pdp != NULL, "pdp == NULL\n");
600         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
601         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
602         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
603         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
604         ok(pvarRes != NULL, "pvarRes == NULL\n");
605         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
606         ok(pei != NULL, "pei == NULL\n");
607
608         V_VT(pvarRes) = VT_BSTR;
609         switch(V_VT(pdp->rgvarg)) {
610         case VT_EMPTY:
611             V_BSTR(pvarRes) = a2bstr("VT_EMPTY");
612             break;
613         case VT_NULL:
614             V_BSTR(pvarRes) = a2bstr("VT_NULL");
615             break;
616         case VT_I4:
617             V_BSTR(pvarRes) = a2bstr("VT_I4");
618             break;
619         case VT_R8:
620             V_BSTR(pvarRes) = a2bstr("VT_R8");
621             break;
622         case VT_BSTR:
623             V_BSTR(pvarRes) = a2bstr("VT_BSTR");
624             break;
625         case VT_DISPATCH:
626             V_BSTR(pvarRes) = a2bstr("VT_DISPATCH");
627             break;
628         case VT_BOOL:
629             V_BSTR(pvarRes) = a2bstr("VT_BOOL");
630             break;
631         case VT_ARRAY|VT_VARIANT:
632             V_BSTR(pvarRes) = a2bstr("VT_ARRAY|VT_VARIANT");
633             break;
634         default:
635             ok(0, "unknown vt %d\n", V_VT(pdp->rgvarg));
636             return E_FAIL;
637         }
638
639         return S_OK;
640
641     case DISPID_GLOBAL_TESTOBJ:
642         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
643         ok(pdp != NULL, "pdp == NULL\n");
644         ok(!pdp->rgvarg, "rgvarg != NULL\n");
645         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
646         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
647         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
648         ok(pvarRes != NULL, "pvarRes == NULL\n");
649         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
650         ok(pei != NULL, "pei == NULL\n");
651
652         V_VT(pvarRes) = VT_DISPATCH;
653         V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
654         return S_OK;
655
656     case DISPID_GLOBAL_PUREDISP:
657         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
658         ok(pdp != NULL, "pdp == NULL\n");
659         ok(!pdp->rgvarg, "rgvarg != NULL\n");
660         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
661         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
662         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
663         ok(pvarRes != NULL, "pvarRes == NULL\n");
664         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
665         ok(pei != NULL, "pei == NULL\n");
666
667         V_VT(pvarRes) = VT_DISPATCH;
668         V_DISPATCH(pvarRes) = (IDispatch*)&pureDisp;
669         return S_OK;
670
671     case DISPID_GLOBAL_GETNULLBSTR:
672         if(pvarRes) {
673             V_VT(pvarRes) = VT_BSTR;
674             V_BSTR(pvarRes) = NULL;
675         }
676         return S_OK;
677
678     case DISPID_GLOBAL_ISNULLBSTR:
679         ok(pdp != NULL, "pdp == NULL\n");
680         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
681         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
682         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
683         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
684         ok(pvarRes != NULL, "pvarRes == NULL\n");
685         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
686         ok(pei != NULL, "pei == NULL\n");
687         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
688
689         V_VT(pvarRes) = VT_BOOL;
690         V_BOOL(pvarRes) = V_BSTR(pdp->rgvarg) ? VARIANT_FALSE : VARIANT_TRUE;
691         return S_OK;
692
693     case DISPID_GLOBAL_ISWIN64:
694         if(pvarRes) {
695             V_VT(pvarRes) = VT_BOOL;
696             V_BOOL(pvarRes) = sizeof(void*) == 8 ? VARIANT_TRUE : VARIANT_FALSE;
697         }
698         return S_OK;
699
700     case DISPID_GLOBAL_NULL_DISP:
701         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
702         ok(pdp != NULL, "pdp == NULL\n");
703         ok(!pdp->rgvarg, "rgvarg != NULL\n");
704         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
705         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
706         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
707         ok(pvarRes != NULL, "pvarRes == NULL\n");
708         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
709         ok(pei != NULL, "pei == NULL\n");
710
711         V_VT(pvarRes) = VT_DISPATCH;
712         V_DISPATCH(pvarRes) = NULL;
713         return S_OK;
714
715     case DISPID_GLOBAL_TESTTHIS:
716         ok(pdp != NULL, "pdp == NULL\n");
717         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
718         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
719         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
720         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
721         ok(pvarRes == NULL, "pvarRes != NULL\n");
722         ok(pei != NULL, "pei == NULL\n");
723
724         ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
725         ok(V_DISPATCH(pdp->rgvarg) == (IDispatch*)iface, "disp != iface\n");
726
727         return S_OK;
728
729     case DISPID_GLOBAL_TESTTHIS2:
730         ok(pdp != NULL, "pdp == NULL\n");
731         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
732         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
733         ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
734         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
735         ok(pvarRes == NULL, "pvarRes != NULL\n");
736         ok(pei != NULL, "pei == NULL\n");
737
738         ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(arg) = %d\n", V_VT(pdp->rgvarg));
739         ok(V_DISPATCH(pdp->rgvarg) != (IDispatch*)iface, "disp == iface\n");
740         ok(V_DISPATCH(pdp->rgvarg) == script_disp, "disp != script_disp\n");
741
742         return S_OK;
743
744      case DISPID_GLOBAL_INVOKEVERSION:
745         ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags);
746         ok(pdp != NULL, "pdp == NULL\n");
747         ok(!pdp->rgvarg, "rgvarg != NULL\n");
748         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
749         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
750         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
751         ok(pvarRes != NULL, "pvarRes == NULL\n");
752         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
753         ok(pei != NULL, "pei == NULL\n");
754
755         V_VT(pvarRes) = VT_I4;
756         V_I4(pvarRes) = invoke_version;
757
758         return S_OK;
759
760     case DISPID_GLOBAL_CREATEARRAY: {
761         SAFEARRAYBOUND bound[2];
762         VARIANT *data;
763         int i,j;
764
765         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
766         ok(pdp != NULL, "pdp == NULL\n");
767         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
768         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
769         ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
770         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
771         ok(pvarRes != NULL, "pvarRes == NULL\n");
772         ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
773         ok(pei != NULL, "pei == NULL\n");
774
775         bound[0].lLbound = 0;
776         bound[0].cElements = 5;
777         bound[1].lLbound = 2;
778         bound[1].cElements = 2;
779
780         V_VT(pvarRes) = VT_ARRAY|VT_VARIANT;
781         V_ARRAY(pvarRes) = SafeArrayCreate(VT_VARIANT, 2, bound);
782
783         SafeArrayAccessData(V_ARRAY(pvarRes), (void**)&data);
784         for(i=0; i<5; i++) {
785             for(j=2; j<4; j++) {
786                 V_VT(data) = VT_I4;
787                 V_I4(data) = i*10+j;
788                 data++;
789             }
790         }
791         SafeArrayUnaccessData(V_ARRAY(pvarRes));
792
793         return S_OK;
794     }
795
796     case DISPID_GLOBAL_PROPGETFUNC:
797         switch(wFlags) {
798         case INVOKE_FUNC:
799             CHECK_EXPECT(invoke_func);
800             break;
801         case INVOKE_FUNC|INVOKE_PROPERTYGET:
802             ok(pdp->cArgs != 0, "pdp->cArgs = %d\n", pdp->cArgs);
803             ok(pvarRes != NULL, "pdp->pvarRes == NULL\n");
804             break;
805         default:
806             ok(0, "invalid flag (%x)\n", wFlags);
807         }
808
809         ok(pdp != NULL, "pdp == NULL\n");
810         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
811         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
812         ok(pei != NULL, "pei == NULL\n");
813
814         if(pvarRes) {
815             ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
816             V_VT(pvarRes) = VT_I4;
817             V_I4(pvarRes) = pdp->cArgs;
818         }
819
820         return S_OK;
821
822     case DISPID_GLOBAL_OBJECT_FLAG: {
823         IDispatchEx *dispex;
824         BSTR str;
825         HRESULT hres;
826
827         hres = IDispatch_QueryInterface(script_disp, &IID_IDispatchEx, (void**)&dispex);
828         ok(hres == S_OK, "hres = %x\n", hres);
829
830         str = a2bstr("Object");
831         hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
832         SysFreeString(str);
833         ok(hres == S_OK, "hres = %x\n", hres);
834
835         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, NULL, pei, pspCaller);
836         ok(hres == S_OK, "hres = %x\n", hres);
837
838         V_VT(pvarRes) = VT_EMPTY;
839         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD, pdp, pvarRes, pei, pspCaller);
840         ok(hres == S_OK, "hres = %x\n", hres);
841         ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
842         VariantClear(pvarRes);
843
844         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_METHOD|DISPATCH_PROPERTYGET, pdp, NULL, pei, pspCaller);
845         ok(hres == S_OK, "hres = %x\n", hres);
846
847         V_VT(pvarRes) = VT_EMPTY;
848         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, pvarRes, pei, pspCaller);
849         ok(hres == S_OK, "hres = %x\n", hres);
850         ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
851         VariantClear(pvarRes);
852
853         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT, pdp, NULL, pei, pspCaller);
854         ok(hres == S_OK, "hres = %x\n", hres);
855
856         V_VT(pvarRes) = VT_EMPTY;
857         hres = IDispatchEx_InvokeEx(dispex, id, lcid, DISPATCH_CONSTRUCT|DISPATCH_PROPERTYGET, pdp, pvarRes, pei, pspCaller);
858         ok(hres == E_INVALIDARG, "hres = %x\n", hres);
859
860         V_VT(pvarRes) = VT_EMPTY;
861         hres = IDispatchEx_InvokeEx(dispex, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
862         ok(hres == S_OK, "hres = %x\n", hres);
863         ok(V_VT(pvarRes) == VT_DISPATCH, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
864         IDispatchEx_Release(dispex);
865         return S_OK;
866     }
867     }
868
869     ok(0, "unexpected call %x\n", id);
870     return DISP_E_MEMBERNOTFOUND;
871 }
872
873 static HRESULT WINAPI Global_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
874 {
875     CHECK_EXPECT(DeleteMemberByDispID);
876     ok(id == DISPID_GLOBAL_TESTPROPDELETE, "id = %d\n", id);
877     return S_OK;
878 }
879
880 static IDispatchExVtbl GlobalVtbl = {
881     DispatchEx_QueryInterface,
882     DispatchEx_AddRef,
883     DispatchEx_Release,
884     DispatchEx_GetTypeInfoCount,
885     DispatchEx_GetTypeInfo,
886     DispatchEx_GetIDsOfNames,
887     DispatchEx_Invoke,
888     Global_GetDispID,
889     Global_InvokeEx,
890     DispatchEx_DeleteMemberByName,
891     Global_DeleteMemberByDispID,
892     DispatchEx_GetMemberProperties,
893     DispatchEx_GetMemberName,
894     DispatchEx_GetNextDispID,
895     DispatchEx_GetNameSpaceParent
896 };
897
898 static IDispatchEx Global = { &GlobalVtbl };
899
900 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
901 {
902     *ppv = NULL;
903
904     if(IsEqualGUID(&IID_IUnknown, riid))
905         *ppv = iface;
906     else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
907         *ppv = iface;
908     else
909         return E_NOINTERFACE;
910
911     IUnknown_AddRef((IUnknown*)*ppv);
912     return S_OK;
913 }
914
915 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
916 {
917     return 2;
918 }
919
920 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
921 {
922     return 1;
923 }
924
925 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
926 {
927     *plcid = GetUserDefaultLCID();
928     return S_OK;
929 }
930
931 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
932         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
933 {
934     ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
935     ok(!ppti, "ppti != NULL\n");
936
937     if(!strcmp_wa(pstrName, test_valA))
938         CHECK_EXPECT(GetItemInfo_testVal);
939     else if(strcmp_wa(pstrName, testA))
940         ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
941
942     *ppiunkItem = (IUnknown*)&Global;
943     return S_OK;
944 }
945
946 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
947 {
948     return E_NOTIMPL;
949 }
950
951 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
952         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
953 {
954     return E_NOTIMPL;
955 }
956
957 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
958 {
959     return E_NOTIMPL;
960 }
961
962 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
963 {
964     return E_NOTIMPL;
965 }
966
967 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
968 {
969     return E_NOTIMPL;
970 }
971
972 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
973 {
974     return E_NOTIMPL;
975 }
976
977 #undef ACTSCPSITE_THIS
978
979 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
980     ActiveScriptSite_QueryInterface,
981     ActiveScriptSite_AddRef,
982     ActiveScriptSite_Release,
983     ActiveScriptSite_GetLCID,
984     ActiveScriptSite_GetItemInfo,
985     ActiveScriptSite_GetDocVersionString,
986     ActiveScriptSite_OnScriptTerminate,
987     ActiveScriptSite_OnStateChange,
988     ActiveScriptSite_OnScriptError,
989     ActiveScriptSite_OnEnterScript,
990     ActiveScriptSite_OnLeaveScript
991 };
992
993 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
994
995 static HRESULT WINAPI ActiveScriptSite_OnScriptError_CheckError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
996 {
997     ok(pscripterror != NULL, "ActiveScriptSite_OnScriptError -- expected pscripterror to be set, got NULL\n");
998
999     script_error = pscripterror;
1000     IUnknown_AddRef(script_error);
1001
1002     CHECK_EXPECT(ActiveScriptSite_OnScriptError);
1003
1004     return S_OK;
1005 }
1006
1007 static const IActiveScriptSiteVtbl ActiveScriptSite_CheckErrorVtbl = {
1008     ActiveScriptSite_QueryInterface,
1009     ActiveScriptSite_AddRef,
1010     ActiveScriptSite_Release,
1011     ActiveScriptSite_GetLCID,
1012     ActiveScriptSite_GetItemInfo,
1013     ActiveScriptSite_GetDocVersionString,
1014     ActiveScriptSite_OnScriptTerminate,
1015     ActiveScriptSite_OnStateChange,
1016     ActiveScriptSite_OnScriptError_CheckError,
1017     ActiveScriptSite_OnEnterScript,
1018     ActiveScriptSite_OnLeaveScript
1019 };
1020
1021 static IActiveScriptSite ActiveScriptSite_CheckError = { &ActiveScriptSite_CheckErrorVtbl };
1022
1023 static HRESULT set_script_prop(IActiveScript *engine, DWORD property, VARIANT *val)
1024 {
1025     IActiveScriptProperty *script_prop;
1026     HRESULT hres;
1027
1028     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty,
1029             (void**)&script_prop);
1030     ok(hres == S_OK, "Could not get IActiveScriptProperty iface: %08x\n", hres);
1031
1032     hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val);
1033     IActiveScriptProperty_Release(script_prop);
1034
1035     return hres;
1036 }
1037
1038 static IActiveScript *create_script(void)
1039 {
1040     IActiveScript *script;
1041     VARIANT v;
1042     HRESULT hres;
1043
1044     hres = CoCreateInstance(engine_clsid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1045             &IID_IActiveScript, (void**)&script);
1046     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1047
1048     V_VT(&v) = VT_I4;
1049     V_I4(&v) = invoke_version;
1050     hres = set_script_prop(script, SCRIPTPROP_INVOKEVERSIONING, &v);
1051     ok(hres == S_OK || broken(hres == E_NOTIMPL), "SetProperty(SCRIPTPROP_INVOKEVERSIONING) failed: %08x\n", hres);
1052     if(invoke_version && FAILED(hres)) {
1053         IActiveScript_Release(script);
1054         return NULL;
1055     }
1056
1057     return script;
1058 }
1059
1060 static HRESULT parse_script(DWORD flags, BSTR script_str)
1061 {
1062     IActiveScriptParse *parser;
1063     IActiveScript *engine;
1064     HRESULT hres;
1065
1066     engine = create_script();
1067     if(!engine)
1068         return S_OK;
1069
1070     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1071     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1072     if (FAILED(hres))
1073     {
1074         IActiveScript_Release(engine);
1075         return hres;
1076     }
1077
1078     hres = IActiveScriptParse64_InitNew(parser);
1079     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1080
1081     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1082     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1083
1084     hres = IActiveScript_AddNamedItem(engine, testW,
1085             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1086     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1087
1088     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1089     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1090
1091     hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1092     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1093     ok(script_disp != NULL, "script_disp == NULL\n");
1094     ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1095
1096     hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1097
1098     IDispatch_Release(script_disp);
1099     IActiveScript_Release(engine);
1100     IUnknown_Release(parser);
1101
1102     return hres;
1103 }
1104
1105 static HRESULT parse_htmlscript(BSTR script_str)
1106 {
1107     IActiveScriptParse *parser;
1108     IActiveScript *engine;
1109     HRESULT hres;
1110     BSTR tmp = a2bstr("</SCRIPT>");
1111
1112     engine = create_script();
1113     if(!engine)
1114         return E_FAIL;
1115
1116     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1117     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1118     if (FAILED(hres))
1119     {
1120         IActiveScript_Release(engine);
1121         return E_FAIL;
1122     }
1123
1124     hres = IActiveScriptParse64_InitNew(parser);
1125     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1126
1127     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1128     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1129
1130     hres = IActiveScript_AddNamedItem(engine, testW,
1131             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1132     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1133
1134     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1135     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1136
1137     hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, tmp, 0, 0, 0, NULL, NULL);
1138
1139     IActiveScript_Release(engine);
1140     IUnknown_Release(parser);
1141     SysFreeString(tmp);
1142
1143     return hres;
1144 }
1145
1146 static void test_IActiveScriptError(IActiveScriptError *error, SCODE errorcode, ULONG line, LONG pos, BSTR script_source, BSTR description, BSTR line_text)
1147 {
1148     HRESULT hres;
1149     DWORD source_context;
1150     ULONG line_number;
1151     LONG char_position;
1152     BSTR linetext;
1153     EXCEPINFO excep;
1154
1155     /* IActiveScriptError_GetSourcePosition */
1156
1157     hres = IActiveScriptError_GetSourcePosition(error, NULL, NULL, NULL);
1158     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1159
1160     source_context = 0xdeadbeef;
1161     hres = IActiveScriptError_GetSourcePosition(error, &source_context, NULL, NULL);
1162     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1163     ok(source_context == 0, "IActiveScriptError_GetSourcePosition -- source_context: expected 0, got 0x%08x\n", source_context);
1164
1165     line_number = 0xdeadbeef;
1166     hres = IActiveScriptError_GetSourcePosition(error, NULL, &line_number, NULL);
1167     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1168     ok(line_number == line, "IActiveScriptError_GetSourcePosition -- line_number: expected %d, got %d\n", line, line_number);
1169
1170     char_position = 0xdeadbeef;
1171     hres = IActiveScriptError_GetSourcePosition(error, NULL, NULL, &char_position);
1172     ok(hres == S_OK, "IActiveScriptError_GetSourcePosition -- hres: expected S_OK, got 0x%08x\n", hres);
1173     ok(char_position == pos, "IActiveScriptError_GetSourcePosition -- char_position: expected %d, got %d\n", pos, char_position);
1174
1175     /* IActiveScriptError_GetSourceLineText */
1176
1177     hres = IActiveScriptError_GetSourceLineText(error, NULL);
1178     ok(hres == E_POINTER, "IActiveScriptError_GetSourceLineText -- hres: expected E_POINTER, got 0x%08x\n", hres);
1179
1180     linetext = NULL;
1181     hres = IActiveScriptError_GetSourceLineText(error, &linetext);
1182     if (line_text) {
1183         ok(hres == S_OK, "IActiveScriptError_GetSourceLineText -- hres: expected S_OK, got 0x%08x\n", hres);
1184         ok(linetext != NULL && !lstrcmpW(linetext, line_text),
1185            "IActiveScriptError_GetSourceLineText -- expected %s, got %s\n", wine_dbgstr_w(line_text), wine_dbgstr_w(linetext));
1186     } else {
1187         ok(hres == E_FAIL, "IActiveScriptError_GetSourceLineText -- hres: expected S_OK, got 0x%08x\n", hres);
1188         ok(linetext == NULL,
1189            "IActiveScriptError_GetSourceLineText -- expected NULL, got %s\n", wine_dbgstr_w(linetext));
1190     }
1191     SysFreeString(linetext);
1192
1193     /* IActiveScriptError_GetExceptionInfo */
1194
1195     hres = IActiveScriptError_GetExceptionInfo(error, NULL);
1196     ok(hres == E_POINTER, "IActiveScriptError_GetExceptionInfo -- hres: expected E_POINTER, got 0x%08x\n", hres);
1197
1198     excep.wCode = 0xdead;
1199     excep.wReserved = 0xdead;
1200     excep.bstrSource = (BSTR)0xdeadbeef;
1201     excep.bstrDescription = (BSTR)0xdeadbeef;
1202     excep.bstrHelpFile = (BSTR)0xdeadbeef;
1203     excep.dwHelpContext = 0xdeadbeef;
1204     excep.pvReserved = (void *)0xdeadbeef;
1205     excep.pfnDeferredFillIn = (void *)0xdeadbeef;
1206     excep.scode = 0xdeadbeef;
1207
1208     hres = IActiveScriptError_GetExceptionInfo(error, &excep);
1209     ok(hres == S_OK, "IActiveScriptError_GetExceptionInfo -- hres: expected S_OK, got 0x%08x\n", hres);
1210
1211     ok(excep.wCode == 0, "IActiveScriptError_GetExceptionInfo -- excep.wCode: expected 0, got 0x%08x\n", excep.wCode);
1212     ok(excep.wReserved == 0, "IActiveScriptError_GetExceptionInfo -- excep.wReserved: expected 0, got %d\n", excep.wReserved);
1213     if (!is_lang_english())
1214         skip("Non-english UI (test with hardcoded strings)\n");
1215     else {
1216         ok(excep.bstrSource != NULL && !lstrcmpW(excep.bstrSource, script_source),
1217            "IActiveScriptError_GetExceptionInfo -- excep.bstrSource is not valid: expected %s, got %s\n",
1218            wine_dbgstr_w(script_source), wine_dbgstr_w(excep.bstrSource));
1219         ok(excep.bstrDescription != NULL && !lstrcmpW(excep.bstrDescription, description),
1220            "IActiveScriptError_GetExceptionInfo -- excep.bstrDescription is not valid: got %s\n", wine_dbgstr_w(excep.bstrDescription));
1221     }
1222     ok(excep.bstrHelpFile == NULL,
1223        "IActiveScriptError_GetExceptionInfo -- excep.bstrHelpFile: expected NULL, got %s\n", wine_dbgstr_w(excep.bstrHelpFile));
1224     ok(excep.dwHelpContext == 0, "IActiveScriptError_GetExceptionInfo -- excep.dwHelpContext: expected 0, got %d\n", excep.dwHelpContext);
1225     ok(excep.pvReserved == NULL, "IActiveScriptError_GetExceptionInfo -- excep.pvReserved: expected NULL, got %p\n", excep.pvReserved);
1226     ok(excep.pfnDeferredFillIn == NULL, "IActiveScriptError_GetExceptionInfo -- excep.pfnDeferredFillIn: expected NULL, got %p\n", excep.pfnDeferredFillIn);
1227     ok(excep.scode == errorcode, "IActiveScriptError_GetExceptionInfo -- excep.scode: expected 0x%08x, got 0x%08x\n", errorcode, excep.scode);
1228
1229     SysFreeString(excep.bstrSource);
1230     SysFreeString(excep.bstrDescription);
1231     SysFreeString(excep.bstrHelpFile);
1232 }
1233
1234 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)
1235 {
1236     IActiveScriptParse *parser;
1237     IActiveScript *engine;
1238     HRESULT hres;
1239
1240     engine = create_script();
1241     if(!engine)
1242         return;
1243
1244     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1245     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1246     if (FAILED(hres))
1247     {
1248         IActiveScript_Release(engine);
1249         return;
1250     }
1251
1252     hres = IActiveScriptParse64_InitNew(parser);
1253     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1254
1255     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite_CheckError);
1256     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1257
1258     hres = IActiveScript_AddNamedItem(engine, testW,
1259             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1260     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1261
1262     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1263     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1264
1265     hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1266     ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1267     ok(script_disp != NULL, "script_disp == NULL\n");
1268     ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1269
1270     script_error = NULL;
1271     SET_EXPECT(ActiveScriptSite_OnScriptError);
1272     hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1273     todo_wine ok(hres == 0x80020101, "parse_script_with_error should have returned 0x80020101, got: 0x%08x\n", hres);
1274     todo_wine CHECK_CALLED(ActiveScriptSite_OnScriptError);
1275
1276     if (script_error)
1277     {
1278         test_IActiveScriptError(script_error, errorcode, line, pos, script_source, description, line_text);
1279
1280         IUnknown_Release(script_error);
1281     }
1282
1283     IDispatch_Release(script_disp);
1284     IActiveScript_Release(engine);
1285     IUnknown_Release(parser);
1286 }
1287
1288 static void parse_script_af(DWORD flags, const char *src)
1289 {
1290     BSTR tmp;
1291     HRESULT hres;
1292
1293     tmp = a2bstr(src);
1294     hres = parse_script(flags, tmp);
1295     SysFreeString(tmp);
1296     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1297 }
1298
1299 static void parse_script_a(const char *src)
1300 {
1301     parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1302 }
1303
1304 static void parse_script_with_error_a(const char *src, SCODE errorcode, ULONG line, LONG pos, LPCSTR source, LPCSTR desc, LPCSTR linetext)
1305 {
1306     BSTR tmp, script_source, description, line_text;
1307
1308     tmp = a2bstr(src);
1309     script_source = a2bstr(source);
1310     description = a2bstr(desc);
1311     line_text = a2bstr(linetext);
1312
1313     parse_script_with_error(SCRIPTITEM_GLOBALMEMBERS, tmp, errorcode, line, pos, script_source, description, line_text);
1314
1315     SysFreeString(line_text);
1316     SysFreeString(description);
1317     SysFreeString(script_source);
1318     SysFreeString(tmp);
1319 }
1320
1321 static HRESULT parse_htmlscript_a(const char *src)
1322 {
1323     HRESULT hres;
1324     BSTR tmp = a2bstr(src);
1325     hres = parse_htmlscript(tmp);
1326     SysFreeString(tmp);
1327
1328     return hres;
1329 }
1330
1331 static BSTR get_script_from_file(const char *filename)
1332 {
1333     DWORD size, len;
1334     HANDLE file, map;
1335     const char *file_map;
1336     BSTR ret;
1337
1338     file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
1339     if(file == INVALID_HANDLE_VALUE) {
1340         trace("Could not open file: %u\n", GetLastError());
1341         return NULL;
1342     }
1343
1344     size = GetFileSize(file, NULL);
1345
1346     map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
1347     CloseHandle(file);
1348     if(map == INVALID_HANDLE_VALUE) {
1349         trace("Could not create file mapping: %u\n", GetLastError());
1350         return NULL;
1351     }
1352
1353     file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
1354     CloseHandle(map);
1355     if(!file_map) {
1356         trace("MapViewOfFile failed: %u\n", GetLastError());
1357         return NULL;
1358     }
1359
1360     len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
1361     ret = SysAllocStringLen(NULL, len);
1362     MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
1363
1364     UnmapViewOfFile(file_map);
1365
1366     return ret;
1367 }
1368
1369 static void run_from_file(const char *filename)
1370 {
1371     BSTR script_str;
1372     HRESULT hres;
1373
1374     script_str = get_script_from_file(filename);
1375     if(!script_str)
1376         return;
1377
1378     strict_dispid_check = FALSE;
1379     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
1380     SysFreeString(script_str);
1381     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1382 }
1383
1384 static void run_from_res(const char *name)
1385 {
1386     const char *data;
1387     DWORD size, len;
1388     BSTR str;
1389     HRSRC src;
1390     HRESULT hres;
1391
1392     strict_dispid_check = FALSE;
1393     test_name = name;
1394
1395     src = FindResourceA(NULL, name, (LPCSTR)40);
1396     ok(src != NULL, "Could not find resource %s\n", name);
1397
1398     size = SizeofResource(NULL, src);
1399     data = LoadResource(NULL, src);
1400
1401     len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1402     str = SysAllocStringLen(NULL, len);
1403     MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1404
1405     SET_EXPECT(global_success_d);
1406     SET_EXPECT(global_success_i);
1407     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
1408     CHECK_CALLED(global_success_d);
1409     CHECK_CALLED(global_success_i);
1410
1411     ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1412     SysFreeString(str);
1413 }
1414
1415 static void test_isvisible(BOOL global_members)
1416 {
1417     IActiveScriptParse *parser;
1418     IActiveScript *engine;
1419     HRESULT hres;
1420
1421     static const WCHAR script_textW[] =
1422         {'v','a','r',' ','v',' ','=',' ','t','e','s','t','V','a','l',';',0};
1423
1424     engine = create_script();
1425     if(!engine)
1426         return;
1427
1428     hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1429     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1430     if (FAILED(hres))
1431     {
1432         IActiveScript_Release(engine);
1433         return;
1434     }
1435
1436     hres = IActiveScriptParse64_InitNew(parser);
1437     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1438
1439     hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1440     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1441
1442     if(global_members)
1443         SET_EXPECT(GetItemInfo_testVal);
1444     hres = IActiveScript_AddNamedItem(engine, test_valW,
1445             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|
1446             (global_members ? SCRIPTITEM_GLOBALMEMBERS : 0));
1447     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1448     if(global_members)
1449         CHECK_CALLED(GetItemInfo_testVal);
1450
1451     hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1452     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1453
1454     if(!global_members)
1455         SET_EXPECT(GetItemInfo_testVal);
1456     hres = IActiveScriptParse64_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1457     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1458     if(!global_members)
1459         CHECK_CALLED(GetItemInfo_testVal);
1460
1461     hres = IActiveScriptParse64_ParseScriptText(parser, script_textW, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1462     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1463
1464     IActiveScript_Release(engine);
1465     IUnknown_Release(parser);
1466 }
1467
1468 static BOOL run_tests(void)
1469 {
1470     HRESULT hres;
1471
1472     if(invoke_version) {
1473         IActiveScript *script;
1474
1475         script = create_script();
1476         if(!script) {
1477             win_skip("Could not create script\n");
1478             return FALSE;
1479         }
1480         IActiveScript_Release(script);
1481     }
1482
1483     strict_dispid_check = TRUE;
1484
1485     parse_script_a("");
1486     parse_script_a("/* empty */ ;");
1487
1488     SET_EXPECT(global_propget_d);
1489     SET_EXPECT(global_propget_i);
1490     parse_script_a("testPropGet;");
1491     CHECK_CALLED(global_propget_d);
1492     CHECK_CALLED(global_propget_i);
1493
1494     SET_EXPECT(global_propput_d);
1495     SET_EXPECT(global_propput_i);
1496     parse_script_a("testPropPut = 1;");
1497     CHECK_CALLED(global_propput_d);
1498     CHECK_CALLED(global_propput_i);
1499
1500     SET_EXPECT(global_success_d);
1501     SET_EXPECT(global_success_i);
1502     parse_script_a("reportSuccess();");
1503     CHECK_CALLED(global_success_d);
1504     CHECK_CALLED(global_success_i);
1505
1506     SET_EXPECT(testobj_delete);
1507     parse_script_a("delete testObj.deleteTest;");
1508     CHECK_CALLED(testobj_delete);
1509
1510     SET_EXPECT(global_propdelete_d);
1511     SET_EXPECT(DeleteMemberByDispID);
1512     parse_script_a("delete testPropDelete;");
1513     CHECK_CALLED(global_propdelete_d);
1514     CHECK_CALLED(DeleteMemberByDispID);
1515
1516     parse_script_a("(function reportSuccess() {})()");
1517
1518     parse_script_a("ok(typeof(test) === 'object', \"typeof(test) != 'object'\");");
1519
1520     parse_script_a("function reportSuccess() {}; reportSuccess();");
1521
1522     SET_EXPECT(global_propget_d);
1523     parse_script_a("var testPropGet");
1524     CHECK_CALLED(global_propget_d);
1525
1526     SET_EXPECT(global_propget_d);
1527     parse_script_a("eval('var testPropGet;');");
1528     CHECK_CALLED(global_propget_d);
1529
1530     SET_EXPECT(global_notexists_d);
1531     parse_script_a("var notExists; notExists = 1;");
1532     CHECK_CALLED(global_notexists_d);
1533
1534     parse_script_a("function f() { var testPropGet; }");
1535     parse_script_a("(function () { var testPropGet; })();");
1536     parse_script_a("(function () { eval('var testPropGet;'); })();");
1537
1538     SET_EXPECT(invoke_func);
1539     parse_script_a("ok(propGetFunc() == 0, \"Incorrect propGetFunc value\");");
1540     CHECK_CALLED(invoke_func);
1541     parse_script_a("ok(propGetFunc(1) == 1, \"Incorrect propGetFunc value\");");
1542     parse_script_a("ok(propGetFunc(1, 2) == 2, \"Incorrect propGetFunc value\");");
1543     SET_EXPECT(invoke_func);
1544     parse_script_a("ok(propGetFunc().toString() == 0, \"Incorrect propGetFunc value\");");
1545     CHECK_CALLED(invoke_func);
1546     parse_script_a("ok(propGetFunc(1).toString() == 1, \"Incorrect propGetFunc value\");");
1547     SET_EXPECT(invoke_func);
1548     parse_script_a("propGetFunc(1);");
1549     CHECK_CALLED(invoke_func);
1550
1551     parse_script_a("objectFlag(1).toString();");
1552
1553     parse_script_a("(function() { var tmp = (function () { return testObj; })()(1);})();");
1554     parse_script_a("(function() { var tmp = (function () { return testObj; })()();})();");
1555
1556     parse_script_a("ok((testObj instanceof Object) === false, 'testObj is instance of Object');");
1557
1558     SET_EXPECT(testobj_prop_d);
1559     parse_script_a("ok(('prop' in testObj) === true, 'prop is not in testObj');");
1560     CHECK_CALLED(testobj_prop_d);
1561
1562     SET_EXPECT(testobj_noprop_d);
1563     parse_script_a("ok(('noprop' in testObj) === false, 'noprop is in testObj');");
1564     CHECK_CALLED(testobj_noprop_d);
1565
1566     SET_EXPECT(testobj_prop_d);
1567     parse_script_a("ok(Object.prototype.hasOwnProperty.call(testObj, 'prop') === true, 'hasOwnProperty(\\\"prop\\\") returned false');");
1568     CHECK_CALLED(testobj_prop_d);
1569
1570     SET_EXPECT(testobj_noprop_d);
1571     parse_script_a("ok(Object.prototype.hasOwnProperty.call(testObj, 'noprop') === false, 'hasOwnProperty(\\\"noprop\\\") returned true');");
1572     CHECK_CALLED(testobj_noprop_d);
1573
1574     SET_EXPECT(puredisp_prop_d);
1575     parse_script_a("ok(Object.prototype.hasOwnProperty.call(pureDisp, 'prop') === true, 'hasOwnProperty(\\\"noprop\\\") returned false');");
1576     CHECK_CALLED(puredisp_prop_d);
1577
1578     SET_EXPECT(puredisp_noprop_d);
1579     parse_script_a("ok(Object.prototype.hasOwnProperty.call(pureDisp, 'noprop') === false, 'hasOwnProperty(\\\"noprop\\\") returned true');");
1580     CHECK_CALLED(puredisp_noprop_d);
1581
1582     SET_EXPECT(testobj_value);
1583     parse_script_a("ok(String(testObj) === '1', 'wrong testObj value');");
1584     CHECK_CALLED(testobj_value);
1585
1586     SET_EXPECT(testobj_value);
1587     parse_script_a("ok(String.prototype.concat.call(testObj, ' OK') === '1 OK', 'wrong concat result');");
1588     CHECK_CALLED(testobj_value);
1589
1590     SET_EXPECT(global_propget_d);
1591     SET_EXPECT(global_propget_i);
1592     parse_script_a("this.testPropGet;");
1593     CHECK_CALLED(global_propget_d);
1594     CHECK_CALLED(global_propget_i);
1595
1596     SET_EXPECT(global_propget_d);
1597     SET_EXPECT(global_propget_i);
1598     parse_script_a("(function () { this.testPropGet; })();");
1599     CHECK_CALLED(global_propget_d);
1600     CHECK_CALLED(global_propget_i);
1601
1602     parse_script_a("testThis(this);");
1603     parse_script_a("(function () { testThis(this); })();");
1604
1605     SET_EXPECT(testobj_onlydispid_d);
1606     SET_EXPECT(testobj_onlydispid_i);
1607     parse_script_a("ok(typeof(testObj.onlyDispID) === 'unknown', 'unexpected typeof(testObj.onlyDispID)');");
1608     CHECK_CALLED(testobj_onlydispid_d);
1609     CHECK_CALLED(testobj_onlydispid_i);
1610
1611     run_from_res("lang.js");
1612     run_from_res("api.js");
1613     run_from_res("regexp.js");
1614     run_from_res("cc.js");
1615
1616     test_isvisible(FALSE);
1617     test_isvisible(TRUE);
1618
1619     parse_script_af(0, "test.testThis2(this);");
1620     parse_script_af(0, "(function () { test.testThis2(this); })();");
1621
1622     hres = parse_htmlscript_a("<!--");
1623     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1624     hres = parse_htmlscript_a("-->");
1625     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1626     hres = parse_htmlscript_a("<!--\nvar a=1;\n-->\n");
1627     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1628     hres = parse_htmlscript_a("<!--\n<!-- ignore this\n-->\n");
1629     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1630     hres = parse_htmlscript_a("var a=1;\nif(a-->0) a=5;\n");
1631     ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1632     hres = parse_htmlscript_a("var a=1;\nif(a\n-->0) a=5;\n");
1633     ok(hres != S_OK, "ParseScriptText have not failed\n");
1634
1635     parse_script_with_error_a(
1636         "?",
1637         0x800a03ea, 0, 0,
1638         "Microsoft JScript compilation error",
1639         "Syntax error",
1640         "?");
1641
1642     parse_script_with_error_a(
1643         "var a=1;\nif(a\n-->0) a=5;\n",
1644         0x800a03ee, 2, 0,
1645         "Microsoft JScript compilation error",
1646         "Expected ')'",
1647         "-->0) a=5;");
1648
1649     parse_script_with_error_a(
1650         "new 3;",
1651         0x800a01bd, 0, 0,
1652         "Microsoft JScript runtime error",
1653         "Object doesn't support this action",
1654         NULL);
1655
1656     parse_script_with_error_a(
1657         "new null;",
1658         0x800a138f, 0, 0,
1659         "Microsoft JScript runtime error",
1660         "Object expected",
1661         NULL);
1662
1663     parse_script_with_error_a(
1664         "var a;\nnew null;",
1665         0x800a138f, 1, 0,
1666         "Microsoft JScript runtime error",
1667         "Object expected",
1668         NULL);
1669
1670     parse_script_with_error_a(
1671         "var a; new null;",
1672         0x800a138f, 0, 7,
1673         "Microsoft JScript runtime error",
1674         "Object expected",
1675         NULL);
1676
1677     return TRUE;
1678 }
1679
1680 static void run_encoded_tests(void)
1681 {
1682     BSTR src;
1683     HRESULT hres;
1684
1685     engine_clsid = &CLSID_JScriptEncode;
1686
1687     SET_EXPECT(global_success_d);
1688     SET_EXPECT(global_success_i);
1689     /*             |reportSuccess();                           | */
1690     parse_script_a("#@~^EAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
1691     CHECK_CALLED(global_success_d);
1692     CHECK_CALLED(global_success_i);
1693
1694     SET_EXPECT(global_success_d);
1695     SET_EXPECT(global_success_i);
1696     parse_script_a("reportSuccess();");
1697     CHECK_CALLED(global_success_d);
1698     CHECK_CALLED(global_success_i);
1699
1700     SET_EXPECT(global_success_d);
1701     SET_EXPECT(global_success_i);
1702     /*                   |Success                         | */
1703     parse_script_a("report#@~^BwAAAA==j!m^\x7f/k2QIAAA==^#~@();");
1704     CHECK_CALLED(global_success_d);
1705     CHECK_CALLED(global_success_i);
1706
1707     SET_EXPECT(global_success_d);
1708     SET_EXPECT(global_success_i);
1709     /*             |\r\n\treportSuccess();\r\n                        | */
1710     parse_script_a("#@~^GQAAAA==@#@&d.\x7fwKDYUE1^+k/c#p@#@&OAYAAA==^#~@");
1711     CHECK_CALLED(global_success_d);
1712     CHECK_CALLED(global_success_i);
1713
1714     /*                   v                                   */
1715     src = a2bstr("#@~^EAA*AA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
1716     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
1717     SysFreeString(src);
1718     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
1719
1720     /*                      vv                                 */
1721     src = a2bstr("#@~^EAAAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
1722     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
1723     SysFreeString(src);
1724     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
1725
1726     /*                      v                                */
1727     src = a2bstr("#@~^EAAAAA^=.\x7fwGMYUEm1+kd`*iAQYAAA==^#~@");
1728     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
1729     SysFreeString(src);
1730     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
1731
1732     /*                                     v                 */
1733     src = a2bstr("#@~^EAAAAA==.\x7fwGMYUEm1ekd`*iAQYAAA==^#~@");
1734     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
1735     SysFreeString(src);
1736     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
1737
1738     /*                                                    vv  */
1739     src = a2bstr("#@~^EAAAAA==.\x7fwGMYUEm1+kd`*iAQYAAA==^~#@");
1740     hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, src);
1741     SysFreeString(src);
1742     ok(hres == JS_E_INVALID_CHAR, "parse_script failed %08x\n", hres);
1743 }
1744
1745 static BOOL check_jscript(void)
1746 {
1747     IActiveScriptProperty *script_prop;
1748     BSTR str;
1749     HRESULT hres;
1750
1751     hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1752             &IID_IActiveScriptProperty, (void**)&script_prop);
1753     if(FAILED(hres))
1754         return FALSE;
1755     IActiveScriptProperty_Release(script_prop);
1756
1757     str = a2bstr("if(!('localeCompare' in String.prototype)) throw 1;");
1758     hres = parse_script(0, str);
1759     SysFreeString(str);
1760
1761     return hres == S_OK;
1762 }
1763
1764 START_TEST(run)
1765 {
1766     int argc;
1767     char **argv;
1768
1769     argc = winetest_get_mainargs(&argv);
1770
1771     CoInitialize(NULL);
1772
1773     if(!check_jscript()) {
1774         win_skip("Broken engine, probably too old\n");
1775     }else if(argc > 2) {
1776         invoke_version = 2;
1777         run_from_file(argv[2]);
1778     }else {
1779         trace("invoke version 0\n");
1780         invoke_version = 0;
1781         run_tests();
1782
1783         trace("invoke version 2\n");
1784         invoke_version = 2;
1785         if(run_tests()) {
1786             trace("JSctipt.Encode tests...\n");
1787             run_encoded_tests();
1788         }
1789     }
1790
1791     CoUninitialize();
1792 }