summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/dom/ranges
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2021-02-25 01:03:57 +0000
committerMoonchild <moonchild@palemoon.org>2021-02-25 01:03:57 +0000
commitceadffab6b357723981a429e11222daf6cd6dcfb (patch)
tree5603053048d6a460f79b22bdf165fb74d32d39b0 /testing/web-platform/tests/dom/ranges
parent14fb2f966e9b54598c451e3cb35b4aa0480dafed (diff)
parentad5a13bd501e379517da1a944c104a11d951a3f5 (diff)
downloadUXP-RC_20210225.tar
UXP-RC_20210225.tar.gz
UXP-RC_20210225.tar.lz
UXP-RC_20210225.tar.xz
UXP-RC_20210225.zip
Merge branch 'master' into releaseRC_20210225
Diffstat (limited to 'testing/web-platform/tests/dom/ranges')
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-attributes.html23
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-cloneContents.html457
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-cloneRange.html112
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-collapse.html75
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-commonAncestorContainer-2.html33
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-commonAncestorContainer.html40
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-compareBoundaryPoints.html182
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-comparePoint-2.html23
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-comparePoint.html92
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-constructor.html20
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-deleteContents.html337
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-detach.html14
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-extractContents.html248
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-insertNode.html286
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-intersectsNode-binding.html25
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-intersectsNode.html70
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-isPointInRange.html83
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-mutations.html950
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-selectNode.html99
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-set.html221
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-stringifier.html44
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-surroundContents.html324
-rw-r--r--testing/web-platform/tests/dom/ranges/Range-test-iframe.html56
23 files changed, 0 insertions, 3814 deletions
diff --git a/testing/web-platform/tests/dom/ranges/Range-attributes.html b/testing/web-platform/tests/dom/ranges/Range-attributes.html
deleted file mode 100644
index ced47edc5..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-attributes.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<title>Range attributes</title>
-<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<div id=log></div>
-<script>
-test(function() {
- var r = document.createRange();
- assert_equals(r.startContainer, document)
- assert_equals(r.endContainer, document)
- assert_equals(r.startOffset, 0)
- assert_equals(r.endOffset, 0)
- assert_true(r.collapsed)
- r.detach()
- assert_equals(r.startContainer, document)
- assert_equals(r.endContainer, document)
- assert_equals(r.startOffset, 0)
- assert_equals(r.endOffset, 0)
- assert_true(r.collapsed)
-})
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-cloneContents.html b/testing/web-platform/tests/dom/ranges/Range-cloneContents.html
deleted file mode 100644
index bf75c9204..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-cloneContents.html
+++ /dev/null
@@ -1,457 +0,0 @@
-<!doctype html>
-<title>Range.cloneContents() tests</title>
-<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
-<meta name=timeout content=long>
-<p>To debug test failures, add a query parameter "subtest" with the test id (like
-"?subtest=5"). Only that test will be run. Then you can look at the resulting
-iframe in the DOM.
-<div id=log></div>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=../common.js></script>
-<script>
-"use strict";
-
-testDiv.parentNode.removeChild(testDiv);
-
-var actualIframe = document.createElement("iframe");
-actualIframe.style.display = "none";
-document.body.appendChild(actualIframe);
-
-var expectedIframe = document.createElement("iframe");
-expectedIframe.style.display = "none";
-document.body.appendChild(expectedIframe);
-
-function myCloneContents(range) {
- // "Let frag be a new DocumentFragment whose ownerDocument is the same as
- // the ownerDocument of the context object's start node."
- var ownerDoc = range.startContainer.nodeType == Node.DOCUMENT_NODE
- ? range.startContainer
- : range.startContainer.ownerDocument;
- var frag = ownerDoc.createDocumentFragment();
-
- // "If the context object's start and end are the same, abort this method,
- // returning frag."
- if (range.startContainer == range.endContainer
- && range.startOffset == range.endOffset) {
- return frag;
- }
-
- // "Let original start node, original start offset, original end node, and
- // original end offset be the context object's start and end nodes and
- // offsets, respectively."
- var originalStartNode = range.startContainer;
- var originalStartOffset = range.startOffset;
- var originalEndNode = range.endContainer;
- var originalEndOffset = range.endOffset;
-
- // "If original start node and original end node are the same, and they are
- // a Text, ProcessingInstruction, or Comment node:"
- if (range.startContainer == range.endContainer
- && (range.startContainer.nodeType == Node.TEXT_NODE
- || range.startContainer.nodeType == Node.COMMENT_NODE
- || range.startContainer.nodeType == Node.PROCESSING_INSTRUCTION_NODE)) {
- // "Let clone be the result of calling cloneNode(false) on original
- // start node."
- var clone = originalStartNode.cloneNode(false);
-
- // "Set the data of clone to the result of calling
- // substringData(original start offset, original end offset − original
- // start offset) on original start node."
- clone.data = originalStartNode.substringData(originalStartOffset,
- originalEndOffset - originalStartOffset);
-
- // "Append clone as the last child of frag."
- frag.appendChild(clone);
-
- // "Abort this method, returning frag."
- return frag;
- }
-
- // "Let common ancestor equal original start node."
- var commonAncestor = originalStartNode;
-
- // "While common ancestor is not an ancestor container of original end
- // node, set common ancestor to its own parent."
- while (!isAncestorContainer(commonAncestor, originalEndNode)) {
- commonAncestor = commonAncestor.parentNode;
- }
-
- // "If original start node is an ancestor container of original end node,
- // let first partially contained child be null."
- var firstPartiallyContainedChild;
- if (isAncestorContainer(originalStartNode, originalEndNode)) {
- firstPartiallyContainedChild = null;
- // "Otherwise, let first partially contained child be the first child of
- // common ancestor that is partially contained in the context object."
- } else {
- for (var i = 0; i < commonAncestor.childNodes.length; i++) {
- if (isPartiallyContained(commonAncestor.childNodes[i], range)) {
- firstPartiallyContainedChild = commonAncestor.childNodes[i];
- break;
- }
- }
- if (!firstPartiallyContainedChild) {
- throw "Spec bug: no first partially contained child!";
- }
- }
-
- // "If original end node is an ancestor container of original start node,
- // let last partially contained child be null."
- var lastPartiallyContainedChild;
- if (isAncestorContainer(originalEndNode, originalStartNode)) {
- lastPartiallyContainedChild = null;
- // "Otherwise, let last partially contained child be the last child of
- // common ancestor that is partially contained in the context object."
- } else {
- for (var i = commonAncestor.childNodes.length - 1; i >= 0; i--) {
- if (isPartiallyContained(commonAncestor.childNodes[i], range)) {
- lastPartiallyContainedChild = commonAncestor.childNodes[i];
- break;
- }
- }
- if (!lastPartiallyContainedChild) {
- throw "Spec bug: no last partially contained child!";
- }
- }
-
- // "Let contained children be a list of all children of common ancestor
- // that are contained in the context object, in tree order."
- //
- // "If any member of contained children is a DocumentType, raise a
- // HIERARCHY_REQUEST_ERR exception and abort these steps."
- var containedChildren = [];
- for (var i = 0; i < commonAncestor.childNodes.length; i++) {
- if (isContained(commonAncestor.childNodes[i], range)) {
- if (commonAncestor.childNodes[i].nodeType
- == Node.DOCUMENT_TYPE_NODE) {
- return "HIERARCHY_REQUEST_ERR";
- }
- containedChildren.push(commonAncestor.childNodes[i]);
- }
- }
-
- // "If first partially contained child is a Text, ProcessingInstruction, or Comment node:"
- if (firstPartiallyContainedChild
- && (firstPartiallyContainedChild.nodeType == Node.TEXT_NODE
- || firstPartiallyContainedChild.nodeType == Node.COMMENT_NODE
- || firstPartiallyContainedChild.nodeType == Node.PROCESSING_INSTRUCTION_NODE)) {
- // "Let clone be the result of calling cloneNode(false) on original
- // start node."
- var clone = originalStartNode.cloneNode(false);
-
- // "Set the data of clone to the result of calling substringData() on
- // original start node, with original start offset as the first
- // argument and (length of original start node − original start offset)
- // as the second."
- clone.data = originalStartNode.substringData(originalStartOffset,
- nodeLength(originalStartNode) - originalStartOffset);
-
- // "Append clone as the last child of frag."
- frag.appendChild(clone);
- // "Otherwise, if first partially contained child is not null:"
- } else if (firstPartiallyContainedChild) {
- // "Let clone be the result of calling cloneNode(false) on first
- // partially contained child."
- var clone = firstPartiallyContainedChild.cloneNode(false);
-
- // "Append clone as the last child of frag."
- frag.appendChild(clone);
-
- // "Let subrange be a new Range whose start is (original start node,
- // original start offset) and whose end is (first partially contained
- // child, length of first partially contained child)."
- var subrange = ownerDoc.createRange();
- subrange.setStart(originalStartNode, originalStartOffset);
- subrange.setEnd(firstPartiallyContainedChild,
- nodeLength(firstPartiallyContainedChild));
-
- // "Let subfrag be the result of calling cloneContents() on
- // subrange."
- var subfrag = myCloneContents(subrange);
-
- // "For each child of subfrag, in order, append that child to clone as
- // its last child."
- for (var i = 0; i < subfrag.childNodes.length; i++) {
- clone.appendChild(subfrag.childNodes[i]);
- }
- }
-
- // "For each contained child in contained children:"
- for (var i = 0; i < containedChildren.length; i++) {
- // "Let clone be the result of calling cloneNode(true) of contained
- // child."
- var clone = containedChildren[i].cloneNode(true);
-
- // "Append clone as the last child of frag."
- frag.appendChild(clone);
- }
-
- // "If last partially contained child is a Text, ProcessingInstruction, or Comment node:"
- if (lastPartiallyContainedChild
- && (lastPartiallyContainedChild.nodeType == Node.TEXT_NODE
- || lastPartiallyContainedChild.nodeType == Node.COMMENT_NODE
- || lastPartiallyContainedChild.nodeType == Node.PROCESSING_INSTRUCTION_NODE)) {
- // "Let clone be the result of calling cloneNode(false) on original
- // end node."
- var clone = originalEndNode.cloneNode(false);
-
- // "Set the data of clone to the result of calling substringData(0,
- // original end offset) on original end node."
- clone.data = originalEndNode.substringData(0, originalEndOffset);
-
- // "Append clone as the last child of frag."
- frag.appendChild(clone);
- // "Otherwise, if last partially contained child is not null:"
- } else if (lastPartiallyContainedChild) {
- // "Let clone be the result of calling cloneNode(false) on last
- // partially contained child."
- var clone = lastPartiallyContainedChild.cloneNode(false);
-
- // "Append clone as the last child of frag."
- frag.appendChild(clone);
-
- // "Let subrange be a new Range whose start is (last partially
- // contained child, 0) and whose end is (original end node, original
- // end offset)."
- var subrange = ownerDoc.createRange();
- subrange.setStart(lastPartiallyContainedChild, 0);
- subrange.setEnd(originalEndNode, originalEndOffset);
-
- // "Let subfrag be the result of calling cloneContents() on
- // subrange."
- var subfrag = myCloneContents(subrange);
-
- // "For each child of subfrag, in order, append that child to clone as
- // its last child."
- for (var i = 0; i < subfrag.childNodes.length; i++) {
- clone.appendChild(subfrag.childNodes[i]);
- }
- }
-
- // "Return frag."
- return frag;
-}
-
-function restoreIframe(iframe, i) {
- // Most of this function is designed to work around the fact that Opera
- // doesn't let you add a doctype to a document that no longer has one, in
- // any way I can figure out. I eventually compromised on something that
- // will still let Opera pass most tests that don't actually involve
- // doctypes.
- while (iframe.contentDocument.firstChild
- && iframe.contentDocument.firstChild.nodeType != Node.DOCUMENT_TYPE_NODE) {
- iframe.contentDocument.removeChild(iframe.contentDocument.firstChild);
- }
-
- while (iframe.contentDocument.lastChild
- && iframe.contentDocument.lastChild.nodeType != Node.DOCUMENT_TYPE_NODE) {
- iframe.contentDocument.removeChild(iframe.contentDocument.lastChild);
- }
-
- if (!iframe.contentDocument.firstChild) {
- // This will throw an exception in Opera if we reach here, which is why
- // I try to avoid it. It will never happen in a browser that obeys the
- // spec, so it's really just insurance. I don't think it actually gets
- // hit by anything.
- iframe.contentDocument.appendChild(iframe.contentDocument.implementation.createDocumentType("html", "", ""));
- }
- iframe.contentDocument.appendChild(referenceDoc.documentElement.cloneNode(true));
- iframe.contentWindow.setupRangeTests();
- iframe.contentWindow.testRangeInput = testRanges[i];
- iframe.contentWindow.run();
-}
-
-function testCloneContents(i) {
- restoreIframe(actualIframe, i);
- restoreIframe(expectedIframe, i);
-
- var actualRange = actualIframe.contentWindow.testRange;
- var expectedRange = expectedIframe.contentWindow.testRange;
- var actualFrag, expectedFrag;
- var actualRoots, expectedRoots;
-
- domTests[i].step(function() {
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual cloneContents()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated cloneContents()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
-
- // NOTE: We could just assume that cloneContents() doesn't change
- // anything. That would simplify these tests, taken in isolation. But
- // once we've already set up the whole apparatus for extractContents()
- // and deleteContents(), we just reuse it here, on the theory of "why
- // not test some more stuff if it's easy to do".
- //
- // Just to be pedantic, we'll test not only that the tree we're
- // modifying is the same in expected vs. actual, but also that all the
- // nodes originally in it were the same. Typically some nodes will
- // become detached when the algorithm is run, but they still exist and
- // references can still be kept to them, so they should also remain the
- // same.
- //
- // We initialize the list to all nodes, and later on remove all the
- // ones which still have parents, since the parents will presumably be
- // tested for isEqualNode() and checking the children would be
- // redundant.
- var actualAllNodes = [];
- var node = furthestAncestor(actualRange.startContainer);
- do {
- actualAllNodes.push(node);
- } while (node = nextNode(node));
-
- var expectedAllNodes = [];
- var node = furthestAncestor(expectedRange.startContainer);
- do {
- expectedAllNodes.push(node);
- } while (node = nextNode(node));
-
- expectedFrag = myCloneContents(expectedRange);
- if (typeof expectedFrag == "string") {
- assert_throws(expectedFrag, function() {
- actualRange.cloneContents();
- });
- } else {
- actualFrag = actualRange.cloneContents();
- }
-
- actualRoots = [];
- for (var j = 0; j < actualAllNodes.length; j++) {
- if (!actualAllNodes[j].parentNode) {
- actualRoots.push(actualAllNodes[j]);
- }
- }
-
- expectedRoots = [];
- for (var j = 0; j < expectedAllNodes.length; j++) {
- if (!expectedAllNodes[j].parentNode) {
- expectedRoots.push(expectedAllNodes[j]);
- }
- }
-
- for (var j = 0; j < actualRoots.length; j++) {
- assertNodesEqual(actualRoots[j], expectedRoots[j], j ? "detached node #" + j : "tree root");
-
- if (j == 0) {
- // Clearly something is wrong if the node lists are different
- // lengths. We want to report this only after we've already
- // checked the main tree for equality, though, so it doesn't
- // mask more interesting errors.
- assert_equals(actualRoots.length, expectedRoots.length,
- "Actual and expected DOMs were broken up into a different number of pieces by cloneContents() (this probably means you created or detached nodes when you weren't supposed to)");
- }
- }
- });
- domTests[i].done();
-
- positionTests[i].step(function() {
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual cloneContents()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated cloneContents()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
-
- assert_true(actualRoots[0].isEqualNode(expectedRoots[0]),
- "The resulting DOMs were not equal, so comparing positions makes no sense");
-
- if (typeof expectedFrag == "string") {
- // It's no longer true that, e.g., startContainer and endContainer
- // must always be the same
- return;
- }
-
- assert_equals(actualRange.startOffset, expectedRange.startOffset,
- "Unexpected startOffset after cloneContents()");
- // How do we decide that the two nodes are equal, since they're in
- // different trees? Since the DOMs are the same, it's enough to check
- // that the index in the parent is the same all the way up the tree.
- // But we can first cheat by just checking they're actually equal.
- assert_true(actualRange.startContainer.isEqualNode(expectedRange.startContainer),
- "Unexpected startContainer after cloneContents(), expected " +
- expectedRange.startContainer.nodeName.toLowerCase() + " but got " +
- actualRange.startContainer.nodeName.toLowerCase());
- var currentActual = actualRange.startContainer;
- var currentExpected = expectedRange.startContainer;
- var actual = "";
- var expected = "";
- while (currentActual && currentExpected) {
- actual = indexOf(currentActual) + "-" + actual;
- expected = indexOf(currentExpected) + "-" + expected;
-
- currentActual = currentActual.parentNode;
- currentExpected = currentExpected.parentNode;
- }
- actual = actual.substr(0, actual.length - 1);
- expected = expected.substr(0, expected.length - 1);
- assert_equals(actual, expected,
- "startContainer superficially looks right but is actually the wrong node if you trace back its index in all its ancestors (I'm surprised this actually happened");
- });
- positionTests[i].done();
-
- fragTests[i].step(function() {
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual cloneContents()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated cloneContents()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
-
- if (typeof expectedFrag == "string") {
- // Comparing makes no sense
- return;
- }
- assertNodesEqual(actualFrag, expectedFrag,
- "returned fragment");
- });
- fragTests[i].done();
-}
-
-// First test a Range that has the no-op detach() called on it, synchronously
-test(function() {
- var range = document.createRange();
- range.detach();
- assert_array_equals(range.cloneContents().childNodes, []);
-}, "Range.detach()");
-
-var iStart = 0;
-var iStop = testRanges.length;
-
-if (/subtest=[0-9]+/.test(location.search)) {
- var matches = /subtest=([0-9]+)/.exec(location.search);
- iStart = Number(matches[1]);
- iStop = Number(matches[1]) + 1;
-}
-
-var domTests = [];
-var positionTests = [];
-var fragTests = [];
-
-for (var i = iStart; i < iStop; i++) {
- domTests[i] = async_test("Resulting DOM for range " + i + " " + testRanges[i]);
- positionTests[i] = async_test("Resulting cursor position for range " + i + " " + testRanges[i]);
- fragTests[i] = async_test("Returned fragment for range " + i + " " + testRanges[i]);
-}
-
-var referenceDoc = document.implementation.createHTMLDocument("");
-referenceDoc.removeChild(referenceDoc.documentElement);
-
-actualIframe.onload = function() {
- expectedIframe.onload = function() {
- for (var i = iStart; i < iStop; i++) {
- testCloneContents(i);
- }
- }
- expectedIframe.src = "Range-test-iframe.html";
- referenceDoc.appendChild(actualIframe.contentDocument.documentElement.cloneNode(true));
-}
-actualIframe.src = "Range-test-iframe.html";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-cloneRange.html b/testing/web-platform/tests/dom/ranges/Range-cloneRange.html
deleted file mode 100644
index 6c736df29..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-cloneRange.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!doctype html>
-<title>Range.cloneRange() and document.createRange() 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 testCloneRange(rangeEndpoints) {
- var range;
- if (rangeEndpoints == "detached") {
- range = document.createRange();
- range.detach();
- var clonedRange = range.cloneRange();
- assert_equals(clonedRange.startContainer, range.startContainer,
- "startContainers must be equal after cloneRange()");
- assert_equals(clonedRange.startOffset, range.startOffset,
- "startOffsets must be equal after cloneRange()");
- assert_equals(clonedRange.endContainer, range.endContainer,
- "endContainers must be equal after cloneRange()");
- assert_equals(clonedRange.endOffset, range.endOffset,
- "endOffsets must be equal after cloneRange()");
- return;
- }
-
- // Have to account for Ranges involving Documents! We could just create
- // the Range from the current document unconditionally, but some browsers
- // (WebKit) don't implement setStart() and setEnd() per spec and will throw
- // spurious exceptions at the time of this writing. No need to mask other
- // bugs.
- var ownerDoc = rangeEndpoints[0].nodeType == Node.DOCUMENT_NODE
- ? rangeEndpoints[0]
- : rangeEndpoints[0].ownerDocument;
- range = ownerDoc.createRange();
- // Here we throw in some createRange() tests, because why not. Have to
- // test it someplace.
- assert_equals(range.startContainer, ownerDoc,
- "doc.createRange() must create Range whose startContainer is doc");
- assert_equals(range.endContainer, ownerDoc,
- "doc.createRange() must create Range whose endContainer is doc");
- assert_equals(range.startOffset, 0,
- "doc.createRange() must create Range whose startOffset is 0");
- assert_equals(range.endOffset, 0,
- "doc.createRange() must create Range whose endOffset is 0");
-
- range.setStart(rangeEndpoints[0], rangeEndpoints[1]);
- range.setEnd(rangeEndpoints[2], rangeEndpoints[3]);
-
- // Make sure we bail out now if setStart or setEnd are buggy, so it doesn't
- // create misleading failures later.
- assert_equals(range.startContainer, rangeEndpoints[0],
- "Sanity check on setStart()");
- assert_equals(range.startOffset, rangeEndpoints[1],
- "Sanity check on setStart()");
- assert_equals(range.endContainer, rangeEndpoints[2],
- "Sanity check on setEnd()");
- assert_equals(range.endOffset, rangeEndpoints[3],
- "Sanity check on setEnd()");
-
- var clonedRange = range.cloneRange();
-
- assert_equals(clonedRange.startContainer, range.startContainer,
- "startContainers must be equal after cloneRange()");
- assert_equals(clonedRange.startOffset, range.startOffset,
- "startOffsets must be equal after cloneRange()");
- assert_equals(clonedRange.endContainer, range.endContainer,
- "endContainers must be equal after cloneRange()");
- assert_equals(clonedRange.endOffset, range.endOffset,
- "endOffsets must be equal after cloneRange()");
-
- // Make sure that modifying one doesn't affect the other.
- var testNode1 = ownerDoc.createTextNode("testing");
- var testNode2 = ownerDoc.createTextNode("testing with different length");
-
- range.setStart(testNode1, 1);
- range.setEnd(testNode1, 2);
- assert_equals(clonedRange.startContainer, rangeEndpoints[0],
- "Modifying a Range must not modify its clone's startContainer");
- assert_equals(clonedRange.startOffset, rangeEndpoints[1],
- "Modifying a Range must not modify its clone's startOffset");
- assert_equals(clonedRange.endContainer, rangeEndpoints[2],
- "Modifying a Range must not modify its clone's endContainer");
- assert_equals(clonedRange.endOffset, rangeEndpoints[3],
- "Modifying a Range must not modify its clone's endOffset");
-
- clonedRange.setStart(testNode2, 3);
- clonedRange.setStart(testNode2, 4);
-
- assert_equals(range.startContainer, testNode1,
- "Modifying a clone must not modify the original Range's startContainer");
- assert_equals(range.startOffset, 1,
- "Modifying a clone must not modify the original Range's startOffset");
- assert_equals(range.endContainer, testNode1,
- "Modifying a clone must not modify the original Range's endContainer");
- assert_equals(range.endOffset, 2,
- "Modifying a clone must not modify the original Range's endOffset");
-}
-
-var tests = [];
-for (var i = 0; i < testRanges.length; i++) {
- tests.push([
- "Range " + i + " " + testRanges[i],
- eval(testRanges[i])
- ]);
-}
-generate_tests(testCloneRange, tests);
-
-testDiv.style.display = "none";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-collapse.html b/testing/web-platform/tests/dom/ranges/Range-collapse.html
deleted file mode 100644
index 78e1d9fb4..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-collapse.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!doctype html>
-<title>Range.collapse() and .collapsed 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 testCollapse(rangeEndpoints, toStart) {
- var range;
- if (rangeEndpoints == "detached") {
- range = document.createRange();
- range.detach(); // should be a no-op and therefore the following should not throw
- range.collapse(toStart);
- assert_equals(true, range.collapsed);
- }
-
- // Have to account for Ranges involving Documents!
- var ownerDoc = rangeEndpoints[0].nodeType == Node.DOCUMENT_NODE
- ? rangeEndpoints[0]
- : rangeEndpoints[0].ownerDocument;
- range = ownerDoc.createRange();
- range.setStart(rangeEndpoints[0], rangeEndpoints[1]);
- range.setEnd(rangeEndpoints[2], rangeEndpoints[3]);
-
- var expectedContainer = toStart ? range.startContainer : range.endContainer;
- var expectedOffset = toStart ? range.startOffset : range.endOffset;
-
- assert_equals(range.collapsed, range.startContainer == range.endContainer
- && range.startOffset == range.endOffset,
- "collapsed must be true if and only if the start and end are equal");
-
- if (toStart === undefined) {
- range.collapse();
- } else {
- range.collapse(toStart);
- }
-
- assert_equals(range.startContainer, expectedContainer,
- "Wrong startContainer");
- assert_equals(range.endContainer, expectedContainer,
- "Wrong endContainer");
- assert_equals(range.startOffset, expectedOffset,
- "Wrong startOffset");
- assert_equals(range.endOffset, expectedOffset,
- "Wrong endOffset");
- assert_true(range.collapsed,
- ".collapsed must be set after .collapsed()");
-}
-
-var tests = [];
-for (var i = 0; i < testRanges.length; i++) {
- tests.push([
- "Range " + i + " " + testRanges[i] + ", toStart true",
- eval(testRanges[i]),
- true
- ]);
- tests.push([
- "Range " + i + " " + testRanges[i] + ", toStart false",
- eval(testRanges[i]),
- false
- ]);
- tests.push([
- "Range " + i + " " + testRanges[i] + ", toStart omitted",
- eval(testRanges[i]),
- undefined
- ]);
-}
-generate_tests(testCollapse, tests);
-
-testDiv.style.display = "none";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-commonAncestorContainer-2.html b/testing/web-platform/tests/dom/ranges/Range-commonAncestorContainer-2.html
deleted file mode 100644
index f0a3e451c..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-commonAncestorContainer-2.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!doctype html>
-<title>Range.commonAncestorContainer</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<div id=log></div>
-<script>
-test(function() {
- var range = document.createRange();
- range.detach();
- assert_equals(range.commonAncestorContainer, document);
-}, "Detached Range")
-test(function() {
- var df = document.createDocumentFragment();
- var foo = df.appendChild(document.createElement("foo"));
- foo.appendChild(document.createTextNode("Foo"));
- var bar = df.appendChild(document.createElement("bar"));
- bar.appendChild(document.createComment("Bar"));
- [
- // start node, start offset, end node, end offset, expected cAC
- [foo, 0, bar, 0, df],
- [foo, 0, foo.firstChild, 3, foo],
- [foo.firstChild, 0, bar, 0, df],
- [foo.firstChild, 3, bar.firstChild, 2, df]
- ].forEach(function(t) {
- test(function() {
- var range = document.createRange();
- range.setStart(t[0], t[1]);
- range.setEnd(t[2], t[3]);
- assert_equals(range.commonAncestorContainer, t[4]);
- })
- });
-}, "Normal Ranges")
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-commonAncestorContainer.html b/testing/web-platform/tests/dom/ranges/Range-commonAncestorContainer.html
deleted file mode 100644
index 7882ccc31..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-commonAncestorContainer.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!doctype html>
-<title>Range.commonAncestorContainer 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";
-
-testRanges.unshift("[detached]");
-
-for (var i = 0; i < testRanges.length; i++) {
- test(function() {
- var range;
- if (i == 0) {
- range = document.createRange();
- range.detach();
- } else {
- range = rangeFromEndpoints(eval(testRanges[i]));
- }
-
- // "Let container be start node."
- var container = range.startContainer;
-
- // "While container is not an inclusive ancestor of end node, let
- // container be container's parent."
- while (container != range.endContainer
- && !isAncestor(container, range.endContainer)) {
- container = container.parentNode;
- }
-
- // "Return container."
- assert_equals(range.commonAncestorContainer, container);
- }, i + ": range " + testRanges[i]);
-}
-
-testDiv.style.display = "none";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-compareBoundaryPoints.html b/testing/web-platform/tests/dom/ranges/Range-compareBoundaryPoints.html
deleted file mode 100644
index 48413ecd8..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-compareBoundaryPoints.html
+++ /dev/null
@@ -1,182 +0,0 @@
-<!doctype html>
-<title>Range.compareBoundaryPoints() 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";
-
-var testRangesCached = [];
-testRangesCached.push(document.createRange());
-testRangesCached[0].detach();
-for (var i = 0; i < testRangesShort.length; i++) {
- try {
- testRangesCached.push(rangeFromEndpoints(eval(testRangesShort[i])));
- } catch(e) {
- testRangesCached.push(null);
- }
-}
-
-var testRangesCachedClones = [];
-testRangesCachedClones.push(document.createRange());
-testRangesCachedClones[0].detach();
-for (var i = 1; i < testRangesCached.length; i++) {
- if (testRangesCached[i]) {
- testRangesCachedClones.push(testRangesCached[i].cloneRange());
- } else {
- testRangesCachedClones.push(null);
- }
-}
-
-// We want to run a whole bunch of extra tests with invalid "how" values (not
-// 0-3), but it's excessive to run them for every single pair of ranges --
-// there are too many of them. So just run them for a handful of the tests.
-var extraTests = [0, // detached
- 1 + testRanges.indexOf("[paras[0].firstChild, 2, paras[0].firstChild, 8]"),
- 1 + testRanges.indexOf("[paras[0].firstChild, 3, paras[3], 1]"),
- 1 + testRanges.indexOf("[testDiv, 0, comment, 5]"),
- 1 + testRanges.indexOf("[foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]")];
-
-for (var i = 0; i < testRangesCached.length; i++) {
- var range1 = testRangesCached[i];
- var range1Desc = i + " " + (i == 0 ? "[detached]" : testRanges[i - 1]);
- for (var j = 0; j <= testRangesCachedClones.length; j++) {
- var range2;
- var range2Desc;
- if (j == testRangesCachedClones.length) {
- range2 = range1;
- range2Desc = "same as first range";
- } else {
- range2 = testRangesCachedClones[j];
- range2Desc = j + " " + (j == 0 ? "[detached]" : testRanges[j - 1]);
- }
-
- var hows = [Range.START_TO_START, Range.START_TO_END, Range.END_TO_END,
- Range.END_TO_START];
- if (extraTests.indexOf(i) != -1 && extraTests.indexOf(j) != -1) {
- // TODO: Make some type of reusable utility function to do this
- // work.
- hows.push(-1, 4, 5, NaN, -0, +Infinity, -Infinity);
- [65536, -65536, 65536*65536, 0.5, -0.5, -72.5].forEach(function(addend) {
- hows.push(-1 + addend, 0 + addend, 1 + addend,
- 2 + addend, 3 + addend, 4 + addend);
- });
- hows.forEach(function(how) { hows.push(String(how)) });
- hows.push("6.5536e4", null, undefined, true, false, "", "quasit");
- }
-
- for (var k = 0; k < hows.length; k++) {
- var how = hows[k];
- test(function() {
- assert_not_equals(range1, null,
- "Creating context range threw an exception");
- assert_not_equals(range2, null,
- "Creating argument range threw an exception");
-
- // Convert how per WebIDL. TODO: Make some type of reusable
- // utility function to do this work.
- // "Let number be the result of calling ToNumber on the input
- // argument."
- var convertedHow = Number(how);
-
- // "If number is NaN, +0, −0, +∞, or −∞, return +0."
- if (isNaN(convertedHow)
- || convertedHow == 0
- || convertedHow == Infinity
- || convertedHow == -Infinity) {
- convertedHow = 0;
- } else {
- // "Let posInt be sign(number) * floor(abs(number))."
- var posInt = (convertedHow < 0 ? -1 : 1) * Math.floor(Math.abs(convertedHow));
-
- // "Let int16bit be posInt modulo 2^16; that is, a finite
- // integer value k of Number type with positive sign and
- // less than 2^16 in magnitude such that the mathematical
- // difference of posInt and k is mathematically an integer
- // multiple of 2^16."
- //
- // "Return int16bit."
- convertedHow = posInt % 65536;
- if (convertedHow < 0) {
- convertedHow += 65536;
- }
- }
-
- // Now to the actual algorithm.
- // "If how is not one of
- // START_TO_START,
- // START_TO_END,
- // END_TO_END, and
- // END_TO_START,
- // throw a "NotSupportedError" exception and terminate these
- // steps."
- if (convertedHow != Range.START_TO_START
- && convertedHow != Range.START_TO_END
- && convertedHow != Range.END_TO_END
- && convertedHow != Range.END_TO_START) {
- assert_throws("NOT_SUPPORTED_ERR", function() {
- range1.compareBoundaryPoints(how, range2);
- }, "NotSupportedError required if first parameter doesn't convert to 0-3 per WebIDL");
- return;
- }
-
- // "If context object's root is not the same as sourceRange's
- // root, throw a "WrongDocumentError" exception and terminate
- // these steps."
- if (furthestAncestor(range1.startContainer) != furthestAncestor(range2.startContainer)) {
- assert_throws("WRONG_DOCUMENT_ERR", function() {
- range1.compareBoundaryPoints(how, range2);
- }, "WrongDocumentError required if the ranges don't share a root");
- return;
- }
-
- // "If how is:
- // START_TO_START:
- // Let this point be the context object's start.
- // Let other point be sourceRange's start.
- // START_TO_END:
- // Let this point be the context object's end.
- // Let other point be sourceRange's start.
- // END_TO_END:
- // Let this point be the context object's end.
- // Let other point be sourceRange's end.
- // END_TO_START:
- // Let this point be the context object's start.
- // Let other point be sourceRange's end."
- var thisPoint = convertedHow == Range.START_TO_START || convertedHow == Range.END_TO_START
- ? [range1.startContainer, range1.startOffset]
- : [range1.endContainer, range1.endOffset];
- var otherPoint = convertedHow == Range.START_TO_START || convertedHow == Range.START_TO_END
- ? [range2.startContainer, range2.startOffset]
- : [range2.endContainer, range2.endOffset];
-
- // "If the position of this point relative to other point is
- // before
- // Return −1.
- // equal
- // Return 0.
- // after
- // Return 1."
- var position = getPosition(thisPoint[0], thisPoint[1], otherPoint[0], otherPoint[1]);
- var expected;
- if (position == "before") {
- expected = -1;
- } else if (position == "equal") {
- expected = 0;
- } else if (position == "after") {
- expected = 1;
- }
-
- assert_equals(range1.compareBoundaryPoints(how, range2), expected,
- "Wrong return value");
- }, i + "," + j + "," + k + ": context range " + range1Desc + ", argument range " + range2Desc + ", how " + format_value(how));
- }
- }
-}
-
-testDiv.style.display = "none";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-comparePoint-2.html b/testing/web-platform/tests/dom/ranges/Range-comparePoint-2.html
deleted file mode 100644
index 356c8d351..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-comparePoint-2.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<title>Range.comparePoint</title>
-<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<div id=log></div>
-<script>
-test(function() {
- var r = document.createRange();
- r.detach()
- assert_equals(r.comparePoint(document.body, 0), 1)
-})
-test(function() {
- var r = document.createRange();
- assert_throws(new TypeError(), function() { r.comparePoint(null, 0) })
-})
-test(function() {
- var doc = document.implementation.createHTMLDocument("tralala")
- var r = document.createRange();
- assert_throws("WRONG_DOCUMENT_ERR", function() { r.comparePoint(doc.body, 0) })
-})
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-comparePoint.html b/testing/web-platform/tests/dom/ranges/Range-comparePoint.html
deleted file mode 100644
index 95264796b..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-comparePoint.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!doctype html>
-<title>Range.comparePoint() 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";
-
-// Will be filled in on the first run for that range
-var testRangesCached = [];
-
-for (var i = 0; i < testPoints.length; i++) {
- var node = eval(testPoints[i])[0];
- var offset = eval(testPoints[i])[1];
-
- // comparePoint is an unsigned long, so per WebIDL, we need to treat it as
- // though it wrapped to an unsigned 32-bit integer.
- var normalizedOffset = offset % Math.pow(2, 32);
- if (normalizedOffset < 0) {
- normalizedOffset += Math.pow(2, 32);
- }
-
- for (var j = 0; j < testRanges.length; j++) {
- test(function() {
- if (testRangesCached[j] === undefined) {
- try {
- testRangesCached[j] = rangeFromEndpoints(eval(testRanges[i]));
- } catch(e) {
- testRangesCached[j] = null;
- }
- }
- assert_not_equals(testRangesCached[j], null,
- "Setting up the range failed");
-
- var range = testRangesCached[j].cloneRange();
-
- // "If node's root is different from the context object's root,
- // throw a "WrongDocumentError" exception and terminate these
- // steps."
- if (furthestAncestor(node) !== furthestAncestor(range.startContainer)) {
- assert_throws("WRONG_DOCUMENT_ERR", function() {
- range.comparePoint(node, offset);
- }, "Must throw WrongDocumentError if node and range have different roots");
- return;
- }
-
- // "If node is a doctype, throw an "InvalidNodeTypeError" exception
- // and terminate these steps."
- if (node.nodeType == Node.DOCUMENT_TYPE_NODE) {
- assert_throws("INVALID_NODE_TYPE_ERR", function() {
- range.comparePoint(node, offset);
- }, "Must throw InvalidNodeTypeError if node is a doctype");
- return;
- }
-
- // "If offset is greater than node's length, throw an
- // "IndexSizeError" exception and terminate these steps."
- if (normalizedOffset > nodeLength(node)) {
- assert_throws("INDEX_SIZE_ERR", function() {
- range.comparePoint(node, offset);
- }, "Must throw IndexSizeError if offset is greater than length");
- return;
- }
-
- // "If (node, offset) is before start, return −1 and terminate
- // these steps."
- if (getPosition(node, normalizedOffset, range.startContainer, range.startOffset) === "before") {
- assert_equals(range.comparePoint(node, offset), -1,
- "Must return -1 if point is before start");
- return;
- }
-
- // "If (node, offset) is after end, return 1 and terminate these
- // steps."
- if (getPosition(node, normalizedOffset, range.endContainer, range.endOffset) === "after") {
- assert_equals(range.comparePoint(node, offset), 1,
- "Must return 1 if point is after end");
- return;
- }
-
- // "Return 0."
- assert_equals(range.comparePoint(node, offset), 0,
- "Must return 0 if point is neither before start nor after end");
- }, "Point " + i + " " + testPoints[i] + ", range " + j + " " + testRanges[j]);
- }
-}
-
-testDiv.style.display = "none";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-constructor.html b/testing/web-platform/tests/dom/ranges/Range-constructor.html
deleted file mode 100644
index e8cfbef75..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-constructor.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!doctype html>
-<title>Range constructor test</title>
-<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
-<div id=log></div>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script>
-"use strict";
-
-test(function() {
- var range = new Range();
- assert_equals(range.startContainer, document, "startContainer");
- assert_equals(range.endContainer, document, "endContainer");
- assert_equals(range.startOffset, 0, "startOffset");
- assert_equals(range.endOffset, 0, "endOffset");
- assert_true(range.collapsed, "collapsed");
- assert_equals(range.commonAncestorContainer, document,
- "commonAncestorContainer");
-});
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-deleteContents.html b/testing/web-platform/tests/dom/ranges/Range-deleteContents.html
deleted file mode 100644
index 40dc40012..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-deleteContents.html
+++ /dev/null
@@ -1,337 +0,0 @@
-<!doctype html>
-<title>Range.deleteContents() tests</title>
-<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
-<meta name=timeout content=long>
-<p>To debug test failures, add a query parameter "subtest" with the test id (like
-"?subtest=5"). Only that test will be run. Then you can look at the resulting
-iframe in the DOM.
-<div id=log></div>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=../common.js></script>
-<script>
-"use strict";
-
-testDiv.parentNode.removeChild(testDiv);
-
-var actualIframe = document.createElement("iframe");
-actualIframe.style.display = "none";
-document.body.appendChild(actualIframe);
-
-var expectedIframe = document.createElement("iframe");
-expectedIframe.style.display = "none";
-document.body.appendChild(expectedIframe);
-
-function restoreIframe(iframe, i) {
- // Most of this function is designed to work around the fact that Opera
- // doesn't let you add a doctype to a document that no longer has one, in
- // any way I can figure out. I eventually compromised on something that
- // will still let Opera pass most tests that don't actually involve
- // doctypes.
- while (iframe.contentDocument.firstChild
- && iframe.contentDocument.firstChild.nodeType != Node.DOCUMENT_TYPE_NODE) {
- iframe.contentDocument.removeChild(iframe.contentDocument.firstChild);
- }
-
- while (iframe.contentDocument.lastChild
- && iframe.contentDocument.lastChild.nodeType != Node.DOCUMENT_TYPE_NODE) {
- iframe.contentDocument.removeChild(iframe.contentDocument.lastChild);
- }
-
- if (!iframe.contentDocument.firstChild) {
- // This will throw an exception in Opera if we reach here, which is why
- // I try to avoid it. It will never happen in a browser that obeys the
- // spec, so it's really just insurance. I don't think it actually gets
- // hit by anything.
- iframe.contentDocument.appendChild(iframe.contentDocument.implementation.createDocumentType("html", "", ""));
- }
- iframe.contentDocument.appendChild(referenceDoc.documentElement.cloneNode(true));
- iframe.contentWindow.setupRangeTests();
- iframe.contentWindow.testRangeInput = testRanges[i];
- iframe.contentWindow.run();
-}
-
-function myDeleteContents(range) {
- // "If the context object's start and end are the same, abort this method."
- if (range.startContainer == range.endContainer
- && range.startOffset == range.endOffset) {
- return;
- }
-
- // "Let original start node, original start offset, original end node, and
- // original end offset be the context object's start and end nodes and
- // offsets, respectively."
- var originalStartNode = range.startContainer;
- var originalStartOffset = range.startOffset;
- var originalEndNode = range.endContainer;
- var originalEndOffset = range.endOffset;
-
- // "If original start node and original end node are the same, and they are
- // a Text, ProcessingInstruction, or Comment node, replace data with node
- // original start node, offset original start offset, count original end
- // offset minus original start offset, and data the empty string, and then
- // terminate these steps"
- if (originalStartNode == originalEndNode
- && (range.startContainer.nodeType == Node.TEXT_NODE
- || range.startContainer.nodeType == Node.PROCESSING_INSTRUCTION_NODE
- || range.startContainer.nodeType == Node.COMMENT_NODE)) {
- originalStartNode.deleteData(originalStartOffset, originalEndOffset - originalStartOffset);
- return;
- }
-
- // "Let nodes to remove be a list of all the Nodes that are contained in
- // the context object, in tree order, omitting any Node whose parent is
- // also contained in the context object."
- //
- // We rely on the fact that the contained nodes must lie in tree order
- // between the start node, and the end node's last descendant (inclusive).
- var nodesToRemove = [];
- var stop = nextNodeDescendants(range.endContainer);
- for (var node = range.startContainer; node != stop; node = nextNode(node)) {
- if (isContained(node, range)
- && !(node.parentNode && isContained(node.parentNode, range))) {
- nodesToRemove.push(node);
- }
- }
-
- // "If original start node is an ancestor container of original end node,
- // set new node to original start node and new offset to original start
- // offset."
- var newNode;
- var newOffset;
- if (originalStartNode == originalEndNode
- || originalEndNode.compareDocumentPosition(originalStartNode) & Node.DOCUMENT_POSITION_CONTAINS) {
- newNode = originalStartNode;
- newOffset = originalStartOffset;
- // "Otherwise:"
- } else {
- // "Let reference node equal original start node."
- var referenceNode = originalStartNode;
-
- // "While reference node's parent is not null and is not an ancestor
- // container of original end node, set reference node to its parent."
- while (referenceNode.parentNode
- && referenceNode.parentNode != originalEndNode
- && !(originalEndNode.compareDocumentPosition(referenceNode.parentNode) & Node.DOCUMENT_POSITION_CONTAINS)) {
- referenceNode = referenceNode.parentNode;
- }
-
- // "Set new node to the parent of reference node, and new offset to one
- // plus the index of reference node."
- newNode = referenceNode.parentNode;
- newOffset = 1 + indexOf(referenceNode);
- }
-
- // "If original start node is a Text, ProcessingInstruction, or Comment node,
- // replace data with node original start node, offset original start offset,
- // count original start node's length minus original start offset, data the
- // empty start"
- if (originalStartNode.nodeType == Node.TEXT_NODE
- || originalStartNode.nodeType == Node.PROCESSING_INSTRUCTION_NODE
- || originalStartNode.nodeType == Node.COMMENT_NODE) {
- originalStartNode.deleteData(originalStartOffset, nodeLength(originalStartNode) - originalStartOffset);
- }
-
- // "For each node in nodes to remove, in order, remove node from its
- // parent."
- for (var i = 0; i < nodesToRemove.length; i++) {
- nodesToRemove[i].parentNode.removeChild(nodesToRemove[i]);
- }
-
- // "If original end node is a Text, ProcessingInstruction, or Comment node,
- // replace data with node original end node, offset 0, count original end
- // offset, and data the empty string."
- if (originalEndNode.nodeType == Node.TEXT_NODE
- || originalEndNode.nodeType == Node.PROCESSING_INSTRUCTION_NODE
- || originalEndNode.nodeType == Node.COMMENT_NODE) {
- originalEndNode.deleteData(0, originalEndOffset);
- }
-
- // "Set the context object's start and end to (new node, new offset)."
- range.setStart(newNode, newOffset);
- range.setEnd(newNode, newOffset);
-}
-
-function testDeleteContents(i) {
- restoreIframe(actualIframe, i);
- restoreIframe(expectedIframe, i);
-
- var actualRange = actualIframe.contentWindow.testRange;
- var expectedRange = expectedIframe.contentWindow.testRange;
- var actualRoots, expectedRoots;
-
- domTests[i].step(function() {
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual deleteContents()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated deleteContents()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
-
- // Just to be pedantic, we'll test not only that the tree we're
- // modifying is the same in expected vs. actual, but also that all the
- // nodes originally in it were the same. Typically some nodes will
- // become detached when the algorithm is run, but they still exist and
- // references can still be kept to them, so they should also remain the
- // same.
- //
- // We initialize the list to all nodes, and later on remove all the
- // ones which still have parents, since the parents will presumably be
- // tested for isEqualNode() and checking the children would be
- // redundant.
- var actualAllNodes = [];
- var node = furthestAncestor(actualRange.startContainer);
- do {
- actualAllNodes.push(node);
- } while (node = nextNode(node));
-
- var expectedAllNodes = [];
- var node = furthestAncestor(expectedRange.startContainer);
- do {
- expectedAllNodes.push(node);
- } while (node = nextNode(node));
-
- actualRange.deleteContents();
- myDeleteContents(expectedRange);
-
- actualRoots = [];
- for (var j = 0; j < actualAllNodes.length; j++) {
- if (!actualAllNodes[j].parentNode) {
- actualRoots.push(actualAllNodes[j]);
- }
- }
-
- expectedRoots = [];
- for (var j = 0; j < expectedAllNodes.length; j++) {
- if (!expectedAllNodes[j].parentNode) {
- expectedRoots.push(expectedAllNodes[j]);
- }
- }
-
- for (var j = 0; j < actualRoots.length; j++) {
- if (!actualRoots[j].isEqualNode(expectedRoots[j])) {
- var msg = j ? "detached node #" + j : "tree root";
- msg = "Actual and expected mismatch for " + msg + ". ";
-
- // Find the specific error
- var actual = actualRoots[j];
- var expected = expectedRoots[j];
-
- while (actual && expected) {
- assert_equals(actual.nodeType, expected.nodeType,
- msg + "First difference: differing nodeType");
- assert_equals(actual.nodeName, expected.nodeName,
- msg + "First difference: differing nodeName");
- assert_equals(actual.nodeValue, expected.nodeValue,
- msg + 'First difference: differing nodeValue (nodeName = "' + actual.nodeName + '")');
- assert_equals(actual.childNodes.length, expected.childNodes.length,
- msg + 'First difference: differing number of children (nodeName = "' + actual.nodeName + '")');
- actual = nextNode(actual);
- expected = nextNode(expected);
- }
-
- assert_unreached("DOMs were not equal but we couldn't figure out why");
- }
-
- if (j == 0) {
- // Clearly something is wrong if the node lists are different
- // lengths. We want to report this only after we've already
- // checked the main tree for equality, though, so it doesn't
- // mask more interesting errors.
- assert_equals(actualRoots.length, expectedRoots.length,
- "Actual and expected DOMs were broken up into a different number of pieces by deleteContents() (this probably means you created or detached nodes when you weren't supposed to)");
- }
- }
- });
- domTests[i].done();
-
- positionTests[i].step(function() {
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual deleteContents()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated deleteContents()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
- assert_true(actualRoots[0].isEqualNode(expectedRoots[0]),
- "The resulting DOMs were not equal, so comparing positions makes no sense");
-
- assert_equals(actualRange.startContainer, actualRange.endContainer,
- "startContainer and endContainer must always be the same after deleteContents()");
- assert_equals(actualRange.startOffset, actualRange.endOffset,
- "startOffset and endOffset must always be the same after deleteContents()");
- assert_equals(expectedRange.startContainer, expectedRange.endContainer,
- "Test bug! Expected startContainer and endContainer must always be the same after deleteContents()");
- assert_equals(expectedRange.startOffset, expectedRange.endOffset,
- "Test bug! Expected startOffset and endOffset must always be the same after deleteContents()");
-
- assert_equals(actualRange.startOffset, expectedRange.startOffset,
- "Unexpected startOffset after deleteContents()");
- // How do we decide that the two nodes are equal, since they're in
- // different trees? Since the DOMs are the same, it's enough to check
- // that the index in the parent is the same all the way up the tree.
- // But we can first cheat by just checking they're actually equal.
- assert_true(actualRange.startContainer.isEqualNode(expectedRange.startContainer),
- "Unexpected startContainer after deleteContents(), expected " +
- expectedRange.startContainer.nodeName.toLowerCase() + " but got " +
- actualRange.startContainer.nodeName.toLowerCase());
- var currentActual = actualRange.startContainer;
- var currentExpected = expectedRange.startContainer;
- var actual = "";
- var expected = "";
- while (currentActual && currentExpected) {
- actual = indexOf(currentActual) + "-" + actual;
- expected = indexOf(currentExpected) + "-" + expected;
-
- currentActual = currentActual.parentNode;
- currentExpected = currentExpected.parentNode;
- }
- actual = actual.substr(0, actual.length - 1);
- expected = expected.substr(0, expected.length - 1);
- assert_equals(actual, expected,
- "startContainer superficially looks right but is actually the wrong node if you trace back its index in all its ancestors (I'm surprised this actually happened");
- });
- positionTests[i].done();
-}
-
-// First test a detached Range, synchronously
-test(function() {
- var range = document.createRange();
- range.detach();
- range.deleteContents();
-}, "Detached Range");
-
-var iStart = 0;
-var iStop = testRanges.length;
-
-if (/subtest=[0-9]+/.test(location.search)) {
- var matches = /subtest=([0-9]+)/.exec(location.search);
- iStart = Number(matches[1]);
- iStop = Number(matches[1]) + 1;
-}
-
-var domTests = [];
-var positionTests = [];
-
-for (var i = iStart; i < iStop; i++) {
- domTests[i] = async_test("Resulting DOM for range " + i + " " + testRanges[i]);
- positionTests[i] = async_test("Resulting cursor position for range " + i + " " + testRanges[i]);
-}
-
-var referenceDoc = document.implementation.createHTMLDocument("");
-referenceDoc.removeChild(referenceDoc.documentElement);
-
-actualIframe.onload = function() {
- expectedIframe.onload = function() {
- for (var i = iStart; i < iStop; i++) {
- testDeleteContents(i);
- }
- }
- expectedIframe.src = "Range-test-iframe.html";
- referenceDoc.appendChild(actualIframe.contentDocument.documentElement.cloneNode(true));
-}
-actualIframe.src = "Range-test-iframe.html";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-detach.html b/testing/web-platform/tests/dom/ranges/Range-detach.html
deleted file mode 100644
index ac35d7136..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-detach.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE html>
-<title>Range.detach</title>
-<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<div id=log></div>
-<script>
-test(function() {
- var r = document.createRange();
- r.detach()
- r.detach()
-})
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-extractContents.html b/testing/web-platform/tests/dom/ranges/Range-extractContents.html
deleted file mode 100644
index 098837f0c..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-extractContents.html
+++ /dev/null
@@ -1,248 +0,0 @@
-<!doctype html>
-<title>Range.extractContents() tests</title>
-<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
-<meta name=timeout content=long>
-<p>To debug test failures, add a query parameter "subtest" with the test id (like
-"?subtest=5"). Only that test will be run. Then you can look at the resulting
-iframe in the DOM.
-<div id=log></div>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=../common.js></script>
-<script>
-"use strict";
-
-testDiv.parentNode.removeChild(testDiv);
-
-var actualIframe = document.createElement("iframe");
-actualIframe.style.display = "none";
-document.body.appendChild(actualIframe);
-
-var expectedIframe = document.createElement("iframe");
-expectedIframe.style.display = "none";
-document.body.appendChild(expectedIframe);
-
-function restoreIframe(iframe, i) {
- // Most of this function is designed to work around the fact that Opera
- // doesn't let you add a doctype to a document that no longer has one, in
- // any way I can figure out. I eventually compromised on something that
- // will still let Opera pass most tests that don't actually involve
- // doctypes.
- while (iframe.contentDocument.firstChild
- && iframe.contentDocument.firstChild.nodeType != Node.DOCUMENT_TYPE_NODE) {
- iframe.contentDocument.removeChild(iframe.contentDocument.firstChild);
- }
-
- while (iframe.contentDocument.lastChild
- && iframe.contentDocument.lastChild.nodeType != Node.DOCUMENT_TYPE_NODE) {
- iframe.contentDocument.removeChild(iframe.contentDocument.lastChild);
- }
-
- if (!iframe.contentDocument.firstChild) {
- // This will throw an exception in Opera if we reach here, which is why
- // I try to avoid it. It will never happen in a browser that obeys the
- // spec, so it's really just insurance. I don't think it actually gets
- // hit by anything.
- iframe.contentDocument.appendChild(iframe.contentDocument.implementation.createDocumentType("html", "", ""));
- }
- iframe.contentDocument.appendChild(referenceDoc.documentElement.cloneNode(true));
- iframe.contentWindow.setupRangeTests();
- iframe.contentWindow.testRangeInput = testRanges[i];
- iframe.contentWindow.run();
-}
-
-function testExtractContents(i) {
- restoreIframe(actualIframe, i);
- restoreIframe(expectedIframe, i);
-
- var actualRange = actualIframe.contentWindow.testRange;
- var expectedRange = expectedIframe.contentWindow.testRange;
- var actualFrag, expectedFrag;
- var actualRoots, expectedRoots;
-
- domTests[i].step(function() {
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual extractContents()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated extractContents()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
-
- // Just to be pedantic, we'll test not only that the tree we're
- // modifying is the same in expected vs. actual, but also that all the
- // nodes originally in it were the same. Typically some nodes will
- // become detached when the algorithm is run, but they still exist and
- // references can still be kept to them, so they should also remain the
- // same.
- //
- // We initialize the list to all nodes, and later on remove all the
- // ones which still have parents, since the parents will presumably be
- // tested for isEqualNode() and checking the children would be
- // redundant.
- var actualAllNodes = [];
- var node = furthestAncestor(actualRange.startContainer);
- do {
- actualAllNodes.push(node);
- } while (node = nextNode(node));
-
- var expectedAllNodes = [];
- var node = furthestAncestor(expectedRange.startContainer);
- do {
- expectedAllNodes.push(node);
- } while (node = nextNode(node));
-
- expectedFrag = myExtractContents(expectedRange);
- if (typeof expectedFrag == "string") {
- assert_throws(expectedFrag, function() {
- actualRange.extractContents();
- });
- } else {
- actualFrag = actualRange.extractContents();
- }
-
- actualRoots = [];
- for (var j = 0; j < actualAllNodes.length; j++) {
- if (!actualAllNodes[j].parentNode) {
- actualRoots.push(actualAllNodes[j]);
- }
- }
-
- expectedRoots = [];
- for (var j = 0; j < expectedAllNodes.length; j++) {
- if (!expectedAllNodes[j].parentNode) {
- expectedRoots.push(expectedAllNodes[j]);
- }
- }
-
- for (var j = 0; j < actualRoots.length; j++) {
- assertNodesEqual(actualRoots[j], expectedRoots[j], j ? "detached node #" + j : "tree root");
-
- if (j == 0) {
- // Clearly something is wrong if the node lists are different
- // lengths. We want to report this only after we've already
- // checked the main tree for equality, though, so it doesn't
- // mask more interesting errors.
- assert_equals(actualRoots.length, expectedRoots.length,
- "Actual and expected DOMs were broken up into a different number of pieces by extractContents() (this probably means you created or detached nodes when you weren't supposed to)");
- }
- }
- });
- domTests[i].done();
-
- positionTests[i].step(function() {
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual extractContents()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated extractContents()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
-
- assert_true(actualRoots[0].isEqualNode(expectedRoots[0]),
- "The resulting DOMs were not equal, so comparing positions makes no sense");
-
- if (typeof expectedFrag == "string") {
- // It's no longer true that, e.g., startContainer and endContainer
- // must always be the same
- return;
- }
- assert_equals(actualRange.startContainer, actualRange.endContainer,
- "startContainer and endContainer must always be the same after extractContents()");
- assert_equals(actualRange.startOffset, actualRange.endOffset,
- "startOffset and endOffset must always be the same after extractContents()");
- assert_equals(expectedRange.startContainer, expectedRange.endContainer,
- "Test bug! Expected startContainer and endContainer must always be the same after extractContents()");
- assert_equals(expectedRange.startOffset, expectedRange.endOffset,
- "Test bug! Expected startOffset and endOffset must always be the same after extractContents()");
-
- assert_equals(actualRange.startOffset, expectedRange.startOffset,
- "Unexpected startOffset after extractContents()");
- // How do we decide that the two nodes are equal, since they're in
- // different trees? Since the DOMs are the same, it's enough to check
- // that the index in the parent is the same all the way up the tree.
- // But we can first cheat by just checking they're actually equal.
- assert_true(actualRange.startContainer.isEqualNode(expectedRange.startContainer),
- "Unexpected startContainer after extractContents(), expected " +
- expectedRange.startContainer.nodeName.toLowerCase() + " but got " +
- actualRange.startContainer.nodeName.toLowerCase());
- var currentActual = actualRange.startContainer;
- var currentExpected = expectedRange.startContainer;
- var actual = "";
- var expected = "";
- while (currentActual && currentExpected) {
- actual = indexOf(currentActual) + "-" + actual;
- expected = indexOf(currentExpected) + "-" + expected;
-
- currentActual = currentActual.parentNode;
- currentExpected = currentExpected.parentNode;
- }
- actual = actual.substr(0, actual.length - 1);
- expected = expected.substr(0, expected.length - 1);
- assert_equals(actual, expected,
- "startContainer superficially looks right but is actually the wrong node if you trace back its index in all its ancestors (I'm surprised this actually happened");
- });
- positionTests[i].done();
-
- fragTests[i].step(function() {
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual extractContents()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated extractContents()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
-
- if (typeof expectedFrag == "string") {
- // Comparing makes no sense
- return;
- }
- assertNodesEqual(actualFrag, expectedFrag,
- "returned fragment");
- });
- fragTests[i].done();
-}
-
-// First test a detached Range, synchronously
-test(function() {
- var range = document.createRange();
- range.detach();
- assert_array_equals(range.extractContents().childNodes, []);
-}, "Detached Range");
-
-var iStart = 0;
-var iStop = testRanges.length;
-
-if (/subtest=[0-9]+/.test(location.search)) {
- var matches = /subtest=([0-9]+)/.exec(location.search);
- iStart = Number(matches[1]);
- iStop = Number(matches[1]) + 1;
-}
-
-var domTests = [];
-var positionTests = [];
-var fragTests = [];
-
-for (var i = iStart; i < iStop; i++) {
- domTests[i] = async_test("Resulting DOM for range " + i + " " + testRanges[i]);
- positionTests[i] = async_test("Resulting cursor position for range " + i + " " + testRanges[i]);
- fragTests[i] = async_test("Returned fragment for range " + i + " " + testRanges[i]);
-}
-
-var referenceDoc = document.implementation.createHTMLDocument("");
-referenceDoc.removeChild(referenceDoc.documentElement);
-
-actualIframe.onload = function() {
- expectedIframe.onload = function() {
- for (var i = iStart; i < iStop; i++) {
- testExtractContents(i);
- }
- }
- expectedIframe.src = "Range-test-iframe.html";
- referenceDoc.appendChild(actualIframe.contentDocument.documentElement.cloneNode(true));
-}
-actualIframe.src = "Range-test-iframe.html";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-insertNode.html b/testing/web-platform/tests/dom/ranges/Range-insertNode.html
deleted file mode 100644
index 4c4073b21..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-insertNode.html
+++ /dev/null
@@ -1,286 +0,0 @@
-<!doctype html>
-<title>Range.insertNode() tests</title>
-<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
-<meta name=timeout content=long>
-<p>To debug test failures, add a query parameter "subtest" with the test id (like
-"?subtest=5,16"). Only that test will be run. Then you can look at the resulting
-iframes in the DOM.
-<div id=log></div>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=../common.js></script>
-<script>
-"use strict";
-
-testDiv.parentNode.removeChild(testDiv);
-
-function restoreIframe(iframe, i, j) {
- // Most of this function is designed to work around the fact that Opera
- // doesn't let you add a doctype to a document that no longer has one, in
- // any way I can figure out. I eventually compromised on something that
- // will still let Opera pass most tests that don't actually involve
- // doctypes.
- while (iframe.contentDocument.firstChild
- && iframe.contentDocument.firstChild.nodeType != Node.DOCUMENT_TYPE_NODE) {
- iframe.contentDocument.removeChild(iframe.contentDocument.firstChild);
- }
-
- while (iframe.contentDocument.lastChild
- && iframe.contentDocument.lastChild.nodeType != Node.DOCUMENT_TYPE_NODE) {
- iframe.contentDocument.removeChild(iframe.contentDocument.lastChild);
- }
-
- if (!iframe.contentDocument.firstChild) {
- // This will throw an exception in Opera if we reach here, which is why
- // I try to avoid it. It will never happen in a browser that obeys the
- // spec, so it's really just insurance. I don't think it actually gets
- // hit by anything.
- iframe.contentDocument.appendChild(iframe.contentDocument.implementation.createDocumentType("html", "", ""));
- }
- iframe.contentDocument.appendChild(referenceDoc.documentElement.cloneNode(true));
- iframe.contentWindow.setupRangeTests();
- iframe.contentWindow.testRangeInput = testRangesShort[i];
- iframe.contentWindow.testNodeInput = testNodesShort[j];
- iframe.contentWindow.run();
-}
-
-function testInsertNode(i, j) {
- var actualRange;
- var expectedRange;
- var actualNode;
- var expectedNode;
- var actualRoots = [];
- var expectedRoots = [];
-
- var detached = false;
-
- domTests[i][j].step(function() {
- restoreIframe(actualIframe, i, j);
- restoreIframe(expectedIframe, i, j);
-
- actualRange = actualIframe.contentWindow.testRange;
- expectedRange = expectedIframe.contentWindow.testRange;
- actualNode = actualIframe.contentWindow.testNode;
- expectedNode = expectedIframe.contentWindow.testNode;
-
- try {
- actualRange.collapsed;
- } catch (e) {
- detached = true;
- }
-
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual insertNode()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated insertNode()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_false(actualRange === null,
- "Range produced in actual iframe was null");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
- assert_false(expectedRange === null,
- "Range produced in expected iframe was null");
- assert_equals(typeof actualNode, "object",
- "typeof Node produced in actual iframe");
- assert_false(actualNode === null,
- "Node produced in actual iframe was null");
- assert_equals(typeof expectedNode, "object",
- "typeof Node produced in expected iframe");
- assert_false(expectedNode === null,
- "Node produced in expected iframe was null");
-
- // We want to test that the trees containing the ranges are equal, and
- // also the trees containing the moved nodes. These might not be the
- // same, if we're inserting a node from a detached tree or a different
- // document.
- //
- // Detached ranges are always in the contentDocument.
- if (detached) {
- actualRoots.push(actualIframe.contentDocument);
- expectedRoots.push(expectedIframe.contentDocument);
- } else {
- actualRoots.push(furthestAncestor(actualRange.startContainer));
- expectedRoots.push(furthestAncestor(expectedRange.startContainer));
- }
-
- if (furthestAncestor(actualNode) != actualRoots[0]) {
- actualRoots.push(furthestAncestor(actualNode));
- }
- if (furthestAncestor(expectedNode) != expectedRoots[0]) {
- expectedRoots.push(furthestAncestor(expectedNode));
- }
-
- assert_equals(actualRoots.length, expectedRoots.length,
- "Either the actual node and actual range are in the same tree but the expected are in different trees, or vice versa");
-
- // This doctype stuff is to work around the fact that Opera 11.00 will
- // move around doctypes within a document, even to totally invalid
- // positions, but it won't allow a new doctype to be added to a
- // document in any way I can figure out. So if we try moving a doctype
- // to some invalid place, in Opera it will actually succeed, and then
- // restoreIframe() will remove the doctype along with the root element,
- // and then nothing can re-add the doctype. So instead, we catch it
- // during the test itself and move it back to the right place while we
- // still can.
- //
- // I spent *way* too much time debugging and working around this bug.
- var actualDoctype = actualIframe.contentDocument.doctype;
- var expectedDoctype = expectedIframe.contentDocument.doctype;
-
- var result;
- try {
- result = myInsertNode(expectedRange, expectedNode);
- } catch (e) {
- if (expectedDoctype != expectedIframe.contentDocument.firstChild) {
- expectedIframe.contentDocument.insertBefore(expectedDoctype, expectedIframe.contentDocument.firstChild);
- }
- throw e;
- }
- if (typeof result == "string") {
- assert_throws(result, function() {
- try {
- actualRange.insertNode(actualNode);
- } catch (e) {
- if (expectedDoctype != expectedIframe.contentDocument.firstChild) {
- expectedIframe.contentDocument.insertBefore(expectedDoctype, expectedIframe.contentDocument.firstChild);
- }
- if (actualDoctype != actualIframe.contentDocument.firstChild) {
- actualIframe.contentDocument.insertBefore(actualDoctype, actualIframe.contentDocument.firstChild);
- }
- throw e;
- }
- }, "A " + result + " DOMException must be thrown in this case");
- // Don't return, we still need to test DOM equality
- } else {
- try {
- actualRange.insertNode(actualNode);
- } catch (e) {
- if (expectedDoctype != expectedIframe.contentDocument.firstChild) {
- expectedIframe.contentDocument.insertBefore(expectedDoctype, expectedIframe.contentDocument.firstChild);
- }
- if (actualDoctype != actualIframe.contentDocument.firstChild) {
- actualIframe.contentDocument.insertBefore(actualDoctype, actualIframe.contentDocument.firstChild);
- }
- throw e;
- }
- }
-
- for (var k = 0; k < actualRoots.length; k++) {
- assertNodesEqual(actualRoots[k], expectedRoots[k], k ? "moved node's tree root" : "range's tree root");
- }
- });
- domTests[i][j].done();
-
- positionTests[i][j].step(function() {
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual insertNode()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated insertNode()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_false(actualRange === null,
- "Range produced in actual iframe was null");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
- assert_false(expectedRange === null,
- "Range produced in expected iframe was null");
- assert_equals(typeof actualNode, "object",
- "typeof Node produced in actual iframe");
- assert_false(actualNode === null,
- "Node produced in actual iframe was null");
- assert_equals(typeof expectedNode, "object",
- "typeof Node produced in expected iframe");
- assert_false(expectedNode === null,
- "Node produced in expected iframe was null");
-
- for (var k = 0; k < actualRoots.length; k++) {
- assertNodesEqual(actualRoots[k], expectedRoots[k], k ? "moved node's tree root" : "range's tree root");
- }
-
- if (detached) {
- // No further tests we can do
- return;
- }
-
- assert_equals(actualRange.startOffset, expectedRange.startOffset,
- "Unexpected startOffset after insertNode()");
- assert_equals(actualRange.endOffset, expectedRange.endOffset,
- "Unexpected endOffset after insertNode()");
- // How do we decide that the two nodes are equal, since they're in
- // different trees? Since the DOMs are the same, it's enough to check
- // that the index in the parent is the same all the way up the tree.
- // But we can first cheat by just checking they're actually equal.
- assert_true(actualRange.startContainer.isEqualNode(expectedRange.startContainer),
- "Unexpected startContainer after insertNode(), expected " +
- expectedRange.startContainer.nodeName.toLowerCase() + " but got " +
- actualRange.startContainer.nodeName.toLowerCase());
- var currentActual = actualRange.startContainer;
- var currentExpected = expectedRange.startContainer;
- var actual = "";
- var expected = "";
- while (currentActual && currentExpected) {
- actual = indexOf(currentActual) + "-" + actual;
- expected = indexOf(currentExpected) + "-" + expected;
-
- currentActual = currentActual.parentNode;
- currentExpected = currentExpected.parentNode;
- }
- actual = actual.substr(0, actual.length - 1);
- expected = expected.substr(0, expected.length - 1);
- assert_equals(actual, expected,
- "startContainer superficially looks right but is actually the wrong node if you trace back its index in all its ancestors (I'm surprised this actually happened");
- });
- positionTests[i][j].done();
-}
-
-testRanges.unshift('"detached"');
-
-var iStart = 0;
-var iStop = testRangesShort.length;
-var jStart = 0;
-var jStop = testNodesShort.length;
-
-if (/subtest=[0-9]+,[0-9]+/.test(location.search)) {
- var matches = /subtest=([0-9]+),([0-9]+)/.exec(location.search);
- iStart = Number(matches[1]);
- iStop = Number(matches[1]) + 1;
- jStart = Number(matches[2]) + 0;
- jStop = Number(matches[2]) + 1;
-}
-
-var domTests = [];
-var positionTests = [];
-for (var i = iStart; i < iStop; i++) {
- domTests[i] = [];
- positionTests[i] = [];
- for (var j = jStart; j < jStop; j++) {
- domTests[i][j] = async_test(i + "," + j + ": resulting DOM for range " + testRangesShort[i] + ", node " + testNodesShort[j]);
- positionTests[i][j] = async_test(i + "," + j + ": resulting range position for range " + testRangesShort[i] + ", node " + testNodesShort[j]);
- }
-}
-
-var actualIframe = document.createElement("iframe");
-actualIframe.style.display = "none";
-document.body.appendChild(actualIframe);
-
-var expectedIframe = document.createElement("iframe");
-expectedIframe.style.display = "none";
-document.body.appendChild(expectedIframe);
-
-var referenceDoc = document.implementation.createHTMLDocument("");
-referenceDoc.removeChild(referenceDoc.documentElement);
-
-actualIframe.onload = function() {
- expectedIframe.onload = function() {
- for (var i = iStart; i < iStop; i++) {
- for (var j = jStart; j < jStop; j++) {
- testInsertNode(i, j);
- }
- }
- }
- expectedIframe.src = "Range-test-iframe.html";
- referenceDoc.appendChild(actualIframe.contentDocument.documentElement.cloneNode(true));
-}
-actualIframe.src = "Range-test-iframe.html";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-intersectsNode-binding.html b/testing/web-platform/tests/dom/ranges/Range-intersectsNode-binding.html
deleted file mode 100644
index 729388428..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-intersectsNode-binding.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!doctype html>
-<title>Range.intersectsNode</title>
-<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
-<meta name=timeout content=long>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<div id=log></div>
-<script>
-test(function() {
- var r = document.createRange();
- assert_throws(new TypeError(), function() { r.intersectsNode(); });
- assert_throws(new TypeError(), function() { r.intersectsNode(null); });
- assert_throws(new TypeError(), function() { r.intersectsNode(undefined); });
- assert_throws(new TypeError(), function() { r.intersectsNode(42); });
- assert_throws(new TypeError(), function() { r.intersectsNode("foo"); });
- assert_throws(new TypeError(), function() { r.intersectsNode({}); });
- r.detach();
- assert_throws(new TypeError(), function() { r.intersectsNode(); });
- assert_throws(new TypeError(), function() { r.intersectsNode(null); });
- assert_throws(new TypeError(), function() { r.intersectsNode(undefined); });
- assert_throws(new TypeError(), function() { r.intersectsNode(42); });
- assert_throws(new TypeError(), function() { r.intersectsNode("foo"); });
- assert_throws(new TypeError(), function() { r.intersectsNode({}); });
-}, "Calling intersectsNode without an argument or with an invalid argument should throw a TypeError.")
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-intersectsNode.html b/testing/web-platform/tests/dom/ranges/Range-intersectsNode.html
deleted file mode 100644
index 97e10f6f0..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-intersectsNode.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!doctype html>
-<title>Range.intersectsNode() 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";
-
-// Will be filled in on the first run for that range
-var testRangesCached = [];
-
-for (var i = 0; i < testNodes.length; i++) {
- var node = eval(testNodes[i]);
-
- for (var j = 0; j < testRanges.length; j++) {
- test(function() {
- if (testRangesCached[j] === undefined) {
- try {
- testRangesCached[j] = rangeFromEndpoints(eval(testRanges[i]));
- } catch(e) {
- testRangesCached[j] = null;
- }
- }
- assert_not_equals(testRangesCached[j], null,
- "Setting up the range failed");
-
- var range = testRangesCached[j].cloneRange();
-
- // "If node's root is different from the context object's root,
- // return false and terminate these steps."
- if (furthestAncestor(node) !== furthestAncestor(range.startContainer)) {
- assert_equals(range.intersectsNode(node), false,
- "Must return false if node and range have different roots");
- return;
- }
-
- // "Let parent be node's parent."
- var parent_ = node.parentNode;
-
- // "If parent is null, return true and terminate these steps."
- if (!parent_) {
- assert_equals(range.intersectsNode(node), true,
- "Must return true if node's parent is null");
- return;
- }
-
- // "Let offset be node's index."
- var offset = indexOf(node);
-
- // "If (parent, offset) is before end and (parent, offset + 1) is
- // after start, return true and terminate these steps."
- if (getPosition(parent_, offset, range.endContainer, range.endOffset) === "before"
- && getPosition(parent_, offset + 1, range.startContainer, range.startOffset) === "after") {
- assert_equals(range.intersectsNode(node), true,
- "Must return true if (parent, offset) is before range end and (parent, offset + 1) is after range start");
- return;
- }
-
- // "Return false."
- assert_equals(range.intersectsNode(node), false,
- "Must return false if (parent, offset) is not before range end or (parent, offset + 1) is not after range start");
- }, "Node " + i + " " + testNodes[i] + ", range " + j + " " + testRanges[j]);
- }
-}
-
-testDiv.style.display = "none";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-isPointInRange.html b/testing/web-platform/tests/dom/ranges/Range-isPointInRange.html
deleted file mode 100644
index fa87442b8..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-isPointInRange.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!doctype html>
-<title>Range.isPointInRange() 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";
-
-var testRangesCached = [];
-test(function() {
- for (var j = 0; j < testRanges.length; j++) {
- test(function() {
- testRangesCached[j] = rangeFromEndpoints(eval(testRanges[j]));
- }, "Set up for range " + j + " " + testRanges[j]);
- }
- var detachedRange = document.createRange();
- detachedRange.detach();
- testRanges.push("detached");
- testRangesCached.push(detachedRange);
-}, "Setup");
-
-for (var i = 0; i < testPoints.length; i++) {
- var node = eval(testPoints[i])[0];
- var offset = eval(testPoints[i])[1];
-
- // isPointInRange is an unsigned long, so per WebIDL, we need to treat it
- // as though it wrapped to an unsigned 32-bit integer.
- var normalizedOffset = offset % Math.pow(2, 32);
- if (normalizedOffset < 0) {
- normalizedOffset += Math.pow(2, 32);
- }
-
- for (var j = 0; j < testRanges.length; j++) {
- test(function() {
- var range = testRangesCached[j].cloneRange();
-
- // "If node's root is different from the context object's root,
- // return false and terminate these steps."
- if (furthestAncestor(node) !== furthestAncestor(range.startContainer)) {
- assert_false(range.isPointInRange(node, offset),
- "Must return false if node has a different root from the context object");
- return;
- }
-
- // "If node is a doctype, throw an "InvalidNodeTypeError" exception
- // and terminate these steps."
- if (node.nodeType == Node.DOCUMENT_TYPE_NODE) {
- assert_throws("INVALID_NODE_TYPE_ERR", function() {
- range.isPointInRange(node, offset);
- }, "Must throw InvalidNodeTypeError if node is a doctype");
- return;
- }
-
- // "If offset is greater than node's length, throw an
- // "IndexSizeError" exception and terminate these steps."
- if (normalizedOffset > nodeLength(node)) {
- assert_throws("INDEX_SIZE_ERR", function() {
- range.isPointInRange(node, offset);
- }, "Must throw IndexSizeError if offset is greater than length");
- return;
- }
-
- // "If (node, offset) is before start or after end, return false
- // and terminate these steps."
- if (getPosition(node, normalizedOffset, range.startContainer, range.startOffset) === "before"
- || getPosition(node, normalizedOffset, range.endContainer, range.endOffset) === "after") {
- assert_false(range.isPointInRange(node, offset),
- "Must return false if point is before start or after end");
- return;
- }
-
- // "Return true."
- assert_true(range.isPointInRange(node, offset),
- "Must return true if point is not before start, after end, or in different tree");
- }, "Point " + i + " " + testPoints[i] + ", range " + j + " " + testRanges[j]);
- }
-}
-
-testDiv.style.display = "none";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-mutations.html b/testing/web-platform/tests/dom/ranges/Range-mutations.html
deleted file mode 100644
index ef99ca2ef..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-mutations.html
+++ /dev/null
@@ -1,950 +0,0 @@
-<!doctype html>
-<title>Range mutation 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";
-
-// These tests probably use too much abstraction and too little copy-paste.
-// Reader beware.
-//
-// TODO:
-//
-// * Lots and lots and lots more different types of ranges
-// * insertBefore() with DocumentFragments
-// * Fill out other insert/remove tests
-// * normalize() (https://www.w3.org/Bugs/Public/show_bug.cgi?id=13843)
-
-// Give a textual description of the range we're testing, for the test names.
-function describeRange(startContainer, startOffset, endContainer, endOffset) {
- if (startContainer == endContainer && startOffset == endOffset) {
- return "range collapsed at (" + startContainer + ", " + startOffset + ")";
- } else if (startContainer == endContainer) {
- return "range on " + startContainer + " from " + startOffset + " to " + endOffset;
- } else {
- return "range from (" + startContainer + ", " + startOffset + ") to (" + endContainer + ", " + endOffset + ")";
- }
-}
-
-// Lists of the various types of nodes we'll want to use. We use strings that
-// we can later eval(), so that we can produce legible test names.
-var textNodes = [
- "paras[0].firstChild",
- "paras[1].firstChild",
- "foreignTextNode",
- "xmlTextNode",
- "detachedTextNode",
- "detachedForeignTextNode",
- "detachedXmlTextNode",
-];
-var commentNodes = [
- "comment",
- "foreignComment",
- "xmlComment",
- "detachedComment",
- "detachedForeignComment",
- "detachedXmlComment",
-];
-var characterDataNodes = textNodes.concat(commentNodes);
-
-// This function is slightly scary, but it works well enough, so . . .
-// sourceTests is an array of test data that will be altered in mysterious ways
-// before being passed off to doTest, descFn is something that takes an element
-// of sourceTests and produces the first part of a human-readable description
-// of the test, testFn is the function that doTest will call to do the actual
-// work and tell it what results to expect.
-function doTests(sourceTests, descFn, testFn) {
- var tests = [];
- for (var i = 0; i < sourceTests.length; i++) {
- var params = sourceTests[i];
- var len = params.length;
- tests.push([
- descFn(params) + ", with unselected " + describeRange(params[len - 4], params[len - 3], params[len - 2], params[len - 1]),
- // The closure here ensures that the params that testFn get are the
- // current version of params, not the version from the last
- // iteration of this loop. We test that none of the parameters
- // evaluate to undefined to catch bugs in our eval'ing, like
- // mistyping a property name.
- function(params) { return function() {
- var evaledParams = params.map(eval);
- for (var i = 0; i < evaledParams.length; i++) {
- assert_true(typeof evaledParams[i] != "undefined",
- "Test bug: " + params[i] + " is undefined");
- }
- return testFn.apply(null, evaledParams);
- } }(params),
- false,
- params[len - 4],
- params[len - 3],
- params[len - 2],
- params[len - 1]
- ]);
- tests.push([
- descFn(params) + ", with selected " + describeRange(params[len - 4], params[len - 3], params[len - 2], params[len - 1]),
- function(params) { return function(selectedRange) {
- var evaledParams = params.slice(0, len - 4).map(eval);
- for (var i = 0; i < evaledParams.length; i++) {
- assert_true(typeof evaledParams[i] != "undefined",
- "Test bug: " + params[i] + " is undefined");
- }
- // Override input range with the one that was actually selected when computing the expected result.
- evaledParams = evaledParams.concat([selectedRange.startContainer, selectedRange.startOffset, selectedRange.endContainer, selectedRange.endOffset]);
- return testFn.apply(null, evaledParams);
- } }(params),
- true,
- params[len - 4],
- params[len - 3],
- params[len - 2],
- params[len - 1]
- ]);
- }
- generate_tests(doTest, tests);
-}
-
-// Set up the range, call the callback function to do the DOM modification and
-// tell us what to expect. The callback function needs to return a
-// four-element array with the expected start/end containers/offsets, and
-// receives no arguments. useSelection tells us whether the Range should be
-// added to a Selection and the Selection tested to ensure that the mutation
-// affects user selections as well as other ranges; every test is run with this
-// both false and true, because when it's set to true WebKit and Opera fail all
-// tests' sanity checks, which is unhelpful. The last four parameters just
-// tell us what range to build.
-function doTest(callback, useSelection, startContainer, startOffset, endContainer, endOffset) {
- // Recreate all the test nodes in case they were altered by the last test
- // run.
- setupRangeTests();
- startContainer = eval(startContainer);
- startOffset = eval(startOffset);
- endContainer = eval(endContainer);
- endOffset = eval(endOffset);
-
- var ownerDoc = startContainer.nodeType == Node.DOCUMENT_NODE
- ? startContainer
- : startContainer.ownerDocument;
- var range = ownerDoc.createRange();
- range.setStart(startContainer, startOffset);
- range.setEnd(endContainer, endOffset);
-
- if (useSelection) {
- getSelection().removeAllRanges();
- getSelection().addRange(range);
-
- // Some browsers refuse to add a range unless it results in an actual visible selection.
- if (!getSelection().rangeCount)
- return;
-
- // Override range with the one that was actually selected as it differs in some browsers.
- range = getSelection().getRangeAt(0);
- }
-
- var expected = callback(range);
-
- assert_equals(range.startContainer, expected[0],
- "Wrong start container");
- assert_equals(range.startOffset, expected[1],
- "Wrong start offset");
- assert_equals(range.endContainer, expected[2],
- "Wrong end container");
- assert_equals(range.endOffset, expected[3],
- "Wrong end offset");
-}
-
-
-// Now we get to the specific tests.
-
-function testSplitText(oldNode, offset, startContainer, startOffset, endContainer, endOffset) {
- // Save these for later
- var originalStartOffset = startOffset;
- var originalEndOffset = endOffset;
- var originalLength = oldNode.length;
-
- var newNode;
- try {
- newNode = oldNode.splitText(offset);
- } catch (e) {
- // Should only happen if offset is negative
- return [startContainer, startOffset, endContainer, endOffset];
- }
-
- // First we adjust for replacing data:
- //
- // "Replace data with offset offset, count count, and data the empty
- // string."
- //
- // That translates to offset = offset, count = originalLength - offset,
- // data = "". node is oldNode.
- //
- // "For every boundary point whose node is node, and whose offset is
- // greater than offset but less than or equal to offset plus count, set its
- // offset to offset."
- if (startContainer == oldNode
- && startOffset > offset
- && startOffset <= originalLength) {
- startOffset = offset;
- }
-
- if (endContainer == oldNode
- && endOffset > offset
- && endOffset <= originalLength) {
- endOffset = offset;
- }
-
- // "For every boundary point whose node is node, and whose offset is
- // greater than offset plus count, add the length of data to its offset,
- // then subtract count from it."
- //
- // Can't happen: offset plus count is originalLength.
-
- // Now we insert a node, if oldNode's parent isn't null: "For each boundary
- // point whose node is the new parent of the affected node and whose offset
- // is greater than the new index of the affected node, add one to the
- // boundary point's offset."
- if (startContainer == oldNode.parentNode
- && startOffset > 1 + indexOf(oldNode)) {
- startOffset++;
- }
-
- if (endContainer == oldNode.parentNode
- && endOffset > 1 + indexOf(oldNode)) {
- endOffset++;
- }
-
- // Finally, the splitText stuff itself:
- //
- // "If parent is not null, run these substeps:
- //
- // * "For each range whose start node is node and start offset is greater
- // than offset, set its start node to new node and decrease its start
- // offset by offset.
- //
- // * "For each range whose end node is node and end offset is greater
- // than offset, set its end node to new node and decrease its end offset
- // by offset.
- //
- // * "For each range whose start node is parent and start offset is equal
- // to the index of node + 1, increase its start offset by one.
- //
- // * "For each range whose end node is parent and end offset is equal to
- // the index of node + 1, increase its end offset by one."
- if (oldNode.parentNode) {
- if (startContainer == oldNode && originalStartOffset > offset) {
- startContainer = newNode;
- startOffset = originalStartOffset - offset;
- }
-
- if (endContainer == oldNode && originalEndOffset > offset) {
- endContainer = newNode;
- endOffset = originalEndOffset - offset;
- }
-
- if (startContainer == oldNode.parentNode
- && startOffset == 1 + indexOf(oldNode)) {
- startOffset++;
- }
-
- if (endContainer == oldNode.parentNode
- && endOffset == 1 + indexOf(oldNode)) {
- endOffset++;
- }
- }
-
- return [startContainer, startOffset, endContainer, endOffset];
-}
-
-// The offset argument is unsigned, so per WebIDL -1 should wrap to 4294967295,
-// which is probably longer than the length, so it should throw an exception.
-// This is no different from the other cases where the offset is longer than
-// the length, and the wrapping complicates my testing slightly, so I won't
-// bother testing negative values here or in other cases.
-var splitTextTests = [];
-for (var i = 0; i < textNodes.length; i++) {
- var node = textNodes[i];
- splitTextTests.push([node, 376, node, 0, node, 1]);
- splitTextTests.push([node, 0, node, 0, node, 0]);
- splitTextTests.push([node, 1, node, 1, node, 1]);
- splitTextTests.push([node, node + ".length", node, node + ".length", node, node + ".length"]);
- splitTextTests.push([node, 1, node, 1, node, 3]);
- splitTextTests.push([node, 2, node, 1, node, 3]);
- splitTextTests.push([node, 3, node, 1, node, 3]);
-}
-
-splitTextTests.push(
- ["paras[0].firstChild", 1, "paras[0]", 0, "paras[0]", 0],
- ["paras[0].firstChild", 1, "paras[0]", 0, "paras[0]", 1],
- ["paras[0].firstChild", 1, "paras[0]", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 2, "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 3, "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 2, "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 3, "paras[0]", 0, "paras[0].firstChild", 3]
-);
-
-
-function testReplaceDataAlgorithm(node, offset, count, data, callback, startContainer, startOffset, endContainer, endOffset) {
- // Mutation works the same any time DOM Core's "replace data" algorithm is
- // invoked. node, offset, count, data are as in that algorithm. The
- // callback is what does the actual setting. Not to be confused with
- // testReplaceData, which tests the replaceData() method.
-
- // Barring any provision to the contrary, the containers and offsets must
- // not change.
- var expectedStartContainer = startContainer;
- var expectedStartOffset = startOffset;
- var expectedEndContainer = endContainer;
- var expectedEndOffset = endOffset;
-
- var originalParent = node.parentNode;
- var originalData = node.data;
-
- var exceptionThrown = false;
- try {
- callback();
- } catch (e) {
- // Should only happen if offset is greater than length
- exceptionThrown = true;
- }
-
- assert_equals(node.parentNode, originalParent,
- "Sanity check failed: changing data changed the parent");
-
- // "User agents must run the following steps whenever they replace data of
- // a CharacterData node, as though they were written in the specification
- // for that algorithm after all other steps. In particular, the steps must
- // not be executed if the algorithm threw an exception."
- if (exceptionThrown) {
- assert_equals(node.data, originalData,
- "Sanity check failed: exception thrown but data changed");
- } else {
- assert_equals(node.data,
- originalData.substr(0, offset) + data + originalData.substr(offset + count),
- "Sanity check failed: data not changed as expected");
- }
-
- // "For every boundary point whose node is node, and whose offset is
- // greater than offset but less than or equal to offset plus count, set
- // its offset to offset."
- if (!exceptionThrown
- && startContainer == node
- && startOffset > offset
- && startOffset <= offset + count) {
- expectedStartOffset = offset;
- }
-
- if (!exceptionThrown
- && endContainer == node
- && endOffset > offset
- && endOffset <= offset + count) {
- expectedEndOffset = offset;
- }
-
- // "For every boundary point whose node is node, and whose offset is
- // greater than offset plus count, add the length of data to its offset,
- // then subtract count from it."
- if (!exceptionThrown
- && startContainer == node
- && startOffset > offset + count) {
- expectedStartOffset += data.length - count;
- }
-
- if (!exceptionThrown
- && endContainer == node
- && endOffset > offset + count) {
- expectedEndOffset += data.length - count;
- }
-
- return [expectedStartContainer, expectedStartOffset, expectedEndContainer, expectedEndOffset];
-}
-
-function testInsertData(node, offset, data, startContainer, startOffset, endContainer, endOffset) {
- return testReplaceDataAlgorithm(node, offset, 0, data,
- function() { node.insertData(offset, data) },
- startContainer, startOffset, endContainer, endOffset);
-}
-
-var insertDataTests = [];
-for (var i = 0; i < characterDataNodes.length; i++) {
- var node = characterDataNodes[i];
- insertDataTests.push([node, 376, '"foo"', node, 0, node, 1]);
- insertDataTests.push([node, 0, '"foo"', node, 0, node, 0]);
- insertDataTests.push([node, 1, '"foo"', node, 1, node, 1]);
- insertDataTests.push([node, node + ".length", '"foo"', node, node + ".length", node, node + ".length"]);
- insertDataTests.push([node, 1, '"foo"', node, 1, node, 3]);
- insertDataTests.push([node, 2, '"foo"', node, 1, node, 3]);
- insertDataTests.push([node, 3, '"foo"', node, 1, node, 3]);
-
- insertDataTests.push([node, 376, '""', node, 0, node, 1]);
- insertDataTests.push([node, 0, '""', node, 0, node, 0]);
- insertDataTests.push([node, 1, '""', node, 1, node, 1]);
- insertDataTests.push([node, node + ".length", '""', node, node + ".length", node, node + ".length"]);
- insertDataTests.push([node, 1, '""', node, 1, node, 3]);
- insertDataTests.push([node, 2, '""', node, 1, node, 3]);
- insertDataTests.push([node, 3, '""', node, 1, node, 3]);
-}
-
-insertDataTests.push(
- ["paras[0].firstChild", 1, '"foo"', "paras[0]", 0, "paras[0]", 0],
- ["paras[0].firstChild", 1, '"foo"', "paras[0]", 0, "paras[0]", 1],
- ["paras[0].firstChild", 1, '"foo"', "paras[0]", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 2, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 3, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 2, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 3, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3]
-);
-
-
-function testAppendData(node, data, startContainer, startOffset, endContainer, endOffset) {
- return testReplaceDataAlgorithm(node, node.length, 0, data,
- function() { node.appendData(data) },
- startContainer, startOffset, endContainer, endOffset);
-}
-
-var appendDataTests = [];
-for (var i = 0; i < characterDataNodes.length; i++) {
- var node = characterDataNodes[i];
- appendDataTests.push([node, '"foo"', node, 0, node, 1]);
- appendDataTests.push([node, '"foo"', node, 0, node, 0]);
- appendDataTests.push([node, '"foo"', node, 1, node, 1]);
- appendDataTests.push([node, '"foo"', node, 0, node, node + ".length"]);
- appendDataTests.push([node, '"foo"', node, 1, node, node + ".length"]);
- appendDataTests.push([node, '"foo"', node, node + ".length", node, node + ".length"]);
- appendDataTests.push([node, '"foo"', node, 1, node, 3]);
-
- appendDataTests.push([node, '""', node, 0, node, 1]);
- appendDataTests.push([node, '""', node, 0, node, 0]);
- appendDataTests.push([node, '""', node, 1, node, 1]);
- appendDataTests.push([node, '""', node, 0, node, node + ".length"]);
- appendDataTests.push([node, '""', node, 1, node, node + ".length"]);
- appendDataTests.push([node, '""', node, node + ".length", node, node + ".length"]);
- appendDataTests.push([node, '""', node, 1, node, 3]);
-}
-
-appendDataTests.push(
- ["paras[0].firstChild", '""', "paras[0]", 0, "paras[0]", 0],
- ["paras[0].firstChild", '""', "paras[0]", 0, "paras[0]", 1],
- ["paras[0].firstChild", '""', "paras[0]", 1, "paras[0]", 1],
- ["paras[0].firstChild", '""', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", '""', "paras[0]", 0, "paras[0].firstChild", 3],
-
- ["paras[0].firstChild", '"foo"', "paras[0]", 0, "paras[0]", 0],
- ["paras[0].firstChild", '"foo"', "paras[0]", 0, "paras[0]", 1],
- ["paras[0].firstChild", '"foo"', "paras[0]", 1, "paras[0]", 1],
- ["paras[0].firstChild", '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", '"foo"', "paras[0]", 0, "paras[0].firstChild", 3]
-);
-
-
-function testDeleteData(node, offset, count, startContainer, startOffset, endContainer, endOffset) {
- return testReplaceDataAlgorithm(node, offset, count, "",
- function() { node.deleteData(offset, count) },
- startContainer, startOffset, endContainer, endOffset);
-}
-
-var deleteDataTests = [];
-for (var i = 0; i < characterDataNodes.length; i++) {
- var node = characterDataNodes[i];
- deleteDataTests.push([node, 376, 2, node, 0, node, 1]);
- deleteDataTests.push([node, 0, 2, node, 0, node, 0]);
- deleteDataTests.push([node, 1, 2, node, 1, node, 1]);
- deleteDataTests.push([node, node + ".length", 2, node, node + ".length", node, node + ".length"]);
- deleteDataTests.push([node, 1, 2, node, 1, node, 3]);
- deleteDataTests.push([node, 2, 2, node, 1, node, 3]);
- deleteDataTests.push([node, 3, 2, node, 1, node, 3]);
-
- deleteDataTests.push([node, 376, 0, node, 0, node, 1]);
- deleteDataTests.push([node, 0, 0, node, 0, node, 0]);
- deleteDataTests.push([node, 1, 0, node, 1, node, 1]);
- deleteDataTests.push([node, node + ".length", 0, node, node + ".length", node, node + ".length"]);
- deleteDataTests.push([node, 1, 0, node, 1, node, 3]);
- deleteDataTests.push([node, 2, 0, node, 1, node, 3]);
- deleteDataTests.push([node, 3, 0, node, 1, node, 3]);
-
- deleteDataTests.push([node, 376, 631, node, 0, node, 1]);
- deleteDataTests.push([node, 0, 631, node, 0, node, 0]);
- deleteDataTests.push([node, 1, 631, node, 1, node, 1]);
- deleteDataTests.push([node, node + ".length", 631, node, node + ".length", node, node + ".length"]);
- deleteDataTests.push([node, 1, 631, node, 1, node, 3]);
- deleteDataTests.push([node, 2, 631, node, 1, node, 3]);
- deleteDataTests.push([node, 3, 631, node, 1, node, 3]);
-}
-
-deleteDataTests.push(
- ["paras[0].firstChild", 1, 2, "paras[0]", 0, "paras[0]", 0],
- ["paras[0].firstChild", 1, 2, "paras[0]", 0, "paras[0]", 1],
- ["paras[0].firstChild", 1, 2, "paras[0]", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, 2, "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 2, 2, "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 3, 2, "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, 2, "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 2, 2, "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 3, 2, "paras[0]", 0, "paras[0].firstChild", 3]
-);
-
-
-function testReplaceData(node, offset, count, data, startContainer, startOffset, endContainer, endOffset) {
- return testReplaceDataAlgorithm(node, offset, count, data,
- function() { node.replaceData(offset, count, data) },
- startContainer, startOffset, endContainer, endOffset);
-}
-
-var replaceDataTests = [];
-for (var i = 0; i < characterDataNodes.length; i++) {
- var node = characterDataNodes[i];
- replaceDataTests.push([node, 376, 0, '"foo"', node, 0, node, 1]);
- replaceDataTests.push([node, 0, 0, '"foo"', node, 0, node, 0]);
- replaceDataTests.push([node, 1, 0, '"foo"', node, 1, node, 1]);
- replaceDataTests.push([node, node + ".length", 0, '"foo"', node, node + ".length", node, node + ".length"]);
- replaceDataTests.push([node, 1, 0, '"foo"', node, 1, node, 3]);
- replaceDataTests.push([node, 2, 0, '"foo"', node, 1, node, 3]);
- replaceDataTests.push([node, 3, 0, '"foo"', node, 1, node, 3]);
-
- replaceDataTests.push([node, 376, 0, '""', node, 0, node, 1]);
- replaceDataTests.push([node, 0, 0, '""', node, 0, node, 0]);
- replaceDataTests.push([node, 1, 0, '""', node, 1, node, 1]);
- replaceDataTests.push([node, node + ".length", 0, '""', node, node + ".length", node, node + ".length"]);
- replaceDataTests.push([node, 1, 0, '""', node, 1, node, 3]);
- replaceDataTests.push([node, 2, 0, '""', node, 1, node, 3]);
- replaceDataTests.push([node, 3, 0, '""', node, 1, node, 3]);
-
- replaceDataTests.push([node, 376, 1, '"foo"', node, 0, node, 1]);
- replaceDataTests.push([node, 0, 1, '"foo"', node, 0, node, 0]);
- replaceDataTests.push([node, 1, 1, '"foo"', node, 1, node, 1]);
- replaceDataTests.push([node, node + ".length", 1, '"foo"', node, node + ".length", node, node + ".length"]);
- replaceDataTests.push([node, 1, 1, '"foo"', node, 1, node, 3]);
- replaceDataTests.push([node, 2, 1, '"foo"', node, 1, node, 3]);
- replaceDataTests.push([node, 3, 1, '"foo"', node, 1, node, 3]);
-
- replaceDataTests.push([node, 376, 1, '""', node, 0, node, 1]);
- replaceDataTests.push([node, 0, 1, '""', node, 0, node, 0]);
- replaceDataTests.push([node, 1, 1, '""', node, 1, node, 1]);
- replaceDataTests.push([node, node + ".length", 1, '""', node, node + ".length", node, node + ".length"]);
- replaceDataTests.push([node, 1, 1, '""', node, 1, node, 3]);
- replaceDataTests.push([node, 2, 1, '""', node, 1, node, 3]);
- replaceDataTests.push([node, 3, 1, '""', node, 1, node, 3]);
-
- replaceDataTests.push([node, 376, 47, '"foo"', node, 0, node, 1]);
- replaceDataTests.push([node, 0, 47, '"foo"', node, 0, node, 0]);
- replaceDataTests.push([node, 1, 47, '"foo"', node, 1, node, 1]);
- replaceDataTests.push([node, node + ".length", 47, '"foo"', node, node + ".length", node, node + ".length"]);
- replaceDataTests.push([node, 1, 47, '"foo"', node, 1, node, 3]);
- replaceDataTests.push([node, 2, 47, '"foo"', node, 1, node, 3]);
- replaceDataTests.push([node, 3, 47, '"foo"', node, 1, node, 3]);
-
- replaceDataTests.push([node, 376, 47, '""', node, 0, node, 1]);
- replaceDataTests.push([node, 0, 47, '""', node, 0, node, 0]);
- replaceDataTests.push([node, 1, 47, '""', node, 1, node, 1]);
- replaceDataTests.push([node, node + ".length", 47, '""', node, node + ".length", node, node + ".length"]);
- replaceDataTests.push([node, 1, 47, '""', node, 1, node, 3]);
- replaceDataTests.push([node, 2, 47, '""', node, 1, node, 3]);
- replaceDataTests.push([node, 3, 47, '""', node, 1, node, 3]);
-}
-
-replaceDataTests.push(
- ["paras[0].firstChild", 1, 0, '"foo"', "paras[0]", 0, "paras[0]", 0],
- ["paras[0].firstChild", 1, 0, '"foo"', "paras[0]", 0, "paras[0]", 1],
- ["paras[0].firstChild", 1, 0, '"foo"', "paras[0]", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, 0, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 2, 0, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 3, 0, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, 0, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 2, 0, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 3, 0, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3],
-
- ["paras[0].firstChild", 1, 1, '"foo"', "paras[0]", 0, "paras[0]", 0],
- ["paras[0].firstChild", 1, 1, '"foo"', "paras[0]", 0, "paras[0]", 1],
- ["paras[0].firstChild", 1, 1, '"foo"', "paras[0]", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, 1, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 2, 1, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 3, 1, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, 1, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 2, 1, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 3, 1, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3],
-
- ["paras[0].firstChild", 1, 47, '"foo"', "paras[0]", 0, "paras[0]", 0],
- ["paras[0].firstChild", 1, 47, '"foo"', "paras[0]", 0, "paras[0]", 1],
- ["paras[0].firstChild", 1, 47, '"foo"', "paras[0]", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, 47, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 2, 47, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 3, 47, '"foo"', "paras[0].firstChild", 1, "paras[0]", 1],
- ["paras[0].firstChild", 1, 47, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 2, 47, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3],
- ["paras[0].firstChild", 3, 47, '"foo"', "paras[0]", 0, "paras[0].firstChild", 3]
-);
-
-
-// There are lots of ways to set data, so we pass a callback that does the
-// actual setting.
-function testDataChange(node, attr, op, rval, startContainer, startOffset, endContainer, endOffset) {
- return testReplaceDataAlgorithm(node, 0, node.length, op == "=" ? rval : node[attr] + rval,
- function() {
- if (op == "=") {
- node[attr] = rval;
- } else if (op == "+=") {
- node[attr] += rval;
- } else {
- throw "Unknown op " + op;
- }
- },
- startContainer, startOffset, endContainer, endOffset);
-}
-
-var dataChangeTests = [];
-var dataChangeTestAttrs = ["data", "textContent", "nodeValue"];
-for (var i = 0; i < characterDataNodes.length; i++) {
- var node = characterDataNodes[i];
- var dataChangeTestRanges = [
- [node, 0, node, 0],
- [node, 0, node, 1],
- [node, 1, node, 1],
- [node, 0, node, node + ".length"],
- [node, 1, node, node + ".length"],
- [node, node + ".length", node, node + ".length"],
- ];
-
- for (var j = 0; j < dataChangeTestRanges.length; j++) {
- for (var k = 0; k < dataChangeTestAttrs.length; k++) {
- dataChangeTests.push([
- node,
- '"' + dataChangeTestAttrs[k] + '"',
- '"="',
- '""',
- ].concat(dataChangeTestRanges[j]));
-
- dataChangeTests.push([
- node,
- '"' + dataChangeTestAttrs[k] + '"',
- '"="',
- '"foo"',
- ].concat(dataChangeTestRanges[j]));
-
- dataChangeTests.push([
- node,
- '"' + dataChangeTestAttrs[k] + '"',
- '"="',
- node + "." + dataChangeTestAttrs[k],
- ].concat(dataChangeTestRanges[j]));
-
- dataChangeTests.push([
- node,
- '"' + dataChangeTestAttrs[k] + '"',
- '"+="',
- '""',
- ].concat(dataChangeTestRanges[j]));
-
- dataChangeTests.push([
- node,
- '"' + dataChangeTestAttrs[k] + '"',
- '"+="',
- '"foo"',
- ].concat(dataChangeTestRanges[j]));
-
- dataChangeTests.push([
- node,
- '"' + dataChangeTestAttrs[k] + '"',
- '"+="',
- node + "." + dataChangeTestAttrs[k]
- ].concat(dataChangeTestRanges[j]));
- }
- }
-}
-
-
-// Now we test node insertions and deletions, as opposed to just data changes.
-// To avoid loads of repetition, we define modifyForRemove() and
-// modifyForInsert().
-
-// If we were to remove removedNode from its parent, what would the boundary
-// point [node, offset] become? Returns [new node, new offset]. Must be
-// called BEFORE the node is actually removed, so its parent is not null. (If
-// the parent is null, it will do nothing.)
-function modifyForRemove(removedNode, point) {
- var oldParent = removedNode.parentNode;
- var oldIndex = indexOf(removedNode);
- if (!oldParent) {
- return point;
- }
-
- // "For each boundary point whose node is removed node or a descendant of
- // it, set the boundary point to (old parent, old index)."
- if (point[0] == removedNode || isDescendant(point[0], removedNode)) {
- return [oldParent, oldIndex];
- }
-
- // "For each boundary point whose node is old parent and whose offset is
- // greater than old index, subtract one from its offset."
- if (point[0] == oldParent && point[1] > oldIndex) {
- return [point[0], point[1] - 1];
- }
-
- return point;
-}
-
-// Update the given boundary point [node, offset] to account for the fact that
-// insertedNode was just inserted into its current position. This must be
-// called AFTER insertedNode was already inserted.
-function modifyForInsert(insertedNode, point) {
- // "For each boundary point whose node is the new parent of the affected
- // node and whose offset is greater than the new index of the affected
- // node, add one to the boundary point's offset."
- if (point[0] == insertedNode.parentNode && point[1] > indexOf(insertedNode)) {
- return [point[0], point[1] + 1];
- }
-
- return point;
-}
-
-
-function testInsertBefore(newParent, affectedNode, refNode, startContainer, startOffset, endContainer, endOffset) {
- var expectedStart = [startContainer, startOffset];
- var expectedEnd = [endContainer, endOffset];
-
- expectedStart = modifyForRemove(affectedNode, expectedStart);
- expectedEnd = modifyForRemove(affectedNode, expectedEnd);
-
- try {
- newParent.insertBefore(affectedNode, refNode);
- } catch (e) {
- // For our purposes, assume that DOM Core is true -- i.e., ignore
- // mutation events and similar.
- return [startContainer, startOffset, endContainer, endOffset];
- }
-
- expectedStart = modifyForInsert(affectedNode, expectedStart);
- expectedEnd = modifyForInsert(affectedNode, expectedEnd);
-
- return expectedStart.concat(expectedEnd);
-}
-
-var insertBeforeTests = [
- // Moving a node to its current position
- ["testDiv", "paras[0]", "paras[1]", "paras[0]", 0, "paras[0]", 0],
- ["testDiv", "paras[0]", "paras[1]", "paras[0]", 0, "paras[0]", 1],
- ["testDiv", "paras[0]", "paras[1]", "paras[0]", 1, "paras[0]", 1],
- ["testDiv", "paras[0]", "paras[1]", "testDiv", 0, "testDiv", 2],
- ["testDiv", "paras[0]", "paras[1]", "testDiv", 1, "testDiv", 1],
- ["testDiv", "paras[0]", "paras[1]", "testDiv", 1, "testDiv", 2],
- ["testDiv", "paras[0]", "paras[1]", "testDiv", 2, "testDiv", 2],
-
- // Stuff that actually moves something. Note that paras[0] and paras[1]
- // are both children of testDiv.
- ["paras[0]", "paras[1]", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 0],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "paras[0]", 1, "paras[0]", 1],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "testDiv", 0, "testDiv", 1],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "testDiv", 0, "testDiv", 2],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "testDiv", 1, "testDiv", 1],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "testDiv", 1, "testDiv", 2],
- ["paras[0]", "paras[1]", "null", "paras[0]", 0, "paras[0]", 0],
- ["paras[0]", "paras[1]", "null", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "paras[1]", "null", "paras[0]", 1, "paras[0]", 1],
- ["paras[0]", "paras[1]", "null", "testDiv", 0, "testDiv", 1],
- ["paras[0]", "paras[1]", "null", "testDiv", 0, "testDiv", 2],
- ["paras[0]", "paras[1]", "null", "testDiv", 1, "testDiv", 1],
- ["paras[0]", "paras[1]", "null", "testDiv", 1, "testDiv", 2],
- ["foreignDoc", "detachedComment", "foreignDoc.documentElement", "foreignDoc", 0, "foreignDoc", 0],
- ["foreignDoc", "detachedComment", "foreignDoc.documentElement", "foreignDoc", 0, "foreignDoc", 1],
- ["foreignDoc", "detachedComment", "foreignDoc.documentElement", "foreignDoc", 0, "foreignDoc", 2],
- ["foreignDoc", "detachedComment", "foreignDoc.documentElement", "foreignDoc", 1, "foreignDoc", 1],
- ["foreignDoc", "detachedComment", "foreignDoc.doctype", "foreignDoc", 0, "foreignDoc", 0],
- ["foreignDoc", "detachedComment", "foreignDoc.doctype", "foreignDoc", 0, "foreignDoc", 1],
- ["foreignDoc", "detachedComment", "foreignDoc.doctype", "foreignDoc", 0, "foreignDoc", 2],
- ["foreignDoc", "detachedComment", "foreignDoc.doctype", "foreignDoc", 1, "foreignDoc", 1],
- ["foreignDoc", "detachedComment", "null", "foreignDoc", 0, "foreignDoc", 1],
- ["paras[0]", "xmlTextNode", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 0],
- ["paras[0]", "xmlTextNode", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "xmlTextNode", "paras[0].firstChild", "paras[0]", 1, "paras[0]", 1],
-
- // Stuff that throws exceptions
- ["paras[0]", "paras[0]", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "testDiv", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "document", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "foreignDoc", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "document.doctype", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
-];
-
-
-function testReplaceChild(newParent, newChild, oldChild, startContainer, startOffset, endContainer, endOffset) {
- var expectedStart = [startContainer, startOffset];
- var expectedEnd = [endContainer, endOffset];
-
- expectedStart = modifyForRemove(oldChild, expectedStart);
- expectedEnd = modifyForRemove(oldChild, expectedEnd);
-
- if (newChild != oldChild) {
- // Don't do this twice, if they're the same!
- expectedStart = modifyForRemove(newChild, expectedStart);
- expectedEnd = modifyForRemove(newChild, expectedEnd);
- }
-
- try {
- newParent.replaceChild(newChild, oldChild);
- } catch (e) {
- return [startContainer, startOffset, endContainer, endOffset];
- }
-
- expectedStart = modifyForInsert(newChild, expectedStart);
- expectedEnd = modifyForInsert(newChild, expectedEnd);
-
- return expectedStart.concat(expectedEnd);
-}
-
-var replaceChildTests = [
- // Moving a node to its current position. Doesn't match most browsers'
- // behavior, but we probably want to keep the spec the same anyway:
- // https://bugzilla.mozilla.org/show_bug.cgi?id=647603
- ["testDiv", "paras[0]", "paras[0]", "paras[0]", 0, "paras[0]", 0],
- ["testDiv", "paras[0]", "paras[0]", "paras[0]", 0, "paras[0]", 1],
- ["testDiv", "paras[0]", "paras[0]", "paras[0]", 1, "paras[0]", 1],
- ["testDiv", "paras[0]", "paras[0]", "testDiv", 0, "testDiv", 2],
- ["testDiv", "paras[0]", "paras[0]", "testDiv", 1, "testDiv", 1],
- ["testDiv", "paras[0]", "paras[0]", "testDiv", 1, "testDiv", 2],
- ["testDiv", "paras[0]", "paras[0]", "testDiv", 2, "testDiv", 2],
-
- // Stuff that actually moves something.
- ["paras[0]", "paras[1]", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 0],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "paras[0]", 1, "paras[0]", 1],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "testDiv", 0, "testDiv", 1],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "testDiv", 0, "testDiv", 2],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "testDiv", 1, "testDiv", 1],
- ["paras[0]", "paras[1]", "paras[0].firstChild", "testDiv", 1, "testDiv", 2],
- ["foreignDoc", "detachedComment", "foreignDoc.documentElement", "foreignDoc", 0, "foreignDoc", 0],
- ["foreignDoc", "detachedComment", "foreignDoc.documentElement", "foreignDoc", 0, "foreignDoc", 1],
- ["foreignDoc", "detachedComment", "foreignDoc.documentElement", "foreignDoc", 0, "foreignDoc", 2],
- ["foreignDoc", "detachedComment", "foreignDoc.documentElement", "foreignDoc", 1, "foreignDoc", 1],
- ["foreignDoc", "detachedComment", "foreignDoc.doctype", "foreignDoc", 0, "foreignDoc", 0],
- ["foreignDoc", "detachedComment", "foreignDoc.doctype", "foreignDoc", 0, "foreignDoc", 1],
- ["foreignDoc", "detachedComment", "foreignDoc.doctype", "foreignDoc", 0, "foreignDoc", 2],
- ["foreignDoc", "detachedComment", "foreignDoc.doctype", "foreignDoc", 1, "foreignDoc", 1],
- ["paras[0]", "xmlTextNode", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 0],
- ["paras[0]", "xmlTextNode", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "xmlTextNode", "paras[0].firstChild", "paras[0]", 1, "paras[0]", 1],
-
- // Stuff that throws exceptions
- ["paras[0]", "paras[0]", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "testDiv", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "document", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "foreignDoc", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "document.doctype", "paras[0].firstChild", "paras[0]", 0, "paras[0]", 1],
-];
-
-
-function testAppendChild(newParent, affectedNode, startContainer, startOffset, endContainer, endOffset) {
- var expectedStart = [startContainer, startOffset];
- var expectedEnd = [endContainer, endOffset];
-
- expectedStart = modifyForRemove(affectedNode, expectedStart);
- expectedEnd = modifyForRemove(affectedNode, expectedEnd);
-
- try {
- newParent.appendChild(affectedNode);
- } catch (e) {
- return [startContainer, startOffset, endContainer, endOffset];
- }
-
- // These two lines will actually never do anything, if you think about it,
- // but let's leave them in so correctness is more obvious.
- expectedStart = modifyForInsert(affectedNode, expectedStart);
- expectedEnd = modifyForInsert(affectedNode, expectedEnd);
-
- return expectedStart.concat(expectedEnd);
-}
-
-var appendChildTests = [
- // Moving a node to its current position
- ["testDiv", "testDiv.lastChild", "testDiv.lastChild", 0, "testDiv.lastChild", 0],
- ["testDiv", "testDiv.lastChild", "testDiv.lastChild", 0, "testDiv.lastChild", 1],
- ["testDiv", "testDiv.lastChild", "testDiv.lastChild", 1, "testDiv.lastChild", 1],
- ["testDiv", "testDiv.lastChild", "testDiv", "testDiv.childNodes.length - 2", "testDiv", "testDiv.childNodes.length"],
- ["testDiv", "testDiv.lastChild", "testDiv", "testDiv.childNodes.length - 2", "testDiv", "testDiv.childNodes.length - 1"],
- ["testDiv", "testDiv.lastChild", "testDiv", "testDiv.childNodes.length - 1", "testDiv", "testDiv.childNodes.length"],
- ["testDiv", "testDiv.lastChild", "testDiv", "testDiv.childNodes.length - 1", "testDiv", "testDiv.childNodes.length - 1"],
- ["testDiv", "testDiv.lastChild", "testDiv", "testDiv.childNodes.length", "testDiv", "testDiv.childNodes.length"],
- ["detachedDiv", "detachedDiv.lastChild", "detachedDiv.lastChild", 0, "detachedDiv.lastChild", 0],
- ["detachedDiv", "detachedDiv.lastChild", "detachedDiv.lastChild", 0, "detachedDiv.lastChild", 1],
- ["detachedDiv", "detachedDiv.lastChild", "detachedDiv.lastChild", 1, "detachedDiv.lastChild", 1],
- ["detachedDiv", "detachedDiv.lastChild", "detachedDiv", "detachedDiv.childNodes.length - 2", "detachedDiv", "detachedDiv.childNodes.length"],
- ["detachedDiv", "detachedDiv.lastChild", "detachedDiv", "detachedDiv.childNodes.length - 2", "detachedDiv", "detachedDiv.childNodes.length - 1"],
- ["detachedDiv", "detachedDiv.lastChild", "detachedDiv", "detachedDiv.childNodes.length - 1", "detachedDiv", "detachedDiv.childNodes.length"],
- ["detachedDiv", "detachedDiv.lastChild", "detachedDiv", "detachedDiv.childNodes.length - 1", "detachedDiv", "detachedDiv.childNodes.length - 1"],
- ["detachedDiv", "detachedDiv.lastChild", "detachedDiv", "detachedDiv.childNodes.length", "detachedDiv", "detachedDiv.childNodes.length"],
-
- // Stuff that actually moves something
- ["paras[0]", "paras[1]", "paras[0]", 0, "paras[0]", 0],
- ["paras[0]", "paras[1]", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "paras[1]", "paras[0]", 1, "paras[0]", 1],
- ["paras[0]", "paras[1]", "testDiv", 0, "testDiv", 1],
- ["paras[0]", "paras[1]", "testDiv", 0, "testDiv", 2],
- ["paras[0]", "paras[1]", "testDiv", 1, "testDiv", 1],
- ["paras[0]", "paras[1]", "testDiv", 1, "testDiv", 2],
- ["foreignDoc", "detachedComment", "foreignDoc", "foreignDoc.childNodes.length - 1", "foreignDoc", "foreignDoc.childNodes.length"],
- ["foreignDoc", "detachedComment", "foreignDoc", "foreignDoc.childNodes.length - 1", "foreignDoc", "foreignDoc.childNodes.length - 1"],
- ["foreignDoc", "detachedComment", "foreignDoc", "foreignDoc.childNodes.length", "foreignDoc", "foreignDoc.childNodes.length"],
- ["foreignDoc", "detachedComment", "detachedComment", 0, "detachedComment", 5],
- ["paras[0]", "xmlTextNode", "paras[0]", 0, "paras[0]", 0],
- ["paras[0]", "xmlTextNode", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "xmlTextNode", "paras[0]", 1, "paras[0]", 1],
-
- // Stuff that throws exceptions
- ["paras[0]", "paras[0]", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "testDiv", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "document", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "foreignDoc", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "document.doctype", "paras[0]", 0, "paras[0]", 1],
-];
-
-
-function testRemoveChild(affectedNode, startContainer, startOffset, endContainer, endOffset) {
- var expectedStart = [startContainer, startOffset];
- var expectedEnd = [endContainer, endOffset];
-
- expectedStart = modifyForRemove(affectedNode, expectedStart);
- expectedEnd = modifyForRemove(affectedNode, expectedEnd);
-
- // We don't test cases where the parent is wrong, so this should never
- // throw an exception.
- affectedNode.parentNode.removeChild(affectedNode);
-
- return expectedStart.concat(expectedEnd);
-}
-
-var removeChildTests = [
- ["paras[0]", "paras[0]", 0, "paras[0]", 0],
- ["paras[0]", "paras[0]", 0, "paras[0]", 1],
- ["paras[0]", "paras[0]", 1, "paras[0]", 1],
- ["paras[0]", "testDiv", 0, "testDiv", 0],
- ["paras[0]", "testDiv", 0, "testDiv", 1],
- ["paras[0]", "testDiv", 1, "testDiv", 1],
- ["paras[0]", "testDiv", 0, "testDiv", 2],
- ["paras[0]", "testDiv", 1, "testDiv", 2],
- ["paras[0]", "testDiv", 2, "testDiv", 2],
-
- ["foreignDoc.documentElement", "foreignDoc", 0, "foreignDoc", "foreignDoc.childNodes.length"],
-];
-
-
-// Finally run everything. All grouped together at the end so that I can
-// easily comment out some of them, so I don't have to wait for all test types
-// to debug only some of them.
-doTests(splitTextTests, function(params) { return params[0] + ".splitText(" + params[1] + ")" }, testSplitText);
-doTests(insertDataTests, function(params) { return params[0] + ".insertData(" + params[1] + ", " + params[2] + ")" }, testInsertData);
-doTests(appendDataTests, function(params) { return params[0] + ".appendData(" + params[1] + ")" }, testAppendData);
-doTests(deleteDataTests, function(params) { return params[0] + ".deleteData(" + params[1] + ", " + params[2] + ")" }, testDeleteData);
-doTests(replaceDataTests, function(params) { return params[0] + ".replaceData(" + params[1] + ", " + params[2] + ", " + params[3] + ")" }, testReplaceData);
-doTests(dataChangeTests, function(params) { return params[0] + "." + eval(params[1]) + " " + eval(params[2]) + ' ' + params[3] }, testDataChange);
-doTests(insertBeforeTests, function(params) { return params[0] + ".insertBefore(" + params[1] + ", " + params[2] + ")" }, testInsertBefore);
-doTests(replaceChildTests, function(params) { return params[0] + ".replaceChild(" + params[1] + ", " + params[2] + ")" }, testReplaceChild);
-doTests(appendChildTests, function(params) { return params[0] + ".appendChild(" + params[1] + ")" }, testAppendChild);
-doTests(removeChildTests, function(params) { return params[0] + ".parentNode.removeChild(" + params[0] + ")" }, testRemoveChild);
-
-
-testDiv.style.display = "none";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-selectNode.html b/testing/web-platform/tests/dom/ranges/Range-selectNode.html
deleted file mode 100644
index 2d9ec6b9a..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-selectNode.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!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>
diff --git a/testing/web-platform/tests/dom/ranges/Range-set.html b/testing/web-platform/tests/dom/ranges/Range-set.html
deleted file mode 100644
index 5b43c04f4..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-set.html
+++ /dev/null
@@ -1,221 +0,0 @@
-<!doctype html>
-<title>Range setting 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 testSetStart(range, node, offset) {
- if (node.nodeType == Node.DOCUMENT_TYPE_NODE) {
- assert_throws("INVALID_NODE_TYPE_ERR", function() {
- range.setStart(node, offset);
- }, "setStart() to a doctype must throw INVALID_NODE_TYPE_ERR");
- return;
- }
-
- if (offset < 0 || offset > nodeLength(node)) {
- assert_throws("INDEX_SIZE_ERR", function() {
- range.setStart(node, offset);
- }, "setStart() to a too-large offset must throw INDEX_SIZE_ERR");
- return;
- }
-
- var newRange = range.cloneRange();
- newRange.setStart(node, offset);
-
- assert_equals(newRange.startContainer, node,
- "setStart() must change startContainer to the new node");
- assert_equals(newRange.startOffset, offset,
- "setStart() must change startOffset to the new offset");
-
- // FIXME: I'm assuming comparePoint() is correct, but the tests for that
- // will depend on setStart()/setEnd().
- if (furthestAncestor(node) != furthestAncestor(range.startContainer)
- || range.comparePoint(node, offset) > 0) {
- assert_equals(newRange.endContainer, node,
- "setStart(node, offset) where node is after current end or in different document must set the end node to node too");
- assert_equals(newRange.endOffset, offset,
- "setStart(node, offset) where node is after current end or in different document must set the end offset to offset too");
- } else {
- assert_equals(newRange.endContainer, range.endContainer,
- "setStart() must not change the end node if the new start is before the old end");
- assert_equals(newRange.endOffset, range.endOffset,
- "setStart() must not change the end offset if the new start is before the old end");
- }
-}
-
-function testSetEnd(range, node, offset) {
- if (node.nodeType == Node.DOCUMENT_TYPE_NODE) {
- assert_throws("INVALID_NODE_TYPE_ERR", function() {
- range.setEnd(node, offset);
- }, "setEnd() to a doctype must throw INVALID_NODE_TYPE_ERR");
- return;
- }
-
- if (offset < 0 || offset > nodeLength(node)) {
- assert_throws("INDEX_SIZE_ERR", function() {
- range.setEnd(node, offset);
- }, "setEnd() to a too-large offset must throw INDEX_SIZE_ERR");
- return;
- }
-
- var newRange = range.cloneRange();
- newRange.setEnd(node, offset);
-
- // FIXME: I'm assuming comparePoint() is correct, but the tests for that
- // will depend on setStart()/setEnd().
- if (furthestAncestor(node) != furthestAncestor(range.startContainer)
- || range.comparePoint(node, offset) < 0) {
- assert_equals(newRange.startContainer, node,
- "setEnd(node, offset) where node is before current start or in different document must set the end node to node too");
- assert_equals(newRange.startOffset, offset,
- "setEnd(node, offset) where node is before current start or in different document must set the end offset to offset too");
- } else {
- assert_equals(newRange.startContainer, range.startContainer,
- "setEnd() must not change the start node if the new end is after the old start");
- assert_equals(newRange.startOffset, range.startOffset,
- "setEnd() must not change the start offset if the new end is after the old start");
- }
-
- assert_equals(newRange.endContainer, node,
- "setEnd() must change endContainer to the new node");
- assert_equals(newRange.endOffset, offset,
- "setEnd() must change endOffset to the new offset");
-}
-
-function testSetStartBefore(range, node) {
- var parent = node.parentNode;
- if (parent === null) {
- assert_throws("INVALID_NODE_TYPE_ERR", function () {
- range.setStartBefore(node);
- }, "setStartBefore() to a node with null parent must throw INVALID_NODE_TYPE_ERR");
- return;
- }
-
- var idx = 0;
- while (node.parentNode.childNodes[idx] != node) {
- idx++;
- }
-
- testSetStart(range, node.parentNode, idx);
-}
-
-function testSetStartAfter(range, node) {
- var parent = node.parentNode;
- if (parent === null) {
- assert_throws("INVALID_NODE_TYPE_ERR", function () {
- range.setStartAfter(node);
- }, "setStartAfter() to a node with null parent must throw INVALID_NODE_TYPE_ERR");
- return;
- }
-
- var idx = 0;
- while (node.parentNode.childNodes[idx] != node) {
- idx++;
- }
-
- testSetStart(range, node.parentNode, idx + 1);
-}
-
-function testSetEndBefore(range, node) {
- var parent = node.parentNode;
- if (parent === null) {
- assert_throws("INVALID_NODE_TYPE_ERR", function () {
- range.setEndBefore(node);
- }, "setEndBefore() to a node with null parent must throw INVALID_NODE_TYPE_ERR");
- return;
- }
-
- var idx = 0;
- while (node.parentNode.childNodes[idx] != node) {
- idx++;
- }
-
- testSetEnd(range, node.parentNode, idx);
-}
-
-function testSetEndAfter(range, node) {
- var parent = node.parentNode;
- if (parent === null) {
- assert_throws("INVALID_NODE_TYPE_ERR", function () {
- range.setEndAfter(node);
- }, "setEndAfter() to a node with null parent must throw INVALID_NODE_TYPE_ERR");
- return;
- }
-
- var idx = 0;
- while (node.parentNode.childNodes[idx] != node) {
- idx++;
- }
-
- testSetEnd(range, node.parentNode, idx + 1);
-}
-
-
-var startTests = [];
-var endTests = [];
-var startBeforeTests = [];
-var startAfterTests = [];
-var endBeforeTests = [];
-var endAfterTests = [];
-
-// Don't want to eval() each point a bazillion times
-var testPointsCached = testPoints.map(eval);
-var testNodesCached = testNodesShort.map(eval);
-
-for (var i = 0; i < testRangesShort.length; i++) {
- var endpoints = eval(testRangesShort[i]);
- var range;
- test(function() {
- range = ownerDocument(endpoints[0]).createRange();
- range.setStart(endpoints[0], endpoints[1]);
- range.setEnd(endpoints[2], endpoints[3]);
- }, "Set up range " + i + " " + testRangesShort[i]);
-
- for (var j = 0; j < testPoints.length; j++) {
- startTests.push(["setStart() with range " + i + " " + testRangesShort[i] + ", point " + j + " " + testPoints[j],
- range,
- testPointsCached[j][0],
- testPointsCached[j][1]
- ]);
- endTests.push(["setEnd() with range " + i + " " + testRangesShort[i] + ", point " + j + " " + testPoints[j],
- range,
- testPointsCached[j][0],
- testPointsCached[j][1]
- ]);
- }
-
- for (var j = 0; j < testNodesShort.length; j++) {
- startBeforeTests.push(["setStartBefore() with range " + i + " " + testRangesShort[i] + ", node " + j + " " + testNodesShort[j],
- range,
- testNodesCached[j]
- ]);
- startAfterTests.push(["setStartAfter() with range " + i + " " + testRangesShort[i] + ", node " + j + " " + testNodesShort[j],
- range,
- testNodesCached[j]
- ]);
- endBeforeTests.push(["setEndBefore() with range " + i + " " + testRangesShort[i] + ", node " + j + " " + testNodesShort[j],
- range,
- testNodesCached[j]
- ]);
- endAfterTests.push(["setEndAfter() with range " + i + " " + testRangesShort[i] + ", node " + j + " " + testNodesShort[j],
- range,
- testNodesCached[j]
- ]);
- }
-}
-
-generate_tests(testSetStart, startTests);
-generate_tests(testSetEnd, endTests);
-generate_tests(testSetStartBefore, startBeforeTests);
-generate_tests(testSetStartAfter, startAfterTests);
-generate_tests(testSetEndBefore, endBeforeTests);
-generate_tests(testSetEndAfter, endAfterTests);
-
-testDiv.style.display = "none";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-stringifier.html b/testing/web-platform/tests/dom/ranges/Range-stringifier.html
deleted file mode 100644
index 330c7421e..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-stringifier.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype html>
-<meta charset="utf-8">
-<title>Range stringifier</title>
-<link rel="author" title="KiChjang" href="mailto:kungfukeith11@gmail.com">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id=test>Test div</div>
-<div id=another>Another div</div>
-<div id=last>Last div</div>
-<div id=log></div>
-<script>
-test(function() {
- var r = new Range();
- var testDiv = document.getElementById("test");
- test(function() {
- r.selectNodeContents(testDiv);
- assert_equals(r.collapsed, false);
- assert_equals(r.toString(), testDiv.textContent);
- }, "Node contents of a single div");
-
- var textNode = testDiv.childNodes[0];
- test(function() {
- r.setStart(textNode, 5);
- r.setEnd(textNode, 7);
- assert_equals(r.collapsed, false);
- assert_equals(r.toString(), "di");
- }, "Text node with offsets");
-
- var anotherDiv = document.getElementById("another");
- test(function() {
- r.setStart(testDiv, 0);
- r.setEnd(anotherDiv, 0);
- assert_equals(r.toString(), "Test div\n");
- }, "Two nodes, each with a text node");
-
- var lastDiv = document.getElementById("last");
- var lastText = lastDiv.childNodes[0];
- test(function() {
- r.setStart(textNode, 5);
- r.setEnd(lastText, 4);
- assert_equals(r.toString(), "div\nAnother div\nLast");
- }, "Three nodes with start offset and end offset on text nodes");
-});
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-surroundContents.html b/testing/web-platform/tests/dom/ranges/Range-surroundContents.html
deleted file mode 100644
index e8cc11b24..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-surroundContents.html
+++ /dev/null
@@ -1,324 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>Range.surroundContents() tests</title>
-<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
-<meta name=timeout content=long>
-<p>To debug test failures, add a query parameter "subtest" with the test id (like
-"?subtest=5,16"). Only that test will be run. Then you can look at the resulting
-iframes in the DOM.
-<div id=log></div>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=../common.js></script>
-<script>
-"use strict";
-
-testDiv.parentNode.removeChild(testDiv);
-
-function mySurroundContents(range, newParent) {
- try {
- // "If a non-Text node is partially contained in the context object,
- // throw a "InvalidStateError" exception and terminate these steps."
- var node = range.commonAncestorContainer;
- var stop = nextNodeDescendants(node);
- for (; node != stop; node = nextNode(node)) {
- if (node.nodeType != Node.TEXT_NODE
- && isPartiallyContained(node, range)) {
- return "INVALID_STATE_ERR";
- }
- }
-
- // "If newParent is a Document, DocumentType, or DocumentFragment node,
- // throw an "InvalidNodeTypeError" exception and terminate these
- // steps."
- if (newParent.nodeType == Node.DOCUMENT_NODE
- || newParent.nodeType == Node.DOCUMENT_TYPE_NODE
- || newParent.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {
- return "INVALID_NODE_TYPE_ERR";
- }
-
- // "Call extractContents() on the context object, and let fragment be
- // the result."
- var fragment = myExtractContents(range);
- if (typeof fragment == "string") {
- return fragment;
- }
-
- // "While newParent has children, remove its first child."
- while (newParent.childNodes.length) {
- newParent.removeChild(newParent.firstChild);
- }
-
- // "Call insertNode(newParent) on the context object."
- var ret = myInsertNode(range, newParent);
- if (typeof ret == "string") {
- return ret;
- }
-
- // "Call appendChild(fragment) on newParent."
- newParent.appendChild(fragment);
-
- // "Call selectNode(newParent) on the context object."
- //
- // We just reimplement this in-place.
- if (!newParent.parentNode) {
- return "INVALID_NODE_TYPE_ERR";
- }
- var index = indexOf(newParent);
- range.setStart(newParent.parentNode, index);
- range.setEnd(newParent.parentNode, index + 1);
- } catch (e) {
- return getDomExceptionName(e);
- }
-}
-
-function restoreIframe(iframe, i, j) {
- // Most of this function is designed to work around the fact that Opera
- // doesn't let you add a doctype to a document that no longer has one, in
- // any way I can figure out. I eventually compromised on something that
- // will still let Opera pass most tests that don't actually involve
- // doctypes.
- while (iframe.contentDocument.firstChild
- && iframe.contentDocument.firstChild.nodeType != Node.DOCUMENT_TYPE_NODE) {
- iframe.contentDocument.removeChild(iframe.contentDocument.firstChild);
- }
-
- while (iframe.contentDocument.lastChild
- && iframe.contentDocument.lastChild.nodeType != Node.DOCUMENT_TYPE_NODE) {
- iframe.contentDocument.removeChild(iframe.contentDocument.lastChild);
- }
-
- if (!iframe.contentDocument.firstChild) {
- // This will throw an exception in Opera if we reach here, which is why
- // I try to avoid it. It will never happen in a browser that obeys the
- // spec, so it's really just insurance. I don't think it actually gets
- // hit by anything.
- iframe.contentDocument.appendChild(iframe.contentDocument.implementation.createDocumentType("html", "", ""));
- }
- iframe.contentDocument.appendChild(referenceDoc.documentElement.cloneNode(true));
- iframe.contentWindow.setupRangeTests();
- iframe.contentWindow.testRangeInput = testRangesShort[i];
- iframe.contentWindow.testNodeInput = testNodesShort[j];
- iframe.contentWindow.run();
-}
-
-function testSurroundContents(i, j) {
- var actualRange;
- var expectedRange;
- var actualNode;
- var expectedNode;
- var actualRoots = [];
- var expectedRoots = [];
-
- domTests[i][j].step(function() {
- restoreIframe(actualIframe, i, j);
- restoreIframe(expectedIframe, i, j);
-
- actualRange = actualIframe.contentWindow.testRange;
- expectedRange = expectedIframe.contentWindow.testRange;
- actualNode = actualIframe.contentWindow.testNode;
- expectedNode = expectedIframe.contentWindow.testNode;
-
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual surroundContents()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated surroundContents()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_false(actualRange === null,
- "Range produced in actual iframe was null");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
- assert_false(expectedRange === null,
- "Range produced in expected iframe was null");
- assert_equals(typeof actualNode, "object",
- "typeof Node produced in actual iframe");
- assert_false(actualNode === null,
- "Node produced in actual iframe was null");
- assert_equals(typeof expectedNode, "object",
- "typeof Node produced in expected iframe");
- assert_false(expectedNode === null,
- "Node produced in expected iframe was null");
-
- // We want to test that the trees containing the ranges are equal, and
- // also the trees containing the moved nodes. These might not be the
- // same, if we're inserting a node from a detached tree or a different
- // document.
- actualRoots.push(furthestAncestor(actualRange.startContainer));
- expectedRoots.push(furthestAncestor(expectedRange.startContainer));
-
- if (furthestAncestor(actualNode) != actualRoots[0]) {
- actualRoots.push(furthestAncestor(actualNode));
- }
- if (furthestAncestor(expectedNode) != expectedRoots[0]) {
- expectedRoots.push(furthestAncestor(expectedNode));
- }
-
- assert_equals(actualRoots.length, expectedRoots.length,
- "Either the actual node and actual range are in the same tree but the expected are in different trees, or vice versa");
-
- // This doctype stuff is to work around the fact that Opera 11.00 will
- // move around doctypes within a document, even to totally invalid
- // positions, but it won't allow a new doctype to be added to a
- // document in any way I can figure out. So if we try moving a doctype
- // to some invalid place, in Opera it will actually succeed, and then
- // restoreIframe() will remove the doctype along with the root element,
- // and then nothing can re-add the doctype. So instead, we catch it
- // during the test itself and move it back to the right place while we
- // still can.
- //
- // I spent *way* too much time debugging and working around this bug.
- var actualDoctype = actualIframe.contentDocument.doctype;
- var expectedDoctype = expectedIframe.contentDocument.doctype;
-
- var result;
- try {
- result = mySurroundContents(expectedRange, expectedNode);
- } catch (e) {
- if (expectedDoctype != expectedIframe.contentDocument.firstChild) {
- expectedIframe.contentDocument.insertBefore(expectedDoctype, expectedIframe.contentDocument.firstChild);
- }
- throw e;
- }
- if (typeof result == "string") {
- assert_throws(result, function() {
- try {
- actualRange.surroundContents(actualNode);
- } catch (e) {
- if (expectedDoctype != expectedIframe.contentDocument.firstChild) {
- expectedIframe.contentDocument.insertBefore(expectedDoctype, expectedIframe.contentDocument.firstChild);
- }
- if (actualDoctype != actualIframe.contentDocument.firstChild) {
- actualIframe.contentDocument.insertBefore(actualDoctype, actualIframe.contentDocument.firstChild);
- }
- throw e;
- }
- }, "A " + result + " must be thrown in this case");
- // Don't return, we still need to test DOM equality
- } else {
- try {
- actualRange.surroundContents(actualNode);
- } catch (e) {
- if (expectedDoctype != expectedIframe.contentDocument.firstChild) {
- expectedIframe.contentDocument.insertBefore(expectedDoctype, expectedIframe.contentDocument.firstChild);
- }
- if (actualDoctype != actualIframe.contentDocument.firstChild) {
- actualIframe.contentDocument.insertBefore(actualDoctype, actualIframe.contentDocument.firstChild);
- }
- throw e;
- }
- }
-
- for (var k = 0; k < actualRoots.length; k++) {
- assertNodesEqual(actualRoots[k], expectedRoots[k], k ? "moved node's tree root" : "range's tree root");
- }
- });
- domTests[i][j].done();
-
- positionTests[i][j].step(function() {
- assert_equals(actualIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for actual surroundContents()");
- assert_equals(expectedIframe.contentWindow.unexpectedException, null,
- "Unexpected exception thrown when setting up Range for simulated surroundContents()");
- assert_equals(typeof actualRange, "object",
- "typeof Range produced in actual iframe");
- assert_false(actualRange === null,
- "Range produced in actual iframe was null");
- assert_equals(typeof expectedRange, "object",
- "typeof Range produced in expected iframe");
- assert_false(expectedRange === null,
- "Range produced in expected iframe was null");
- assert_equals(typeof actualNode, "object",
- "typeof Node produced in actual iframe");
- assert_false(actualNode === null,
- "Node produced in actual iframe was null");
- assert_equals(typeof expectedNode, "object",
- "typeof Node produced in expected iframe");
- assert_false(expectedNode === null,
- "Node produced in expected iframe was null");
-
- for (var k = 0; k < actualRoots.length; k++) {
- assertNodesEqual(actualRoots[k], expectedRoots[k], k ? "moved node's tree root" : "range's tree root");
- }
-
- assert_equals(actualRange.startOffset, expectedRange.startOffset,
- "Unexpected startOffset after surroundContents()");
- assert_equals(actualRange.endOffset, expectedRange.endOffset,
- "Unexpected endOffset after surroundContents()");
- // How do we decide that the two nodes are equal, since they're in
- // different trees? Since the DOMs are the same, it's enough to check
- // that the index in the parent is the same all the way up the tree.
- // But we can first cheat by just checking they're actually equal.
- assert_true(actualRange.startContainer.isEqualNode(expectedRange.startContainer),
- "Unexpected startContainer after surroundContents(), expected " +
- expectedRange.startContainer.nodeName.toLowerCase() + " but got " +
- actualRange.startContainer.nodeName.toLowerCase());
- var currentActual = actualRange.startContainer;
- var currentExpected = expectedRange.startContainer;
- var actual = "";
- var expected = "";
- while (currentActual && currentExpected) {
- actual = indexOf(currentActual) + "-" + actual;
- expected = indexOf(currentExpected) + "-" + expected;
-
- currentActual = currentActual.parentNode;
- currentExpected = currentExpected.parentNode;
- }
- actual = actual.substr(0, actual.length - 1);
- expected = expected.substr(0, expected.length - 1);
- assert_equals(actual, expected,
- "startContainer superficially looks right but is actually the wrong node if you trace back its index in all its ancestors (I'm surprised this actually happened");
- });
- positionTests[i][j].done();
-}
-
-var iStart = 0;
-var iStop = testRangesShort.length;
-var jStart = 0;
-var jStop = testNodesShort.length;
-
-if (/subtest=[0-9]+,[0-9]+/.test(location.search)) {
- var matches = /subtest=([0-9]+),([0-9]+)/.exec(location.search);
- iStart = Number(matches[1]);
- iStop = Number(matches[1]) + 1;
- jStart = Number(matches[2]) + 0;
- jStop = Number(matches[2]) + 1;
-}
-
-var domTests = [];
-var positionTests = [];
-for (var i = iStart; i < iStop; i++) {
- domTests[i] = [];
- positionTests[i] = [];
- for (var j = jStart; j < jStop; j++) {
- domTests[i][j] = async_test(i + "," + j + ": resulting DOM for range " + testRangesShort[i] + ", node " + testNodesShort[j]);
- positionTests[i][j] = async_test(i + "," + j + ": resulting range position for range " + testRangesShort[i] + ", node " + testNodesShort[j]);
- }
-}
-
-var actualIframe = document.createElement("iframe");
-actualIframe.style.display = "none";
-actualIframe.id = "actual";
-document.body.appendChild(actualIframe);
-
-var expectedIframe = document.createElement("iframe");
-expectedIframe.style.display = "none";
-expectedIframe.id = "expected";
-document.body.appendChild(expectedIframe);
-
-var referenceDoc = document.implementation.createHTMLDocument("");
-referenceDoc.removeChild(referenceDoc.documentElement);
-
-actualIframe.onload = function() {
- expectedIframe.onload = function() {
- for (var i = iStart; i < iStop; i++) {
- for (var j = jStart; j < jStop; j++) {
- testSurroundContents(i, j);
- }
- }
- }
- expectedIframe.src = "Range-test-iframe.html";
- referenceDoc.appendChild(actualIframe.contentDocument.documentElement.cloneNode(true));
-}
-actualIframe.src = "Range-test-iframe.html";
-</script>
diff --git a/testing/web-platform/tests/dom/ranges/Range-test-iframe.html b/testing/web-platform/tests/dom/ranges/Range-test-iframe.html
deleted file mode 100644
index f354ff758..000000000
--- a/testing/web-platform/tests/dom/ranges/Range-test-iframe.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!doctype html>
-<title>Range test iframe</title>
-<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
-<meta name=timeout content=long>
-<body onload=run()>
-<script src=../common.js></script>
-<script>
-"use strict";
-
-// This script only exists because we want to evaluate the range endpoints
-// in each iframe using that iframe's local variables set up by common.js. It
-// just creates the range and does nothing else. The data is returned via
-// window.testRange, and if an exception is thrown, it's put in
-// window.unexpectedException.
-window.unexpectedException = null;
-
-function run() {
- try {
- window.unexpectedException = null;
-
- if (typeof window.testNodeInput != "undefined") {
- window.testNode = eval(window.testNodeInput);
- }
-
- var rangeEndpoints;
- if (typeof window.testRangeInput == "undefined") {
- // Use the hash (old way of doing things, bad because it requires
- // navigation)
- if (location.hash == "") {
- return;
- }
- rangeEndpoints = eval(location.hash.substr(1));
- } else {
- // Get the variable directly off the window, faster and can be done
- // synchronously
- rangeEndpoints = eval(window.testRangeInput);
- }
-
- var range;
- if (rangeEndpoints == "detached") {
- range = document.createRange();
- range.detach();
- } else {
- range = ownerDocument(rangeEndpoints[0]).createRange();
- range.setStart(rangeEndpoints[0], rangeEndpoints[1]);
- range.setEnd(rangeEndpoints[2], rangeEndpoints[3]);
- }
-
- window.testRange = range;
- } catch(e) {
- window.unexpectedException = e;
- }
-}
-
-testDiv.style.display = "none";
-</script>