summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html')
-rw-r--r--testing/web-platform/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html51
1 files changed, 51 insertions, 0 deletions
diff --git a/testing/web-platform/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html b/testing/web-platform/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html
new file mode 100644
index 0000000000..39c4393323
--- /dev/null
+++ b/testing/web-platform/tests/dom/nodes/insertion-removing-steps/Node-appendChild-script-in-script.tentative.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Node.appendChild: inserting a script and some code in an empty script</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<body>
+<script id="s1"></script>
+<script>
+const happened = [];
+test(() => {
+ const s1 = document.getElementById("s1");
+ const s2 = document.createElement("script");
+
+ // This script, which is ultimately a *child* of the
+ // already-connected-but-empty `s1` script, runs second, after `s1` runs. See
+ // the example in
+ // http://html.spec.whatwg.org/C/#script-processing-model:children-changed-steps
+ // for more information.
+ //
+ // HISTORICAL CONTEXT: There used to be a condition in the HTML standard that
+ // said an "outer" script must be "prepared" when a node gets inserted into
+ // the script. BUT it also stipulated that if the insertion consists of any
+ // "inner" (nested, essentially) script elements, then this "outer" script
+ // must prepare/execute after any of those "inner" newly-inserted scripts
+ // themselves get prepared.
+ //
+ // This changed in https://github.com/whatwg/html/pull/10188.
+ s2.textContent = `
+ happened.push("s2");
+
+ // This text never executes in the outer script, because by the time this
+ // gets appended, the outer script has "already started" [1], so it does not
+ // get re-prepared/executed a second time.
+ //
+ // [1]: https://html.spec.whatwg.org/C#already-started
+ s1.appendChild(new Text("happened.push('s1ran');"));
+
+ happened.push("s2ran");
+`;
+
+ const df = document.createDocumentFragment();
+ df.appendChild(new Text(`happened.push("s1");`));
+ df.appendChild(s2);
+
+ assert_array_equals(happened, []);
+ s1.appendChild(df);
+ assert_array_equals(happened, ["s1", "s2", "s2ran"]);
+}, "An outer script whose preparation/execution gets triggered by the " +
+ "insertion of a 'nested'/'inner' script, executes *before* the inner " +
+ "script executes");
+</script>