ReactOS 0.4.17-dev-357-ga8f14ff
caller.c
Go to the documentation of this file.
1/*
2 * Copyright 2012 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include <stdio.h>
20
21#define COBJMACROS
22#define CONST_VTABLE
23
24#include <ole2.h>
25#include <dispex.h>
26#include <activscp.h>
27#include <objsafe.h>
28
29#include "wine/test.h"
30
31#ifdef _WIN64
32
33#define IActiveScriptParse_QueryInterface IActiveScriptParse64_QueryInterface
34#define IActiveScriptParse_Release IActiveScriptParse64_Release
35#define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
36#define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
37
38#else
39
40#define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface
41#define IActiveScriptParse_Release IActiveScriptParse32_Release
42#define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
43#define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
44
45#endif
46
47static const CLSID CLSID_JScript =
48 {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
49
50#define DEFINE_EXPECT(func) \
51 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
52
53#define SET_EXPECT(func) \
54 expect_ ## func = TRUE
55
56#define CHECK_EXPECT2(func) \
57 do { \
58 ok(expect_ ##func, "unexpected call " #func "\n"); \
59 called_ ## func = TRUE; \
60 }while(0)
61
62#define CHECK_EXPECT(func) \
63 do { \
64 CHECK_EXPECT2(func); \
65 expect_ ## func = FALSE; \
66 }while(0)
67
68#define CHECK_CALLED(func) \
69 do { \
70 ok(called_ ## func, "expected " #func "\n"); \
71 expect_ ## func = called_ ## func = FALSE; \
72 }while(0)
73
74#define CLEAR_CALLED(func) \
75 expect_ ## func = called_ ## func = FALSE
76
77DEFINE_EXPECT(sp_caller_QI_NULL);
78DEFINE_EXPECT(site_QI_NULL);
79DEFINE_EXPECT(testArgConv);
80DEFINE_EXPECT(testGetCaller);
81DEFINE_EXPECT(testGetCallerJS);
82DEFINE_EXPECT(testGetCallerNested);
83DEFINE_EXPECT(OnEnterScript);
84DEFINE_EXPECT(OnLeaveScript);
85
86static IActiveScriptParse *active_script_parser;
90
91#define DISPID_TEST_TESTARGCONV 0x1000
92#define DISPID_TEST_TESTGETCALLER 0x1001
93#define DISPID_TEST_TESTGETCALLERJS 0x1002
94#define DISPID_TEST_TESTGETCALLERNESTED 0x1003
95
96typedef struct {
103
104#define call_change_type(a,b,c,d) _call_change_type(__LINE__,a,b,c,d)
106{
108
110 if(V_VT(src) != vt && vt != VT_BOOL && (V_VT(src) == VT_DISPATCH || V_VT(src) == VT_UNKNOWN)) {
111 SET_EXPECT(OnEnterScript);
112 SET_EXPECT(OnLeaveScript);
113 }
114 hres = IVariantChangeType_ChangeType(change_type, dst, src, 0, vt);
115 ok_(__FILE__,line)(hres == S_OK, "ChangeType(%d) failed: %08lx\n", vt, hres);
116 ok_(__FILE__,line)(V_VT(dst) == vt, "V_VT(dst) = %d\n", V_VT(dst));
117 if(V_VT(src) != vt && vt != VT_BOOL && (V_VT(src) == VT_DISPATCH || V_VT(src) == VT_UNKNOWN)) {
118 CHECK_CALLED(OnEnterScript);
119 CHECK_CALLED(OnLeaveScript);
120 }
121}
122
123#define change_type_fail(a,b,c,d) _change_type_fail(__LINE__,a,b,c,d)
125{
126 VARIANT v;
128
129 V_VT(&v) = VT_EMPTY;
130 hres = IVariantChangeType_ChangeType(change_type, &v, src, 0, vt);
131 ok_(__FILE__,line)(hres == exhres, "ChangeType failed: %08lx, expected %08lx [%d]\n", hres, exhres, V_VT(src));
132}
133
135{
136 VARIANT v;
137
139 ok(V_I4(&v) == ex->int_result, "V_I4(v) = %ld, expected %d\n", V_I4(&v), ex->int_result);
140
142 ok(V_UI2(&v) == (UINT16)ex->int_result, "V_UI2(v) = %u, expected %u\n", V_UI2(&v), (UINT16)ex->int_result);
143
145 ok(!lstrcmpW(V_BSTR(&v), ex->str_result), "V_BSTR(v) = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&v)), wine_dbgstr_w(ex->str_result));
146 VariantClear(&v);
147
149 ok(V_BOOL(&v) == ex->bool_result, "V_BOOL(v) = %x, expected %x\n", V_BOOL(&v), ex->bool_result);
150
151 if(ex->test_double) {
153 ok(V_R8(&v) == ex->double_result, "V_R8(v) = %lf, expected %lf\n", V_R8(&v), ex->double_result);
154
156 ok(V_R4(&v) == (float)ex->double_result, "V_R4(v) = %f, expected %f\n", V_R4(&v), (float)ex->double_result);
157 }
158
159 if(V_VT(src) == VT_NULL)
161 else
163
164 if(V_VT(src) == VT_EMPTY)
166 else
168
170 ok(V_I2(&v) == (INT16)ex->int_result, "V_I2(v) = %d, expected %d\n", V_I2(&v), ex->int_result);
171
172 if(V_VT(src) != VT_UNKNOWN)
174 else {
176 ok(V_UNKNOWN(&v) == V_UNKNOWN(src), "V_UNKNOWN(v) != V_UNKNOWN(src)\n");
177 VariantClear(&v);
178 }
179
180 if(V_VT(src) != VT_DISPATCH)
182 else {
184 ok(V_DISPATCH(&v) == V_DISPATCH(src), "V_DISPATCH(v) != V_DISPATCH(src)\n");
185 VariantClear(&v);
186 }
187}
188
190{
191 VARIANT v, dst;
192 BSTR str;
194
195 static const conv_results_t bool_results[] = {
196 {0, L"false", VARIANT_FALSE, 1,0.0},
197 {1, L"true", VARIANT_TRUE, 1,1.0}};
198 static const conv_results_t int_results[] = {
199 {0, L"0", VARIANT_FALSE, 1,0.0},
200 {-100, L"-100", VARIANT_TRUE, 1,-100.0},
201 {0x10010, L"65552", VARIANT_TRUE, 1,65552.0}};
202 static const conv_results_t empty_results =
203 {0, L"undefined", VARIANT_FALSE, 0,0};
204 static const conv_results_t null_results =
205 {0, L"null", VARIANT_FALSE, 0,0};
206 static const conv_results_t obj_results =
207 {10, L"strval", VARIANT_TRUE, 1,10.0};
208
209 V_VT(&v) = VT_BOOL;
210 V_BOOL(&v) = VARIANT_FALSE;
211 test_change_type(change_type, &v, bool_results);
212 V_BOOL(&v) = VARIANT_TRUE;
213 test_change_type(change_type, &v, bool_results+1);
214
215 V_VT(&v) = VT_I4;
216 V_I4(&v) = 0;
217 test_change_type(change_type, &v, int_results);
218 V_I4(&v) = -100;
219 test_change_type(change_type, &v, int_results+1);
220 V_I4(&v) = 0x10010;
221 test_change_type(change_type, &v, int_results+2);
222
223 V_VT(&v) = VT_EMPTY;
224 test_change_type(change_type, &v, &empty_results);
225
226 V_VT(&v) = VT_NULL;
227 test_change_type(change_type, &v, &null_results);
228
229 V_VT(&v) = VT_UNKNOWN;
230 V_UNKNOWN(&v) = (IUnknown*)obj_disp;
231 test_change_type(change_type, &v, &obj_results);
232
233 V_VT(&v) = VT_DISPATCH;
234 V_DISPATCH(&v) = obj_disp;
235 test_change_type(change_type, &v, &obj_results);
236
237 V_VT(&v) = VT_BOOL;
238 V_BOOL(&v) = VARIANT_FALSE;
239 V_VT(&dst) = 0xdead;
240 hres = IVariantChangeType_ChangeType(change_type, &dst, &v, 0, VT_I4);
241 ok(hres == DISP_E_BADVARTYPE, "ChangeType failed: %08lx, expected DISP_E_BADVARTYPE\n", hres);
242 ok(V_VT(&dst) == 0xdead, "V_VT(dst) = %d\n", V_VT(&dst));
243
244 /* Test conversion in place */
245 V_VT(&v) = VT_BSTR;
246 V_BSTR(&v) = str = SysAllocString(L"test");
247 hres = IVariantChangeType_ChangeType(change_type, &v, &v, 0, VT_BSTR);
248 ok(hres == S_OK, "ChangeType failed: %08lx\n", hres);
249 ok(V_VT(&v) == VT_BSTR, "V_VT(v) = %d\n", V_VT(&v));
250 ok(V_BSTR(&v) != str, "V_BSTR(v) == str\n");
251 ok(!lstrcmpW(V_BSTR(&v), L"test"), "V_BSTR(v) = %s\n", wine_dbgstr_w(V_BSTR(&v)));
252 VariantClear(&v);
253}
254
255static void test_caller(IServiceProvider *caller, IDispatch *arg_obj)
256{
258 IUnknown *unk;
260
261 hres = IServiceProvider_QueryService(caller, &SID_VariantConversion, &IID_IVariantChangeType, (void**)&change_type);
262 ok(hres == S_OK, "Could not get SID_VariantConversion service: %08lx\n", hres);
263
264 ok(change_type == script_change_type, "change_type != script_change_type\n");
266
267 IVariantChangeType_Release(change_type);
268
269 SET_EXPECT(site_QI_NULL);
270 hres = IServiceProvider_QueryService(caller, &IID_IActiveScriptSite, &IID_NULL, (void**)&unk);
271 ok(hres == E_NOINTERFACE, "Querying for IActiveScriptSite->NULL returned: %08lx\n", hres);
272 ok(!unk, "unk != NULL\n");
273 CHECK_CALLED(site_QI_NULL);
274}
275
277
279{
280 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IServiceProvider, riid))
281 *ppv = &sp_caller_obj;
282 else {
283 ok(IsEqualGUID(&IID_NULL, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid));
284 CHECK_EXPECT(sp_caller_QI_NULL);
285 *ppv = NULL;
286 return E_NOINTERFACE;
287 }
288
289 return S_OK;
290}
291
293{
294 return 2;
295}
296
298{
299 return 1;
300}
301
303 REFIID riid, void **ppv)
304{
305 if(IsEqualGUID(guidService, &SID_GetCaller)) {
306 ok(IsEqualGUID(riid, &IID_IServiceProvider), "unexpected riid %s\n", wine_dbgstr_guid(riid));
307 *ppv = NULL;
308 return S_OK;
309 }
310
311 ok(0, "unexpected guidService %s with riid %s\n", wine_dbgstr_guid(guidService), wine_dbgstr_guid(riid));
312 *ppv = NULL;
313 return E_NOINTERFACE;
314}
315
316static const IServiceProviderVtbl sp_caller_vtbl = {
321};
322
324
326{
328 *ppv = iface;
329 }else if(IsEqualGUID(riid, &IID_IDispatch) || IsEqualGUID(riid, &IID_IDispatchEx)) {
330 *ppv = iface;
331 }else if(IsEqualGUID(&IID_IObjectSafety, riid)) {
332 ok(0, "Unexpected IID_IObjectSafety query\n");
333 }else {
334 *ppv = NULL;
335 return E_NOINTERFACE;
336 }
337
338 return S_OK;
339}
340
342{
343 return 2;
344}
345
347{
348 return 1;
349}
350
352{
353 ok(0, "unexpected call\n");
354 return E_NOTIMPL;
355}
356
358{
359 return E_NOTIMPL;
360}
361
363 LPOLESTR *rgszNames, UINT cNames,
364 LCID lcid, DISPID *rgDispId)
365{
366 ok(0, "unexpected call\n");
367 return E_NOTIMPL;
368}
369
371 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
372 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
373{
374 ok(0, "unexpected call\n");
375 return E_NOTIMPL;
376}
377
379{
380 ok(0, "unexpected call %s %lx\n", wine_dbgstr_w(bstrName), grfdex);
381 return E_NOTIMPL;
382}
383
385{
386 ok(0, "unexpected call\n");
387 return E_NOTIMPL;
388}
389
391{
392 ok(0, "unexpected call\n");
393 return E_NOTIMPL;
394}
395
397{
398 ok(0, "unexpected call\n");
399 return E_NOTIMPL;
400}
401
403{
404 ok(0, "unexpected call\n");
405 return E_NOTIMPL;
406}
407
409{
410 ok(0, "unexpected call\n");
411 return E_NOTIMPL;
412}
413
414static HRESULT WINAPI Test_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
415{
416 if(!lstrcmpW(bstrName, L"testArgConv")) {
417 ok(grfdex == fdexNameCaseSensitive, "grfdex = %lx\n", grfdex);
419 return S_OK;
420 }
421 if(!lstrcmpW(bstrName, L"testGetCaller")) {
422 ok(grfdex == fdexNameCaseSensitive, "grfdex = %lx\n", grfdex);
424 return S_OK;
425 }
426 if(!lstrcmpW(bstrName, L"testGetCallerJS")) {
427 ok(grfdex == fdexNameCaseSensitive, "grfdex = %lx\n", grfdex);
429 return S_OK;
430 }
431 if(!lstrcmpW(bstrName, L"testGetCallerNested")) {
432 ok(grfdex == fdexNameCaseSensitive, "grfdex = %lx\n", grfdex);
434 return S_OK;
435 }
436
437 return E_NOTIMPL;
438}
439
440static HRESULT WINAPI Test_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
441 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
442{
443 IServiceProvider *caller = (void*)0xdeadbeef;
445
446 ok(pspCaller != NULL, "pspCaller == NULL\n");
447
448 switch(id) {
450 CHECK_EXPECT(testArgConv);
451
452 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
453 ok(pdp != NULL, "pdp == NULL\n");
454 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
455 ok(!pvarRes, "pvarRes != NULL\n");
456 ok(pei != NULL, "pei == NULL\n");
457
458 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
459 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(rgvarg) = %d\n", V_VT(pdp->rgvarg));
460
461 CHECK_CALLED(OnEnterScript);
462 test_caller(pspCaller, V_DISPATCH(pdp->rgvarg));
463 SET_EXPECT(OnLeaveScript);
464
465 stored_obj = V_DISPATCH(pdp->rgvarg);
466 IDispatch_AddRef(stored_obj);
467 break;
468
470 void *iface = (void*)0xdeadbeef;
471
472 CHECK_EXPECT(testGetCaller);
473 CHECK_CALLED(OnEnterScript);
474
475 ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
476 ok(pdp != NULL, "pdp == NULL\n");
477 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
478 ok(!pvarRes, "pvarRes != NULL\n");
479 ok(pei != NULL, "pei == NULL\n");
480
481 SET_EXPECT(OnEnterScript);
482 SET_EXPECT(OnLeaveScript);
483 SET_EXPECT(testGetCallerNested);
485 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
486 ok(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
487 CHECK_CALLED(testGetCallerNested);
488 CHECK_CALLED(OnLeaveScript);
489 CHECK_CALLED(OnEnterScript);
490 SET_EXPECT(OnLeaveScript);
491
492 hres = IServiceProvider_QueryService(pspCaller, &SID_GetCaller, &IID_IServiceProvider, (void**)&caller);
493 ok(hres == S_OK, "Could not get SID_GetCaller service: %08lx\n", hres);
494 ok(caller == test_get_caller_sp, "caller != test_get_caller_sp\n");
495 if(caller) IServiceProvider_Release(caller);
496
498 SET_EXPECT(sp_caller_QI_NULL);
499 hres = IServiceProvider_QueryService(pspCaller, &SID_GetCaller, &IID_NULL, &iface);
500 ok(hres == (test_get_caller_sp ? E_NOINTERFACE : S_OK), "Could not query SID_GetCaller with IID_NULL: %08lx\n", hres);
501 ok(iface == NULL, "iface != NULL\n");
503 CHECK_CALLED(sp_caller_QI_NULL);
504 break;
505 }
506
508 CHECK_EXPECT(testGetCallerJS);
509
510 ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
511 ok(pdp != NULL, "pdp == NULL\n");
512 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
513 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
514 ok(!pvarRes, "pvarRes != NULL\n");
515 ok(pei != NULL, "pei == NULL\n");
516 ok(V_VT(pdp->rgvarg) == VT_I4, "V_VT(rgvarg) = %d\n", V_VT(pdp->rgvarg));
517 ok(V_I4(pdp->rgvarg) == 42, "V_I4(rgvarg) = %ld\n", V_I4(pdp->rgvarg));
518
519 hres = IServiceProvider_QueryService(pspCaller, &SID_GetCaller, &IID_IServiceProvider, (void**)&caller);
520 ok(hres == E_NOINTERFACE, "QueryService(SID_GetCaller) returned: %08lx\n", hres);
521 ok(caller == NULL, "caller != NULL\n");
522 break;
523
525 CHECK_EXPECT(testGetCallerNested);
526
527 ok(wFlags == DISPATCH_METHOD, "wFlags = %x\n", wFlags);
528 ok(pdp != NULL, "pdp == NULL\n");
529 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
530 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
531 ok(!pvarRes, "pvarRes != NULL\n");
532 ok(pei != NULL, "pei == NULL\n");
533 ok(V_VT(&pdp->rgvarg[0]) == VT_I4, "V_VT(rgvarg[0]) = %d\n", V_VT(&pdp->rgvarg[0]));
534 ok(V_VT(&pdp->rgvarg[1]) == VT_I4, "V_VT(rgvarg[1]) = %d\n", V_VT(&pdp->rgvarg[1]));
535 ok(V_I4(&pdp->rgvarg[0]) == 2, "V_I4(rgvarg[0]) = %ld\n", V_I4(&pdp->rgvarg[0]));
536 ok(V_I4(&pdp->rgvarg[1]) == 1, "V_I4(rgvarg[1]) = %ld\n", V_I4(&pdp->rgvarg[1]));
537
538 hres = IServiceProvider_QueryService(pspCaller, &SID_GetCaller, &IID_IServiceProvider, (void**)&caller);
539 ok(hres == E_NOINTERFACE, "QueryService(SID_GetCaller) returned: %08lx\n", hres);
540 ok(caller == NULL, "caller != NULL\n");
541 break;
542
543 default:
544 ok(0, "unexpected call\n");
545 return E_NOTIMPL;
546 }
547
548 return S_OK;
549}
550
551static IDispatchExVtbl testObjVtbl = {
567};
568
570
572{
574 *ppv = iface;
575 }else if(IsEqualGUID(&IID_IActiveScriptSite, riid)) {
576 *ppv = iface;
577 }else {
579 CHECK_EXPECT(site_QI_NULL);
580 *ppv = NULL;
581 return E_NOINTERFACE;
582 }
583
584 IUnknown_AddRef((IUnknown*)*ppv);
585 return S_OK;
586}
587
589{
590 return 2;
591}
592
594{
595 return 1;
596}
597
599{
600 *plcid = GetUserDefaultLCID();
601 return S_OK;
602}
603
605 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
606{
607 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %lx\n", dwReturnMask);
608 ok(!ppti, "ppti != NULL\n");
609 ok(!lstrcmpW(pstrName, L"test"), "pstrName = %s\n", wine_dbgstr_w(pstrName));
610
611 *ppiunkItem = (IUnknown*)&testObj;
612 return S_OK;
613}
614
616{
617 return E_NOTIMPL;
618}
619
621 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
622{
623 return E_NOTIMPL;
624}
625
627{
628 return E_NOTIMPL;
629}
630
632{
633 return E_NOTIMPL;
634}
635
637{
638 CHECK_EXPECT(OnEnterScript);
639 return E_NOTIMPL;
640}
641
643{
644 CHECK_EXPECT(OnLeaveScript);
645 return E_NOTIMPL;
646}
647
648static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
660};
661
663
664#define parse_script(p,s) _parse_script(__LINE__,p,s)
665static void _parse_script(unsigned line, IActiveScriptParse *parser, const WCHAR *script)
666{
668
670 ok_(__FILE__,line)(hres == S_OK, "ParseScriptText failed: %08lx\n", hres);
671}
672
673static IActiveScriptParse *create_script(void)
674{
675 IActiveScriptParse *parser;
678
679 hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
680 &IID_IActiveScript, (void**)&script);
681 if(FAILED(hres))
682 return NULL;
683
684 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParse, (void**)&parser);
685 ok(hres == S_OK, "Could not get IActiveScriptParse: %08lx\n", hres);
686
688 ok(hres == S_OK, "InitNew failed: %08lx\n", hres);
689
690 hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
691 ok(hres == S_OK, "SetScriptSite failed: %08lx\n", hres);
692
693 hres = IActiveScript_AddNamedItem(script, L"test",
694 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
695 ok(hres == S_OK, "AddNamedItem failed: %08lx\n", hres);
696
697 hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED);
698 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08lx\n", hres);
699
700 IActiveScript_Release(script);
701
702 return parser;
703}
704
705static void run_scripts(void)
706{
708 DISPPARAMS dp = { 0 };
709 IDispatchEx *dispex;
710 IDispatch *disp;
711 DISPID dispid;
713 VARIANT var;
714 BSTR bstr;
715
717
719 ok(hres == S_OK, "Could not get IVariantChangeType iface: %08lx\n", hres);
720
721 SET_EXPECT(OnEnterScript); /* checked in callback */
722 SET_EXPECT(testArgConv);
723 SET_EXPECT(testGetCallerJS);
725 L"var obj = {"
726 L" toString: function() { return 'strval'; },"
727 L" valueOf: function() { return 10; }"
728 L"};"
729 L"testArgConv(obj);"
730 L"function testGetCallerFunc() { testGetCaller(); };"
731 L"testGetCallerJS(42);");
732 CHECK_CALLED(testGetCallerJS);
733 CHECK_CALLED(testArgConv);
734 CHECK_CALLED(OnLeaveScript); /* set in callback */
735
737 IDispatch_Release(stored_obj);
738 IVariantChangeType_Release(script_change_type);
739
741 ok(hres == S_OK, "Could not get IActiveScript: %08lx\n", hres);
742 hres = IActiveScript_GetScriptDispatch(active_script, NULL, &disp);
743 ok(hres == S_OK, "GetScriptDispatch failed: %08lx\n", hres);
744 IActiveScript_Release(active_script);
745 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
746 ok(hres == S_OK, "Could not get IDispatchEx: %08lx\n", hres);
747 IDispatch_Release(disp);
748 bstr = SysAllocString(L"testGetCallerFunc");
749 hres = IDispatchEx_GetDispID(dispex, bstr, 0, &dispid);
750 ok(hres == S_OK, "GetDispID failed: %08lx\n", hres);
751 SysFreeString(bstr);
752
753 hres = IDispatchEx_InvokeEx(dispex, dispid, 0, DISPATCH_PROPERTYGET, &dp, &var, NULL, NULL);
754 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
755 ok(V_VT(&var) == VT_DISPATCH, "V_VT(testGetCallerFunc) = %d\n", V_VT(&var));
756 ok(V_DISPATCH(&var) != NULL, "V_DISPATCH(testGetCallerFunc) = NULL\n");
757 IDispatchEx_Release(dispex);
758 hres = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IDispatchEx, (void**)&dispex);
759 ok(hres == S_OK, "Could not get IDispatchEx: %08lx\n", hres);
760 IDispatch_Release(V_DISPATCH(&var));
761
762 SET_EXPECT(OnEnterScript);
763 SET_EXPECT(OnLeaveScript);
764 SET_EXPECT(testGetCaller);
765 hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
766 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
767 CHECK_CALLED(testGetCaller);
768 CHECK_CALLED(OnLeaveScript);
770 SET_EXPECT(OnEnterScript);
771 SET_EXPECT(OnLeaveScript);
772 SET_EXPECT(testGetCaller);
773 hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, NULL, NULL, test_get_caller_sp);
774 ok(hres == S_OK, "InvokeEx failed: %08lx\n", hres);
775 CHECK_CALLED(testGetCaller);
776 CHECK_CALLED(OnLeaveScript);
777 IDispatchEx_Release(dispex);
778
781}
782
783static BOOL check_jscript(void)
784{
785 IActiveScriptProperty *script_prop;
786 IActiveScriptParse *parser;
788
790 if(!parser)
791 return FALSE;
792
793 SET_EXPECT(OnEnterScript);
794 SET_EXPECT(OnLeaveScript);
795 hres = IActiveScriptParse_ParseScriptText(parser, L"if(!('localeCompare' in String.prototype)) throw 1;",
796 NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
797 CLEAR_CALLED(OnEnterScript);
798 CLEAR_CALLED(OnLeaveScript);
799 if(hres == S_OK)
800 hres = IActiveScriptParse_QueryInterface(parser, &IID_IActiveScriptProperty, (void**)&script_prop);
802 if(hres == S_OK)
803 IActiveScriptProperty_Release(script_prop);
804
805 return hres == S_OK;
806}
807
809{
811
812 if(check_jscript())
813 run_scripts();
814 else
815 win_skip("Broken (too old) jscript\n");
816
818}
@ SCRIPTSTATE_STARTED
Definition: activscp.idl:58
enum tagSCRIPTSTATE SCRIPTSTATE
unsigned short UINT16
Definition: actypes.h:129
short INT16
Definition: actypes.h:130
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
const GUID IID_IUnknown
#define E_NOTIMPL
Definition: ddrawi.h:99
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
OLECHAR * BSTR
Definition: compat.h:2293
unsigned short VARTYPE
Definition: compat.h:2254
short VARIANT_BOOL
Definition: compat.h:2290
@ VT_BSTR
Definition: compat.h:2303
@ VT_R4
Definition: compat.h:2299
@ VT_NULL
Definition: compat.h:2296
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_UI2
Definition: compat.h:2312
@ VT_R8
Definition: compat.h:2300
@ VT_I4
Definition: compat.h:2298
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_EMPTY
Definition: compat.h:2295
@ VT_DISPATCH
Definition: compat.h:2304
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
LCID WINAPI GetUserDefaultLCID(void)
Definition: locale.c:1216
LCID lcid
Definition: locale.c:5660
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
const GLdouble * v
Definition: gl.h:2040
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
static BOOL check_jscript(void)
Definition: caller.c:783
static HRESULT WINAPI sp_caller_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: caller.c:278
#define SET_EXPECT(func)
Definition: caller.c:53
static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
Definition: caller.c:593
static IVariantChangeType * script_change_type
Definition: caller.c:87
#define CLEAR_CALLED(func)
Definition: caller.c:74
static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
Definition: caller.c:642
#define DISPID_TEST_TESTGETCALLERJS
Definition: caller.c:93
static void test_change_type(IVariantChangeType *change_type, VARIANT *src, const conv_results_t *ex)
Definition: caller.c:134
static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
Definition: caller.c:626
static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
Definition: caller.c:390
static void test_caller(IServiceProvider *caller, IDispatch *arg_obj)
Definition: caller.c:255
#define call_change_type(a, b, c, d)
Definition: caller.c:104
static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
Definition: caller.c:346
static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: caller.c:362
static const CLSID CLSID_JScript
Definition: caller.c:47
static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
Definition: caller.c:384
static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
Definition: caller.c:408
static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: caller.c:370
static void run_scripts(void)
Definition: caller.c:705
#define CHECK_EXPECT(func)
Definition: caller.c:62
static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
Definition: caller.c:615
static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
Definition: caller.c:604
static void _parse_script(unsigned line, IActiveScriptParse *parser, const WCHAR *script)
Definition: caller.c:665
#define DEFINE_EXPECT(func)
Definition: caller.c:50
static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
Definition: caller.c:396
static IServiceProvider sp_caller_obj
Definition: caller.c:276
#define IActiveScriptParse_InitNew
Definition: caller.c:42
#define IActiveScriptParse_ParseScriptText
Definition: caller.c:43
static IActiveScriptParse * create_script(void)
Definition: caller.c:673
#define IActiveScriptParse_Release
Definition: caller.c:41
static ULONG WINAPI sp_caller_Release(IServiceProvider *iface)
Definition: caller.c:297
#define change_type_fail(a, b, c, d)
Definition: caller.c:123
#define parse_script(p, s)
Definition: caller.c:664
static void test_change_types(IVariantChangeType *change_type, IDispatch *obj_disp)
Definition: caller.c:189
static ULONG WINAPI sp_caller_AddRef(IServiceProvider *iface)
Definition: caller.c:292
#define DISPID_TEST_TESTGETCALLER
Definition: caller.c:92
static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
Definition: caller.c:402
static HRESULT WINAPI Test_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
Definition: caller.c:414
#define IActiveScriptParse_QueryInterface
Definition: caller.c:40
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
Definition: caller.c:325
static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
Definition: caller.c:571
static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
Definition: caller.c:636
static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
Definition: caller.c:341
static void _change_type_fail(unsigned line, IVariantChangeType *change_type, VARIANT *src, VARTYPE vt, HRESULT exhres)
Definition: caller.c:124
static HRESULT WINAPI sp_caller_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: caller.c:302
#define CHECK_CALLED(func)
Definition: caller.c:68
static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
Definition: caller.c:588
static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
Definition: caller.c:620
static void _call_change_type(unsigned line, IVariantChangeType *change_type, VARIANT *dst, VARIANT *src, VARTYPE vt)
Definition: caller.c:105
static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: caller.c:357
static IServiceProvider * test_get_caller_sp
Definition: caller.c:89
#define DISPID_TEST_TESTARGCONV
Definition: caller.c:91
static IActiveScriptParse * active_script_parser
Definition: caller.c:86
static IDispatch * stored_obj
Definition: caller.c:88
static IDispatchEx testObj
Definition: caller.c:569
static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl
Definition: caller.c:648
#define DISPID_TEST_TESTGETCALLERNESTED
Definition: caller.c:94
static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
Definition: caller.c:378
static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
Definition: caller.c:598
static IActiveScriptSite ActiveScriptSite
Definition: caller.c:662
static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
Definition: caller.c:631
static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
Definition: caller.c:351
static IDispatchExVtbl testObjVtbl
Definition: caller.c:551
static const IServiceProviderVtbl sp_caller_vtbl
Definition: caller.c:316
static HRESULT WINAPI Test_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
Definition: caller.c:440
#define wine_dbgstr_w
Definition: kernel32.h:34
#define win_skip
Definition: minitest.h:67
const char * var
Definition: shader.c:5666
HRESULT hres
Definition: protocol.c:465
static VARIANTARG static DISPID
Definition: ordinal.c:49
static HRESULT change_type(VARIANT *dst, VARIANT *src, VARTYPE vt, IServiceProvider *caller)
Definition: dispex.c:914
script
Definition: msipriv.h:383
unsigned int UINT
Definition: ndis.h:50
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define V_BOOL(A)
Definition: oleauto.h:224
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define V_UI2(A)
Definition: oleauto.h:268
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
#define V_R4(A)
Definition: oleauto.h:260
#define V_DISPATCH(A)
Definition: oleauto.h:239
#define V_R8(A)
Definition: oleauto.h:262
#define DISPATCH_PROPERTYGET
Definition: oleauto.h:1007
#define V_I2(A)
Definition: oleauto.h:245
const GUID IID_IDispatch
short WCHAR
Definition: pedump.c:58
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
const WCHAR * str
DWORD LCID
Definition: nls.h:13
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:171
Definition: scsiwmi.h:51
double double_result
Definition: caller.c:101
int test_double
Definition: caller.c:100
int int_result
Definition: caller.c:97
VARIANT_BOOL bool_result
Definition: caller.c:99
const WCHAR * str_result
Definition: caller.c:98
Definition: comerr.c:44
Definition: parser.c:49
Definition: import.c:81
uint32_t ULONG
Definition: typedefs.h:59
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
static IActiveScript * active_script
Definition: caller.c:84
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3837
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define DISP_E_BADVARTYPE
Definition: winerror.h:3620