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
31 #include "wine/debug.h"
33 #include "mshtml_private.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
37 static const CLSID CLSID_JScript
=
38 {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
41 const IActiveScriptSiteVtbl
*lpActiveScriptSiteVtbl
;
45 IActiveScript
*script
;
52 #define ACTSCPSITE(x) ((IActiveScriptSite*) &(x)->lpActiveScriptSiteVtbl)
54 #define ACTSCPSITE_THIS(iface) DEFINE_THIS(ScriptHost, ActiveScriptSite, iface)
56 static HRESULT WINAPI
ActiveScriptSite_QueryInterface(IActiveScriptSite
*iface
, REFIID riid
, void **ppv
)
58 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
62 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
63 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
64 *ppv
= ACTSCPSITE(This
);
65 }else if(IsEqualGUID(&IID_IActiveScriptSite
, riid
)) {
66 TRACE("(%p)->(IID_IActiveScriptSite %p)\n", This
, ppv
);
67 *ppv
= ACTSCPSITE(This
);
69 FIXME("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
73 IUnknown_AddRef((IUnknown
*)*ppv
);
77 static ULONG WINAPI
ActiveScriptSite_AddRef(IActiveScriptSite
*iface
)
79 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
80 LONG ref
= InterlockedIncrement(&This
->ref
);
82 TRACE("(%p) ref=%d\n", This
, ref
);
87 static ULONG WINAPI
ActiveScriptSite_Release(IActiveScriptSite
*iface
)
89 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
90 LONG ref
= InterlockedDecrement(&This
->ref
);
92 TRACE("(%p) ref=%d\n", This
, ref
);
96 list_remove(&This
->entry
);
103 static HRESULT WINAPI
ActiveScriptSite_GetLCID(IActiveScriptSite
*iface
, LCID
*plcid
)
105 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
106 FIXME("(%p)->(%p)\n", This
, plcid
);
110 static HRESULT WINAPI
ActiveScriptSite_GetItemInfo(IActiveScriptSite
*iface
, LPCOLESTR pstrName
,
111 DWORD dwReturnMask
, IUnknown
**ppiunkItem
, ITypeInfo
**ppti
)
113 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
114 FIXME("(%p)->(%s %x %p %p)\n", This
, debugstr_w(pstrName
), dwReturnMask
, ppiunkItem
, ppti
);
118 static HRESULT WINAPI
ActiveScriptSite_GetDocVersionString(IActiveScriptSite
*iface
, BSTR
*pbstrVersion
)
120 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
121 FIXME("(%p)->(%p)\n", This
, pbstrVersion
);
125 static HRESULT WINAPI
ActiveScriptSite_OnScriptTerminate(IActiveScriptSite
*iface
,
126 const VARIANT
*pvarResult
, const EXCEPINFO
*pexcepinfo
)
128 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
129 FIXME("(%p)->(%p %p)\n", This
, pvarResult
, pexcepinfo
);
133 static HRESULT WINAPI
ActiveScriptSite_OnStateChange(IActiveScriptSite
*iface
, SCRIPTSTATE ssScriptState
)
135 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
136 FIXME("(%p)->(%x)\n", This
, ssScriptState
);
140 static HRESULT WINAPI
ActiveScriptSite_OnScriptError(IActiveScriptSite
*iface
, IActiveScriptError
*pscripterror
)
142 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
143 FIXME("(%p)->(%p)\n", This
, pscripterror
);
147 static HRESULT WINAPI
ActiveScriptSite_OnEnterScript(IActiveScriptSite
*iface
)
149 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
150 FIXME("(%p)->()\n", This
);
154 static HRESULT WINAPI
ActiveScriptSite_OnLeaveScript(IActiveScriptSite
*iface
)
156 ScriptHost
*This
= ACTSCPSITE_THIS(iface
);
157 FIXME("(%p)->()\n", This
);
161 #undef ACTSCPSITE_THIS
163 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl
= {
164 ActiveScriptSite_QueryInterface
,
165 ActiveScriptSite_AddRef
,
166 ActiveScriptSite_Release
,
167 ActiveScriptSite_GetLCID
,
168 ActiveScriptSite_GetItemInfo
,
169 ActiveScriptSite_GetDocVersionString
,
170 ActiveScriptSite_OnScriptTerminate
,
171 ActiveScriptSite_OnStateChange
,
172 ActiveScriptSite_OnScriptError
,
173 ActiveScriptSite_OnEnterScript
,
174 ActiveScriptSite_OnLeaveScript
177 static ScriptHost
*create_script_host(HTMLDocument
*doc
, GUID
*guid
)
182 ret
= heap_alloc_zero(sizeof(*ret
));
183 ret
->lpActiveScriptSiteVtbl
= &ActiveScriptSiteVtbl
;
188 list_add_tail(&doc
->script_hosts
, &ret
->entry
);
190 hres
= CoCreateInstance(&ret
->guid
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
191 &IID_IActiveScript
, (void**)&ret
->script
);
193 WARN("Could not load script engine: %08x\n", hres
);
198 static BOOL
get_guid_from_type(LPCWSTR type
, GUID
*guid
)
200 const WCHAR text_javascriptW
[] =
201 {'t','e','x','t','/','j','a','v','a','s','c','r','i','p','t',0};
203 /* FIXME: Handle more types */
204 if(!strcmpW(type
, text_javascriptW
)) {
205 *guid
= CLSID_JScript
;
207 FIXME("Unknown type %s\n", debugstr_w(type
));
214 static BOOL
get_guid_from_language(LPCWSTR type
, GUID
*guid
)
218 hres
= CLSIDFromProgID(type
, guid
);
222 /* FIXME: Check CATID_ActiveScriptParse */
227 static BOOL
get_script_guid(nsIDOMHTMLScriptElement
*nsscript
, GUID
*guid
)
229 nsAString attr_str
, val_str
;
233 static const PRUnichar languageW
[] = {'l','a','n','g','u','a','g','e',0};
235 nsAString_Init(&val_str
, NULL
);
237 nsres
= nsIDOMHTMLScriptElement_GetType(nsscript
, &val_str
);
238 if(NS_SUCCEEDED(nsres
)) {
239 const PRUnichar
*type
;
241 nsAString_GetData(&val_str
, &type
);
243 ret
= get_guid_from_type(type
, guid
);
244 nsAString_Finish(&val_str
);
248 ERR("GetType failed: %08x\n", nsres
);
251 nsAString_Init(&attr_str
, languageW
);
253 nsres
= nsIDOMHTMLScriptElement_GetAttribute(nsscript
, &attr_str
, &val_str
);
254 if(NS_SUCCEEDED(nsres
)) {
255 const PRUnichar
*language
;
257 nsAString_GetData(&val_str
, &language
);
260 ret
= get_guid_from_language(language
, guid
);
262 *guid
= CLSID_JScript
;
266 ERR("GetAttribute(language) failed: %08x\n", nsres
);
269 nsAString_Finish(&attr_str
);
270 nsAString_Finish(&val_str
);
275 static ScriptHost
*get_script_host(HTMLDocument
*doc
, nsIDOMHTMLScriptElement
*nsscript
)
280 if(!get_script_guid(nsscript
, &guid
)) {
281 WARN("Could not find script GUID\n");
285 if(IsEqualGUID(&CLSID_JScript
, &guid
)) {
286 FIXME("Ignoring JScript\n");
290 LIST_FOR_EACH_ENTRY(iter
, &doc
->script_hosts
, ScriptHost
, entry
) {
291 if(IsEqualGUID(&guid
, &iter
->guid
))
295 return create_script_host(doc
, &guid
);
298 void doc_insert_script(HTMLDocument
*doc
, nsIDOMHTMLScriptElement
*nsscript
)
300 get_script_host(doc
, nsscript
);
303 void release_script_hosts(HTMLDocument
*doc
)
307 while(!list_empty(&doc
->script_hosts
)) {
308 iter
= LIST_ENTRY(list_head(&doc
->script_hosts
), ScriptHost
, entry
);
310 list_remove(&iter
->entry
);
312 IActiveScript_Release(ACTSCPSITE(iter
));