tor-browser

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

live-range-updates.html (3195B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4 <script src='/resources/testharness.js'></script>
      5 <script src='/resources/testharnessreport.js'></script>
      6 </head>
      7 
      8 <body>
      9 </body>
     10 
     11 <script>
     12 'use strict';
     13 
     14 test(t => {
     15  document.body.innerHTML = `
     16    <div id=old_parent>
     17      <span id=start>RangeStartTarget</span>
     18      <span id=middle>Middle</span>
     19      <span id=end>RangeEndTarget</span>
     20    </div>`;
     21 
     22  const range = new Range();
     23  range.setStart(start, 0);
     24  range.setEnd(end, 0);
     25 
     26  assert_true(range.intersectsNode(middle), "Intersection before move");
     27  // Moves `start` span to the very bottom of the container.
     28  old_parent.moveBefore(start, null);
     29 
     30  // In an ordinary removal, when a node whose descendant is the start (or end)
     31  // of a live range is removed, the range's start is set to the removed node's
     32  // parent. For now, the same thing happens during `moveBefore()`.
     33  assert_equals(range.startContainer, old_parent, "startContainer updates during move");
     34  assert_equals(range.endContainer, end, "endContainer does not update after move");
     35  assert_true(range.intersectsNode(middle), "adjusted range still intersects " +
     36      "middle node after move");
     37 }, "moveBefore still results in range startContainer snapping up to parent " +
     38   "when startContainer is moved");
     39 
     40 test(t => {
     41  document.body.innerHTML = `
     42    <div id=old_parent>
     43      <div id=movable_div>
     44        <span id=start>RangeStartTarget</span>
     45        <span id=middle>Middle</span>
     46      </div>
     47      <span id=end>RangeEndTarget</span>
     48    </div>
     49    <div id=new_parent></div>`;
     50 
     51  const range = new Range();
     52  range.setStart(start, 0);
     53  range.setEnd(end, 0);
     54 
     55  assert_true(range.intersectsNode(middle), "Intersection before move");
     56  new_parent.moveBefore(movable_div, null);
     57 
     58  assert_equals(range.startContainer, old_parent, "startContainer still " +
     59      "updates during move, to snap to parent");
     60  assert_equals(range.endContainer, end, "endContainer does not update after move");
     61  assert_false(range.intersectsNode(middle), "range no longer intersects " +
     62      "middle node after move, since middle node was moved outside of the range");
     63 }, "moveBefore still causes range startContainer to snap up to parent, when " +
     64   "startContainer ancestor is moved");
     65 
     66 test(t => {
     67  document.body.innerHTML = `
     68    <div id=old_parent>
     69      <span id=start>RangeStartTarget</span>
     70      <div id=movable_div>
     71        <span id=end>RangeEndTarget</span>
     72      </div>
     73    </div>
     74    <div id=new_parent>
     75      <span id=middle>Middle</span>
     76    </div>`;
     77 
     78  const range = new Range();
     79  range.setStart(start, 0);
     80  range.setEnd(end, 0);
     81 
     82  assert_false(range.intersectsNode(middle), "No intersection before move");
     83  new_parent.moveBefore(movable_div, null);
     84 
     85  assert_equals(range.startContainer, start, "startContainer does not update " +
     86      "after move");
     87  assert_equals(range.endContainer, old_parent, "endContainer still snaps up " +
     88      "to parent after move");
     89  assert_false(range.intersectsNode(middle), "adjusted range still does not " +
     90      "intersect middle node after move");
     91 }, "moveBefore still causes range endContainer to snap up to parent, when " +
     92   "endContainer ancestor is moved");
     93 </script>
     94 </html>