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
43 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_64Vtbl
47 #define CTXARG_T DWORD
48 #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
49 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_32Vtbl
53 #define DEFINE_EXPECT(func) \
54 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
56 #define SET_EXPECT(func) \
57 do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0)
59 #define CHECK_EXPECT2(func) \
61 ok(expect_ ##func, "unexpected call " #func "\n"); \
62 called_ ## func = TRUE; \
65 #define CHECK_EXPECT(func) \
67 CHECK_EXPECT2(func); \
68 expect_ ## func = FALSE; \
71 #define CHECK_CALLED(func) \
73 ok(called_ ## func, "expected " #func "\n"); \
74 expect_ ## func = called_ ## func = FALSE; \
77 #define CHECK_NOT_CALLED(func) \
79 ok(!called_ ## func, "unexpected " #func "\n"); \
80 expect_ ## func = called_ ## func = FALSE; \
83 #define CLEAR_CALLED(func) \
84 expect_ ## func = called_ ## func = FALSE
87 DEFINE_EXPECT(CreateInstance);
88 DEFINE_EXPECT(GetInterfaceSafetyOptions);
89 DEFINE_EXPECT(SetInterfaceSafetyOptions);
90 DEFINE_EXPECT(InitNew);
92 DEFINE_EXPECT(SetProperty);
93 DEFINE_EXPECT(SetScriptSite);
94 DEFINE_EXPECT(GetScriptState);
95 DEFINE_EXPECT(SetScriptState_STARTED);
96 DEFINE_EXPECT(SetScriptState_CONNECTED);
97 DEFINE_EXPECT(SetScriptState_DISCONNECTED);
98 DEFINE_EXPECT(AddNamedItem);
99 DEFINE_EXPECT(ParseScriptText);
100 DEFINE_EXPECT(GetScriptDispatch);
101 DEFINE_EXPECT(funcDisp);
103 #define TESTSCRIPT_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80746}"
105 static const GUID CLSID_TestScript =
106 {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x07,0x46}};
108 static IHTMLDocument2 *notif_doc;
109 static IDispatchEx *window_dispex;
110 static BOOL doc_complete;
112 static const char *debugstr_guid(REFIID riid)
116 sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
117 riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
118 riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
119 riid->Data4[5], riid->Data4[6], riid->Data4[7]);
124 static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface,
125 REFIID riid, void**ppv)
127 if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) {
132 return E_NOINTERFACE;
135 static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface)
140 static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface)
145 static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID)
147 if(dispID == DISPID_READYSTATE){
151 static const WCHAR completeW[] = {'c','o','m','p','l','e','t','e',0};
153 hres = IHTMLDocument2_get_readyState(notif_doc, &state);
154 ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
156 if(!lstrcmpW(state, completeW))
159 SysFreeString(state);
165 static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID)
167 ok(0, "unexpected call\n");
171 static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = {
172 PropertyNotifySink_QueryInterface,
173 PropertyNotifySink_AddRef,
174 PropertyNotifySink_Release,
175 PropertyNotifySink_OnChanged,
176 PropertyNotifySink_OnRequestEdit
179 static IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl };
181 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
185 if(IsEqualGUID(riid, &IID_IUnknown)
186 || IsEqualGUID(riid, &IID_IDispatch)
187 || IsEqualGUID(riid, &IID_IDispatchEx))
190 return E_NOINTERFACE;
195 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
200 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
205 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
207 ok(0, "unexpected call\n");
211 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
212 LCID lcid, ITypeInfo **ppTInfo)
214 ok(0, "unexpected call\n");
218 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
219 LPOLESTR *rgszNames, UINT cNames,
220 LCID lcid, DISPID *rgDispId)
222 ok(0, "unexpected call\n");
226 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
227 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
228 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
230 ok(0, "unexpected call\n");
234 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
236 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
240 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
242 ok(0, "unexpected call\n");
246 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
248 ok(0, "unexpected call\n");
252 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
254 ok(0, "unexpected call\n");
258 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
260 ok(0, "unexpected call\n");
264 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
266 ok(0, "unexpected call\n");
270 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
272 ok(0, "unexpected call\n");
276 static HRESULT WINAPI funcDisp_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
277 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
279 CHECK_EXPECT(funcDisp);
281 ok(id == DISPID_VALUE, "id = %d\n", id);
282 ok(lcid == 0, "lcid = %x\n", lcid);
283 ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
284 ok(pdp != NULL, "pdp == NULL\n");
285 ok(pdp->cArgs == 2, "pdp->cArgs = %d\n", pdp->cArgs);
286 ok(pdp->cNamedArgs == 1, "pdp->cNamedArgs = %d\n", pdp->cNamedArgs);
287 ok(pdp->rgdispidNamedArgs[0] == DISPID_THIS, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
288 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(rgvarg) = %d\n", V_VT(pdp->rgvarg));
289 ok(V_VT(pdp->rgvarg+1) == VT_BOOL, "V_VT(rgvarg[1]) = %d\n", V_VT(pdp->rgvarg));
290 ok(V_BOOL(pdp->rgvarg+1) == VARIANT_TRUE, "V_BOOL(rgvarg[1]) = %x\n", V_BOOL(pdp->rgvarg));
291 ok(pvarRes != NULL, "pvarRes == NULL\n");
292 ok(pei != NULL, "pei == NULL\n");
293 ok(!pspCaller, "pspCaller != NULL\n");
295 V_VT(pvarRes) = VT_I4;
300 static IDispatchExVtbl testObjVtbl = {
301 DispatchEx_QueryInterface,
304 DispatchEx_GetTypeInfoCount,
305 DispatchEx_GetTypeInfo,
306 DispatchEx_GetIDsOfNames,
308 DispatchEx_GetDispID,
310 DispatchEx_DeleteMemberByName,
311 DispatchEx_DeleteMemberByDispID,
312 DispatchEx_GetMemberProperties,
313 DispatchEx_GetMemberName,
314 DispatchEx_GetNextDispID,
315 DispatchEx_GetNameSpaceParent
318 static IDispatchEx funcDisp = { &testObjVtbl };
320 static IHTMLDocument2 *create_document(void)
325 hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
326 &IID_IHTMLDocument2, (void**)&doc);
327 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
332 static IHTMLDocument2 *create_doc_with_string(const char *str)
334 IPersistStreamInit *init;
340 notif_doc = doc = create_document();
344 doc_complete = FALSE;
346 mem = GlobalAlloc(0, len);
347 memcpy(mem, str, len);
348 CreateStreamOnHGlobal(mem, TRUE, &stream);
350 IHTMLDocument2_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&init);
352 IPersistStreamInit_Load(init, stream);
353 IPersistStreamInit_Release(init);
354 IStream_Release(stream);
359 static void do_advise(IUnknown *unk, REFIID riid, IUnknown *unk_advise)
361 IConnectionPointContainer *container;
362 IConnectionPoint *cp;
366 hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container);
367 ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres);
369 hres = IConnectionPointContainer_FindConnectionPoint(container, riid, &cp);
370 IConnectionPointContainer_Release(container);
371 ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres);
373 hres = IConnectionPoint_Advise(cp, unk_advise, &cookie);
374 IConnectionPoint_Release(cp);
375 ok(hres == S_OK, "Advise failed: %08x\n", hres);
378 typedef void (*domtest_t)(IHTMLDocument2*);
380 static IHTMLDocument2 *create_and_load_doc(const char *str)
383 IHTMLElement *body = NULL;
387 static const WCHAR ucPtr[] = {'b','a','c','k','g','r','o','u','n','d',0};
392 doc = create_doc_with_string(str);
393 do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink);
395 while(!doc_complete && GetMessage(&msg, NULL, 0, 0)) {
396 TranslateMessage(&msg);
397 DispatchMessage(&msg);
400 hres = IHTMLDocument2_get_body(doc, &body);
401 ok(hres == S_OK, "get_body failed: %08x\n", hres);
404 skip("Could not get document body. Assuming no Gecko installed.\n");
405 ref = IHTMLDocument2_Release(doc);
406 ok(!ref, "ref = %d\n", ref);
410 /* Check we can query for function on the IHTMLElementBody interface */
411 name = (WCHAR*)ucPtr;
412 hres = IHTMLElement_GetIDsOfNames(body, &IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &dispID);
413 ok(hres == S_OK, "GetIDsOfNames(background) failed %08x\n", hres);
414 ok(dispID == DISPID_IHTMLBODYELEMENT_BACKGROUND, "Incorrect dispID got (%d)\n", dispID);
416 IHTMLElement_Release(body);
420 static IActiveScriptSite *site;
421 static SCRIPTSTATE state;
423 static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
426 ok(0, "unexpected call\n");
427 return E_NOINTERFACE;
430 static ULONG WINAPI ObjectSafety_AddRef(IObjectSafety *iface)
435 static ULONG WINAPI ObjectSafety_Release(IObjectSafety *iface)
440 static HRESULT WINAPI ObjectSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
441 DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
443 CHECK_EXPECT(GetInterfaceSafetyOptions);
445 ok(IsEqualGUID(&IID_IActiveScriptParse, riid), "unexpected riid %s\n", debugstr_guid(riid));
446 ok(pdwSupportedOptions != NULL, "pdwSupportedOptions == NULL\n");
447 ok(pdwEnabledOptions != NULL, "pdwEnabledOptions == NULL\n");
449 *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER;
450 *pdwEnabledOptions = INTERFACE_USES_DISPEX;
455 static HRESULT WINAPI ObjectSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
456 DWORD dwOptionSetMask, DWORD dwEnabledOptions)
458 CHECK_EXPECT(SetInterfaceSafetyOptions);
460 ok(IsEqualGUID(&IID_IActiveScriptParse, riid), "unexpected riid %s\n", debugstr_guid(riid));
462 ok(dwOptionSetMask == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
463 "dwOptionSetMask=%x\n", dwOptionSetMask);
464 ok(dwEnabledOptions == (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER),
465 "dwEnabledOptions=%x\n", dwOptionSetMask);
470 static const IObjectSafetyVtbl ObjectSafetyVtbl = {
471 ObjectSafety_QueryInterface,
473 ObjectSafety_Release,
474 ObjectSafety_GetInterfaceSafetyOptions,
475 ObjectSafety_SetInterfaceSafetyOptions
478 static IObjectSafety ObjectSafety = { &ObjectSafetyVtbl };
480 static HRESULT WINAPI ActiveScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv)
483 ok(0, "unexpected call\n");
484 return E_NOINTERFACE;
487 static ULONG WINAPI ActiveScriptProperty_AddRef(IActiveScriptProperty *iface)
492 static ULONG WINAPI ActiveScriptProperty_Release(IActiveScriptProperty *iface)
497 static HRESULT WINAPI ActiveScriptProperty_GetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
498 VARIANT *pvarIndex, VARIANT *pvarValue)
500 ok(0, "unexpected call\n");
504 static HRESULT WINAPI ActiveScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
505 VARIANT *pvarIndex, VARIANT *pvarValue)
507 CHECK_EXPECT(SetProperty);
509 ok(dwProperty == SCRIPTPROP_HACK_TRIDENTEVENTSINK, "unexpected property %d\n", dwProperty);
510 ok(!pvarIndex, "pvarIndex != NULL\n");
511 ok(pvarValue != NULL, "pvarValue == NULL\n");
512 ok(V_VT(pvarValue) == VT_BOOL, "V_VT(pvarValue)=%d\n", V_VT(pvarValue));
513 ok(V_BOOL(pvarValue) == VARIANT_TRUE, "V_BOOL(pvarValue)=%x\n", V_BOOL(pvarValue));
518 static const IActiveScriptPropertyVtbl ActiveScriptPropertyVtbl = {
519 ActiveScriptProperty_QueryInterface,
520 ActiveScriptProperty_AddRef,
521 ActiveScriptProperty_Release,
522 ActiveScriptProperty_GetProperty,
523 ActiveScriptProperty_SetProperty
526 static IActiveScriptProperty ActiveScriptProperty = { &ActiveScriptPropertyVtbl };
528 static HRESULT WINAPI ActiveScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2 *iface, REFIID riid, void **ppv)
531 ok(0, "unexpected call\n");
532 return E_NOINTERFACE;
535 static ULONG WINAPI ActiveScriptParseProcedure_AddRef(IActiveScriptParseProcedure2 *iface)
540 static ULONG WINAPI ActiveScriptParseProcedure_Release(IActiveScriptParseProcedure2 *iface)
545 static HRESULT WINAPI ActiveScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface,
546 LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName,
547 LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter,
548 CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
550 ok(0, "unexpected call\n");
554 static const IActiveScriptParseProcedure2Vtbl ActiveScriptParseProcedureVtbl = {
555 ActiveScriptParseProcedure_QueryInterface,
556 ActiveScriptParseProcedure_AddRef,
557 ActiveScriptParseProcedure_Release,
558 ActiveScriptParseProcedure_ParseProcedureText
561 static IActiveScriptParseProcedure2 ActiveScriptParseProcedure = { &ActiveScriptParseProcedureVtbl };
563 static HRESULT WINAPI ActiveScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
566 ok(0, "unexpected call\n");
567 return E_NOINTERFACE;
570 static ULONG WINAPI ActiveScriptParse_AddRef(IActiveScriptParse *iface)
575 static ULONG WINAPI ActiveScriptParse_Release(IActiveScriptParse *iface)
580 static HRESULT WINAPI ActiveScriptParse_InitNew(IActiveScriptParse *iface)
582 CHECK_EXPECT(InitNew);
586 static HRESULT WINAPI ActiveScriptParse_AddScriptlet(IActiveScriptParse *iface,
587 LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
588 LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
589 CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
590 BSTR *pbstrName, EXCEPINFO *pexcepinfo)
592 ok(0, "unexpected call\n");
596 static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *iface,
597 LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
598 LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine,
599 DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
601 IDispatchEx *document;
606 DISPID id, named_arg = DISPID_PROPERTYPUT;
610 static const WCHAR documentW[] = {'d','o','c','u','m','e','n','t',0};
611 static const WCHAR testW[] = {'t','e','s','t',0};
612 static const WCHAR funcW[] = {'f','u','n','c',0};
614 CHECK_EXPECT(ParseScriptText);
616 SET_EXPECT(GetScriptDispatch);
618 tmp = SysAllocString(documentW);
619 hres = IDispatchEx_GetDispID(window_dispex, tmp, fdexNameCaseSensitive, &id);
621 ok(hres == S_OK, "GetDispID(document) failed: %08x\n", hres);
622 ok(id == DISPID_IHTMLWINDOW2_DOCUMENT, "id=%x\n", id);
624 todo_wine CHECK_CALLED(GetScriptDispatch);
627 memset(&dp, 0, sizeof(dp));
628 memset(&ei, 0, sizeof(ei));
630 hres = IDispatchEx_InvokeEx(window_dispex, id, LOCALE_NEUTRAL, INVOKE_PROPERTYGET, &dp, &var, &ei, NULL);
631 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
632 ok(V_VT(&var) == VT_DISPATCH, "V_VT(var)=%d\n", V_VT(&var));
633 ok(V_DISPATCH(&var) != NULL, "V_DISPATCH(&var) == NULL\n");
635 hres = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IDispatchEx, (void**)&document);
637 ok(hres == S_OK, "Could not get DispatchEx: %08x\n", hres);
639 tmp = SysAllocString(testW);
640 hres = IDispatchEx_GetDispID(document, tmp, fdexNameCaseSensitive, &id);
641 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(document) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
642 hres = IDispatchEx_GetDispID(document, tmp, fdexNameCaseSensitive | fdexNameImplicit, &id);
643 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(document) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
647 tmp = SysAllocString(testW);
648 hres = IDispatchEx_GetDispID(document, tmp, fdexNameCaseSensitive|fdexNameEnsure, &id);
650 ok(hres == S_OK, "GetDispID(document) failed: %08x\n", hres);
656 dp.rgdispidNamedArgs = &named_arg;
660 hres = IDispatchEx_InvokeEx(document, id, LOCALE_NEUTRAL, INVOKE_PROPERTYPUT, &dp, NULL, &ei, NULL);
661 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
663 tmp = SysAllocString(testW);
664 hres = IDispatchEx_GetDispID(document, tmp, fdexNameCaseSensitive, &id);
666 ok(hres == S_OK, "GetDispID(document) failed: %08x\n", hres);
669 memset(&dp, 0, sizeof(dp));
670 memset(&ei, 0, sizeof(ei));
671 hres = IDispatchEx_InvokeEx(document, id, LOCALE_NEUTRAL, INVOKE_PROPERTYGET, &dp, &var, &ei, NULL);
672 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
673 ok(V_VT(&var) == VT_I4, "V_VT(var)=%d\n", V_VT(&var));
674 ok(V_I4(&var) == 100, "V_I4(&var) == NULL\n");
676 unk = (void*)0xdeadbeef;
677 hres = IDispatchEx_GetNameSpaceParent(window_dispex, &unk);
678 ok(hres == S_OK, "GetNameSpaceParent failed: %08x\n", hres);
679 ok(!unk, "unk=%p, expected NULL\n", unk);
682 tmp = SysAllocString(funcW);
683 hres = IDispatchEx_GetDispID(document, tmp, fdexNameCaseSensitive|fdexNameEnsure, &id);
685 ok(hres == S_OK, "GetDispID(func) failed: %08x\n", hres);
691 dp.rgdispidNamedArgs = NULL;
692 V_VT(&var) = VT_DISPATCH;
693 V_DISPATCH(&var) = (IDispatch*)&funcDisp;
695 hres = IDispatchEx_InvokeEx(document, id, LOCALE_NEUTRAL, INVOKE_PROPERTYPUT, &dp, NULL, &ei, NULL);
696 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
699 memset(&dp, 0, sizeof(dp));
700 memset(&ei, 0, sizeof(ei));
701 V_VT(&arg) = VT_BOOL;
702 V_BOOL(&arg) = VARIANT_TRUE;
706 SET_EXPECT(funcDisp);
707 hres = IDispatchEx_InvokeEx(document, id, LOCALE_NEUTRAL, INVOKE_FUNC, &dp, &var, &ei, NULL);
708 CHECK_CALLED(funcDisp);
710 ok(hres == S_OK, "InvokeEx(INVOKE_FUNC) failed: %08x\n", hres);
711 ok(V_VT(&var) == VT_I4, "V_VT(var)=%d\n", V_VT(&var));
712 ok(V_I4(&var) == 100, "V_I4(&var) == NULL\n");
714 IDispatchEx_Release(document);
719 static const IActiveScriptParseVtbl ActiveScriptParseVtbl = {
720 ActiveScriptParse_QueryInterface,
721 ActiveScriptParse_AddRef,
722 ActiveScriptParse_Release,
723 ActiveScriptParse_InitNew,
724 ActiveScriptParse_AddScriptlet,
725 ActiveScriptParse_ParseScriptText
728 static IActiveScriptParse ActiveScriptParse = { &ActiveScriptParseVtbl };
730 static HRESULT WINAPI ActiveScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
734 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IActiveScript, riid)) {
739 if(IsEqualGUID(&IID_IActiveScriptParse, riid)) {
740 *ppv = &ActiveScriptParse;
744 if(IsEqualGUID(&IID_IActiveScriptParseProcedure2, riid)) {
745 *ppv = &ActiveScriptParseProcedure;
749 if(IsEqualGUID(&IID_IActiveScriptProperty, riid)) {
750 *ppv = &ActiveScriptProperty;
754 if(IsEqualGUID(&IID_IObjectSafety, riid)) {
755 *ppv = &ObjectSafety;
759 ok(0, "unexpected riid %s\n", debugstr_guid(riid));
760 return E_NOINTERFACE;
763 static ULONG WINAPI ActiveScript_AddRef(IActiveScript *iface)
768 static ULONG WINAPI ActiveScript_Release(IActiveScript *iface)
773 static HRESULT WINAPI ActiveScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass)
775 IActiveScriptSiteInterruptPoll *poll;
776 IActiveScriptSiteDebug *debug;
777 IServiceProvider *service;
778 ICanHandleException *canexpection;
782 CHECK_EXPECT(SetScriptSite);
784 ok(pass != NULL, "pass == NULL\n");
786 hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteInterruptPoll, (void**)&poll);
787 ok(hres == S_OK, "Could not get IActiveScriptSiteInterruptPoll interface: %08x\n", hres);
789 IActiveScriptSiteInterruptPoll_Release(poll);
791 hres = IActiveScriptSite_GetLCID(pass, &lcid);
792 ok(hres == S_OK, "GetLCID failed: %08x\n", hres);
794 hres = IActiveScriptSite_OnStateChange(pass, (state = SCRIPTSTATE_INITIALIZED));
795 ok(hres == S_OK, "OnStateChange failed: %08x\n", hres);
797 hres = IActiveScriptSite_QueryInterface(pass, &IID_IActiveScriptSiteDebug, (void**)&debug);
798 ok(hres == S_OK, "Could not get IActiveScriptSiteDebug interface: %08x\n", hres);
800 IActiveScriptSiteDebug32_Release(debug);
802 hres = IActiveScriptSite_QueryInterface(pass, &IID_ICanHandleException, (void**)&canexpection);
803 ok(hres == E_NOINTERFACE, "Could not get IID_ICanHandleException interface: %08x\n", hres);
805 hres = IActiveScriptSite_QueryInterface(pass, &IID_IServiceProvider, (void**)&service);
806 todo_wine ok(hres == S_OK, "Could not get IServiceProvider interface: %08x\n", hres);
808 IServiceProvider_Release(service);
811 IActiveScriptSite_AddRef(site);
815 static HRESULT WINAPI ActiveScript_GetScriptSite(IActiveScript *iface, REFIID riid,
818 ok(0, "unexpected call\n");
822 static HRESULT WINAPI ActiveScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
827 case SCRIPTSTATE_STARTED:
828 CHECK_EXPECT(SetScriptState_STARTED);
830 case SCRIPTSTATE_CONNECTED:
831 CHECK_EXPECT(SetScriptState_CONNECTED);
833 case SCRIPTSTATE_DISCONNECTED:
834 CHECK_EXPECT(SetScriptState_DISCONNECTED);
837 ok(0, "unexpected state %d\n", ss);
841 hres = IActiveScriptSite_OnStateChange(site, (state = ss));
845 static HRESULT WINAPI ActiveScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
847 CHECK_EXPECT(GetScriptState);
853 static HRESULT WINAPI ActiveScript_Close(IActiveScript *iface)
859 static HRESULT WINAPI ActiveScript_AddNamedItem(IActiveScript *iface,
860 LPCOLESTR pstrName, DWORD dwFlags)
863 IUnknown *unk = NULL, *unk2;
866 static const WCHAR windowW[] = {'w','i','n','d','o','w',0};
868 static const IID unknown_iid = {0x719C3050,0xF9D3,0x11CF,{0xA4,0x93,0x00,0x40,0x05,0x23,0xA8,0xA0}};
870 CHECK_EXPECT(AddNamedItem);
872 ok(!lstrcmpW(pstrName, windowW), "pstrName=%s\n", wine_dbgstr_w(pstrName));
873 ok(dwFlags == (SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS), "dwFlags=%x\n", dwFlags);
875 hres = IActiveScriptSite_GetItemInfo(site, windowW, SCRIPTINFO_IUNKNOWN, &unk, NULL);
876 ok(hres == S_OK, "GetItemInfo failed: %08x\n", hres);
877 ok(unk != NULL, "unk == NULL\n");
879 hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp);
880 ok(hres == S_OK, "Could not get IDispatch interface: %08x\n", hres);
882 IDispatch_Release(disp);
884 hres = IUnknown_QueryInterface(unk, &unknown_iid, (void**)&unk2);
885 ok(hres == E_NOINTERFACE, "Got ?? interface: %p\n", unk2);
887 IUnknown_Release(unk2);
889 hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&window_dispex);
890 ok(hres == S_OK, "Could not get IDispatchEx interface: %08x\n", hres);
892 IUnknown_Release(unk);
896 static HRESULT WINAPI ActiveScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib,
897 DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
899 ok(0, "unexpected call\n");
903 static HRESULT WINAPI ActiveScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName,
906 CHECK_EXPECT(GetScriptDispatch);
910 static HRESULT WINAPI ActiveScript_GetCurrentScriptThreadID(IActiveScript *iface,
911 SCRIPTTHREADID *pstridThread)
913 ok(0, "unexpected call\n");
917 static HRESULT WINAPI ActiveScript_GetScriptThreadID(IActiveScript *iface,
918 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
920 ok(0, "unexpected call\n");
924 static HRESULT WINAPI ActiveScript_GetScriptThreadState(IActiveScript *iface,
925 SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
927 ok(0, "unexpected call\n");
931 static HRESULT WINAPI ActiveScript_InterruptScriptThread(IActiveScript *iface,
932 SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
934 ok(0, "unexpected call\n");
938 static HRESULT WINAPI ActiveScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
940 ok(0, "unexpected call\n");
944 static const IActiveScriptVtbl ActiveScriptVtbl = {
945 ActiveScript_QueryInterface,
947 ActiveScript_Release,
948 ActiveScript_SetScriptSite,
949 ActiveScript_GetScriptSite,
950 ActiveScript_SetScriptState,
951 ActiveScript_GetScriptState,
953 ActiveScript_AddNamedItem,
954 ActiveScript_AddTypeLib,
955 ActiveScript_GetScriptDispatch,
956 ActiveScript_GetCurrentScriptThreadID,
957 ActiveScript_GetScriptThreadID,
958 ActiveScript_GetScriptThreadState,
959 ActiveScript_InterruptScriptThread,
963 static IActiveScript ActiveScript = { &ActiveScriptVtbl };
965 static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
969 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IClassFactory, riid)) {
974 if(IsEqualGUID(&IID_IMarshal, riid))
975 return E_NOINTERFACE;
976 if(IsEqualGUID(&CLSID_IdentityUnmarshal, riid))
977 return E_NOINTERFACE;
979 ok(0, "unexpected riid %s\n", debugstr_guid(riid));
983 static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
988 static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
993 static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
995 CHECK_EXPECT(CreateInstance);
997 ok(!outer, "outer = %p\n", outer);
998 ok(IsEqualGUID(&IID_IActiveScript, riid), "unexpected riid %s\n", debugstr_guid(riid));
999 *ppv = &ActiveScript;
1003 static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock)
1005 ok(0, "unexpected call\n");
1009 static const IClassFactoryVtbl ClassFactoryVtbl = {
1010 ClassFactory_QueryInterface,
1011 ClassFactory_AddRef,
1012 ClassFactory_Release,
1013 ClassFactory_CreateInstance,
1014 ClassFactory_LockServer
1017 static IClassFactory script_cf = { &ClassFactoryVtbl };
1019 static const char simple_script_str[] =
1020 "<html><head></head><body>"
1021 "<script language=\"TestScript\">simple script</script>"
1024 static void test_simple_script(void)
1026 IHTMLDocument2 *doc;
1028 SET_EXPECT(CreateInstance);
1029 SET_EXPECT(GetInterfaceSafetyOptions);
1030 SET_EXPECT(SetInterfaceSafetyOptions);
1031 SET_EXPECT(SetProperty);
1032 SET_EXPECT(InitNew);
1033 SET_EXPECT(SetScriptSite);
1034 SET_EXPECT(GetScriptState);
1035 SET_EXPECT(SetScriptState_STARTED);
1036 SET_EXPECT(AddNamedItem);
1037 SET_EXPECT(ParseScriptText);
1038 SET_EXPECT(SetScriptState_CONNECTED);
1040 doc = create_and_load_doc(simple_script_str);
1043 CHECK_CALLED(CreateInstance);
1044 CHECK_CALLED(GetInterfaceSafetyOptions);
1045 CHECK_CALLED(SetInterfaceSafetyOptions);
1046 CHECK_CALLED(SetProperty);
1047 CHECK_CALLED(InitNew);
1048 CHECK_CALLED(SetScriptSite);
1049 CHECK_CALLED(GetScriptState);
1050 CHECK_CALLED(SetScriptState_STARTED);
1051 CHECK_CALLED(AddNamedItem);
1052 CHECK_CALLED(ParseScriptText);
1053 CHECK_CALLED(SetScriptState_CONNECTED);
1056 IActiveScriptSite_Release(site);
1058 IDispatchEx_Release(window_dispex);
1060 SET_EXPECT(SetScriptState_DISCONNECTED);
1063 IHTMLDocument2_Release(doc);
1065 CHECK_CALLED(SetScriptState_DISCONNECTED);
1066 CHECK_CALLED(Close);
1069 static BOOL init_key(const char *key_name, const char *def_value, BOOL init)
1075 RegDeleteKey(HKEY_CLASSES_ROOT, key_name);
1079 res = RegCreateKeyA(HKEY_CLASSES_ROOT, key_name, &hkey);
1080 if(res != ERROR_SUCCESS)
1084 res = RegSetValueA(hkey, NULL, REG_SZ, def_value, strlen(def_value));
1088 return res == ERROR_SUCCESS;
1091 static BOOL init_registry(BOOL init)
1093 return init_key("TestScript\\CLSID", TESTSCRIPT_CLSID, init)
1094 && init_key("CLSID\\"TESTSCRIPT_CLSID"\\Implemented Categories\\{F0B7A1A1-9847-11CF-8F20-00805F2CD064}",
1096 && init_key("CLSID\\"TESTSCRIPT_CLSID"\\Implemented Categories\\{F0B7A1A2-9847-11CF-8F20-00805F2CD064}",
1100 static BOOL register_script_engine(void)
1105 if(!init_registry(TRUE)) {
1106 init_registry(FALSE);
1110 hres = CoRegisterClassObject(&CLSID_TestScript, (IUnknown *)&script_cf,
1111 CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®id);
1112 ok(hres == S_OK, "Could not register screipt engine: %08x\n", hres);
1117 static void gecko_installer_workaround(BOOL disable)
1122 static BOOL has_url = FALSE;
1123 static char url[2048];
1125 if(!disable && !has_url)
1128 res = RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\MSHTML", &hkey);
1129 if(res != ERROR_SUCCESS)
1133 DWORD type, size = sizeof(url);
1135 res = RegQueryValueEx(hkey, "GeckoUrl", NULL, &type, (PVOID)url, &size);
1136 if(res == ERROR_SUCCESS && type == REG_SZ)
1139 RegDeleteValue(hkey, "GeckoUrl");
1141 RegSetValueEx(hkey, "GeckoUrl", 0, REG_SZ, (PVOID)url, lstrlenA(url)+1);
1147 /* Check if Internet Explorer is configured to run in "Enhanced Security Configuration" (aka hardened mode) */
1148 /* Note: this code is duplicated in dlls/mshtml/tests/dom.c, dlls/mshtml/tests/script.c and dlls/urlmon/tests/sec_mgr.c */
1149 static BOOL is_ie_hardened(void)
1152 DWORD ie_harden, type, size;
1155 if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap",
1156 0, KEY_QUERY_VALUE, &zone_map) == ERROR_SUCCESS) {
1157 size = sizeof(DWORD);
1158 if (RegQueryValueEx(zone_map, "IEHarden", NULL, &type, (LPBYTE) &ie_harden, &size) != ERROR_SUCCESS ||
1159 type != REG_DWORD) {
1162 RegCloseKey(zone_map);
1165 return ie_harden != 0;
1170 gecko_installer_workaround(TRUE);
1173 if(winetest_interactive || ! is_ie_hardened()) {
1174 if(register_script_engine()) {
1175 test_simple_script();
1176 init_registry(FALSE);
1178 skip("Could not register TestScript engine\n");
1181 skip("IE running in Enhanced Security Configuration\n");
1185 gecko_installer_workaround(FALSE);