forwarddelete.tentative.html (33955B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset=utf-8> 5 <meta name="flags" content="may"> 6 <title>Testing normalizing white space sequence after execCommand("forward", false, "")</title> 7 <script src=../../include/implementation.js></script> 8 <script>var testsJsLibraryOnly = true</script> 9 <script src="../../include/tests.js"></script> 10 <script src="/resources/testharness.js"></script> 11 <script src="/resources/testharnessreport.js"></script> 12 </head> 13 <body> 14 <script> 15 "use strict"; 16 17 setup({explicit_done: true}); 18 19 function runTests() { 20 // README: 21 // These tests based on the behavior of Chrome 83. This test does NOT define 22 // nor suggest any standard behavior (actually, some expected results might 23 // look odd), but this test must help you to understand how other browsers 24 // use different logic to normalize white-space sequence. 25 26 document.body.innerHTML = "<div contenteditable></div>"; 27 let editor = document.querySelector("div[contenteditable]"); 28 editor.focus(); 29 let selection = document.getSelection(); 30 31 function toPlaintext(str) { 32 return str.replace(/ /g, "\u00A0"); 33 } 34 function escape(str) { 35 return str.replace(/\u00A0/ig, " "); 36 } 37 38 // Test simple removing in a text node. 39 // - initialText: Set to data of text node (only entity is handled) 40 // - expectedText: Set to data of the text node after `execCommand("forward")` 41 // - whiteSpaceRange: Set first item to start offset of whitespace sequence, 42 // set second item to number of white spaces. 43 for (const currentTest of [ 44 { initialText: "a ", expectedText: "a", whiteSpaceRange: [1, 1] }, 45 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 2] }, 46 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 2] }, 47 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 3] }, 48 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 3] }, 49 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 3] }, 50 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 4] }, 51 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 4] }, 52 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 4] }, 53 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 4] }, 54 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 5] }, 55 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 5] }, 56 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 5] }, 57 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 5] }, 58 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 5] }, 59 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 10] }, 60 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 10] }, 61 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 10] }, 62 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 11] }, 63 { initialText: "a ", expectedText: "a ", whiteSpaceRange: [1, 11] }, 64 { initialText: "a b", expectedText: "ab", whiteSpaceRange: [1, 1] }, 65 { initialText: "a b", expectedText: "ab", whiteSpaceRange: [1, 1] }, 66 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 2] }, 67 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 2] }, 68 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 2] }, 69 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 3] }, 70 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 3] }, 71 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 3] }, 72 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 3] }, 73 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 4] }, 74 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 4] }, 75 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 4] }, 76 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 4] }, 77 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 4] }, 78 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 5] }, 79 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 5] }, 80 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 5] }, 81 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 5] }, 82 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 5] }, 83 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 5] }, 84 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 5] }, 85 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 5] }, 86 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 10] }, 87 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 10] }, 88 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 10] }, 89 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 11] }, 90 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 11] }, 91 { initialText: "a b", expectedText: "a b", whiteSpaceRange: [1, 11] }, 92 { initialText: " b", expectedText: "b", whiteSpaceRange: [0, 1] }, 93 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 2] }, 94 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 2] }, 95 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 3] }, 96 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 3] }, 97 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 3] }, 98 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 4] }, 99 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 4] }, 100 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 4] }, 101 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 4] }, 102 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 4] }, 103 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 5] }, 104 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 5] }, 105 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 5] }, 106 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 5] }, 107 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 5] }, 108 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 10] }, 109 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 10] }, 110 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 10] }, 111 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 11] }, 112 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 11] }, 113 { initialText: " b", expectedText: " b", whiteSpaceRange: [0, 11] }, 114 { initialText: " ", expectedText: "", whiteSpaceRange: [0, 1] }, 115 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 2] }, 116 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 3] }, 117 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 3] }, 118 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 4] }, 119 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 4] }, 120 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 4] }, 121 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 5] }, 122 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 5] }, 123 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 5] }, 124 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 5] }, 125 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 5] }, 126 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 10] }, 127 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 10] }, 128 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 10] }, 129 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 11] }, 130 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 11] }, 131 { initialText: " ", expectedText: " ", whiteSpaceRange: [0, 11] }, 132 ]) { 133 for (let i = currentTest.whiteSpaceRange[0]; i < currentTest.whiteSpaceRange[0] + currentTest.whiteSpaceRange[1]; i++) { 134 currentTest.getInitialText = function (aCaretPos) { 135 return escape(`${toPlaintext(this.initialText).slice(0, aCaretPos)}[]${toPlaintext(this.initialText).slice(aCaretPos)}`); 136 } 137 test(function () { 138 editor.innerHTML = ""; 139 editor.appendChild(document.createTextNode(toPlaintext(currentTest.initialText))); 140 selection.collapse(editor.firstChild, i); 141 document.execCommand("forwarddelete", false, ""); 142 if (currentTest.expectedText.length) { 143 assert_equals(escape(editor.childNodes.item(0).data), currentTest.expectedText, "Modified text is wrong"); 144 assert_equals(selection.focusNode, editor.childNodes.item(0), "Selection focus node is wrong"); 145 assert_equals(selection.focusOffset, i, "Selection focus offset is wrong"); 146 assert_equals(selection.anchorNode, editor.childNodes.item(0), "Selection anchor node is wrong"); 147 assert_equals(selection.anchorOffset, i, "Selection anchor offset is wrong"); 148 } else { 149 assert_equals(escape(editor.textContent), "", "Modified text is wrong"); 150 assert_equals(selection.focusNode, editor, "Selection focus node is wrong"); 151 assert_equals(selection.focusOffset, 0, "Selection focus offset is wrong"); 152 assert_equals(selection.anchorNode, editor, "Selection anchor node is wrong"); 153 assert_equals(selection.anchorOffset, 0, "Selection anchor offset is wrong"); 154 } 155 }, `execCommand("forwarddelete", false, ""): "${currentTest.getInitialText(i)}" (length of whitespace sequence: ${currentTest.whiteSpaceRange[1]})`); 156 } 157 } 158 159 // Test white space sequence split to multiple text node. 160 // - initialText: Set to data of text nodes. This must have "|" at least one. 161 // Then, the text will be split at every "|". 162 // Same as above test, only is handled at setting. 163 // "[]" means that caret position. 164 // - expectedText: Set to data of all text nodes as an array. 165 // Same as above test, only is handled before comparing. 166 for (const currentTest of [ 167 { initialText: "a [] | b", expectedText: ["a []", " b"] }, 168 { initialText: "a [] | b", expectedText: ["a []", " b"] }, 169 { initialText: "a []| b", expectedText: ["a []", " b"] }, 170 { initialText: "a []| b", expectedText: ["a []", " b"] }, 171 { initialText: "a |[] b", expectedText: ["a []", " b"] }, 172 { initialText: "a |[] b", expectedText: ["a []", " b"] }, 173 { initialText: "a | [] b", expectedText: ["a ", " [] b"] }, 174 { initialText: "a |[] b", expectedText: ["a []", " b"] }, 175 { initialText: "a []| b", expectedText: ["a []", " b"] }, 176 { initialText: "a [] | b", expectedText: ["a []", " b"] }, 177 178 { initialText: "a [] | b", expectedText: ["a [] ", " b"] }, 179 { initialText: "a [] | b", expectedText: ["a []", " b"] }, 180 { initialText: "a []| b", expectedText: ["a []", " b"] }, 181 { initialText: "a []b | c", expectedText: ["a [] ", " c"] }, 182 { initialText: "a []b | c", expectedText: ["a [] ", " c"] }, 183 { initialText: "a []b| c", expectedText: ["a []", " c"] }, 184 { initialText: "a []|b c", expectedText: ["a []", " c"] }, 185 { initialText: "a |[]b c", expectedText: ["a []", " c"] }, 186 { initialText: "a [] |b c", expectedText: ["a []", "b c"] }, 187 { initialText: "a | []b c", expectedText: ["a ", " [] c"] }, 188 189 { initialText: "a | |[] c", expectedText: ["a ", " []", " c"] }, 190 { initialText: "a | |[] c", expectedText: ["a ", " []", " c"] }, 191 { initialText: "a | []| c", expectedText: ["a ", " []", " c"] }, 192 { initialText: "a |[] | c", expectedText: ["a []", " c"] }, 193 { initialText: "a []| | c", expectedText: ["a []", " c"] }, 194 { initialText: "a [] | | c", expectedText: ["a []", " ", " c"] }, 195 { initialText: "a [] | | c", expectedText: ["a [] ", " ", " c"] }, 196 { initialText: "a [] | | c", expectedText: ["a [] ", " ", " c"] }, 197 { initialText: "a || [] c", expectedText: ["a ", "", " [] c"] }, 198 { initialText: "a ||[] c", expectedText: ["a []", " c"] }, 199 { initialText: "a |[]| c", expectedText: ["a []", " c"] }, 200 { initialText: "a []|| c", expectedText: ["a []", " c"] }, 201 { initialText: "a [] || c", expectedText: ["a []", " c"] }, 202 { initialText: "a [] || c", expectedText: ["a [] ", "", " c"] }, 203 ]) { 204 test(function () { 205 editor.innerHTML = ""; 206 let caret = { container: null, offset: -1 }; 207 for (let text of toPlaintext(currentTest.initialText).split("|")) { 208 let caretOffset = text.indexOf("[]"); 209 if (caretOffset >= 0) { 210 text = text.slice(0, caretOffset) + text.slice(caretOffset + 2); 211 } 212 let textNode = document.createTextNode(text); 213 editor.appendChild(textNode); 214 if (caretOffset >= 0) { 215 caret = { container: textNode, offset: caretOffset }; 216 } 217 } 218 selection.collapse(caret.container, caret.offset); 219 document.execCommand("forwarddelete", false, ""); 220 let child = editor.firstChild; 221 for (let expectedText of currentTest.expectedText) { 222 expectedText = toPlaintext(expectedText); 223 let caretOffset = expectedText.indexOf("[]"); 224 if (caretOffset >= 0) { 225 expectedText = expectedText.slice(0, caretOffset) + expectedText.slice(caretOffset + 2); 226 } 227 if (!child || child.nodeName !== "#text") { 228 assert_equals("", escape(expectedText), "Expected text node is not there"); 229 if (caretOffset >= 0) { 230 assert_equals(-1, caretOffset, "Selection should be contained in this node"); 231 } 232 } else { 233 assert_equals(escape(child.data), escape(expectedText), "Modified text is wrong"); 234 if (caretOffset >= 0) { 235 assert_equals(selection.focusNode, child, "Selection focus node is wrong"); 236 assert_equals(selection.focusOffset, caretOffset, "Selection focus offset is wrong"); 237 assert_equals(selection.anchorNode, child, "Selection anchor node is wrong"); 238 assert_equals(selection.anchorOffset, caretOffset, "Selection anchor offset is wrong"); 239 } 240 } 241 child = child.nextSibling; 242 } 243 if (child && child.nodeName === "#text") { 244 assert_equals(escape(child.data), "", "Unexpected text node is there"); 245 } 246 }, `execCommand("forwarddelete", false, ""): "${currentTest.initialText}"`); 247 } 248 249 // Test white spaces around inline element boundary 250 // - initialHTML: Set to innerHTML of the <div> ("[{" and "]}" set selection to the range) 251 // - expectedText: Set to innerHTML of the <div> after `execCommand("delete")` 252 for (const currentTest of [ 253 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc<span> def</span></span>" }, 254 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc<span> def</span></span>" }, 255 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc<span> def</span></span>" }, 256 { initialHTML: "<span>abc []<span> def</span></span>", expectedHTML: "<span>abc <span>def</span></span>" }, 257 { initialHTML: "<span>abc []<span> def</span></span>", expectedHTML: "<span>abc <span>def</span></span>" }, 258 { initialHTML: "<span>abc []<span> def</span></span>", expectedHTML: "<span>abc <span>def</span></span>" }, 259 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc<span> def</span></span>" }, 260 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc<span> def</span></span>" }, 261 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 262 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 263 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 264 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 265 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 266 { initialHTML: "<span>abc[] <span> def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 267 { initialHTML: "<span>abc []<span> def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 268 { initialHTML: "<span>abc <span>[] def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 269 { initialHTML: "<span>abc []<span> def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 270 { initialHTML: "<span>abc <span>[] def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 271 { initialHTML: "<span>abc []<span> def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 272 { initialHTML: "<span>abc <span>[] def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 273 { initialHTML: "<span>abc <span> [] def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 274 { initialHTML: "<span>abc <span> [] def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 275 { initialHTML: "<span>abc <span> [] def</span></span>", expectedHTML: "<span>abc <span> def</span></span>" }, 276 277 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc</span> def</span>" }, 278 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc</span> def</span>" }, 279 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc</span> def</span>" }, 280 { initialHTML: "<span><span>abc []</span> def</span>", expectedHTML: "<span><span>abc </span>def</span>" }, 281 { initialHTML: "<span><span>abc []</span> def</span>", expectedHTML: "<span><span>abc </span>def</span>" }, 282 { initialHTML: "<span><span>abc []</span> def</span>", expectedHTML: "<span><span>abc </span>def</span>" }, 283 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc</span> def</span>" }, 284 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc</span> def</span>" }, 285 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 286 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 287 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 288 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 289 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 290 { initialHTML: "<span><span>abc[] </span> def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 291 { initialHTML: "<span><span>abc []</span> def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 292 { initialHTML: "<span><span>abc </span>[] def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 293 { initialHTML: "<span><span>abc []</span> def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 294 { initialHTML: "<span><span>abc </span>[] def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 295 { initialHTML: "<span><span>abc []</span> def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 296 { initialHTML: "<span><span>abc </span>[] def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 297 { initialHTML: "<span><span>abc </span> [] def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 298 { initialHTML: "<span><span>abc </span> [] def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 299 { initialHTML: "<span><span>abc </span> [] def</span>", expectedHTML: "<span><span>abc </span> def</span>" }, 300 301 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc</span><span> def</span>" }, 302 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc</span><span> def</span>" }, 303 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc</span><span> def</span>" }, 304 { initialHTML: "<span>abc []</span><span> def</span>", expectedHTML: "<span>abc </span><span>def</span>" }, 305 { initialHTML: "<span>abc []</span><span> def</span>", expectedHTML: "<span>abc </span><span>def</span>" }, 306 { initialHTML: "<span>abc []</span><span> def</span>", expectedHTML: "<span>abc </span><span>def</span>" }, 307 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc</span><span> def</span>" }, 308 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc</span><span> def</span>" }, 309 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 310 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 311 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 312 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 313 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 314 { initialHTML: "<span>abc[] </span><span> def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 315 { initialHTML: "<span>abc []</span><span> def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 316 { initialHTML: "<span>abc </span><span>[] def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 317 { initialHTML: "<span>abc []</span><span> def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 318 { initialHTML: "<span>abc </span><span>[] def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 319 { initialHTML: "<span>abc []</span><span> def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 320 { initialHTML: "<span>abc </span><span>[] def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 321 { initialHTML: "<span>abc </span><span> [] def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 322 { initialHTML: "<span>abc </span><span> [] def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 323 { initialHTML: "<span>abc </span><span> [] def</span>", expectedHTML: "<span>abc </span><span> def</span>" }, 324 325 { initialHTML: "a[]<span style=white-space:pre;>b </span>c", expectedHTML: "a<span style=\"white-space:pre;\"> </span>c" }, 326 { initialHTML: "a<span style=white-space:pre;>b[] </span>c", expectedHTML: "a<span style=\"white-space:pre;\">b </span>c" }, 327 { initialHTML: "a<span style=white-space:pre;>b [] </span>c", expectedHTML: "a<span style=\"white-space:pre;\">b </span>c" }, 328 { initialHTML: "a<span style=white-space:pre;>b [] </span>c", expectedHTML: "a<span style=\"white-space:pre;\">b </span>c" }, 329 { initialHTML: "a<span style=white-space:pre;>b []</span>c", expectedHTML: "a<span style=\"white-space:pre;\">b </span>" }, 330 { initialHTML: "a<span style=white-space:pre;>b [] </span>", expectedHTML: "a<span style=\"white-space:pre;\">b </span>" }, 331 { initialHTML: "a[]<span style=white-space:pre;> </span>b", expectedHTML: "ab" }, 332 { initialHTML: "a []<span style=white-space:pre;> </span>", expectedHTML: "a <span style=\"white-space:pre;\"> </span>" }, 333 { initialHTML: "a [] <span style=white-space:pre;> </span>", expectedHTML: "a <span style=\"white-space:pre;\"> </span>" }, 334 { initialHTML: "a [] <span style=white-space:pre;> </span>", expectedHTML: "a <span style=\"white-space:pre;\"> </span>" }, 335 { initialHTML: "a [] <span style=white-space:pre;>b </span>", expectedHTML: "a <span style=\"white-space:pre;\">b </span>" }, 336 { initialHTML: "a [] <span style=white-space:pre;> </span>", expectedHTML: "a <span style=\"white-space:pre;\"> </span>" }, 337 { initialHTML: "a [] <span style=white-space:pre;> </span>", expectedHTML: "a <span style=\"white-space:pre;\"> </span>" }, 338 { initialHTML: "a [] <span style=white-space:pre;>b </span>", expectedHTML: "a <span style=\"white-space:pre;\">b </span>" }, 339 { initialHTML: "<span style=white-space:pre;> [] </span> a", expectedHTML: "<span style=\"white-space:pre;\"> </span> a" }, 340 { initialHTML: "<span style=white-space:pre;> [] </span> a", expectedHTML: "<span style=\"white-space:pre;\"> </span> a" }, 341 { initialHTML: "<span style=white-space:pre;> []</span> a", expectedHTML: "<span style=\"white-space:pre;\"> </span> a" }, 342 { initialHTML: "<span style=white-space:pre;> </span>[] a", expectedHTML: "<span style=\"white-space:pre;\"> </span> a" }, 343 ]) { 344 test(function () { 345 let points = setupDiv(editor, currentTest.initialHTML); 346 selection.setBaseAndExtent(points[0], points[1], points[2], points[3]); 347 document.execCommand("forwarddelete", false, ""); 348 assert_equals(editor.innerHTML, currentTest.expectedHTML); 349 }, `execCommand("forwarddelete", false, ""): "${currentTest.initialHTML}"`); 350 } 351 352 done(); 353 } 354 355 window.addEventListener("load", runTests, {once: true}); 356 </script> 357 </body> 358 </html>