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-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>