msscript: Implement IScriptControl_[get|put]_UseSafeSubset.
[wine.git] / dlls / msscript.ocx / tests / msscript.c
blobf6630c3d21b87c48f01e4e88d43225fa24bf2a0b
1 /*
2 * Copyright 2016 Nikolay Sivov for CodeWeavers
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.
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.
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
19 #define COBJMACROS
20 #define CONST_VTABLE
22 #include <initguid.h>
23 #include <ole2.h>
24 #include <olectl.h>
25 #include "dispex.h"
26 #include "activscp.h"
27 #include "activdbg.h"
28 #include "objsafe.h"
30 #include "msscript.h"
31 #include "wine/test.h"
33 #define TESTSCRIPT_CLSID "{178fc164-f585-4e24-9c13-4bb7faf80746}"
34 static const GUID CLSID_TestScript =
35 {0x178fc164,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x07,0x46}};
36 static const WCHAR vbW[] = {'V','B','S','c','r','i','p','t',0};
38 #ifdef _WIN64
40 #define CTXARG_T DWORDLONG
41 #define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
42 #define IActiveScriptSiteDebug_Release IActiveScriptSiteDebug64_Release
44 #else
46 #define CTXARG_T DWORD
47 #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
48 #define IActiveScriptSiteDebug_Release IActiveScriptSiteDebug32_Release
50 #endif
52 #define DEFINE_EXPECT(func) \
53 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
55 #define SET_EXPECT(func) \
56 do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
58 #define CHECK_EXPECT2(func) \
59 do { \
60 ok(expect_ ##func, "unexpected call " #func "\n"); \
61 called_ ## func = TRUE; \
62 }while(0)
64 #define CHECK_EXPECT(func) \
65 do { \
66 CHECK_EXPECT2(func); \
67 expect_ ## func = FALSE; \
68 }while(0)
70 #define CHECK_CALLED(func) \
71 do { \
72 ok(called_ ## func, "expected " #func "\n"); \
73 expect_ ## func = called_ ## func = FALSE; \
74 }while(0)
76 #define CHECK_CALLED_BROKEN(func) \
77 do { \
78 ok(called_ ## func || broken(!called_ ## func), "expected " #func "\n"); \
79 expect_ ## func = called_ ## func = FALSE; \
80 }while(0)
82 #define CHECK_NOT_CALLED(func) \
83 do { \
84 ok(!called_ ## func, "unexpected " #func "\n"); \
85 expect_ ## func = called_ ## func = FALSE; \
86 }while(0)
88 #define CLEAR_CALLED(func) \
89 expect_ ## func = called_ ## func = FALSE
91 DEFINE_EXPECT(CreateInstance);
92 DEFINE_EXPECT(SetInterfaceSafetyOptions);
93 DEFINE_EXPECT(InitNew);
94 DEFINE_EXPECT(Close);
95 DEFINE_EXPECT(SetScriptSite);
96 DEFINE_EXPECT(QI_IActiveScriptParse);
97 DEFINE_EXPECT(SetScriptState_INITIALIZED);
98 DEFINE_EXPECT(AddNamedItem);
100 #define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
101 static void _expect_ref(IUnknown* obj, ULONG ref, int line)
103 ULONG rc;
104 IUnknown_AddRef(obj);
105 rc = IUnknown_Release(obj);
106 ok_(__FILE__,line)(rc == ref, "expected refcount %d, got %d\n", ref, rc);
109 static IActiveScriptSite *site;
110 static SCRIPTSTATE state;
112 static HRESULT WINAPI ActiveScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
114 *ppv = NULL;
115 ok(0, "unexpected call\n");
116 return E_NOINTERFACE;
119 static ULONG WINAPI ActiveScriptParse_AddRef(IActiveScriptParse *iface)
121 return 2;
124 static ULONG WINAPI ActiveScriptParse_Release(IActiveScriptParse *iface)
126 return 1;
129 static HRESULT WINAPI ActiveScriptParse_InitNew(IActiveScriptParse *iface)
131 CHECK_EXPECT(InitNew);
132 return S_OK;
135 static HRESULT WINAPI ActiveScriptParse_AddScriptlet(IActiveScriptParse *iface,
136 LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
137 LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
138 CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
139 BSTR *pbstrName, EXCEPINFO *pexcepinfo)
141 ok(0, "unexpected call\n");
142 return E_NOTIMPL;
145 static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *iface,
146 LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
147 LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine,
148 DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
150 ok(0, "unexpected call\n");
151 return E_NOTIMPL;
154 static const IActiveScriptParseVtbl ActiveScriptParseVtbl = {
155 ActiveScriptParse_QueryInterface,
156 ActiveScriptParse_AddRef,
157 ActiveScriptParse_Release,
158 ActiveScriptParse_InitNew,
159 ActiveScriptParse_AddScriptlet,
160 ActiveScriptParse_ParseScriptText
163 static IActiveScriptParse ActiveScriptParse = { &ActiveScriptParseVtbl };
165 static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
167 *ppv = NULL;
168 ok(0, "unexpected call %s\n", wine_dbgstr_guid(riid));
169 return E_NOINTERFACE;
172 static ULONG WINAPI ObjectSafety_AddRef(IObjectSafety *iface)
174 return 2;
177 static ULONG WINAPI ObjectSafety_Release(IObjectSafety *iface)
179 return 1;
182 static HRESULT WINAPI ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
183 DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
185 ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid));
186 return E_NOTIMPL;
189 static HRESULT WINAPI ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
190 DWORD mask, DWORD options)
192 CHECK_EXPECT(SetInterfaceSafetyOptions);
194 ok(IsEqualGUID(&IID_IActiveScriptParse, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid));
196 ok(mask == INTERFACESAFE_FOR_UNTRUSTED_DATA, "option mask = %x\n", mask);
197 ok(options == 0, "options = %x\n", options);
199 return S_OK;
202 static const IObjectSafetyVtbl ObjectSafetyVtbl = {
203 ObjectSafety_QueryInterface,
204 ObjectSafety_AddRef,
205 ObjectSafety_Release,
206 ObjectSafety_GetInterfaceSafetyOptions,
207 ObjectSafety_SetInterfaceSafetyOptions
210 static IObjectSafety ObjectSafety = { &ObjectSafetyVtbl };
212 static HRESULT WINAPI ActiveScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
214 *ppv = NULL;
216 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IActiveScript, riid)) {
217 *ppv = iface;
218 return S_OK;
221 if(IsEqualGUID(&IID_IObjectSafety, riid)) {
222 *ppv = &ObjectSafety;
223 return S_OK;
226 if(IsEqualGUID(&IID_IActiveScriptParse, riid)) {
227 CHECK_EXPECT(QI_IActiveScriptParse);
228 *ppv = &ActiveScriptParse;
229 return S_OK;
232 if(IsEqualGUID(&IID_IActiveScriptGarbageCollector, riid))
233 return E_NOINTERFACE;
235 ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid));
236 return E_NOINTERFACE;
239 static ULONG WINAPI ActiveScript_AddRef(IActiveScript *iface)
241 return 2;
244 static ULONG WINAPI ActiveScript_Release(IActiveScript *iface)
246 return 1;
249 static HRESULT WINAPI ActiveScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass)
251 IActiveScriptSiteInterruptPoll *poll;
252 IActiveScriptSiteWindow *window;
253 IActiveScriptSiteDebug *debug;
254 IServiceProvider *service;
255 ICanHandleException *canexpection;
256 LCID lcid;
257 HRESULT hres;
259 CHECK_EXPECT(SetScriptSite);
261 ok(pass != NULL, "pass == NULL\n");
263 hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteInterruptPoll, (void**)&poll);
264 ok(hres == E_NOINTERFACE, "Got IActiveScriptSiteInterruptPoll interface: %08x\n", hres);
266 hres = IActiveScriptSite_GetLCID(pass, &lcid);
267 ok(hres == S_OK, "GetLCID failed: %08x\n", hres);
269 hres = IActiveScriptSite_OnStateChange(pass, (state = SCRIPTSTATE_INITIALIZED));
270 ok(hres == E_NOTIMPL, "OnStateChange failed: %08x\n", hres);
272 hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteDebug, (void**)&debug);
273 ok(hres == E_NOINTERFACE, "Got IActiveScriptSiteDebug interface: %08x\n", hres);
275 hres = IActiveScriptSite_QueryInterface(pass, &IID_ICanHandleException, (void**)&canexpection);
276 ok(hres == E_NOINTERFACE, "Got IID_ICanHandleException interface: %08x\n", hres);
278 hres = IActiveScriptSite_QueryInterface(pass, &IID_IServiceProvider, (void**)&service);
279 ok(hres == S_OK, "Could not get IServiceProvider interface: %08x\n", hres);
280 IServiceProvider_Release(service);
282 hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteWindow, (void**)&window);
283 ok(hres == S_OK, "Could not get IActiveScriptSiteWindow interface: %08x\n", hres);
284 IActiveScriptSiteWindow_Release(window);
286 site = pass;
287 IActiveScriptSite_AddRef(site);
288 return S_OK;
291 static HRESULT WINAPI ActiveScript_GetScriptSite(IActiveScript *iface, REFIID riid,
292 void **ppvObject)
294 ok(0, "unexpected call\n");
295 return E_NOTIMPL;
298 static HRESULT WINAPI ActiveScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
300 if (ss == SCRIPTSTATE_INITIALIZED) {
301 CHECK_EXPECT(SetScriptState_INITIALIZED);
302 return S_OK;
304 else
305 ok(0, "unexpected call, state %u\n", ss);
307 return E_NOTIMPL;
310 static HRESULT WINAPI ActiveScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
312 ok(0, "unexpected call\n");
313 return E_NOTIMPL;
316 static HRESULT WINAPI ActiveScript_Close(IActiveScript *iface)
318 CHECK_EXPECT(Close);
319 return E_NOTIMPL;
322 static HRESULT WINAPI ActiveScript_AddNamedItem(IActiveScript *iface, LPCOLESTR name, DWORD flags)
324 static const WCHAR oW[] = {'o',0};
325 CHECK_EXPECT(AddNamedItem);
326 ok(!lstrcmpW(name, oW), "got name %s\n", wine_dbgstr_w(name));
327 ok(flags == (SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS), "got flags %#x\n", flags);
328 return S_OK;
331 static HRESULT WINAPI ActiveScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib,
332 DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
334 ok(0, "unexpected call\n");
335 return E_NOTIMPL;
338 static HRESULT WINAPI ActiveScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName,
339 IDispatch **ppdisp)
341 ok(0, "unexpected call\n");
342 return E_NOTIMPL;
345 static HRESULT WINAPI ActiveScript_GetCurrentScriptThreadID(IActiveScript *iface,
346 SCRIPTTHREADID *pstridThread)
348 ok(0, "unexpected call\n");
349 return E_NOTIMPL;
352 static HRESULT WINAPI ActiveScript_GetScriptThreadID(IActiveScript *iface,
353 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
355 ok(0, "unexpected call\n");
356 return E_NOTIMPL;
359 static HRESULT WINAPI ActiveScript_GetScriptThreadState(IActiveScript *iface,
360 SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
362 ok(0, "unexpected call\n");
363 return E_NOTIMPL;
366 static HRESULT WINAPI ActiveScript_InterruptScriptThread(IActiveScript *iface,
367 SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
369 ok(0, "unexpected call\n");
370 return E_NOTIMPL;
373 static HRESULT WINAPI ActiveScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
375 ok(0, "unexpected call\n");
376 return E_NOTIMPL;
379 static const IActiveScriptVtbl ActiveScriptVtbl = {
380 ActiveScript_QueryInterface,
381 ActiveScript_AddRef,
382 ActiveScript_Release,
383 ActiveScript_SetScriptSite,
384 ActiveScript_GetScriptSite,
385 ActiveScript_SetScriptState,
386 ActiveScript_GetScriptState,
387 ActiveScript_Close,
388 ActiveScript_AddNamedItem,
389 ActiveScript_AddTypeLib,
390 ActiveScript_GetScriptDispatch,
391 ActiveScript_GetCurrentScriptThreadID,
392 ActiveScript_GetScriptThreadID,
393 ActiveScript_GetScriptThreadState,
394 ActiveScript_InterruptScriptThread,
395 ActiveScript_Clone
398 static IActiveScript ActiveScript = { &ActiveScriptVtbl };
400 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
402 *ppv = NULL;
404 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IClassFactory, riid)) {
405 *ppv = iface;
406 return S_OK;
409 if(IsEqualGUID(&IID_IMarshal, riid))
410 return E_NOINTERFACE;
412 ok(0, "unexpected riid %s\n", wine_dbgstr_guid(riid));
413 return E_NOINTERFACE;
416 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
418 return 2;
421 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
423 return 1;
426 static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
428 CHECK_EXPECT(CreateInstance);
430 ok(!outer, "outer = %p\n", outer);
431 ok(IsEqualGUID(&IID_IActiveScript, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid));
432 *ppv = &ActiveScript;
433 return S_OK;
436 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock)
438 ok(0, "unexpected call\n");
439 return S_OK;
442 static const IClassFactoryVtbl ClassFactoryVtbl = {
443 ClassFactory_QueryInterface,
444 ClassFactory_AddRef,
445 ClassFactory_Release,
446 ClassFactory_CreateInstance,
447 ClassFactory_LockServer
450 static IClassFactory script_cf = { &ClassFactoryVtbl };
452 static BOOL init_key(const char *key_name, const char *def_value, BOOL init)
454 HKEY hkey;
455 DWORD res;
457 if(!init) {
458 RegDeleteKeyA(HKEY_CLASSES_ROOT, key_name);
459 return TRUE;
462 res = RegCreateKeyA(HKEY_CLASSES_ROOT, key_name, &hkey);
463 if(res != ERROR_SUCCESS)
464 return FALSE;
466 if(def_value)
467 res = RegSetValueA(hkey, NULL, REG_SZ, def_value, strlen(def_value));
469 RegCloseKey(hkey);
471 return res == ERROR_SUCCESS;
474 static BOOL init_registry(BOOL init)
476 return init_key("TestScript\\CLSID", TESTSCRIPT_CLSID, init)
477 && init_key("CLSID\\"TESTSCRIPT_CLSID"\\Implemented Categories\\{F0B7A1A1-9847-11CF-8F20-00805F2CD064}",
478 NULL, init)
479 && init_key("CLSID\\"TESTSCRIPT_CLSID"\\Implemented Categories\\{F0B7A1A2-9847-11CF-8F20-00805F2CD064}",
480 NULL, init);
483 static BOOL register_script_engine(void)
485 DWORD regid;
486 HRESULT hres;
488 if(!init_registry(TRUE)) {
489 init_registry(FALSE);
490 return FALSE;
493 hres = CoRegisterClassObject(&CLSID_TestScript, (IUnknown *)&script_cf,
494 CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &regid);
495 ok(hres == S_OK, "Could not register script engine: %08x\n", hres);
497 return TRUE;
500 static HRESULT WINAPI OleClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **obj)
502 if (IsEqualIID(riid, &IID_IOleClientSite) || IsEqualIID(riid, &IID_IUnknown))
504 *obj = iface;
505 IOleClientSite_AddRef(iface);
506 return S_OK;
509 *obj = NULL;
510 return E_NOINTERFACE;
513 static ULONG WINAPI OleClientSite_AddRef(IOleClientSite *iface)
515 return 2;
518 static ULONG WINAPI OleClientSite_Release(IOleClientSite *iface)
520 return 1;
523 static HRESULT WINAPI OleClientSite_SaveObject(IOleClientSite *iface)
525 return E_NOTIMPL;
528 static HRESULT WINAPI OleClientSite_GetMoniker(IOleClientSite *iface, DWORD assign,
529 DWORD which, IMoniker **moniker)
531 return E_NOTIMPL;
534 static HRESULT WINAPI OleClientSite_GetContainer(IOleClientSite *iface, IOleContainer **container)
536 return E_NOTIMPL;
539 static HRESULT WINAPI OleClientSite_ShowObject(IOleClientSite *iface)
541 return E_NOTIMPL;
544 static HRESULT WINAPI OleClientSite_OnShowWindow(IOleClientSite *iface, BOOL show)
546 return E_NOTIMPL;
549 static HRESULT WINAPI OleClientSite_RequestNewObjectLayout(IOleClientSite *iface)
551 return E_NOTIMPL;
554 static const IOleClientSiteVtbl OleClientSiteVtbl = {
555 OleClientSite_QueryInterface,
556 OleClientSite_AddRef,
557 OleClientSite_Release,
558 OleClientSite_SaveObject,
559 OleClientSite_GetMoniker,
560 OleClientSite_GetContainer,
561 OleClientSite_ShowObject,
562 OleClientSite_OnShowWindow,
563 OleClientSite_RequestNewObjectLayout
566 static IOleClientSite testclientsite = { &OleClientSiteVtbl };
568 static void test_oleobject(void)
570 DWORD status, dpi_x, dpi_y;
571 IOleClientSite *site;
572 IOleObject *obj;
573 SIZEL extent;
574 HRESULT hr;
575 HDC hdc;
577 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
578 &IID_IOleObject, (void**)&obj);
579 ok(hr == S_OK, "got 0x%08x\n", hr);
581 if (0) /* crashes on w2k3 */
582 hr = IOleObject_GetMiscStatus(obj, DVASPECT_CONTENT, NULL);
584 status = 0;
585 hr = IOleObject_GetMiscStatus(obj, DVASPECT_CONTENT, &status);
586 ok(hr == S_OK, "got 0x%08x\n", hr);
587 ok(status != 0, "got 0x%08x\n", status);
589 hr = IOleObject_SetClientSite(obj, &testclientsite);
590 ok(hr == S_OK, "got 0x%08x\n", hr);
592 if (0) /* crashes on w2k3 */
593 hr = IOleObject_GetClientSite(obj, NULL);
595 hr = IOleObject_GetClientSite(obj, &site);
596 ok(hr == S_OK, "got 0x%08x\n", hr);
597 ok(site == &testclientsite, "got %p, %p\n", site, &testclientsite);
598 IOleClientSite_Release(site);
600 hr = IOleObject_SetClientSite(obj, NULL);
601 ok(hr == S_OK, "got 0x%08x\n", hr);
603 hr = IOleObject_GetClientSite(obj, &site);
604 ok(hr == S_OK, "got 0x%08x\n", hr);
605 ok(site == NULL, "got %p\n", site);
607 /* extents */
608 hdc = GetDC(0);
609 dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
610 dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
611 ReleaseDC(0, hdc);
613 memset(&extent, 0, sizeof(extent));
614 hr = IOleObject_GetExtent(obj, DVASPECT_CONTENT, &extent);
615 ok(hr == S_OK, "got 0x%08x\n", hr);
616 ok(extent.cx == MulDiv(38, 2540, dpi_x), "got %d\n", extent.cx);
617 ok(extent.cy == MulDiv(38, 2540, dpi_y), "got %d\n", extent.cy);
619 extent.cx = extent.cy = 0xdeadbeef;
620 hr = IOleObject_GetExtent(obj, DVASPECT_THUMBNAIL, &extent);
621 ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr);
622 ok(extent.cx == 0xdeadbeef, "got %d\n", extent.cx);
623 ok(extent.cy == 0xdeadbeef, "got %d\n", extent.cy);
625 extent.cx = extent.cy = 0xdeadbeef;
626 hr = IOleObject_GetExtent(obj, DVASPECT_ICON, &extent);
627 ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr);
628 ok(extent.cx == 0xdeadbeef, "got %d\n", extent.cx);
629 ok(extent.cy == 0xdeadbeef, "got %d\n", extent.cy);
631 extent.cx = extent.cy = 0xdeadbeef;
632 hr = IOleObject_GetExtent(obj, DVASPECT_DOCPRINT, &extent);
633 ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr);
634 ok(extent.cx == 0xdeadbeef, "got %d\n", extent.cx);
635 ok(extent.cy == 0xdeadbeef, "got %d\n", extent.cy);
637 IOleObject_Release(obj);
640 static void test_persiststreaminit(void)
642 IPersistStreamInit *init;
643 HRESULT hr;
645 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
646 &IID_IPersistStreamInit, (void**)&init);
647 ok(hr == S_OK, "got 0x%08x\n", hr);
649 IPersistStreamInit_Release(init);
652 static void test_olecontrol(void)
654 IOleControl *olecontrol;
655 CONTROLINFO info;
656 HRESULT hr;
658 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
659 &IID_IOleControl, (void**)&olecontrol);
660 ok(hr == S_OK, "got 0x%08x\n", hr);
662 memset(&info, 0xab, sizeof(info));
663 info.cb = sizeof(info);
664 hr = IOleControl_GetControlInfo(olecontrol, &info);
665 ok(hr == S_OK, "got 0x%08x\n", hr);
666 ok(info.hAccel == NULL, "got %p\n", info.hAccel);
667 ok(info.cAccel == 0, "got %d\n", info.cAccel);
668 ok(info.dwFlags == 0xabababab, "got %x\n", info.dwFlags);
670 memset(&info, 0xab, sizeof(info));
671 info.cb = sizeof(info) - 1;
672 hr = IOleControl_GetControlInfo(olecontrol, &info);
673 ok(hr == S_OK, "got 0x%08x\n", hr);
674 ok(info.hAccel == NULL, "got %p\n", info.hAccel);
675 ok(info.cAccel == 0, "got %d\n", info.cAccel);
676 ok(info.dwFlags == 0xabababab, "got %x\n", info.dwFlags);
678 if (0) /* crashes on win2k3 */
680 hr = IOleControl_GetControlInfo(olecontrol, NULL);
681 ok(hr == E_POINTER, "got 0x%08x\n", hr);
684 IOleControl_Release(olecontrol);
687 static void test_Language(void)
689 static const WCHAR jsW[] = {'J','S','c','r','i','p','t',0};
690 static const WCHAR vb2W[] = {'v','B','s','c','r','i','p','t',0};
691 static const WCHAR dummyW[] = {'d','u','m','m','y',0};
692 IScriptControl *sc;
693 HRESULT hr;
694 BSTR str;
696 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
697 &IID_IScriptControl, (void**)&sc);
698 ok(hr == S_OK, "got 0x%08x\n", hr);
700 hr = IScriptControl_get_Language(sc, NULL);
701 ok(hr == E_POINTER, "got 0x%08x\n", hr);
703 str = (BSTR)0xdeadbeef;
704 hr = IScriptControl_get_Language(sc, &str);
705 ok(hr == S_OK, "got 0x%08x\n", hr);
706 ok(str == NULL, "got %s\n", wine_dbgstr_w(str));
708 str = SysAllocString(vbW);
709 hr = IScriptControl_put_Language(sc, str);
710 ok(hr == S_OK, "got 0x%08x\n", hr);
711 SysFreeString(str);
713 str = SysAllocString(vb2W);
714 hr = IScriptControl_put_Language(sc, str);
715 ok(hr == S_OK, "got 0x%08x\n", hr);
716 SysFreeString(str);
718 hr = IScriptControl_get_Language(sc, &str);
719 ok(hr == S_OK, "got 0x%08x\n", hr);
720 ok(!lstrcmpW(str, vbW), "got %s\n", wine_dbgstr_w(str));
721 SysFreeString(str);
723 str = SysAllocString(dummyW);
724 hr = IScriptControl_put_Language(sc, str);
725 ok(hr == CTL_E_INVALIDPROPERTYVALUE, "got 0x%08x\n", hr);
726 SysFreeString(str);
728 hr = IScriptControl_get_Language(sc, &str);
729 ok(hr == S_OK, "got 0x%08x\n", hr);
730 ok(!lstrcmpW(str, vbW), "got %s\n", wine_dbgstr_w(str));
731 SysFreeString(str);
733 str = SysAllocString(jsW);
734 hr = IScriptControl_put_Language(sc, str);
735 ok(hr == S_OK, "got 0x%08x\n", hr);
736 SysFreeString(str);
738 hr = IScriptControl_get_Language(sc, &str);
739 ok(hr == S_OK, "got 0x%08x\n", hr);
740 ok(!lstrcmpW(str, jsW), "got %s\n", wine_dbgstr_w(str));
741 SysFreeString(str);
743 hr = IScriptControl_put_Language(sc, NULL);
744 ok(hr == S_OK, "got 0x%08x\n", hr);
746 hr = IScriptControl_get_Language(sc, &str);
747 ok(hr == S_OK, "got 0x%08x\n", hr);
748 ok(str == NULL, "got %s\n", wine_dbgstr_w(str));
750 IScriptControl_Release(sc);
752 /* custom script engine */
753 if (register_script_engine()) {
754 static const WCHAR testscriptW[] = {'t','e','s','t','s','c','r','i','p','t',0};
756 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
757 &IID_IScriptControl, (void**)&sc);
758 ok(hr == S_OK, "got 0x%08x\n", hr);
760 SET_EXPECT(CreateInstance);
761 SET_EXPECT(SetInterfaceSafetyOptions);
762 SET_EXPECT(SetScriptSite);
763 SET_EXPECT(QI_IActiveScriptParse);
764 SET_EXPECT(InitNew);
766 str = SysAllocString(testscriptW);
767 hr = IScriptControl_put_Language(sc, str);
768 ok(hr == S_OK, "got 0x%08x\n", hr);
769 SysFreeString(str);
771 CHECK_CALLED(CreateInstance);
772 CHECK_CALLED(SetInterfaceSafetyOptions);
773 CHECK_CALLED(SetScriptSite);
774 CHECK_CALLED(QI_IActiveScriptParse);
775 CHECK_CALLED(InitNew);
776 hr = IScriptControl_get_Language(sc, &str);
777 todo_wine
778 ok(hr == S_OK, "got 0x%08x\n", hr);
779 if (hr == S_OK)
780 ok(!lstrcmpW(testscriptW, str), "%s\n", wine_dbgstr_w(str));
781 SysFreeString(str);
783 init_registry(FALSE);
785 SET_EXPECT(Close);
787 IScriptControl_Release(sc);
789 CHECK_CALLED(Close);
791 else
792 skip("Could not register TestScript engine\n");
795 static void test_connectionpoints(void)
797 IConnectionPointContainer *container, *container2;
798 IConnectionPoint *cp;
799 IScriptControl *sc;
800 HRESULT hr;
801 IID iid;
803 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
804 &IID_IScriptControl, (void**)&sc);
805 ok(hr == S_OK, "got 0x%08x\n", hr);
807 EXPECT_REF(sc, 1);
808 hr = IScriptControl_QueryInterface(sc, &IID_IConnectionPointContainer, (void**)&container);
809 ok(hr == S_OK, "got 0x%08x\n", hr);
810 EXPECT_REF(sc, 2);
811 EXPECT_REF(container, 2);
813 hr = IConnectionPointContainer_FindConnectionPoint(container, &IID_IPropertyNotifySink, &cp);
814 ok(hr == S_OK, "got 0x%08x\n", hr);
816 if (0) /* crashes on win2k3 */
818 hr = IConnectionPoint_GetConnectionPointContainer(cp, NULL);
819 ok(hr == E_POINTER, "got 0x%08x\n", hr);
822 hr = IConnectionPoint_GetConnectionInterface(cp, &iid);
823 ok(hr == S_OK, "got 0x%08x\n", hr);
824 ok(IsEqualIID(&iid, &IID_IPropertyNotifySink), "got %s\n", wine_dbgstr_guid(&iid));
826 hr = IConnectionPoint_GetConnectionPointContainer(cp, &container2);
827 ok(hr == S_OK, "got 0x%08x\n", hr);
828 ok(container2 == container, "got %p, expected %p\n", container2, container);
829 IConnectionPointContainer_Release(container2);
831 IConnectionPoint_Release(cp);
833 hr = IConnectionPointContainer_FindConnectionPoint(container, &DIID_DScriptControlSource, &cp);
834 ok(hr == S_OK, "got 0x%08x\n", hr);
836 if (0) /* crashes on win2k3 */
838 hr = IConnectionPoint_GetConnectionPointContainer(cp, NULL);
839 ok(hr == E_POINTER, "got 0x%08x\n", hr);
842 hr = IConnectionPoint_GetConnectionInterface(cp, &iid);
843 ok(hr == S_OK, "got 0x%08x\n", hr);
844 ok(IsEqualIID(&iid, &DIID_DScriptControlSource), "got %s\n", wine_dbgstr_guid(&iid));
846 hr = IConnectionPoint_GetConnectionPointContainer(cp, &container2);
847 ok(hr == S_OK, "got 0x%08x\n", hr);
848 ok(container2 == container, "got %p, expected %p\n", container2, container);
849 IConnectionPointContainer_Release(container2);
851 IConnectionPoint_Release(cp);
853 IConnectionPointContainer_Release(container);
854 IScriptControl_Release(sc);
857 static void test_quickactivate(void)
859 IScriptControl *sc;
860 IQuickActivate *qa;
861 HRESULT hr;
863 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
864 &IID_IScriptControl, (void**)&sc);
865 ok(hr == S_OK, "got 0x%08x\n", hr);
867 hr = IScriptControl_QueryInterface(sc, &IID_IQuickActivate, (void**)&qa);
868 ok(hr == S_OK, "got 0x%08x\n", hr);
870 IQuickActivate_Release(qa);
871 IScriptControl_Release(sc);
874 static void test_viewobject(void)
876 DWORD status, aspect, flags;
877 IViewObjectEx *viewex;
878 IScriptControl *sc;
879 IViewObject *view;
880 IAdviseSink *sink;
881 HRESULT hr;
883 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
884 &IID_IScriptControl, (void**)&sc);
885 ok(hr == S_OK, "got 0x%08x\n", hr);
887 hr = IScriptControl_QueryInterface(sc, &IID_IViewObject, (void**)&view);
888 ok(hr == S_OK, "got 0x%08x\n", hr);
889 IViewObject_Release(view);
891 hr = IScriptControl_QueryInterface(sc, &IID_IViewObject2, (void**)&view);
892 ok(hr == S_OK, "got 0x%08x\n", hr);
894 sink = (IAdviseSink*)0xdeadbeef;
895 hr = IViewObject_GetAdvise(view, &aspect, &flags, &sink);
896 ok(hr == S_OK, "got 0x%08x\n", hr);
897 ok(aspect == DVASPECT_CONTENT, "got %u\n", aspect);
898 ok(flags == 0, "got %#x\n", flags);
899 ok(sink == NULL, "got %p\n", sink);
901 hr = IViewObject_SetAdvise(view, DVASPECT_CONTENT, 0, NULL);
902 ok(hr == S_OK, "got 0x%08x\n", hr);
904 hr = IViewObject_SetAdvise(view, DVASPECT_THUMBNAIL, 0, NULL);
905 ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr);
907 hr = IViewObject_SetAdvise(view, DVASPECT_ICON, 0, NULL);
908 ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr);
910 hr = IViewObject_SetAdvise(view, DVASPECT_DOCPRINT, 0, NULL);
911 ok(hr == DV_E_DVASPECT, "got 0x%08x\n", hr);
913 sink = (IAdviseSink*)0xdeadbeef;
914 hr = IViewObject_GetAdvise(view, &aspect, &flags, &sink);
915 ok(hr == S_OK, "got 0x%08x\n", hr);
916 ok(aspect == DVASPECT_CONTENT, "got %u\n", aspect);
917 ok(flags == 0, "got %#x\n", flags);
918 ok(sink == NULL, "got %p\n", sink);
920 IViewObject_Release(view);
922 hr = IScriptControl_QueryInterface(sc, &IID_IViewObjectEx, (void**)&viewex);
923 ok(hr == S_OK, "got 0x%08x\n", hr);
925 if (0) /* crashes */
926 hr = IViewObjectEx_GetViewStatus(viewex, NULL);
928 status = 0;
929 hr = IViewObjectEx_GetViewStatus(viewex, &status);
930 ok(hr == S_OK, "got 0x%08x\n", hr);
931 ok(status == VIEWSTATUS_OPAQUE, "got %#x\n", status);
933 IViewObjectEx_Release(viewex);
935 IScriptControl_Release(sc);
938 static void test_pointerinactive(void)
940 IPointerInactive *pi;
941 IScriptControl *sc;
942 DWORD policy;
943 HRESULT hr;
945 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
946 &IID_IScriptControl, (void**)&sc);
947 ok(hr == S_OK, "got 0x%08x\n", hr);
949 hr = IScriptControl_QueryInterface(sc, &IID_IPointerInactive, (void**)&pi);
950 ok(hr == S_OK, "got 0x%08x\n", hr);
952 if (0) /* crashes w2k3 */
953 hr = IPointerInactive_GetActivationPolicy(pi, NULL);
955 policy = 123;
956 hr = IPointerInactive_GetActivationPolicy(pi, &policy);
957 ok(hr == S_OK, "got 0x%08x\n", hr);
958 ok(policy == 0, "got %#x\n", policy);
960 IPointerInactive_Release(pi);
961 IScriptControl_Release(sc);
964 static void test_timeout(void)
966 IScriptControl *sc;
967 HRESULT hr;
968 LONG val;
969 BSTR str;
971 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
972 &IID_IScriptControl, (void**)&sc);
973 ok(hr == S_OK, "got 0x%08x\n", hr);
975 hr = IScriptControl_get_Timeout(sc, NULL);
976 ok(hr == E_POINTER, "got 0x%08x\n", hr);
978 val = 0;
979 hr = IScriptControl_get_Timeout(sc, &val);
980 ok(hr == S_OK, "got 0x%08x\n", hr);
981 ok(val == 10000, "got %d\n", val);
983 hr = IScriptControl_put_Timeout(sc, -1);
984 ok(hr == S_OK, "got 0x%08x\n", hr);
986 val = 0;
987 hr = IScriptControl_get_Timeout(sc, &val);
988 ok(hr == S_OK, "got 0x%08x\n", hr);
989 ok(val == -1, "got %d\n", val);
991 hr = IScriptControl_put_Timeout(sc, -2);
992 ok(hr == CTL_E_INVALIDPROPERTYVALUE, "got 0x%08x\n", hr);
994 val = 0;
995 hr = IScriptControl_get_Timeout(sc, &val);
996 ok(hr == S_OK, "got 0x%08x\n", hr);
997 ok(val == -1, "got %d\n", val);
999 hr = IScriptControl_put_Timeout(sc, 0);
1000 ok(hr == S_OK, "got 0x%08x\n", hr);
1002 val = 1;
1003 hr = IScriptControl_get_Timeout(sc, &val);
1004 ok(hr == S_OK, "got 0x%08x\n", hr);
1005 ok(val == 0, "got %d\n", val);
1007 str = SysAllocString(vbW);
1008 hr = IScriptControl_put_Language(sc, str);
1009 ok(hr == S_OK, "got 0x%08x\n", hr);
1010 SysFreeString(str);
1012 val = 1;
1013 hr = IScriptControl_get_Timeout(sc, &val);
1014 ok(hr == S_OK, "got 0x%08x\n", hr);
1015 ok(val == 0, "got %d\n", val);
1017 hr = IScriptControl_put_Timeout(sc, 10000);
1018 ok(hr == S_OK, "got 0x%08x\n", hr);
1020 IScriptControl_Release(sc);
1023 static void test_Reset(void)
1025 IScriptControl *sc;
1026 HRESULT hr;
1027 BSTR str;
1029 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1030 &IID_IScriptControl, (void**)&sc);
1031 ok(hr == S_OK, "got 0x%08x\n", hr);
1033 hr = IScriptControl_Reset(sc);
1034 ok(hr == E_FAIL, "got 0x%08x\n", hr);
1036 str = SysAllocString(vbW);
1037 hr = IScriptControl_put_Language(sc, str);
1038 ok(hr == S_OK, "got 0x%08x\n", hr);
1039 SysFreeString(str);
1041 hr = IScriptControl_Reset(sc);
1042 ok(hr == S_OK, "got 0x%08x\n", hr);
1044 hr = IScriptControl_get_Language(sc, &str);
1045 ok(hr == S_OK, "got 0x%08x\n", hr);
1046 ok(!lstrcmpW(str, vbW), "got %s\n", wine_dbgstr_w(str));
1047 SysFreeString(str);
1049 IScriptControl_Release(sc);
1051 /* custom script engine */
1052 if (register_script_engine()) {
1053 static const WCHAR testscriptW[] = {'t','e','s','t','s','c','r','i','p','t',0};
1055 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1056 &IID_IScriptControl, (void**)&sc);
1057 ok(hr == S_OK, "got 0x%08x\n", hr);
1059 SET_EXPECT(CreateInstance);
1060 SET_EXPECT(SetInterfaceSafetyOptions);
1061 SET_EXPECT(SetScriptSite);
1062 SET_EXPECT(QI_IActiveScriptParse);
1063 SET_EXPECT(InitNew);
1065 str = SysAllocString(testscriptW);
1066 hr = IScriptControl_put_Language(sc, str);
1067 ok(hr == S_OK, "got 0x%08x\n", hr);
1068 SysFreeString(str);
1070 SET_EXPECT(SetScriptState_INITIALIZED);
1071 hr = IScriptControl_Reset(sc);
1072 ok(hr == S_OK, "got 0x%08x\n", hr);
1073 CHECK_CALLED(SetScriptState_INITIALIZED);
1075 SET_EXPECT(SetScriptState_INITIALIZED);
1076 hr = IScriptControl_Reset(sc);
1077 ok(hr == S_OK, "got 0x%08x\n", hr);
1078 CHECK_CALLED(SetScriptState_INITIALIZED);
1080 init_registry(FALSE);
1082 SET_EXPECT(Close);
1084 IScriptControl_Release(sc);
1086 CHECK_CALLED(Close);
1088 else
1089 skip("Could not register TestScript engine\n");
1092 static HRESULT WINAPI disp_QI(IDispatch *iface, REFIID riid, void **obj)
1094 if (IsEqualIID(riid, &IID_IDispatch) || IsEqualIID(riid, &IID_IUnknown)) {
1095 *obj = iface;
1096 IDispatch_AddRef(iface);
1097 return S_OK;
1100 *obj = NULL;
1101 return E_NOINTERFACE;
1104 static ULONG WINAPI disp_AddRef(IDispatch *iface)
1106 return 2;
1109 static ULONG WINAPI disp_Release(IDispatch *iface)
1111 return 1;
1114 static HRESULT WINAPI disp_GetTypeInfoCount(IDispatch *iface, UINT *count)
1116 ok(0, "unexpected call\n");
1117 return E_NOTIMPL;
1120 static HRESULT WINAPI disp_GetTypeInfo(IDispatch *iface, UINT index, LCID lcid, ITypeInfo **ti)
1122 ok(0, "unexpected call\n");
1123 return E_NOTIMPL;
1126 static HRESULT WINAPI disp_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *names,
1127 UINT cnames, LCID lcid, DISPID *dispid)
1129 ok(0, "unexpected call\n");
1130 return E_NOTIMPL;
1133 static HRESULT WINAPI disp_Invoke(IDispatch *iface, DISPID dispid, REFIID riid, LCID lcid,
1134 WORD flags, DISPPARAMS *dispparams, VARIANT *result, EXCEPINFO *ei, UINT *arg_err)
1136 ok(0, "unexpected call\n");
1137 return E_NOTIMPL;
1140 static const IDispatchVtbl dispvtbl = {
1141 disp_QI,
1142 disp_AddRef,
1143 disp_Release,
1144 disp_GetTypeInfoCount,
1145 disp_GetTypeInfo,
1146 disp_GetIDsOfNames,
1147 disp_Invoke
1150 static IDispatch testdisp = { &dispvtbl };
1152 static void test_AddObject(void)
1154 static const WCHAR oW[] = {'o',0};
1155 IScriptControl *sc;
1156 BSTR str, objname;
1157 HRESULT hr;
1159 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1160 &IID_IScriptControl, (void**)&sc);
1161 ok(hr == S_OK, "got 0x%08x\n", hr);
1163 objname = SysAllocString(oW);
1164 hr = IScriptControl_AddObject(sc, objname, NULL, VARIANT_FALSE);
1165 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
1167 hr = IScriptControl_AddObject(sc, objname, &testdisp, VARIANT_FALSE);
1168 ok(hr == E_FAIL, "got 0x%08x\n", hr);
1170 str = SysAllocString(vbW);
1171 hr = IScriptControl_put_Language(sc, str);
1172 ok(hr == S_OK, "got 0x%08x\n", hr);
1173 SysFreeString(str);
1175 hr = IScriptControl_AddObject(sc, objname, &testdisp, VARIANT_TRUE);
1176 ok(hr == S_OK, "got 0x%08x\n", hr);
1178 hr = IScriptControl_Reset(sc);
1179 ok(hr == S_OK, "got 0x%08x\n", hr);
1181 hr = IScriptControl_AddObject(sc, objname, &testdisp, VARIANT_TRUE);
1182 ok(hr == S_OK, "got 0x%08x\n", hr);
1184 IScriptControl_Release(sc);
1186 /* custom script engine */
1187 if (register_script_engine()) {
1188 static const WCHAR testscriptW[] = {'t','e','s','t','s','c','r','i','p','t',0};
1190 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1191 &IID_IScriptControl, (void**)&sc);
1192 ok(hr == S_OK, "got 0x%08x\n", hr);
1194 SET_EXPECT(CreateInstance);
1195 SET_EXPECT(SetInterfaceSafetyOptions);
1196 SET_EXPECT(SetScriptSite);
1197 SET_EXPECT(QI_IActiveScriptParse);
1198 SET_EXPECT(InitNew);
1200 str = SysAllocString(testscriptW);
1201 hr = IScriptControl_put_Language(sc, str);
1202 ok(hr == S_OK, "got 0x%08x\n", hr);
1203 SysFreeString(str);
1205 hr = IScriptControl_AddObject(sc, objname, NULL, VARIANT_FALSE);
1206 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
1208 SET_EXPECT(AddNamedItem);
1209 hr = IScriptControl_AddObject(sc, objname, &testdisp, VARIANT_TRUE);
1210 ok(hr == S_OK, "got 0x%08x\n", hr);
1211 CHECK_CALLED(AddNamedItem);
1213 hr = IScriptControl_AddObject(sc, objname, &testdisp, VARIANT_TRUE);
1214 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
1216 init_registry(FALSE);
1218 SET_EXPECT(Close);
1220 IScriptControl_Release(sc);
1222 CHECK_CALLED(Close);
1224 else
1225 skip("Could not register TestScript engine\n");
1227 SysFreeString(objname);
1230 static void test_AllowUI(void)
1232 IScriptControl *sc;
1233 VARIANT_BOOL allow;
1234 HRESULT hr;
1236 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1237 &IID_IScriptControl, (void**)&sc);
1238 ok(hr == S_OK, "got 0x%08x\n", hr);
1240 hr = IScriptControl_get_AllowUI(sc, NULL);
1241 ok(hr == E_POINTER, "got 0x%08x\n", hr);
1243 hr = IScriptControl_get_AllowUI(sc, &allow);
1244 ok(hr == S_OK, "got 0x%08x\n", hr);
1245 ok(allow == VARIANT_TRUE, "got %d\n", allow);
1247 hr = IScriptControl_put_AllowUI(sc, VARIANT_FALSE);
1248 ok(hr == S_OK, "got 0x%08x\n", hr);
1250 hr = IScriptControl_get_AllowUI(sc, &allow);
1251 ok(hr == S_OK, "got 0x%08x\n", hr);
1252 ok(allow == VARIANT_FALSE, "got %d\n", allow);
1254 IScriptControl_Release(sc);
1257 static void test_UseSafeSubset(void)
1259 IScriptControl *sc;
1260 VARIANT_BOOL use_safe_subset;
1261 HRESULT hr;
1262 BSTR str;
1264 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1265 &IID_IScriptControl, (void**)&sc);
1266 ok(hr == S_OK, "got 0x%08x\n", hr);
1268 hr = IScriptControl_get_UseSafeSubset(sc, NULL);
1269 ok(hr == E_POINTER, "got 0x%08x\n", hr);
1271 hr = IScriptControl_get_UseSafeSubset(sc, &use_safe_subset);
1272 ok(hr == S_OK, "got 0x%08x\n", hr);
1273 ok(use_safe_subset == VARIANT_FALSE, "got %d\n", use_safe_subset);
1275 hr = IScriptControl_put_UseSafeSubset(sc, VARIANT_TRUE);
1276 ok(hr == S_OK, "got 0x%08x\n", hr);
1278 hr = IScriptControl_get_UseSafeSubset(sc, &use_safe_subset);
1279 ok(hr == S_OK, "got 0x%08x\n", hr);
1280 ok(use_safe_subset == VARIANT_TRUE, "got %d\n", use_safe_subset);
1282 str = SysAllocString(vbW);
1283 hr = IScriptControl_put_Language(sc, str);
1284 ok(hr == S_OK, "got 0x%08x\n", hr);
1285 SysFreeString(str);
1287 hr = IScriptControl_get_UseSafeSubset(sc, &use_safe_subset);
1288 ok(hr == S_OK, "got 0x%08x\n", hr);
1289 ok(use_safe_subset == VARIANT_TRUE, "got %d\n", use_safe_subset);
1291 IScriptControl_Release(sc);
1294 START_TEST(msscript)
1296 IUnknown *unk;
1297 HRESULT hr;
1299 CoInitialize(NULL);
1301 hr = CoCreateInstance(&CLSID_ScriptControl, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1302 &IID_IUnknown, (void**)&unk);
1303 if (FAILED(hr)) {
1304 win_skip("Could not create ScriptControl object: %08x\n", hr);
1305 return;
1307 IUnknown_Release(unk);
1309 test_oleobject();
1310 test_persiststreaminit();
1311 test_olecontrol();
1312 test_Language();
1313 test_connectionpoints();
1314 test_quickactivate();
1315 test_viewobject();
1316 test_pointerinactive();
1317 test_timeout();
1318 test_Reset();
1319 test_AddObject();
1320 test_AllowUI();
1321 test_UseSafeSubset();
1323 CoUninitialize();