tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>