tor-browser

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

forwarddelete-chars-following-collapsible-white-space.html (7752B)


      1 <!doctype html>
      2 <html>
      3 <head>
      4 <meta charset="utf-8">
      5 <meta name="timeout" content="long">
      6 <title>Test (forward) Delete to delete following character(s) of collapsible white-space</title>
      7 <script src="/resources/testharness.js"></script>
      8 <script src="/resources/testharnessreport.js"></script>
      9 <script src="/resources/testdriver.js"></script>
     10 <script src="/resources/testdriver-vendor.js"></script>
     11 <script src="/resources/testdriver-actions.js"></script>
     12 <script src="../include/editor-test-utils.js"></script>
     13 <script>
     14 "use strict";
     15 
     16 addEventListener("load", () => {
     17  const editingHost = document.querySelector("div[contenteditable]");
     18  editingHost.focus();
     19  const utils = new EditorTestUtils(editingHost);
     20  for (const data of [
     21    {
     22      init: "<p> []a</p>",
     23      // The white-space before "a" is invisible due to immediately after the
     24      // block boundary.  Therefore, it may be deleted.
     25      expected: [
     26        "<p><br></p>",
     27        "<p> <br></p>",
     28      ],
     29    },
     30    {
     31      init: "<p><b> []a</b></p>",
     32      // The white-space before "a" is invisible due to immediately after the
     33      // block boundary.  Therefore, it may be deleted.
     34      expected: [
     35        "<p><br></p>",
     36        "<p><b><br></b></p>",
     37        "<p><b> <br></b></p>",
     38      ],
     39    },
     40    {
     41      init: "<p>abc []d</p>",
     42      expected: [
     43        "<p>abc <br></p>",
     44        "<p>abc&nbsp;</p>",
     45      ],
     46    },
     47    {
     48      init: "<p><b>abc []d</b></p>",
     49      expected: [
     50        "<p><b>abc <br></b></p>",
     51        "<p><b>abc&nbsp;</b></p>",
     52      ],
     53    },
     54    {
     55      init: "<p>abc []d<br></p>",
     56      expected: [
     57        "<p>abc <br></p>",
     58        "<p>abc&nbsp;</p>",
     59      ],
     60    },
     61    {
     62      init: " []a<p>bc</p>",
     63      // The white-space before "a" is invisible due to immediately after the
     64      // block boundary.  Therefore, it may be deleted.
     65      expected: [
     66        "<br><p>bc</p>",
     67        " <br><p>bc</p>",
     68      ],
     69    },
     70    {
     71      init: "abc []d<p>ef</p>",
     72      expected: [
     73        "abc <br><p>ef</p>",
     74        "abc&nbsp;<p>ef</p>",
     75      ],
     76    },
     77    {
     78      init: "<b>abc []d</b><p>ef</p>",
     79      expected: [
     80        "<b>abc <br></b><p>ef</p>",
     81        "<b>abc&nbsp;</b><p>ef</p>",
     82      ],
     83    },
     84    {
     85      init: "<p>abc</p> []d",
     86      // The white-space before "d" is invisible due to immediately after the
     87      // block boundary.  Therefore, it may be deleted.
     88      expected: [
     89        "<p>abc</p><br>",
     90        "<p>abc</p> <br>",
     91      ],
     92    },
     93    {
     94      init: "<p>abc</p>def []g",
     95      expected: [
     96        "<p>abc</p>def <br>",
     97        "<p>abc</p>def&nbsp;",
     98      ],
     99    },
    100    {
    101      init: "<p>abc</p><b> []d</b>",
    102      // The white-space before "d" is invisible due to immediately after the
    103      // block boundary.  Therefore, it may be deleted.
    104      expected: [
    105        "<p>abc</p><br>",
    106        "<p>abc</p><b><br></b>",
    107        "<p>abc</p><b> <br></b>",
    108      ],
    109    },
    110    {
    111      init: "<p>abc</p>def []g<p>hij</p>",
    112      expected: [
    113        "<p>abc</p>def <br><p>hij</p>",
    114        "<p>abc</p>def&nbsp;<p>hij</p>",
    115      ],
    116    },
    117    {
    118      init: "<p>abc</p> []d<p>efg</p>",
    119      // The white-space before "d" is invisible due to immediately after the
    120      // block boundary.  Therefore, it may be deleted.
    121      expected: [
    122        "<p>abc</p><br><p>efg</p>",
    123        "<p>abc</p> <br><p>efg</p>",
    124      ],
    125    },
    126    {
    127      init: "<p>abc</p><b> []d</b><p>efg</p>",
    128      // The white-space before "d" is invisible due to immediately after the
    129      // block boundary.  Therefore, it may be deleted.
    130      expected: [
    131        "<p>abc</p><br><p>efg</p>",
    132        "<p>abc</p><b><br></b><p>efg</p>",
    133        "<p>abc</p><b> <br></b><p>efg</p>",
    134      ],
    135    },
    136  ]) {
    137    promise_test(async () => {
    138      utils.setupEditingHost(data.init);
    139      await utils.sendDeleteKey();
    140      if (Array.isArray(data.expected)) {
    141        assert_in_array(editingHost.innerHTML, data.expected);
    142      } else {
    143        assert_equals(editingHost.innerHTML, data.expected);
    144      }
    145    }, `Backspace when ${data.init}`);
    146    promise_test(async () => {
    147      utils.setupEditingHost(data.init);
    148      getSelection().modify("extend", "right", "character");
    149      await utils.sendDeleteKey();
    150      if (Array.isArray(data.expected)) {
    151        assert_in_array(editingHost.innerHTML, data.expected);
    152      } else {
    153        assert_equals(editingHost.innerHTML, data.expected);
    154      }
    155    }, `Delete when ${data.init} after extending selection forward`);
    156  }
    157  for (const data of [
    158    {
    159      init: "<p> []abc</p>",
    160      // The white-space before "abc" is invisible due to immediately after the
    161      // block boundary.  Therefore, it may be deleted.
    162      expected: [
    163        "<p><br></p>",
    164        "<p> <br></p>",
    165      ],
    166    },
    167    {
    168      init: "<p>abc []def</p>",
    169      expected: [
    170        "<p>abc <br></p>",
    171        "<p>abc&nbsp;</p>",
    172      ],
    173    },
    174    {
    175      init: "<p><b>abc []def</b></p>",
    176      expected: [
    177        "<p><b>abc <br></b></p>",
    178        "<p><b>abc&nbsp;</b></p>",
    179      ],
    180    },
    181    {
    182      init: "<p>abc []def<br></p>",
    183      expected: [
    184        "<p>abc <br></p>",
    185        "<p>abc&nbsp;</p>",
    186      ],
    187    },
    188    {
    189      init: " []abc<p>def</p>",
    190      // The white-space before "abc" is invisible due to immediately after the
    191      // block boundary.  Therefore, it may be deleted.
    192      expected: [
    193        "<br><p>def</p>",
    194        " <br><p>def</p>",
    195      ],
    196    },
    197    {
    198      init: "abc []def<p>ghi</p>",
    199      expected: [
    200        "abc <br><p>ghi</p>",
    201        "abc&nbsp;<p>ghi</p>",
    202      ],
    203    },
    204    {
    205      init: "<b>abc []def</b><p>ghi</p>",
    206      expected: [
    207        "<b>abc <br></b><p>ghi</p>",
    208        "<b>abc&nbsp;</b><p>ghi</p>",
    209      ],
    210    },
    211    {
    212      init: "<p>abc</p> []def",
    213      // The white-space before "def" is invisible due to immediately after the
    214      // block boundary.  Therefore, it may be deleted.
    215      expected: [
    216        "<p>abc</p><br>",
    217        "<p>abc</p> <br>",
    218      ],
    219    },
    220    {
    221      init: "<p>abc</p>def []ghi",
    222      expected: [
    223        "<p>abc</p>def <br>",
    224        "<p>abc</p>def&nbsp;",
    225      ],
    226    },
    227    {
    228      init: "<p>abc</p><b> []def</b>",
    229      // The white-space before "def" is invisible due to immediately after the
    230      // block boundary.  Therefore, it may be deleted.
    231      expected: [
    232        "<p>abc</p><br>",
    233        "<p>abc</p><b><br></b>",
    234        "<p>abc</p><b> <br></b>",
    235      ],
    236    },
    237    {
    238      init: "<p>abc</p>def []ghi<p>jkl</p>",
    239      expected: [
    240        "<p>abc</p>def <br><p>jkl</p>",
    241        "<p>abc</p>def&nbsp;<p>jkl</p>",
    242      ],
    243    },
    244    {
    245      init: "<p>abc</p> []def<p>ghi</p>",
    246      // The white-space before "def" is invisible due to immediately after the
    247      // block boundary.  Therefore, it may be deleted.
    248      expected: [
    249        "<p>abc</p><br><p>ghi</p>",
    250        "<p>abc</p> <br><p>ghi</p>",
    251      ],
    252    },
    253    {
    254      init: "<p>abc</p><b> []def</b><p>ghi</p>",
    255      // The white-space before "def" is invisible due to immediately after the
    256      // block boundary.  Therefore, it may be deleted.
    257      expected: [
    258        "<p>abc</p><br><p>ghi</p>",
    259        "<p>abc</p><b><br></b><p>ghi</p>",
    260        "<p>abc</p><b> <br></b><p>ghi</p>",
    261      ],
    262    },
    263  ]) {
    264    promise_test(async () => {
    265      utils.setupEditingHost(data.init);
    266      await utils.sendDeleteKey(utils.deleteWordModifier);
    267      if (Array.isArray(data.expected)) {
    268        assert_in_array(editingHost.innerHTML, data.expected);
    269      } else {
    270        assert_equals(editingHost.innerHTML, data.expected);
    271      }
    272    }, `${
    273      utils.deleteWordModifier == utils.kControl ? "Ctrl" : "Alt"
    274    }+Delete when "${data.init}"`);
    275  }
    276 }, {once: true});
    277 </script>
    278 </head>
    279 <body>
    280  <div contenteditable></div>
    281 </body>
    282 </html>