Jacek Caban : mshtml: Store information if script was already parsed in script element object.

Alexandre Julliard julliard at winehq.org
Tue Oct 2 14:09:40 CDT 2012


Module: wine
Branch: master
Commit: 4503edd614da9c75644ab7c5005e0f9857aae0bf
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4503edd614da9c75644ab7c5005e0f9857aae0bf

Author: Jacek Caban <jacek at 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)




More information about the wine-cvs mailing list