[PATCH 5/5] mshtml/tests: Added script IE9+ event tests.

Jacek Caban <[email protected]>
Newsgroups gmane.comp.emulators.wine.patches
Message-ID <[email protected]>
Signed-off-by: Jacek Caban <[email protected]>
---
 dlls/mshtml/tests/events.js | 278
++++++++++++++++++++++++++++++++++++++++++++
 dlls/mshtml/tests/rsrc.rc   |   3 +
 dlls/mshtml/tests/script.c  |   1 +
 3 files changed, 282 insertions(+)
 create mode 100644 dlls/mshtml/tests/events.js
0005-mshtml-tests-Added-script-IE9-event-tests.diff (text/x-patch, 10.5 KB)
diff --git a/dlls/mshtml/tests/events.js b/dlls/mshtml/tests/events.js
new file mode 100644
index 0000000000..4a064f9832
--- /dev/null
+++ b/dlls/mshtml/tests/events.js
@@ -0,0 +1,278 @@
+/*
+ * Copyright 2017 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+var test_content_loaded = (function() {
+    var calls = "";
+
+    function unexpected_call() {
+        ok(false, "unexpected call");
+    }
+
+    function record_call(msg) {
+        return function() { calls += msg + "," };
+    }
+
+    window.addEventListener("DOMContentLoaded", record_call("window.capture"), true);
+    window.addEventListener("DOMContentLoaded", record_call("window.bubble"), false);
+    document.addEventListener("DOMContentLoaded", record_call("document.capture"), true);
+    document.addEventListener("DOMContentLoaded", record_call("document.bubble"), false);
+
+    document.attachEvent("onDOMContentLoaded", unexpected_call);
+    document.attachEvent("DOMContentLoaded", unexpected_call);
+
+    return function() {
+        ok(calls === "window.capture,document.capture,document.bubble,window.bubble,",
+           "calls = " + calls);
+        next_test();
+    };
+})();
+
+function test_listener_order() {
+    document.body.innerHTML = '<div></div>';
+    var div = document.body.firstChild;
+
+    var calls;
+    function record_call(msg) {
+        return function() { calls += msg + "," };
+    }
+
+    window.addEventListener("click", record_call("window.click(capture)"), true);
+    window.addEventListener("click", record_call("window.click(bubble)"), false);
+
+    document.attachEvent("onclick", record_call("document.click(attached)"));
+    document.addEventListener("click", record_call("document.click(capture)"), true);
+    document.addEventListener("click", record_call("document.click(bubble)"), false);
+    document.onclick = record_call("document.onclick");
+
+    document.body.onclick = record_call("body.onclick");
+    document.body.addEventListener("click", record_call("body.click(capture)"), true);
+    document.body.addEventListener("click", record_call("body.click(bubble)"), false);
+    document.body.attachEvent("onclick", record_call("body.click(attached)"));
+
+    div.attachEvent("onclick", record_call("div.click(attached)"));
+    div.addEventListener("click", record_call("div.click(bubble)"), false);
+    div.onclick = record_call("div.onclick");
+    div.addEventListener("click", record_call("div.click(capture1)"), true);
+    div.addEventListener("click", record_call("div.click(capture2)"), true);
+
+    calls = "";
+    div.click();
+    ok(calls === "window.click(capture),document.click(capture),body.click(capture),"
+       + "div.click(attached),div.click(bubble),div.onclick,div.click(capture1),"
+       + "div.click(capture2),body.onclick,body.click(bubble),body.click(attached),"
+       + "document.click(attached),document.click(bubble),document.onclick,"
+       + "window.click(bubble),", "calls = " + calls);
+
+    div.onclick = record_call("new div.onclick");
+
+    calls = "";
+    div.click();
+    ok(calls === "window.click(capture),document.click(capture),body.click(capture),"
+       + "div.click(attached),div.click(bubble),new div.onclick,div.click(capture1),"
+       + "div.click(capture2),body.onclick,body.click(bubble),body.click(attached),"
+       + "document.click(attached),document.click(bubble),document.onclick,"
+       + "window.click(bubble),", "calls = " + calls);
+
+    next_test();
+}
+
+function test_add_listener_in_listener() {
+    var calls;
+
+    document.body.innerHTML = '<div><div></div></div>';
+    var div1 = document.body.firstChild;
+    var div2 = div1.firstChild;
+
+    function record_call(msg) {
+        return function() { calls += msg + "," };
+    }
+
+    div1.addEventListener("click", function() {
+        div2.addEventListener("click", function() {
+            calls += "div2.click";
+            /* if we add more listeners here, whey won't be invoked */
+            div2.onclick = function() { calls += "click2,"; };
+            div2.addEventListener("click", function() { calls += "click3,"; }, false);
+            div2.attachEvent("onclick", function() { calls += "click4,"; });
+        }, true);
+    }, true);
+
+    calls = "";
+    div2.click();
+    ok(calls === "div2.click", "calls = " + calls);
+
+    next_test();
+}
+
+function test_remove_listener_in_listener() {
+    var calls;
+
+    document.body.innerHTML = '<div></div>';
+    var div = document.body.firstChild;
+
+    function record_call(msg) {
+        return function() { calls += msg + "," };
+    }
+
+    var capture = record_call("capture"), bubble = record_call("bubble");
+
+    div.addEventListener("click", function() {
+        div.removeEventListener("click", capture, true);
+        div.removeEventListener("click", bubble, false);
+        calls += "remove,";
+    }, true);
+
+    div.addEventListener("click", capture, true);
+    div.addEventListener("click", bubble, false);
+    div.onclick = record_call("onclick");
+
+    calls = "";
+    div.click();
+    ok(calls === "remove,capture,bubble,onclick,", "calls = " + calls);
+
+    next_test();
+}
+
+function test_add_remove_listener() {
+    var calls;
+
+    document.body.innerHTML = '<div></div>';
+    var div = document.body.firstChild;
+
+    function listener() {
+        calls += "listener,";
+    }
+
+    /* if the same listener is added twice, second one won't be called */
+    div.addEventListener("click", listener, false);
+    div.addEventListener("click", listener, false);
+
+    calls = "";
+    div.click();
+    ok(calls === "listener,", "calls = " + calls);
+
+    /* remove capture listener, it won't do anything */
+    div.removeEventListener("click", listener, true);
+
+    calls = "";
+    div.click();
+    ok(calls === "listener,", "calls = " + calls);
+
+    /* remove listener once, it won't called anymore */
+    div.removeEventListener("click", listener, false);
+
+    calls = "";
+    div.click();
+    ok(calls === "", "calls = " + calls);
+
+    div.removeEventListener("click", listener, false);
+
+    next_test();
+}
+
+function test_event_phase() {
+    document.body.innerHTML = '<div><div></div></div>';
+    var div1 = document.body.firstChild;
+    var div2 = div1.firstChild;
+    var last_event;
+
+    function check_phase(expected_phase) {
+        return function(e) {
+            if(last_event)
+                ok(last_event === e, "last_event != e");
+            else
+                last_event = e;
+            ok(e.eventPhase === expected_phase,
+               "eventPhase = " + e.eventPhase + " expedted " + expected_phase);
+        };
+    }
+
+    div1.addEventListener("click", check_phase(1), true);
+    div1.addEventListener("click", check_phase(3), false);
+    div1.onclick = check_phase(3);
+    div2.addEventListener("click", check_phase(2), true);
+    div2.addEventListener("click", check_phase(2), false);
+    div2.onclick = check_phase(2);
+
+    div2.click();
+    ok(last_event.eventPhase === 3, "last_event.eventPhase = " + last_event.eventPhase);
+
+    next_test();
+}
+
+function test_stop_propagation() {
+    document.body.innerHTML = '<div><div></div></div>';
+    var div1 = document.body.firstChild;
+    var div2 = div1.firstChild;
+
+    var calls;
+    function record_call(msg) {
+        return function() { calls += msg + "," };
+    }
+
+    function stop_propagation(e) {
+        calls += "stop,";
+        e.stopPropagation();
+    }
+
+    div1.addEventListener("click", stop_propagation, true);
+    div1.addEventListener("click", record_call("div1.click(capture)"), true);
+
+    div2.addEventListener("click", stop_propagation, true);
+    div2.addEventListener("click", record_call("div2.click(capture)"), true);
+
+    div1.addEventListener("click", stop_propagation, false);
+    div1.addEventListener("click", record_call("div1.click(bubble)"), false);
+
+    div2.addEventListener("click", stop_propagation, false);
+    div2.addEventListener("click", record_call("div2.click(bubble)"), false);
+
+    calls = "";
+    div2.click();
+    ok(calls === "stop,div1.click(capture),", "calls = " + calls);
+
+    div1.removeEventListener("click", stop_propagation, true);
+    calls = "";
+    div2.click();
+    ok(calls === "div1.click(capture),stop,div2.click(capture),stop,div2.click(bubble),",
+       "calls = " + calls);
+
+    div2.removeEventListener("click", stop_propagation, true);
+    calls = "";
+    div2.click();
+    ok(calls === "div1.click(capture),div2.click(capture),stop,div2.click(bubble),",
+       "calls = " + calls);
+
+    div2.removeEventListener("click", stop_propagation, false);
+    calls = "";
+    div2.click();
+    ok(calls === "div1.click(capture),div2.click(capture),div2.click(bubble),stop,div1.click(bubble),",
+       "calls = " + calls);
+
+    next_test();
+}
+
+var tests = [
+    test_content_loaded,
+    test_add_remove_listener,
+    test_add_listener_in_listener,
+    test_remove_listener_in_listener,
+    test_event_phase,
+    test_stop_propagation,
+    test_listener_order
+];
diff --git a/dlls/mshtml/tests/rsrc.rc b/dlls/mshtml/tests/rsrc.rc
index 2f90c00cb4..ec2b72917a 100644
--- a/dlls/mshtml/tests/rsrc.rc
+++ b/dlls/mshtml/tests/rsrc.rc
@@ -46,6 +46,9 @@ xhr.js HTML "xhr.js"
 /* @makedep: elements.js */
 elements.js HTML "elements.js"
 
+/* @makedep: events.js */
+events.js HTML "events.js"
+
 /* @makedep: documentmode.js */
 documentmode.js HTML "documentmode.js"
 
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c
index 045835bb6c..243c10c07a 100644
--- a/dlls/mshtml/tests/script.c
+++ b/dlls/mshtml/tests/script.c
@@ -3460,6 +3460,7 @@ static void run_js_tests(void)
 
     run_script_as_http_with_mode("xhr.js", NULL, "11");
     run_script_as_http_with_mode("elements.js", NULL, "11");
+    run_script_as_http_with_mode("events.js", NULL, "9");
     run_script_as_http_with_mode("navigation.js", NULL, NULL);
     run_script_as_http_with_mode("navigation.js", NULL, "11");
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.