| <!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 + "[" + i + "]"); |
| } |
| } |
| 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(window[otherTests[i]], otherTests[i]); |
| } |
| |
| generate_tests(testSelectNode, tests); |
| |
| testDiv.style.display = "none"; |
| </script> |