From 680aca56efab0610ab5b4c698da481a82acaf5c6 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 16 Oct 2012 17:07:48 +0200 Subject: [PATCH] mshtml: Added beginning IHTMLScriptElement::put_src implementation. --- dlls/mshtml/htmlscript.c | 41 ++++++++++++++++++++++++++++++++++++++++- dlls/mshtml/mshtml_private.h | 2 ++ dlls/mshtml/mutation.c | 12 ++++++++++-- 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/dlls/mshtml/htmlscript.c b/dlls/mshtml/htmlscript.c index d5ae39df488..a256663c66e 100644 --- a/dlls/mshtml/htmlscript.c +++ b/dlls/mshtml/htmlscript.c @@ -95,8 +95,47 @@ static HRESULT WINAPI HTMLScriptElement_Invoke(IHTMLScriptElement *iface, DISPID static HRESULT WINAPI HTMLScriptElement_put_src(IHTMLScriptElement *iface, BSTR v) { HTMLScriptElement *This = impl_from_IHTMLScriptElement(iface); + HTMLInnerWindow *window; + nsIDOMNode *parent; + nsAString src_str; + nsresult nsres; + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + + if(!This->element.node.doc || !This->element.node.doc->window) { + WARN("no windoow\n"); + return E_UNEXPECTED; + } + + window = This->element.node.doc->window; + + nsAString_InitDepend(&src_str, v); + nsres = nsIDOMHTMLScriptElement_SetSrc(This->nsscript, &src_str); + nsAString_Finish(&src_str); + if(NS_FAILED(nsres)) { + ERR("SetSrc failed: %08x\n", nsres); + return E_FAIL; + } + + if(This->parsed) { + WARN("already parsed\n"); + return S_OK; + } + + if(window->parser_callback_cnt) { + FIXME("execution inside parser not supported\n"); + return E_NOTIMPL; + } + + nsres = nsIDOMHTMLScriptElement_GetParentNode(This->nsscript, &parent); + if(NS_FAILED(nsres) || !parent) { + FIXME("No parent, not supported detached elements\n"); + return E_NOTIMPL; + } + + nsIDOMNode_Release(parent); + doc_insert_script(window, This); + return S_OK; } static HRESULT WINAPI HTMLScriptElement_get_src(IHTMLScriptElement *iface, BSTR *p) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index d78e6ab3471..d5f4ce3452b 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -399,6 +399,8 @@ struct HTMLInnerWindow { IOmHistory *history; IHTMLStorage *session_storage; + unsigned parser_callback_cnt; + global_prop_t *global_props; DWORD global_prop_cnt; DWORD global_prop_size; diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index 8c456215e9b..da691de297b 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -298,11 +298,16 @@ static nsresult run_insert_script(HTMLDocumentNode *doc, nsISupports *script_ifa nsIDOMHTMLScriptElement *nsscript; HTMLScriptElement *script_elem; nsIParser *nsparser = NULL; + HTMLInnerWindow *window; nsresult nsres; HRESULT hres; TRACE("(%p)->(%p)\n", doc, script_iface); + window = doc->window; + if(!window) + return NS_OK; + nsres = nsISupports_QueryInterface(script_iface, &IID_nsIDOMHTMLScriptElement, (void**)&nsscript); if(NS_FAILED(nsres)) { ERR("Could not get nsIDOMHTMLScriptElement: %08x\n", nsres); @@ -322,12 +327,15 @@ static nsresult run_insert_script(HTMLDocumentNode *doc, nsISupports *script_ifa if(FAILED(hres)) return NS_ERROR_FAILURE; - if(nsparser) + if(nsparser) { nsIParser_BeginEvaluatingParserInsertedScript(nsparser); + window->parser_callback_cnt++; + } - doc_insert_script(doc->window, script_elem); + doc_insert_script(window, script_elem); if(nsparser) { + window->parser_callback_cnt--; nsIParser_EndEvaluatingParserInsertedScript(nsparser); nsIParser_Release(nsparser); } -- 2.11.4.GIT