Bug 1883912: Enable Intl.ListFormat test for "unit" style. r=spidermonkey-reviewers...
[gecko.git] / editor / libeditor / tests / test_paste_no_formatting.html
blob384510e4056646dd1adf114a317c7916cd5f6c3f
1 <!DOCTYPE HTML>
2 <html>
3 <head>
4 <meta charset="utf-8">
5 <title>Test pasting formatted test into various fields</title>
6 <script src="/tests/SimpleTest/SimpleTest.js"></script>
7 <script src="/tests/SimpleTest/EventUtils.js"></script>
8 <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
9 </head>
10 <body>
12 <input id="input">
13 <textarea id="textarea"></textarea>
14 <div id="editable" contenteditable="true"></div>
15 <div id="noneditable">Text</div>
17 <div id="source">Some <b>Bold</b> Text</div>
18 <script>
20 const expectedText = "Some Bold Text";
21 const expectedHTML = "<div id=\"source\">Some <b>Bold</b> Text</div>";
23 const htmlPrefix = navigator.platform.includes("Win")
24 ? "<html><body>\n<!--StartFragment-->"
25 : "";
26 const htmlPostfix = navigator.platform.includes("Win")
27 ? "<!--EndFragment-->\n</body>\n</html>"
28 : "";
30 add_task(async function test_paste_formatted() {
31 window.getSelection().selectAllChildren(document.getElementById("source"));
32 synthesizeKey("c", { accelKey: true });
34 function doKey(element, withShiftKey)
36 let inputEventPromise = new Promise(resolve => {
37 element.addEventListener("input", event => {
38 is(event.inputType, "insertFromPaste", "correct inputType");
39 resolve();
40 }, { once: true });
41 });
42 synthesizeKey("v", { accelKey: true, shiftKey: withShiftKey });
43 return inputEventPromise;
46 function cancelEvent(event) {
47 event.preventDefault();
50 // Paste into input and textarea
51 for (let fieldid of ["input", "textarea"]) {
52 const field = document.getElementById(fieldid);
53 field.focus();
55 field.addEventListener("paste", cancelEvent);
56 doKey(field, false);
57 is(
58 field.value,
59 "",
60 `Nothing should be pasted into <${field.tagName.toLowerCase()}> when paste event is canceled (shift key is not pressed)`
63 doKey(field, true);
64 is(
65 field.value,
66 "",
67 `Nothing should be pasted into <${field.tagName.toLowerCase()}> when paste event is canceled (shift key is pressed)`
69 field.removeEventListener("paste", cancelEvent);
71 doKey(field, false);
72 is(field.value, expectedText, "paste into " + fieldid);
74 doKey(field, true);
75 is(field.value, expectedText + expectedText, "paste unformatted into " + field);
78 const selection = window.getSelection();
80 const editable = document.getElementById("editable");
81 const innerHTMLBeforeTest = editable.innerHTML;
83 (function test_pasteWithFormatIntoEditableArea() {
84 selection.selectAllChildren(editable);
85 selection.collapseToStart();
86 editable.addEventListener("paste", cancelEvent);
87 doKey(editable, false);
88 is(
89 editable.innerHTML,
90 "",
91 "test_pasteWithFormatIntoEditableArea: Nothing should be pasted when paste event is canceled"
93 editable.removeEventListener("paste", cancelEvent);
95 doKey(editable, false);
96 is(
97 editable.innerHTML,
98 expectedHTML,
99 "test_pasteWithFormatIntoEditableArea: Pasting with format should work as expected"
101 editable.innerHTML = innerHTMLBeforeTest;
102 }());
104 (function test_pasteWithoutFormatIntoEditableArea() {
105 selection.selectAllChildren(editable);
106 selection.collapseToEnd();
107 doKey(editable, true);
109 editable.innerHTML,
110 expectedText,
111 "test_pasteWithoutFormatIntoEditableArea: Pasting without format should work as expected",
113 editable.innerHTML = innerHTMLBeforeTest;
114 })();
116 (function test_pasteWithFormatIntoEditableAreaWhenHTMLEditorIsInReadonlyMode() {
117 getEditor().flags |= SpecialPowers.Ci.nsIEditor.eEditorReadonlyMask;
118 selection.selectAllChildren(editable);
119 selection.collapseToStart();
120 let beforeInputEvents = [];
121 function onBeforeInput(aEvent) {
122 beforeInputEvents.push(aEvent);
124 editable.addEventListener("beforeinput", onBeforeInput);
125 doKey(editable, false);
126 const description = "test_pasteWithFormatIntoEditableAreaWhenHTMLEditorIsInReadonlyMode";
128 editable.innerHTML,
129 innerHTMLBeforeTest,
130 `${description}: Pasting with format should not work`
133 beforeInputEvents.length,
135 `${description}: Pasting with format should not cause "beforeinput", but fired "${
136 beforeInputEvents[0]?.inputType
139 editable.removeEventListener("beforeinput", onBeforeInput);
140 editable.innerHTML = innerHTMLBeforeTest;
141 getEditor().flags &= ~SpecialPowers.Ci.nsIEditor.eEditorReadonlyMask;
142 })();
144 (function test_pasteWithoutFormatIntoEditableAreaWhenHTMLEditorIsInReadonlyMode() {
145 getEditor().flags |= SpecialPowers.Ci.nsIEditor.eEditorReadonlyMask;
146 selection.selectAllChildren(editable);
147 selection.collapseToStart();
148 let beforeInputEvents = [];
149 function onBeforeInput(aEvent) {
150 beforeInputEvents.push(aEvent);
152 editable.addEventListener("beforeinput", onBeforeInput);
153 doKey(editable, false);
154 const description = "test_pasteWithoutFormatIntoEditableAreaWhenHTMLEditorIsInReadonlyMode";
156 editable.innerHTML,
157 innerHTMLBeforeTest,
158 `${description}: Pasting with format should not work`
161 beforeInputEvents.length,
163 `${description}: Pasting with format should not cause "beforeinput", but fired "${
164 beforeInputEvents[0]?.inputType
167 editable.removeEventListener("beforeinput", onBeforeInput);
168 editable.innerHTML = innerHTMLBeforeTest;
169 getEditor().flags &= ~SpecialPowers.Ci.nsIEditor.eEditorReadonlyMask;
170 })();
172 let noneditable = document.getElementById("noneditable");
173 selection.selectAllChildren(noneditable);
174 selection.collapseToStart();
176 function getPasteResult() {
177 return new Promise(resolve => {
178 noneditable.addEventListener("paste", event => {
179 resolve({
180 text: event.clipboardData.getData("text/plain"),
181 html: event.clipboardData.getData("text/html"),
183 }, { once: true});
187 // Normal paste into non-editable area
188 let pastePromise = getPasteResult();
189 doKey(noneditable, false);
190 is(noneditable.innerHTML, "Text", "paste into non-editable");
192 let result = await pastePromise;
193 is(result.text, expectedText, "paste text into non-editable");
194 is(result.html,
195 htmlPrefix + expectedHTML + htmlPostfix,
196 "paste html into non-editable");
198 // Unformatted paste into non-editable area
199 pastePromise = getPasteResult();
200 doKey(noneditable, true);
201 is(noneditable.innerHTML, "Text", "paste unformatted into non-editable");
203 result = await pastePromise;
204 is(result.text, expectedText, "paste unformatted text into non-editable");
205 // Formatted HTML text should not exist when pasting unformatted.
206 is(result.html, "", "paste unformatted html into non-editable");
209 function getEditor() {
210 const editingSession = SpecialPowers.wrap(window).docShell.editingSession;
211 return editingSession.getEditorForWindow(window);
213 </script>
214 </body>