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>