Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="timeout" content="long">
<title>Undo after splitting nodes are moved</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>
</head>
<body>
<div contenteditable></div>
<script>
"use strict";
document.execCommand("defaultParagraphSeparator", false, "div");
const utils =
new EditorTestUtils(document.querySelector("div[contenteditable]"));
promise_test(async t => {
utils.setupEditingHost(
`<div>abc[]def</div><p>ghi</p>`
);
await utils.sendEnterKey();
const right = utils.editingHost.querySelector("div + div");
utils.editingHost.appendChild(right);
// Now, the right <div> is after the <p>, it should be merged into the left
// <div> before the <p>.
document.execCommand("undo");
assert_in_array(
utils.editingHost.innerHTML,
[
"<div>abcdef</div><p>ghi</p>",
"<div>abcdef<br></div><p>ghi</p>",
]
);
}, "Undo insertParagraph after moving right node to different paragraph");
promise_test(async () => {
utils.setupEditingHost(
`<p>abc</p><div>def[]ghi</div>`
);
await utils.sendEnterKey();
const left = utils.editingHost.querySelector("div");
utils.editingHost.insertBefore(left, document.querySelector("p"));
// Now, the left <div> is before the <p>, the right <div> after the <p> should
// be merged into it.
document.execCommand("undo");
assert_in_array(
utils.editingHost.innerHTML,
[
"<div>defghi</div><p>abc</p>",
"<div>defghi<br></div><p>abc</p>",
]
);
}, "Undo insertParagraph after moving left node to different paragraph");
promise_test(async () => {
utils.setupEditingHost(
`<div>abc[]def</div>`
);
await utils.sendEnterKey();
const left = utils.editingHost.querySelector("div");
const right = utils.editingHost.querySelector("div + div");
left.insertBefore(right, left.firstChild);
// Now, the right <div> is a child node of the left <div>. Its children
// should be merged to the parent.
document.execCommand("undo");
assert_in_array(
utils.editingHost.innerHTML,
[
"<div>abcdef</div>",
"<div>abcdef<br></div>",
]
);
}, "Undo insertParagraph after moving right node into the left node");
promise_test(async () => {
utils.setupEditingHost(
`<div>abc[]def</div>`
);
await utils.sendEnterKey();
const left = utils.editingHost.querySelector("div");
const right = utils.editingHost.querySelector("div + div");
right.appendChild(left);
// Now, the right <div> is parent of the left <div>. The children of the
// right <div> should be moved to the child left <div>, but the right <div>
// should be removed.
document.execCommand("undo");
assert_equals(
utils.editingHost.innerHTML,
"",
"The right <div> containing the left <div> should be removed"
);
assert_in_array(
left.innerHTML,
[
"abcdef",
"abcdef<br>",
],
"The left <div> which was disconnected should have the original content"
);
}, "Undo insertParagraph after moving left node into the right node");
</script>
</body>
</html>