winealsa: Map ALSA errors to AUDCLNT_E_*.
[wine] / dlls / jscript / tests / activex.c
1 /*
2  * Copyright 2009 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 #include <objsafe.h>
28 #include <urlmon.h>
29 #include <mshtmhst.h>
30
31 #include "wine/test.h"
32
33 static const CLSID CLSID_JScript =
34     {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
35
36 #define DEFINE_EXPECT(func) \
37     static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
38
39 #define SET_EXPECT(func) \
40     expect_ ## func = TRUE
41
42 #define SET_CALLED(func) \
43     called_ ## func = TRUE
44
45 #define CHECK_EXPECT2(func) \
46     do { \
47         ok(expect_ ##func, "unexpected call " #func "\n"); \
48         called_ ## func = TRUE; \
49     }while(0)
50
51 #define CHECK_EXPECT(func) \
52     do { \
53         CHECK_EXPECT2(func); \
54         expect_ ## func = FALSE; \
55     }while(0)
56
57 #define CHECK_CALLED(func) \
58     do { \
59         ok(called_ ## func, "expected " #func "\n"); \
60         expect_ ## func = called_ ## func = FALSE; \
61     }while(0)
62
63 DEFINE_EXPECT(CreateInstance);
64 DEFINE_EXPECT(ProcessUrlAction);
65 DEFINE_EXPECT(QueryCustomPolicy);
66 DEFINE_EXPECT(reportSuccess);
67 DEFINE_EXPECT(Host_QS_SecMgr);
68 DEFINE_EXPECT(Caller_QS_SecMgr);
69 DEFINE_EXPECT(QI_IObjectWithSite);
70 DEFINE_EXPECT(SetSite);
71
72 static const WCHAR testW[] = {'t','e','s','t',0};
73
74 static HRESULT QS_SecMgr_hres;
75 static HRESULT ProcessUrlAction_hres;
76 static DWORD ProcessUrlAction_policy;
77 static HRESULT CreateInstance_hres;
78 static HRESULT QueryCustomPolicy_hres;
79 static DWORD QueryCustomPolicy_psize;
80 static DWORD QueryCustomPolicy_policy;
81 static HRESULT QI_IDispatch_hres;
82 static HRESULT SetSite_hres;
83 static BOOL AllowIServiceProvider;
84
85 #define TESTOBJ_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80646}"
86
87 static const GUID CLSID_TestObj =
88     {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x06,0x46}};
89
90 /* Defined as extern in urlmon.idl, but not exported by uuid.lib */
91 const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
92     {0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
93
94 #define DISPID_TEST_REPORTSUCCESS    0x1000
95
96 #define DISPID_GLOBAL_OK             0x2000
97
98 static const char *debugstr_guid(REFIID riid)
99 {
100     static char buf[50];
101
102     sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
103             riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
104             riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
105             riid->Data4[5], riid->Data4[6], riid->Data4[7]);
106
107     return buf;
108 }
109
110 static BSTR a2bstr(const char *str)
111 {
112     BSTR ret;
113     int len;
114
115     len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
116     ret = SysAllocStringLen(NULL, len-1);
117     MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
118
119     return ret;
120 }
121
122 static int strcmp_wa(LPCWSTR strw, const char *stra)
123 {
124     CHAR buf[512];
125     WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
126     return lstrcmpA(buf, stra);
127 }
128
129 static HRESULT WINAPI ObjectWithSite_QueryInterface(IObjectWithSite *iface, REFIID riid, void **ppv)
130 {
131     ok(0, "unexpected call\n");
132     return E_NOTIMPL;
133 }
134
135 static ULONG WINAPI ObjectWithSite_AddRef(IObjectWithSite *iface)
136 {
137     return 2;
138 }
139
140 static ULONG WINAPI ObjectWithSite_Release(IObjectWithSite *iface)
141 {
142     return 1;
143 }
144
145 static HRESULT WINAPI ObjectWithSite_SetSite(IObjectWithSite *iface, IUnknown *pUnkSite)
146 {
147     IServiceProvider *sp;
148     HRESULT hres;
149
150
151     CHECK_EXPECT(SetSite);
152     ok(pUnkSite != NULL, "pUnkSite == NULL\n");
153
154     hres = IUnknown_QueryInterface(pUnkSite, &IID_IServiceProvider, (void**)&sp);
155     ok(hres == S_OK, "Could not get IServiceProvider iface: %08x\n", hres);
156     IServiceProvider_Release(sp);
157
158     return SetSite_hres;
159 }
160
161 static HRESULT WINAPI ObjectWithSite_GetSite(IObjectWithSite *iface, REFIID riid, void **ppvSite)
162 {
163     ok(0, "unexpected call\n");
164     return E_NOTIMPL;
165 }
166
167 static const IObjectWithSiteVtbl ObjectWithSiteVtbl = {
168     ObjectWithSite_QueryInterface,
169     ObjectWithSite_AddRef,
170     ObjectWithSite_Release,
171     ObjectWithSite_SetSite,
172     ObjectWithSite_GetSite
173 };
174
175 static IObjectWithSite ObjectWithSite = { &ObjectWithSiteVtbl };
176
177 static IObjectWithSite *object_with_site;
178
179 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
180 {
181     *ppv = NULL;
182
183     if(IsEqualGUID(riid, &IID_IUnknown)) {
184        *ppv = iface;
185     }else if(IsEqualGUID(riid, &IID_IDispatch) || IsEqualGUID(riid, &IID_IDispatchEx)) {
186         if(FAILED(QI_IDispatch_hres))
187             return QI_IDispatch_hres;
188         *ppv = iface;
189     }else if(IsEqualGUID(&IID_IObjectWithSite, riid)) {
190         CHECK_EXPECT(QI_IObjectWithSite);
191         *ppv = object_with_site;
192     }else if(IsEqualGUID(&IID_IObjectSafety, riid)) {
193         ok(0, "Unexpected IID_IObjectSafety query\n");
194     }
195
196     return *ppv ? S_OK : E_NOINTERFACE;
197 }
198
199 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
200 {
201     return 2;
202 }
203
204 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
205 {
206     return 1;
207 }
208
209 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
210 {
211     ok(0, "unexpected call\n");
212     return E_NOTIMPL;
213 }
214
215 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
216                                               LCID lcid, ITypeInfo **ppTInfo)
217 {
218     ok(0, "unexpected call\n");
219     return E_NOTIMPL;
220 }
221
222 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
223                                                 LPOLESTR *rgszNames, UINT cNames,
224                                                 LCID lcid, DISPID *rgDispId)
225 {
226     ok(0, "unexpected call\n");
227     return E_NOTIMPL;
228 }
229
230 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
231                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
232                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
233 {
234     ok(0, "unexpected call\n");
235     return E_NOTIMPL;
236 }
237
238 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
239 {
240     ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
241     return E_NOTIMPL;
242 }
243
244 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
245 {
246     ok(0, "unexpected call\n");
247     return E_NOTIMPL;
248 }
249
250 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
251 {
252     ok(0, "unexpected call\n");
253     return E_NOTIMPL;
254 }
255
256 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
257 {
258     ok(0, "unexpected call\n");
259     return E_NOTIMPL;
260 }
261
262 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
263 {
264     ok(0, "unexpected call\n");
265     return E_NOTIMPL;
266 }
267
268 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
269 {
270     ok(0, "unexpected call\n");
271     return E_NOTIMPL;
272 }
273
274 static HRESULT WINAPI Test_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
275 {
276     if(!strcmp_wa(bstrName, "reportSuccess")) {
277         ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
278         *pid = DISPID_TEST_REPORTSUCCESS;
279         return S_OK;
280     }
281
282     ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName));
283     return E_NOTIMPL;
284 }
285
286 static HRESULT WINAPI Test_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
287         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
288 {
289     switch(id) {
290     case DISPID_TEST_REPORTSUCCESS:
291         CHECK_EXPECT(reportSuccess);
292
293         ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
294         ok(pdp != NULL, "pdp == NULL\n");
295         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
296         ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
297         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
298         ok(!pvarRes, "pvarRes != NULL\n");
299         ok(pei != NULL, "pei == NULL\n");
300         break;
301
302     default:
303         ok(0, "unexpected call\n");
304         return E_NOTIMPL;
305     }
306
307     return S_OK;
308 }
309
310 static IDispatchExVtbl testObjVtbl = {
311     DispatchEx_QueryInterface,
312     DispatchEx_AddRef,
313     DispatchEx_Release,
314     DispatchEx_GetTypeInfoCount,
315     DispatchEx_GetTypeInfo,
316     DispatchEx_GetIDsOfNames,
317     DispatchEx_Invoke,
318     Test_GetDispID,
319     Test_InvokeEx,
320     DispatchEx_DeleteMemberByName,
321     DispatchEx_DeleteMemberByDispID,
322     DispatchEx_GetMemberProperties,
323     DispatchEx_GetMemberName,
324     DispatchEx_GetNextDispID,
325     DispatchEx_GetNameSpaceParent
326 };
327
328 static IDispatchEx testObj = { &testObjVtbl };
329
330 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
331 {
332     if(!strcmp_wa(bstrName, "ok")) {
333         ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
334         *pid = DISPID_GLOBAL_OK;
335         return S_OK;
336     }
337
338     ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName));
339     return E_NOTIMPL;
340 }
341
342 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
343         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
344 {
345     switch(id) {
346     case DISPID_GLOBAL_OK:
347         ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
348         ok(pdp != NULL, "pdp == NULL\n");
349         ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
350         ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
351         ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
352         ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
353         ok(pei != NULL, "pei == NULL\n");
354
355         ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
356         ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg));
357         ok(V_BOOL(pdp->rgvarg+1), "%s\n", wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
358         break;
359
360     default:
361         ok(0, "unexpected call\n");
362         return E_NOTIMPL;
363     }
364
365     return S_OK;
366 }
367
368 static IDispatchExVtbl globalObjVtbl = {
369     DispatchEx_QueryInterface,
370     DispatchEx_AddRef,
371     DispatchEx_Release,
372     DispatchEx_GetTypeInfoCount,
373     DispatchEx_GetTypeInfo,
374     DispatchEx_GetIDsOfNames,
375     DispatchEx_Invoke,
376     Global_GetDispID,
377     Global_InvokeEx,
378     DispatchEx_DeleteMemberByName,
379     DispatchEx_DeleteMemberByDispID,
380     DispatchEx_GetMemberProperties,
381     DispatchEx_GetMemberName,
382     DispatchEx_GetNextDispID,
383     DispatchEx_GetNameSpaceParent
384 };
385
386 static IDispatchEx globalObj = { &globalObjVtbl };
387
388 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
389 {
390     if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IClassFactory, riid)) {
391         *ppv = iface;
392         return S_OK;
393     }
394
395     /* TODO: IClassFactoryEx */
396     *ppv = NULL;
397     return E_NOINTERFACE;
398 }
399
400 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
401 {
402     return 2;
403 }
404
405 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
406 {
407     return 1;
408 }
409
410 static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
411 {
412     CHECK_EXPECT(CreateInstance);
413
414     ok(!outer, "outer = %p\n", outer);
415     ok(IsEqualGUID(&IID_IUnknown, riid), "unexpected riid %s\n", debugstr_guid(riid));
416
417     if(SUCCEEDED(CreateInstance_hres))
418         *ppv = &testObj;
419     return CreateInstance_hres;
420 }
421
422 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock)
423 {
424     ok(0, "unexpected call\n");
425     return S_OK;
426 }
427
428 static const IClassFactoryVtbl ClassFactoryVtbl = {
429     ClassFactory_QueryInterface,
430     ClassFactory_AddRef,
431     ClassFactory_Release,
432     ClassFactory_CreateInstance,
433     ClassFactory_LockServer
434 };
435
436 static IClassFactory activex_cf = { &ClassFactoryVtbl };
437
438 static HRESULT WINAPI InternetHostSecurityManager_QueryInterface(IInternetHostSecurityManager *iface, REFIID riid, void **ppv)
439 {
440     ok(0, "unexpected call\n");
441     return E_NOINTERFACE;
442 }
443
444 static ULONG WINAPI InternetHostSecurityManager_AddRef(IInternetHostSecurityManager *iface)
445 {
446     return 2;
447 }
448
449 static ULONG WINAPI InternetHostSecurityManager_Release(IInternetHostSecurityManager *iface)
450 {
451     return 1;
452 }
453
454 static HRESULT WINAPI InternetHostSecurityManager_GetSecurityId(IInternetHostSecurityManager *iface,  BYTE *pbSecurityId,
455         DWORD *pcbSecurityId, DWORD_PTR dwReserved)
456 {
457     ok(0, "unexpected call\n");
458     return E_NOTIMPL;
459 }
460
461 static HRESULT WINAPI InternetHostSecurityManager_ProcessUrlAction(IInternetHostSecurityManager *iface, DWORD dwAction,
462         BYTE *pPolicy, DWORD cbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwFlags, DWORD dwReserved)
463 {
464     CHECK_EXPECT(ProcessUrlAction);
465
466     ok(dwAction == URLACTION_ACTIVEX_RUN, "dwAction = %x\n", dwAction);
467     ok(pPolicy != NULL, "pPolicy == NULL\n");
468     ok(cbPolicy == sizeof(DWORD), "cbPolicy = %d\n", cbPolicy);
469     ok(pContext != NULL, "pContext == NULL\n");
470     ok(cbContext == sizeof(GUID), "cbContext = %d\n", cbContext);
471     ok(IsEqualGUID(pContext, &CLSID_TestObj), "pContext = %s\n", debugstr_guid((const IID*)pContext));
472     ok(!dwFlags, "dwFlags = %x\n", dwFlags);
473     ok(!dwReserved, "dwReserved = %x\n", dwReserved);
474
475     if(SUCCEEDED(ProcessUrlAction_hres))
476         *(DWORD*)pPolicy = ProcessUrlAction_policy;
477     return ProcessUrlAction_hres;
478 }
479
480 static HRESULT WINAPI InternetHostSecurityManager_QueryCustomPolicy(IInternetHostSecurityManager *iface, REFGUID guidKey,
481         BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwReserved)
482 {
483     const struct CONFIRMSAFETY *cs = (const struct CONFIRMSAFETY*)pContext;
484     DWORD *ret;
485
486     CHECK_EXPECT(QueryCustomPolicy);
487
488     ok(IsEqualGUID(&GUID_CUSTOM_CONFIRMOBJECTSAFETY, guidKey), "guidKey = %s\n", debugstr_guid(guidKey));
489
490     ok(ppPolicy != NULL, "ppPolicy == NULL\n");
491     ok(pcbPolicy != NULL, "pcbPolicy == NULL\n");
492     ok(pContext != NULL, "pContext == NULL\n");
493     ok(cbContext == sizeof(struct CONFIRMSAFETY), "cbContext = %d\n", cbContext);
494     ok(!dwReserved, "dwReserved = %x\n", dwReserved);
495
496     /* TODO: CLSID */
497     ok(cs->pUnk != NULL, "cs->pUnk == NULL\n");
498     ok(!cs->dwFlags, "dwFlags = %x\n", cs->dwFlags);
499
500     if(FAILED(QueryCustomPolicy_hres))
501         return QueryCustomPolicy_hres;
502
503     ret = CoTaskMemAlloc(QueryCustomPolicy_psize);
504     *ppPolicy = (BYTE*)ret;
505     *pcbPolicy = QueryCustomPolicy_psize;
506     memset(ret, 0, QueryCustomPolicy_psize);
507     if(QueryCustomPolicy_psize >= sizeof(DWORD))
508         *ret = QueryCustomPolicy_policy;
509
510     return QueryCustomPolicy_hres;
511 }
512
513 static const IInternetHostSecurityManagerVtbl InternetHostSecurityManagerVtbl = {
514     InternetHostSecurityManager_QueryInterface,
515     InternetHostSecurityManager_AddRef,
516     InternetHostSecurityManager_Release,
517     InternetHostSecurityManager_GetSecurityId,
518     InternetHostSecurityManager_ProcessUrlAction,
519     InternetHostSecurityManager_QueryCustomPolicy
520 };
521
522 static IInternetHostSecurityManager InternetHostSecurityManager = { &InternetHostSecurityManagerVtbl };
523
524 static IServiceProvider ServiceProvider;
525
526 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
527 {
528     ok(0, "unexpected call\n");
529     return E_NOINTERFACE;
530 }
531
532 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
533 {
534     return 2;
535 }
536
537 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
538 {
539     return 1;
540 }
541
542 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface,
543         REFGUID guidService, REFIID riid, void **ppv)
544 {
545     if(IsEqualGUID(&SID_GetCaller, guidService))
546         return E_NOINTERFACE;
547
548     if(IsEqualGUID(&SID_SInternetHostSecurityManager, guidService)) {
549         if(iface == &ServiceProvider)
550             CHECK_EXPECT(Host_QS_SecMgr);
551         else
552             CHECK_EXPECT(Caller_QS_SecMgr);
553         ok(IsEqualGUID(&IID_IInternetHostSecurityManager, riid), "unexpected riid %s\n", debugstr_guid(riid));
554         if(SUCCEEDED(QS_SecMgr_hres))
555             *ppv = &InternetHostSecurityManager;
556         return QS_SecMgr_hres;
557     }
558
559     ok(0, "unexpected service %s\n", debugstr_guid(guidService));
560     return E_NOINTERFACE;
561 }
562
563 static IServiceProviderVtbl ServiceProviderVtbl = {
564     ServiceProvider_QueryInterface,
565     ServiceProvider_AddRef,
566     ServiceProvider_Release,
567     ServiceProvider_QueryService
568 };
569
570 static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
571 static IServiceProvider caller_sp = { &ServiceProviderVtbl };
572
573 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
574 {
575     if(IsEqualGUID(&IID_IUnknown, riid)) {
576         *ppv = iface;
577     }else if(IsEqualGUID(&IID_IActiveScriptSite, riid)) {
578         *ppv = iface;
579     }else if(IsEqualGUID(&IID_IServiceProvider, riid) && AllowIServiceProvider) {
580         *ppv = &ServiceProvider;
581     }else {
582         *ppv = NULL;
583         return E_NOINTERFACE;
584     }
585
586     IUnknown_AddRef((IUnknown*)*ppv);
587     return S_OK;
588 }
589
590 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
591 {
592     return 2;
593 }
594
595 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
596 {
597     return 1;
598 }
599
600 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
601 {
602     *plcid = GetUserDefaultLCID();
603     return S_OK;
604 }
605
606 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
607         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
608 {
609     ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
610     ok(!ppti, "ppti != NULL\n");
611     ok(!strcmp_wa(pstrName, "test"), "pstrName = %s\n", wine_dbgstr_w(pstrName));
612
613     *ppiunkItem = (IUnknown*)&globalObj;
614     return S_OK;
615 }
616
617 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
618 {
619     return E_NOTIMPL;
620 }
621
622 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
623         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
624 {
625     return E_NOTIMPL;
626 }
627
628 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
629 {
630     return E_NOTIMPL;
631 }
632
633 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
634 {
635     return E_NOTIMPL;
636 }
637
638 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
639 {
640     return E_NOTIMPL;
641 }
642
643 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
644 {
645     return E_NOTIMPL;
646 }
647
648 #undef ACTSCPSITE_THIS
649
650 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
651     ActiveScriptSite_QueryInterface,
652     ActiveScriptSite_AddRef,
653     ActiveScriptSite_Release,
654     ActiveScriptSite_GetLCID,
655     ActiveScriptSite_GetItemInfo,
656     ActiveScriptSite_GetDocVersionString,
657     ActiveScriptSite_OnScriptTerminate,
658     ActiveScriptSite_OnStateChange,
659     ActiveScriptSite_OnScriptError,
660     ActiveScriptSite_OnEnterScript,
661     ActiveScriptSite_OnLeaveScript
662 };
663
664 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
665
666 static void set_safety_options(IUnknown *unk, BOOL use_sec_mgr)
667 {
668     IObjectSafety *safety;
669     DWORD supported, enabled, options_all, options_set;
670     HRESULT hres;
671
672     hres = IUnknown_QueryInterface(unk, &IID_IObjectSafety, (void**)&safety);
673     ok(hres == S_OK, "Could not get IObjectSafety: %08x\n", hres);
674     if(FAILED(hres))
675         return;
676
677     options_all = INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER;
678     if(use_sec_mgr)
679         options_set = options_all;
680     else
681         options_set = INTERFACE_USES_DISPEX;
682
683     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, options_all, options_set);
684     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
685
686     supported = enabled = 0xdeadbeef;
687     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
688     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
689     ok(supported == options_all, "supported=%x, expected %x\n", supported, options_all);
690     ok(enabled == options_set, "enabled=%x, expected %x\n", enabled, options_set);
691
692     IObjectSafety_Release(safety);
693 }
694
695 #define parse_script_a(p,s) _parse_script_a(__LINE__,p,s)
696 static void _parse_script_a(unsigned line, IActiveScriptParse *parser, const char *script)
697 {
698     BSTR str;
699     HRESULT hres;
700
701     str = a2bstr(script);
702     hres = IActiveScriptParse64_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
703     SysFreeString(str);
704     ok_(__FILE__,line)(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
705 }
706
707 static IActiveScriptParse *create_script(BOOL skip_tests, BOOL use_sec_mgr)
708 {
709     IActiveScriptParse *parser;
710     IActiveScript *script;
711     HRESULT hres;
712
713     QS_SecMgr_hres = S_OK;
714     ProcessUrlAction_hres = S_OK;
715     ProcessUrlAction_policy = URLPOLICY_ALLOW;
716     CreateInstance_hres = S_OK;
717     QueryCustomPolicy_hres = S_OK;
718     QueryCustomPolicy_psize = sizeof(DWORD);
719     QueryCustomPolicy_policy = URLPOLICY_ALLOW;
720     QI_IDispatch_hres = S_OK;
721     SetSite_hres = S_OK;
722     AllowIServiceProvider = TRUE;
723
724     hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
725             &IID_IActiveScript, (void**)&script);
726     if(!skip_tests)
727         ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
728     if(FAILED(hres))
729         return NULL;
730
731     if(!skip_tests)
732         set_safety_options((IUnknown*)script, use_sec_mgr);
733
734     hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser);
735     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
736
737     hres = IActiveScriptParse64_InitNew(parser);
738     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
739
740     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
741     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
742
743     hres = IActiveScript_AddNamedItem(script, testW,
744             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
745     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
746
747     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED);
748     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
749
750     IActiveScript_Release(script);
751
752     if(!skip_tests) {
753         parse_script_a(parser,
754                 "function testException(func, type, number) {\n"
755                 "    try {\n"
756                 "        func();\n"
757                 "    }catch(e) {\n"
758                 "        ok(e.name === type, 'e.name = ' + e.name + ', expected ' + type)\n"
759                 "        ok(e.number === number, 'e.number = ' + e.number + ', expected ' + number);\n"
760                 "        return;\n"
761                 "    }\n"
762                 "    ok(false, 'exception expected');\n"
763                 "}");
764     }
765
766     return parser;
767 }
768
769 static IDispatchEx *parse_procedure_a(IActiveScriptParse *parser, const char *src)
770 {
771     IActiveScriptParseProcedure2 *parse_proc;
772     IDispatchEx *dispex;
773     IDispatch *disp;
774     BSTR str;
775     HRESULT hres;
776
777     hres = IUnknown_QueryInterface(parser, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
778     ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2: %08x\n", hres);
779
780     str = a2bstr(src);
781     hres = IActiveScriptParseProcedure2_64_ParseProcedureText(parse_proc, str, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, &disp);
782     SysFreeString(str);
783     IUnknown_Release(parse_proc);
784     ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres);
785     ok(disp != NULL, "disp == NULL\n");
786
787     hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
788     IDispatch_Release(dispex);
789     ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
790
791     return dispex;
792 }
793
794 #define call_procedure(p,c) _call_procedure(__LINE__,p,c)
795 static void _call_procedure(unsigned line, IDispatchEx *proc, IServiceProvider *caller)
796 {
797     DISPPARAMS dp = {NULL,NULL,0,0};
798     EXCEPINFO ei = {0};
799     HRESULT hres;
800
801     hres = IDispatchEx_InvokeEx(proc, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, NULL, &ei, caller);
802     ok_(__FILE__,line)(hres == S_OK, "InvokeEx failed: %08x\n", hres);
803
804 }
805
806 static void test_ActiveXObject(void)
807 {
808     IActiveScriptParse *parser;
809     IDispatchEx *proc;
810
811     parser = create_script(FALSE, TRUE);
812
813     SET_EXPECT(Host_QS_SecMgr);
814     SET_EXPECT(ProcessUrlAction);
815     SET_EXPECT(CreateInstance);
816     SET_EXPECT(QueryCustomPolicy);
817     SET_EXPECT(QI_IObjectWithSite);
818     SET_EXPECT(reportSuccess);
819     parse_script_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();");
820     CHECK_CALLED(Host_QS_SecMgr);
821     CHECK_CALLED(ProcessUrlAction);
822     CHECK_CALLED(CreateInstance);
823     CHECK_CALLED(QueryCustomPolicy);
824     CHECK_CALLED(QI_IObjectWithSite);
825     CHECK_CALLED(reportSuccess);
826
827     proc = parse_procedure_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();");
828
829     SET_EXPECT(ProcessUrlAction);
830     SET_EXPECT(CreateInstance);
831     SET_EXPECT(QueryCustomPolicy);
832     SET_EXPECT(QI_IObjectWithSite);
833     SET_EXPECT(reportSuccess);
834     call_procedure(proc, NULL);
835     CHECK_CALLED(ProcessUrlAction);
836     CHECK_CALLED(CreateInstance);
837     CHECK_CALLED(QueryCustomPolicy);
838     CHECK_CALLED(QI_IObjectWithSite);
839     CHECK_CALLED(reportSuccess);
840
841     SET_EXPECT(ProcessUrlAction);
842     SET_EXPECT(CreateInstance);
843     SET_EXPECT(QueryCustomPolicy);
844     SET_EXPECT(QI_IObjectWithSite);
845     SET_EXPECT(reportSuccess);
846     call_procedure(proc, &caller_sp);
847     CHECK_CALLED(ProcessUrlAction);
848     CHECK_CALLED(CreateInstance);
849     CHECK_CALLED(QueryCustomPolicy);
850     CHECK_CALLED(QI_IObjectWithSite);
851     CHECK_CALLED(reportSuccess);
852
853     IDispatchEx_Release(proc);
854     IUnknown_Release(parser);
855
856     parser = create_script(FALSE, TRUE);
857     proc = parse_procedure_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();");
858
859     SET_EXPECT(Host_QS_SecMgr);
860     SET_EXPECT(ProcessUrlAction);
861     SET_EXPECT(CreateInstance);
862     SET_EXPECT(QueryCustomPolicy);
863     SET_EXPECT(QI_IObjectWithSite);
864     SET_EXPECT(reportSuccess);
865     call_procedure(proc, &caller_sp);
866     CHECK_CALLED(Host_QS_SecMgr);
867     CHECK_CALLED(ProcessUrlAction);
868     CHECK_CALLED(CreateInstance);
869     CHECK_CALLED(QueryCustomPolicy);
870     CHECK_CALLED(QI_IObjectWithSite);
871     CHECK_CALLED(reportSuccess);
872
873     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.TestABC'); }, 'Error', -2146827859);");
874
875     IDispatchEx_Release(proc);
876     IUnknown_Release(parser);
877
878     parser = create_script(FALSE, TRUE);
879     QS_SecMgr_hres = E_NOINTERFACE;
880
881     SET_EXPECT(Host_QS_SecMgr);
882     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);");
883     CHECK_CALLED(Host_QS_SecMgr);
884
885     IUnknown_Release(parser);
886
887     parser = create_script(FALSE, TRUE);
888     ProcessUrlAction_hres = E_FAIL;
889
890     SET_EXPECT(Host_QS_SecMgr);
891     SET_EXPECT(ProcessUrlAction);
892     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);");
893     CHECK_CALLED(Host_QS_SecMgr);
894     CHECK_CALLED(ProcessUrlAction);
895
896     IUnknown_Release(parser);
897
898     parser = create_script(FALSE, TRUE);
899     ProcessUrlAction_policy = URLPOLICY_DISALLOW;
900
901     SET_EXPECT(Host_QS_SecMgr);
902     SET_EXPECT(ProcessUrlAction);
903     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);");
904     CHECK_CALLED(Host_QS_SecMgr);
905     CHECK_CALLED(ProcessUrlAction);
906
907     IUnknown_Release(parser);
908
909     parser = create_script(FALSE, TRUE);
910     CreateInstance_hres = E_FAIL;
911
912     SET_EXPECT(Host_QS_SecMgr);
913     SET_EXPECT(ProcessUrlAction);
914     SET_EXPECT(CreateInstance);
915     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);");
916     CHECK_CALLED(Host_QS_SecMgr);
917     CHECK_CALLED(ProcessUrlAction);
918     CHECK_CALLED(CreateInstance);
919
920     IUnknown_Release(parser);
921
922     parser = create_script(FALSE, TRUE);
923     QueryCustomPolicy_hres = E_FAIL;
924
925     SET_EXPECT(Host_QS_SecMgr);
926     SET_EXPECT(ProcessUrlAction);
927     SET_EXPECT(CreateInstance);
928     SET_EXPECT(QueryCustomPolicy);
929     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);");
930     CHECK_CALLED(Host_QS_SecMgr);
931     CHECK_CALLED(ProcessUrlAction);
932     CHECK_CALLED(CreateInstance);
933     CHECK_CALLED(QueryCustomPolicy);
934
935     IUnknown_Release(parser);
936
937     parser = create_script(FALSE, TRUE);
938     QueryCustomPolicy_psize = 6;
939
940     SET_EXPECT(Host_QS_SecMgr);
941     SET_EXPECT(ProcessUrlAction);
942     SET_EXPECT(CreateInstance);
943     SET_EXPECT(QueryCustomPolicy);
944     SET_EXPECT(QI_IObjectWithSite);
945     SET_EXPECT(reportSuccess);
946     parse_script_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();");
947     CHECK_CALLED(Host_QS_SecMgr);
948     CHECK_CALLED(ProcessUrlAction);
949     CHECK_CALLED(CreateInstance);
950     CHECK_CALLED(QueryCustomPolicy);
951     CHECK_CALLED(QI_IObjectWithSite);
952     CHECK_CALLED(reportSuccess);
953
954     IUnknown_Release(parser);
955
956     parser = create_script(FALSE, TRUE);
957     QueryCustomPolicy_policy = URLPOLICY_DISALLOW;
958
959     SET_EXPECT(Host_QS_SecMgr);
960     SET_EXPECT(ProcessUrlAction);
961     SET_EXPECT(CreateInstance);
962     SET_EXPECT(QueryCustomPolicy);
963     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);");
964     CHECK_CALLED(Host_QS_SecMgr);
965     CHECK_CALLED(ProcessUrlAction);
966     CHECK_CALLED(CreateInstance);
967     CHECK_CALLED(QueryCustomPolicy);
968
969     QueryCustomPolicy_psize = 6;
970
971     SET_EXPECT(ProcessUrlAction);
972     SET_EXPECT(CreateInstance);
973     SET_EXPECT(QueryCustomPolicy);
974     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);");
975     CHECK_CALLED(ProcessUrlAction);
976     CHECK_CALLED(CreateInstance);
977     CHECK_CALLED(QueryCustomPolicy);
978
979     QueryCustomPolicy_policy = URLPOLICY_ALLOW;
980     QueryCustomPolicy_psize = 3;
981
982     SET_EXPECT(ProcessUrlAction);
983     SET_EXPECT(CreateInstance);
984     SET_EXPECT(QueryCustomPolicy);
985     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);");
986     CHECK_CALLED(ProcessUrlAction);
987     CHECK_CALLED(CreateInstance);
988     CHECK_CALLED(QueryCustomPolicy);
989
990     IUnknown_Release(parser);
991
992     parser = create_script(FALSE, FALSE);
993
994     SET_EXPECT(CreateInstance);
995     SET_EXPECT(QI_IObjectWithSite);
996     SET_EXPECT(reportSuccess);
997     parse_script_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();");
998     CHECK_CALLED(CreateInstance);
999     CHECK_CALLED(QI_IObjectWithSite);
1000     CHECK_CALLED(reportSuccess);
1001
1002     IUnknown_Release(parser);
1003
1004     parser = create_script(FALSE, TRUE);
1005     object_with_site = &ObjectWithSite;
1006
1007     SET_EXPECT(Host_QS_SecMgr);
1008     SET_EXPECT(ProcessUrlAction);
1009     SET_EXPECT(CreateInstance);
1010     SET_EXPECT(QueryCustomPolicy);
1011     SET_EXPECT(QI_IObjectWithSite);
1012     SET_EXPECT(SetSite);
1013     SET_EXPECT(reportSuccess);
1014     parse_script_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();");
1015     CHECK_CALLED(Host_QS_SecMgr);
1016     CHECK_CALLED(ProcessUrlAction);
1017     CHECK_CALLED(CreateInstance);
1018     CHECK_CALLED(QueryCustomPolicy);
1019     CHECK_CALLED(QI_IObjectWithSite);
1020     CHECK_CALLED(SetSite);
1021     CHECK_CALLED(reportSuccess);
1022
1023     SetSite_hres = E_FAIL;
1024     SET_EXPECT(ProcessUrlAction);
1025     SET_EXPECT(CreateInstance);
1026     SET_EXPECT(QueryCustomPolicy);
1027     SET_EXPECT(QI_IObjectWithSite);
1028     SET_EXPECT(SetSite);
1029     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);");
1030     CHECK_CALLED(ProcessUrlAction);
1031     CHECK_CALLED(CreateInstance);
1032     CHECK_CALLED(QueryCustomPolicy);
1033     CHECK_CALLED(QI_IObjectWithSite);
1034     CHECK_CALLED(SetSite);
1035
1036     IUnknown_Release(parser);
1037
1038     /* No IServiceProvider Interface */
1039     parser = create_script(FALSE, FALSE);
1040     object_with_site = &ObjectWithSite;
1041     AllowIServiceProvider = FALSE;
1042
1043     SET_EXPECT(CreateInstance);
1044     SET_EXPECT(QI_IObjectWithSite);
1045     SET_EXPECT(reportSuccess);
1046     SET_EXPECT(SetSite);
1047     parse_script_a(parser, "(new ActiveXObject('Wine.Test')).reportSuccess();");
1048     CHECK_CALLED(CreateInstance);
1049     CHECK_CALLED(QI_IObjectWithSite);
1050     CHECK_CALLED(reportSuccess);
1051     CHECK_CALLED(SetSite);
1052
1053     IUnknown_Release(parser);
1054
1055     parser = create_script(FALSE, TRUE);
1056     object_with_site = &ObjectWithSite;
1057     AllowIServiceProvider = FALSE;
1058
1059     parse_script_a(parser, "testException(function() { new ActiveXObject('Wine.Test'); }, 'Error', -2146827859);");
1060
1061     IUnknown_Release(parser);
1062 }
1063
1064 static BOOL init_key(const char *key_name, const char *def_value, BOOL init)
1065 {
1066     HKEY hkey;
1067     DWORD res;
1068
1069     if(!init) {
1070         RegDeleteKey(HKEY_CLASSES_ROOT, key_name);
1071         return TRUE;
1072     }
1073
1074     res = RegCreateKeyA(HKEY_CLASSES_ROOT, key_name, &hkey);
1075     if(res != ERROR_SUCCESS)
1076         return FALSE;
1077
1078     if(def_value)
1079         res = RegSetValueA(hkey, NULL, REG_SZ, def_value, strlen(def_value));
1080
1081     RegCloseKey(hkey);
1082
1083     return res == ERROR_SUCCESS;
1084 }
1085
1086 static BOOL init_registry(BOOL init)
1087 {
1088     return init_key("Wine.Test\\CLSID", TESTOBJ_CLSID, init);
1089 }
1090
1091 static BOOL register_activex(void)
1092 {
1093     DWORD regid;
1094     HRESULT hres;
1095
1096     if(!init_registry(TRUE)) {
1097         init_registry(FALSE);
1098         return FALSE;
1099     }
1100
1101     hres = CoRegisterClassObject(&CLSID_TestObj, (IUnknown *)&activex_cf,
1102                                  CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &regid);
1103     ok(hres == S_OK, "Could not register script engine: %08x\n", hres);
1104
1105     return TRUE;
1106 }
1107
1108 static BOOL check_jscript(void)
1109 {
1110     IActiveScriptProperty *script_prop;
1111     IActiveScriptParse *parser;
1112     BSTR str;
1113     HRESULT hres;
1114
1115     parser = create_script(TRUE, TRUE);
1116     if(!parser)
1117         return FALSE;
1118
1119     str = a2bstr("if(!('localeCompare' in String.prototype)) throw 1;");
1120     hres = IActiveScriptParse64_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1121     SysFreeString(str);
1122
1123     if(hres == S_OK)
1124         hres = IUnknown_QueryInterface(parser, &IID_IActiveScriptProperty, (void**)&script_prop);
1125     IUnknown_Release(parser);
1126     if(hres == S_OK)
1127         IActiveScriptProperty_Release(script_prop);
1128
1129     return hres == S_OK;
1130 }
1131
1132 START_TEST(activex)
1133 {
1134     CoInitialize(NULL);
1135
1136     if(check_jscript()) {
1137         register_activex();
1138
1139         test_ActiveXObject();
1140
1141         init_registry(FALSE);
1142     }else {
1143         win_skip("Broken engine, probably too old\n");
1144     }
1145
1146     CoUninitialize();
1147 }