OLD | NEW |
(Empty) | |
| 1 <!doctype html> |
| 2 <title>Range.cloneRange() and document.createRange() tests</title> |
| 3 <link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name> |
| 4 <meta name=timeout content=long> |
| 5 <div id=log></div> |
| 6 <script src=../../../../resources/testharness.js></script> |
| 7 <script src=../../../../resources/testharnessreport.js></script> |
| 8 <script src=../common.js></script> |
| 9 <script> |
| 10 "use strict"; |
| 11 |
| 12 function testCloneRange(rangeEndpoints) { |
| 13 var range; |
| 14 if (rangeEndpoints == "detached") { |
| 15 range = document.createRange(); |
| 16 range.detach(); |
| 17 var clonedRange = range.cloneRange(); |
| 18 assert_equals(clonedRange.startContainer, range.startContainer, |
| 19 "startContainers must be equal after cloneRange()"); |
| 20 assert_equals(clonedRange.startOffset, range.startOffset, |
| 21 "startOffsets must be equal after cloneRange()"); |
| 22 assert_equals(clonedRange.endContainer, range.endContainer, |
| 23 "endContainers must be equal after cloneRange()"); |
| 24 assert_equals(clonedRange.endOffset, range.endOffset, |
| 25 "endOffsets must be equal after cloneRange()"); |
| 26 return; |
| 27 } |
| 28 |
| 29 // Have to account for Ranges involving Documents! We could just create |
| 30 // the Range from the current document unconditionally, but some browsers |
| 31 // (WebKit) don't implement setStart() and setEnd() per spec and will throw |
| 32 // spurious exceptions at the time of this writing. No need to mask other |
| 33 // bugs. |
| 34 var ownerDoc = rangeEndpoints[0].nodeType == Node.DOCUMENT_NODE |
| 35 ? rangeEndpoints[0] |
| 36 : rangeEndpoints[0].ownerDocument; |
| 37 range = ownerDoc.createRange(); |
| 38 // Here we throw in some createRange() tests, because why not. Have to |
| 39 // test it someplace. |
| 40 assert_equals(range.startContainer, ownerDoc, |
| 41 "doc.createRange() must create Range whose startContainer is doc"); |
| 42 assert_equals(range.endContainer, ownerDoc, |
| 43 "doc.createRange() must create Range whose endContainer is doc"); |
| 44 assert_equals(range.startOffset, 0, |
| 45 "doc.createRange() must create Range whose startOffset is 0"); |
| 46 assert_equals(range.endOffset, 0, |
| 47 "doc.createRange() must create Range whose endOffset is 0"); |
| 48 |
| 49 range.setStart(rangeEndpoints[0], rangeEndpoints[1]); |
| 50 range.setEnd(rangeEndpoints[2], rangeEndpoints[3]); |
| 51 |
| 52 // Make sure we bail out now if setStart or setEnd are buggy, so it doesn't |
| 53 // create misleading failures later. |
| 54 assert_equals(range.startContainer, rangeEndpoints[0], |
| 55 "Sanity check on setStart()"); |
| 56 assert_equals(range.startOffset, rangeEndpoints[1], |
| 57 "Sanity check on setStart()"); |
| 58 assert_equals(range.endContainer, rangeEndpoints[2], |
| 59 "Sanity check on setEnd()"); |
| 60 assert_equals(range.endOffset, rangeEndpoints[3], |
| 61 "Sanity check on setEnd()"); |
| 62 |
| 63 var clonedRange = range.cloneRange(); |
| 64 |
| 65 assert_equals(clonedRange.startContainer, range.startContainer, |
| 66 "startContainers must be equal after cloneRange()"); |
| 67 assert_equals(clonedRange.startOffset, range.startOffset, |
| 68 "startOffsets must be equal after cloneRange()"); |
| 69 assert_equals(clonedRange.endContainer, range.endContainer, |
| 70 "endContainers must be equal after cloneRange()"); |
| 71 assert_equals(clonedRange.endOffset, range.endOffset, |
| 72 "endOffsets must be equal after cloneRange()"); |
| 73 |
| 74 // Make sure that modifying one doesn't affect the other. |
| 75 var testNode1 = ownerDoc.createTextNode("testing"); |
| 76 var testNode2 = ownerDoc.createTextNode("testing with different length"); |
| 77 |
| 78 range.setStart(testNode1, 1); |
| 79 range.setEnd(testNode1, 2); |
| 80 assert_equals(clonedRange.startContainer, rangeEndpoints[0], |
| 81 "Modifying a Range must not modify its clone's startContainer"); |
| 82 assert_equals(clonedRange.startOffset, rangeEndpoints[1], |
| 83 "Modifying a Range must not modify its clone's startOffset"); |
| 84 assert_equals(clonedRange.endContainer, rangeEndpoints[2], |
| 85 "Modifying a Range must not modify its clone's endContainer"); |
| 86 assert_equals(clonedRange.endOffset, rangeEndpoints[3], |
| 87 "Modifying a Range must not modify its clone's endOffset"); |
| 88 |
| 89 clonedRange.setStart(testNode2, 3); |
| 90 clonedRange.setStart(testNode2, 4); |
| 91 |
| 92 assert_equals(range.startContainer, testNode1, |
| 93 "Modifying a clone must not modify the original Range's startContainer"); |
| 94 assert_equals(range.startOffset, 1, |
| 95 "Modifying a clone must not modify the original Range's startOffset"); |
| 96 assert_equals(range.endContainer, testNode1, |
| 97 "Modifying a clone must not modify the original Range's endContainer"); |
| 98 assert_equals(range.endOffset, 2, |
| 99 "Modifying a clone must not modify the original Range's endOffset"); |
| 100 } |
| 101 |
| 102 var tests = []; |
| 103 for (var i = 0; i < testRanges.length; i++) { |
| 104 tests.push([ |
| 105 "Range " + i + " " + testRanges[i], |
| 106 eval(testRanges[i]) |
| 107 ]); |
| 108 } |
| 109 generate_tests(testCloneRange, tests); |
| 110 |
| 111 testDiv.style.display = "none"; |
| 112 </script> |
OLD | NEW |