1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="timeout" content="long">
<meta name="variant" content="?white-space=normal">
<meta name="variant" content="?white-space=pre">
<meta name="variant" content="?white-space=pre-line">
<meta name="variant" content="?white-space=pre-wrap">
<title>Pasting rich text into contenteditable=plaintext-only</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="../../../editing/include/editor-test-utils.js"></script>
<script>
"use strict";
const searchParams = new URLSearchParams(document.location.search);
const whiteSpace = searchParams.get("white-space");
const useBR = whiteSpace == "normal";
const isMac = navigator.platform.includes("Mac");
addEventListener("load", () => {
const placeholderForCopy = document.createElement("div");
document.body.appendChild(placeholderForCopy);
const editingHost = document.createElement("div");
editingHost.style.whiteSpace = whiteSpace;
editingHost.contentEditable = "plaintext-only";
document.body.appendChild(editingHost);
editingHost.focus();
editingHost.getBoundingClientRect();
const utils = new EditorTestUtils(editingHost);
let lastBeforeInput;
editingHost.addEventListener("beforeinput", event => lastBeforeInput = event);
promise_test(async t => {
placeholderForCopy.innerHTML = "<b>abc</b>";
document.activeElement?.blur();
getSelection().selectAllChildren(placeholderForCopy);
await utils.sendCopyShortcutKey();
utils.setupEditingHost("A[]B");
lastBeforeInput = undefined;
await new test_driver.Actions()
.keyDown(isMac ? utils.kMeta : utils.kControl)
.keyDown(utils.kShift)
.keyDown("v")
.keyUp("v")
.keyUp(utils.kShift)
.keyUp(isMac ? utils.kMeta : utils.kControl)
.send();
test(() => {
assert_equals(lastBeforeInput?.inputType, "insertFromPaste", `inputType should be "insertFromPaste"`);
assert_equals(lastBeforeInput?.data, null, `data should be null`);
assert_true(
String(lastBeforeInput?.dataTransfer?.getData("text/html")).includes(placeholderForCopy.innerHTML),
`dataTransfer should have the copied HTML source`
);
}, `${t.name}: beforeinput`);
test(() => {
assert_equals(editingHost.innerHTML, "AabcB", "<b> should not be pasted");
}, `${t.name}: pasted result`);
}, "Pasting without format");
// FIXME: I don't know why Ctrl-middle click fails on macOS (it's not Command).
if (!navigator.platform.includes("Mac")) {
promise_test(async t => {
placeholderForCopy.innerHTML = "<b>abc</b>";
document.activeElement?.blur();
getSelection().selectAllChildren(placeholderForCopy);
await utils.sendCopyShortcutKey();
// For primary selection on Linux, we need to select text with user input emulation.
getSelection().collapse(placeholderForCopy, 0);
const arrowRight = "\uE014";
await new test_driver.Actions()
.keyDown(utils.kShift)
.keyDown(arrowRight)
.keyUp(arrowRight)
.keyDown(arrowRight)
.keyUp(arrowRight)
.keyDown(arrowRight)
.keyUp(arrowRight)
.keyUp(utils.kShift)
.send();
utils.setupEditingHost("{}<br>");
lastBeforeInput = undefined;
const actions = new test_driver.Actions();
await actions
.pointerMove(1, 1, {origin: "viewport"})
.pointerMove(0, 0, {origin: editingHost})
.keyDown(utils.kControl)
.pointerDown({button: actions.ButtonType.MIDDLE})
.pointerUp({button: actions.ButtonType.MIDDLE})
.keyUp(utils.kControl)
.send();
test(() => {
assert_equals(
lastBeforeInput?.inputType,
"insertFromPasteAsQuotation",
`inputType should be "insertFromPasteAsQuotation"`
);
assert_equals(lastBeforeInput?.data, null, `data should be null`);
assert_true(
String(lastBeforeInput?.dataTransfer?.getData("text/html")).includes(placeholderForCopy.innerHTML),
`dataTransfer should have the copied HTML source`
);
}, `${t.name}: beforeinput`);
test(() => {
if (useBR) {
assert_equals(editingHost.innerHTML, "> abc<br><br><br>", "<b> should not be pasted");
} else {
assert_in_array(
editingHost.innerHTML,
// The last break is a padding line break to make the last empty line visible.
// Therefore, it should not appear in `.textContent`. So, only the last line
// break should be <br>.
"> abc\n\n<br>",
"<b> should not be pasted"
);
}
}, `${t.name}: pasted result`);
}, "Pasting as quotation");
}
}, {once: true});
</script>
</head>
<body></body>
</html>
|