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 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;version=1.7">
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 }
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 },
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 },
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 },
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 },
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 ]
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 }
232 var id;
233 function checkFinished() {
234 if (window.frames.length == tests_done) {
235 clearInterval(id);
236 document.documentElement.className = "";
237 }
238 }
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>