test_textnode_split_in_selection.html (7265B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=803924 5 --> 6 <head> 7 <meta charset="utf-8"> 8 <title>Test for Bug 803924</title> 9 <script src="/tests/SimpleTest/SimpleTest.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 11 </head> 12 <body> 13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=803924">Mozilla Bug 803924</a> 14 <p id="display"></p> 15 <div id="content" style="display: none"> 16 17 </div> 18 <pre id="test"> 19 <script type="application/javascript"> 20 21 /** Test for Bug 803924 */ 22 23 var sel = document.getSelection(); 24 var flush = true; 25 var dry = true; 26 var run = ""; 27 var empty_range; 28 var empty_first_text_range; 29 var empty_last_text_range; 30 var full_range; 31 32 function check(range, expected, test) 33 { 34 is(""+range, expected, test); 35 is(""+empty_range, "", "empty range test after: "+test); 36 is(""+empty_first_text_range, "", "empty first text range test after: "+test); 37 if (empty_last_text_range) is(""+empty_last_text_range, "", "empty last text range test after: "+test); 38 is(""+full_range, full_range.startContainer.textContent, "full range test after: "+test); 39 } 40 41 function newDiv() 42 { 43 var div = document.createElement('div'); 44 for (var i = 0; i < arguments.length; ++i) { 45 div.appendChild(document.createTextNode(arguments[i])); 46 } 47 document.body.appendChild(div) 48 empty_range = document.createRange(); 49 empty_range.setStart(div,0); 50 empty_range.setEnd(div,0); 51 var firstTextNode = div.childNodes[0]; 52 var lastTextNode = div.childNodes[div.childNodes.length - 1]; 53 empty_first_text_range = document.createRange(); 54 empty_first_text_range.setStart(firstTextNode,0); 55 empty_first_text_range.setEnd(firstTextNode,0); 56 empty_last_text_range = null; 57 if (firstTextNode != lastTextNode) { 58 empty_last_text_range = document.createRange(); 59 empty_last_text_range.setStart(lastTextNode,0); 60 empty_last_text_range.setEnd(lastTextNode,0); 61 } 62 full_range = document.createRange(); 63 full_range.setStart(div,0); 64 full_range.setEnd(div,div.childNodes.length); 65 return div; 66 } 67 68 function selEnd(div,child,index,split,s) 69 { 70 var start = div.childNodes[child]; 71 var r = document.createRange(); 72 sel.addRange(r); 73 r.setStart(start, index); 74 r.setEnd(div, div.childNodes.length); 75 if (!dry) start.splitText(split); 76 check(r,s,run+" selEnd "+child+","+index+","+split); 77 } 78 79 function selStart(div,child,index,split,s) 80 { 81 if (flush) document.body.getClientRects(); 82 var start = div.childNodes[child]; 83 var r = document.createRange(); 84 sel.addRange(r); 85 r.setStart(div, 0); 86 r.setEnd(start, index); 87 if (!dry) start.splitText(split); 88 check(r,s,run+" selStart "+child+","+index+","+split); 89 } 90 91 function selMiddleStart(div,child,index,split,s) 92 { 93 if (flush) document.body.getClientRects(); 94 var start = div.childNodes[child]; 95 var r = document.createRange(); 96 sel.addRange(r); 97 r.setStart(div, 1); 98 r.setEnd(start, index); 99 if (!dry) start.splitText(split); 100 check(r,s,run+" selMiddleStart "+child+","+index+","+split); 101 } 102 103 function selMiddleEnd(div,child,index,split,s) 104 { 105 if (flush) document.body.getClientRects(); 106 var start = div.childNodes[child]; 107 var r = document.createRange(); 108 sel.addRange(r); 109 r.setStart(start, index); 110 r.setEnd(div, 2); 111 if (!dry) start.splitText(split); 112 check(r,s,run+" selMiddleEnd "+child+","+index+","+split); 113 } 114 115 function splitBefore(div,child,index,split,s) 116 { 117 if (flush) document.body.getClientRects(); 118 var start = div.childNodes[child]; 119 var r = document.createRange(); 120 sel.addRange(r); 121 r.setStart(div, 1); 122 r.setEnd(start, index); 123 if (!dry) div.childNodes[0].splitText(split); 124 check(r,s,run+" splitBefore "+child+","+index+","+split); 125 } 126 127 function runTests(s) 128 { 129 run = s+":"; 130 selEnd(newDiv('111'), 0,0,0,'111'); 131 selEnd(newDiv('111'), 0,0,1,'111'); 132 selEnd(newDiv('111'), 0,0,3,'111'); 133 selEnd(newDiv(''), 0,0,0,''); 134 selEnd(newDiv('111'), 0,1,0,'11'); 135 selEnd(newDiv('111'), 0,2,1,'1'); 136 selEnd(newDiv('111'), 0,1,3,'11'); 137 selEnd(newDiv('111','222'), 0,1,0,'11222'); 138 selEnd(newDiv('111','222'), 0,2,1,'1222'); 139 selEnd(newDiv('111','222'), 0,1,3,'11222'); 140 selEnd(newDiv('111','222'), 1,1,0,'22'); 141 selEnd(newDiv('111','222'), 1,2,1,'2'); 142 selEnd(newDiv('','222'), 1,1,1,'22'); 143 selEnd(newDiv('','222'), 0,0,0,'222'); 144 selEnd(newDiv('111',''), 0,1,0,'11'); 145 selEnd(newDiv('111','222'), 1,1,3,'22'); 146 selEnd(newDiv('111','222','333'), 1,1,0,'22333'); 147 selEnd(newDiv('111','222','333'), 1,2,1,'2333'); 148 selEnd(newDiv('111','222','333'), 1,1,3,'22333'); 149 selEnd(newDiv('111','222',''), 1,1,3,'22'); 150 selEnd(newDiv('111','','333'), 0,1,3,'11333'); 151 152 selStart(newDiv('111'), 0,0,0,''); 153 selStart(newDiv('111'), 0,0,1,''); 154 selStart(newDiv('111'), 0,0,3,''); 155 selStart(newDiv('111'), 0,1,0,'1'); 156 selStart(newDiv('111'), 0,2,1,'11'); 157 selStart(newDiv('111'), 0,1,3,'1'); 158 selStart(newDiv(''), 0,0,0,''); 159 selStart(newDiv('111','222'), 0,1,0,'1'); 160 selStart(newDiv('111','222'), 0,2,1,'11'); 161 selStart(newDiv('111','222'), 0,1,3,'1'); 162 selStart(newDiv('111','222'), 1,1,0,'1112'); 163 selStart(newDiv('111','222'), 1,2,1,'11122'); 164 selStart(newDiv('111','222'), 1,1,3,'1112'); 165 selStart(newDiv('','222'), 1,1,2,'2'); 166 selStart(newDiv('','222'), 0,0,0,''); 167 selStart(newDiv('111',''), 1,0,0,'111'); 168 selStart(newDiv('111','222','333'), 1,1,0,'1112'); 169 selStart(newDiv('111','222','333'), 1,2,1,'11122'); 170 selStart(newDiv('111','222','333'), 1,1,3,'1112'); 171 selStart(newDiv('111','','333'), 1,0,0,'111'); 172 selStart(newDiv('111','222',''), 1,1,3,'1112'); 173 174 selMiddleStart(newDiv('111','222','333'), 1,1,0,'2'); 175 selMiddleStart(newDiv('111','222','333'), 1,2,1,'22'); 176 selMiddleStart(newDiv('111','222','333'), 1,1,3,'2'); 177 selMiddleStart(newDiv('111','222','333'), 2,1,0,'2223'); 178 selMiddleStart(newDiv('111','222','333'), 2,2,1,'22233'); 179 selMiddleStart(newDiv('111','222','333'), 2,1,3,'2223'); 180 selMiddleStart(newDiv('111','','333'), 2,1,2,'3'); 181 selMiddleStart(newDiv('111','','333'), 1,0,0,''); 182 183 selMiddleEnd(newDiv('111','222','333'), 0,1,0,'11222'); 184 selMiddleEnd(newDiv('111','222','333'), 0,2,1,'1222'); 185 selMiddleEnd(newDiv('111','222','333'), 0,1,3,'11222'); 186 selMiddleEnd(newDiv('111','222','333'), 1,1,0,'22'); 187 selMiddleEnd(newDiv('111','222','333'), 1,2,1,'2'); 188 selMiddleEnd(newDiv('111','222','333'), 1,1,3,'22'); 189 selMiddleEnd(newDiv('111','','333'), 0,1,2,'11'); 190 selMiddleEnd(newDiv('111','','333'), 0,1,3,'11'); 191 selMiddleEnd(newDiv('111','','333'), 1,0,0,''); 192 193 splitBefore(newDiv('111','222','333'), 1,1,0,'2'); 194 splitBefore(newDiv('111','222','333'), 1,2,1,'22'); 195 splitBefore(newDiv('111','222','333'), 1,1,3,'2'); 196 splitBefore(newDiv('111','222','333'), 2,1,0,'2223'); 197 splitBefore(newDiv('111','222','333'), 2,2,1,'22233'); 198 splitBefore(newDiv('111','222','333'), 2,1,3,'2223'); 199 splitBefore(newDiv('','222','333'), 1,1,0,'2'); 200 splitBefore(newDiv('','','333'), 1,0,0,''); 201 splitBefore(newDiv('','222',''), 2,0,0,'222'); 202 splitBefore(newDiv('111','','333'), 2,1,2,'3'); 203 } 204 205 function boom() 206 { 207 runTests("dry run"); // this is to verify the result strings without splitText() 208 dry = false; 209 flush = false; 210 runTests("no flush"); 211 flush = true; 212 runTests("flush"); 213 } 214 215 boom(); 216 217 218 </script> 219 </pre> 220 </body> 221 </html>