dom-mutations.html (6833B)
1 <!DOCTYPE HTML> 2 <html class="reftest-wait"> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=619273 5 --> 6 <head> 7 <title>Test for Bug 619273</title> 8 <script type="application/javascript"> 9 /** Test DOM mutations inside selection **/ 10 function createDOM(doc) { 11 let s = doc.createElement('span'); 12 s.appendChild(doc.createTextNode('|')) 13 let s2 = doc.createElement('span'); 14 s2.appendChild(doc.createTextNode('z')) 15 s.appendChild(s2) 16 return s; 17 } 18 19 var tests_done = 0; 20 var tests = [ 21 function(win,doc,sel) { 22 doc.body.innerHTML = 'I<br>B<br>C' 23 let a = doc.body.firstChild; 24 let r = doc.createRange(); 25 r.setStart(a, 0); 26 r.setEnd(a, 1); 27 sel.addRange(r); 28 doc.body.insertBefore(doc.createTextNode('.'), a); 29 doc.body.appendChild(createDOM(doc)); 30 }, 31 function(win,doc,sel) { 32 doc.body.innerHTML = 'I<br>B<br>C' 33 let a = doc.body.firstChild; 34 let r = doc.createRange(); 35 r.setStart(doc.firstChild, 0); 36 r.setEnd(a, 1); 37 sel.addRange(r); 38 doc.body.insertBefore(doc.createTextNode('.'), a); 39 doc.body.appendChild(createDOM(doc)); 40 }, 41 function(win,doc,sel) { 42 doc.body.innerHTML = 'I<br>B<br>C' 43 let a = doc.body.firstChild; 44 let b = doc.body.childNodes[2]; 45 let c = doc.body.childNodes[4]; 46 let r = doc.createRange(); 47 r.setStart(a, 0); 48 r.setEnd(c, 1); 49 sel.addRange(r); 50 doc.body.insertBefore(doc.createTextNode('.'), b); 51 doc.body.appendChild(createDOM(doc)); 52 }, 53 function(win,doc,sel) { 54 doc.body.innerHTML = 'I<br>B<br>C' 55 let b = doc.body.childNodes[2]; 56 let c = doc.body.childNodes[4]; 57 let r = doc.createRange(); 58 r.setStart(doc.body, 0); 59 r.setEnd(c, 1); 60 sel.addRange(r); 61 doc.body.insertBefore(doc.createTextNode('.'), b); 62 doc.body.appendChild(createDOM(doc)); 63 }, 64 function(win,doc,sel) { 65 doc.body.innerHTML = 'I<br>B<br>C' 66 let b = doc.body.childNodes[2]; 67 let c = doc.body.childNodes[4]; 68 let r = doc.createRange(); 69 r.setStart(doc, 0); 70 r.setEnd(c, 1); 71 sel.addRange(r); 72 doc.body.insertBefore(doc.createTextNode('.'), b); 73 doc.body.appendChild(createDOM(doc)); 74 }, 75 function(win,doc,sel) { 76 doc.body.innerHTML = 'I<br>B<br>C' 77 let a = doc.body.firstChild; 78 let c = doc.body.childNodes[4]; 79 let r = doc.createRange(); 80 r.setStart(a, 0); 81 r.setEnd(c, 1); 82 sel.addRange(r); 83 doc.body.insertBefore(doc.createTextNode('.'), c); 84 doc.body.appendChild(createDOM(doc)); 85 }, 86 87 function(win,doc,sel) { 88 doc.body.innerHTML = 'I<br>B<br>C' 89 let a = doc.body.firstChild; 90 let r = doc.createRange(); 91 r.setStart(a, 0); 92 r.setEnd(a, 1); 93 sel.addRange(r); 94 let span = createDOM(doc); 95 doc.body.insertBefore(span, a); 96 span.appendChild(createDOM(doc)); 97 }, 98 function(win,doc,sel) { 99 doc.body.innerHTML = 'I<br>B<br>C' 100 let a = doc.body.firstChild; 101 let r = doc.createRange(); 102 r.setStart(doc.firstChild, 0); 103 r.setEnd(a, 1); 104 sel.addRange(r); 105 let span = createDOM(doc); 106 doc.body.insertBefore(span, a); 107 span.appendChild(createDOM(doc)); 108 }, 109 function(win,doc,sel) { 110 doc.body.innerHTML = 'I<br>B<br>C' 111 let a = doc.body.firstChild; 112 let b = doc.body.childNodes[2]; 113 let c = doc.body.childNodes[4]; 114 let r = doc.createRange(); 115 r.setStart(a, 0); 116 r.setEnd(c, 1); 117 sel.addRange(r); 118 let span = createDOM(doc); 119 doc.body.insertBefore(span, b); 120 span.appendChild(createDOM(doc)); 121 }, 122 function(win,doc,sel) { 123 doc.body.innerHTML = 'I<br>B<br>C' 124 let b = doc.body.childNodes[2]; 125 let c = doc.body.childNodes[4]; 126 let r = doc.createRange(); 127 r.setStart(doc.body, 0); 128 r.setEnd(c, 1); 129 sel.addRange(r); 130 let span = createDOM(doc); 131 doc.body.insertBefore(span, b); 132 span.appendChild(createDOM(doc)); 133 }, 134 function(win,doc,sel) { 135 doc.body.innerHTML = 'I<br>B<br>C' 136 let b = doc.body.childNodes[2]; 137 let c = doc.body.childNodes[4]; 138 let r = doc.createRange(); 139 r.setStart(doc, 0); 140 r.setEnd(c, 1); 141 sel.addRange(r); 142 let span = createDOM(doc); 143 doc.body.insertBefore(span, b); 144 span.appendChild(createDOM(doc)); 145 }, 146 function(win,doc,sel) { 147 doc.body.innerHTML = 'I<br>B<br>C' 148 let a = doc.body.firstChild; 149 let c = doc.body.childNodes[4]; 150 let r = doc.createRange(); 151 r.setStart(a, 0); 152 r.setEnd(c, 1); 153 sel.addRange(r); 154 let span = createDOM(doc); 155 doc.body.insertBefore(span, c); 156 span.appendChild(createDOM(doc)); 157 }, 158 159 function(win,doc,sel) { 160 doc.body.innerHTML = 'I<br>B<br>C' 161 let a = doc.body.firstChild; 162 let r = doc.createRange(); 163 r.setStart(a, 0); 164 r.setEnd(a, 1); 165 sel.addRange(r); 166 doc.body.appendChild(a); 167 }, 168 function(win,doc,sel) { 169 doc.body.innerHTML = 'I<br>B<br>C' 170 let a = doc.body.firstChild; 171 let r = doc.createRange(); 172 r.setStart(a, 0); 173 r.setEnd(a, 1); 174 sel.addRange(r); 175 document.adoptNode(a); 176 document.body.appendChild(a); 177 document.body.appendChild(document.createTextNode(' ')); 178 }, 179 function(win,doc,sel) { 180 doc.body.innerHTML = 'I<br>B<br>C' 181 let a = doc.body.firstChild; 182 let c = doc.body.childNodes[4]; 183 let r = doc.createRange(); 184 r.setStart(a, 0); 185 r.setEnd(c, 1); 186 sel.addRange(r); 187 let span = createDOM(doc); 188 doc.body.insertBefore(span, c); 189 document.adoptNode(span); 190 document.body.appendChild(span); 191 }, 192 193 function(win,doc,sel) { 194 doc.body.innerHTML = 'I' 195 let a = doc.body.firstChild; 196 let span = createDOM(doc); 197 let r = doc.createRange(); 198 r.setStart(span, 0); 199 r.setEnd(span, 1); 200 sel.addRange(r); 201 doc.body.appendChild(span); 202 }, 203 204 function(win,doc,sel) { 205 doc.body.innerHTML = 'I' 206 let a = doc.body.firstChild; 207 let span = createDOM(doc); 208 let r = doc.createRange(); 209 r.setStart(span.firstChild, 0); 210 r.setEnd(span.firstChild, 1); 211 sel.addRange(r); 212 doc.body.appendChild(span); 213 doc.body.appendChild(span.firstChild); 214 r.setEnd(span.firstChild, 1); 215 }, 216 ] 217 218 function runTestInIframe(run,t) { 219 let f = document.createElement('iframe'); 220 f.setAttribute('frameborder','0'); 221 f.setAttribute('height','100'); 222 f.setAttribute('width','200'); 223 f.src = 'data:text/html,<body style="margin:0;padding:0;font-family:monospace">'; 224 f.onload = function () { 225 try { 226 run(f.contentWindow, f.contentDocument, f.contentWindow.getSelection()); 227 } finally { ++tests_done; } 228 } 229 return f; 230 } 231 232 var id; 233 function checkFinished() { 234 if (window.frames.length == tests_done) { 235 clearInterval(id); 236 document.documentElement.className = ""; 237 } 238 } 239 240 function runTest() { 241 for (let i=0; i < tests.length; ++i) { 242 let t = tests[i]; 243 document.body.appendChild(runTestInIframe(t)); 244 } 245 id = setInterval(checkFinished,500); 246 } 247 </script> 248 </head> 249 <body onload="runTest()"></body> 250 </html>