join-different-white-space-style-left-line-and-right-paragraph.html (35409B)
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 first line of right paragraph with its preceding 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 preceding line is a child of parent block whose 158 // white-space is normal. 159 { 160 initialHTML: 161 `abc${caretInLeft}` + 162 `<div style="${rightWhiteSpace}">${caretInRight}def\nghi</div>`, 163 expectedHTML: aAttrsInLeftBlock => { 164 return [ 165 `abc<span ${aAttrsInLeftBlock}>def</span>` + 166 `<div style="${rightWhiteSpace}">ghi</div>`, 167 ]; 168 }, 169 skip: !rightWhiteSpacePreserveLineBreaks || !leftWhiteSpaceIsNormal, 170 }, 171 { 172 initialHTML: 173 `abc${caretInLeft}` + 174 `<div style="${rightWhiteSpace}">${caretInRight}def<br>ghi</div>`, 175 expectedHTML: aAttrsInLeftBlock => { 176 if (rightWhiteSpaceIsNormal) { 177 return [ 178 "abcdef" + 179 `<div style="${rightWhiteSpace}">ghi</div>`, 180 ]; 181 } 182 return [ 183 `abc<span ${aAttrsInLeftBlock}>def</span>` + 184 `<div style="${rightWhiteSpace}">ghi</div>`, 185 ]; 186 }, 187 skip: !leftWhiteSpaceIsNormal, 188 }, 189 { 190 initialHTML: 191 `abc${caretInLeft}` + 192 `<div style="${rightWhiteSpace}"><b>${caretInRight}def\nghi</b></div>`, 193 expectedHTML: aAttrsInLeftBlock => { 194 return [ 195 `abc<b ${aAttrsInLeftBlock}>def</b>` + 196 `<div style="${rightWhiteSpace}"><b>ghi</b></div>`, 197 `abc<span ${aAttrsInLeftBlock}><b>def</b></span>` + 198 `<div style="${rightWhiteSpace}"><b>ghi</b></div>`, 199 ]; 200 }, 201 skip: !rightWhiteSpacePreserveLineBreaks || !leftWhiteSpaceIsNormal, 202 }, 203 { 204 initialHTML: 205 `abc${caretInLeft}` + 206 `<div style="${rightWhiteSpace}"><b>${caretInRight}def<br>ghi</b></div>`, 207 expectedHTML: aAttrsInLeftBlock => { 208 if (rightWhiteSpaceIsNormal) { 209 return [ 210 "abcdef" + 211 `<div style="${rightWhiteSpace}"><b>ghi</b></div>`, 212 ]; 213 } 214 return [ 215 `abc<b ${aAttrsInLeftBlock}>def</b>` + 216 `<div style="${rightWhiteSpace}"><b>ghi</b></div>`, 217 `abc<span ${aAttrsInLeftBlock}><b>def</b></span>` + 218 `<div style="${rightWhiteSpace}"><b>ghi</b></div>`, 219 ]; 220 }, 221 skip: !leftWhiteSpaceIsNormal, 222 }, 223 { 224 initialHTML: 225 `abc${caretInLeft}` + 226 `<div style="${rightWhiteSpace}"><b>${caretInRight}def</b>ghi\njkl</div>`, 227 expectedHTML: aAttrsInLeftBlock => { 228 return [ 229 `abc<b ${aAttrsInLeftBlock}>def</b><span ${aAttrsInLeftBlock}>ghi</span>` + 230 `<div style="${rightWhiteSpace}">jkl</div>`, 231 `abc<span ${aAttrsInLeftBlock}><b>def</b>ghi</span>` + 232 `<div style="${rightWhiteSpace}">jkl</div>`, 233 ]; 234 }, 235 skip: !rightWhiteSpacePreserveLineBreaks || !leftWhiteSpaceIsNormal, 236 }, 237 { 238 initialHTML: 239 `abc${caretInLeft}` + 240 `<div style="${rightWhiteSpace}"><b>${caretInRight}def</b>ghi<br>jkl</div>`, 241 expectedHTML: aAttrsInLeftBlock => { 242 if (rightWhiteSpaceIsNormal) { 243 return [ 244 "abc<b>def</b>ghi" + 245 `<div style="${rightWhiteSpace}">jkl</div>`, 246 ]; 247 } 248 return [ 249 `abc<b ${aAttrsInLeftBlock}>def</b><span ${aAttrsInLeftBlock}>ghi</span>` + 250 `<div style="${rightWhiteSpace}">jkl</div>`, 251 `abc<span ${aAttrsInLeftBlock}><b>def</b>ghi</span>` + 252 `<div style="${rightWhiteSpace}">jkl</div>`, 253 ]; 254 }, 255 skip: !leftWhiteSpaceIsNormal, 256 }, 257 { 258 initialHTML: 259 `abc${caretInLeft}` + 260 `<div style="${rightWhiteSpace}"><b>${caretInRight}def</b>\nghi</div>`, 261 expectedHTML: aAttrsInLeftBlock => { 262 return [ 263 `abc<b ${aAttrsInLeftBlock}>def</b>` + 264 `<div style="${rightWhiteSpace}">ghi</div>`, 265 `abc<span ${aAttrsInLeftBlock}><b>def</b></span>` + 266 `<div style="${rightWhiteSpace}">ghi</div>`, 267 ]; 268 }, 269 skip: !rightWhiteSpacePreserveLineBreaks || !leftWhiteSpaceIsNormal, 270 }, 271 { 272 initialHTML: 273 `abc${caretInLeft}` + 274 `<div style="${rightWhiteSpace}"><b>${caretInRight}def</b><br>ghi</div>`, 275 expectedHTML: aAttrsInLeftBlock => { 276 if (rightWhiteSpaceIsNormal) { 277 return [ 278 "abc<b>def</b>" + 279 `<div style="${rightWhiteSpace}">ghi</div>`, 280 ]; 281 } 282 return [ 283 `abc<b ${aAttrsInLeftBlock}>def</b>` + 284 `<div style="${rightWhiteSpace}">ghi</div>`, 285 `abc<span ${aAttrsInLeftBlock}><b>def</b></span>` + 286 `<div style="${rightWhiteSpace}">ghi</div>`, 287 ]; 288 }, 289 skip: !leftWhiteSpaceIsNormal, 290 }, 291 { 292 initialHTML: 293 `abc${caretInLeft}` + 294 `<div style="${rightWhiteSpace}"><b>${caretInRight}def\n</b>ghi</div>`, 295 expectedHTML: aAttrsInLeftBlock => { 296 return [ 297 `abc<b ${aAttrsInLeftBlock}>def</b>` + 298 `<div style="${rightWhiteSpace}">ghi</div>`, 299 `abc<span ${aAttrsInLeftBlock}><b>def</b></span>` + 300 `<div style="${rightWhiteSpace}">ghi</div>`, 301 ]; 302 }, 303 skip: !rightWhiteSpacePreserveLineBreaks || !leftWhiteSpaceIsNormal, 304 }, 305 { 306 initialHTML: 307 `abc${caretInLeft}` + 308 `<div style="${rightWhiteSpace}"><b>${caretInRight}def<br></b>ghi</div>`, 309 expectedHTML: aAttrsInLeftBlock => { 310 if (rightWhiteSpaceIsNormal) { 311 return [ 312 "abc<b>def</b>" + 313 `<div style="${rightWhiteSpace}">ghi</div>`, 314 ]; 315 } 316 return [ 317 `abc<b ${aAttrsInLeftBlock}>def</b>` + 318 `<div style="${rightWhiteSpace}">ghi</div>`, 319 `abc<span ${aAttrsInLeftBlock}><b>def</b></span>` + 320 `<div style="${rightWhiteSpace}">ghi</div>`, 321 ]; 322 }, 323 skip: !leftWhiteSpaceIsNormal, 324 }, 325 { 326 initialHTML: 327 `abc${caretInLeft}` + 328 `<div style="${rightWhiteSpace}"><div>${caretInRight}def</div>ghi</div>`, 329 expectedHTML: aAttrsInLeftBlock => { 330 if (rightWhiteSpaceIsNormal) { 331 return [ 332 "abcdef" + 333 `<div style="${rightWhiteSpace}">ghi</div>`, 334 ]; 335 } 336 return [ 337 `abc<span ${aAttrsInLeftBlock}>def</span>` + 338 `<div style="${rightWhiteSpace}">ghi</div>`, 339 ]; 340 }, 341 skip: !leftWhiteSpaceIsNormal, 342 }, 343 { 344 initialHTML: 345 `abc${caretInLeft}` + 346 `<div style="${rightWhiteSpace}">${caretInRight}def<div>ghi</div></div>`, 347 expectedHTML: aAttrsInLeftBlock => { 348 if (rightWhiteSpaceIsNormal) { 349 return [ 350 "abcdef" + 351 `<div style="${rightWhiteSpace}"><div>ghi</div></div>`, 352 ]; 353 } 354 return [ 355 `abc<span ${aAttrsInLeftBlock}>def</span>` + 356 `<div style="${rightWhiteSpace}"><div>ghi</div></div>`, 357 ]; 358 }, 359 skip: !leftWhiteSpaceIsNormal, 360 }, 361 { 362 initialHTML: 363 `abc${caretInLeft}` + 364 `<div style="${rightWhiteSpace}"><div>${caretInRight}def</div>ghi\njkl</div>`, 365 expectedHTML: aAttrsInLeftBlock => { 366 return [ 367 `abc<span ${aAttrsInLeftBlock}>def</span>` + 368 `<div style="${rightWhiteSpace}">ghi\njkl</div>`, 369 ]; 370 }, 371 skip: !rightWhiteSpacePreserveLineBreaks || !leftWhiteSpaceIsNormal, 372 }, 373 { 374 initialHTML: 375 `abc${caretInLeft}` + 376 `<div style="${rightWhiteSpace}"><div>${caretInRight}def</div>ghi<br>jkl</div>`, 377 expectedHTML: aAttrsInLeftBlock => { 378 if (rightWhiteSpaceIsNormal) { 379 return [ 380 "abcdef" + 381 `<div style="${rightWhiteSpace}">ghi<br>jkl</div>`, 382 ]; 383 } 384 return [ 385 `abc<span ${aAttrsInLeftBlock}>def</span>` + 386 `<div style="${rightWhiteSpace}">ghi<br>jkl</div>`, 387 ]; 388 }, 389 skip: !leftWhiteSpaceIsNormal, 390 }, 391 { 392 initialHTML: 393 `abc${caretInLeft}` + 394 `<div style="${rightWhiteSpace}">${caretInRight}def<div>ghi</div>\njkl</div>`, 395 expectedHTML: aAttrsInLeftBlock => { 396 return [ 397 `abc<span ${aAttrsInLeftBlock}>def</span>` + 398 `<div style="${rightWhiteSpace}"><div>ghi</div>\njkl</div>`, 399 ]; 400 }, 401 skip: !rightWhiteSpacePreserveLineBreaks || !leftWhiteSpaceIsNormal, 402 }, 403 { 404 initialHTML: 405 `abc${caretInLeft}` + 406 `<div style="${rightWhiteSpace}">${caretInRight}def<div>ghi</div><br>jkl</div>`, 407 expectedHTML: aAttrsInLeftBlock => { 408 if (rightWhiteSpaceIsNormal) { 409 return [ 410 "abcdef" + 411 `<div style="${rightWhiteSpace}"><div>ghi</div><br>jkl</div>`, 412 ]; 413 } 414 return [ 415 `abc<span ${aAttrsInLeftBlock}>def</span>` + 416 `<div style="${rightWhiteSpace}"><div>ghi</div><br>jkl</div>`, 417 ]; 418 }, 419 skip: !leftWhiteSpaceIsNormal, 420 }, 421 { 422 initialHTML: 423 `abc${caretInLeft}` + 424 `<div style="${rightWhiteSpace}"><div>${caretInRight}def\nghi</div>jkl\nmno</div>`, 425 expectedHTML: aAttrsInLeftBlock => { 426 return [ 427 `abc<span ${aAttrsInLeftBlock}>def</span>` + 428 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl\nmno</div>`, 429 ]; 430 }, 431 skip: !rightWhiteSpacePreserveLineBreaks || !leftWhiteSpaceIsNormal, 432 }, 433 { 434 initialHTML: 435 `abc${caretInLeft}` + 436 `<div style="${rightWhiteSpace}"><div>${caretInRight}def<br>ghi</div>jkl<br>mno</div>`, 437 expectedHTML: aAttrsInLeftBlock => { 438 if (rightWhiteSpaceIsNormal) { 439 return [ 440 "abcdef" + 441 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl<br>mno</div>`, 442 ]; 443 } 444 return [ 445 `abc<span ${aAttrsInLeftBlock}>def</span>` + 446 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl<br>mno</div>`, 447 ]; 448 }, 449 skip: !leftWhiteSpaceIsNormal, 450 }, 451 { 452 initialHTML: 453 `abc${caretInLeft}` + 454 `<div style="${rightWhiteSpace}">${caretInRight}def<div>ghi</div>jkl\nmno</div>`, 455 expectedHTML: aAttrsInLeftBlock => { 456 return [ 457 `abc<span ${aAttrsInLeftBlock}>def</span>` + 458 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl\nmno</div>`, 459 ]; 460 }, 461 skip: !rightWhiteSpacePreserveLineBreaks || !leftWhiteSpaceIsNormal, 462 }, 463 { 464 initialHTML: 465 `abc${caretInLeft}` + 466 `<div style="${rightWhiteSpace}">${caretInRight}def<div>ghi</div>jkl<br>mno</div>`, 467 expectedHTML: aAttrsInLeftBlock => { 468 if (rightWhiteSpaceIsNormal) { 469 return [ 470 "abcdef" + 471 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl<br>mno</div>`, 472 ]; 473 } 474 return [ 475 `abc<span ${aAttrsInLeftBlock}>def</span>` + 476 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl<br>mno</div>`, 477 ]; 478 }, 479 skip: !leftWhiteSpaceIsNormal, 480 }, 481 482 // The cases that the preceding line is a child of block element and has 483 // different white-space with <span>. 484 { 485 initialHTML: 486 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 487 `<div style="${rightWhiteSpace}">${caretInRight}def\nghi</div>`, 488 expectedHTML: aAttrsInLeftBlock => { 489 return [ 490 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 491 `<div style="${rightWhiteSpace}">ghi</div>`, 492 ]; 493 }, 494 skip: !rightWhiteSpacePreserveLineBreaks || leftWhiteSpaceIsNormal, 495 }, 496 { 497 initialHTML: 498 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 499 `<div style="${rightWhiteSpace}">${caretInRight}def<br>ghi</div>`, 500 expectedHTML: aAttrsInLeftBlock => { 501 if (rightWhiteSpaceIsNormal) { 502 return [ 503 `<span style="${leftWhiteSpace}">abc</span>def` + 504 `<div style="${rightWhiteSpace}">ghi</div>`, 505 ]; 506 } 507 return [ 508 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 509 `<div style="${rightWhiteSpace}">ghi</div>`, 510 ]; 511 }, 512 skip: leftWhiteSpaceIsNormal, 513 }, 514 { 515 initialHTML: 516 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 517 `<div style="${rightWhiteSpace}"><b>${caretInRight}def\nghi</b></div>`, 518 expectedHTML: aAttrsInLeftBlock => { 519 return [ 520 `<span style="${leftWhiteSpace}">abc</span><b ${aAttrsInLeftBlock}>def</b>` + 521 `<div style="${rightWhiteSpace}"><b>ghi</b></div>`, 522 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}><b>def</b></span>` + 523 `<div style="${rightWhiteSpace}"><b>ghi</b></div>`, 524 ]; 525 }, 526 skip: !rightWhiteSpacePreserveLineBreaks || leftWhiteSpaceIsNormal, 527 }, 528 { 529 initialHTML: 530 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 531 `<div style="${rightWhiteSpace}"><b>${caretInRight}def<br>ghi</b></div>`, 532 expectedHTML: aAttrsInLeftBlock => { 533 if (rightWhiteSpaceIsNormal) { 534 return [ 535 `<span style="${leftWhiteSpace}">abc</span><b>def</b>` + 536 `<div style="${rightWhiteSpace}"><b>ghi</b></div>`, 537 ]; 538 } 539 return [ 540 `<span style="${leftWhiteSpace}">abc</span><b ${aAttrsInLeftBlock}>def</b>` + 541 `<div style="${rightWhiteSpace}"><b>ghi</b></div>`, 542 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}><b>def</b></span>` + 543 `<div style="${rightWhiteSpace}"><b>ghi</b></div>`, 544 ]; 545 }, 546 skip: leftWhiteSpaceIsNormal, 547 }, 548 { 549 initialHTML: 550 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 551 `<div style="${rightWhiteSpace}"><b>${caretInRight}def</b>ghi\njkl</div>`, 552 expectedHTML: aAttrsInLeftBlock => { 553 return [ 554 `<span style="${leftWhiteSpace}">abc</span><b ${aAttrsInLeftBlock}>def</b><span ${aAttrsInLeftBlock}>ghi</span>` + 555 `<div style="${rightWhiteSpace}">jkl</div>`, 556 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}><b>def</b>ghi</span>` + 557 `<div style="${rightWhiteSpace}">jkl</div>`, 558 ]; 559 }, 560 skip: !rightWhiteSpacePreserveLineBreaks || leftWhiteSpaceIsNormal, 561 }, 562 { 563 initialHTML: 564 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 565 `<div style="${rightWhiteSpace}"><b>${caretInRight}def</b>ghi<br>jkl</div>`, 566 expectedHTML: aAttrsInLeftBlock => { 567 if (rightWhiteSpaceIsNormal) { 568 return [ 569 `<span style="${leftWhiteSpace}">abc</span><b>def</b>ghi` + 570 `<div style="${rightWhiteSpace}">jkl</div>`, 571 ]; 572 } 573 return [ 574 `<span style="${leftWhiteSpace}">abc</span><b ${aAttrsInLeftBlock}>def</b><span ${aAttrsInLeftBlock}>ghi</span>` + 575 `<div style="${rightWhiteSpace}">jkl</div>`, 576 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}><b>def</b>ghi</span>` + 577 `<div style="${rightWhiteSpace}">jkl</div>`, 578 ]; 579 }, 580 skip: leftWhiteSpaceIsNormal, 581 }, 582 { 583 initialHTML: 584 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 585 `<div style="${rightWhiteSpace}"><b>${caretInRight}def</b>\nghi</div>`, 586 expectedHTML: aAttrsInLeftBlock => { 587 return [ 588 `<span style="${leftWhiteSpace}">abc</span><b ${aAttrsInLeftBlock}>def</b>` + 589 `<div style="${rightWhiteSpace}">ghi</div>`, 590 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}><b>def</b></span>` + 591 `<div style="${rightWhiteSpace}">ghi</div>`, 592 ]; 593 }, 594 skip: !rightWhiteSpacePreserveLineBreaks || leftWhiteSpaceIsNormal, 595 }, 596 { 597 initialHTML: 598 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 599 `<div style="${rightWhiteSpace}"><b>${caretInRight}def</b><br>ghi</div>`, 600 expectedHTML: aAttrsInLeftBlock => { 601 if (rightWhiteSpaceIsNormal) { 602 return [ 603 `<span style="${leftWhiteSpace}">abc</span><b>def</b>` + 604 `<div style="${rightWhiteSpace}">ghi</div>`, 605 ]; 606 } 607 return [ 608 `<span style="${leftWhiteSpace}">abc</span><b ${aAttrsInLeftBlock}>def</b>` + 609 `<div style="${rightWhiteSpace}">ghi</div>`, 610 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}><b>def</b></span>` + 611 `<div style="${rightWhiteSpace}">ghi</div>`, 612 ]; 613 }, 614 skip: leftWhiteSpaceIsNormal, 615 }, 616 { 617 initialHTML: 618 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 619 `<div style="${rightWhiteSpace}"><b>${caretInRight}def\n</b>ghi</div>`, 620 expectedHTML: aAttrsInLeftBlock => { 621 return [ 622 `<span style="${leftWhiteSpace}">abc</span><b ${aAttrsInLeftBlock}>def</b>` + 623 `<div style="${rightWhiteSpace}">ghi</div>`, 624 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}><b>def</b></span>` + 625 `<div style="${rightWhiteSpace}">ghi</div>`, 626 ]; 627 }, 628 skip: !rightWhiteSpacePreserveLineBreaks || leftWhiteSpaceIsNormal, 629 }, 630 { 631 initialHTML: 632 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 633 `<div style="${rightWhiteSpace}"><b>${caretInRight}def<br></b>ghi</div>`, 634 expectedHTML: aAttrsInLeftBlock => { 635 if (rightWhiteSpaceIsNormal) { 636 return [ 637 `<span style="${leftWhiteSpace}">abc</span><b>def</b>` + 638 `<div style="${rightWhiteSpace}">ghi</div>`, 639 ]; 640 } 641 return [ 642 `<span style="${leftWhiteSpace}">abc</span><b ${aAttrsInLeftBlock}>def</b>` + 643 `<div style="${rightWhiteSpace}">ghi</div>`, 644 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}><b>def</b></span>` + 645 `<div style="${rightWhiteSpace}">ghi</div>`, 646 ]; 647 }, 648 skip: leftWhiteSpaceIsNormal, 649 }, 650 { 651 initialHTML: 652 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 653 `<div style="${rightWhiteSpace}"><div>${caretInRight}def</div>ghi</div>`, 654 expectedHTML: aAttrsInLeftBlock => { 655 if (rightWhiteSpaceIsNormal) { 656 return [ 657 `<span style="${leftWhiteSpace}">abc</span>def` + 658 `<div style="${rightWhiteSpace}">ghi</div>`, 659 ]; 660 } 661 return [ 662 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 663 `<div style="${rightWhiteSpace}">ghi</div>`, 664 ]; 665 }, 666 skip: leftWhiteSpaceIsNormal, 667 }, 668 { 669 initialHTML: 670 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 671 `<div style="${rightWhiteSpace}">${caretInRight}def<div>ghi</div></div>`, 672 expectedHTML: aAttrsInLeftBlock => { 673 if (rightWhiteSpaceIsNormal) { 674 return [ 675 `<span style="${leftWhiteSpace}">abc</span>def` + 676 `<div style="${rightWhiteSpace}"><div>ghi</div></div>`, 677 ]; 678 } 679 return [ 680 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 681 `<div style="${rightWhiteSpace}"><div>ghi</div></div>`, 682 ]; 683 }, 684 skip: leftWhiteSpaceIsNormal, 685 }, 686 { 687 initialHTML: 688 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 689 `<div style="${rightWhiteSpace}"><div>${caretInRight}def</div>ghi\njkl</div>`, 690 expectedHTML: aAttrsInLeftBlock => { 691 return [ 692 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 693 `<div style="${rightWhiteSpace}">ghi\njkl</div>`, 694 ]; 695 }, 696 skip: !rightWhiteSpacePreserveLineBreaks || leftWhiteSpaceIsNormal, 697 }, 698 { 699 initialHTML: `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 700 `<div style="${rightWhiteSpace}"><div>${caretInRight}def</div>ghi<br>jkl</div>`, 701 expectedHTML: aAttrsInLeftBlock => { 702 if (rightWhiteSpaceIsNormal) { 703 return [ 704 `<span style="${leftWhiteSpace}">abc</span>def` + 705 `<div style="${rightWhiteSpace}">ghi<br>jkl</div>`, 706 ]; 707 } 708 return [ 709 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 710 `<div style="${rightWhiteSpace}">ghi<br>jkl</div>`, 711 ]; 712 }, 713 skip: leftWhiteSpaceIsNormal, 714 }, 715 { 716 initialHTML: 717 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 718 `<div style="${rightWhiteSpace}">${caretInRight}def<div>ghi</div>\njkl</div>`, 719 expectedHTML: aAttrsInLeftBlock => { 720 return [ 721 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 722 `<div style="${rightWhiteSpace}"><div>ghi</div>\njkl</div>`, 723 ]; 724 }, 725 skip: !rightWhiteSpacePreserveLineBreaks || leftWhiteSpaceIsNormal, 726 }, 727 { 728 initialHTML: `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 729 `<div style="${rightWhiteSpace}">${caretInRight}def<div>ghi</div><br>jkl</div>`, 730 expectedHTML: aAttrsInLeftBlock => { 731 if (rightWhiteSpaceIsNormal) { 732 return [ 733 `<span style="${leftWhiteSpace}">abc</span>def` + 734 `<div style="${rightWhiteSpace}"><div>ghi</div><br>jkl</div>`, 735 ]; 736 } 737 return [ 738 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 739 `<div style="${rightWhiteSpace}"><div>ghi</div><br>jkl</div>`, 740 ]; 741 }, 742 skip: leftWhiteSpaceIsNormal, 743 }, 744 { 745 initialHTML: 746 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 747 `<div style="${rightWhiteSpace}"><div>${caretInRight}def\nghi</div>jkl\nmno</div>`, 748 expectedHTML: aAttrsInLeftBlock => { 749 return [ 750 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 751 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl\nmno</div>`, 752 ]; 753 }, 754 skip: !rightWhiteSpacePreserveLineBreaks || leftWhiteSpaceIsNormal, 755 }, 756 { 757 initialHTML: 758 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 759 `<div style="${rightWhiteSpace}"><div>${caretInRight}def<br>ghi</div>jkl<br>mno</div>`, 760 expectedHTML: aAttrsInLeftBlock => { 761 if (rightWhiteSpaceIsNormal) { 762 return [ 763 `<span style="${leftWhiteSpace}">abc</span>def` + 764 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl<br>mno</div>`, 765 ]; 766 } 767 return [ 768 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 769 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl<br>mno</div>`, 770 ]; 771 }, 772 skip: leftWhiteSpaceIsNormal, 773 }, 774 { 775 initialHTML: 776 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 777 `<div style="${rightWhiteSpace}">${caretInRight}def<div>ghi</div>jkl\nmno</div>`, 778 expectedHTML: aAttrsInLeftBlock => { 779 return [ 780 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 781 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl\nmno</div>`, 782 ]; 783 }, 784 skip: !rightWhiteSpacePreserveLineBreaks || leftWhiteSpaceIsNormal, 785 }, 786 { 787 initialHTML: 788 `<span style="${leftWhiteSpace}">abc${caretInLeft}</span>` + 789 `<div style="${rightWhiteSpace}">${caretInRight}def<div>ghi</div>jkl<br>mno</div>`, 790 expectedHTML: aAttrsInLeftBlock => { 791 if (rightWhiteSpaceIsNormal) { 792 return [ 793 `<span style="${leftWhiteSpace}">abc</span>def` + 794 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl<br>mno</div>`, 795 ]; 796 } 797 return [ 798 `<span style="${leftWhiteSpace}">abc</span><span ${aAttrsInLeftBlock}>def</span>` + 799 `<div style="${rightWhiteSpace}"><div>ghi</div>jkl<br>mno</div>`, 800 ]; 801 }, 802 skip: leftWhiteSpaceIsNormal, 803 }, 804 ]; 805 806 const rightStyleAttr = new RegExp(`style="${rightWhiteSpace}"`, "g"); 807 const leftStyleAttr = new RegExp(`style="${leftWhiteSpace}"`, "g"); 808 const styledRightDiv = new RegExp(`<div style="${rightWhiteSpace}">`, "g"); 809 for (const t of tests) { 810 if (t.skip) { 811 continue; 812 } 813 promise_test(async () => { 814 utils.setupEditingHost(t.initialHTML); 815 await (testingBackspace ? utils.sendBackspaceKey() : utils.sendDeleteKey()); 816 utils.normalizeStyleAttributeValues(); 817 assert_in_array( 818 editingHost.innerHTML, 819 t.expectedHTML(`style="${rightWhiteSpace}"`), 820 "white-space should be preserved by <span> elements" 821 ); 822 }, `${commandName} at ${t.initialHTML.replace(/\n/g, "\\n")}`); 823 824 if (rightWhiteSpaceClass !== null) { 825 // Replace style attribute with class attribute. 826 const initialHTMLWithClass = 827 t.initialHTML.replace( 828 rightStyleAttr, 829 `class="${rightWhiteSpaceClass}"` 830 ); 831 if (initialHTMLWithClass != t.initialHTML) { 832 promise_test(async () => { 833 utils.setupEditingHost(initialHTMLWithClass); 834 await (testingBackspace ? utils.sendBackspaceKey() : utils.sendDeleteKey()); 835 utils.normalizeStyleAttributeValues(); 836 const expectedHTMLs = []; 837 for (const styleAndOrClassAttr of [ 838 `style="${rightWhiteSpace}"`, 839 `class="${rightWhiteSpaceClass}" style="${rightWhiteSpace}"`, 840 `style="${rightWhiteSpace}" class="${rightWhiteSpaceClass}"`, 841 ]) { 842 for (const origExpectedHTML of t.expectedHTML(styleAndOrClassAttr)) { 843 expectedHTMLs.push( 844 origExpectedHTML.replace( 845 styledRightDiv, 846 `<div class="${rightWhiteSpaceClass}">` 847 ) 848 ); 849 } 850 } 851 assert_in_array( 852 editingHost.innerHTML, 853 expectedHTMLs, 854 "white-space should be preserved by <span> elements with class or style attribute" 855 ); 856 }, `${commandName} at ${initialHTMLWithClass.replace(/\n/g, "\\n")}`); 857 } 858 } 859 860 if (leftWhiteSpaceClass !== null) { 861 // Replace style attribute with class attribute. 862 const initialHTMLWithClass = 863 t.initialHTML.replace( 864 leftStyleAttr, 865 `class="${leftWhiteSpaceClass}"` 866 ); 867 if (initialHTMLWithClass != t.initialHTML) { 868 promise_test(async () => { 869 utils.setupEditingHost(initialHTMLWithClass); 870 await (testingBackspace ? utils.sendBackspaceKey() : utils.sendDeleteKey()); 871 utils.normalizeStyleAttributeValues(); 872 const expectedHTMLs = []; 873 for (const styleAndOrClassAttr of [ 874 `style="${rightWhiteSpace}"`, 875 `class="${rightWhiteSpaceClass}" style="${rightWhiteSpace}"`, 876 `style="${rightWhiteSpace}" class="${rightWhiteSpaceClass}"`, 877 ]) { 878 for (const origExpectedHTML of t.expectedHTML(styleAndOrClassAttr)) { 879 expectedHTMLs.push( 880 origExpectedHTML.replace( 881 leftStyleAttr, 882 `class="${leftWhiteSpaceClass}"` 883 ) 884 ); 885 } 886 } 887 assert_in_array( 888 editingHost.innerHTML, 889 expectedHTMLs, 890 "white-space should be preserved by <span> elements with class or style attribute" 891 ); 892 }, `${commandName} at ${initialHTMLWithClass.replace(/\n/g, "\\n")}`); 893 } 894 } 895 } 896 897 </script> 898 </body> 899 </html>