summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/editing/other/editing-div-outside-body.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/editing/other/editing-div-outside-body.html')
-rw-r--r--testing/web-platform/tests/editing/other/editing-div-outside-body.html163
1 files changed, 163 insertions, 0 deletions
diff --git a/testing/web-platform/tests/editing/other/editing-div-outside-body.html b/testing/web-platform/tests/editing/other/editing-div-outside-body.html
new file mode 100644
index 0000000000..03064eb612
--- /dev/null
+++ b/testing/web-platform/tests/editing/other/editing-div-outside-body.html
@@ -0,0 +1,163 @@
+<!doctype html>
+<html>
+<meta charset=utf-8>
+<meta name="variant" content="?designMode">
+<meta name="variant" content="?body">
+<meta name="variant" content="?html">
+<meta name="variant" content="?div-in-body">
+<meta name="variant" content="?nothing">
+<title>Test editing outside of body element</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="../include/editor-test-utils.js"></script>
+<script>
+"use strict";
+
+// This test creates an editable <div> element, append it to the <html>,
+// i.e., after the <body>, and do something in it.
+
+const tests = [
+ {
+ command: "insertText",
+ arg: "abc",
+ initial: "<div>[]<br></div>",
+ expected: ["<div>abc</div>", "<div>abc<br></div>"],
+ },
+ {
+ command: "delete",
+ initial: "<div>abc[]</div>",
+ expected: ["<div>ab</div>", "<div>ab<br></div>"],
+ },
+ {
+ command: "forwardDelete",
+ initial: "<div>[]abc</div>",
+ expected: ["<div>bc</div>", "<div>bc<br></div>"],
+ },
+ {
+ command: "insertParagraph",
+ initial: "<div>ab[]c</div>",
+ expected: [
+ "<div>ab</div><div>c</div>",
+ "<div>ab<br></div><div>c</div>",
+ "<div>ab</div><div>c<br></div>",
+ "<div>ab<br></div><div>c<br></div>",
+ ],
+ },
+ {
+ command: "insertLineBreak",
+ initial: "<div>ab[]c</div>",
+ expected: ["<div>ab<br>c</div>", "<div>ab<br>c<br></div>"],
+ },
+ {
+ command: "bold",
+ initial: "<div>a[b]c</div>",
+ expected: ["<div>a<b>b</b>c</div>", "<div>a<b>b</b>c<br></div>"],
+ },
+ {
+ command: "italic",
+ initial: "<div>a[b]c</div>",
+ expected: ["<div>a<i>b</i>c</div>", "<div>a<i>b</i>c<br></div>"],
+ },
+ {
+ command: "createLink",
+ arg: "another.html",
+ initial: "<div>a[b]c</div>",
+ expected: [
+ "<div>a<a href=\"another.html\">b</a>c</div>",
+ "<div>a<a href=\"another.html\">b</a>c<br></div>",
+ ],
+ },
+ {
+ command: "unlink",
+ initial: "<div>a[<a href=\"another.html\">b</a>]c</div>",
+ expected: ["<div>abc</div>", "<div>abc<br></div>"],
+ },
+ {
+ command: "insertHTML",
+ arg: "<hr>",
+ initial: "<div>a[b]c</div>",
+ expected: [
+ "<div>a<hr>c</div>",
+ "<div>a<br><hr>c</div>",
+ "<div>a<hr>c<br></div>",
+ "<div>a<br><hr>c<br></div>",
+ ],
+ },
+ // TODO: Add more commands.
+];
+
+let editingHost = () => {
+ switch (document.location.search) {
+ case "?designMode":
+ document.designMode = "on";
+ return document.documentElement;
+ case "?body":
+ document.body.setAttribute("contenteditable", "true");
+ return document.body;
+ case "?html":
+ document.documentElement.setAttribute("contenteditable", "true");
+ return document.documentElement;
+ case "?div-in-body":
+ return document.querySelector("div[contenteditable]");
+ case "?nothing":
+ return null;
+ }
+};
+
+let div;
+
+promise_test(async () => {
+ await new Promise(resolve => {
+ addEventListener(
+ "load",
+ () => {
+ assert_true(true, "load event is fired");
+ resolve();
+ },
+ { once: true }
+ );
+ });
+
+ div = document.createElement("div");
+ if (editingHost != document.documentElement) {
+ div.setAttribute("contenteditable", "true");
+ editingHost = div;
+ }
+ document.documentElement.appendChild(div);
+ assert_equals(document.documentElement.lastChild, div,
+ "The test target should be last child of the <html>");
+}, "Waiting for load event");
+
+function addPromiseTest(testName, testFunc) {
+ promise_test(async () => {
+ editingHost.focus();
+ await testFunc(new EditorTestUtils(div));
+ }, testName);
+}
+
+for (const test of tests) {
+ addPromiseTest(
+ `Test for execCommand("${test.command}", false, ${
+ typeof test.arg == "string" ? `"${test.arg}"` : test.arg
+ }) in "${test.initial}"`,
+ async (utils) => {
+ utils.setupEditingHost(test.initial);
+ await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
+ document.execCommand(test.command, false, test.arg);
+ if (Array.isArray(test.expected)) {
+ assert_in_array(div.innerHTML, test.expected,
+ "The editing result is different from expected one");
+ } else {
+ assert_equals(div.innerHTML, test.expected,
+ "The editing result is different from expected one");
+ }
+ }
+ );
+}
+</script>
+</head>
+<body></body>
+</html>