tor-browser

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

Range-set.html (7540B)


      1 <!doctype html>
      2 <title>Range setting tests</title>
      3 <link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
      4 <meta name=timeout content=long>
      5 
      6 <div id=log></div>
      7 <script src=/resources/testharness.js></script>
      8 <script src=/resources/testharnessreport.js></script>
      9 <script src=../common.js></script>
     10 <script>
     11 "use strict";
     12 
     13 function testSetStart(range, node, offset) {
     14  if (node.nodeType == Node.DOCUMENT_TYPE_NODE) {
     15    assert_throws_dom("INVALID_NODE_TYPE_ERR", function() {
     16      range.setStart(node, offset);
     17    }, "setStart() to a doctype must throw INVALID_NODE_TYPE_ERR");
     18    return;
     19  }
     20 
     21  if (offset < 0 || offset > nodeLength(node)) {
     22    assert_throws_dom("INDEX_SIZE_ERR", function() {
     23      range.setStart(node, offset);
     24    }, "setStart() to a too-large offset must throw INDEX_SIZE_ERR");
     25    return;
     26  }
     27 
     28  var newRange = range.cloneRange();
     29  newRange.setStart(node, offset);
     30 
     31  assert_equals(newRange.startContainer, node,
     32    "setStart() must change startContainer to the new node");
     33  assert_equals(newRange.startOffset, offset,
     34    "setStart() must change startOffset to the new offset");
     35 
     36  // FIXME: I'm assuming comparePoint() is correct, but the tests for that
     37  // will depend on setStart()/setEnd().
     38  if (furthestAncestor(node) != furthestAncestor(range.startContainer)
     39  || range.comparePoint(node, offset) > 0) {
     40    assert_equals(newRange.endContainer, node,
     41      "setStart(node, offset) where node is after current end or in different document must set the end node to node too");
     42    assert_equals(newRange.endOffset, offset,
     43      "setStart(node, offset) where node is after current end or in different document must set the end offset to offset too");
     44  } else {
     45    assert_equals(newRange.endContainer, range.endContainer,
     46      "setStart() must not change the end node if the new start is before the old end");
     47    assert_equals(newRange.endOffset, range.endOffset,
     48      "setStart() must not change the end offset if the new start is before the old end");
     49  }
     50 }
     51 
     52 function testSetEnd(range, node, offset) {
     53  if (node.nodeType == Node.DOCUMENT_TYPE_NODE) {
     54    assert_throws_dom("INVALID_NODE_TYPE_ERR", function() {
     55      range.setEnd(node, offset);
     56    }, "setEnd() to a doctype must throw INVALID_NODE_TYPE_ERR");
     57    return;
     58  }
     59 
     60  if (offset < 0 || offset > nodeLength(node)) {
     61    assert_throws_dom("INDEX_SIZE_ERR", function() {
     62      range.setEnd(node, offset);
     63    }, "setEnd() to a too-large offset must throw INDEX_SIZE_ERR");
     64    return;
     65  }
     66 
     67  var newRange = range.cloneRange();
     68  newRange.setEnd(node, offset);
     69 
     70  // FIXME: I'm assuming comparePoint() is correct, but the tests for that
     71  // will depend on setStart()/setEnd().
     72  if (furthestAncestor(node) != furthestAncestor(range.startContainer)
     73  || range.comparePoint(node, offset) < 0) {
     74    assert_equals(newRange.startContainer, node,
     75      "setEnd(node, offset) where node is before current start or in different document must set the end node to node too");
     76    assert_equals(newRange.startOffset, offset,
     77      "setEnd(node, offset) where node is before current start or in different document must set the end offset to offset too");
     78  } else {
     79    assert_equals(newRange.startContainer, range.startContainer,
     80      "setEnd() must not change the start node if the new end is after the old start");
     81    assert_equals(newRange.startOffset, range.startOffset,
     82      "setEnd() must not change the start offset if the new end is after the old start");
     83  }
     84 
     85  assert_equals(newRange.endContainer, node,
     86    "setEnd() must change endContainer to the new node");
     87  assert_equals(newRange.endOffset, offset,
     88    "setEnd() must change endOffset to the new offset");
     89 }
     90 
     91 function testSetStartBefore(range, node) {
     92  var parent = node.parentNode;
     93  if (parent === null) {
     94    assert_throws_dom("INVALID_NODE_TYPE_ERR", function () {
     95      range.setStartBefore(node);
     96    }, "setStartBefore() to a node with null parent must throw INVALID_NODE_TYPE_ERR");
     97    return;
     98  }
     99 
    100  var idx = 0;
    101  while (node.parentNode.childNodes[idx] != node) {
    102    idx++;
    103  }
    104 
    105  testSetStart(range, node.parentNode, idx);
    106 }
    107 
    108 function testSetStartAfter(range, node) {
    109  var parent = node.parentNode;
    110  if (parent === null) {
    111    assert_throws_dom("INVALID_NODE_TYPE_ERR", function () {
    112      range.setStartAfter(node);
    113    }, "setStartAfter() to a node with null parent must throw INVALID_NODE_TYPE_ERR");
    114    return;
    115  }
    116 
    117  var idx = 0;
    118  while (node.parentNode.childNodes[idx] != node) {
    119    idx++;
    120  }
    121 
    122  testSetStart(range, node.parentNode, idx + 1);
    123 }
    124 
    125 function testSetEndBefore(range, node) {
    126  var parent = node.parentNode;
    127  if (parent === null) {
    128    assert_throws_dom("INVALID_NODE_TYPE_ERR", function () {
    129      range.setEndBefore(node);
    130    }, "setEndBefore() to a node with null parent must throw INVALID_NODE_TYPE_ERR");
    131    return;
    132  }
    133 
    134  var idx = 0;
    135  while (node.parentNode.childNodes[idx] != node) {
    136    idx++;
    137  }
    138 
    139  testSetEnd(range, node.parentNode, idx);
    140 }
    141 
    142 function testSetEndAfter(range, node) {
    143  var parent = node.parentNode;
    144  if (parent === null) {
    145    assert_throws_dom("INVALID_NODE_TYPE_ERR", function () {
    146      range.setEndAfter(node);
    147    }, "setEndAfter() to a node with null parent must throw INVALID_NODE_TYPE_ERR");
    148    return;
    149  }
    150 
    151  var idx = 0;
    152  while (node.parentNode.childNodes[idx] != node) {
    153    idx++;
    154  }
    155 
    156  testSetEnd(range, node.parentNode, idx + 1);
    157 }
    158 
    159 
    160 var startTests = [];
    161 var endTests = [];
    162 var startBeforeTests = [];
    163 var startAfterTests = [];
    164 var endBeforeTests = [];
    165 var endAfterTests = [];
    166 
    167 // Don't want to eval() each point a bazillion times
    168 var testPointsCached = testPoints.map(eval);
    169 var testNodesCached = testNodesShort.map(eval);
    170 
    171 for (var i = 0; i < testRangesShort.length; i++) {
    172  var endpoints = eval(testRangesShort[i]);
    173  var range;
    174  test(function() {
    175    range = ownerDocument(endpoints[0]).createRange();
    176    range.setStart(endpoints[0], endpoints[1]);
    177    range.setEnd(endpoints[2], endpoints[3]);
    178  }, "Set up range " + i + " " + testRangesShort[i]);
    179 
    180  for (var j = 0; j < testPoints.length; j++) {
    181    startTests.push(["setStart() with range " + i + " " + testRangesShort[i] + ", point " + j + " " + testPoints[j],
    182      range,
    183      testPointsCached[j][0],
    184      testPointsCached[j][1]
    185    ]);
    186    endTests.push(["setEnd() with range " + i + " " + testRangesShort[i] + ", point " + j + " " + testPoints[j],
    187      range,
    188      testPointsCached[j][0],
    189      testPointsCached[j][1]
    190    ]);
    191  }
    192 
    193  for (var j = 0; j < testNodesShort.length; j++) {
    194    startBeforeTests.push(["setStartBefore() with range " + i + " " + testRangesShort[i] + ", node " + j + " " + testNodesShort[j],
    195      range,
    196      testNodesCached[j]
    197    ]);
    198    startAfterTests.push(["setStartAfter() with range " + i + " " + testRangesShort[i] + ", node " + j + " " + testNodesShort[j],
    199      range,
    200      testNodesCached[j]
    201    ]);
    202    endBeforeTests.push(["setEndBefore() with range " + i + " " + testRangesShort[i] + ", node " + j + " " + testNodesShort[j],
    203      range,
    204      testNodesCached[j]
    205    ]);
    206    endAfterTests.push(["setEndAfter() with range " + i + " " + testRangesShort[i] + ", node " + j + " " + testNodesShort[j],
    207      range,
    208      testNodesCached[j]
    209    ]);
    210  }
    211 }
    212 
    213 generate_tests(testSetStart, startTests);
    214 generate_tests(testSetEnd, endTests);
    215 generate_tests(testSetStartBefore, startBeforeTests);
    216 generate_tests(testSetStartAfter, startAfterTests);
    217 generate_tests(testSetEndBefore, endBeforeTests);
    218 generate_tests(testSetEndAfter, endAfterTests);
    219 
    220 testDiv.style.display = "none";
    221 </script>