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
33 #include "wine/debug.h"
35 #include "mshtml_private.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
39 static const WCHAR windowW
[] = {'w','i','n','d','o','w',0};
41 static const CLSID CLSID_JScript
=
42 {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
45 const IActiveScriptSiteVtbl
*lpIActiveScriptSiteVtbl
;
46 const IActiveScriptSiteInterruptPollVtbl
*lpIActiveScriptSiteInterruptPollVtbl
;
47 const IActiveScriptSiteWindowVtbl
*lpIActiveScriptSiteWindowVtbl
;
48 const IActiveScriptSiteDebug32Vtbl
*lpIActiveScriptSiteDebug32Vtbl
;
52 IActiveScript
*script
;
53 IActiveScriptParse
*parse
;
54 IActiveScriptParseProcedure
*parse_proc
;
56 SCRIPTSTATE script_state
;
64 #define ACTSCPSITE(x) ((IActiveScriptSite*) &(x)->lpIActiveScriptSiteVtbl)
65 #define ACTSCPPOLL(x) ((IActiveScriptSiteInterruptPoll*) &(x)->lpIActiveScriptSiteInterruptPollVtbl)
66 #define ACTSCPWIN(x) ((IActiveScriptSiteWindow*) &(x)->lpIActiveScriptSiteWindowVtbl)
67 #define ACTSCPDBG32(x) ((IActiveScriptSiteDebug32*) &(x)->lpIActiveScriptSiteDebug32Vtbl)
69 static BOOL
init_script_engine(ScriptHost
*script_host
)
71 IActiveScriptProperty
*property
;
72 IObjectSafety
*safety
;
74 DWORD supported_opts
=0, enabled_opts
=0;
77 hres
= IActiveScript_QueryInterface(script_host
->script
, &IID_IActiveScriptParse
, (void**)&script_host
->parse
);
79 WARN("Could not get IActiveScriptHost: %08x\n", hres
);
83 hres
= IActiveScript_QueryInterface(script_host
->script
, &IID_IObjectSafety
, (void**)&safety
);
85 FIXME("Could not get IObjectSafety: %08x\n", hres
);
89 hres
= IObjectSafety_GetInterfaceSafetyOptions(safety
, &IID_IActiveScriptParse
, &supported_opts
, &enabled_opts
);
91 FIXME("GetInterfaceSafetyOptions failed: %08x\n", hres
);
92 }else if(!(supported_opts
& INTERFACE_USES_DISPEX
)) {
93 FIXME("INTERFACE_USES_DISPEX is not supported\n");
95 hres
= IObjectSafety_SetInterfaceSafetyOptions(safety
, &IID_IActiveScriptParse
,
96 INTERFACESAFE_FOR_UNTRUSTED_DATA
|INTERFACE_USES_DISPEX
|INTERFACE_USES_SECURITY_MANAGER
,
97 INTERFACESAFE_FOR_UNTRUSTED_DATA
|INTERFACE_USES_DISPEX
|INTERFACE_USES_SECURITY_MANAGER
);
99 FIXME("SetInterfaceSafetyOptions failed: %08x\n", hres
);
102 IObjectSafety_Release(safety
);
106 hres
= IActiveScript_QueryInterface(script_host
->script
, &IID_IActiveScriptProperty
, (void**)&property
);
107 if(SUCCEEDED(hres
)) {
110 V_VT(&var
) = VT_BOOL
;
111 V_BOOL(&var
) = VARIANT_TRUE
;
112 hres
= IActiveScriptProperty_SetProperty(property
, SCRIPTPROP_HACK_TRIDENTEVENTSINK
, NULL
, &var
);
114 WARN("SetProperty failed: %08x\n", hres
);
116 IActiveScriptProperty_Release(property
);
118 WARN("Could not get IActiveScriptProperty: %08x\n", hres
);
121 hres
= IActiveScriptParse_InitNew(script_host
->parse
);
123 WARN("InitNew failed: %08x\n", hres
);
127 hres
= IActiveScript_SetScriptSite(script_host
->script
, ACTSCPSITE(script_host
));
129 WARN("SetScriptSite failed: %08x\n", hres
);
130 IActiveScript_Close(script_host
->script
);
134 hres
= IActiveScript_GetScriptState(script_host
->script
, &state
);
136 WARN("GetScriptState failed: %08x\n", hres
);
137 else if(state
!= SCRIPTSTATE_INITIALIZED
)
138 FIXME("state = %x\n", state
);
140 hres
= IActiveScript_SetScriptState(script_host
->script
, SCRIPTSTATE_STARTED
);
142 WARN("Starting script failed: %08x\n", hres
);
146 hres
= IActiveScript_AddNamedItem(script_host
->script
, windowW
,
147 SCRIPTITEM_ISVISIBLE
|SCRIPTITEM_ISSOURCE
|SCRIPTITEM_GLOBALMEMBERS
);
149 WARN("AddNamedItem failed: %08x\n", hres
);
151 hres
= IActiveScript_QueryInterface(script_host
->script
, &IID_IActiveScriptParseProcedure2
,
152 (void**)&script_host
->parse_proc
);
154 /* FIXME: QI for IActiveScriptParseProcedure */
155 WARN("Could not get IActiveScriptParseProcedure iface: %08x\n", hres
);
161 static void release_script_engine(ScriptHost
*This
)
166 switch(This
->script_state
) {
167 case SCRIPTSTATE_CONNECTED
:
168 IActiveScript_SetScriptState(This
->script
, SCRIPTSTATE_DISCONNECTED
);
170 case SCRIPTSTATE_STARTED
:
171 case SCRIPTSTATE_DISCONNECTED
:
172 case SCRIPTSTATE_INITIALIZED
:
173 IActiveScript_Close(This
->script
);
176 if(This
->parse_proc
) {
177 IActiveScriptParseProcedure_Release(This
->parse_proc
);
178 This
->parse_proc
= NULL
;
182 IActiveScriptParse_Release(This
->parse
);
187 IActiveScript_Release(This
->script
);
189 This
->script_state
= SCRIPTSTATE_UNINITIALIZED
;
192 void connect_scripts(HTMLDocument
*doc
)
196 LIST_FOR_EACH_ENTRY(iter
, &doc
->script_hosts
, ScriptHost
, entry
) {
197 if(iter
->script_state
== SCRIPTSTATE_STARTED
)
198 IActiveScript_SetScriptState(iter
->script
, SCRIPTSTATE_CONNECTED
);
202 #define ACTSCPSITE_THIS(iface) DEFINE_THIS(ScriptHost, IActiveScriptSite, iface)
204 static HRESULT WINAPI
ActiveScriptSite_QueryInterface(IActiveScriptSite
*iface
, REFIID riid
, void **ppv
)
206 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
210 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
211 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
212 *ppv
= ACTSCPSITE(This
);
213 }else if(IsEqualGUID(&IID_IActiveScriptSite
, riid
)) {
214 TRACE("(%p)->(IID_IActiveScriptSite %p)\n", This
, ppv
);
215 *ppv
= ACTSCPSITE(This
);
216 }else if(IsEqualGUID(&IID_IActiveScriptSiteInterruptPoll
, riid
)) {
217 TRACE("(%p)->(IID_IActiveScriptSiteInterruprtPoll %p)\n", This
, ppv
);
218 *ppv
= ACTSCPPOLL(This
);
219 }else if(IsEqualGUID(&IID_IActiveScriptSiteWindow
, riid
)) {
220 TRACE("(%p)->(IID_IActiveScriptSiteWindow %p)\n", This
, ppv
);
221 *ppv
= ACTSCPWIN(This
);
222 }else if(IsEqualGUID(&IID_IActiveScriptSiteDebug32
, riid
)) {
223 TRACE("(%p)->(IID_IActiveScriptSiteDebug32 %p)\n", This
, ppv
);
224 *ppv
= ACTSCPDBG32(This
);
226 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
227 return E_NOINTERFACE
;
230 IUnknown_AddRef((IUnknown
*)*ppv
);
234 static ULONG WINAPI
ActiveScriptSite_AddRef(IActiveScriptSite
*iface
)
236 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
237 LONG ref
= InterlockedIncrement(&This
->ref
);
239 TRACE("(%p) ref=%d\n", This
, ref
);
244 static ULONG WINAPI
ActiveScriptSite_Release(IActiveScriptSite
*iface
)
246 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
247 LONG ref
= InterlockedDecrement(&This
->ref
);
249 TRACE("(%p) ref=%d\n", This
, ref
);
252 release_script_engine(This
);
254 list_remove(&This
->entry
);
261 static HRESULT WINAPI
ActiveScriptSite_GetLCID(IActiveScriptSite
*iface
, LCID
*plcid
)
263 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
265 TRACE("(%p)->(%p)\n", This
, plcid
);
267 *plcid
= GetUserDefaultLCID();
271 static HRESULT WINAPI
ActiveScriptSite_GetItemInfo(IActiveScriptSite
*iface
, LPCOLESTR pstrName
,
272 DWORD dwReturnMask
, IUnknown
**ppiunkItem
, ITypeInfo
**ppti
)
274 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
276 TRACE("(%p)->(%s %x %p %p)\n", This
, debugstr_w(pstrName
), dwReturnMask
, ppiunkItem
, ppti
);
278 if(dwReturnMask
!= SCRIPTINFO_IUNKNOWN
) {
279 FIXME("Unsupported mask %x\n", dwReturnMask
);
285 if(strcmpW(pstrName
, windowW
))
286 return DISP_E_MEMBERNOTFOUND
;
291 /* FIXME: Return proxy object */
292 *ppiunkItem
= (IUnknown
*)HTMLWINDOW2(This
->doc
->window
);
293 IUnknown_AddRef(*ppiunkItem
);
298 static HRESULT WINAPI
ActiveScriptSite_GetDocVersionString(IActiveScriptSite
*iface
, BSTR
*pbstrVersion
)
300 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
301 FIXME("(%p)->(%p)\n", This
, pbstrVersion
);
305 static HRESULT WINAPI
ActiveScriptSite_OnScriptTerminate(IActiveScriptSite
*iface
,
306 const VARIANT
*pvarResult
, const EXCEPINFO
*pexcepinfo
)
308 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
309 FIXME("(%p)->(%p %p)\n", This
, pvarResult
, pexcepinfo
);
313 static HRESULT WINAPI
ActiveScriptSite_OnStateChange(IActiveScriptSite
*iface
, SCRIPTSTATE ssScriptState
)
315 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
317 TRACE("(%p)->(%x)\n", This
, ssScriptState
);
319 This
->script_state
= ssScriptState
;
323 static HRESULT WINAPI
ActiveScriptSite_OnScriptError(IActiveScriptSite
*iface
, IActiveScriptError
*pscripterror
)
325 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
326 FIXME("(%p)->(%p)\n", This
, pscripterror
);
330 static HRESULT WINAPI
ActiveScriptSite_OnEnterScript(IActiveScriptSite
*iface
)
332 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
334 TRACE("(%p)->()\n", This
);
339 static HRESULT WINAPI
ActiveScriptSite_OnLeaveScript(IActiveScriptSite
*iface
)
341 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
343 TRACE("(%p)->()\n", This
);
348 #undef ACTSCPSITE_THIS
350 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl
= {
351 ActiveScriptSite_QueryInterface
,
352 ActiveScriptSite_AddRef
,
353 ActiveScriptSite_Release
,
354 ActiveScriptSite_GetLCID
,
355 ActiveScriptSite_GetItemInfo
,
356 ActiveScriptSite_GetDocVersionString
,
357 ActiveScriptSite_OnScriptTerminate
,
358 ActiveScriptSite_OnStateChange
,
359 ActiveScriptSite_OnScriptError
,
360 ActiveScriptSite_OnEnterScript
,
361 ActiveScriptSite_OnLeaveScript
364 #define ACTSCPPOLL_THIS(iface) DEFINE_THIS(ScriptHost, IActiveScriptSiteInterruptPoll, iface)
366 static HRESULT WINAPI
ActiveScriptSiteInterruptPoll_QueryInterface(IActiveScriptSiteInterruptPoll
*iface
,
367 REFIID riid
, void **ppv
)
369 ScriptHost
*This
= ACTSCPPOLL_THIS(iface
);
370 return IActiveScriptSite_QueryInterface(ACTSCPSITE(This
), riid
, ppv
);
373 static ULONG WINAPI
ActiveScriptSiteInterruptPoll_AddRef(IActiveScriptSiteInterruptPoll
*iface
)
375 ScriptHost
*This
= ACTSCPPOLL_THIS(iface
);
376 return IActiveScriptSite_AddRef(ACTSCPSITE(This
));
379 static ULONG WINAPI
ActiveScriptSiteInterruptPoll_Release(IActiveScriptSiteInterruptPoll
*iface
)
381 ScriptHost
*This
= ACTSCPPOLL_THIS(iface
);
382 return IActiveScriptSite_Release(ACTSCPSITE(This
));
385 static HRESULT WINAPI
ActiveScriptSiteInterruptPoll_QueryContinue(IActiveScriptSiteInterruptPoll
*iface
)
387 ScriptHost
*This
= ACTSCPPOLL_THIS(iface
);
388 FIXME("(%p)\n", This
);
392 #undef ACTSCPPOLL_THIS
394 static const IActiveScriptSiteInterruptPollVtbl ActiveScriptSiteInterruptPollVtbl
= {
395 ActiveScriptSiteInterruptPoll_QueryInterface
,
396 ActiveScriptSiteInterruptPoll_AddRef
,
397 ActiveScriptSiteInterruptPoll_Release
,
398 ActiveScriptSiteInterruptPoll_QueryContinue
401 #define ACTSCPWIN_THIS(iface) DEFINE_THIS(ScriptHost, IActiveScriptSiteWindow, iface)
403 static HRESULT WINAPI
ActiveScriptSiteWindow_QueryInterface(IActiveScriptSiteWindow
*iface
,
404 REFIID riid
, void **ppv
)
406 ScriptHost
*This
= ACTSCPWIN_THIS(iface
);
407 return IActiveScriptSite_QueryInterface(ACTSCPSITE(This
), riid
, ppv
);
410 static ULONG WINAPI
ActiveScriptSiteWindow_AddRef(IActiveScriptSiteWindow
*iface
)
412 ScriptHost
*This
= ACTSCPWIN_THIS(iface
);
413 return IActiveScriptSite_AddRef(ACTSCPSITE(This
));
416 static ULONG WINAPI
ActiveScriptSiteWindow_Release(IActiveScriptSiteWindow
*iface
)
418 ScriptHost
*This
= ACTSCPWIN_THIS(iface
);
419 return IActiveScriptSite_Release(ACTSCPSITE(This
));
422 static HRESULT WINAPI
ActiveScriptSiteWindow_GetWindow(IActiveScriptSiteWindow
*iface
, HWND
*phwnd
)
424 ScriptHost
*This
= ACTSCPWIN_THIS(iface
);
425 FIXME("(%p)->(%p)\n", This
, phwnd
);
429 static HRESULT WINAPI
ActiveScriptSiteWindow_EnableModeless(IActiveScriptSiteWindow
*iface
, BOOL fEnable
)
431 ScriptHost
*This
= ACTSCPWIN_THIS(iface
);
432 FIXME("(%p)->(%x)\n", This
, fEnable
);
436 #undef ACTSCPWIN_THIS
438 static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl
= {
439 ActiveScriptSiteWindow_QueryInterface
,
440 ActiveScriptSiteWindow_AddRef
,
441 ActiveScriptSiteWindow_Release
,
442 ActiveScriptSiteWindow_GetWindow
,
443 ActiveScriptSiteWindow_EnableModeless
446 #define ACTSCPDBG32_THIS(iface) DEFINE_THIS(ScriptHost, IActiveScriptSiteDebug32, iface)
448 static HRESULT WINAPI
ActiveScriptSiteDebug32_QueryInterface(IActiveScriptSiteDebug32
*iface
,
449 REFIID riid
, void **ppv
)
451 ScriptHost
*This
= ACTSCPDBG32_THIS(iface
);
452 return IActiveScriptSite_QueryInterface(ACTSCPSITE(This
), riid
, ppv
);
455 static ULONG WINAPI
ActiveScriptSiteDebug32_AddRef(IActiveScriptSiteDebug32
*iface
)
457 ScriptHost
*This
= ACTSCPDBG32_THIS(iface
);
458 return IActiveScriptSite_AddRef(ACTSCPSITE(This
));
461 static ULONG WINAPI
ActiveScriptSiteDebug32_Release(IActiveScriptSiteDebug32
*iface
)
463 ScriptHost
*This
= ACTSCPDBG32_THIS(iface
);
464 return IActiveScriptSite_Release(ACTSCPSITE(This
));
467 static HRESULT WINAPI
ActiveScriptSiteDebug32_GetDocumentContextFromPosition(IActiveScriptSiteDebug32
*iface
,
468 DWORD dwSourceContext
, ULONG uCharacterOffset
, ULONG uNumChars
, IDebugDocumentContext
**ppsc
)
470 ScriptHost
*This
= ACTSCPDBG32_THIS(iface
);
471 FIXME("(%p)->(%x %u %u %p)\n", This
, dwSourceContext
, uCharacterOffset
, uNumChars
, ppsc
);
475 static HRESULT WINAPI
ActiveScriptSiteDebug32_GetApplication(IActiveScriptSiteDebug32
*iface
, IDebugApplication32
**ppda
)
477 ScriptHost
*This
= ACTSCPDBG32_THIS(iface
);
478 FIXME("(%p)->(%p)\n", This
, ppda
);
482 static HRESULT WINAPI
ActiveScriptSiteDebug32_GetRootApplicationNode(IActiveScriptSiteDebug32
*iface
,
483 IDebugApplicationNode
**ppdanRoot
)
485 ScriptHost
*This
= ACTSCPDBG32_THIS(iface
);
486 FIXME("(%p)->(%p)\n", This
, ppdanRoot
);
490 static HRESULT WINAPI
ActiveScriptSiteDebug32_OnScriptErrorDebug(IActiveScriptSiteDebug32
*iface
,
491 IActiveScriptErrorDebug
*pErrorDebug
, BOOL
*pfEnterDebugger
, BOOL
*pfCallOnScriptErrorWhenContinuing
)
493 ScriptHost
*This
= ACTSCPDBG32_THIS(iface
);
494 FIXME("(%p)->(%p %p %p)\n", This
, pErrorDebug
, pfEnterDebugger
, pfCallOnScriptErrorWhenContinuing
);
498 #undef ACTSCPDBG32_THIS
500 static const IActiveScriptSiteDebug32Vtbl ActiveScriptSiteDebug32Vtbl
= {
501 ActiveScriptSiteDebug32_QueryInterface
,
502 ActiveScriptSiteDebug32_AddRef
,
503 ActiveScriptSiteDebug32_Release
,
504 ActiveScriptSiteDebug32_GetDocumentContextFromPosition
,
505 ActiveScriptSiteDebug32_GetApplication
,
506 ActiveScriptSiteDebug32_GetRootApplicationNode
,
507 ActiveScriptSiteDebug32_OnScriptErrorDebug
510 static ScriptHost
*create_script_host(HTMLDocument
*doc
, GUID
*guid
)
515 ret
= heap_alloc_zero(sizeof(*ret
));
516 ret
->lpIActiveScriptSiteVtbl
= &ActiveScriptSiteVtbl
;
517 ret
->lpIActiveScriptSiteInterruptPollVtbl
= &ActiveScriptSiteInterruptPollVtbl
;
518 ret
->lpIActiveScriptSiteWindowVtbl
= &ActiveScriptSiteWindowVtbl
;
519 ret
->lpIActiveScriptSiteDebug32Vtbl
= &ActiveScriptSiteDebug32Vtbl
;
522 ret
->script_state
= SCRIPTSTATE_UNINITIALIZED
;
525 list_add_tail(&doc
->script_hosts
, &ret
->entry
);
527 hres
= CoCreateInstance(&ret
->guid
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
528 &IID_IActiveScript
, (void**)&ret
->script
);
530 WARN("Could not load script engine: %08x\n", hres
);
531 else if(!init_script_engine(ret
))
532 release_script_engine(ret
);
537 static void parse_text(ScriptHost
*script_host
, LPCWSTR text
)
543 static const WCHAR script_endW
[] = {'<','/','S','C','R','I','P','T','>',0};
545 TRACE("%s\n", debugstr_w(text
));
548 memset(&excepinfo
, 0, sizeof(excepinfo
));
549 hres
= IActiveScriptParse_ParseScriptText(script_host
->parse
, text
, windowW
, NULL
, script_endW
,
550 0, 0, SCRIPTTEXT_ISVISIBLE
|SCRIPTTEXT_HOSTMANAGESSOURCE
,
553 WARN("ParseScriptText failed: %08x\n", hres
);
557 static void parse_extern_script(ScriptHost
*script_host
, LPCWSTR src
)
565 static const WCHAR wine_schemaW
[] = {'w','i','n','e',':'};
567 if(strlenW(src
) > sizeof(wine_schemaW
)/sizeof(WCHAR
) && !memcmp(src
, wine_schemaW
, sizeof(wine_schemaW
)))
568 src
+= sizeof(wine_schemaW
)/sizeof(WCHAR
);
570 hres
= CreateURLMoniker(NULL
, src
, &mon
);
574 hres
= bind_mon_to_buffer(script_host
->doc
, mon
, (void**)&buf
, &size
);
575 IMoniker_Release(mon
);
579 len
= MultiByteToWideChar(CP_ACP
, 0, buf
, size
, NULL
, 0);
580 text
= heap_alloc((len
+1)*sizeof(WCHAR
));
581 MultiByteToWideChar(CP_ACP
, 0, buf
, size
, text
, len
);
585 parse_text(script_host
, text
);
590 static void parse_inline_script(ScriptHost
*script_host
, nsIDOMHTMLScriptElement
*nsscript
)
592 const PRUnichar
*text
;
596 nsAString_Init(&text_str
, NULL
);
598 nsres
= nsIDOMHTMLScriptElement_GetText(nsscript
, &text_str
);
600 if(NS_SUCCEEDED(nsres
)) {
601 nsAString_GetData(&text_str
, &text
);
602 parse_text(script_host
, text
);
604 ERR("GetText failed: %08x\n", nsres
);
607 nsAString_Finish(&text_str
);
610 static void parse_script_elem(ScriptHost
*script_host
, nsIDOMHTMLScriptElement
*nsscript
)
612 const PRUnichar
*src
;
616 nsAString_Init(&src_str
, NULL
);
618 nsres
= nsIDOMHTMLScriptElement_GetSrc(nsscript
, &src_str
);
619 nsAString_GetData(&src_str
, &src
);
622 ERR("GetSrc failed: %08x\n", nsres
);
624 parse_extern_script(script_host
, src
);
626 parse_inline_script(script_host
, nsscript
);
628 nsAString_Finish(&src_str
);
631 static BOOL
get_guid_from_type(LPCWSTR type
, GUID
*guid
)
633 const WCHAR text_javascriptW
[] =
634 {'t','e','x','t','/','j','a','v','a','s','c','r','i','p','t',0};
636 /* FIXME: Handle more types */
637 if(!strcmpW(type
, text_javascriptW
)) {
638 *guid
= CLSID_JScript
;
640 FIXME("Unknown type %s\n", debugstr_w(type
));
647 static BOOL
get_guid_from_language(LPCWSTR type
, GUID
*guid
)
651 hres
= CLSIDFromProgID(type
, guid
);
655 /* FIXME: Check CATID_ActiveScriptParse */
660 static BOOL
get_script_guid(nsIDOMHTMLScriptElement
*nsscript
, GUID
*guid
)
662 nsAString attr_str
, val_str
;
666 static const PRUnichar languageW
[] = {'l','a','n','g','u','a','g','e',0};
668 nsAString_Init(&val_str
, NULL
);
670 nsres
= nsIDOMHTMLScriptElement_GetType(nsscript
, &val_str
);
671 if(NS_SUCCEEDED(nsres
)) {
672 const PRUnichar
*type
;
674 nsAString_GetData(&val_str
, &type
);
676 ret
= get_guid_from_type(type
, guid
);
677 nsAString_Finish(&val_str
);
681 ERR("GetType failed: %08x\n", nsres
);
684 nsAString_Init(&attr_str
, languageW
);
686 nsres
= nsIDOMHTMLScriptElement_GetAttribute(nsscript
, &attr_str
, &val_str
);
687 if(NS_SUCCEEDED(nsres
)) {
688 const PRUnichar
*language
;
690 nsAString_GetData(&val_str
, &language
);
693 ret
= get_guid_from_language(language
, guid
);
695 *guid
= CLSID_JScript
;
699 ERR("GetAttribute(language) failed: %08x\n", nsres
);
702 nsAString_Finish(&attr_str
);
703 nsAString_Finish(&val_str
);
708 static ScriptHost
*get_script_host(HTMLDocument
*doc
, nsIDOMHTMLScriptElement
*nsscript
)
713 if(!get_script_guid(nsscript
, &guid
)) {
714 WARN("Could not find script GUID\n");
718 if(IsEqualGUID(&CLSID_JScript
, &guid
)) {
719 FIXME("Ignoring JScript\n");
723 LIST_FOR_EACH_ENTRY(iter
, &doc
->script_hosts
, ScriptHost
, entry
) {
724 if(IsEqualGUID(&guid
, &iter
->guid
))
728 return create_script_host(doc
, &guid
);
731 void doc_insert_script(HTMLDocument
*doc
, nsIDOMHTMLScriptElement
*nsscript
)
733 ScriptHost
*script_host
;
735 script_host
= get_script_host(doc
, nsscript
);
739 if(script_host
->parse
)
740 parse_script_elem(script_host
, nsscript
);
743 void release_script_hosts(HTMLDocument
*doc
)
747 while(!list_empty(&doc
->script_hosts
)) {
748 iter
= LIST_ENTRY(list_head(&doc
->script_hosts
), ScriptHost
, entry
);
750 release_script_engine(iter
);
751 list_remove(&iter
->entry
);
753 IActiveScript_Release(ACTSCPSITE(iter
));