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>