2 * Copyright 2008-2009 Jacek Caban 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
22 #include <wine/test.h>
36 #include "mshtml_test.h"
38 DEFINE_GUID(CLSID_IdentityUnmarshal
,0x0000001b,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
40 /* Defined as extern in urlmon.idl, but not exported by uuid.lib */
41 const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY
=
42 {0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
46 #define CTXARG_T DWORDLONG
47 #define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
48 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_64Vtbl
52 #define CTXARG_T DWORD
53 #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
54 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_32Vtbl
58 #define DEFINE_EXPECT(func) \
59 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
61 #define SET_EXPECT(func) \
62 do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
64 #define CHECK_EXPECT2(func) \
66 ok(expect_ ##func, "unexpected call " #func "\n"); \
67 called_ ## func = TRUE; \
70 #define CHECK_EXPECT(func) \
72 CHECK_EXPECT2(func); \
73 expect_ ## func = FALSE; \
76 #define CHECK_CALLED(func) \
78 ok(called_ ## func, "expected " #func "\n"); \
79 expect_ ## func = called_ ## func = FALSE; \
82 #define CHECK_CALLED_BROKEN(func) \
84 ok(called_ ## func || broken(!called_ ## func), "expected " #func "\n"); \
85 expect_ ## func = called_ ## func = FALSE; \
88 #define CHECK_NOT_CALLED(func) \
90 ok(!called_ ## func, "unexpected " #func "\n"); \
91 expect_ ## func = called_ ## func = FALSE; \
94 #define CLEAR_CALLED(func) \
95 expect_ ## func = called_ ## func = FALSE
98 DEFINE_EXPECT(CreateInstance
);
99 DEFINE_EXPECT(GetInterfaceSafetyOptions
);
100 DEFINE_EXPECT(SetInterfaceSafetyOptions
);
101 DEFINE_EXPECT(InitNew
);
102 DEFINE_EXPECT(Close
);
103 DEFINE_EXPECT(SetProperty_HACK_TRIDENTEVENTSINK
);
104 DEFINE_EXPECT(SetProperty_INVOKEVERSIONING
);
105 DEFINE_EXPECT(SetProperty_ABBREVIATE_GLOBALNAME_RESOLUTION
);
106 DEFINE_EXPECT(SetScriptSite
);
107 DEFINE_EXPECT(GetScriptState
);
108 DEFINE_EXPECT(SetScriptState_STARTED
);
109 DEFINE_EXPECT(SetScriptState_CONNECTED
);
110 DEFINE_EXPECT(SetScriptState_DISCONNECTED
);
111 DEFINE_EXPECT(AddNamedItem
);
112 DEFINE_EXPECT(ParseScriptText
);
113 DEFINE_EXPECT(GetScriptDispatch
);
114 DEFINE_EXPECT(funcDisp
);
115 DEFINE_EXPECT(script_divid_d
);
116 DEFINE_EXPECT(script_testprop_d
);
117 DEFINE_EXPECT(script_testprop_i
);
118 DEFINE_EXPECT(script_testprop2_d
);
119 DEFINE_EXPECT(AXQueryInterface_IActiveScript
);
120 DEFINE_EXPECT(AXQueryInterface_IObjectSafety
);
121 DEFINE_EXPECT(AXGetInterfaceSafetyOptions
);
122 DEFINE_EXPECT(AXSetInterfaceSafetyOptions
);
124 #define TESTSCRIPT_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80746}"
125 #define TESTACTIVEX_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80646}"
127 #define DISPID_SCRIPT_TESTPROP 0x100000
128 #define DISPID_SCRIPT_TESTPROP2 0x100001
130 static const GUID CLSID_TestScript
=
131 {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x07,0x46}};
132 static const GUID CLSID_TestActiveX
=
133 {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x06,0x46}};
135 static IHTMLDocument2
*notif_doc
;
136 static IDispatchEx
*window_dispex
;
137 static BOOL doc_complete
;
138 static IDispatch
*script_disp
;
139 static BOOL ax_objsafe
;
141 static const char *debugstr_guid(REFIID riid
)
145 sprintf(buf
, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
146 riid
->Data1
, riid
->Data2
, riid
->Data3
, riid
->Data4
[0],
147 riid
->Data4
[1], riid
->Data4
[2], riid
->Data4
[3], riid
->Data4
[4],
148 riid
->Data4
[5], riid
->Data4
[6], riid
->Data4
[7]);
153 static int strcmp_wa(LPCWSTR strw
, const char *stra
)
156 WideCharToMultiByte(CP_ACP
, 0, strw
, -1, buf
, sizeof(buf
), NULL
, NULL
);
157 return lstrcmpA(stra
, buf
);
160 static BSTR
a2bstr(const char *str
)
165 len
= MultiByteToWideChar(CP_ACP
, 0, str
, -1, NULL
, 0);
166 ret
= SysAllocStringLen(NULL
, len
);
167 MultiByteToWideChar(CP_ACP
, 0, str
, -1, ret
, len
);
172 static BOOL
init_key(const char *key_name
, const char *def_value
, BOOL init
)
178 RegDeleteKey(HKEY_CLASSES_ROOT
, key_name
);
182 res
= RegCreateKeyA(HKEY_CLASSES_ROOT
, key_name
, &hkey
);
183 if(res
!= ERROR_SUCCESS
)
187 res
= RegSetValueA(hkey
, NULL
, REG_SZ
, def_value
, strlen(def_value
));
191 return res
== ERROR_SUCCESS
;
194 static HRESULT WINAPI
PropertyNotifySink_QueryInterface(IPropertyNotifySink
*iface
,
195 REFIID riid
, void**ppv
)
197 if(IsEqualGUID(&IID_IPropertyNotifySink
, riid
)) {
202 return E_NOINTERFACE
;
205 static ULONG WINAPI
PropertyNotifySink_AddRef(IPropertyNotifySink
*iface
)
210 static ULONG WINAPI
PropertyNotifySink_Release(IPropertyNotifySink
*iface
)
215 static HRESULT WINAPI
PropertyNotifySink_OnChanged(IPropertyNotifySink
*iface
, DISPID dispID
)
217 if(dispID
== DISPID_READYSTATE
){
221 static const WCHAR completeW
[] = {'c','o','m','p','l','e','t','e',0};
223 hres
= IHTMLDocument2_get_readyState(notif_doc
, &state
);
224 ok(hres
== S_OK
, "get_readyState failed: %08x\n", hres
);
226 if(!lstrcmpW(state
, completeW
))
229 SysFreeString(state
);
235 static HRESULT WINAPI
PropertyNotifySink_OnRequestEdit(IPropertyNotifySink
*iface
, DISPID dispID
)
237 ok(0, "unexpected call\n");
241 static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl
= {
242 PropertyNotifySink_QueryInterface
,
243 PropertyNotifySink_AddRef
,
244 PropertyNotifySink_Release
,
245 PropertyNotifySink_OnChanged
,
246 PropertyNotifySink_OnRequestEdit
249 static IPropertyNotifySink PropertyNotifySink
= { &PropertyNotifySinkVtbl
};
251 static HRESULT WINAPI
DispatchEx_QueryInterface(IDispatchEx
*iface
, REFIID riid
, void **ppv
)
255 if(IsEqualGUID(riid
, &IID_IUnknown
)
256 || IsEqualGUID(riid
, &IID_IDispatch
)
257 || IsEqualGUID(riid
, &IID_IDispatchEx
))
260 return E_NOINTERFACE
;
265 static ULONG WINAPI
DispatchEx_AddRef(IDispatchEx
*iface
)
270 static ULONG WINAPI
DispatchEx_Release(IDispatchEx
*iface
)
275 static HRESULT WINAPI
DispatchEx_GetTypeInfoCount(IDispatchEx
*iface
, UINT
*pctinfo
)
277 ok(0, "unexpected call\n");
281 static HRESULT WINAPI
DispatchEx_GetTypeInfo(IDispatchEx
*iface
, UINT iTInfo
,
282 LCID lcid
, ITypeInfo
**ppTInfo
)
284 ok(0, "unexpected call\n");
288 static HRESULT WINAPI
DispatchEx_GetIDsOfNames(IDispatchEx
*iface
, REFIID riid
,
289 LPOLESTR
*rgszNames
, UINT cNames
,
290 LCID lcid
, DISPID
*rgDispId
)
292 ok(0, "unexpected call\n");
296 static HRESULT WINAPI
DispatchEx_Invoke(IDispatchEx
*iface
, DISPID dispIdMember
,
297 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
298 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
300 ok(0, "unexpected call\n");
304 static HRESULT WINAPI
DispatchEx_DeleteMemberByName(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
)
306 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName
), grfdex
);
310 static HRESULT WINAPI
DispatchEx_DeleteMemberByDispID(IDispatchEx
*iface
, DISPID id
)
312 ok(0, "unexpected call\n");
316 static HRESULT WINAPI
DispatchEx_GetMemberProperties(IDispatchEx
*iface
, DISPID id
, DWORD grfdexFetch
, DWORD
*pgrfdex
)
318 ok(0, "unexpected call\n");
322 static HRESULT WINAPI
DispatchEx_GetMemberName(IDispatchEx
*iface
, DISPID id
, BSTR
*pbstrName
)
324 ok(0, "unexpected call\n");
328 static HRESULT WINAPI
DispatchEx_GetNextDispID(IDispatchEx
*iface
, DWORD grfdex
, DISPID id
, DISPID
*pid
)
330 ok(0, "unexpected call\n");
334 static HRESULT WINAPI
DispatchEx_GetNameSpaceParent(IDispatchEx
*iface
, IUnknown
**ppunk
)
336 ok(0, "unexpected call\n");
340 static HRESULT WINAPI
DispatchEx_GetDispID(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
, DISPID
*pid
)
342 ok(0, "unexpected call\n");
346 static HRESULT WINAPI
funcDisp_InvokeEx(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
347 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
349 CHECK_EXPECT(funcDisp
);
351 ok(id
== DISPID_VALUE
, "id = %d\n", id
);
352 ok(lcid
== 0, "lcid = %x\n", lcid
);
353 ok(wFlags
== DISPATCH_METHOD
, "wFlags = %x\n", wFlags
);
354 ok(pdp
!= NULL
, "pdp == NULL\n");
355 ok(pdp
->cArgs
== 2, "pdp->cArgs = %d\n", pdp
->cArgs
);
356 ok(pdp
->cNamedArgs
== 1, "pdp->cNamedArgs = %d\n", pdp
->cNamedArgs
);
357 ok(pdp
->rgdispidNamedArgs
[0] == DISPID_THIS
, "pdp->rgdispidNamedArgs[0] = %d\n", pdp
->rgdispidNamedArgs
[0]);
358 ok(V_VT(pdp
->rgvarg
) == VT_DISPATCH
, "V_VT(rgvarg) = %d\n", V_VT(pdp
->rgvarg
));
359 ok(V_VT(pdp
->rgvarg
+1) == VT_BOOL
, "V_VT(rgvarg[1]) = %d\n", V_VT(pdp
->rgvarg
));
360 ok(V_BOOL(pdp
->rgvarg
+1) == VARIANT_TRUE
, "V_BOOL(rgvarg[1]) = %x\n", V_BOOL(pdp
->rgvarg
));
361 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
362 ok(pei
!= NULL
, "pei == NULL\n");
363 ok(!pspCaller
, "pspCaller != NULL\n");
365 V_VT(pvarRes
) = VT_I4
;
370 static IDispatchExVtbl testObjVtbl
= {
371 DispatchEx_QueryInterface
,
374 DispatchEx_GetTypeInfoCount
,
375 DispatchEx_GetTypeInfo
,
376 DispatchEx_GetIDsOfNames
,
378 DispatchEx_GetDispID
,
380 DispatchEx_DeleteMemberByName
,
381 DispatchEx_DeleteMemberByDispID
,
382 DispatchEx_GetMemberProperties
,
383 DispatchEx_GetMemberName
,
384 DispatchEx_GetNextDispID
,
385 DispatchEx_GetNameSpaceParent
388 static IDispatchEx funcDisp
= { &testObjVtbl
};
390 static HRESULT WINAPI
scriptDisp_GetDispID(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
, DISPID
*pid
)
392 if(!strcmp_wa(bstrName
, "testProp")) {
393 CHECK_EXPECT(script_testprop_d
);
394 ok(grfdex
== fdexNameCaseSensitive
, "grfdex = %x\n", grfdex
);
395 *pid
= DISPID_SCRIPT_TESTPROP
;
399 if(!strcmp_wa(bstrName
, "testProp2")) {
400 CHECK_EXPECT(script_testprop2_d
);
401 ok(grfdex
== fdexNameCaseSensitive
, "grfdex = %x\n", grfdex
);
402 *pid
= DISPID_SCRIPT_TESTPROP2
;
406 if(!strcmp_wa(bstrName
, "divid")) {
407 CHECK_EXPECT(script_divid_d
);
408 ok(grfdex
== fdexNameCaseSensitive
, "grfdex = %x\n", grfdex
);
412 ok(0, "unexpected call\n");
416 static HRESULT WINAPI
scriptDisp_InvokeEx(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
417 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
420 case DISPID_SCRIPT_TESTPROP
:
421 CHECK_EXPECT(script_testprop_i
);
423 ok(lcid
== 0, "lcid = %x\n", lcid
);
424 ok(wFlags
== DISPATCH_PROPERTYGET
, "wFlags = %x\n", wFlags
);
425 ok(pdp
!= NULL
, "pdp == NULL\n");
426 ok(pdp
->cArgs
== 0, "pdp->cArgs = %d\n", pdp
->cArgs
);
427 ok(pdp
->cNamedArgs
== 0, "pdp->cNamedArgs = %d\n", pdp
->cNamedArgs
);
428 ok(!pdp
->rgdispidNamedArgs
, "pdp->rgdispidNamedArgs != NULL\n");
429 ok(!pdp
->rgvarg
, "rgvarg != NULL\n");
430 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
431 ok(pei
!= NULL
, "pei == NULL\n");
432 ok(!pspCaller
, "pspCaller != NULL\n");
434 V_VT(pvarRes
) = VT_NULL
;
437 ok(0, "unexpected call\n");
444 static IDispatchExVtbl scriptDispVtbl
= {
445 DispatchEx_QueryInterface
,
448 DispatchEx_GetTypeInfoCount
,
449 DispatchEx_GetTypeInfo
,
450 DispatchEx_GetIDsOfNames
,
452 scriptDisp_GetDispID
,
454 DispatchEx_DeleteMemberByName
,
455 DispatchEx_DeleteMemberByDispID
,
456 DispatchEx_GetMemberProperties
,
457 DispatchEx_GetMemberName
,
458 DispatchEx_GetNextDispID
,
459 DispatchEx_GetNameSpaceParent
462 static IDispatchEx scriptDisp
= { &scriptDispVtbl
};
464 static IHTMLDocument2
*create_document(void)
469 hres
= CoCreateInstance(&CLSID_HTMLDocument
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
470 &IID_IHTMLDocument2
, (void**)&doc
);
471 ok(hres
== S_OK
, "CoCreateInstance failed: %08x\n", hres
);
476 static IHTMLDocument2
*create_doc_with_string(const char *str
)
478 IPersistStreamInit
*init
;
484 notif_doc
= doc
= create_document();
488 doc_complete
= FALSE
;
490 mem
= GlobalAlloc(0, len
);
491 memcpy(mem
, str
, len
);
492 CreateStreamOnHGlobal(mem
, TRUE
, &stream
);
494 IHTMLDocument2_QueryInterface(doc
, &IID_IPersistStreamInit
, (void**)&init
);
496 IPersistStreamInit_Load(init
, stream
);
497 IPersistStreamInit_Release(init
);
498 IStream_Release(stream
);
503 static void do_advise(IUnknown
*unk
, REFIID riid
, IUnknown
*unk_advise
)
505 IConnectionPointContainer
*container
;
506 IConnectionPoint
*cp
;
510 hres
= IUnknown_QueryInterface(unk
, &IID_IConnectionPointContainer
, (void**)&container
);
511 ok(hres
== S_OK
, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres
);
513 hres
= IConnectionPointContainer_FindConnectionPoint(container
, riid
, &cp
);
514 IConnectionPointContainer_Release(container
);
515 ok(hres
== S_OK
, "FindConnectionPoint failed: %08x\n", hres
);
517 hres
= IConnectionPoint_Advise(cp
, unk_advise
, &cookie
);
518 IConnectionPoint_Release(cp
);
519 ok(hres
== S_OK
, "Advise failed: %08x\n", hres
);
522 typedef void (*domtest_t
)(IHTMLDocument2
*);
524 static IHTMLDocument2
*create_and_load_doc(const char *str
)
527 IHTMLElement
*body
= NULL
;
530 static const WCHAR ucPtr
[] = {'b','a','c','k','g','r','o','u','n','d',0};
535 doc
= create_doc_with_string(str
);
536 do_advise((IUnknown
*)doc
, &IID_IPropertyNotifySink
, (IUnknown
*)&PropertyNotifySink
);
538 while(!doc_complete
&& GetMessage(&msg
, NULL
, 0, 0)) {
539 TranslateMessage(&msg
);
540 DispatchMessage(&msg
);
543 hres
= IHTMLDocument2_get_body(doc
, &body
);
544 ok(hres
== S_OK
, "get_body failed: %08x\n", hres
);
546 /* Check we can query for function on the IHTMLElementBody interface */
547 name
= (WCHAR
*)ucPtr
;
548 hres
= IHTMLElement_GetIDsOfNames(body
, &IID_NULL
, &name
, 1, LOCALE_USER_DEFAULT
, &dispID
);
549 ok(hres
== S_OK
, "GetIDsOfNames(background) failed %08x\n", hres
);
550 ok(dispID
== DISPID_IHTMLBODYELEMENT_BACKGROUND
, "Incorrect dispID got (%d)\n", dispID
);
552 IHTMLElement_Release(body
);
556 static IActiveScriptSite
*site
;
557 static SCRIPTSTATE state
;
559 static HRESULT WINAPI
ObjectSafety_QueryInterface(IObjectSafety
*iface
, REFIID riid
, void **ppv
)
562 ok(0, "unexpected call %s\n", debugstr_guid(riid
));
563 return E_NOINTERFACE
;
566 static ULONG WINAPI
ObjectSafety_AddRef(IObjectSafety
*iface
)
571 static ULONG WINAPI
ObjectSafety_Release(IObjectSafety
*iface
)
576 static HRESULT WINAPI
ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
577 DWORD
*pdwSupportedOptions
, DWORD
*pdwEnabledOptions
)
579 CHECK_EXPECT(GetInterfaceSafetyOptions
);
581 ok(IsEqualGUID(&IID_IActiveScriptParse
, riid
), "unexpected riid %s\n", debugstr_guid(riid
));
582 ok(pdwSupportedOptions
!= NULL
, "pdwSupportedOptions == NULL\n");
583 ok(pdwEnabledOptions
!= NULL
, "pdwEnabledOptions == NULL\n");
585 *pdwSupportedOptions
= INTERFACESAFE_FOR_UNTRUSTED_DATA
|INTERFACE_USES_DISPEX
|INTERFACE_USES_SECURITY_MANAGER
;
586 *pdwEnabledOptions
= INTERFACE_USES_DISPEX
;
591 static HRESULT WINAPI
ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
592 DWORD dwOptionSetMask
, DWORD dwEnabledOptions
)
594 CHECK_EXPECT(SetInterfaceSafetyOptions
);
596 ok(IsEqualGUID(&IID_IActiveScriptParse
, riid
), "unexpected riid %s\n", debugstr_guid(riid
));
598 ok(dwOptionSetMask
== (INTERFACESAFE_FOR_UNTRUSTED_DATA
|INTERFACE_USES_DISPEX
|INTERFACE_USES_SECURITY_MANAGER
),
599 "dwOptionSetMask=%x\n", dwOptionSetMask
);
600 ok(dwEnabledOptions
== (INTERFACESAFE_FOR_UNTRUSTED_DATA
|INTERFACE_USES_DISPEX
|INTERFACE_USES_SECURITY_MANAGER
),
601 "dwEnabledOptions=%x\n", dwOptionSetMask
);
606 static const IObjectSafetyVtbl ObjectSafetyVtbl
= {
607 ObjectSafety_QueryInterface
,
609 ObjectSafety_Release
,
610 ObjectSafety_GetInterfaceSafetyOptions
,
611 ObjectSafety_SetInterfaceSafetyOptions
614 static IObjectSafety ObjectSafety
= { &ObjectSafetyVtbl
};
616 static HRESULT WINAPI
AXObjectSafety_QueryInterface(IObjectSafety
*iface
, REFIID riid
, void **ppv
)
620 if(IsEqualGUID(&IID_IActiveScript
, riid
)) {
621 CHECK_EXPECT(AXQueryInterface_IActiveScript
);
622 return E_NOINTERFACE
;
625 if(IsEqualGUID(&IID_IObjectSafety
, riid
)) {
626 CHECK_EXPECT(AXQueryInterface_IObjectSafety
);
628 return E_NOINTERFACE
;
633 ok(0, "unexpected call %s\n", debugstr_guid(riid
));
634 return E_NOINTERFACE
;
637 static HRESULT WINAPI
AXObjectSafety_GetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
638 DWORD
*pdwSupportedOptions
, DWORD
*pdwEnabledOptions
)
640 CHECK_EXPECT(AXGetInterfaceSafetyOptions
);
642 ok(IsEqualGUID(&IID_IDispatchEx
, riid
), "unexpected riid %s\n", debugstr_guid(riid
));
643 ok(pdwSupportedOptions
!= NULL
, "pdwSupportedOptions == NULL\n");
644 ok(pdwEnabledOptions
!= NULL
, "pdwEnabledOptions == NULL\n");
646 *pdwSupportedOptions
= INTERFACESAFE_FOR_UNTRUSTED_DATA
|INTERFACE_USES_DISPEX
|INTERFACE_USES_SECURITY_MANAGER
;
647 *pdwEnabledOptions
= INTERFACE_USES_DISPEX
;
652 static HRESULT WINAPI
AXObjectSafety_SetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
653 DWORD dwOptionSetMask
, DWORD dwEnabledOptions
)
655 CHECK_EXPECT(AXSetInterfaceSafetyOptions
);
657 ok(IsEqualGUID(&IID_IDispatchEx
, riid
), "unexpected riid %s\n", debugstr_guid(riid
));
659 ok(dwOptionSetMask
== (INTERFACESAFE_FOR_UNTRUSTED_CALLER
|INTERFACE_USES_SECURITY_MANAGER
),
660 "dwOptionSetMask=%x\n", dwOptionSetMask
);
661 ok(dwEnabledOptions
== (INTERFACESAFE_FOR_UNTRUSTED_CALLER
|INTERFACE_USES_SECURITY_MANAGER
),
662 "dwEnabledOptions=%x\n", dwOptionSetMask
);
667 static const IObjectSafetyVtbl AXObjectSafetyVtbl
= {
668 AXObjectSafety_QueryInterface
,
670 ObjectSafety_Release
,
671 AXObjectSafety_GetInterfaceSafetyOptions
,
672 AXObjectSafety_SetInterfaceSafetyOptions
675 static IObjectSafety AXObjectSafety
= { &AXObjectSafetyVtbl
};
677 static BOOL
set_safe_reg(BOOL init
)
679 return init_key("CLSID\\"TESTACTIVEX_CLSID
"\\Implemented Categories\\{7dd95801-9882-11cf-9fa9-00aa006c42c4}",
683 static void test_security(void)
685 IInternetHostSecurityManager
*sec_mgr
;
686 IServiceProvider
*sp
;
687 DWORD policy
, policy_size
;
688 struct CONFIRMSAFETY cs
;
692 hres
= IActiveScriptSite_QueryInterface(site
, &IID_IServiceProvider
, (void**)&sp
);
693 ok(hres
== S_OK
, "Could not get IServiceProvider iface: %08x\n", hres
);
695 hres
= IServiceProvider_QueryService(sp
, &SID_SInternetHostSecurityManager
,
696 &IID_IInternetHostSecurityManager
, (void**)&sec_mgr
);
697 IServiceProvider_Release(sp
);
698 ok(hres
== S_OK
, "QueryService failed: %08x\n", hres
);
700 hres
= IInternetHostSecurityManager_ProcessUrlAction(sec_mgr
, URLACTION_ACTIVEX_RUN
, (BYTE
*)&policy
, sizeof(policy
),
701 (BYTE
*)&CLSID_TestActiveX
, sizeof(CLSID
), 0, 0);
702 ok(hres
== S_OK
, "ProcessUrlAction failed: %08x\n", hres
);
703 ok(policy
== URLPOLICY_ALLOW
, "policy = %x\n", policy
);
705 cs
.clsid
= CLSID_TestActiveX
;
706 cs
.pUnk
= (IUnknown
*)&AXObjectSafety
;
710 SET_EXPECT(AXQueryInterface_IActiveScript
);
711 SET_EXPECT(AXQueryInterface_IObjectSafety
);
712 SET_EXPECT(AXGetInterfaceSafetyOptions
);
713 SET_EXPECT(AXSetInterfaceSafetyOptions
);
714 hres
= IInternetHostSecurityManager_QueryCustomPolicy(sec_mgr
, &GUID_CUSTOM_CONFIRMOBJECTSAFETY
,
715 &ppolicy
, &policy_size
, (BYTE
*)&cs
, sizeof(cs
), 0);
716 CHECK_CALLED(AXQueryInterface_IActiveScript
);
717 CHECK_CALLED(AXQueryInterface_IObjectSafety
);
718 CHECK_CALLED(AXGetInterfaceSafetyOptions
);
719 CHECK_CALLED(AXSetInterfaceSafetyOptions
);
721 ok(hres
== S_OK
, "QueryCusromPolicy failed: %08x\n", hres
);
722 ok(policy_size
== sizeof(DWORD
), "policy_size = %d\n", policy_size
);
723 ok(*(DWORD
*)ppolicy
== URLPOLICY_ALLOW
, "policy = %x\n", *(DWORD
*)ppolicy
);
724 CoTaskMemFree(ppolicy
);
727 SET_EXPECT(AXQueryInterface_IActiveScript
);
728 SET_EXPECT(AXQueryInterface_IObjectSafety
);
729 hres
= IInternetHostSecurityManager_QueryCustomPolicy(sec_mgr
, &GUID_CUSTOM_CONFIRMOBJECTSAFETY
,
730 &ppolicy
, &policy_size
, (BYTE
*)&cs
, sizeof(cs
), 0);
731 CHECK_CALLED(AXQueryInterface_IActiveScript
);
732 CHECK_CALLED(AXQueryInterface_IObjectSafety
);
734 ok(hres
== S_OK
, "QueryCusromPolicy failed: %08x\n", hres
);
735 ok(policy_size
== sizeof(DWORD
), "policy_size = %d\n", policy_size
);
736 ok(*(DWORD
*)ppolicy
== URLPOLICY_DISALLOW
, "policy = %x\n", *(DWORD
*)ppolicy
);
737 CoTaskMemFree(ppolicy
);
739 if(set_safe_reg(TRUE
)) {
741 SET_EXPECT(AXQueryInterface_IActiveScript
);
742 SET_EXPECT(AXQueryInterface_IObjectSafety
);
743 hres
= IInternetHostSecurityManager_QueryCustomPolicy(sec_mgr
, &GUID_CUSTOM_CONFIRMOBJECTSAFETY
,
744 &ppolicy
, &policy_size
, (BYTE
*)&cs
, sizeof(cs
), 0);
745 CHECK_CALLED(AXQueryInterface_IActiveScript
);
746 CHECK_CALLED(AXQueryInterface_IObjectSafety
);
748 ok(hres
== S_OK
, "QueryCusromPolicy failed: %08x\n", hres
);
749 ok(policy_size
== sizeof(DWORD
), "policy_size = %d\n", policy_size
);
750 ok(*(DWORD
*)ppolicy
== URLPOLICY_ALLOW
, "policy = %x\n", *(DWORD
*)ppolicy
);
751 CoTaskMemFree(ppolicy
);
754 SET_EXPECT(AXQueryInterface_IActiveScript
);
755 SET_EXPECT(AXQueryInterface_IObjectSafety
);
756 SET_EXPECT(AXGetInterfaceSafetyOptions
);
757 SET_EXPECT(AXSetInterfaceSafetyOptions
);
758 hres
= IInternetHostSecurityManager_QueryCustomPolicy(sec_mgr
, &GUID_CUSTOM_CONFIRMOBJECTSAFETY
,
759 &ppolicy
, &policy_size
, (BYTE
*)&cs
, sizeof(cs
), 0);
760 CHECK_CALLED(AXQueryInterface_IActiveScript
);
761 CHECK_CALLED(AXQueryInterface_IObjectSafety
);
762 CHECK_CALLED(AXGetInterfaceSafetyOptions
);
763 CHECK_CALLED(AXSetInterfaceSafetyOptions
);
765 ok(hres
== S_OK
, "QueryCusromPolicy failed: %08x\n", hres
);
766 ok(policy_size
== sizeof(DWORD
), "policy_size = %d\n", policy_size
);
767 ok(*(DWORD
*)ppolicy
== URLPOLICY_ALLOW
, "policy = %x\n", *(DWORD
*)ppolicy
);
768 CoTaskMemFree(ppolicy
);
772 skip("Could not set safety registry\n");
775 IInternetHostSecurityManager_Release(sec_mgr
);
778 static HRESULT WINAPI
ActiveScriptProperty_QueryInterface(IActiveScriptProperty
*iface
, REFIID riid
, void **ppv
)
781 ok(0, "unexpected call\n");
782 return E_NOINTERFACE
;
785 static ULONG WINAPI
ActiveScriptProperty_AddRef(IActiveScriptProperty
*iface
)
790 static ULONG WINAPI
ActiveScriptProperty_Release(IActiveScriptProperty
*iface
)
795 static HRESULT WINAPI
ActiveScriptProperty_GetProperty(IActiveScriptProperty
*iface
, DWORD dwProperty
,
796 VARIANT
*pvarIndex
, VARIANT
*pvarValue
)
798 ok(0, "unexpected call\n");
802 static HRESULT WINAPI
ActiveScriptProperty_SetProperty(IActiveScriptProperty
*iface
, DWORD dwProperty
,
803 VARIANT
*pvarIndex
, VARIANT
*pvarValue
)
806 case SCRIPTPROP_HACK_TRIDENTEVENTSINK
:
807 CHECK_EXPECT(SetProperty_HACK_TRIDENTEVENTSINK
);
808 ok(V_VT(pvarValue
) == VT_BOOL
, "V_VT(pvarValue)=%d\n", V_VT(pvarValue
));
809 ok(V_BOOL(pvarValue
) == VARIANT_TRUE
, "V_BOOL(pvarValue)=%x\n", V_BOOL(pvarValue
));
811 case SCRIPTPROP_INVOKEVERSIONING
:
812 CHECK_EXPECT(SetProperty_INVOKEVERSIONING
);
813 ok(V_VT(pvarValue
) == VT_I4
, "V_VT(pvarValue)=%d\n", V_VT(pvarValue
));
814 ok(V_I4(pvarValue
) == 1, "V_I4(pvarValue)=%d\n", V_I4(pvarValue
));
816 case SCRIPTPROP_ABBREVIATE_GLOBALNAME_RESOLUTION
:
817 CHECK_EXPECT(SetProperty_ABBREVIATE_GLOBALNAME_RESOLUTION
);
818 ok(V_VT(pvarValue
) == VT_BOOL
, "V_VT(pvarValue)=%d\n", V_VT(pvarValue
));
819 ok(V_BOOL(pvarValue
) == VARIANT_TRUE
, "V_BOOL(pvarValue)=%x\n", V_BOOL(pvarValue
));
822 ok(0, "unexpected property %x\n", dwProperty
);
826 ok(!pvarIndex
, "pvarIndex != NULL\n");
827 ok(pvarValue
!= NULL
, "pvarValue == NULL\n");
832 static const IActiveScriptPropertyVtbl ActiveScriptPropertyVtbl
= {
833 ActiveScriptProperty_QueryInterface
,
834 ActiveScriptProperty_AddRef
,
835 ActiveScriptProperty_Release
,
836 ActiveScriptProperty_GetProperty
,
837 ActiveScriptProperty_SetProperty
840 static IActiveScriptProperty ActiveScriptProperty
= { &ActiveScriptPropertyVtbl
};
842 static HRESULT WINAPI
ActiveScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2
*iface
, REFIID riid
, void **ppv
)
845 ok(0, "unexpected call\n");
846 return E_NOINTERFACE
;
849 static ULONG WINAPI
ActiveScriptParseProcedure_AddRef(IActiveScriptParseProcedure2
*iface
)
854 static ULONG WINAPI
ActiveScriptParseProcedure_Release(IActiveScriptParseProcedure2
*iface
)
859 static HRESULT WINAPI
ActiveScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2
*iface
,
860 LPCOLESTR pstrCode
, LPCOLESTR pstrFormalParams
, LPCOLESTR pstrProcedureName
,
861 LPCOLESTR pstrItemName
, IUnknown
*punkContext
, LPCOLESTR pstrDelimiter
,
862 CTXARG_T dwSourceContextCookie
, ULONG ulStartingLineNumber
, DWORD dwFlags
, IDispatch
**ppdisp
)
864 ok(0, "unexpected call\n");
868 static const IActiveScriptParseProcedure2Vtbl ActiveScriptParseProcedureVtbl
= {
869 ActiveScriptParseProcedure_QueryInterface
,
870 ActiveScriptParseProcedure_AddRef
,
871 ActiveScriptParseProcedure_Release
,
872 ActiveScriptParseProcedure_ParseProcedureText
875 static IActiveScriptParseProcedure2 ActiveScriptParseProcedure
= { &ActiveScriptParseProcedureVtbl
};
877 static HRESULT WINAPI
ActiveScriptParse_QueryInterface(IActiveScriptParse
*iface
, REFIID riid
, void **ppv
)
880 ok(0, "unexpected call\n");
881 return E_NOINTERFACE
;
884 static ULONG WINAPI
ActiveScriptParse_AddRef(IActiveScriptParse
*iface
)
889 static ULONG WINAPI
ActiveScriptParse_Release(IActiveScriptParse
*iface
)
894 static HRESULT WINAPI
ActiveScriptParse_InitNew(IActiveScriptParse
*iface
)
896 CHECK_EXPECT(InitNew
);
900 static HRESULT WINAPI
ActiveScriptParse_AddScriptlet(IActiveScriptParse
*iface
,
901 LPCOLESTR pstrDefaultName
, LPCOLESTR pstrCode
, LPCOLESTR pstrItemName
,
902 LPCOLESTR pstrSubItemName
, LPCOLESTR pstrEventName
, LPCOLESTR pstrDelimiter
,
903 CTXARG_T dwSourceContextCookie
, ULONG ulStartingLineNumber
, DWORD dwFlags
,
904 BSTR
*pbstrName
, EXCEPINFO
*pexcepinfo
)
906 ok(0, "unexpected call\n");
910 static HRESULT
dispex_propput(IDispatchEx
*obj
, DISPID id
, DWORD flags
, VARIANT
*var
)
912 DISPID propput_arg
= DISPID_PROPERTYPUT
;
913 DISPPARAMS dp
= {var
, &propput_arg
, 1, 1};
916 return IDispatchEx_InvokeEx(obj
, id
, LOCALE_NEUTRAL
, DISPATCH_PROPERTYPUT
|flags
, &dp
, NULL
, &ei
, NULL
);
919 static void test_func(IDispatchEx
*obj
)
930 str
= a2bstr("toString");
931 hres
= IDispatchEx_GetDispID(obj
, str
, fdexNameCaseSensitive
, &id
);
933 ok(hres
== S_OK
, "GetDispID failed: %08x\n", hres
);
934 ok(id
== DISPID_IOMNAVIGATOR_TOSTRING
, "id = %x\n", id
);
936 memset(&dp
, 0, sizeof(dp
));
937 memset(&ei
, 0, sizeof(ei
));
939 hres
= IDispatchEx_InvokeEx(obj
, id
, LOCALE_NEUTRAL
, DISPATCH_PROPERTYGET
, &dp
, &var
, &ei
, NULL
);
940 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
941 ok(V_VT(&var
) == VT_DISPATCH
, "V_VT(var)=%d\n", V_VT(&var
));
942 ok(V_DISPATCH(&var
) != NULL
, "V_DISPATCH(var) == NULL\n");
943 disp
= V_DISPATCH(&var
);
945 hres
= IDispatch_QueryInterface(disp
, &IID_IDispatchEx
, (void**)&dispex
);
946 IDispatch_Release(disp
);
947 ok(hres
== S_OK
, "Could not get IDispatchEx iface: %08x\n", hres
);
949 /* FIXME: Test InvokeEx(DISPATCH_METHOD) */
951 memset(&dp
, 0, sizeof(dp
));
952 memset(&ei
, 0, sizeof(ei
));
954 hres
= IDispatchEx_Invoke(dispex
, DISPID_VALUE
, &IID_NULL
, LOCALE_NEUTRAL
, DISPATCH_METHOD
, &dp
, &var
, &ei
, NULL
);
955 ok(hres
== S_OK
|| broken(E_ACCESSDENIED
), "InvokeEx failed: %08x\n", hres
);
956 if(SUCCEEDED(hres
)) {
957 ok(V_VT(&var
) == VT_BSTR
, "V_VT(var)=%d\n", V_VT(&var
));
958 ok(!strcmp_wa(V_BSTR(&var
), "[object]"), "V_BSTR(var) = %s\n", wine_dbgstr_w(V_BSTR(&var
)));
964 hres
= dispex_propput(obj
, id
, 0, &var
);
965 ok(hres
== E_NOTIMPL
, "InvokeEx failed: %08x\n", hres
);
967 IDispatchEx_Release(dispex
);
970 static void test_nextdispid(IDispatchEx
*dispex
)
972 DISPID last_id
= DISPID_STARTENUM
, id
, dyn_id
;
977 name
= a2bstr("dynVal");
978 hres
= IDispatchEx_GetDispID(dispex
, name
, fdexNameCaseSensitive
|fdexNameEnsure
, &dyn_id
);
979 ok(hres
== S_OK
, "GetDispID failed: %08x\n", hres
);
982 V_VT(&var
) = VT_EMPTY
;
983 hres
= dispex_propput(dispex
, dyn_id
, 0, &var
);
985 while(last_id
!= dyn_id
) {
986 hres
= IDispatchEx_GetNextDispID(dispex
, fdexEnumAll
, last_id
, &id
);
987 ok(hres
== S_OK
, "GetNextDispID returned: %08x\n", hres
);
988 ok(id
!= DISPID_STARTENUM
, "id == DISPID_STARTENUM\n");
989 ok(id
!= DISPID_IOMNAVIGATOR_TOSTRING
, "id == DISPID_IOMNAVIGATOR_TOSTRING\n");
991 hres
= IDispatchEx_GetMemberName(dispex
, id
, &name
);
992 ok(hres
== S_OK
, "GetMemberName failed: %08x\n", hres
);
995 ok(!strcmp_wa(name
, "dynVal"), "name = %s\n", wine_dbgstr_w(name
));
996 else if(id
== DISPID_IOMNAVIGATOR_PLATFORM
)
997 ok(!strcmp_wa(name
, "platform"), "name = %s\n", wine_dbgstr_w(name
));
1003 hres
= IDispatchEx_GetNextDispID(dispex
, 0, id
, &id
);
1004 ok(hres
== S_FALSE
, "GetNextDispID returned: %08x\n", hres
);
1005 ok(id
== DISPID_STARTENUM
, "id != DISPID_STARTENUM\n");
1008 static void test_global_id(void)
1017 SET_EXPECT(GetScriptDispatch
);
1018 SET_EXPECT(script_divid_d
);
1019 tmp
= a2bstr("divid");
1020 hres
= IDispatchEx_GetDispID(window_dispex
, tmp
, fdexNameCaseSensitive
, &id
);
1021 ok(hres
== S_OK
, "GetDispID failed: %08x\n", hres
);
1023 CHECK_CALLED(GetScriptDispatch
);
1024 CHECK_CALLED(script_divid_d
);
1027 memset(&ei
, 0, sizeof(ei
));
1028 memset(&dp
, 0, sizeof(dp
));
1029 hres
= IDispatchEx_InvokeEx(window_dispex
, id
, 0, DISPATCH_PROPERTYGET
, &dp
, &var
, &ei
, NULL
);
1030 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1031 ok(V_VT(&var
) == VT_DISPATCH
, "V_VT(var) = %d\n", V_VT(&var
));
1035 static HRESULT WINAPI
ActiveScriptParse_ParseScriptText(IActiveScriptParse
*iface
,
1036 LPCOLESTR pstrCode
, LPCOLESTR pstrItemName
, IUnknown
*punkContext
,
1037 LPCOLESTR pstrDelimiter
, CTXARG_T dwSourceContextCookie
, ULONG ulStartingLine
,
1038 DWORD dwFlags
, VARIANT
*pvarResult
, EXCEPINFO
*pexcepinfo
)
1040 IDispatchEx
*document
, *dispex
;
1041 IHTMLWindow2
*window
;
1042 IOmNavigator
*navigator
;
1051 static const WCHAR documentW
[] = {'d','o','c','u','m','e','n','t',0};
1052 static const WCHAR testW
[] = {'t','e','s','t',0};
1053 static const WCHAR funcW
[] = {'f','u','n','c',0};
1055 CHECK_EXPECT(ParseScriptText
);
1057 SET_EXPECT(GetScriptDispatch
);
1059 tmp
= SysAllocString(documentW
);
1060 hres
= IDispatchEx_GetDispID(window_dispex
, tmp
, fdexNameCaseSensitive
, &id
);
1062 ok(hres
== S_OK
, "GetDispID(document) failed: %08x\n", hres
);
1063 ok(id
== DISPID_IHTMLWINDOW2_DOCUMENT
, "id=%x\n", id
);
1065 CHECK_CALLED(GetScriptDispatch
);
1068 memset(&dp
, 0, sizeof(dp
));
1069 memset(&ei
, 0, sizeof(ei
));
1071 hres
= IDispatchEx_InvokeEx(window_dispex
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYGET
, &dp
, &var
, &ei
, NULL
);
1072 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1073 ok(V_VT(&var
) == VT_DISPATCH
, "V_VT(var)=%d\n", V_VT(&var
));
1074 ok(V_DISPATCH(&var
) != NULL
, "V_DISPATCH(&var) == NULL\n");
1076 hres
= IDispatch_QueryInterface(V_DISPATCH(&var
), &IID_IDispatchEx
, (void**)&document
);
1078 ok(hres
== S_OK
, "Could not get DispatchEx: %08x\n", hres
);
1080 tmp
= SysAllocString(testW
);
1081 hres
= IDispatchEx_GetDispID(document
, tmp
, fdexNameCaseSensitive
, &id
);
1082 ok(hres
== DISP_E_UNKNOWNNAME
, "GetDispID(document) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres
);
1083 hres
= IDispatchEx_GetDispID(document
, tmp
, fdexNameCaseSensitive
| fdexNameImplicit
, &id
);
1084 ok(hres
== DISP_E_UNKNOWNNAME
, "GetDispID(document) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres
);
1088 tmp
= SysAllocString(testW
);
1089 hres
= IDispatchEx_GetDispID(document
, tmp
, fdexNameCaseSensitive
|fdexNameEnsure
, &id
);
1091 ok(hres
== S_OK
, "GetDispID(document) failed: %08x\n", hres
);
1092 ok(id
, "id == 0\n");
1096 hres
= dispex_propput(document
, id
, 0, &var
);
1097 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1099 tmp
= SysAllocString(testW
);
1100 hres
= IDispatchEx_GetDispID(document
, tmp
, fdexNameCaseSensitive
, &id
);
1102 ok(hres
== S_OK
, "GetDispID(document) failed: %08x\n", hres
);
1105 memset(&dp
, 0, sizeof(dp
));
1106 memset(&ei
, 0, sizeof(ei
));
1107 hres
= IDispatchEx_InvokeEx(document
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYGET
, &dp
, &var
, &ei
, NULL
);
1108 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1109 ok(V_VT(&var
) == VT_I4
, "V_VT(var)=%d\n", V_VT(&var
));
1110 ok(V_I4(&var
) == 100, "V_I4(&var) = %d\n", V_I4(&var
));
1114 hres
= dispex_propput(document
, id
, DISPATCH_PROPERTYPUTREF
, &var
);
1115 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1118 memset(&dp
, 0, sizeof(dp
));
1119 memset(&ei
, 0, sizeof(ei
));
1120 hres
= IDispatchEx_InvokeEx(document
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYGET
, &dp
, &var
, &ei
, NULL
);
1121 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1122 ok(V_VT(&var
) == VT_I4
, "V_VT(var)=%d\n", V_VT(&var
));
1123 ok(V_I4(&var
) == 200, "V_I4(&var) = %d\n", V_I4(&var
));
1125 memset(&dp
, 0, sizeof(dp
));
1126 memset(&ei
, 0, sizeof(ei
));
1131 hres
= IDispatchEx_InvokeEx(document
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYPUT
, &dp
, NULL
, &ei
, NULL
);
1132 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1135 memset(&dp
, 0, sizeof(dp
));
1136 memset(&ei
, 0, sizeof(ei
));
1137 hres
= IDispatchEx_InvokeEx(document
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYGET
, &dp
, &var
, &ei
, NULL
);
1138 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1139 ok(V_VT(&var
) == VT_I4
, "V_VT(var)=%d\n", V_VT(&var
));
1140 ok(V_I4(&var
) == 300, "V_I4(&var) = %d\n", V_I4(&var
));
1142 unk
= (void*)0xdeadbeef;
1143 hres
= IDispatchEx_GetNameSpaceParent(window_dispex
, &unk
);
1144 ok(hres
== S_OK
, "GetNameSpaceParent failed: %08x\n", hres
);
1145 ok(!unk
, "unk=%p, expected NULL\n", unk
);
1148 tmp
= SysAllocString(funcW
);
1149 hres
= IDispatchEx_GetDispID(document
, tmp
, fdexNameCaseSensitive
|fdexNameEnsure
, &id
);
1151 ok(hres
== S_OK
, "GetDispID(func) failed: %08x\n", hres
);
1152 ok(id
, "id == 0\n");
1157 dp
.rgdispidNamedArgs
= NULL
;
1158 V_VT(&var
) = VT_DISPATCH
;
1159 V_DISPATCH(&var
) = (IDispatch
*)&funcDisp
;
1160 hres
= IDispatchEx_InvokeEx(document
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYPUT
, &dp
, NULL
, &ei
, NULL
);
1161 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1164 memset(&dp
, 0, sizeof(dp
));
1165 memset(&ei
, 0, sizeof(ei
));
1166 V_VT(&arg
) = VT_BOOL
;
1167 V_BOOL(&arg
) = VARIANT_TRUE
;
1171 SET_EXPECT(funcDisp
);
1172 hres
= IDispatchEx_InvokeEx(document
, id
, LOCALE_NEUTRAL
, INVOKE_FUNC
, &dp
, &var
, &ei
, NULL
);
1173 CHECK_CALLED(funcDisp
);
1175 ok(hres
== S_OK
, "InvokeEx(INVOKE_FUNC) failed: %08x\n", hres
);
1176 ok(V_VT(&var
) == VT_I4
, "V_VT(var)=%d\n", V_VT(&var
));
1177 ok(V_I4(&var
) == 100, "V_I4(&var) == NULL\n");
1179 IDispatchEx_Release(document
);
1181 hres
= IDispatchEx_QueryInterface(window_dispex
, &IID_IHTMLWindow2
, (void**)&window
);
1182 ok(hres
== S_OK
, "Could not get IHTMLWindow2 iface: %08x\n", hres
);
1184 hres
= IHTMLWindow2_get_navigator(window
, &navigator
);
1185 IHTMLWindow2_Release(window
);
1186 ok(hres
== S_OK
, "get_navigator failed: %08x\n", hres
);
1188 hres
= IOmNavigator_QueryInterface(navigator
, &IID_IDispatchEx
, (void**)&dispex
);
1189 IOmNavigator_Release(navigator
);
1190 ok(hres
== S_OK
, "Could not get IDispatchEx iface: %08x\n", hres
);
1193 test_nextdispid(dispex
);
1194 IDispatchEx_Release(dispex
);
1196 script_disp
= (IDispatch
*)&scriptDisp
;
1198 SET_EXPECT(GetScriptDispatch
);
1199 SET_EXPECT(script_testprop_d
);
1200 tmp
= a2bstr("testProp");
1201 hres
= IDispatchEx_GetDispID(window_dispex
, tmp
, fdexNameCaseSensitive
, &id
);
1202 ok(hres
== S_OK
, "GetDispID failed: %08x\n", hres
);
1203 ok(id
!= DISPID_SCRIPT_TESTPROP
, "id == DISPID_SCRIPT_TESTPROP\n");
1204 CHECK_CALLED(GetScriptDispatch
);
1205 CHECK_CALLED(script_testprop_d
);
1208 tmp
= a2bstr("testProp");
1209 hres
= IDispatchEx_GetDispID(window_dispex
, tmp
, fdexNameCaseSensitive
, &id
);
1210 ok(hres
== S_OK
, "GetDispID failed: %08x\n", hres
);
1211 ok(id
!= DISPID_SCRIPT_TESTPROP
, "id == DISPID_SCRIPT_TESTPROP\n");
1214 SET_EXPECT(GetScriptDispatch
);
1215 SET_EXPECT(script_testprop_i
);
1216 memset(&ei
, 0, sizeof(ei
));
1217 memset(&dp
, 0, sizeof(dp
));
1218 hres
= IDispatchEx_InvokeEx(window_dispex
, id
, 0, DISPATCH_PROPERTYGET
, &dp
, &var
, &ei
, NULL
);
1219 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
1220 ok(V_VT(&var
) == VT_NULL
, "V_VT(var) = %d\n", V_VT(&var
));
1221 CHECK_CALLED(GetScriptDispatch
);
1222 CHECK_CALLED(script_testprop_i
);
1224 SET_EXPECT(GetScriptDispatch
);
1225 SET_EXPECT(script_testprop2_d
);
1226 tmp
= a2bstr("testProp2");
1227 hres
= IDispatchEx_GetDispID(window_dispex
, tmp
, fdexNameCaseSensitive
|fdexNameEnsure
, &id
);
1228 ok(hres
== S_OK
, "GetDispID failed: %08x\n", hres
);
1229 ok(id
!= DISPID_SCRIPT_TESTPROP2
, "id == DISPID_SCRIPT_TESTPROP2\n");
1230 CHECK_CALLED(GetScriptDispatch
);
1231 CHECK_CALLED(script_testprop2_d
);
1241 static const IActiveScriptParseVtbl ActiveScriptParseVtbl
= {
1242 ActiveScriptParse_QueryInterface
,
1243 ActiveScriptParse_AddRef
,
1244 ActiveScriptParse_Release
,
1245 ActiveScriptParse_InitNew
,
1246 ActiveScriptParse_AddScriptlet
,
1247 ActiveScriptParse_ParseScriptText
1250 static IActiveScriptParse ActiveScriptParse
= { &ActiveScriptParseVtbl
};
1252 static HRESULT WINAPI
ActiveScript_QueryInterface(IActiveScript
*iface
, REFIID riid
, void **ppv
)
1256 if(IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IActiveScript
, riid
)) {
1261 if(IsEqualGUID(&IID_IActiveScriptParse
, riid
)) {
1262 *ppv
= &ActiveScriptParse
;
1266 if(IsEqualGUID(&IID_IActiveScriptParseProcedure2
, riid
)) {
1267 *ppv
= &ActiveScriptParseProcedure
;
1271 if(IsEqualGUID(&IID_IActiveScriptProperty
, riid
)) {
1272 *ppv
= &ActiveScriptProperty
;
1276 if(IsEqualGUID(&IID_IObjectSafety
, riid
)) {
1277 *ppv
= &ObjectSafety
;
1281 if(IsEqualGUID(&IID_IActiveScriptDebug
, riid
))
1282 return E_NOINTERFACE
;
1284 ok(0, "unexpected riid %s\n", debugstr_guid(riid
));
1285 return E_NOINTERFACE
;
1288 static ULONG WINAPI
ActiveScript_AddRef(IActiveScript
*iface
)
1293 static ULONG WINAPI
ActiveScript_Release(IActiveScript
*iface
)
1298 static HRESULT WINAPI
ActiveScript_SetScriptSite(IActiveScript
*iface
, IActiveScriptSite
*pass
)
1300 IActiveScriptSiteInterruptPoll
*poll
;
1301 IActiveScriptSiteDebug
*debug
;
1302 IServiceProvider
*service
;
1303 ICanHandleException
*canexpection
;
1307 CHECK_EXPECT(SetScriptSite
);
1309 ok(pass
!= NULL
, "pass == NULL\n");
1311 hres
= IActiveScriptSite_QueryInterface(pass
, &IID_IActiveScriptSiteInterruptPoll
, (void**)&poll
);
1312 ok(hres
== S_OK
, "Could not get IActiveScriptSiteInterruptPoll interface: %08x\n", hres
);
1314 IActiveScriptSiteInterruptPoll_Release(poll
);
1316 hres
= IActiveScriptSite_GetLCID(pass
, &lcid
);
1317 ok(hres
== S_OK
, "GetLCID failed: %08x\n", hres
);
1319 hres
= IActiveScriptSite_OnStateChange(pass
, (state
= SCRIPTSTATE_INITIALIZED
));
1320 ok(hres
== S_OK
, "OnStateChange failed: %08x\n", hres
);
1322 hres
= IActiveScriptSite_QueryInterface(pass
, &IID_IActiveScriptSiteDebug
, (void**)&debug
);
1323 ok(hres
== S_OK
, "Could not get IActiveScriptSiteDebug interface: %08x\n", hres
);
1325 IActiveScriptSiteDebug32_Release(debug
);
1327 hres
= IActiveScriptSite_QueryInterface(pass
, &IID_ICanHandleException
, (void**)&canexpection
);
1328 ok(hres
== E_NOINTERFACE
, "Could not get IID_ICanHandleException interface: %08x\n", hres
);
1330 hres
= IActiveScriptSite_QueryInterface(pass
, &IID_IServiceProvider
, (void**)&service
);
1331 ok(hres
== S_OK
, "Could not get IServiceProvider interface: %08x\n", hres
);
1333 IServiceProvider_Release(service
);
1336 IActiveScriptSite_AddRef(site
);
1340 static HRESULT WINAPI
ActiveScript_GetScriptSite(IActiveScript
*iface
, REFIID riid
,
1343 ok(0, "unexpected call\n");
1347 static HRESULT WINAPI
ActiveScript_SetScriptState(IActiveScript
*iface
, SCRIPTSTATE ss
)
1352 case SCRIPTSTATE_STARTED
:
1353 CHECK_EXPECT(SetScriptState_STARTED
);
1355 case SCRIPTSTATE_CONNECTED
:
1356 CHECK_EXPECT(SetScriptState_CONNECTED
);
1358 case SCRIPTSTATE_DISCONNECTED
:
1359 CHECK_EXPECT(SetScriptState_DISCONNECTED
);
1362 ok(0, "unexpected state %d\n", ss
);
1366 hres
= IActiveScriptSite_OnStateChange(site
, (state
= ss
));
1370 static HRESULT WINAPI
ActiveScript_GetScriptState(IActiveScript
*iface
, SCRIPTSTATE
*pssState
)
1372 CHECK_EXPECT(GetScriptState
);
1378 static HRESULT WINAPI
ActiveScript_Close(IActiveScript
*iface
)
1380 CHECK_EXPECT(Close
);
1384 static HRESULT WINAPI
ActiveScript_AddNamedItem(IActiveScript
*iface
,
1385 LPCOLESTR pstrName
, DWORD dwFlags
)
1388 IUnknown
*unk
= NULL
, *unk2
;
1391 static const WCHAR windowW
[] = {'w','i','n','d','o','w',0};
1393 static const IID unknown_iid
= {0x719C3050,0xF9D3,0x11CF,{0xA4,0x93,0x00,0x40,0x05,0x23,0xA8,0xA0}};
1395 CHECK_EXPECT(AddNamedItem
);
1397 ok(!lstrcmpW(pstrName
, windowW
), "pstrName=%s\n", wine_dbgstr_w(pstrName
));
1398 ok(dwFlags
== (SCRIPTITEM_ISVISIBLE
|SCRIPTITEM_ISSOURCE
|SCRIPTITEM_GLOBALMEMBERS
), "dwFlags=%x\n", dwFlags
);
1400 hres
= IActiveScriptSite_GetItemInfo(site
, windowW
, SCRIPTINFO_IUNKNOWN
, &unk
, NULL
);
1401 ok(hres
== S_OK
, "GetItemInfo failed: %08x\n", hres
);
1402 ok(unk
!= NULL
, "unk == NULL\n");
1404 hres
= IUnknown_QueryInterface(unk
, &IID_IDispatch
, (void**)&disp
);
1405 ok(hres
== S_OK
, "Could not get IDispatch interface: %08x\n", hres
);
1407 IDispatch_Release(disp
);
1409 hres
= IUnknown_QueryInterface(unk
, &unknown_iid
, (void**)&unk2
);
1410 ok(hres
== E_NOINTERFACE
, "Got ?? interface: %p\n", unk2
);
1412 IUnknown_Release(unk2
);
1414 hres
= IUnknown_QueryInterface(unk
, &IID_IDispatchEx
, (void**)&window_dispex
);
1415 ok(hres
== S_OK
, "Could not get IDispatchEx interface: %08x\n", hres
);
1417 IUnknown_Release(unk
);
1421 static HRESULT WINAPI
ActiveScript_AddTypeLib(IActiveScript
*iface
, REFGUID rguidTypeLib
,
1422 DWORD dwMajor
, DWORD dwMinor
, DWORD dwFlags
)
1424 ok(0, "unexpected call\n");
1428 static HRESULT WINAPI
ActiveScript_GetScriptDispatch(IActiveScript
*iface
, LPCOLESTR pstrItemName
,
1431 CHECK_EXPECT(GetScriptDispatch
);
1433 ok(!strcmp_wa(pstrItemName
, "window"), "pstrItemName = %s\n", wine_dbgstr_w(pstrItemName
));
1438 *ppdisp
= script_disp
;
1442 static HRESULT WINAPI
ActiveScript_GetCurrentScriptThreadID(IActiveScript
*iface
,
1443 SCRIPTTHREADID
*pstridThread
)
1445 ok(0, "unexpected call\n");
1449 static HRESULT WINAPI
ActiveScript_GetScriptThreadID(IActiveScript
*iface
,
1450 DWORD dwWin32ThreadId
, SCRIPTTHREADID
*pstidThread
)
1452 ok(0, "unexpected call\n");
1456 static HRESULT WINAPI
ActiveScript_GetScriptThreadState(IActiveScript
*iface
,
1457 SCRIPTTHREADID stidThread
, SCRIPTTHREADSTATE
*pstsState
)
1459 ok(0, "unexpected call\n");
1463 static HRESULT WINAPI
ActiveScript_InterruptScriptThread(IActiveScript
*iface
,
1464 SCRIPTTHREADID stidThread
, const EXCEPINFO
*pexcepinfo
, DWORD dwFlags
)
1466 ok(0, "unexpected call\n");
1470 static HRESULT WINAPI
ActiveScript_Clone(IActiveScript
*iface
, IActiveScript
**ppscript
)
1472 ok(0, "unexpected call\n");
1476 static const IActiveScriptVtbl ActiveScriptVtbl
= {
1477 ActiveScript_QueryInterface
,
1478 ActiveScript_AddRef
,
1479 ActiveScript_Release
,
1480 ActiveScript_SetScriptSite
,
1481 ActiveScript_GetScriptSite
,
1482 ActiveScript_SetScriptState
,
1483 ActiveScript_GetScriptState
,
1485 ActiveScript_AddNamedItem
,
1486 ActiveScript_AddTypeLib
,
1487 ActiveScript_GetScriptDispatch
,
1488 ActiveScript_GetCurrentScriptThreadID
,
1489 ActiveScript_GetScriptThreadID
,
1490 ActiveScript_GetScriptThreadState
,
1491 ActiveScript_InterruptScriptThread
,
1495 static IActiveScript ActiveScript
= { &ActiveScriptVtbl
};
1497 static HRESULT WINAPI
ClassFactory_QueryInterface(IClassFactory
*iface
, REFIID riid
, void **ppv
)
1501 if(IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IClassFactory
, riid
)) {
1506 if(IsEqualGUID(&IID_IMarshal
, riid
))
1507 return E_NOINTERFACE
;
1508 if(IsEqualGUID(&CLSID_IdentityUnmarshal
, riid
))
1509 return E_NOINTERFACE
;
1511 ok(0, "unexpected riid %s\n", debugstr_guid(riid
));
1515 static ULONG WINAPI
ClassFactory_AddRef(IClassFactory
*iface
)
1520 static ULONG WINAPI
ClassFactory_Release(IClassFactory
*iface
)
1525 static HRESULT WINAPI
ClassFactory_CreateInstance(IClassFactory
*iface
, IUnknown
*outer
, REFIID riid
, void **ppv
)
1527 CHECK_EXPECT(CreateInstance
);
1529 ok(!outer
, "outer = %p\n", outer
);
1530 ok(IsEqualGUID(&IID_IActiveScript
, riid
), "unexpected riid %s\n", debugstr_guid(riid
));
1531 *ppv
= &ActiveScript
;
1535 static HRESULT WINAPI
ClassFactory_LockServer(IClassFactory
*iface
, BOOL dolock
)
1537 ok(0, "unexpected call\n");
1541 static const IClassFactoryVtbl ClassFactoryVtbl
= {
1542 ClassFactory_QueryInterface
,
1543 ClassFactory_AddRef
,
1544 ClassFactory_Release
,
1545 ClassFactory_CreateInstance
,
1546 ClassFactory_LockServer
1549 static IClassFactory script_cf
= { &ClassFactoryVtbl
};
1551 static const char simple_script_str
[] =
1552 "<html><head></head><body>"
1553 "<div id=\"divid\"></div>"
1554 "<script language=\"TestScript\">simple script</script>"
1557 static void test_simple_script(void)
1559 IHTMLDocument2
*doc
;
1561 SET_EXPECT(CreateInstance
);
1562 SET_EXPECT(GetInterfaceSafetyOptions
);
1563 SET_EXPECT(SetInterfaceSafetyOptions
);
1564 SET_EXPECT(SetProperty_INVOKEVERSIONING
); /* IE8 */
1565 SET_EXPECT(SetProperty_HACK_TRIDENTEVENTSINK
);
1566 SET_EXPECT(InitNew
);
1567 SET_EXPECT(SetScriptSite
);
1568 SET_EXPECT(GetScriptState
);
1569 SET_EXPECT(SetScriptState_STARTED
);
1570 SET_EXPECT(AddNamedItem
);
1571 SET_EXPECT(SetProperty_ABBREVIATE_GLOBALNAME_RESOLUTION
); /* IE8 */
1572 SET_EXPECT(ParseScriptText
);
1573 SET_EXPECT(SetScriptState_CONNECTED
);
1575 doc
= create_and_load_doc(simple_script_str
);
1578 CHECK_CALLED(CreateInstance
);
1579 CHECK_CALLED(GetInterfaceSafetyOptions
);
1580 CHECK_CALLED(SetInterfaceSafetyOptions
);
1581 CHECK_CALLED_BROKEN(SetProperty_INVOKEVERSIONING
); /* IE8 */
1582 CHECK_CALLED(SetProperty_HACK_TRIDENTEVENTSINK
);
1583 CHECK_CALLED(InitNew
);
1584 CHECK_CALLED(SetScriptSite
);
1585 CHECK_CALLED(GetScriptState
);
1586 CHECK_CALLED(SetScriptState_STARTED
);
1587 CHECK_CALLED(AddNamedItem
);
1588 CHECK_CALLED_BROKEN(SetProperty_ABBREVIATE_GLOBALNAME_RESOLUTION
); /* IE8 */
1589 CHECK_CALLED(ParseScriptText
);
1590 CHECK_CALLED(SetScriptState_CONNECTED
);
1593 IActiveScriptSite_Release(site
);
1595 IDispatchEx_Release(window_dispex
);
1597 SET_EXPECT(SetScriptState_DISCONNECTED
);
1600 IHTMLDocument2_Release(doc
);
1602 CHECK_CALLED(SetScriptState_DISCONNECTED
);
1603 CHECK_CALLED(Close
);
1606 static BOOL
init_registry(BOOL init
)
1608 return init_key("TestScript\\CLSID", TESTSCRIPT_CLSID
, init
)
1609 && init_key("CLSID\\"TESTSCRIPT_CLSID
"\\Implemented Categories\\{F0B7A1A1-9847-11CF-8F20-00805F2CD064}",
1611 && init_key("CLSID\\"TESTSCRIPT_CLSID
"\\Implemented Categories\\{F0B7A1A2-9847-11CF-8F20-00805F2CD064}",
1615 static BOOL
register_script_engine(void)
1620 if(!init_registry(TRUE
)) {
1621 init_registry(FALSE
);
1625 hres
= CoRegisterClassObject(&CLSID_TestScript
, (IUnknown
*)&script_cf
,
1626 CLSCTX_INPROC_SERVER
, REGCLS_MULTIPLEUSE
, ®id
);
1627 ok(hres
== S_OK
, "Could not register screipt engine: %08x\n", hres
);
1636 if(winetest_interactive
|| ! is_ie_hardened()) {
1637 if(register_script_engine()) {
1638 test_simple_script();
1639 init_registry(FALSE
);
1641 skip("Could not register TestScript engine\n");
1644 skip("IE running in Enhanced Security Configuration\n");