delete-before-invisible-line-break.html (4810B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="timeout" content="long"> 6 <meta name="variant" content="?white-space=normal"> 7 <meta name="variant" content="?white-space=pre"> 8 <meta name="variant" content="?white-space=pre-line"> 9 <meta name="variant" content="?white-space=pre-wrap"> 10 <title>Deleting content immediately before invisible line break should clean up if it's unnecessary anymore</title> 11 <script src="/resources/testharness.js"></script> 12 <script src="/resources/testharnessreport.js"></script> 13 <script src="/resources/testdriver.js"></script> 14 <script src="/resources/testdriver-vendor.js"></script> 15 <script src="/resources/testdriver-actions.js"></script> 16 <script src="../../editing/include/editor-test-utils.js"></script> 17 <script> 18 "use strict"; 19 20 const searchParams = new URLSearchParams(document.location.search); 21 const whiteSpace = searchParams.get("white-space"); 22 const useBR = whiteSpace == "normal"; 23 const collapseWhiteSpaces = whiteSpace == "normal" || whiteSpace == "pre-line"; 24 25 addEventListener("load", () => { 26 const editingHost = document.querySelector("div[contenteditable]"); 27 editingHost.style.whiteSpace = whiteSpace; 28 editingHost.getBoundingClientRect(); 29 editingHost.focus(); 30 const utils = new EditorTestUtils(editingHost); 31 32 for (const data of [ 33 { 34 initialInnerHTML: "<p>a []<br></p>", 35 expected: "<p>a</p>", 36 }, 37 { 38 initialInnerHTML: "<p>a[ ]<br></p>", 39 expected: "<p>a</p>", 40 }, 41 { 42 initialInnerHTML: "<p>a b[]<br></p>", 43 expected: collapseWhiteSpaces 44 ? ["<p>a <br></p>", "<p>a </p>"] 45 : "<p>a </p>", 46 }, 47 { 48 initialInnerHTML: "<p>a [b]<br></p>", 49 expected: collapseWhiteSpaces 50 ? ["<p>a <br></p>", "<p>a </p>"] 51 : "<p>a </p>", 52 }, 53 { 54 initialInnerHTML: "<p>a []\n</p>", 55 expected: "<p>a</p>", 56 skipIf: () => useBR, 57 }, 58 { 59 initialInnerHTML: "<p>a[ ]\n</p>", 60 expected: "<p>a</p>", 61 skipIf: () => useBR, 62 }, 63 { 64 initialInnerHTML: "<p>a b[]\n</p>", 65 expected: collapseWhiteSpaces 66 ? ["<p>a \n</p>", "<p>a </p>"] 67 : "<p>a </p>", 68 skipIf: () => useBR, 69 }, 70 { 71 initialInnerHTML: "<p>a [b]\n</p>", 72 expected: collapseWhiteSpaces 73 ? ["<p>a \n</p>", "<p>a </p>"] 74 : "<p>a </p>", 75 skipIf: () => useBR, 76 }, 77 { 78 initialInnerHTML: "<div>a []<br><div>b</div></div>", 79 expected: "<div>a<div>b</div></div>", 80 }, 81 { 82 initialInnerHTML: "<div>a[ ]<br><div>b</div></div>", 83 expected: "<div>a<div>b</div></div>", 84 }, 85 { 86 initialInnerHTML: "<div>a b[]<br><div>b</div></div>", 87 expected: collapseWhiteSpaces 88 ? ["<div>a <br><div>b</div></div>", "<div>a <div>b</div></div>"] 89 : "<div>a <div>b</div></div>", 90 }, 91 { 92 initialInnerHTML: "<div>a [b]<br><div>b</div></div>", 93 expected: collapseWhiteSpaces 94 ? ["<div>a <br><div>b</div></div>", "<div>a <div>b</div></div>"] 95 : "<div>a <div>b</div></div>", 96 }, 97 { 98 initialInnerHTML: "<div>a []\n<div>b</div></div>", 99 expected: "<div>a<div>b</div></div>", 100 skipIf: () => useBR, 101 }, 102 { 103 initialInnerHTML: "<div>a[ ]\n<div>b</div></div>", 104 expected: "<div>a<div>b</div></div>", 105 skipIf: () => useBR, 106 }, 107 { 108 initialInnerHTML: "<div>a b[]\n<div>b</div></div>", 109 expected: collapseWhiteSpaces 110 ? ["<div>a \n<div>b</div></div>", "<div>a <div>b</div></div>"] 111 : "<div>a <div>b</div></div>", 112 skipIf: () => useBR, 113 }, 114 { 115 initialInnerHTML: "<div>a [b]\n<div>b</div></div>", 116 expected: collapseWhiteSpaces 117 ? ["<div>a \n<div>b</div></div>", "<div>a <div>b</div></div>"] 118 : "<div>a <div>b</div></div>", 119 skipIf: () => useBR, 120 }, 121 ]) { 122 if (data.skipIf !== undefined && data.skipIf()) { 123 continue; 124 } 125 promise_test(async () => { 126 utils.setupEditingHost(data.initialInnerHTML); 127 document.execCommand("delete"); 128 if (Array.isArray(data.expected)) { 129 assert_in_array(editingHost.innerHTML, data.expected); 130 } else { 131 assert_equals(editingHost.innerHTML, data.expected); 132 } 133 }, `document.execCommand("delete") when ${data.initialInnerHTML.replaceAll("\n", "\\n")}`); 134 promise_test(async () => { 135 utils.setupEditingHost(data.initialInnerHTML); 136 await utils.sendBackspaceKey(); 137 if (Array.isArray(data.expected)) { 138 assert_in_array(editingHost.innerHTML, data.expected); 139 } else { 140 assert_equals(editingHost.innerHTML, data.expected); 141 } 142 }, `Backspace when ${data.initialInnerHTML.replaceAll("\n", "\\n")}`); 143 } 144 }, {once: true}); 145 </script> 146 </head> 147 <body> 148 <div contenteditable></div> 149 </body> 150 </html>