tor-browser

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

delete-before-invisible-line-break.html (4810B)


      1 <!doctype html>
      2 <html>
      3 <head>
      4 <meta charset="utf-8">
      5 <meta name="timeout" content="long">
      6 <meta name="variant" content="?white-space=normal">
      7 <meta name="variant" content="?white-space=pre">
      8 <meta name="variant" content="?white-space=pre-line">
      9 <meta name="variant" content="?white-space=pre-wrap">
     10 <title>Deleting content immediately before invisible line break should clean up if it's unnecessary anymore</title>
     11 <script src="/resources/testharness.js"></script>
     12 <script src="/resources/testharnessreport.js"></script>
     13 <script src="/resources/testdriver.js"></script>
     14 <script src="/resources/testdriver-vendor.js"></script>
     15 <script src="/resources/testdriver-actions.js"></script>
     16 <script src="../../editing/include/editor-test-utils.js"></script>
     17 <script>
     18 "use strict";
     19 
     20 const searchParams = new URLSearchParams(document.location.search);
     21 const whiteSpace = searchParams.get("white-space");
     22 const useBR = whiteSpace == "normal";
     23 const collapseWhiteSpaces = whiteSpace == "normal" || whiteSpace == "pre-line";
     24 
     25 addEventListener("load", () => {
     26  const editingHost = document.querySelector("div[contenteditable]");
     27  editingHost.style.whiteSpace = whiteSpace;
     28  editingHost.getBoundingClientRect();
     29  editingHost.focus();
     30  const utils = new EditorTestUtils(editingHost);
     31 
     32  for (const data of [
     33    {
     34      initialInnerHTML: "<p>a []<br></p>",
     35      expected: "<p>a</p>",
     36    },
     37    {
     38      initialInnerHTML: "<p>a[ ]<br></p>",
     39      expected: "<p>a</p>",
     40    },
     41    {
     42      initialInnerHTML: "<p>a b[]<br></p>",
     43      expected: collapseWhiteSpaces
     44        ? ["<p>a <br></p>", "<p>a&nbsp;</p>"]
     45        : "<p>a </p>",
     46    },
     47    {
     48      initialInnerHTML: "<p>a [b]<br></p>",
     49      expected: collapseWhiteSpaces
     50        ? ["<p>a <br></p>", "<p>a&nbsp;</p>"]
     51        : "<p>a </p>",
     52    },
     53    {
     54      initialInnerHTML: "<p>a []\n</p>",
     55      expected: "<p>a</p>",
     56      skipIf: () => useBR,
     57    },
     58    {
     59      initialInnerHTML: "<p>a[ ]\n</p>",
     60      expected: "<p>a</p>",
     61      skipIf: () => useBR,
     62    },
     63    {
     64      initialInnerHTML: "<p>a b[]\n</p>",
     65      expected: collapseWhiteSpaces
     66        ? ["<p>a \n</p>", "<p>a&nbsp;</p>"]
     67        : "<p>a </p>",
     68      skipIf: () => useBR,
     69    },
     70    {
     71      initialInnerHTML: "<p>a [b]\n</p>",
     72      expected: collapseWhiteSpaces
     73        ? ["<p>a \n</p>", "<p>a&nbsp;</p>"]
     74        : "<p>a </p>",
     75      skipIf: () => useBR,
     76    },
     77    {
     78      initialInnerHTML: "<div>a []<br><div>b</div></div>",
     79      expected: "<div>a<div>b</div></div>",
     80    },
     81    {
     82      initialInnerHTML: "<div>a[ ]<br><div>b</div></div>",
     83      expected: "<div>a<div>b</div></div>",
     84    },
     85    {
     86      initialInnerHTML: "<div>a b[]<br><div>b</div></div>",
     87      expected: collapseWhiteSpaces
     88        ? ["<div>a <br><div>b</div></div>", "<div>a&nbsp;<div>b</div></div>"]
     89        : "<div>a <div>b</div></div>",
     90    },
     91    {
     92      initialInnerHTML: "<div>a [b]<br><div>b</div></div>",
     93      expected: collapseWhiteSpaces
     94        ? ["<div>a <br><div>b</div></div>", "<div>a&nbsp;<div>b</div></div>"]
     95        : "<div>a <div>b</div></div>",
     96    },
     97    {
     98      initialInnerHTML: "<div>a []\n<div>b</div></div>",
     99      expected: "<div>a<div>b</div></div>",
    100      skipIf: () => useBR,
    101    },
    102    {
    103      initialInnerHTML: "<div>a[ ]\n<div>b</div></div>",
    104      expected: "<div>a<div>b</div></div>",
    105      skipIf: () => useBR,
    106    },
    107    {
    108      initialInnerHTML: "<div>a b[]\n<div>b</div></div>",
    109      expected: collapseWhiteSpaces
    110        ? ["<div>a \n<div>b</div></div>", "<div>a&nbsp;<div>b</div></div>"]
    111        : "<div>a <div>b</div></div>",
    112      skipIf: () => useBR,
    113    },
    114    {
    115      initialInnerHTML: "<div>a [b]\n<div>b</div></div>",
    116      expected: collapseWhiteSpaces
    117        ? ["<div>a \n<div>b</div></div>", "<div>a&nbsp;<div>b</div></div>"]
    118        : "<div>a <div>b</div></div>",
    119      skipIf: () => useBR,
    120    },
    121  ]) {
    122    if (data.skipIf !== undefined && data.skipIf()) {
    123      continue;
    124    }
    125    promise_test(async () => {
    126      utils.setupEditingHost(data.initialInnerHTML);
    127      document.execCommand("delete");
    128      if (Array.isArray(data.expected)) {
    129        assert_in_array(editingHost.innerHTML, data.expected);
    130      } else {
    131        assert_equals(editingHost.innerHTML, data.expected);
    132      }
    133    }, `document.execCommand("delete") when ${data.initialInnerHTML.replaceAll("\n", "\\n")}`);
    134    promise_test(async () => {
    135      utils.setupEditingHost(data.initialInnerHTML);
    136      await utils.sendBackspaceKey();
    137      if (Array.isArray(data.expected)) {
    138        assert_in_array(editingHost.innerHTML, data.expected);
    139      } else {
    140        assert_equals(editingHost.innerHTML, data.expected);
    141      }
    142    }, `Backspace when ${data.initialInnerHTML.replaceAll("\n", "\\n")}`);
    143  }
    144 }, {once: true});
    145 </script>
    146 </head>
    147 <body>
    148  <div contenteditable></div>
    149 </body>
    150 </html>