| <!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> |