forwarddelete-chars-following-collapsible-white-space.html (7752B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="timeout" content="long"> 6 <title>Test (forward) Delete to delete following character(s) of collapsible white-space</title> 7 <script src="/resources/testharness.js"></script> 8 <script src="/resources/testharnessreport.js"></script> 9 <script src="/resources/testdriver.js"></script> 10 <script src="/resources/testdriver-vendor.js"></script> 11 <script src="/resources/testdriver-actions.js"></script> 12 <script src="../include/editor-test-utils.js"></script> 13 <script> 14 "use strict"; 15 16 addEventListener("load", () => { 17 const editingHost = document.querySelector("div[contenteditable]"); 18 editingHost.focus(); 19 const utils = new EditorTestUtils(editingHost); 20 for (const data of [ 21 { 22 init: "<p> []a</p>", 23 // The white-space before "a" is invisible due to immediately after the 24 // block boundary. Therefore, it may be deleted. 25 expected: [ 26 "<p><br></p>", 27 "<p> <br></p>", 28 ], 29 }, 30 { 31 init: "<p><b> []a</b></p>", 32 // The white-space before "a" is invisible due to immediately after the 33 // block boundary. Therefore, it may be deleted. 34 expected: [ 35 "<p><br></p>", 36 "<p><b><br></b></p>", 37 "<p><b> <br></b></p>", 38 ], 39 }, 40 { 41 init: "<p>abc []d</p>", 42 expected: [ 43 "<p>abc <br></p>", 44 "<p>abc </p>", 45 ], 46 }, 47 { 48 init: "<p><b>abc []d</b></p>", 49 expected: [ 50 "<p><b>abc <br></b></p>", 51 "<p><b>abc </b></p>", 52 ], 53 }, 54 { 55 init: "<p>abc []d<br></p>", 56 expected: [ 57 "<p>abc <br></p>", 58 "<p>abc </p>", 59 ], 60 }, 61 { 62 init: " []a<p>bc</p>", 63 // The white-space before "a" is invisible due to immediately after the 64 // block boundary. Therefore, it may be deleted. 65 expected: [ 66 "<br><p>bc</p>", 67 " <br><p>bc</p>", 68 ], 69 }, 70 { 71 init: "abc []d<p>ef</p>", 72 expected: [ 73 "abc <br><p>ef</p>", 74 "abc <p>ef</p>", 75 ], 76 }, 77 { 78 init: "<b>abc []d</b><p>ef</p>", 79 expected: [ 80 "<b>abc <br></b><p>ef</p>", 81 "<b>abc </b><p>ef</p>", 82 ], 83 }, 84 { 85 init: "<p>abc</p> []d", 86 // The white-space before "d" is invisible due to immediately after the 87 // block boundary. Therefore, it may be deleted. 88 expected: [ 89 "<p>abc</p><br>", 90 "<p>abc</p> <br>", 91 ], 92 }, 93 { 94 init: "<p>abc</p>def []g", 95 expected: [ 96 "<p>abc</p>def <br>", 97 "<p>abc</p>def ", 98 ], 99 }, 100 { 101 init: "<p>abc</p><b> []d</b>", 102 // The white-space before "d" is invisible due to immediately after the 103 // block boundary. Therefore, it may be deleted. 104 expected: [ 105 "<p>abc</p><br>", 106 "<p>abc</p><b><br></b>", 107 "<p>abc</p><b> <br></b>", 108 ], 109 }, 110 { 111 init: "<p>abc</p>def []g<p>hij</p>", 112 expected: [ 113 "<p>abc</p>def <br><p>hij</p>", 114 "<p>abc</p>def <p>hij</p>", 115 ], 116 }, 117 { 118 init: "<p>abc</p> []d<p>efg</p>", 119 // The white-space before "d" is invisible due to immediately after the 120 // block boundary. Therefore, it may be deleted. 121 expected: [ 122 "<p>abc</p><br><p>efg</p>", 123 "<p>abc</p> <br><p>efg</p>", 124 ], 125 }, 126 { 127 init: "<p>abc</p><b> []d</b><p>efg</p>", 128 // The white-space before "d" is invisible due to immediately after the 129 // block boundary. Therefore, it may be deleted. 130 expected: [ 131 "<p>abc</p><br><p>efg</p>", 132 "<p>abc</p><b><br></b><p>efg</p>", 133 "<p>abc</p><b> <br></b><p>efg</p>", 134 ], 135 }, 136 ]) { 137 promise_test(async () => { 138 utils.setupEditingHost(data.init); 139 await utils.sendDeleteKey(); 140 if (Array.isArray(data.expected)) { 141 assert_in_array(editingHost.innerHTML, data.expected); 142 } else { 143 assert_equals(editingHost.innerHTML, data.expected); 144 } 145 }, `Backspace when ${data.init}`); 146 promise_test(async () => { 147 utils.setupEditingHost(data.init); 148 getSelection().modify("extend", "right", "character"); 149 await utils.sendDeleteKey(); 150 if (Array.isArray(data.expected)) { 151 assert_in_array(editingHost.innerHTML, data.expected); 152 } else { 153 assert_equals(editingHost.innerHTML, data.expected); 154 } 155 }, `Delete when ${data.init} after extending selection forward`); 156 } 157 for (const data of [ 158 { 159 init: "<p> []abc</p>", 160 // The white-space before "abc" is invisible due to immediately after the 161 // block boundary. Therefore, it may be deleted. 162 expected: [ 163 "<p><br></p>", 164 "<p> <br></p>", 165 ], 166 }, 167 { 168 init: "<p>abc []def</p>", 169 expected: [ 170 "<p>abc <br></p>", 171 "<p>abc </p>", 172 ], 173 }, 174 { 175 init: "<p><b>abc []def</b></p>", 176 expected: [ 177 "<p><b>abc <br></b></p>", 178 "<p><b>abc </b></p>", 179 ], 180 }, 181 { 182 init: "<p>abc []def<br></p>", 183 expected: [ 184 "<p>abc <br></p>", 185 "<p>abc </p>", 186 ], 187 }, 188 { 189 init: " []abc<p>def</p>", 190 // The white-space before "abc" is invisible due to immediately after the 191 // block boundary. Therefore, it may be deleted. 192 expected: [ 193 "<br><p>def</p>", 194 " <br><p>def</p>", 195 ], 196 }, 197 { 198 init: "abc []def<p>ghi</p>", 199 expected: [ 200 "abc <br><p>ghi</p>", 201 "abc <p>ghi</p>", 202 ], 203 }, 204 { 205 init: "<b>abc []def</b><p>ghi</p>", 206 expected: [ 207 "<b>abc <br></b><p>ghi</p>", 208 "<b>abc </b><p>ghi</p>", 209 ], 210 }, 211 { 212 init: "<p>abc</p> []def", 213 // The white-space before "def" is invisible due to immediately after the 214 // block boundary. Therefore, it may be deleted. 215 expected: [ 216 "<p>abc</p><br>", 217 "<p>abc</p> <br>", 218 ], 219 }, 220 { 221 init: "<p>abc</p>def []ghi", 222 expected: [ 223 "<p>abc</p>def <br>", 224 "<p>abc</p>def ", 225 ], 226 }, 227 { 228 init: "<p>abc</p><b> []def</b>", 229 // The white-space before "def" is invisible due to immediately after the 230 // block boundary. Therefore, it may be deleted. 231 expected: [ 232 "<p>abc</p><br>", 233 "<p>abc</p><b><br></b>", 234 "<p>abc</p><b> <br></b>", 235 ], 236 }, 237 { 238 init: "<p>abc</p>def []ghi<p>jkl</p>", 239 expected: [ 240 "<p>abc</p>def <br><p>jkl</p>", 241 "<p>abc</p>def <p>jkl</p>", 242 ], 243 }, 244 { 245 init: "<p>abc</p> []def<p>ghi</p>", 246 // The white-space before "def" is invisible due to immediately after the 247 // block boundary. Therefore, it may be deleted. 248 expected: [ 249 "<p>abc</p><br><p>ghi</p>", 250 "<p>abc</p> <br><p>ghi</p>", 251 ], 252 }, 253 { 254 init: "<p>abc</p><b> []def</b><p>ghi</p>", 255 // The white-space before "def" is invisible due to immediately after the 256 // block boundary. Therefore, it may be deleted. 257 expected: [ 258 "<p>abc</p><br><p>ghi</p>", 259 "<p>abc</p><b><br></b><p>ghi</p>", 260 "<p>abc</p><b> <br></b><p>ghi</p>", 261 ], 262 }, 263 ]) { 264 promise_test(async () => { 265 utils.setupEditingHost(data.init); 266 await utils.sendDeleteKey(utils.deleteWordModifier); 267 if (Array.isArray(data.expected)) { 268 assert_in_array(editingHost.innerHTML, data.expected); 269 } else { 270 assert_equals(editingHost.innerHTML, data.expected); 271 } 272 }, `${ 273 utils.deleteWordModifier == utils.kControl ? "Ctrl" : "Alt" 274 }+Delete when "${data.init}"`); 275 } 276 }, {once: true}); 277 </script> 278 </head> 279 <body> 280 <div contenteditable></div> 281 </body> 282 </html>