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