join-different-white-space-style-left-paragraph-and-right-line.html (21424B)
1 <!doctype html> 2 <head> 3 <meta charset="utf-8"> 4 <meta name="timeout" content="long"> 5 <meta name="variant" content="?method=backspace&left-white-space=normal&right-white-space=pre"> 6 <meta name="variant" content="?method=backspace&left-white-space=normal&right-white-space=pre-wrap"> 7 <meta name="variant" content="?method=backspace&left-white-space=normal&right-white-space=pre-line"> 8 <meta name="variant" content="?method=backspace&left-white-space=normal&right-white-space=nowrap"> 9 <meta name="variant" content="?method=backspace&left-white-space=pre&right-white-space=normal"> 10 <meta name="variant" content="?method=backspace&left-white-space=pre&right-white-space=pre-wrap"> 11 <meta name="variant" content="?method=backspace&left-white-space=pre&right-white-space=pre-line"> 12 <meta name="variant" content="?method=backspace&left-white-space=pre&right-white-space=nowrap"> 13 <meta name="variant" content="?method=backspace&left-white-space=pre-wrap&right-white-space=normal"> 14 <meta name="variant" content="?method=backspace&left-white-space=pre-wrap&right-white-space=pre"> 15 <meta name="variant" content="?method=backspace&left-white-space=pre-wrap&right-white-space=pre-line"> 16 <meta name="variant" content="?method=backspace&left-white-space=pre-wrap&right-white-space=nowrap"> 17 <meta name="variant" content="?method=backspace&left-white-space=pre-line&right-white-space=normal"> 18 <meta name="variant" content="?method=backspace&left-white-space=pre-line&right-white-space=pre"> 19 <meta name="variant" content="?method=backspace&left-white-space=pre-line&right-white-space=pre-wrap"> 20 <meta name="variant" content="?method=backspace&left-white-space=pre-line&right-white-space=nowrap"> 21 <meta name="variant" content="?method=backspace&left-white-space=nowrap&right-white-space=normal"> 22 <meta name="variant" content="?method=backspace&left-white-space=nowrap&right-white-space=pre"> 23 <meta name="variant" content="?method=backspace&left-white-space=nowrap&right-white-space=pre-wrap"> 24 <meta name="variant" content="?method=backspace&left-white-space=nowrap&right-white-space=pre-line"> 25 26 <meta name="variant" content="?method=forwarddelete&left-white-space=normal&right-white-space=pre"> 27 <meta name="variant" content="?method=forwarddelete&left-white-space=normal&right-white-space=pre-wrap"> 28 <meta name="variant" content="?method=forwarddelete&left-white-space=normal&right-white-space=pre-line"> 29 <meta name="variant" content="?method=forwarddelete&left-white-space=normal&right-white-space=nowrap"> 30 <meta name="variant" content="?method=forwarddelete&left-white-space=pre&right-white-space=normal"> 31 <meta name="variant" content="?method=forwarddelete&left-white-space=pre&right-white-space=pre-wrap"> 32 <meta name="variant" content="?method=forwarddelete&left-white-space=pre&right-white-space=pre-line"> 33 <meta name="variant" content="?method=forwarddelete&left-white-space=pre&right-white-space=nowrap"> 34 <meta name="variant" content="?method=forwarddelete&left-white-space=pre-wrap&right-white-space=normal"> 35 <meta name="variant" content="?method=forwarddelete&left-white-space=pre-wrap&right-white-space=pre"> 36 <meta name="variant" content="?method=forwarddelete&left-white-space=pre-wrap&right-white-space=pre-line"> 37 <meta name="variant" content="?method=forwarddelete&left-white-space=pre-wrap&right-white-space=nowrap"> 38 <meta name="variant" content="?method=forwarddelete&left-white-space=pre-line&right-white-space=normal"> 39 <meta name="variant" content="?method=forwarddelete&left-white-space=pre-line&right-white-space=pre"> 40 <meta name="variant" content="?method=forwarddelete&left-white-space=pre-line&right-white-space=pre-wrap"> 41 <meta name="variant" content="?method=forwarddelete&left-white-space=pre-line&right-white-space=nowrap"> 42 <meta name="variant" content="?method=forwarddelete&left-white-space=nowrap&right-white-space=normal"> 43 <meta name="variant" content="?method=forwarddelete&left-white-space=nowrap&right-white-space=pre"> 44 <meta name="variant" content="?method=forwarddelete&left-white-space=nowrap&right-white-space=pre-wrap"> 45 <meta name="variant" content="?method=forwarddelete&left-white-space=nowrap&right-white-space=pre-line"> 46 47 <meta name="variant" content="?method=select-boundary&left-white-space=normal&right-white-space=pre"> 48 <meta name="variant" content="?method=select-boundary&left-white-space=normal&right-white-space=pre-wrap"> 49 <meta name="variant" content="?method=select-boundary&left-white-space=normal&right-white-space=pre-line"> 50 <meta name="variant" content="?method=select-boundary&left-white-space=normal&right-white-space=nowrap"> 51 <meta name="variant" content="?method=select-boundary&left-white-space=pre&right-white-space=normal"> 52 <meta name="variant" content="?method=select-boundary&left-white-space=pre&right-white-space=pre-wrap"> 53 <meta name="variant" content="?method=select-boundary&left-white-space=pre&right-white-space=pre-line"> 54 <meta name="variant" content="?method=select-boundary&left-white-space=pre&right-white-space=nowrap"> 55 <meta name="variant" content="?method=select-boundary&left-white-space=pre-wrap&right-white-space=normal"> 56 <meta name="variant" content="?method=select-boundary&left-white-space=pre-wrap&right-white-space=pre"> 57 <meta name="variant" content="?method=select-boundary&left-white-space=pre-wrap&right-white-space=pre-line"> 58 <meta name="variant" content="?method=select-boundary&left-white-space=pre-wrap&right-white-space=nowrap"> 59 <meta name="variant" content="?method=select-boundary&left-white-space=pre-line&right-white-space=normal"> 60 <meta name="variant" content="?method=select-boundary&left-white-space=pre-line&right-white-space=pre"> 61 <meta name="variant" content="?method=select-boundary&left-white-space=pre-line&right-white-space=pre-wrap"> 62 <meta name="variant" content="?method=select-boundary&left-white-space=pre-line&right-white-space=nowrap"> 63 <meta name="variant" content="?method=select-boundary&left-white-space=nowrap&right-white-space=normal"> 64 <meta name="variant" content="?method=select-boundary&left-white-space=nowrap&right-white-space=pre"> 65 <meta name="variant" content="?method=select-boundary&left-white-space=nowrap&right-white-space=pre-wrap"> 66 <meta name="variant" content="?method=select-boundary&left-white-space=nowrap&right-white-space=pre-line"> 67 <title>Tests for joining left paragraph and its following line</title> 68 <script src="/resources/testharness.js"></script> 69 <script src="/resources/testharnessreport.js"></script> 70 <script src="/resources/testdriver.js"></script> 71 <script src="/resources/testdriver-vendor.js"></script> 72 <script src="/resources/testdriver-actions.js"></script> 73 <script src="../include/editor-test-utils.js"></script> 74 <style> 75 .pre { 76 white-space: pre; 77 } 78 .preWrap { 79 white-space: pre-wrap; 80 } 81 .preLine { 82 white-space: pre-line; 83 } 84 .nowrap { 85 white-space: nowrap; 86 } 87 </style> 88 </head> 89 <body> 90 <div contenteditable></div> 91 <script> 92 "use strict"; 93 94 const searchParams = new URLSearchParams(document.location.search); 95 const testingBackspace = searchParams.get("method") == "backspace"; 96 const testingSelectBoundary = searchParams.get("method") == "select-boundary"; 97 const commandName = 98 testingBackspace || testingSelectBoundary ? "delete" : "forwarddelete"; 99 const editingHost = document.querySelector("div[contenteditable]"); 100 const caretInLeft = (() => { 101 if (testingSelectBoundary) { 102 return "["; 103 } 104 return testingBackspace ? "" : "[]"; 105 })(); 106 const caretInRight = (() => { 107 if (testingSelectBoundary) { 108 return "]"; 109 } 110 return testingBackspace ? "[]" : ""; 111 })(); 112 const leftWhiteSpace = `white-space:${searchParams.get("left-white-space")}`; 113 const rightWhiteSpace = `white-space:${searchParams.get("right-white-space")}`; 114 const leftWhiteSpacePreserveLineBreaks = 115 searchParams.get("left-white-space") == "pre" || 116 searchParams.get("left-white-space") == "pre-wrap" || 117 searchParams.get("left-white-space") == "pre-line"; 118 const rightWhiteSpacePreserveLineBreaks = 119 searchParams.get("right-white-space") == "pre" || 120 searchParams.get("right-white-space") == "pre-wrap" || 121 searchParams.get("right-white-space") == "pre-line"; 122 const leftWhiteSpaceIsNormal = 123 searchParams.get("left-white-space") == "normal"; 124 const rightWhiteSpaceIsNormal = 125 searchParams.get("right-white-space") == "normal"; 126 const leftWhiteSpaceClass = (() => { 127 switch (searchParams.get("left-white-space")) { 128 case "pre": 129 return "pre"; 130 case "pre-wrap": 131 return "preWrap"; 132 case "pre-line": 133 return "preLine"; 134 case "nowrap": 135 return "nowrap"; 136 default: 137 return null; 138 } 139 })(); 140 const rightWhiteSpaceClass = (() => { 141 switch (searchParams.get("right-white-space")) { 142 case "pre": 143 return "pre"; 144 case "pre-wrap": 145 return "preWrap"; 146 case "pre-line": 147 return "preLine"; 148 case "nowrap": 149 return "nowrap"; 150 default: 151 return null; 152 } 153 })(); 154 const utils = new EditorTestUtils(editingHost); 155 156 const tests = [ 157 // The cases that the following line is a child of parent block whose 158 // white-space is normal. 159 { 160 initialHTML: 161 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 162 `${caretInRight}def`, 163 expectedHTML: aAttrsInLeftBlock => { 164 return [ 165 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}>def</span></div>`, 166 ]; 167 }, 168 skip: !rightWhiteSpaceIsNormal, 169 }, 170 { 171 initialHTML: 172 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 173 `${caretInRight}def<br>ghi`, 174 expectedHTML: aAttrsInLeftBlock => { 175 return [ 176 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}>def</span></div>` + 177 "ghi", 178 ]; 179 }, 180 skip: !rightWhiteSpaceIsNormal, 181 }, 182 { 183 initialHTML: 184 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 185 `${caretInRight}def<div>ghi</div>`, 186 expectedHTML: aAttrsInLeftBlock => { 187 return [ 188 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}>def</span></div>` + 189 "<div>ghi</div>", 190 ]; 191 }, 192 skip: !rightWhiteSpaceIsNormal, 193 }, 194 { 195 initialHTML: 196 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 197 `<b>${caretInRight}def</b>`, 198 expectedHTML: aAttrsInLeftBlock => { 199 return [ 200 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>`, 201 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>`, 202 ]; 203 }, 204 skip: !rightWhiteSpaceIsNormal, 205 }, 206 { 207 initialHTML: 208 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 209 `<b>${caretInRight}def<br>ghi</b>`, 210 expectedHTML: aAttrsInLeftBlock => { 211 return [ 212 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 213 "<b>ghi</b>", 214 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 215 "<b>ghi</b>", 216 ]; 217 }, 218 skip: !rightWhiteSpaceIsNormal, 219 }, 220 { 221 initialHTML: 222 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 223 `<b>${caretInRight}def</b><br>ghi`, 224 expectedHTML: aAttrsInLeftBlock => { 225 return [ 226 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 227 "ghi", 228 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 229 "ghi", 230 ]; 231 }, 232 skip: !rightWhiteSpaceIsNormal, 233 }, 234 { 235 initialHTML: 236 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 237 `<b>${caretInRight}def<br></b>ghi`, 238 expectedHTML: aAttrsInLeftBlock => { 239 return [ 240 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 241 "ghi", 242 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 243 "ghi", 244 ]; 245 }, 246 skip: !rightWhiteSpaceIsNormal, 247 }, 248 249 // The cases that the following line is a child of block element and has 250 // different white-space with <span>. 251 { 252 initialHTML: 253 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 254 `<span style="${rightWhiteSpace}">${caretInRight}def</span>`, 255 expectedHTML: aAttrsInLeftBlock => { 256 return [ 257 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}>def</span></div>`, 258 ]; 259 }, 260 skip: rightWhiteSpaceIsNormal, 261 }, 262 { 263 initialHTML: 264 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 265 `<span style="${rightWhiteSpace}">${caretInRight}def\nghi</span>`, 266 expectedHTML: aAttrsInLeftBlock => { 267 return [ 268 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}>def</span></div>` + 269 `<span style="${rightWhiteSpace}">ghi</span>`, 270 ]; 271 }, 272 skip: !rightWhiteSpacePreserveLineBreaks || rightWhiteSpaceIsNormal, 273 }, 274 { 275 initialHTML: 276 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 277 `<span style="${rightWhiteSpace}">${caretInRight}def<br>ghi</span>`, 278 expectedHTML: aAttrsInLeftBlock => { 279 return [ 280 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}>def</span></div>` + 281 `<span style="${rightWhiteSpace}">ghi</span>`, 282 ]; 283 }, 284 skip: rightWhiteSpaceIsNormal, 285 }, 286 { 287 initialHTML: 288 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 289 `<span style="${rightWhiteSpace}"><b>${caretInRight}def\nghi</b></span>`, 290 expectedHTML: aAttrsInLeftBlock => { 291 return [ 292 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 293 `<span style="${rightWhiteSpace}"><b>ghi</b></span>`, 294 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 295 `<span style="${rightWhiteSpace}"><b>ghi</b></span>`, 296 ]; 297 }, 298 skip: !rightWhiteSpacePreserveLineBreaks || rightWhiteSpaceIsNormal, 299 }, 300 { 301 initialHTML: 302 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 303 `<span style="${rightWhiteSpace}"><b>${caretInRight}def<br>ghi</b></span>`, 304 expectedHTML: aAttrsInLeftBlock => { 305 return [ 306 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 307 `<span style="${rightWhiteSpace}"><b>ghi</b></span>`, 308 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 309 `<span style="${rightWhiteSpace}"><b>ghi</b></span>`, 310 ]; 311 }, 312 skip: rightWhiteSpaceIsNormal, 313 }, 314 { 315 initialHTML: 316 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 317 `<span style="${rightWhiteSpace}"><b>${caretInRight}def</b>\nghi</span>`, 318 expectedHTML: aAttrsInLeftBlock => { 319 return [ 320 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 321 `<span style="${rightWhiteSpace}">ghi</span>`, 322 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 323 `<span style="${rightWhiteSpace}">ghi</span>`, 324 ]; 325 }, 326 skip: !rightWhiteSpacePreserveLineBreaks || rightWhiteSpaceIsNormal, 327 }, 328 { 329 initialHTML: 330 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 331 `<span style="${rightWhiteSpace}"><b>${caretInRight}def</b><br>ghi</span>`, 332 expectedHTML: aAttrsInLeftBlock => { 333 return [ 334 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 335 `<span style="${rightWhiteSpace}">ghi</span>`, 336 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 337 `<span style="${rightWhiteSpace}">ghi</span>`, 338 ]; 339 }, 340 skip: rightWhiteSpaceIsNormal, 341 }, 342 { 343 initialHTML: 344 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 345 `<span style="${rightWhiteSpace}"><b>${caretInRight}def\n</b>ghi</span>`, 346 expectedHTML: aAttrsInLeftBlock => { 347 return [ 348 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 349 `<span style="${rightWhiteSpace}">ghi</span>`, 350 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 351 `<span style="${rightWhiteSpace}">ghi</span>`, 352 ]; 353 }, 354 skip: !rightWhiteSpacePreserveLineBreaks || rightWhiteSpaceIsNormal, 355 }, 356 { 357 initialHTML: 358 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 359 `<span style="${rightWhiteSpace}"><b>${caretInRight}def<br></b>ghi</span>`, 360 expectedHTML: aAttrsInLeftBlock => { 361 return [ 362 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 363 `<span style="${rightWhiteSpace}">ghi</span>`, 364 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 365 `<span style="${rightWhiteSpace}">ghi</span>`, 366 ]; 367 }, 368 skip: rightWhiteSpaceIsNormal, 369 }, 370 { 371 initialHTML: 372 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 373 `<span style="${rightWhiteSpace}"><b>${caretInRight}def\nghi</b>jkl</span>`, 374 expectedHTML: aAttrsInLeftBlock => { 375 return [ 376 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 377 `<span style="${rightWhiteSpace}"><b>ghi</b>jkl</span>`, 378 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 379 `<span style="${rightWhiteSpace}"><b>ghi</b>jkl</span>`, 380 ]; 381 }, 382 skip: !rightWhiteSpacePreserveLineBreaks || rightWhiteSpaceIsNormal, 383 }, 384 { 385 initialHTML: 386 `<div style="${leftWhiteSpace}">abc${caretInLeft}</div>` + 387 `<span style="${rightWhiteSpace}"><b>${caretInRight}def<br>ghi</b>jkl</span>`, 388 expectedHTML: aAttrsInLeftBlock => { 389 return [ 390 `<div style="${leftWhiteSpace}">abc<b ${aAttrsInLeftBlock}>def</b></div>` + 391 `<span style="${rightWhiteSpace}"><b>ghi</b>jkl</span>`, 392 `<div style="${leftWhiteSpace}">abc<span ${aAttrsInLeftBlock}><b>def</b></span></div>` + 393 `<span style="${rightWhiteSpace}"><b>ghi</b>jkl</span>`, 394 ]; 395 }, 396 skip: rightWhiteSpaceIsNormal, 397 }, 398 ]; 399 400 const rightStyleAttr = new RegExp(`style="${rightWhiteSpace}"`, "g"); 401 const leftStyleAttr = new RegExp(`style="${leftWhiteSpace}"`, "g"); 402 const rightStyledSpan = new RegExp(`</div><span style="${rightWhiteSpace}">`, "g"); 403 for (const t of tests) { 404 if (t.skip) { 405 continue; 406 } 407 promise_test(async () => { 408 utils.setupEditingHost(t.initialHTML); 409 await (testingBackspace ? utils.sendBackspaceKey() : utils.sendDeleteKey()); 410 utils.normalizeStyleAttributeValues(); 411 assert_in_array( 412 editingHost.innerHTML, 413 t.expectedHTML(`style="${rightWhiteSpace}"`), 414 "white-space should be preserved by <span> elements" 415 ); 416 }, `${commandName} at ${t.initialHTML.replace(/\n/g, "\\n")}`); 417 418 if (rightWhiteSpaceClass !== null) { 419 // Replace style attribute with class attribute. 420 const initialHTMLWithClass = 421 t.initialHTML.replace( 422 rightStyleAttr, 423 `class="${rightWhiteSpaceClass}"` 424 ); 425 if (initialHTMLWithClass != t.initialHTML) { 426 promise_test(async () => { 427 utils.setupEditingHost(initialHTMLWithClass); 428 await (testingBackspace ? utils.sendBackspaceKey() : utils.sendDeleteKey()); 429 utils.normalizeStyleAttributeValues(); 430 const expectedHTMLs = []; 431 for (const styleAndOrClassAttr of [ 432 `style="${rightWhiteSpace}"`, 433 `class="${rightWhiteSpaceClass}" style="${rightWhiteSpace}"`, 434 `style="${rightWhiteSpace}" class="${rightWhiteSpaceClass}"`, 435 ]) { 436 for (const origExpectedHTML of t.expectedHTML(styleAndOrClassAttr)) { 437 expectedHTMLs.push( 438 origExpectedHTML.replace( 439 rightStyledSpan, 440 `</div><span class="${rightWhiteSpaceClass}">` 441 ) 442 ); 443 } 444 } 445 assert_in_array( 446 editingHost.innerHTML, 447 expectedHTMLs, 448 "white-space should be preserved by <span> elements with class or style attribute" 449 ); 450 }, `${commandName} at ${initialHTMLWithClass.replace(/\n/g, "\\n")}`); 451 } 452 } 453 454 if (leftWhiteSpaceClass !== null) { 455 // Replace style attribute with class attribute. 456 const initialHTMLWithClass = 457 t.initialHTML.replace( 458 leftStyleAttr, 459 `class="${leftWhiteSpaceClass}"` 460 ); 461 if (initialHTMLWithClass != t.initialHTML) { 462 promise_test(async () => { 463 utils.setupEditingHost(initialHTMLWithClass); 464 await (testingBackspace ? utils.sendBackspaceKey() : utils.sendDeleteKey()); 465 utils.normalizeStyleAttributeValues(); 466 const expectedHTMLs = []; 467 for (const styleAndOrClassAttr of [ 468 `style="${rightWhiteSpace}"`, 469 `class="${rightWhiteSpaceClass}" style="${rightWhiteSpace}"`, 470 `style="${rightWhiteSpace}" class="${rightWhiteSpaceClass}"`, 471 ]) { 472 for (const origExpectedHTML of t.expectedHTML(styleAndOrClassAttr)) { 473 expectedHTMLs.push( 474 origExpectedHTML.replace( 475 leftStyleAttr, 476 `class="${leftWhiteSpaceClass}"` 477 ) 478 ); 479 } 480 } 481 assert_in_array( 482 editingHost.innerHTML, 483 expectedHTMLs, 484 "white-space should be preserved by <span> elements with class or style attribute" 485 ); 486 }, `${commandName} at ${initialHTMLWithClass.replace(/\n/g, "\\n")}`); 487 } 488 } 489 } 490 491 </script> 492 </body> 493 </html>