|
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 type="application/javascript" 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> |