Module: wine Branch: master Commit: 4503edd614da9c75644ab7c5005e0f9857aae0bf URL: http://source.winehq.org/git/wine.git/?a=commit;h=4503edd614da9c75644ab7c500...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Oct 2 15:45:40 2012 +0200
mshtml: Store information if script was already parsed in script element object.
---
dlls/mshtml/htmlscript.c | 22 ++++++++++++++-------- dlls/mshtml/mshtml_private.h | 13 ++++++++++++- dlls/mshtml/mutation.c | 11 +++++++++-- dlls/mshtml/script.c | 36 +++++++++++++++++++----------------- 4 files changed, 54 insertions(+), 28 deletions(-)
diff --git a/dlls/mshtml/htmlscript.c b/dlls/mshtml/htmlscript.c index 99478ea..d6241ae 100644 --- a/dlls/mshtml/htmlscript.c +++ b/dlls/mshtml/htmlscript.c @@ -32,14 +32,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
-typedef struct { - HTMLElement element; - - IHTMLScriptElement IHTMLScriptElement_iface; - - nsIDOMHTMLScriptElement *nsscript; -} HTMLScriptElement; - static inline HTMLScriptElement *impl_from_IHTMLScriptElement(IHTMLScriptElement *iface) { return CONTAINING_RECORD(iface, HTMLScriptElement, IHTMLScriptElement_iface); @@ -327,6 +319,20 @@ static const NodeImplVtbl HTMLScriptElementImplVtbl = { HTMLScriptElement_get_readystate };
+HRESULT script_elem_from_nsscript(HTMLDocumentNode *doc, nsIDOMHTMLScriptElement *nsscript, HTMLScriptElement **ret) +{ + HTMLDOMNode *node; + HRESULT hres; + + hres = get_node(doc, (nsIDOMNode*)nsscript, TRUE, &node); + if(FAILED(hres)) + return hres; + + assert(node->vtbl == &HTMLScriptElementImplVtbl); + *ret = impl_from_HTMLDOMNode(node); + return S_OK; +} + static const tid_t HTMLScriptElement_iface_tids[] = { HTMLELEMENT_TIDS, IHTMLScriptElement_tid, diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index e26b594..9cdc410 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -741,6 +741,17 @@ void init_binding_ui(HTMLDocumentObj*) DECLSPEC_HIDDEN;
void HTMLDocumentNode_SecMgr_Init(HTMLDocumentNode*) DECLSPEC_HIDDEN;
+typedef struct { + HTMLElement element; + + IHTMLScriptElement IHTMLScriptElement_iface; + + nsIDOMHTMLScriptElement *nsscript; + BOOL parsed; +} HTMLScriptElement; + +HRESULT script_elem_from_nsscript(HTMLDocumentNode*,nsIDOMHTMLScriptElement*,HTMLScriptElement**) DECLSPEC_HIDDEN; + HRESULT HTMLCurrentStyle_Create(HTMLElement*,IHTMLCurrentStyle**) DECLSPEC_HIDDEN;
void ConnectionPoint_Init(ConnectionPoint*,ConnectionPointContainer*,REFIID,cp_static_data_t*) DECLSPEC_HIDDEN; @@ -904,7 +915,7 @@ HTMLElement *unsafe_impl_from_IHTMLElement(IHTMLElement*) DECLSPEC_HIDDEN;
void release_script_hosts(HTMLInnerWindow*) DECLSPEC_HIDDEN; void connect_scripts(HTMLInnerWindow*) DECLSPEC_HIDDEN; -void doc_insert_script(HTMLInnerWindow*,nsIDOMHTMLScriptElement*) DECLSPEC_HIDDEN; +void doc_insert_script(HTMLInnerWindow*,HTMLScriptElement*) DECLSPEC_HIDDEN; IDispatch *script_parse_event(HTMLInnerWindow*,LPCWSTR) DECLSPEC_HIDDEN; HRESULT exec_script(HTMLInnerWindow*,const WCHAR*,const WCHAR*,VARIANT*) DECLSPEC_HIDDEN; void set_script_mode(HTMLOuterWindow*,SCRIPTMODE) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index 129094e..7b8bf89 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -294,8 +294,10 @@ static nsresult run_end_load(HTMLDocumentNode *This, nsISupports *arg1, nsISuppo static nsresult run_insert_script(HTMLDocumentNode *doc, nsISupports *script_iface, nsISupports *parser_iface) { nsIDOMHTMLScriptElement *nsscript; + HTMLScriptElement *script_elem; nsIParser *nsparser = NULL; nsresult nsres; + HRESULT hres;
TRACE("(%p)->(%p)\n", doc, script_iface);
@@ -313,17 +315,22 @@ static nsresult run_insert_script(HTMLDocumentNode *doc, nsISupports *script_ifa } }
+ hres = script_elem_from_nsscript(doc, nsscript, &script_elem); + nsIDOMHTMLScriptElement_Release(nsscript); + if(FAILED(hres)) + return NS_ERROR_FAILURE; + if(nsparser) nsIParser_BeginEvaluatingParserInsertedScript(nsparser);
- doc_insert_script(doc->window, nsscript); + doc_insert_script(doc->window, script_elem);
if(nsparser) { nsIParser_EndEvaluatingParserInsertedScript(nsparser); nsIParser_Release(nsparser); }
- nsIDOMHTMLScriptElement_Release(nsscript); + IHTMLScriptElement_Release(&script_elem->IHTMLScriptElement_iface); return NS_OK; }
diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c index 823c7b3..ceb88d7 100644 --- a/dlls/mshtml/script.c +++ b/dlls/mshtml/script.c @@ -731,34 +731,34 @@ static void parse_extern_script(ScriptHost *script_host, LPCWSTR src) heap_free(text); }
-static void parse_inline_script(ScriptHost *script_host, nsIDOMHTMLScriptElement *nsscript) +static void parse_inline_script(ScriptHost *script_host, HTMLScriptElement *script_elem) { const PRUnichar *text; nsAString text_str; nsresult nsres;
nsAString_Init(&text_str, NULL); + nsres = nsIDOMHTMLScriptElement_GetText(script_elem->nsscript, &text_str); + nsAString_GetData(&text_str, &text);
- nsres = nsIDOMHTMLScriptElement_GetText(nsscript, &text_str); - - if(NS_SUCCEEDED(nsres)) { - nsAString_GetData(&text_str, &text); - parse_text(script_host, text); - }else { + if(NS_FAILED(nsres)) { ERR("GetText failed: %08x\n", nsres); + }else if(*text) { + script_elem->parsed = TRUE; + parse_text(script_host, text); }
nsAString_Finish(&text_str); }
-static void parse_script_elem(ScriptHost *script_host, nsIDOMHTMLScriptElement *nsscript) +static void parse_script_elem(ScriptHost *script_host, HTMLScriptElement *script_elem) { nsAString src_str, event_str; const PRUnichar *src; nsresult nsres;
nsAString_Init(&event_str, NULL); - nsres = nsIDOMHTMLScriptElement_GetEvent(nsscript, &event_str); + nsres = nsIDOMHTMLScriptElement_GetEvent(script_elem->nsscript, &event_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *event;
@@ -774,15 +774,17 @@ static void parse_script_elem(ScriptHost *script_host, nsIDOMHTMLScriptElement * nsAString_Finish(&event_str);
nsAString_Init(&src_str, NULL); - nsres = nsIDOMHTMLScriptElement_GetSrc(nsscript, &src_str); + nsres = nsIDOMHTMLScriptElement_GetSrc(script_elem->nsscript, &src_str); nsAString_GetData(&src_str, &src);
- if(NS_FAILED(nsres)) + if(NS_FAILED(nsres)) { ERR("GetSrc failed: %08x\n", nsres); - else if(*src) + }else if(*src) { + script_elem->parsed = TRUE; parse_extern_script(script_host, src); - else - parse_inline_script(script_host, nsscript); + }else { + parse_inline_script(script_host, script_elem); + }
nsAString_Finish(&src_str); } @@ -887,12 +889,12 @@ static ScriptHost *get_script_host(HTMLInnerWindow *window, const GUID *guid) return create_script_host(window, guid); }
-void doc_insert_script(HTMLInnerWindow *window, nsIDOMHTMLScriptElement *nsscript) +void doc_insert_script(HTMLInnerWindow *window, HTMLScriptElement *script_elem) { ScriptHost *script_host; GUID guid;
- if(!get_script_guid(window, nsscript, &guid)) { + if(!get_script_guid(window, script_elem->nsscript, &guid)) { WARN("Could not find script GUID\n"); return; } @@ -908,7 +910,7 @@ void doc_insert_script(HTMLInnerWindow *window, nsIDOMHTMLScriptElement *nsscrip return;
if(script_host->parse) - parse_script_elem(script_host, nsscript); + parse_script_elem(script_host, script_elem); }
IDispatch *script_parse_event(HTMLInnerWindow *window, LPCWSTR text)