summaryrefslogtreecommitdiffstats
path: root/editor/libeditor/tests/test_cmd_absPos.html
diff options
context:
space:
mode:
Diffstat (limited to 'editor/libeditor/tests/test_cmd_absPos.html')
-rw-r--r--editor/libeditor/tests/test_cmd_absPos.html296
1 files changed, 296 insertions, 0 deletions
diff --git a/editor/libeditor/tests/test_cmd_absPos.html b/editor/libeditor/tests/test_cmd_absPos.html
new file mode 100644
index 0000000000..c31c2c53a4
--- /dev/null
+++ b/editor/libeditor/tests/test_cmd_absPos.html
@@ -0,0 +1,296 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Testing cmd_absPos command</title>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css">
+</head>
+<body contenteditable></body>
+<script>
+SimpleTest.waitForExplicitFinish();
+SimpleTest.waitForFocus(() => {
+ (function testTogglingPositionInBodyChildText() {
+ const description = "testTogglingPositionInBodyChildText";
+ const textNode = document.createTextNode("abc");
+ document.body.appendChild(textNode);
+ getSelection().collapse(textNode, 1);
+
+ SpecialPowers.doCommand(window, "cmd_absPos");
+ const div = textNode.parentNode;
+ is(
+ div.tagName.toLowerCase(),
+ "div",
+ `${
+ description
+ }: a <div> element should be created and the text node should be wrapped in it`
+ );
+ is(
+ div.style.position,
+ "absolute",
+ `${description}: position of the <div> should be set to "absolute"`
+ );
+ isnot(
+ div.style.top,
+ "",
+ `${description}: top of the <div> should be set`
+ );
+ isnot(
+ div.style.left,
+ "",
+ `${description}: left of the <div> should be set`
+ );
+ ok(
+ getSelection().isCollapsed,
+ `${
+ description
+ }: selection should be collapsed (making it absolutely positioned)`
+ );
+ // Collapsing selection to start of the absolutely positioned <div> seems
+ // odd. Why don't we keep selection in the new <div>?
+ is(
+ getSelection().focusNode,
+ div,
+ `${
+ description
+ }: selection should be collapsed in the absolutely positioned <div>`
+ );
+ is(
+ getSelection().focusOffset,
+ 0,
+ `${
+ description
+ }: selection should be collapsed at start of the absolutely positioned <div>`
+ );
+
+ SpecialPowers.doCommand(window, "cmd_absPos");
+ ok(
+ !div.isConnected,
+ `${description}: the <div> should be removed from the <body>`
+ );
+ is(
+ div.style.position,
+ "",
+ `${description}: position of the <div> should be unset`
+ );
+ is(
+ div.style.top,
+ "",
+ `${description}: top of the <div> should be unset`
+ );
+ is(
+ div.style.left,
+ "",
+ `${description}: left of the <div> should be unset`
+ );
+ ok(
+ getSelection().isCollapsed,
+ `${
+ description
+ }: selection should be collapsed (making it in normal flow)`
+ );
+ // If we change the above behavior, we can keep selection collapsed in the
+ // text node here.
+ is(
+ getSelection().focusNode,
+ document.body,
+ `${description}: selection should be collapsed in the <body>`
+ );
+ todo_is(
+ getSelection().focusNode.childNodes.item(
+ getSelection().focusOffset
+ ),
+ textNode,
+ `${description}: selection should be collapsed after the text node`
+ );
+ textNode.remove();
+ })();
+
+ (function testTogglingPositionOfDivContainingCaret() {
+ const description = "testTogglingPositionOfDivContainingCaret";
+ const div = document.createElement("div");
+ div.innerHTML = "abc";
+ document.body.appendChild(div);
+ const textNode = div.firstChild;
+ getSelection().collapse(textNode, 1);
+ SpecialPowers.doCommand(window, "cmd_absPos");
+ is(
+ div.style.position,
+ "absolute",
+ `${description}: position of the <div> should be set to "absolute"`
+ );
+ isnot(
+ div.style.top,
+ "",
+ `${description}: top of the <div> should be set`
+ );
+ isnot(
+ div.style.left,
+ "",
+ `${description}: left of the <div> should be set`
+ );
+ ok(
+ getSelection().isCollapsed,
+ `${
+ description
+ }: selection should be collapsed (making it absolutely positioned)`
+ );
+ is(
+ getSelection().focusNode,
+ textNode,
+ `${
+ description
+ }: selection should be collapsed in the absolutely positioned <div>`
+ );
+ is(
+ getSelection().focusOffset,
+ 1,
+ `${
+ description
+ }: selection should be collapsed at same offset in the absolutely positioned <div>`
+ );
+
+ SpecialPowers.doCommand(window, "cmd_absPos");
+ ok(
+ !div.isConnected,
+ `${description}: the <div> should be removed from the <body>`
+ );
+ is(
+ div.style.position,
+ "",
+ `${description}: position of the <div> should be unset`
+ );
+ is(
+ div.style.top,
+ "",
+ `${description}: top of the <div> should be unset`
+ );
+ is(
+ div.style.left,
+ "",
+ `${description}: left of the <div> should be unset`
+ );
+ ok(
+ getSelection().isCollapsed,
+ `${
+ description
+ }: selection should be collapsed (making it in normal flow)`
+ );
+ is(
+ getSelection().focusNode,
+ textNode,
+ `${description}: selection should be collapsed in the <div>`
+ );
+ is(
+ getSelection().focusOffset,
+ 1,
+ `${description}: selection should be collapsed at same offset in the <div>`
+ );
+ div.remove();
+ textNode.remove();
+ })();
+
+ (function testTogglingPositionOfDivContainingSelectionRange() {
+ const description = "testTogglingPositionOfDivContainingSelectionRange";
+ const div = document.createElement("div");
+ div.innerHTML = "abc";
+ document.body.appendChild(div);
+ const textNode = div.firstChild;
+ getSelection().setBaseAndExtent(textNode, 1, textNode, 2);
+ SpecialPowers.doCommand(window, "cmd_absPos");
+ is(
+ div.style.position,
+ "absolute",
+ `${description}: position of the <div> should be set to "absolute"`
+ );
+ isnot(
+ div.style.top,
+ "",
+ `${description}: top of the <div> should be set`
+ );
+ isnot(
+ div.style.left,
+ "",
+ `${description}: left of the <div> should be set`
+ );
+ is(
+ getSelection().anchorNode,
+ textNode,
+ `${
+ description
+ }: selection should start from the text node in the absolutely positioned <div>`
+ );
+ is(
+ getSelection().anchorOffset,
+ 1,
+ `${
+ description
+ }: selection should start from "b" in the text node in the absolutely positioned <div>`
+ );
+ is(
+ getSelection().focusNode,
+ textNode,
+ `${
+ description
+ }: selection should end in the text node in the absolutely positioned <div>`
+ );
+ is(
+ getSelection().focusOffset,
+ 2,
+ `${
+ description
+ }: selection should end after "b" absolutely positioned <div>`
+ );
+
+ getSelection().setBaseAndExtent(textNode, 1, textNode, 2);
+ SpecialPowers.doCommand(window, "cmd_absPos");
+ ok(
+ !div.isConnected,
+ `${description}: the <div> should be removed from the <body>`
+ );
+ is(
+ div.style.position,
+ "",
+ `${description}: position of the <div> should be unset`
+ );
+ is(
+ div.style.top,
+ "",
+ `${description}: top of the <div> should be unset`
+ );
+ is(
+ div.style.left,
+ "",
+ `${description}: left of the <div> should be unset`
+ );
+ is(
+ getSelection().anchorNode,
+ textNode,
+ `${description}: selection should start from the text node in the <div>`
+ );
+ is(
+ getSelection().anchorOffset,
+ 1,
+ `${
+ description
+ }: selection should start from "b" in the text node in the <div>`
+ );
+ is(
+ getSelection().focusNode,
+ textNode,
+ `${description}: selection should end in the text node in the <div>`
+ );
+ is(
+ getSelection().focusOffset,
+ 2,
+ `${description}: selection should end after "b" <div>`
+ );
+ div.remove();
+ textNode.remove();
+ })();
+
+ document.body.removeAttribute("contenteditable");
+ SimpleTest.finish();
+});
+</script>
+</html>