vbscript: Added compiler support for parametrized assignment statements.
[wine] / dlls / vbscript / tests / createobj.c
1 /*
2  * Copyright 2009,2011 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 extern const CLSID CLSID_VBScript;
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 SET_CALLED(func) \
42     called_ ## func = TRUE
43
44 #define CHECK_EXPECT2(func) \
45     do { \
46         ok(expect_ ##func, "unexpected call " #func "\n"); \
47         called_ ## func = TRUE; \
48     }while(0)
49
50 #define CHECK_EXPECT(func) \
51     do { \
52         CHECK_EXPECT2(func); \
53         expect_ ## func = FALSE; \
54     }while(0)
55
56 #define CHECK_CALLED(func) \
57     do { \
58         ok(called_ ## func, "expected " #func "\n"); \
59         expect_ ## func = called_ ## func = FALSE; \
60     }while(0)
61
62 DEFINE_EXPECT(CreateInstance);
63 DEFINE_EXPECT(ProcessUrlAction);
64 DEFINE_EXPECT(QueryCustomPolicy);
65 DEFINE_EXPECT(reportSuccess);
66 DEFINE_EXPECT(Host_QS_SecMgr);
67 DEFINE_EXPECT(Caller_QS_SecMgr);
68 DEFINE_EXPECT(QI_IObjectWithSite);
69 DEFINE_EXPECT(SetSite);
70
71 static const WCHAR testW[] = {'t','e','s','t',0};
72
73 static HRESULT QS_SecMgr_hres;
74 static HRESULT ProcessUrlAction_hres;
75 static DWORD ProcessUrlAction_policy;
76 static HRESULT CreateInstance_hres;
77 static HRESULT QueryCustomPolicy_hres;
78 static DWORD QueryCustomPolicy_psize;
79 static DWORD QueryCustomPolicy_policy;
80 static HRESULT QI_IDispatch_hres;
81 static HRESULT SetSite_hres;
82
83 #define TESTOBJ_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80646}"
84
85 static const GUID CLSID_TestObj =
86     {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x06,0x46}};
87
88 /* Defined as extern in urlmon.idl, but not exported by uuid.lib */
89 const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
90     {0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
91
92 #define DISPID_TEST_REPORTSUCCESS    0x1000
93
94 #define DISPID_GLOBAL_OK             0x2000
95
96 #define VB_E_CANNOT_CREATE_OBJ 0x800a01ad
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 == fdexNameCaseInsensitive, "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
572 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
573 {
574     if(IsEqualGUID(&IID_IUnknown, riid)) {
575         *ppv = iface;
576     }else if(IsEqualGUID(&IID_IActiveScriptSite, riid)) {
577         *ppv = iface;
578     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
579         *ppv = &ServiceProvider;
580     }else {
581         *ppv = NULL;
582         return E_NOINTERFACE;
583     }
584
585     IUnknown_AddRef((IUnknown*)*ppv);
586     return S_OK;
587 }
588
589 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
590 {
591     return 2;
592 }
593
594 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
595 {
596     return 1;
597 }
598
599 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
600 {
601     *plcid = GetUserDefaultLCID();
602     return S_OK;
603 }
604
605 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
606         DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
607 {
608     ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
609     ok(!ppti, "ppti != NULL\n");
610     ok(!strcmp_wa(pstrName, "test"), "pstrName = %s\n", wine_dbgstr_w(pstrName));
611
612     *ppiunkItem = (IUnknown*)&globalObj;
613     return S_OK;
614 }
615
616 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
617 {
618     return E_NOTIMPL;
619 }
620
621 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
622         const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
623 {
624     return E_NOTIMPL;
625 }
626
627 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
628 {
629     return E_NOTIMPL;
630 }
631
632 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
633 {
634     return E_NOTIMPL;
635 }
636
637 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
638 {
639     return E_NOTIMPL;
640 }
641
642 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
643 {
644     return E_NOTIMPL;
645 }
646
647 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
648     ActiveScriptSite_QueryInterface,
649     ActiveScriptSite_AddRef,
650     ActiveScriptSite_Release,
651     ActiveScriptSite_GetLCID,
652     ActiveScriptSite_GetItemInfo,
653     ActiveScriptSite_GetDocVersionString,
654     ActiveScriptSite_OnScriptTerminate,
655     ActiveScriptSite_OnStateChange,
656     ActiveScriptSite_OnScriptError,
657     ActiveScriptSite_OnEnterScript,
658     ActiveScriptSite_OnLeaveScript
659 };
660
661 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
662
663 static void set_safety_options(IUnknown *unk, BOOL use_sec_mgr)
664 {
665     IObjectSafety *safety;
666     DWORD supported, enabled, options_all, options_set;
667     HRESULT hres;
668
669     hres = IUnknown_QueryInterface(unk, &IID_IObjectSafety, (void**)&safety);
670     ok(hres == S_OK, "Could not get IObjectSafety: %08x\n", hres);
671     if(FAILED(hres))
672         return;
673
674     options_all = INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER;
675     if(use_sec_mgr)
676         options_set = options_all;
677     else
678         options_set = INTERFACE_USES_DISPEX;
679
680     hres = IObjectSafety_SetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, options_all, options_set);
681     ok(hres == S_OK, "SetInterfaceSafetyOptions failed: %08x\n", hres);
682
683     supported = enabled = 0xdeadbeef;
684     hres = IObjectSafety_GetInterfaceSafetyOptions(safety, &IID_IActiveScriptParse, &supported, &enabled);
685     ok(hres == S_OK, "GetInterfaceSafetyOptions failed: %08x\n", hres);
686     ok(supported == options_all, "supported=%x, expected %x\n", supported, options_all);
687     ok(enabled == options_set, "enabled=%x, expected %x\n", enabled, options_set);
688
689     IObjectSafety_Release(safety);
690 }
691
692 #define parse_script_a(p,s) _parse_script_a(__LINE__,p,s)
693 static void _parse_script_a(unsigned line, IActiveScriptParse *parser, const char *script)
694 {
695     BSTR str;
696     HRESULT hres;
697
698     str = a2bstr(script);
699     hres = IActiveScriptParse64_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
700     SysFreeString(str);
701     ok_(__FILE__,line)(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
702 }
703
704 static HRESULT parse_script_ae(IActiveScriptParse *parser, const char *script)
705 {
706     BSTR str;
707     HRESULT hres;
708
709     str = a2bstr(script);
710     hres = IActiveScriptParse64_ParseScriptText(parser, str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
711     SysFreeString(str);
712
713     return hres;
714 }
715
716 static IActiveScriptParse *create_script(BOOL use_sec_mgr)
717 {
718     IActiveScriptParse *parser;
719     IActiveScript *script;
720     HRESULT hres;
721
722     QS_SecMgr_hres = S_OK;
723     ProcessUrlAction_hres = S_OK;
724     ProcessUrlAction_policy = URLPOLICY_ALLOW;
725     CreateInstance_hres = S_OK;
726     QueryCustomPolicy_hres = S_OK;
727     QueryCustomPolicy_psize = sizeof(DWORD);
728     QueryCustomPolicy_policy = URLPOLICY_ALLOW;
729     QI_IDispatch_hres = S_OK;
730     SetSite_hres = S_OK;
731
732     hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
733             &IID_IActiveScript, (void**)&script);
734     ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
735     if(FAILED(hres))
736         return NULL;
737
738     set_safety_options((IUnknown*)script, use_sec_mgr);
739
740     hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser);
741     ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
742
743     hres = IActiveScriptParse64_InitNew(parser);
744     ok(hres == S_OK, "InitNew failed: %08x\n", hres);
745
746     hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
747     ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
748
749     hres = IActiveScript_AddNamedItem(script, testW,
750             SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
751     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
752
753     hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED);
754     ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
755
756     IActiveScript_Release(script);
757
758     return parser;
759 }
760
761 static void test_CreateObject(void)
762 {
763     IActiveScriptParse *parser;
764     HRESULT hres;
765
766     parser = create_script(TRUE);
767
768     SET_EXPECT(Host_QS_SecMgr);
769     SET_EXPECT(ProcessUrlAction);
770     SET_EXPECT(CreateInstance);
771     SET_EXPECT(QueryCustomPolicy);
772     SET_EXPECT(QI_IObjectWithSite);
773     SET_EXPECT(reportSuccess);
774     parse_script_a(parser, "Call CreateObject(\"Wine.Test\").reportSuccess()");
775     CHECK_CALLED(Host_QS_SecMgr);
776     CHECK_CALLED(ProcessUrlAction);
777     CHECK_CALLED(CreateInstance);
778     CHECK_CALLED(QueryCustomPolicy);
779     CHECK_CALLED(QI_IObjectWithSite);
780     CHECK_CALLED(reportSuccess);
781
782     IUnknown_Release(parser);
783
784     parser = create_script(TRUE);
785
786     hres = parse_script_ae(parser, "Call CreateObject(\"Wine.TestABC\")");
787     ok(hres == VB_E_CANNOT_CREATE_OBJ, "hres = %08x\n", hres);
788
789     IUnknown_Release(parser);
790
791     parser = create_script(TRUE);
792     QS_SecMgr_hres = E_NOINTERFACE;
793
794     SET_EXPECT(Host_QS_SecMgr);
795     hres = parse_script_ae(parser, "Call CreateObject(\"Wine.Test\")");
796     ok(hres == VB_E_CANNOT_CREATE_OBJ, "hres = %08x\n", hres);
797     CHECK_CALLED(Host_QS_SecMgr);
798
799     IUnknown_Release(parser);
800
801     parser = create_script(TRUE);
802     ProcessUrlAction_hres = E_FAIL;
803
804     SET_EXPECT(Host_QS_SecMgr);
805     SET_EXPECT(ProcessUrlAction);
806     hres = parse_script_ae(parser, "Call CreateObject(\"Wine.Test\")");
807     ok(hres == VB_E_CANNOT_CREATE_OBJ, "hres = %08x\n", hres);
808     CHECK_CALLED(Host_QS_SecMgr);
809     CHECK_CALLED(ProcessUrlAction);
810
811     IUnknown_Release(parser);
812
813     parser = create_script(TRUE);
814     ProcessUrlAction_policy = URLPOLICY_DISALLOW;
815
816     SET_EXPECT(Host_QS_SecMgr);
817     SET_EXPECT(ProcessUrlAction);
818     hres = parse_script_ae(parser, "Call CreateObject(\"Wine.Test\")");
819     ok(hres == VB_E_CANNOT_CREATE_OBJ, "hres = %08x\n", hres);
820     CHECK_CALLED(Host_QS_SecMgr);
821     CHECK_CALLED(ProcessUrlAction);
822
823     IUnknown_Release(parser);
824
825     parser = create_script(TRUE);
826     CreateInstance_hres = E_FAIL;
827
828     SET_EXPECT(Host_QS_SecMgr);
829     SET_EXPECT(ProcessUrlAction);
830     SET_EXPECT(CreateInstance);
831     hres = parse_script_ae(parser, "Call CreateObject(\"Wine.Test\")");
832     ok(hres == VB_E_CANNOT_CREATE_OBJ, "hres = %08x\n", hres);
833     CHECK_CALLED(Host_QS_SecMgr);
834     CHECK_CALLED(ProcessUrlAction);
835     CHECK_CALLED(CreateInstance);
836
837     IUnknown_Release(parser);
838
839     parser = create_script(TRUE);
840     QueryCustomPolicy_hres = E_FAIL;
841
842     SET_EXPECT(Host_QS_SecMgr);
843     SET_EXPECT(ProcessUrlAction);
844     SET_EXPECT(CreateInstance);
845     SET_EXPECT(QueryCustomPolicy);
846     hres = parse_script_ae(parser, "Call CreateObject(\"Wine.Test\")");
847     ok(hres == VB_E_CANNOT_CREATE_OBJ, "hres = %08x\n", hres);
848     CHECK_CALLED(Host_QS_SecMgr);
849     CHECK_CALLED(ProcessUrlAction);
850     CHECK_CALLED(CreateInstance);
851     CHECK_CALLED(QueryCustomPolicy);
852
853     IUnknown_Release(parser);
854
855     parser = create_script(TRUE);
856     QueryCustomPolicy_psize = 6;
857
858     SET_EXPECT(Host_QS_SecMgr);
859     SET_EXPECT(ProcessUrlAction);
860     SET_EXPECT(CreateInstance);
861     SET_EXPECT(QueryCustomPolicy);
862     SET_EXPECT(QI_IObjectWithSite);
863     SET_EXPECT(reportSuccess);
864     parse_script_a(parser, "Call CreateObject(\"Wine.Test\").reportSuccess()");
865     CHECK_CALLED(Host_QS_SecMgr);
866     CHECK_CALLED(ProcessUrlAction);
867     CHECK_CALLED(CreateInstance);
868     CHECK_CALLED(QueryCustomPolicy);
869     CHECK_CALLED(QI_IObjectWithSite);
870     CHECK_CALLED(reportSuccess);
871
872     IUnknown_Release(parser);
873
874     parser = create_script(TRUE);
875     QueryCustomPolicy_policy = URLPOLICY_DISALLOW;
876
877     SET_EXPECT(Host_QS_SecMgr);
878     SET_EXPECT(ProcessUrlAction);
879     SET_EXPECT(CreateInstance);
880     SET_EXPECT(QueryCustomPolicy);
881     hres = parse_script_ae(parser, "Call CreateObject(\"Wine.Test\")");
882     ok(hres == VB_E_CANNOT_CREATE_OBJ, "hres = %08x\n", hres);
883     CHECK_CALLED(Host_QS_SecMgr);
884     CHECK_CALLED(ProcessUrlAction);
885     CHECK_CALLED(CreateInstance);
886     CHECK_CALLED(QueryCustomPolicy);
887
888     QueryCustomPolicy_psize = 6;
889
890     SET_EXPECT(ProcessUrlAction);
891     SET_EXPECT(CreateInstance);
892     SET_EXPECT(QueryCustomPolicy);
893     hres = parse_script_ae(parser, "Call CreateObject(\"Wine.Test\")");
894     ok(hres == VB_E_CANNOT_CREATE_OBJ, "hres = %08x\n", hres);
895     CHECK_CALLED(ProcessUrlAction);
896     CHECK_CALLED(CreateInstance);
897     CHECK_CALLED(QueryCustomPolicy);
898
899     QueryCustomPolicy_policy = URLPOLICY_ALLOW;
900     QueryCustomPolicy_psize = 3;
901
902     SET_EXPECT(ProcessUrlAction);
903     SET_EXPECT(CreateInstance);
904     SET_EXPECT(QueryCustomPolicy);
905     hres = parse_script_ae(parser, "Call CreateObject(\"Wine.Test\")");
906     ok(hres == VB_E_CANNOT_CREATE_OBJ, "hres = %08x\n", hres);
907     CHECK_CALLED(ProcessUrlAction);
908     CHECK_CALLED(CreateInstance);
909     CHECK_CALLED(QueryCustomPolicy);
910
911     IUnknown_Release(parser);
912
913     parser = create_script(FALSE);
914
915     SET_EXPECT(CreateInstance);
916     SET_EXPECT(QI_IObjectWithSite);
917     SET_EXPECT(reportSuccess);
918     parse_script_a(parser, "Call CreateObject(\"Wine.Test\").reportSuccess()");
919     CHECK_CALLED(CreateInstance);
920     CHECK_CALLED(QI_IObjectWithSite);
921     CHECK_CALLED(reportSuccess);
922
923     IUnknown_Release(parser);
924
925     parser = create_script(TRUE);
926     object_with_site = &ObjectWithSite;
927
928     SET_EXPECT(Host_QS_SecMgr);
929     SET_EXPECT(ProcessUrlAction);
930     SET_EXPECT(CreateInstance);
931     SET_EXPECT(QueryCustomPolicy);
932     SET_EXPECT(QI_IObjectWithSite);
933     SET_EXPECT(SetSite);
934     SET_EXPECT(reportSuccess);
935     parse_script_a(parser, "Call CreateObject(\"Wine.Test\").reportSuccess()");
936     CHECK_CALLED(Host_QS_SecMgr);
937     CHECK_CALLED(ProcessUrlAction);
938     CHECK_CALLED(CreateInstance);
939     CHECK_CALLED(QueryCustomPolicy);
940     CHECK_CALLED(QI_IObjectWithSite);
941     CHECK_CALLED(SetSite);
942     CHECK_CALLED(reportSuccess);
943
944     SetSite_hres = E_FAIL;
945     SET_EXPECT(ProcessUrlAction);
946     SET_EXPECT(CreateInstance);
947     SET_EXPECT(QueryCustomPolicy);
948     SET_EXPECT(QI_IObjectWithSite);
949     SET_EXPECT(SetSite);
950     hres = parse_script_ae(parser, "Call CreateObject(\"Wine.Test\")");
951     ok(hres == VB_E_CANNOT_CREATE_OBJ, "hres = %08x\n", hres);
952     CHECK_CALLED(ProcessUrlAction);
953     CHECK_CALLED(CreateInstance);
954     CHECK_CALLED(QueryCustomPolicy);
955     CHECK_CALLED(QI_IObjectWithSite);
956     CHECK_CALLED(SetSite);
957
958     IUnknown_Release(parser);
959 }
960
961 static BOOL init_key(const char *key_name, const char *def_value, BOOL init)
962 {
963     HKEY hkey;
964     DWORD res;
965
966     if(!init) {
967         RegDeleteKey(HKEY_CLASSES_ROOT, key_name);
968         return TRUE;
969     }
970
971     res = RegCreateKeyA(HKEY_CLASSES_ROOT, key_name, &hkey);
972     if(res != ERROR_SUCCESS)
973         return FALSE;
974
975     if(def_value)
976         res = RegSetValueA(hkey, NULL, REG_SZ, def_value, strlen(def_value));
977
978     RegCloseKey(hkey);
979
980     return res == ERROR_SUCCESS;
981 }
982
983 static BOOL init_registry(BOOL init)
984 {
985     return init_key("Wine.Test\\CLSID", TESTOBJ_CLSID, init);
986 }
987
988 static BOOL register_activex(void)
989 {
990     DWORD regid;
991     HRESULT hres;
992
993     if(!init_registry(TRUE)) {
994         init_registry(FALSE);
995         return FALSE;
996     }
997
998     hres = CoRegisterClassObject(&CLSID_TestObj, (IUnknown *)&activex_cf,
999                                  CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &regid);
1000     ok(hres == S_OK, "Could not register script engine: %08x\n", hres);
1001
1002     return TRUE;
1003 }
1004
1005 START_TEST(createobj)
1006 {
1007     CoInitialize(NULL);
1008
1009     register_activex();
1010
1011     test_CreateObject();
1012
1013     init_registry(FALSE);
1014
1015     CoUninitialize();
1016 }