mirror of
https://github.com/servo/servo.git
synced 2025-06-24 00:54:32 +01:00
99 lines
4.1 KiB
HTML
99 lines
4.1 KiB
HTML
<!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>
|