2 * Copyright 2008 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>
37 DEFINE_GUID(CLSID_IdentityUnmarshal
,0x0000001b,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
41 #define CTXARG_T DWORDLONG
42 #define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
46 #define CTXARG_T DWORD
47 #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
51 #define DEFINE_EXPECT(func) \
52 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
54 #define SET_EXPECT(func) \
55 do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
57 #define CHECK_EXPECT2(func) \
59 ok(expect_ ##func, "unexpected call " #func "\n"); \
60 called_ ## func = TRUE; \
63 #define CHECK_EXPECT(func) \
65 CHECK_EXPECT2(func); \
66 expect_ ## func = FALSE; \
69 #define CHECK_CALLED(func) \
71 ok(called_ ## func, "expected " #func "\n"); \
72 expect_ ## func = called_ ## func = FALSE; \
75 #define CHECK_NOT_CALLED(func) \
77 ok(!called_ ## func, "unexpected " #func "\n"); \
78 expect_ ## func = called_ ## func = FALSE; \
81 #define CLEAR_CALLED(func) \
82 expect_ ## func = called_ ## func = FALSE
85 DEFINE_EXPECT(CreateInstance
);
86 DEFINE_EXPECT(GetInterfaceSafetyOptions
);
87 DEFINE_EXPECT(SetInterfaceSafetyOptions
);
88 DEFINE_EXPECT(InitNew
);
90 DEFINE_EXPECT(SetProperty
);
91 DEFINE_EXPECT(SetScriptSite
);
92 DEFINE_EXPECT(GetScriptState
);
93 DEFINE_EXPECT(SetScriptState_STARTED
);
94 DEFINE_EXPECT(SetScriptState_CONNECTED
);
95 DEFINE_EXPECT(SetScriptState_DISCONNECTED
);
96 DEFINE_EXPECT(AddNamedItem
);
97 DEFINE_EXPECT(ParseScriptText
);
98 DEFINE_EXPECT(GetScriptDispatch
);
99 DEFINE_EXPECT(funcDisp
);
101 #define TESTSCRIPT_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80746}"
103 static const GUID CLSID_TestScript
=
104 {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x07,0x46}};
106 static IHTMLDocument2
*notif_doc
;
107 static IDispatchEx
*window_dispex
;
108 static BOOL doc_complete
;
110 static const char *debugstr_w(LPCWSTR str
)
112 static char buf
[1024];
113 WideCharToMultiByte(CP_ACP
, 0, str
, -1, buf
, sizeof(buf
), NULL
, NULL
);
117 static const char *debugstr_guid(REFIID riid
)
121 sprintf(buf
, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
122 riid
->Data1
, riid
->Data2
, riid
->Data3
, riid
->Data4
[0],
123 riid
->Data4
[1], riid
->Data4
[2], riid
->Data4
[3], riid
->Data4
[4],
124 riid
->Data4
[5], riid
->Data4
[6], riid
->Data4
[7]);
129 static HRESULT WINAPI
PropertyNotifySink_QueryInterface(IPropertyNotifySink
*iface
,
130 REFIID riid
, void**ppv
)
132 if(IsEqualGUID(&IID_IPropertyNotifySink
, riid
)) {
137 return E_NOINTERFACE
;
140 static ULONG WINAPI
PropertyNotifySink_AddRef(IPropertyNotifySink
*iface
)
145 static ULONG WINAPI
PropertyNotifySink_Release(IPropertyNotifySink
*iface
)
150 static HRESULT WINAPI
PropertyNotifySink_OnChanged(IPropertyNotifySink
*iface
, DISPID dispID
)
152 if(dispID
== DISPID_READYSTATE
){
156 static const WCHAR completeW
[] = {'c','o','m','p','l','e','t','e',0};
158 hres
= IHTMLDocument2_get_readyState(notif_doc
, &state
);
159 ok(hres
== S_OK
, "get_readyState failed: %08x\n", hres
);
161 if(!lstrcmpW(state
, completeW
))
164 SysFreeString(state
);
170 static HRESULT WINAPI
PropertyNotifySink_OnRequestEdit(IPropertyNotifySink
*iface
, DISPID dispID
)
172 ok(0, "unexpected call\n");
176 static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl
= {
177 PropertyNotifySink_QueryInterface
,
178 PropertyNotifySink_AddRef
,
179 PropertyNotifySink_Release
,
180 PropertyNotifySink_OnChanged
,
181 PropertyNotifySink_OnRequestEdit
184 static IPropertyNotifySink PropertyNotifySink
= { &PropertyNotifySinkVtbl
};
186 static HRESULT WINAPI
DispatchEx_QueryInterface(IDispatchEx
*iface
, REFIID riid
, void **ppv
)
190 if(IsEqualGUID(riid
, &IID_IUnknown
)
191 || IsEqualGUID(riid
, &IID_IDispatch
)
192 || IsEqualGUID(riid
, &IID_IDispatchEx
))
195 return E_NOINTERFACE
;
200 static ULONG WINAPI
DispatchEx_AddRef(IDispatchEx
*iface
)
205 static ULONG WINAPI
DispatchEx_Release(IDispatchEx
*iface
)
210 static HRESULT WINAPI
DispatchEx_GetTypeInfoCount(IDispatchEx
*iface
, UINT
*pctinfo
)
212 ok(0, "unexpected call\n");
216 static HRESULT WINAPI
DispatchEx_GetTypeInfo(IDispatchEx
*iface
, UINT iTInfo
,
217 LCID lcid
, ITypeInfo
**ppTInfo
)
219 ok(0, "unexpected call\n");
223 static HRESULT WINAPI
DispatchEx_GetIDsOfNames(IDispatchEx
*iface
, REFIID riid
,
224 LPOLESTR
*rgszNames
, UINT cNames
,
225 LCID lcid
, DISPID
*rgDispId
)
227 ok(0, "unexpected call\n");
231 static HRESULT WINAPI
DispatchEx_Invoke(IDispatchEx
*iface
, DISPID dispIdMember
,
232 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
233 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
235 ok(0, "unexpected call\n");
239 static HRESULT WINAPI
DispatchEx_DeleteMemberByName(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
)
241 ok(0, "unexpected call %s %x\n", debugstr_w(bstrName
), grfdex
);
245 static HRESULT WINAPI
DispatchEx_DeleteMemberByDispID(IDispatchEx
*iface
, DISPID id
)
247 ok(0, "unexpected call\n");
251 static HRESULT WINAPI
DispatchEx_GetMemberProperties(IDispatchEx
*iface
, DISPID id
, DWORD grfdexFetch
, DWORD
*pgrfdex
)
253 ok(0, "unexpected call\n");
257 static HRESULT WINAPI
DispatchEx_GetMemberName(IDispatchEx
*iface
, DISPID id
, BSTR
*pbstrName
)
259 ok(0, "unexpected call\n");
263 static HRESULT WINAPI
DispatchEx_GetNextDispID(IDispatchEx
*iface
, DWORD grfdex
, DISPID id
, DISPID
*pid
)
265 ok(0, "unexpected call\n");
269 static HRESULT WINAPI
DispatchEx_GetNameSpaceParent(IDispatchEx
*iface
, IUnknown
**ppunk
)
271 ok(0, "unexpected call\n");
275 static HRESULT WINAPI
DispatchEx_GetDispID(IDispatchEx
*iface
, BSTR bstrName
, DWORD grfdex
, DISPID
*pid
)
277 ok(0, "unexpected call\n");
281 static HRESULT WINAPI
funcDisp_InvokeEx(IDispatchEx
*iface
, DISPID id
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pdp
,
282 VARIANT
*pvarRes
, EXCEPINFO
*pei
, IServiceProvider
*pspCaller
)
284 CHECK_EXPECT(funcDisp
);
286 ok(id
== DISPID_VALUE
, "id = %d\n", id
);
287 ok(lcid
== 0, "lcid = %x\n", lcid
);
288 ok(wFlags
== DISPATCH_METHOD
, "wFlags = %x\n", wFlags
);
289 ok(pdp
!= NULL
, "pdp == NULL\n");
290 ok(pdp
->cArgs
== 2, "pdp->cArgs = %d\n", pdp
->cArgs
);
291 ok(pdp
->cNamedArgs
== 1, "pdp->cNamedArgs = %d\n", pdp
->cNamedArgs
);
292 ok(pdp
->rgdispidNamedArgs
[0] == DISPID_THIS
, "pdp->rgdispidNamedArgs[0] = %d\n", pdp
->rgdispidNamedArgs
[0]);
293 ok(V_VT(pdp
->rgvarg
) == VT_DISPATCH
, "V_VT(rgvarg) = %d\n", V_VT(pdp
->rgvarg
));
294 ok(V_VT(pdp
->rgvarg
+1) == VT_BOOL
, "V_VT(rgvarg[1]) = %d\n", V_VT(pdp
->rgvarg
));
295 ok(V_BOOL(pdp
->rgvarg
+1) == VARIANT_TRUE
, "V_BOOL(rgvarg[1]) = %x\n", V_BOOL(pdp
->rgvarg
));
296 ok(pvarRes
!= NULL
, "pvarRes == NULL\n");
297 ok(pei
!= NULL
, "pei == NULL\n");
298 ok(!pspCaller
, "pspCaller != NULL\n");
300 V_VT(pvarRes
) = VT_I4
;
305 static IDispatchExVtbl testObjVtbl
= {
306 DispatchEx_QueryInterface
,
309 DispatchEx_GetTypeInfoCount
,
310 DispatchEx_GetTypeInfo
,
311 DispatchEx_GetIDsOfNames
,
313 DispatchEx_GetDispID
,
315 DispatchEx_DeleteMemberByName
,
316 DispatchEx_DeleteMemberByDispID
,
317 DispatchEx_GetMemberProperties
,
318 DispatchEx_GetMemberName
,
319 DispatchEx_GetNextDispID
,
320 DispatchEx_GetNameSpaceParent
323 static IDispatchEx funcDisp
= { &testObjVtbl
};
325 static IHTMLDocument2
*create_document(void)
330 hres
= CoCreateInstance(&CLSID_HTMLDocument
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
331 &IID_IHTMLDocument2
, (void**)&doc
);
332 ok(hres
== S_OK
, "CoCreateInstance failed: %08x\n", hres
);
337 static IHTMLDocument2
*create_doc_with_string(const char *str
)
339 IPersistStreamInit
*init
;
345 notif_doc
= doc
= create_document();
349 doc_complete
= FALSE
;
351 mem
= GlobalAlloc(0, len
);
352 memcpy(mem
, str
, len
);
353 CreateStreamOnHGlobal(mem
, TRUE
, &stream
);
355 IHTMLDocument2_QueryInterface(doc
, &IID_IPersistStreamInit
, (void**)&init
);
357 IPersistStreamInit_Load(init
, stream
);
358 IPersistStreamInit_Release(init
);
359 IStream_Release(stream
);
364 static void do_advise(IUnknown
*unk
, REFIID riid
, IUnknown
*unk_advise
)
366 IConnectionPointContainer
*container
;
367 IConnectionPoint
*cp
;
371 hres
= IUnknown_QueryInterface(unk
, &IID_IConnectionPointContainer
, (void**)&container
);
372 ok(hres
== S_OK
, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres
);
374 hres
= IConnectionPointContainer_FindConnectionPoint(container
, riid
, &cp
);
375 IConnectionPointContainer_Release(container
);
376 ok(hres
== S_OK
, "FindConnectionPoint failed: %08x\n", hres
);
378 hres
= IConnectionPoint_Advise(cp
, unk_advise
, &cookie
);
379 IConnectionPoint_Release(cp
);
380 ok(hres
== S_OK
, "Advise failed: %08x\n", hres
);
383 typedef void (*domtest_t
)(IHTMLDocument2
*);
385 static IHTMLDocument2
*create_and_load_doc(const char *str
)
388 IHTMLElement
*body
= NULL
;
392 static const WCHAR ucPtr
[] = {'b','a','c','k','g','r','o','u','n','d',0};
397 doc
= create_doc_with_string(str
);
398 do_advise((IUnknown
*)doc
, &IID_IPropertyNotifySink
, (IUnknown
*)&PropertyNotifySink
);
400 while(!doc_complete
&& GetMessage(&msg
, NULL
, 0, 0)) {
401 TranslateMessage(&msg
);
402 DispatchMessage(&msg
);
405 hres
= IHTMLDocument2_get_body(doc
, &body
);
406 ok(hres
== S_OK
, "get_body failed: %08x\n", hres
);
409 skip("Could not get document body. Assuming no Gecko installed.\n");
410 ref
= IHTMLDocument2_Release(doc
);
411 ok(!ref
, "ref = %d\n", ref
);
415 /* Check we can query for function on the IHTMLElementBody interface */
416 name
= (WCHAR
*)ucPtr
;
417 hres
= IHTMLElement_GetIDsOfNames(body
, &IID_NULL
, &name
, 1, LOCALE_USER_DEFAULT
, &dispID
);
418 ok(hres
== S_OK
, "GetIDsOfNames(background) failed %08x\n", hres
);
419 ok(dispID
== DISPID_IHTMLBODYELEMENT_BACKGROUND
, "Incorrect dispID got (%d)\n", dispID
);
421 IHTMLElement_Release(body
);
425 static IActiveScriptSite
*site
;
426 static SCRIPTSTATE state
;
428 static HRESULT WINAPI
ObjectSafety_QueryInterface(IObjectSafety
*iface
, REFIID riid
, void **ppv
)
431 ok(0, "unexpected call\n");
432 return E_NOINTERFACE
;
435 static ULONG WINAPI
ObjectSafety_AddRef(IObjectSafety
*iface
)
440 static ULONG WINAPI
ObjectSafety_Release(IObjectSafety
*iface
)
445 static HRESULT WINAPI
ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
446 DWORD
*pdwSupportedOptions
, DWORD
*pdwEnabledOptions
)
448 CHECK_EXPECT(GetInterfaceSafetyOptions
);
450 ok(IsEqualGUID(&IID_IActiveScriptParse
, riid
), "unexpected riid %s\n", debugstr_guid(riid
));
451 ok(pdwSupportedOptions
!= NULL
, "pdwSupportedOptions == NULL\n");
452 ok(pdwEnabledOptions
!= NULL
, "pdwEnabledOptions == NULL\n");
454 *pdwSupportedOptions
= INTERFACESAFE_FOR_UNTRUSTED_DATA
|INTERFACE_USES_DISPEX
|INTERFACE_USES_SECURITY_MANAGER
;
455 *pdwEnabledOptions
= INTERFACE_USES_DISPEX
;
460 static HRESULT WINAPI
ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety
*iface
, REFIID riid
,
461 DWORD dwOptionSetMask
, DWORD dwEnabledOptions
)
463 CHECK_EXPECT(SetInterfaceSafetyOptions
);
465 ok(IsEqualGUID(&IID_IActiveScriptParse
, riid
), "unexpected riid %s\n", debugstr_guid(riid
));
467 ok(dwOptionSetMask
== (INTERFACESAFE_FOR_UNTRUSTED_DATA
|INTERFACE_USES_DISPEX
|INTERFACE_USES_SECURITY_MANAGER
),
468 "dwOptionSetMask=%x\n", dwOptionSetMask
);
469 ok(dwEnabledOptions
== (INTERFACESAFE_FOR_UNTRUSTED_DATA
|INTERFACE_USES_DISPEX
|INTERFACE_USES_SECURITY_MANAGER
),
470 "dwEnabledOptions=%x\n", dwOptionSetMask
);
475 static const IObjectSafetyVtbl ObjectSafetyVtbl
= {
476 ObjectSafety_QueryInterface
,
478 ObjectSafety_Release
,
479 ObjectSafety_GetInterfaceSafetyOptions
,
480 ObjectSafety_SetInterfaceSafetyOptions
483 static IObjectSafety ObjectSafety
= { &ObjectSafetyVtbl
};
485 static HRESULT WINAPI
ActiveScriptProperty_QueryInterface(IActiveScriptProperty
*iface
, REFIID riid
, void **ppv
)
488 ok(0, "unexpected call\n");
489 return E_NOINTERFACE
;
492 static ULONG WINAPI
ActiveScriptProperty_AddRef(IActiveScriptProperty
*iface
)
497 static ULONG WINAPI
ActiveScriptProperty_Release(IActiveScriptProperty
*iface
)
502 static HRESULT WINAPI
ActiveScriptProperty_GetProperty(IActiveScriptProperty
*iface
, DWORD dwProperty
,
503 VARIANT
*pvarIndex
, VARIANT
*pvarValue
)
505 ok(0, "unexpected call\n");
509 static HRESULT WINAPI
ActiveScriptProperty_SetProperty(IActiveScriptProperty
*iface
, DWORD dwProperty
,
510 VARIANT
*pvarIndex
, VARIANT
*pvarValue
)
512 CHECK_EXPECT(SetProperty
);
514 ok(dwProperty
== SCRIPTPROP_HACK_TRIDENTEVENTSINK
, "unexpected property %d\n", dwProperty
);
515 ok(!pvarIndex
, "pvarIndex != NULL\n");
516 ok(pvarValue
!= NULL
, "pvarValue == NULL\n");
517 ok(V_VT(pvarValue
) == VT_BOOL
, "V_VT(pvarValue)=%d\n", V_VT(pvarValue
));
518 ok(V_BOOL(pvarValue
) == VARIANT_TRUE
, "V_BOOL(pvarValue)=%x\n", V_BOOL(pvarValue
));
523 static const IActiveScriptPropertyVtbl ActiveScriptPropertyVtbl
= {
524 ActiveScriptProperty_QueryInterface
,
525 ActiveScriptProperty_AddRef
,
526 ActiveScriptProperty_Release
,
527 ActiveScriptProperty_GetProperty
,
528 ActiveScriptProperty_SetProperty
531 static IActiveScriptProperty ActiveScriptProperty
= { &ActiveScriptPropertyVtbl
};
533 static HRESULT WINAPI
ActiveScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2
*iface
, REFIID riid
, void **ppv
)
536 ok(0, "unexpected call\n");
537 return E_NOINTERFACE
;
540 static ULONG WINAPI
ActiveScriptParseProcedure_AddRef(IActiveScriptParseProcedure2
*iface
)
545 static ULONG WINAPI
ActiveScriptParseProcedure_Release(IActiveScriptParseProcedure2
*iface
)
550 static HRESULT WINAPI
ActiveScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2
*iface
,
551 LPCOLESTR pstrCode
, LPCOLESTR pstrFormalParams
, LPCOLESTR pstrProcedureName
,
552 LPCOLESTR pstrItemName
, IUnknown
*punkContext
, LPCOLESTR pstrDelimiter
,
553 DWORD dwSourceContextCookie
, ULONG ulStartingLineNumber
, DWORD dwFlags
, IDispatch
**ppdisp
)
555 ok(0, "unexpected call\n");
559 static const IActiveScriptParseProcedure2Vtbl ActiveScriptParseProcedureVtbl
= {
560 ActiveScriptParseProcedure_QueryInterface
,
561 ActiveScriptParseProcedure_AddRef
,
562 ActiveScriptParseProcedure_Release
,
563 ActiveScriptParseProcedure_ParseProcedureText
566 static IActiveScriptParseProcedure2 ActiveScriptParseProcedure
= { &ActiveScriptParseProcedureVtbl
};
568 static HRESULT WINAPI
ActiveScriptParse_QueryInterface(IActiveScriptParse
*iface
, REFIID riid
, void **ppv
)
571 ok(0, "unexpected call\n");
572 return E_NOINTERFACE
;
575 static ULONG WINAPI
ActiveScriptParse_AddRef(IActiveScriptParse
*iface
)
580 static ULONG WINAPI
ActiveScriptParse_Release(IActiveScriptParse
*iface
)
585 static HRESULT WINAPI
ActiveScriptParse_InitNew(IActiveScriptParse
*iface
)
587 CHECK_EXPECT(InitNew
);
591 static HRESULT WINAPI
ActiveScriptParse_AddScriptlet(IActiveScriptParse
*iface
,
592 LPCOLESTR pstrDefaultName
, LPCOLESTR pstrCode
, LPCOLESTR pstrItemName
,
593 LPCOLESTR pstrSubItemName
, LPCOLESTR pstrEventName
, LPCOLESTR pstrDelimiter
,
594 CTXARG_T dwSourceContextCookie
, ULONG ulStartingLineNumber
, DWORD dwFlags
,
595 BSTR
*pbstrName
, EXCEPINFO
*pexcepinfo
)
597 ok(0, "unexpected call\n");
601 static HRESULT WINAPI
ActiveScriptParse_ParseScriptText(IActiveScriptParse
*iface
,
602 LPCOLESTR pstrCode
, LPCOLESTR pstrItemName
, IUnknown
*punkContext
,
603 LPCOLESTR pstrDelimiter
, CTXARG_T dwSourceContextCookie
, ULONG ulStartingLine
,
604 DWORD dwFlags
, VARIANT
*pvarResult
, EXCEPINFO
*pexcepinfo
)
606 IDispatchEx
*document
;
611 DISPID id
, named_arg
= DISPID_PROPERTYPUT
;
615 static const WCHAR documentW
[] = {'d','o','c','u','m','e','n','t',0};
616 static const WCHAR testW
[] = {'t','e','s','t',0};
617 static const WCHAR funcW
[] = {'f','u','n','c',0};
619 CHECK_EXPECT(ParseScriptText
);
621 SET_EXPECT(GetScriptDispatch
);
623 tmp
= SysAllocString(documentW
);
624 hres
= IDispatchEx_GetDispID(window_dispex
, tmp
, fdexNameCaseSensitive
, &id
);
626 ok(hres
== S_OK
, "GetDispID(document) failed: %08x\n", hres
);
627 ok(id
== DISPID_IHTMLWINDOW2_DOCUMENT
, "id=%x\n", id
);
629 todo_wine
CHECK_CALLED(GetScriptDispatch
);
632 memset(&dp
, 0, sizeof(dp
));
633 memset(&ei
, 0, sizeof(ei
));
635 hres
= IDispatchEx_InvokeEx(window_dispex
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYGET
, &dp
, &var
, &ei
, NULL
);
636 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
637 ok(V_VT(&var
) == VT_DISPATCH
, "V_VT(var)=%d\n", V_VT(&var
));
638 ok(V_DISPATCH(&var
) != NULL
, "V_DISPATCH(&var) == NULL\n");
640 hres
= IDispatch_QueryInterface(V_DISPATCH(&var
), &IID_IDispatchEx
, (void**)&document
);
642 ok(hres
== S_OK
, "Could not get DispatchEx: %08x\n", hres
);
644 tmp
= SysAllocString(testW
);
645 hres
= IDispatchEx_GetDispID(document
, tmp
, fdexNameCaseSensitive
, &id
);
646 ok(hres
== DISP_E_UNKNOWNNAME
, "GetDispID(document) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres
);
647 hres
= IDispatchEx_GetDispID(document
, tmp
, fdexNameCaseSensitive
| fdexNameImplicit
, &id
);
648 ok(hres
== DISP_E_UNKNOWNNAME
, "GetDispID(document) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres
);
652 tmp
= SysAllocString(testW
);
653 hres
= IDispatchEx_GetDispID(document
, tmp
, fdexNameCaseSensitive
|fdexNameEnsure
, &id
);
655 ok(hres
== S_OK
, "GetDispID(document) failed: %08x\n", hres
);
661 dp
.rgdispidNamedArgs
= &named_arg
;
665 hres
= IDispatchEx_InvokeEx(document
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYPUT
, &dp
, NULL
, &ei
, NULL
);
666 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
668 tmp
= SysAllocString(testW
);
669 hres
= IDispatchEx_GetDispID(document
, tmp
, fdexNameCaseSensitive
, &id
);
671 ok(hres
== S_OK
, "GetDispID(document) failed: %08x\n", hres
);
674 memset(&dp
, 0, sizeof(dp
));
675 memset(&ei
, 0, sizeof(ei
));
676 hres
= IDispatchEx_InvokeEx(document
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYGET
, &dp
, &var
, &ei
, NULL
);
677 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
678 ok(V_VT(&var
) == VT_I4
, "V_VT(var)=%d\n", V_VT(&var
));
679 ok(V_I4(&var
) == 100, "V_I4(&var) == NULL\n");
681 unk
= (void*)0xdeadbeef;
682 hres
= IDispatchEx_GetNameSpaceParent(window_dispex
, &unk
);
683 ok(hres
== S_OK
, "GetNameSpaceParent failed: %08x\n", hres
);
684 ok(!unk
, "unk=%p, expected NULL\n", unk
);
687 tmp
= SysAllocString(funcW
);
688 hres
= IDispatchEx_GetDispID(document
, tmp
, fdexNameCaseSensitive
|fdexNameEnsure
, &id
);
690 ok(hres
== S_OK
, "GetDispID(func) failed: %08x\n", hres
);
696 dp
.rgdispidNamedArgs
= NULL
;
697 V_VT(&var
) = VT_DISPATCH
;
698 V_DISPATCH(&var
) = (IDispatch
*)&funcDisp
;
700 hres
= IDispatchEx_InvokeEx(document
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYPUT
, &dp
, NULL
, &ei
, NULL
);
701 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
704 memset(&dp
, 0, sizeof(dp
));
705 memset(&ei
, 0, sizeof(ei
));
706 V_VT(&arg
) = VT_BOOL
;
707 V_BOOL(&arg
) = VARIANT_TRUE
;
711 SET_EXPECT(funcDisp
);
712 hres
= IDispatchEx_InvokeEx(document
, id
, LOCALE_NEUTRAL
, INVOKE_FUNC
, &dp
, &var
, &ei
, NULL
);
713 CHECK_CALLED(funcDisp
);
715 ok(hres
== S_OK
, "InvokeEx(INVOKE_FUNC) failed: %08x\n", hres
);
716 ok(V_VT(&var
) == VT_I4
, "V_VT(var)=%d\n", V_VT(&var
));
717 ok(V_I4(&var
) == 100, "V_I4(&var) == NULL\n");
719 IDispatchEx_Release(document
);
724 static const IActiveScriptParseVtbl ActiveScriptParseVtbl
= {
725 ActiveScriptParse_QueryInterface
,
726 ActiveScriptParse_AddRef
,
727 ActiveScriptParse_Release
,
728 ActiveScriptParse_InitNew
,
729 ActiveScriptParse_AddScriptlet
,
730 ActiveScriptParse_ParseScriptText
733 static IActiveScriptParse ActiveScriptParse
= { &ActiveScriptParseVtbl
};
735 static HRESULT WINAPI
ActiveScript_QueryInterface(IActiveScript
*iface
, REFIID riid
, void **ppv
)
739 if(IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IActiveScript
, riid
)) {
744 if(IsEqualGUID(&IID_IActiveScriptParse
, riid
)) {
745 *ppv
= &ActiveScriptParse
;
749 if(IsEqualGUID(&IID_IActiveScriptParseProcedure2
, riid
)) {
750 *ppv
= &ActiveScriptParseProcedure
;
754 if(IsEqualGUID(&IID_IActiveScriptProperty
, riid
)) {
755 *ppv
= &ActiveScriptProperty
;
759 if(IsEqualGUID(&IID_IObjectSafety
, riid
)) {
760 *ppv
= &ObjectSafety
;
764 ok(0, "unexpected riid %s\n", debugstr_guid(riid
));
765 return E_NOINTERFACE
;
768 static ULONG WINAPI
ActiveScript_AddRef(IActiveScript
*iface
)
773 static ULONG WINAPI
ActiveScript_Release(IActiveScript
*iface
)
778 static HRESULT WINAPI
ActiveScript_SetScriptSite(IActiveScript
*iface
, IActiveScriptSite
*pass
)
780 IActiveScriptSiteInterruptPoll
*poll
;
781 IActiveScriptSiteDebug
*debug
;
782 IServiceProvider
*service
;
783 ICanHandleException
*canexpection
;
787 CHECK_EXPECT(SetScriptSite
);
789 ok(pass
!= NULL
, "pass == NULL\n");
791 hres
= IActiveScriptSite_QueryInterface(pass
, &IID_IActiveScriptSiteInterruptPoll
, (void**)&poll
);
792 ok(hres
== S_OK
, "Could not get IActiveScriptSiteInterruptPoll interface: %08x\n", hres
);
794 IActiveScriptSiteInterruptPoll_Release(poll
);
796 hres
= IActiveScriptSite_GetLCID(pass
, &lcid
);
797 ok(hres
== S_OK
, "GetLCID failed: %08x\n", hres
);
799 hres
= IActiveScriptSite_OnStateChange(pass
, (state
= SCRIPTSTATE_INITIALIZED
));
800 ok(hres
== S_OK
, "OnStateChange failed: %08x\n", hres
);
802 hres
= IActiveScriptSite_QueryInterface(pass
, &IID_IActiveScriptSiteDebug
, (void**)&debug
);
803 ok(hres
== S_OK
, "Could not get IActiveScriptSiteDebug interface: %08x\n", hres
);
805 IActiveScriptSiteDebug32_Release(debug
);
807 hres
= IActiveScriptSite_QueryInterface(pass
, &IID_ICanHandleException
, (void**)&canexpection
);
808 ok(hres
== E_NOINTERFACE
, "Could not get IID_ICanHandleException interface: %08x\n", hres
);
810 hres
= IActiveScriptSite_QueryInterface(pass
, &IID_IServiceProvider
, (void**)&service
);
811 todo_wine
ok(hres
== S_OK
, "Could not get IServiceProvider interface: %08x\n", hres
);
813 IServiceProvider_Release(service
);
816 IActiveScriptSite_AddRef(site
);
820 static HRESULT WINAPI
ActiveScript_GetScriptSite(IActiveScript
*iface
, REFIID riid
,
823 ok(0, "unexpected call\n");
827 static HRESULT WINAPI
ActiveScript_SetScriptState(IActiveScript
*iface
, SCRIPTSTATE ss
)
832 case SCRIPTSTATE_STARTED
:
833 CHECK_EXPECT(SetScriptState_STARTED
);
835 case SCRIPTSTATE_CONNECTED
:
836 CHECK_EXPECT(SetScriptState_CONNECTED
);
838 case SCRIPTSTATE_DISCONNECTED
:
839 CHECK_EXPECT(SetScriptState_DISCONNECTED
);
842 ok(0, "unexpected state %d\n", ss
);
846 hres
= IActiveScriptSite_OnStateChange(site
, (state
= ss
));
850 static HRESULT WINAPI
ActiveScript_GetScriptState(IActiveScript
*iface
, SCRIPTSTATE
*pssState
)
852 CHECK_EXPECT(GetScriptState
);
858 static HRESULT WINAPI
ActiveScript_Close(IActiveScript
*iface
)
864 static HRESULT WINAPI
ActiveScript_AddNamedItem(IActiveScript
*iface
,
865 LPCOLESTR pstrName
, DWORD dwFlags
)
868 IUnknown
*unk
= NULL
, *unk2
;
871 static const WCHAR windowW
[] = {'w','i','n','d','o','w',0};
873 static const IID unknown_iid
= {0x719C3050,0xF9D3,0x11CF,{0xA4,0x93,0x00,0x40,0x05,0x23,0xA8,0xA0}};
875 CHECK_EXPECT(AddNamedItem
);
877 ok(!lstrcmpW(pstrName
, windowW
), "pstrName=%s\n", debugstr_w(pstrName
));
878 ok(dwFlags
== (SCRIPTITEM_ISVISIBLE
|SCRIPTITEM_ISSOURCE
|SCRIPTITEM_GLOBALMEMBERS
), "dwFlags=%x\n", dwFlags
);
880 hres
= IActiveScriptSite_GetItemInfo(site
, windowW
, SCRIPTINFO_IUNKNOWN
, &unk
, NULL
);
881 ok(hres
== S_OK
, "GetItemInfo failed: %08x\n", hres
);
882 ok(unk
!= NULL
, "unk == NULL\n");
884 hres
= IUnknown_QueryInterface(unk
, &IID_IDispatch
, (void**)&disp
);
885 ok(hres
== S_OK
, "Could not get IDispatch interface: %08x\n", hres
);
887 IDispatch_Release(disp
);
889 hres
= IUnknown_QueryInterface(unk
, &unknown_iid
, (void**)&unk2
);
890 ok(hres
== E_NOINTERFACE
, "Got ?? interface: %p\n", unk2
);
892 IUnknown_Release(unk2
);
894 hres
= IUnknown_QueryInterface(unk
, &IID_IDispatchEx
, (void**)&window_dispex
);
895 ok(hres
== S_OK
, "Could not get IDispatchEx interface: %08x\n", hres
);
897 IUnknown_Release(unk
);
901 static HRESULT WINAPI
ActiveScript_AddTypeLib(IActiveScript
*iface
, REFGUID rguidTypeLib
,
902 DWORD dwMajor
, DWORD dwMinor
, DWORD dwFlags
)
904 ok(0, "unexpected call\n");
908 static HRESULT WINAPI
ActiveScript_GetScriptDispatch(IActiveScript
*iface
, LPCOLESTR pstrItemName
,
911 CHECK_EXPECT(GetScriptDispatch
);
915 static HRESULT WINAPI
ActiveScript_GetCurrentScriptThreadID(IActiveScript
*iface
,
916 SCRIPTTHREADID
*pstridThread
)
918 ok(0, "unexpected call\n");
922 static HRESULT WINAPI
ActiveScript_GetScriptThreadID(IActiveScript
*iface
,
923 DWORD dwWin32ThreadId
, SCRIPTTHREADID
*pstidThread
)
925 ok(0, "unexpected call\n");
929 static HRESULT WINAPI
ActiveScript_GetScriptThreadState(IActiveScript
*iface
,
930 SCRIPTTHREADID stidThread
, SCRIPTTHREADSTATE
*pstsState
)
932 ok(0, "unexpected call\n");
936 static HRESULT WINAPI
ActiveScript_InterruptScriptThread(IActiveScript
*iface
,
937 SCRIPTTHREADID stidThread
, const EXCEPINFO
*pexcepinfo
, DWORD dwFlags
)
939 ok(0, "unexpected call\n");
943 static HRESULT WINAPI
ActiveScript_Clone(IActiveScript
*iface
, IActiveScript
**ppscript
)
945 ok(0, "unexpected call\n");
949 static const IActiveScriptVtbl ActiveScriptVtbl
= {
950 ActiveScript_QueryInterface
,
952 ActiveScript_Release
,
953 ActiveScript_SetScriptSite
,
954 ActiveScript_GetScriptSite
,
955 ActiveScript_SetScriptState
,
956 ActiveScript_GetScriptState
,
958 ActiveScript_AddNamedItem
,
959 ActiveScript_AddTypeLib
,
960 ActiveScript_GetScriptDispatch
,
961 ActiveScript_GetCurrentScriptThreadID
,
962 ActiveScript_GetScriptThreadID
,
963 ActiveScript_GetScriptThreadState
,
964 ActiveScript_InterruptScriptThread
,
968 static IActiveScript ActiveScript
= { &ActiveScriptVtbl
};
970 static HRESULT WINAPI
ClassFactory_QueryInterface(IClassFactory
*iface
, REFIID riid
, void **ppv
)
974 if(IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IClassFactory
, riid
)) {
979 if(IsEqualGUID(&IID_IMarshal
, riid
))
980 return E_NOINTERFACE
;
981 if(IsEqualGUID(&CLSID_IdentityUnmarshal
, riid
))
982 return E_NOINTERFACE
;
984 ok(0, "unexpected riid %s\n", debugstr_guid(riid
));
988 static ULONG WINAPI
ClassFactory_AddRef(IClassFactory
*iface
)
993 static ULONG WINAPI
ClassFactory_Release(IClassFactory
*iface
)
998 static HRESULT WINAPI
ClassFactory_CreateInstance(IClassFactory
*iface
, IUnknown
*outer
, REFIID riid
, void **ppv
)
1000 CHECK_EXPECT(CreateInstance
);
1002 ok(!outer
, "outer = %p\n", outer
);
1003 ok(IsEqualGUID(&IID_IActiveScript
, riid
), "unexpected riid %s\n", debugstr_guid(riid
));
1004 *ppv
= &ActiveScript
;
1008 static HRESULT WINAPI
ClassFactory_LockServer(IClassFactory
*iface
, BOOL dolock
)
1010 ok(0, "unexpected call\n");
1014 static const IClassFactoryVtbl ClassFactoryVtbl
= {
1015 ClassFactory_QueryInterface
,
1016 ClassFactory_AddRef
,
1017 ClassFactory_Release
,
1018 ClassFactory_CreateInstance
,
1019 ClassFactory_LockServer
1022 static IClassFactory script_cf
= { &ClassFactoryVtbl
};
1024 static const char simple_script_str
[] =
1025 "<html><head></head><body>"
1026 "<script language=\"TestScript\">simple script</script>"
1029 static void test_simple_script(void)
1031 IHTMLDocument2
*doc
;
1033 SET_EXPECT(CreateInstance
);
1034 SET_EXPECT(GetInterfaceSafetyOptions
);
1035 SET_EXPECT(SetInterfaceSafetyOptions
);
1036 SET_EXPECT(SetProperty
);
1037 SET_EXPECT(InitNew
);
1038 SET_EXPECT(SetScriptSite
);
1039 SET_EXPECT(GetScriptState
);
1040 SET_EXPECT(SetScriptState_STARTED
);
1041 SET_EXPECT(AddNamedItem
);
1042 SET_EXPECT(ParseScriptText
);
1043 SET_EXPECT(SetScriptState_CONNECTED
);
1045 doc
= create_and_load_doc(simple_script_str
);
1048 CHECK_CALLED(CreateInstance
);
1049 CHECK_CALLED(GetInterfaceSafetyOptions
);
1050 CHECK_CALLED(SetInterfaceSafetyOptions
);
1051 CHECK_CALLED(SetProperty
);
1052 CHECK_CALLED(InitNew
);
1053 CHECK_CALLED(SetScriptSite
);
1054 CHECK_CALLED(GetScriptState
);
1055 CHECK_CALLED(SetScriptState_STARTED
);
1056 CHECK_CALLED(AddNamedItem
);
1057 CHECK_CALLED(ParseScriptText
);
1058 CHECK_CALLED(SetScriptState_CONNECTED
);
1061 IActiveScriptSite_Release(site
);
1063 IDispatchEx_Release(window_dispex
);
1065 SET_EXPECT(SetScriptState_DISCONNECTED
);
1068 IHTMLDocument2_Release(doc
);
1070 CHECK_CALLED(SetScriptState_DISCONNECTED
);
1071 CHECK_CALLED(Close
);
1074 static BOOL
init_key(const char *key_name
, const char *def_value
, BOOL init
)
1080 RegDeleteKey(HKEY_CLASSES_ROOT
, key_name
);
1084 res
= RegCreateKeyA(HKEY_CLASSES_ROOT
, key_name
, &hkey
);
1085 if(res
!= ERROR_SUCCESS
)
1089 res
= RegSetValueA(hkey
, NULL
, REG_SZ
, def_value
, strlen(def_value
));
1093 return res
== ERROR_SUCCESS
;
1096 static BOOL
init_registry(BOOL init
)
1098 return init_key("TestScript\\CLSID", TESTSCRIPT_CLSID
, init
)
1099 && init_key("CLSID\\"TESTSCRIPT_CLSID
"\\Implemented Categories\\{F0B7A1A1-9847-11CF-8F20-00805F2CD064}",
1101 && init_key("CLSID\\"TESTSCRIPT_CLSID
"\\Implemented Categories\\{F0B7A1A2-9847-11CF-8F20-00805F2CD064}",
1105 static BOOL
register_script_engine(void)
1110 if(!init_registry(TRUE
)) {
1111 init_registry(FALSE
);
1115 hres
= CoRegisterClassObject(&CLSID_TestScript
, (IUnknown
*)&script_cf
,
1116 CLSCTX_INPROC_SERVER
, REGCLS_MULTIPLEUSE
, ®id
);
1117 ok(hres
== S_OK
, "Could not register screipt engine: %08x\n", hres
);
1122 static void gecko_installer_workaround(BOOL disable
)
1127 static BOOL has_url
= FALSE
;
1128 static char url
[2048];
1130 if(!disable
&& !has_url
)
1133 res
= RegOpenKey(HKEY_CURRENT_USER
, "Software\\Wine\\MSHTML", &hkey
);
1134 if(res
!= ERROR_SUCCESS
)
1138 DWORD type
, size
= sizeof(url
);
1140 res
= RegQueryValueEx(hkey
, "GeckoUrl", NULL
, &type
, (PVOID
)url
, &size
);
1141 if(res
== ERROR_SUCCESS
&& type
== REG_SZ
)
1144 RegDeleteValue(hkey
, "GeckoUrl");
1146 RegSetValueEx(hkey
, "GeckoUrl", 0, REG_SZ
, (PVOID
)url
, lstrlenA(url
)+1);
1152 /* Check if Internet Explorer is configured to run in "Enhanced Security Configuration" (aka hardened mode) */
1153 /* Note: this code is duplicated in dlls/mshtml/tests/dom.c, dlls/mshtml/tests/script.c and dlls/urlmon/tests/misc.c */
1154 static BOOL
is_ie_hardened(void)
1157 DWORD ie_harden
, type
, size
;
1160 if(RegOpenKeyEx(HKEY_CURRENT_USER
, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap",
1161 0, KEY_QUERY_VALUE
, &zone_map
) == ERROR_SUCCESS
) {
1162 size
= sizeof(DWORD
);
1163 if (RegQueryValueEx(zone_map
, "IEHarden", NULL
, &type
, (LPBYTE
) &ie_harden
, &size
) != ERROR_SUCCESS
||
1164 type
!= REG_DWORD
) {
1167 RegCloseKey(zone_map
);
1170 return ie_harden
!= 0;
1175 gecko_installer_workaround(TRUE
);
1178 if(winetest_interactive
|| ! is_ie_hardened()) {
1179 if(register_script_engine()) {
1180 test_simple_script();
1181 init_registry(FALSE
);
1183 skip("Could not register TestScript engine\n");
1186 skip("IE running in Enhanced Security Configuration\n");
1190 gecko_installer_workaround(FALSE
);