Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!DOCTYPE html>
<html>
<head>
<title>EditContext: document.execCommand</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="../../clipboard-apis/resources/user-activation.js"></script>
</head>
<body>
<script>
promise_test(async function() {
const editContext = new EditContext();
const test = document.createElement("div");
document.body.appendChild(test);
let firedTextUpdate = false;
editContext.addEventListener("textupdate", e => {
firedTextUpdate = true;
});
test.editContext = editContext;
test.focus();
assert_true(document.queryCommandSupported("inserttext"), "'inserttext' should be supported regardless of focus position");
assert_false(document.queryCommandEnabled("inserttext"), "'inserttext' should not be supported in EditContext");
document.execCommand("inserttext", false, "a");
assert_equals(test.innerHTML, "", "DOM should not be updated from execCommand('inserttext')");
assert_false(firedTextUpdate, "textupdate should not fire for to execCommand('inserttext')");
test.remove();
}, 'document.execCommand("inserttext") should not change the DOM or fire textupdate');
promise_test(async function() {
const editContext = new EditContext();
const test = document.createElement("div");
test.innerHTML = "abc";
document.body.appendChild(test);
let firedTextUpdate = false;
editContext.addEventListener("textupdate", e => {
firedTextUpdate = true;
});
test.editContext = editContext;
test.focus();
assert_true(document.queryCommandSupported("bold"), "'bold' should be supported regardless of focus position");
assert_false(document.queryCommandEnabled("bold"), "'bold' should not be supported in EditContext");
document.execCommand("bold");
assert_equals(test.innerHTML, "abc", "DOM should not be updated from execCommand('bold')");
assert_false(firedTextUpdate, "textupdate should not fire for execCommand('bold')");
test.remove();
}, 'document.execCommand("bold") should not change the DOM or fire textupdate');
promise_test(async function() {
const editContext = new EditContext();
const test = document.createElement("div");
test.innerHTML = "<b>ab</b>c";
document.body.appendChild(test);
let firedTextUpdate = false;
editContext.addEventListener("textupdate", e => {
firedTextUpdate = true;
});
test.editContext = editContext;
const selection = window.getSelection();
selection.setBaseAndExtent(test.firstChild.firstChild, 0, test.firstChild.firstChild, 1);
assert_false(document.queryCommandState("bold"), "queryCommandState should always return false in EditContext");
assert_equals(document.queryCommandValue("bold"), "false", "queryCommandValue should always return 'false' in EditContext for commands that return booleans");
assert_equals(document.queryCommandValue("forecolor"), "", "queryCommandValue should always return empty string in EditContext for commands that return strings");
selection.setBaseAndExtent(test.firstChild.firstChild, 1, test.lastChild, 1);
assert_false(document.queryCommandIndeterm("bold"), "'queryCommandInterm should always return false in EditContext");
test.remove();
}, 'queryCommandState, queryCommandvalue, and queryCommandInterm should always return false');
promise_test(async function() {
const editContext = new EditContext();
const test = document.createElement("div");
test.innerHTML = "abc";
document.body.appendChild(test);
let firedTextUpdate = false;
editContext.addEventListener("textupdate", e => {
firedTextUpdate = true;
});
test.editContext = editContext;
test.focus();
const selection = window.getSelection();
selection.setBaseAndExtent(test.firstChild, 0, test.firstChild, 1);
await test_driver.set_permission({name: 'clipboard-read'}, 'granted');
assert_true(document.execCommand("copy"), "'copy' always returns true regardless of whether it did anything");
await waitForUserActivation();
let clipboardText = await navigator.clipboard.readText();
assert_equals(clipboardText, "a", "'copy' should work in EditContext");
selection.setBaseAndExtent(test.firstChild, 1, test.firstChild, 2);
assert_true(document.execCommand("cut"), "'cut' always returns true regardless of whether it did anything");
assert_equals(test.innerHTML, "abc", "DOM should not be updated from execCommand('cut')");
await waitForUserActivation();
clipboardText = await navigator.clipboard.readText();
assert_equals(clipboardText, "a", "Failed 'cut' should not change clipboard");
test.remove();
}, 'document.execCommand("copy") should work but document.execCommand("cut") should not change the DOM or the clipboard');
</script>
</body>
</html>