| <!doctype html> | |
| <title>Range.selectNode() and .selectNodeContents() tests</title> | |
| <link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name> | |
| <meta name=timeout content=long> | |
| <div id=log></div> | |
| <script src=/resources/testharness.js></script> | |
| <script src=/resources/testharnessreport.js></script> | |
| <script src=../common.js></script> | |
| <script> | |
| "use strict"; | |
| function testSelectNode(range, node) { | |
| try { | |
| range.collapsed; | |
| } catch (e) { | |
| // Range is detached | |
| assert_throws("INVALID_STATE_ERR", function () { | |
| range.selectNode(node); | |
| }, "selectNode() on a detached node must throw INVALID_STATE_ERR"); | |
| assert_throws("INVALID_STATE_ERR", function () { | |
| range.selectNodeContents(node); | |
| }, "selectNodeContents() on a detached node must throw INVALID_STATE_ERR"); | |
| return; | |
| } | |
| if (!node.parentNode) { | |
| assert_throws("INVALID_NODE_TYPE_ERR", function() { | |
| range.selectNode(node); | |
| }, "selectNode() on a node with no parent must throw INVALID_NODE_TYPE_ERR"); | |
| } else { | |
| var index = 0; | |
| while (node.parentNode.childNodes[index] != node) { | |
| index++; | |
| } | |
| range.selectNode(node); | |
| assert_equals(range.startContainer, node.parentNode, | |
| "After selectNode(), startContainer must equal parent node"); | |
| assert_equals(range.endContainer, node.parentNode, | |
| "After selectNode(), endContainer must equal parent node"); | |
| assert_equals(range.startOffset, index, | |
| "After selectNode(), startOffset must be index of node in parent (" + index + ")"); | |
| assert_equals(range.endOffset, index + 1, | |
| "After selectNode(), endOffset must be one plus index of node in parent (" + (index + 1) + ")"); | |
| } | |
| if (node.nodeType == Node.DOCUMENT_TYPE_NODE) { | |
| assert_throws("INVALID_NODE_TYPE_ERR", function () { | |
| range.selectNodeContents(node); | |
| }, "selectNodeContents() on a doctype must throw INVALID_NODE_TYPE_ERR"); | |
| } else { | |
| range.selectNodeContents(node); | |
| assert_equals(range.startContainer, node, | |
| "After selectNodeContents(), startContainer must equal node"); | |
| assert_equals(range.endContainer, node, | |
| "After selectNodeContents(), endContainer must equal node"); | |
| assert_equals(range.startOffset, 0, | |
| "After selectNodeContents(), startOffset must equal 0"); | |
| var len = nodeLength(node); | |
| assert_equals(range.endOffset, len, | |
| "After selectNodeContents(), endOffset must equal node length (" + len + ")"); | |
| } | |
| } | |
| var range = document.createRange(); | |
| var foreignRange = foreignDoc.createRange(); | |
| var xmlRange = xmlDoc.createRange(); | |
| var detachedRange = document.createRange(); | |
| detachedRange.detach(); | |
| var tests = []; | |
| function testTree(root, marker) { | |
| if (root.nodeType == Node.ELEMENT_NODE && root.id == "log") { | |
| // This is being modified during the tests, so let's not test it. | |
| return; | |
| } | |
| tests.push([marker + root.nodeName.toLowerCase() + " node, current doc's range, type " + root.nodeType, range, root]); | |
| tests.push([marker + root.nodeName.toLowerCase() + " node, foreign doc's range, type " + root.nodeType, foreignRange, root]); | |
| tests.push([marker + root.nodeName.toLowerCase() + " node, XML doc's range, type " + root.nodeType, xmlRange, root]); | |
| tests.push([marker + root.nodeName.toLowerCase() + " node, detached range, type " + root.nodeType, detachedRange, root]); | |
| for (var i = 0; i < root.childNodes.length; i++) { | |
| testTree(root.childNodes[i], "**" + marker); | |
| } | |
| } | |
| testTree(document, " current doc: "); | |
| testTree(foreignDoc, " foreign doc: "); | |
| testTree(detachedDiv, " detached div in current doc: "); | |
| var otherTests = [xmlDoc, xmlElement, detachedTextNode, foreignTextNode, | |
| xmlTextNode, processingInstruction, comment, foreignComment, xmlComment, | |
| docfrag, foreignDocfrag, xmlDocfrag]; | |
| for (var i = 0; i < otherTests.length; i++) { | |
| testTree(otherTests[i], " "); | |
| } | |
| generate_tests(testSelectNode, tests); | |
| testDiv.style.display = "none"; | |
| </script> |