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