Jacek Caban : mshtml: Use bind_to_tree callback to parse dynamically added scripts.

Alexandre Julliard julliard at winehq.org
Wed Jul 20 10:28:51 CDT 2016


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jul 19 18:36:27 2016 +0200

mshtml: Use bind_to_tree callback to parse dynamically added scripts.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/htmlscript.c        | 21 ++++++++++++++++++++-
 dlls/mshtml/mutation.c          | 12 +-----------
 dlls/mshtml/tests/exectest.html |  7 +++++--
 3 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/dlls/mshtml/htmlscript.c b/dlls/mshtml/htmlscript.c
index 6c89206..9feb551 100644
--- a/dlls/mshtml/htmlscript.c
+++ b/dlls/mshtml/htmlscript.c
@@ -398,6 +398,25 @@ static HRESULT HTMLScriptElement_get_readystate(HTMLDOMNode *iface, BSTR *p)
     return IHTMLScriptElement_get_readyState(&This->IHTMLScriptElement_iface, p);
 }
 
+static HRESULT HTMLScriptElement_bind_to_tree(HTMLDOMNode *iface)
+{
+    HTMLScriptElement *This = impl_from_HTMLDOMNode(iface);
+
+    TRACE("(%p)\n", This);
+
+    if(!This->parse_on_bind)
+        return S_OK;
+
+    if(!This->element.node.doc || !This->element.node.doc->window) {
+        ERR("No window\n");
+        return E_UNEXPECTED;
+    }
+
+    This->parse_on_bind = FALSE;
+    doc_insert_script(This->element.node.doc->window, This);
+    return S_OK;
+}
+
 static void HTMLScriptElement_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb)
 {
     HTMLScriptElement *This = impl_from_HTMLDOMNode(iface);
@@ -433,7 +452,7 @@ static const NodeImplVtbl HTMLScriptElementImplVtbl = {
     HTMLScriptElement_get_readystate,
     NULL,
     NULL,
-    NULL,
+    HTMLScriptElement_bind_to_tree,
     HTMLScriptElement_traverse,
     HTMLScriptElement_unlink
 };
diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c
index a298ecb..e2fa084 100644
--- a/dlls/mshtml/mutation.c
+++ b/dlls/mshtml/mutation.c
@@ -767,20 +767,10 @@ static void NSAPI nsDocumentObserver_BindToDocument(nsIDocumentObserver *iface,
 
     nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMHTMLScriptElement, (void**)&nsscript);
     if(NS_SUCCEEDED(nsres)) {
-        HTMLScriptElement *script_elem;
-        HRESULT hres;
-
         TRACE("script element\n");
 
-        hres = script_elem_from_nsscript(This, nsscript, &script_elem);
+        add_script_runner(This, run_bind_to_tree, (nsISupports*)nsscript, NULL);
         nsIDOMHTMLScriptElement_Release(nsscript);
-        if(FAILED(hres))
-            return;
-
-        if(script_elem->parse_on_bind)
-            add_script_runner(This, run_insert_script, (nsISupports*)nsscript, NULL);
-
-        IHTMLScriptElement_Release(&script_elem->IHTMLScriptElement_iface);
         return;
     }
 
diff --git a/dlls/mshtml/tests/exectest.html b/dlls/mshtml/tests/exectest.html
index 6bf5e8e..18c6a48 100644
--- a/dlls/mshtml/tests/exectest.html
+++ b/dlls/mshtml/tests/exectest.html
@@ -104,17 +104,20 @@ function testPutText2() {
     elem.text = "exec_cnt++;"; /* forces evaluation, but src will be executed */
     ok(exec_cnt === 0, "script exec_cnt " + exec_cnt);
     ok(extern_cnt === 6, "< extern_cnt = " + extern_cnt + " expected 6");
+    elem.text = "exec_cnt++;"; /* forces evaluation, but src will be executed */
+    ok(exec_cnt === 0, "script exec_cnt " + exec_cnt);
+    ok(extern_cnt === 7, "< extern_cnt = " + extern_cnt + " expected 6");
 
     elem = document.createElement("script");
     exec_cnt = 0;
     elem.text = "exec_cnt++;";
     ok(exec_cnt === 0, "script exec_cnt " + exec_cnt);
     elem.src = "externscr.js";
-    ok(extern_cnt === 6, "extern_cnt = " + extern_cnt + " expected 6");
+    ok(extern_cnt === 7, "extern_cnt = " + extern_cnt + " expected 7");
 
     document.body.appendChild(elem);
     ok(exec_cnt === 0, "script exec_cnt " + exec_cnt);
-    ok(extern_cnt === 7, "extern_cnt = " + extern_cnt + " expected 7");
+    ok(extern_cnt === 8, "extern_cnt = " + extern_cnt + " expected 8");
 }
 
 document.body.onload = function() {




More information about the wine-cvs mailing list