ReactOS 0.4.15-dev-7842-g558ab78
jscript.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 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 <assert.h>
20
21#include "jscript.h"
22#include "engine.h"
23#include "objsafe.h"
24
25#include "wine/debug.h"
26
28
29#ifdef _WIN64
30
31#define CTXARG_T DWORDLONG
32#define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
33#define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_64Vtbl
34
35#else
36
37#define CTXARG_T DWORD
38#define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
39#define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_32Vtbl
40
41#endif
42
43typedef struct {
45 IActiveScriptParse IActiveScriptParse_iface;
46 IActiveScriptParseProcedure2 IActiveScriptParseProcedure2_iface;
50
52
60
62
65} JScript;
66
68{
69 if(--ctx->ref)
70 return;
71
72 jsval_release(ctx->acc);
74 if(ctx->cc)
75 release_cc(ctx->cc);
76 heap_pool_free(&ctx->tmp_heap);
77 if(ctx->last_match)
78 jsstr_release(ctx->last_match);
79 assert(!ctx->stack_top);
80 heap_free(ctx->stack);
81
82 ctx->jscaller->ctx = NULL;
83 IServiceProvider_Release(&ctx->jscaller->IServiceProvider_iface);
84
86}
87
89{
90 if(This->ctx->state == state)
91 return;
92
93 This->ctx->state = state;
94 if(This->site)
95 IActiveScriptSite_OnStateChange(This->site, state);
96}
97
99{
100 return ctx->state == SCRIPTSTATE_STARTED
101 || ctx->state == SCRIPTSTATE_CONNECTED
102 || ctx->state == SCRIPTSTATE_DISCONNECTED;
103}
104
106{
108
109 IActiveScriptSite_OnEnterScript(This->site);
110
111 clear_ei(This->ctx);
112 hres = exec_source(This->ctx, EXEC_GLOBAL, code, &code->global_code, NULL, NULL, NULL, This->ctx->global, 0, NULL, NULL);
113
114 IActiveScriptSite_OnLeaveScript(This->site);
115 return hres;
116}
117
119{
120 bytecode_t *iter, *iter2;
121
122 if(!This->queue_head)
123 return;
124
125 iter = This->queue_head;
126 while(iter) {
127 iter2 = iter->next;
128 iter->next = NULL;
129 release_bytecode(iter);
130 iter = iter2;
131 }
132
133 This->queue_head = This->queue_tail = NULL;
134}
135
137{
138 bytecode_t *iter;
139
140 for(iter = This->queue_head; iter; iter = iter->next)
141 exec_global_code(This, iter);
142
144}
145
147{
149
150 This->ctx->lcid = This->lcid;
151
152 hres = init_global(This->ctx);
153 if(FAILED(hres))
154 return hres;
155
156 IActiveScriptSite_AddRef(This->site);
157 This->ctx->site = This->site;
158
160 return S_OK;
161}
162
164{
165 if(This->ctx) {
166 switch(This->ctx->state) {
170 return;
171 /* FALLTHROUGH */
175
176 if(This->ctx->state == SCRIPTSTATE_DISCONNECTED)
179 return;
180 /* FALLTHROUGH */
182 if(This->ctx->host_global) {
183 IDispatch_Release(This->ctx->host_global);
184 This->ctx->host_global = NULL;
185 }
186
187 if(This->ctx->named_items) {
188 named_item_t *iter, *iter2;
189
190 iter = This->ctx->named_items;
191 while(iter) {
192 iter2 = iter->next;
193
194 if(iter->disp)
195 IDispatch_Release(iter->disp);
196 heap_free(iter->name);
197 heap_free(iter);
198 iter = iter2;
199 }
200
201 This->ctx->named_items = NULL;
202 }
203
204 if(This->ctx->secmgr) {
205 IInternetHostSecurityManager_Release(This->ctx->secmgr);
206 This->ctx->secmgr = NULL;
207 }
208
209 if(This->ctx->site) {
210 IActiveScriptSite_Release(This->ctx->site);
211 This->ctx->site = NULL;
212 }
213
214 if(This->ctx->global) {
215 jsdisp_release(This->ctx->global);
216 This->ctx->global = NULL;
217 }
218 /* FALLTHROUGH */
221 break;
222 default:
223 assert(0);
224 }
225
227 }else if(state == SCRIPTSTATE_UNINITIALIZED) {
228 if(This->site)
229 IActiveScriptSite_OnStateChange(This->site, state);
230 }else {
231 FIXME("NULL ctx\n");
232 }
233
235 This->thread_id = 0;
236
237 if(This->site) {
238 IActiveScriptSite_Release(This->site);
239 This->site = NULL;
240 }
241}
242
243typedef struct {
245
247
249} AXSite;
250
252{
253 return CONTAINING_RECORD(iface, AXSite, IServiceProvider_iface);
254}
255
257{
259
261 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
262 *ppv = &This->IServiceProvider_iface;
263 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
264 TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
265 *ppv = &This->IServiceProvider_iface;
266 }else {
267 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
268 *ppv = NULL;
269 return E_NOINTERFACE;
270 }
271
272 IUnknown_AddRef((IUnknown*)*ppv);
273 return S_OK;
274}
275
277{
280
281 TRACE("(%p) ref=%d\n", This, ref);
282
283 return ref;
284}
285
287{
290
291 TRACE("(%p) ref=%d\n", This, ref);
292
293 if(!ref)
294 {
295 if(This->sp)
296 IServiceProvider_Release(This->sp);
297
299 }
300
301 return ref;
302}
303
305 REFGUID guidService, REFIID riid, void **ppv)
306{
308
309 TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
310
311 if(!This->sp)
312 return E_NOINTERFACE;
313
314 return IServiceProvider_QueryService(This->sp, guidService, riid, ppv);
315}
316
317static IServiceProviderVtbl AXSiteVtbl = {
322};
323
325{
327 AXSite *ret;
329
330 hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IServiceProvider, (void**)&sp);
331 if(FAILED(hres)) {
332 TRACE("Could not get IServiceProvider iface: %08x\n", hres);
333 }
334
335 ret = heap_alloc(sizeof(AXSite));
336 if(!ret) {
337 IServiceProvider_Release(sp);
338 return NULL;
339 }
340
341 ret->IServiceProvider_iface.lpVtbl = &AXSiteVtbl;
342 ret->ref = 1;
343 ret->sp = sp;
344
345 return (IUnknown*)&ret->IServiceProvider_iface;
346}
347
349{
350 return CONTAINING_RECORD(iface, JScript, IActiveScript_iface);
351}
352
354{
356
357 *ppv = NULL;
358
360 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
361 *ppv = &This->IActiveScript_iface;
362 }else if(IsEqualGUID(riid, &IID_IActiveScript)) {
363 TRACE("(%p)->(IID_IActiveScript %p)\n", This, ppv);
364 *ppv = &This->IActiveScript_iface;
365 }else if(IsEqualGUID(riid, &IID_IActiveScriptParse)) {
366 TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This, ppv);
367 *ppv = &This->IActiveScriptParse_iface;
368 }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure)) {
369 TRACE("(%p)->(IID_IActiveScriptParseProcedure %p)\n", This, ppv);
370 *ppv = &This->IActiveScriptParseProcedure2_iface;
371 }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure2)) {
372 TRACE("(%p)->(IID_IActiveScriptParseProcedure2 %p)\n", This, ppv);
373 *ppv = &This->IActiveScriptParseProcedure2_iface;
374 }else if(IsEqualGUID(riid, &IID_IActiveScriptProperty)) {
375 TRACE("(%p)->(IID_IActiveScriptProperty %p)\n", This, ppv);
376 *ppv = &This->IActiveScriptProperty_iface;
377 }else if(IsEqualGUID(riid, &IID_IObjectSafety)) {
378 TRACE("(%p)->(IID_IObjectSafety %p)\n", This, ppv);
379 *ppv = &This->IObjectSafety_iface;
380 }else if(IsEqualGUID(riid, &IID_IVariantChangeType)) {
381 TRACE("(%p)->(IID_IVariantChangeType %p)\n", This, ppv);
382 *ppv = &This->IVariantChangeType_iface;
383 }
384
385 if(*ppv) {
386 IUnknown_AddRef((IUnknown*)*ppv);
387 return S_OK;
388 }
389
390 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
391 return E_NOINTERFACE;
392}
393
395{
398
399 TRACE("(%p) ref=%d\n", This, ref);
400
401 return ref;
402}
403
405{
408
409 TRACE("(%p) ref=%d\n", iface, ref);
410
411 if(!ref) {
412 if(This->ctx && This->ctx->state != SCRIPTSTATE_CLOSED)
413 IActiveScript_Close(&This->IActiveScript_iface);
414 if(This->ctx) {
415 This->ctx->active_script = NULL;
416 script_release(This->ctx);
417 }
420 }
421
422 return ref;
423}
424
427{
429 LCID lcid;
431
432 TRACE("(%p)->(%p)\n", This, pass);
433
434 if(!pass)
435 return E_POINTER;
436
437 if(This->site)
438 return E_UNEXPECTED;
439
441 return E_UNEXPECTED;
442
443 This->site = pass;
444 IActiveScriptSite_AddRef(This->site);
445
446 hres = IActiveScriptSite_GetLCID(This->site, &lcid);
447 if(hres == S_OK)
448 This->lcid = lcid;
449
450 return This->ctx ? set_ctx_site(This) : S_OK;
451}
452
454 void **ppvObject)
455{
457 FIXME("(%p)->()\n", This);
458 return E_NOTIMPL;
459}
460
462{
464
465 TRACE("(%p)->(%d)\n", This, ss);
466
467 if(This->thread_id && GetCurrentThreadId() != This->thread_id)
468 return E_UNEXPECTED;
469
471 if(This->ctx && This->ctx->state == SCRIPTSTATE_CLOSED)
472 return E_UNEXPECTED;
473
475 return S_OK;
476 }
477
478 if(!This->ctx)
479 return E_UNEXPECTED;
480
481 switch(ss) {
483 case SCRIPTSTATE_CONNECTED: /* FIXME */
484 if(This->ctx->state == SCRIPTSTATE_CLOSED)
485 return E_UNEXPECTED;
486
488 break;
490 FIXME("unimplemented SCRIPTSTATE_INITIALIZED\n");
491 return S_OK;
492 default:
493 FIXME("unimplemented state %d\n", ss);
494 return E_NOTIMPL;
495 }
496
498 return S_OK;
499}
500
502{
504
505 TRACE("(%p)->(%p)\n", This, pssState);
506
507 if(!pssState)
508 return E_POINTER;
509
510 if(This->thread_id && This->thread_id != GetCurrentThreadId())
511 return E_UNEXPECTED;
512
513 *pssState = This->ctx ? This->ctx->state : SCRIPTSTATE_UNINITIALIZED;
514 return S_OK;
515}
516
518{
520
521 TRACE("(%p)->()\n", This);
522
523 if(This->thread_id && This->thread_id != GetCurrentThreadId())
524 return E_UNEXPECTED;
525
527 return S_OK;
528}
529
531 LPCOLESTR pstrName, DWORD dwFlags)
532{
535 IDispatch *disp = NULL;
537
538 TRACE("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags);
539
540 if(This->thread_id != GetCurrentThreadId() || !This->ctx || This->ctx->state == SCRIPTSTATE_CLOSED)
541 return E_UNEXPECTED;
542
543 if(dwFlags & SCRIPTITEM_GLOBALMEMBERS) {
544 IUnknown *unk;
545
546 hres = IActiveScriptSite_GetItemInfo(This->site, pstrName, SCRIPTINFO_IUNKNOWN, &unk, NULL);
547 if(FAILED(hres)) {
548 WARN("GetItemInfo failed: %08x\n", hres);
549 return hres;
550 }
551
552 hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp);
553 IUnknown_Release(unk);
554 if(FAILED(hres)) {
555 WARN("object does not implement IDispatch\n");
556 return hres;
557 }
558
559 if(This->ctx->host_global)
560 IDispatch_Release(This->ctx->host_global);
561 IDispatch_AddRef(disp);
562 This->ctx->host_global = disp;
563 }
564
565 item = heap_alloc(sizeof(*item));
566 if(!item) {
567 if(disp)
568 IDispatch_Release(disp);
569 return E_OUTOFMEMORY;
570 }
571
572 item->disp = disp;
573 item->flags = dwFlags;
574 item->name = heap_strdupW(pstrName);
575 if(!item->name) {
576 if(disp)
577 IDispatch_Release(disp);
579 return E_OUTOFMEMORY;
580 }
581
582 item->next = This->ctx->named_items;
583 This->ctx->named_items = item;
584
585 return S_OK;
586}
587
589 DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
590{
592 FIXME("(%p)->()\n", This);
593 return E_NOTIMPL;
594}
595
596static HRESULT WINAPI JScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName,
597 IDispatch **ppdisp)
598{
600
601 TRACE("(%p)->(%p)\n", This, ppdisp);
602
603 if(!ppdisp)
604 return E_POINTER;
605
606 if(This->thread_id != GetCurrentThreadId() || !This->ctx->global) {
607 *ppdisp = NULL;
608 return E_UNEXPECTED;
609 }
610
611 *ppdisp = to_disp(This->ctx->global);
612 IDispatch_AddRef(*ppdisp);
613 return S_OK;
614}
615
617 SCRIPTTHREADID *pstridThread)
618{
620 FIXME("(%p)->()\n", This);
621 return E_NOTIMPL;
622}
623
625 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
626{
628 FIXME("(%p)->()\n", This);
629 return E_NOTIMPL;
630}
631
633 SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
634{
636 FIXME("(%p)->()\n", This);
637 return E_NOTIMPL;
638}
639
641 SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
642{
644 FIXME("(%p)->()\n", This);
645 return E_NOTIMPL;
646}
647
649{
651 FIXME("(%p)->()\n", This);
652 return E_NOTIMPL;
653}
654
655static const IActiveScriptVtbl JScriptVtbl = {
672};
673
674static inline JScript *impl_from_IActiveScriptParse(IActiveScriptParse *iface)
675{
676 return CONTAINING_RECORD(iface, JScript, IActiveScriptParse_iface);
677}
678
679static HRESULT WINAPI JScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
680{
682 return IActiveScript_QueryInterface(&This->IActiveScript_iface, riid, ppv);
683}
684
685static ULONG WINAPI JScriptParse_AddRef(IActiveScriptParse *iface)
686{
688 return IActiveScript_AddRef(&This->IActiveScript_iface);
689}
690
691static ULONG WINAPI JScriptParse_Release(IActiveScriptParse *iface)
692{
694 return IActiveScript_Release(&This->IActiveScript_iface);
695}
696
697static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
698{
702
703 TRACE("(%p)\n", This);
704
705 if(This->ctx)
706 return E_UNEXPECTED;
707
708 ctx = heap_alloc_zero(sizeof(script_ctx_t));
709 if(!ctx)
710 return E_OUTOFMEMORY;
711
712 ctx->ref = 1;
714 ctx->active_script = &This->IActiveScript_iface;
715 ctx->safeopt = This->safeopt;
716 ctx->version = This->version;
717 ctx->html_mode = This->html_mode;
718 ctx->ei.val = jsval_undefined();
719 ctx->acc = jsval_undefined();
720 heap_pool_init(&ctx->tmp_heap);
721
723 if(FAILED(hres)) {
724 heap_free(ctx);
725 return hres;
726 }
727
728 ctx->last_match = jsstr_empty();
729
731 if(ctx) {
733 return E_UNEXPECTED;
734 }
735
736 return This->site ? set_ctx_site(This) : S_OK;
737}
738
739static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface,
740 LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
741 LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
742 CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
743 BSTR *pbstrName, EXCEPINFO *pexcepinfo)
744{
746 FIXME("(%p)->(%s %s %s %s %s %s %s %u %x %p %p)\n", This, debugstr_w(pstrDefaultName),
747 debugstr_w(pstrCode), debugstr_w(pstrItemName), debugstr_w(pstrSubItemName),
748 debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), wine_dbgstr_longlong(dwSourceContextCookie),
749 ulStartingLineNumber, dwFlags, pbstrName, pexcepinfo);
750 return E_NOTIMPL;
751}
752
753static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
754 LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
755 LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine,
756 DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
757{
761
762 TRACE("(%p)->(%s %s %p %s %s %u %x %p %p)\n", This, debugstr_w(pstrCode),
763 debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
764 wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLine, dwFlags, pvarResult, pexcepinfo);
765
766 if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED)
767 return E_UNEXPECTED;
768
769 hres = compile_script(This->ctx, pstrCode, NULL, pstrDelimiter, (dwFlags & SCRIPTTEXT_ISEXPRESSION) != 0,
770 This->is_encode, &code);
771 if(FAILED(hres))
772 return hres;
773
774 if(dwFlags & SCRIPTTEXT_ISEXPRESSION) {
775 jsval_t r;
776
777 IActiveScriptSite_OnEnterScript(This->site);
778
779 clear_ei(This->ctx);
780 hres = exec_source(This->ctx, EXEC_GLOBAL, code, &code->global_code, NULL, NULL, NULL, This->ctx->global, 0, NULL, &r);
781 if(SUCCEEDED(hres)) {
782 if(pvarResult)
783 hres = jsval_to_variant(r, pvarResult);
785 }
786
787 IActiveScriptSite_OnLeaveScript(This->site);
788 return hres;
789 }
790
791 /*
792 * Although pvarResult is not really used without SCRIPTTEXT_ISEXPRESSION flag, if it's not NULL,
793 * script is executed immediately, even if it's not in started state yet.
794 */
795 if(!pvarResult && !is_started(This->ctx)) {
796 if(This->queue_tail)
797 This->queue_tail = This->queue_tail->next = code;
798 else
799 This->queue_head = This->queue_tail = code;
800 return S_OK;
801 }
802
805 if(FAILED(hres))
806 return hres;
807
808 if(pvarResult)
809 V_VT(pvarResult) = VT_EMPTY;
810 return S_OK;
811}
812
820};
821
822static inline JScript *impl_from_IActiveScriptParseProcedure2(IActiveScriptParseProcedure2 *iface)
823{
824 return CONTAINING_RECORD(iface, JScript, IActiveScriptParseProcedure2_iface);
825}
826
827static HRESULT WINAPI JScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2 *iface, REFIID riid, void **ppv)
828{
830 return IActiveScript_QueryInterface(&This->IActiveScript_iface, riid, ppv);
831}
832
833static ULONG WINAPI JScriptParseProcedure_AddRef(IActiveScriptParseProcedure2 *iface)
834{
836 return IActiveScript_AddRef(&This->IActiveScript_iface);
837}
838
839static ULONG WINAPI JScriptParseProcedure_Release(IActiveScriptParseProcedure2 *iface)
840{
842 return IActiveScript_Release(&This->IActiveScript_iface);
843}
844
845static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface,
846 LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName,
847 LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter,
848 CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
849{
852 jsdisp_t *dispex;
854
855 TRACE("(%p)->(%s %s %s %s %p %s %s %u %x %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrFormalParams),
856 debugstr_w(pstrProcedureName), debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
857 wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLineNumber, dwFlags, ppdisp);
858
859 if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED)
860 return E_UNEXPECTED;
861
862 hres = compile_script(This->ctx, pstrCode, pstrFormalParams, pstrDelimiter, FALSE, This->is_encode, &code);
863 if(FAILED(hres)) {
864 WARN("Parse failed %08x\n", hres);
865 return hres;
866 }
867
868 hres = create_source_function(This->ctx, code, &code->global_code, NULL, &dispex);
870 if(FAILED(hres))
871 return hres;
872
873 *ppdisp = to_disp(dispex);
874 return S_OK;
875}
876
882};
883
885{
886 return CONTAINING_RECORD(iface, JScript, IActiveScriptProperty_iface);
887}
888
890{
892 return IActiveScript_QueryInterface(&This->IActiveScript_iface, riid, ppv);
893}
894
896{
898 return IActiveScript_AddRef(&This->IActiveScript_iface);
899}
900
902{
904 return IActiveScript_Release(&This->IActiveScript_iface);
905}
906
908 VARIANT *pvarIndex, VARIANT *pvarValue)
909{
911 FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
912 return E_NOTIMPL;
913}
914
916 VARIANT *pvarIndex, VARIANT *pvarValue)
917{
919
920 TRACE("(%p)->(%x %s %s)\n", This, dwProperty, debugstr_variant(pvarIndex), debugstr_variant(pvarValue));
921
922 if(pvarIndex)
923 FIXME("unsupported pvarIndex\n");
924
925 switch(dwProperty) {
926 case SCRIPTPROP_INVOKEVERSIONING:
927 if(V_VT(pvarValue) != VT_I4 || V_I4(pvarValue) < 0
928 || (V_I4(pvarValue) > 15 && !(V_I4(pvarValue) & SCRIPTLANGUAGEVERSION_HTML))) {
929 WARN("invalid value %s\n", debugstr_variant(pvarValue));
930 return E_INVALIDARG;
931 }
932
933 This->version = V_I4(pvarValue) & 0x1ff;
934 This->html_mode = (V_I4(pvarValue) & SCRIPTLANGUAGEVERSION_HTML) != 0;
935 break;
936 default:
937 FIXME("Unimplemented property %x\n", dwProperty);
938 return E_NOTIMPL;
939 }
940
941 return S_OK;
942}
943
944static const IActiveScriptPropertyVtbl JScriptPropertyVtbl = {
950};
951
953{
954 return CONTAINING_RECORD(iface, JScript, IObjectSafety_iface);
955}
956
958{
960 return IActiveScript_QueryInterface(&This->IActiveScript_iface, riid, ppv);
961}
962
964{
966 return IActiveScript_AddRef(&This->IActiveScript_iface);
967}
968
970{
972 return IActiveScript_Release(&This->IActiveScript_iface);
973}
974
975#define SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
976
978 DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
979{
981
982 TRACE("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
983
984 if(!pdwSupportedOptions || !pdwEnabledOptions)
985 return E_POINTER;
986
987 *pdwSupportedOptions = SUPPORTED_OPTIONS;
988 *pdwEnabledOptions = This->safeopt;
989
990 return S_OK;
991}
992
994 DWORD dwOptionSetMask, DWORD dwEnabledOptions)
995{
997
998 TRACE("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
999
1000 if(dwOptionSetMask & ~SUPPORTED_OPTIONS)
1001 return E_FAIL;
1002
1003 This->safeopt = (dwEnabledOptions & dwOptionSetMask) | (This->safeopt & ~dwOptionSetMask) | INTERFACE_USES_DISPEX;
1004 return S_OK;
1005}
1006
1007static const IObjectSafetyVtbl JScriptSafetyVtbl = {
1013};
1014
1016{
1017 return CONTAINING_RECORD(iface, JScript, IVariantChangeType_iface);
1018}
1019
1021{
1023 return IActiveScript_QueryInterface(&This->IActiveScript_iface, riid, ppv);
1024}
1025
1027{
1029 return IActiveScript_AddRef(&This->IActiveScript_iface);
1030}
1031
1033{
1035 return IActiveScript_Release(&This->IActiveScript_iface);
1036}
1037
1039{
1041 VARIANT res;
1042 HRESULT hres;
1043
1044 TRACE("(%p)->(%p %p%s %x %d)\n", This, dst, src, debugstr_variant(src), lcid, vt);
1045
1046 if(!This->ctx) {
1047 FIXME("Object uninitialized\n");
1048 return E_UNEXPECTED;
1049 }
1050
1051 hres = variant_change_type(This->ctx, &res, src, vt);
1052 if(FAILED(hres))
1053 return hres;
1054
1056 if(FAILED(hres)) {
1057 VariantClear(&res);
1058 return hres;
1059 }
1060
1061 *dst = res;
1062 return S_OK;
1063}
1064
1065static const IVariantChangeTypeVtbl VariantChangeTypeVtbl = {
1070};
1071
1073{
1074 JScript *ret;
1075 HRESULT hres;
1076
1077 ret = heap_alloc_zero(sizeof(*ret));
1078 if(!ret)
1079 return E_OUTOFMEMORY;
1080
1081 lock_module();
1082
1083 ret->IActiveScript_iface.lpVtbl = &JScriptVtbl;
1084 ret->IActiveScriptParse_iface.lpVtbl = &JScriptParseVtbl;
1085 ret->IActiveScriptParseProcedure2_iface.lpVtbl = &JScriptParseProcedureVtbl;
1086 ret->IActiveScriptProperty_iface.lpVtbl = &JScriptPropertyVtbl;
1087 ret->IObjectSafety_iface.lpVtbl = &JScriptSafetyVtbl;
1088 ret->IVariantChangeType_iface.lpVtbl = &VariantChangeTypeVtbl;
1089 ret->ref = 1;
1090 ret->safeopt = INTERFACE_USES_DISPEX;
1091 ret->is_encode = is_encode;
1092
1093 hres = IActiveScript_QueryInterface(&ret->IActiveScript_iface, riid, ppv);
1094 IActiveScript_Release(&ret->IActiveScript_iface);
1095 return hres;
1096}
enum tagSCRIPTTHREADSTATE SCRIPTTHREADSTATE
DWORD SCRIPTTHREADID
Definition: activscp.idl:86
@ SCRIPTSTATE_INITIALIZED
Definition: activscp.idl:62
@ SCRIPTSTATE_DISCONNECTED
Definition: activscp.idl:60
@ SCRIPTSTATE_STARTED
Definition: activscp.idl:58
@ SCRIPTSTATE_UNINITIALIZED
Definition: activscp.idl:57
@ SCRIPTSTATE_CLOSED
Definition: activscp.idl:61
@ SCRIPTSTATE_CONNECTED
Definition: activscp.idl:59
enum tagSCRIPTSTATE SCRIPTSTATE
static int state
Definition: maze.c:121
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const GUID IID_IUnknown
#define FIXME(fmt,...)
Definition: debug.h:111
#define WARN(fmt,...)
Definition: debug.h:112
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
static WCHAR * heap_strdupW(const WCHAR *str)
Definition: propsheet.c:178
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
OLECHAR * BSTR
Definition: compat.h:2293
unsigned short VARTYPE
Definition: compat.h:2254
@ VT_I4
Definition: compat.h:2298
@ VT_EMPTY
Definition: compat.h:2295
static const IActiveScriptParseProcedure2Vtbl JScriptParseProcedureVtbl
Definition: jscript.c:877
static JScript * impl_from_IObjectSafety(IObjectSafety *iface)
Definition: jscript.c:952
static ULONG WINAPI JScriptParse_Release(IActiveScriptParse *iface)
Definition: jscript.c:691
static JScript * impl_from_IActiveScriptParse(IActiveScriptParse *iface)
Definition: jscript.c:674
static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
Definition: jscript.c:697
static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
Definition: jscript.c:461
static void clear_script_queue(JScript *This)
Definition: jscript.c:118
static void change_state(JScript *This, SCRIPTSTATE state)
Definition: jscript.c:88
static HRESULT WINAPI JScript_GetCurrentScriptThreadID(IActiveScript *iface, SCRIPTTHREADID *pstridThread)
Definition: jscript.c:616
static const IActiveScriptParseVtbl JScriptParseVtbl
Definition: jscript.c:813
static ULONG WINAPI JScript_AddRef(IActiveScript *iface)
Definition: jscript.c:394
static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface, LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName, LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
Definition: jscript.c:845
static ULONG WINAPI JScript_Release(IActiveScript *iface)
Definition: jscript.c:404
#define SUPPORTED_OPTIONS
Definition: jscript.c:975
static ULONG WINAPI JScriptSafety_AddRef(IObjectSafety *iface)
Definition: jscript.c:963
static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface, LPCOLESTR pstrName, DWORD dwFlags)
Definition: jscript.c:530
static HRESULT WINAPI JScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty, VARIANT *pvarIndex, VARIANT *pvarValue)
Definition: jscript.c:915
static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass)
Definition: jscript.c:425
static HRESULT WINAPI JScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2 *iface, REFIID riid, void **ppv)
Definition: jscript.c:827
#define IActiveScriptParseProcedure2Vtbl
Definition: jscript.c:39
static HRESULT WINAPI JScriptProperty_GetProperty(IActiveScriptProperty *iface, DWORD dwProperty, VARIANT *pvarIndex, VARIANT *pvarValue)
Definition: jscript.c:907
static ULONG WINAPI JScriptParseProcedure_AddRef(IActiveScriptParseProcedure2 *iface)
Definition: jscript.c:833
static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface, LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, BSTR *pbstrName, EXCEPINFO *pexcepinfo)
Definition: jscript.c:739
static HRESULT WINAPI JScript_Close(IActiveScript *iface)
Definition: jscript.c:517
static HRESULT WINAPI JScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
Definition: jscript.c:679
static void decrease_state(JScript *This, SCRIPTSTATE state)
Definition: jscript.c:163
static ULONG WINAPI AXSite_Release(IServiceProvider *iface)
Definition: jscript.c:286
static IServiceProviderVtbl AXSiteVtbl
Definition: jscript.c:317
static JScript * impl_from_IActiveScript(IActiveScript *iface)
Definition: jscript.c:348
#define IActiveScriptParseVtbl
Definition: jscript.c:38
static HRESULT WINAPI VariantChangeType_ChangeType(IVariantChangeType *iface, VARIANT *dst, VARIANT *src, LCID lcid, VARTYPE vt)
Definition: jscript.c:1038
static const IVariantChangeTypeVtbl VariantChangeTypeVtbl
Definition: jscript.c:1065
static ULONG WINAPI JScriptProperty_AddRef(IActiveScriptProperty *iface)
Definition: jscript.c:895
IUnknown * create_ax_site(script_ctx_t *ctx)
Definition: jscript.c:324
static const IActiveScriptVtbl JScriptVtbl
Definition: jscript.c:655
static HRESULT WINAPI JScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
Definition: jscript.c:648
static ULONG WINAPI VariantChangeType_Release(IVariantChangeType *iface)
Definition: jscript.c:1032
static AXSite * impl_from_IServiceProvider(IServiceProvider *iface)
Definition: jscript.c:251
HRESULT create_jscript_object(BOOL is_encode, REFIID riid, void **ppv)
Definition: jscript.c:1072
static JScript * impl_from_IActiveScriptProperty(IActiveScriptProperty *iface)
Definition: jscript.c:884
static HRESULT WINAPI JScriptSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
Definition: jscript.c:957
static HRESULT WINAPI JScript_GetScriptThreadState(IActiveScript *iface, SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
Definition: jscript.c:632
static HRESULT WINAPI JScriptSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
Definition: jscript.c:977
static HRESULT WINAPI JScriptSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions)
Definition: jscript.c:993
static HRESULT WINAPI JScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib, DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
Definition: jscript.c:588
static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
Definition: jscript.c:501
static ULONG WINAPI JScriptSafety_Release(IObjectSafety *iface)
Definition: jscript.c:969
static ULONG WINAPI AXSite_AddRef(IServiceProvider *iface)
Definition: jscript.c:276
static HRESULT WINAPI JScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv)
Definition: jscript.c:889
static ULONG WINAPI JScriptParse_AddRef(IActiveScriptParse *iface)
Definition: jscript.c:685
#define CTXARG_T
Definition: jscript.c:37
static HRESULT WINAPI JScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName, IDispatch **ppdisp)
Definition: jscript.c:596
static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid, void **ppvObject)
Definition: jscript.c:453
static JScript * impl_from_IVariantChangeType(IVariantChangeType *iface)
Definition: jscript.c:1015
static const IObjectSafetyVtbl JScriptSafetyVtbl
Definition: jscript.c:1007
static ULONG WINAPI JScriptParseProcedure_Release(IActiveScriptParseProcedure2 *iface)
Definition: jscript.c:839
static HRESULT WINAPI JScript_InterruptScriptThread(IActiveScript *iface, SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
Definition: jscript.c:640
static HRESULT set_ctx_site(JScript *This)
Definition: jscript.c:146
static void exec_queued_code(JScript *This)
Definition: jscript.c:136
static HRESULT WINAPI AXSite_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: jscript.c:256
void script_release(script_ctx_t *ctx)
Definition: jscript.c:67
static const IActiveScriptPropertyVtbl JScriptPropertyVtbl
Definition: jscript.c:944
static ULONG WINAPI VariantChangeType_AddRef(IVariantChangeType *iface)
Definition: jscript.c:1026
static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine, DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
Definition: jscript.c:753
static JScript * impl_from_IActiveScriptParseProcedure2(IActiveScriptParseProcedure2 *iface)
Definition: jscript.c:822
static HRESULT WINAPI VariantChangeType_QueryInterface(IVariantChangeType *iface, REFIID riid, void **ppv)
Definition: jscript.c:1020
static HRESULT WINAPI JScript_GetScriptThreadID(IActiveScript *iface, DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
Definition: jscript.c:624
static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
Definition: jscript.c:353
static HRESULT WINAPI AXSite_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: jscript.c:304
static BOOL is_started(script_ctx_t *ctx)
Definition: jscript.c:98
static HRESULT exec_global_code(JScript *This, bytecode_t *code)
Definition: jscript.c:105
static ULONG WINAPI JScriptProperty_Release(IActiveScriptProperty *iface)
Definition: jscript.c:901
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:86
#define assert(x)
Definition: debug.h:53
void clear_ei(script_ctx_t *ctx)
Definition: engine.c:430
HRESULT exec_source(script_ctx_t *ctx, DWORD flags, bytecode_t *bytecode, function_code_t *function, scope_chain_t *scope, IDispatch *this_obj, jsdisp_t *function_instance, jsdisp_t *variable_obj, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: engine.c:2958
#define EXEC_GLOBAL
Definition: engine.h:248
HRESULT create_source_function(script_ctx_t *, bytecode_t *, function_code_t *, scope_chain_t *, jsdisp_t **) DECLSPEC_HIDDEN
Definition: function.c:767
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint res
Definition: glext.h:9613
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
#define ss
Definition: i386-dis.c:441
static void lock_module(void)
Definition: ieframe.h:335
static void unlock_module(void)
Definition: ieframe.h:339
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define InterlockedCompareExchangePointer
Definition: interlocked.h:129
#define InterlockedCompareExchange
Definition: interlocked.h:104
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
void release_bytecode(bytecode_t *code)
Definition: compile.c:2226
HRESULT compile_script(script_ctx_t *ctx, const WCHAR *code, const WCHAR *args, const WCHAR *delimiter, BOOL from_eval, BOOL use_decode, bytecode_t **ret)
Definition: compile.c:2461
HRESULT init_global(script_ctx_t *ctx)
Definition: global.c:1105
void heap_pool_free(heap_pool_t *) DECLSPEC_HIDDEN
Definition: jsutils.c:169
static void jsdisp_release(jsdisp_t *jsdisp)
Definition: jscript.h:268
#define SCRIPTLANGUAGEVERSION_HTML
Definition: jscript.h:47
static IDispatch * to_disp(jsdisp_t *jsdisp)
Definition: jscript.h:245
void heap_pool_init(heap_pool_t *) DECLSPEC_HIDDEN
Definition: jsutils.c:71
HRESULT create_jscaller(script_ctx_t *) DECLSPEC_HIDDEN
Definition: jsutils.c:1047
void release_cc(cc_ctx_t *) DECLSPEC_HIDDEN
Definition: lex.c:817
HRESULT variant_change_type(script_ctx_t *, VARIANT *, VARIANT *, VARTYPE) DECLSPEC_HIDDEN
Definition: jsutils.c:881
jsstr_t * jsstr_empty(void)
Definition: jsstr.c:288
static void jsstr_release(jsstr_t *str)
Definition: jsstr.h:110
void jsval_release(jsval_t val)
Definition: jsutils.c:191
HRESULT jsval_to_variant(jsval_t val, VARIANT *retv)
Definition: jsutils.c:347
static jsval_t jsval_undefined(void)
Definition: jsval.h:137
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
static const char * debugstr_variant(const VARIANT *var)
Definition: container.c:46
HRESULT hres
Definition: protocol.c:465
static const WCHAR sp[]
Definition: suminfo.c:287
static ATOM item
Definition: dde.c:856
#define V_VT(A)
Definition: oleauto.h:211
#define V_I4(A)
Definition: oleauto.h:247
const GUID IID_IDispatch
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
DWORD LCID
Definition: nls.h:13
#define TRACE(s)
Definition: solgame.cpp:4
LONG ref
Definition: jscript.c:246
IServiceProvider IServiceProvider_iface
Definition: jscript.c:244
IServiceProvider * sp
Definition: jscript.c:248
IActiveScriptParse IActiveScriptParse_iface
Definition: jscript.c:45
IActiveScriptProperty IActiveScriptProperty_iface
Definition: jscript.c:47
DWORD version
Definition: jscript.c:57
LCID lcid
Definition: jscript.c:56
IActiveScript IActiveScript_iface
Definition: jscript.c:44
IObjectSafety IObjectSafety_iface
Definition: jscript.c:48
bytecode_t * queue_tail
Definition: jscript.c:64
LONG ref
Definition: jscript.c:51
DWORD safeopt
Definition: jscript.c:53
BOOL is_encode
Definition: jscript.c:59
BOOL html_mode
Definition: jscript.c:58
IActiveScriptParseProcedure2 IActiveScriptParseProcedure2_iface
Definition: jscript.c:46
script_ctx_t * ctx
Definition: jscript.c:54
IActiveScriptSite * site
Definition: jscript.c:61
LONG thread_id
Definition: jscript.c:55
bytecode_t * queue_head
Definition: jscript.c:63
IVariantChangeType IVariantChangeType_iface
Definition: jscript.c:49
Definition: scsiwmi.h:51
struct _bytecode_t * next
Definition: engine.h:190
Definition: jsval.h:54
Definition: inflate.c:139
struct named_item_t * next
Definition: jscript.h:367
LPWSTR name
Definition: jscript.h:365
IDispatch * disp
Definition: jscript.h:363
Definition: send.c:48
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
pass
Definition: typegen.h:25
CONTEXT ctx
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
int ret
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
Definition: wincrypt.h:6082
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:2364
#define E_UNEXPECTED
Definition: winerror.h:2456
#define E_POINTER
Definition: winerror.h:2365