Thu, 15 Jan 2015 15:59:08 +0100
Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
1 <!DOCTYPE HTML>
2 <html>
3 <!--
4 https://bugzilla.mozilla.org/show_bug.cgi?id=418756
5 https://bugzilla.mozilla.org/show_bug.cgi?id=617528
6 -->
7 <head>
8 <title>Test for Bug 418756 and 617528</title>
9 <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
11 </head>
12 <body>
13 Mozilla bug
14 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=418756">418756</a>
15 and
16 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=617528">617528</a>
17 <p id="display"></p>
18 <div id="content">
19 <form id="f1">
20 </form>
21 <form id="f2">
22 </form>
23 <menu id="m1">
24 </menu>
25 <menu id="m2">
26 </menu>
27 </div>
28 <pre id="test">
29 <script class="testbody" type="text/javascript; version=1.7">
31 /** Test for Bug 418756 and 617528 **/
32 let group1;
33 let group2;
34 let group3;
36 let tags = ["input", "menuitem"];
37 for each (let tag in tags) {
39 function bounce(node) {
40 let n = node.nextSibling;
41 let p = node.parentNode;
42 p.removeChild(node);
43 p.insertBefore(node, n);
44 }
46 let createdNodes = [];
48 function cleanup() {
49 for each (let node in createdNodes) {
50 if (node.parentNode) {
51 node.parentNode.removeChild(node);
52 }
53 }
55 createdNodes = [];
56 }
58 let typeMapper = {
59 'c': 'checkbox',
60 'r': 'radio'
61 };
63 let id = 0;
65 // type can be 'c' for 'checkbox' and 'r' for 'radio'
66 function createNode(type, name, checked) {
67 let node = document.createElement(tag);
68 node.setAttribute("type", typeMapper[type]);
69 if (checked) {
70 node.setAttribute("checked", "checked");
71 }
72 node.setAttribute("id", type + (++id));
73 node.setAttribute(tag == "input" ? "name" : "radiogroup", name);
74 createdNodes.push(node);
75 return node;
76 }
78 let types = ['c', 'r'];
80 // First make sure that setting .checked makes .defaultChecked changes no
81 // longer affect .checked.
82 for each (let type in types) {
83 let n = createNode(type, '', false);
84 is(n.defaultChecked, false, "Bogus defaultChecked on " + typeMapper[type]);
85 is(n.checked, false, "Bogus checked on " + typeMapper[type]);
86 n.defaultChecked = true;
87 is(n.defaultChecked, true, "Bogus defaultChecked on " + typeMapper[type] +
88 "after mutation");
89 is(n.checked, true, "Bogus checked on " + typeMapper[type] +
90 "after mutation");
91 n.checked = false;
92 is(n.defaultChecked, true, "Bogus defaultChecked on " + typeMapper[type] +
93 "after second mutation");
94 is(n.checked, false, "Bogus checked on " + typeMapper[type] +
95 "after second mutation");
96 n.defaultChecked = false;
97 is(n.defaultChecked, false, "Bogus defaultChecked on " + typeMapper[type] +
98 "after third mutation");
99 is(n.checked, false, "Bogus checked on " + typeMapper[type] +
100 "after third mutation");
101 n.defaultChecked = true;
102 is(n.defaultChecked, true, "Bogus defaultChecked on " + typeMapper[type] +
103 "after fourth mutation");
104 is(n.checked, false, "Bogus checked on " + typeMapper[type] +
105 "after fourth mutation");
106 }
108 cleanup();
110 // Now check that bouncing a control that's the only one of its kind has no
111 // effect
112 for each (let type in types) {
113 let n = createNode(type, 'test1', true);
114 $(tag == "input" ? "f1" : "m1").appendChild(n);
115 n.checked = false;
116 n.defaultChecked = false;
117 bounce(n);
118 n.defaultChecked = true;
119 is(n.checked, false, "We set .checked on this " + typeMapper[type]);
120 }
122 cleanup();
124 // Now check that playing with a single radio in a group affects all
125 // other radios in the group (but not radios not in that group)
126 group1 = [ createNode('r', 'g1', false),
127 createNode('r', 'g1', false),
128 createNode('r', 'g1', false) ];
129 group2 = [ createNode('r', 'g2', false),
130 createNode('r', 'g2', false),
131 createNode('r', 'g2', false) ];
132 group3 = [ createNode('r', 'g1', false),
133 createNode('r', 'g1', false),
134 createNode('r', 'g1', false) ];
135 for each (let g in group1) {
136 $(tag == "input" ? "f1" : "m1").appendChild(g);
137 }
138 for each (let g in group2) {
139 $(tag == "input" ? "f1" : "m1").appendChild(g);
140 }
141 for each (let g in group3) {
142 $(tag == "input" ? "f2" : "m2").appendChild(g);
143 }
145 for each (let n in [1, 2, 3]) {
146 for each (let g in window["group"+n]) {
147 is(g.defaultChecked, false,
148 "group" + n + "[" + window["group"+n].indexOf(g) +
149 "] defaultChecked wrong pass 1");
150 is(g.checked, false,
151 "group" + n + "[" + window["group"+n].indexOf(g) +
152 "] checkedhecked wrong pass 1");
153 }
154 }
156 group1[1].defaultChecked = true;
157 for each (let n in [1, 2, 3]) {
158 for each (let g in window["group"+n]) {
159 is(g.defaultChecked, n == 1 && group1.indexOf(g) == 1,
160 "group" + n + "[" + window["group"+n].indexOf(g) +
161 "] defaultChecked wrong pass 2");
162 is(g.checked, n == 1 && group1.indexOf(g) == 1,
163 "group" + n + "[" + window["group"+n].indexOf(g) +
164 "] checked wrong pass 2");
165 }
166 }
168 group1[0].defaultChecked = true;
169 for each (let n in [1, 2, 3]) {
170 for each (let g in window["group"+n]) {
171 is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 1 ||
172 group1.indexOf(g) == 0),
173 "group" + n + "[" + window["group"+n].indexOf(g) +
174 "] defaultChecked wrong pass 3");
175 is(g.checked, n == 1 && group1.indexOf(g) == 0,
176 "group" + n + "[" + window["group"+n].indexOf(g) +
177 "] checked wrong pass 3");
178 }
179 }
181 group1[2].defaultChecked = true;
182 for each (let n in [1, 2, 3]) {
183 for each (let g in window["group"+n]) {
184 is(g.defaultChecked, n == 1,
185 "group" + n + "[" + window["group"+n].indexOf(g) +
186 "] defaultChecked wrong pass 4");
187 is(g.checked, n == 1 && group1.indexOf(g) == 2,
188 "group" + n + "[" + window["group"+n].indexOf(g) +
189 "] checked wrong pass 4");
190 }
191 }
193 var next = group1[1].nextSibling;
194 var p = group1[1].parentNode;
195 p.removeChild(group1[1]);
196 group1[1].defaultChecked = false;
197 group1[1].defaultChecked = true;
198 p.insertBefore(group1[1], next);
199 for each (let n in [1, 2, 3]) {
200 for each (let g in window["group"+n]) {
201 is(g.defaultChecked, n == 1,
202 "group" + n + "[" + window["group"+n].indexOf(g) +
203 "] defaultChecked wrong pass 5");
204 is(g.checked, n == 1 && group1.indexOf(g) == 1,
205 "group" + n + "[" + window["group"+n].indexOf(g) +
206 "] checked wrong pass 5");
207 }
208 }
210 for each(let g in group1) {
211 g.defaultChecked = false;
212 }
213 for each (let n in [1, 2, 3]) {
214 for each (let g in window["group"+n]) {
215 is(g.defaultChecked, false,
216 "group" + n + "[" + window["group"+n].indexOf(g) +
217 "] defaultChecked wrong pass 6");
218 is(g.checked, false,
219 "group" + n + "[" + window["group"+n].indexOf(g) +
220 "] checkedhecked wrong pass 6");
221 }
222 }
224 group1[1].checked = true;
225 for each (let n in [1, 2, 3]) {
226 for each (let g in window["group"+n]) {
227 is(g.defaultChecked, false,
228 "group" + n + "[" + window["group"+n].indexOf(g) +
229 "] defaultChecked wrong pass 7");
230 is(g.checked, n == 1 && group1.indexOf(g) == 1,
231 "group" + n + "[" + window["group"+n].indexOf(g) +
232 "] checked wrong pass 7");
233 }
234 }
236 group1[0].defaultChecked = true;
237 for each (let n in [1, 2, 3]) {
238 for each (let g in window["group"+n]) {
239 is(g.defaultChecked, n == 1 && group1.indexOf(g) == 0,
240 "group" + n + "[" + window["group"+n].indexOf(g) +
241 "] defaultChecked wrong pass 8");
242 is(g.checked, n == 1 && group1.indexOf(g) == 1,
243 "group" + n + "[" + window["group"+n].indexOf(g) +
244 "] checked wrong pass 8");
245 }
246 }
248 group1[2].defaultChecked = true;
249 for each (let n in [1, 2, 3]) {
250 for each (let g in window["group"+n]) {
251 is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
252 group1.indexOf(g) == 2),
253 "group" + n + "[" + window["group"+n].indexOf(g) +
254 "] defaultChecked wrong pass 9");
255 is(g.checked, n == 1 && group1.indexOf(g) == 1,
256 "group" + n + "[" + window["group"+n].indexOf(g) +
257 "] checked wrong pass 9");
258 }
259 }
260 group1[1].parentNode.removeChild(group1[1]);
261 for each (let n in [1, 2, 3]) {
262 for each (let g in window["group"+n]) {
263 is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
264 group1.indexOf(g) == 2),
265 "group" + n + "[" + window["group"+n].indexOf(g) +
266 "] defaultChecked wrong pass 10");
267 is(g.checked, n == 1 && group1.indexOf(g) == 1,
268 "group" + n + "[" + window["group"+n].indexOf(g) +
269 "] checked wrong pass 10");
270 }
271 }
273 group1[2].checked = true;
274 for each (let n in [1, 2, 3]) {
275 for each (let g in window["group"+n]) {
276 is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
277 group1.indexOf(g) == 2),
278 "group" + n + "[" + window["group"+n].indexOf(g) +
279 "] defaultChecked wrong pass 11");
280 is(g.checked, n == 1 && (group1.indexOf(g) == 1 ||
281 group1.indexOf(g) == 2),
282 "group" + n + "[" + window["group"+n].indexOf(g) +
283 "] checked wrong pass 11");
284 }
285 }
287 group1[0].checked = true;
288 for each (let n in [1, 2, 3]) {
289 for each (let g in window["group"+n]) {
290 is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
291 group1.indexOf(g) == 2),
292 "group" + n + "[" + window["group"+n].indexOf(g) +
293 "] defaultChecked wrong pass 12");
294 is(g.checked, n == 1 && (group1.indexOf(g) == 1 ||
295 group1.indexOf(g) == 0),
296 "group" + n + "[" + window["group"+n].indexOf(g) +
297 "] checked wrong pass 12");
298 }
299 }
301 next = group2[1].nextSibling;
302 p = group2[1].parentNode;
303 p.removeChild(group2[1]);
304 p.insertBefore(group2[1], next);
305 group2[0].checked = true;
306 for each (let n in [1, 2, 3]) {
307 for each (let g in window["group"+n]) {
308 is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
309 group1.indexOf(g) == 2),
310 "group" + n + "[" + window["group"+n].indexOf(g) +
311 "] defaultChecked wrong pass 13");
312 is(g.checked, (n == 1 && (group1.indexOf(g) == 1 ||
313 group1.indexOf(g) == 0)) ||
314 (n == 2 && group2.indexOf(g) == 0),
315 "group" + n + "[" + window["group"+n].indexOf(g) +
316 "] checked wrong pass 13");
317 }
318 }
320 p.insertBefore(group2[1], next);
321 for each (let n in [1, 2, 3]) {
322 for each (let g in window["group"+n]) {
323 is(g.defaultChecked, n == 1 && (group1.indexOf(g) == 0 ||
324 group1.indexOf(g) == 2),
325 "group" + n + "[" + window["group"+n].indexOf(g) +
326 "] defaultChecked wrong pass 14");
327 is(g.checked, (n == 1 && (group1.indexOf(g) == 1 ||
328 group1.indexOf(g) == 0)) ||
329 (n == 2 && group2.indexOf(g) == 0),
330 "group" + n + "[" + window["group"+n].indexOf(g) +
331 "] checked wrong pass 14");
332 }
333 }
335 group2[1].defaultChecked = true;
336 for each (let n in [1, 2, 3]) {
337 for each (let g in window["group"+n]) {
338 is(g.defaultChecked, (n == 1 && (group1.indexOf(g) == 0 ||
339 group1.indexOf(g) == 2)) ||
340 (n == 2 && group2.indexOf(g) == 1),
341 "group" + n + "[" + window["group"+n].indexOf(g) +
342 "] defaultChecked wrong pass 15");
343 is(g.checked, (n == 1 && (group1.indexOf(g) == 1 ||
344 group1.indexOf(g) == 0)) ||
345 (n == 2 && group2.indexOf(g) == 0),
346 "group" + n + "[" + window["group"+n].indexOf(g) +
347 "] checked wrong pass 15");
348 }
349 }
351 cleanup();
353 }
354 </script>
355 </pre>
356 </body>
357 </html>