Range-cloneRange.html (4696B)
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>