Range-selectNode.html (4218B)
1 <!doctype html> 2 <title>Range.selectNode() and .selectNodeContents() tests</title> 3 <link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name> 4 <meta name=timeout content=long> 5 <div id=log></div> 6 <script src=/resources/testharness.js></script> 7 <script src=/resources/testharnessreport.js></script> 8 <script src=../common.js></script> 9 <script> 10 "use strict"; 11 12 function testSelectNode(range, node) { 13 try { 14 range.collapsed; 15 } catch (e) { 16 // Range is detached 17 assert_throws_dom("INVALID_STATE_ERR", function () { 18 range.selectNode(node); 19 }, "selectNode() on a detached node must throw INVALID_STATE_ERR"); 20 assert_throws_dom("INVALID_STATE_ERR", function () { 21 range.selectNodeContents(node); 22 }, "selectNodeContents() on a detached node must throw INVALID_STATE_ERR"); 23 return; 24 } 25 26 if (!node.parentNode) { 27 assert_throws_dom("INVALID_NODE_TYPE_ERR", function() { 28 range.selectNode(node); 29 }, "selectNode() on a node with no parent must throw INVALID_NODE_TYPE_ERR"); 30 } else { 31 var index = 0; 32 while (node.parentNode.childNodes[index] != node) { 33 index++; 34 } 35 36 range.selectNode(node); 37 assert_equals(range.startContainer, node.parentNode, 38 "After selectNode(), startContainer must equal parent node"); 39 assert_equals(range.endContainer, node.parentNode, 40 "After selectNode(), endContainer must equal parent node"); 41 assert_equals(range.startOffset, index, 42 "After selectNode(), startOffset must be index of node in parent (" + index + ")"); 43 assert_equals(range.endOffset, index + 1, 44 "After selectNode(), endOffset must be one plus index of node in parent (" + (index + 1) + ")"); 45 } 46 47 if (node.nodeType == Node.DOCUMENT_TYPE_NODE) { 48 assert_throws_dom("INVALID_NODE_TYPE_ERR", function () { 49 range.selectNodeContents(node); 50 }, "selectNodeContents() on a doctype must throw INVALID_NODE_TYPE_ERR"); 51 } else { 52 range.selectNodeContents(node); 53 assert_equals(range.startContainer, node, 54 "After selectNodeContents(), startContainer must equal node"); 55 assert_equals(range.endContainer, node, 56 "After selectNodeContents(), endContainer must equal node"); 57 assert_equals(range.startOffset, 0, 58 "After selectNodeContents(), startOffset must equal 0"); 59 var len = nodeLength(node); 60 assert_equals(range.endOffset, len, 61 "After selectNodeContents(), endOffset must equal node length (" + len + ")"); 62 } 63 } 64 65 var range = document.createRange(); 66 var foreignRange = foreignDoc.createRange(); 67 var xmlRange = xmlDoc.createRange(); 68 var detachedRange = document.createRange(); 69 detachedRange.detach(); 70 var tests = []; 71 function testTree(root, marker) { 72 if (root.nodeType == Node.ELEMENT_NODE && root.id == "log") { 73 // This is being modified during the tests, so let's not test it. 74 return; 75 } 76 tests.push([marker + ": " + root.nodeName.toLowerCase() + " node, current doc's range, type " + root.nodeType, range, root]); 77 tests.push([marker + ": " + root.nodeName.toLowerCase() + " node, foreign doc's range, type " + root.nodeType, foreignRange, root]); 78 tests.push([marker + ": " + root.nodeName.toLowerCase() + " node, XML doc's range, type " + root.nodeType, xmlRange, root]); 79 tests.push([marker + ": " + root.nodeName.toLowerCase() + " node, detached range, type " + root.nodeType, detachedRange, root]); 80 for (var i = 0; i < root.childNodes.length; i++) { 81 testTree(root.childNodes[i], marker + "[" + i + "]"); 82 } 83 } 84 testTree(document, "current doc"); 85 testTree(foreignDoc, "foreign doc"); 86 testTree(detachedDiv, "detached div in current doc"); 87 88 var otherTests = ["xmlDoc", "xmlElement", "detachedTextNode", 89 "foreignTextNode", "xmlTextNode", "processingInstruction", "comment", 90 "foreignComment", "xmlComment", "docfrag", "foreignDocfrag", "xmlDocfrag"]; 91 92 for (var i = 0; i < otherTests.length; i++) { 93 testTree(window[otherTests[i]], otherTests[i]); 94 } 95 96 generate_tests(testSelectNode, tests); 97 98 testDiv.style.display = "none"; 99 </script>