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=523771
5 -->
6 <head>
7 <title>Test for Bug 523771</title>
8 <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
10 <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
11 </head>
12 <body>
13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=523771">Mozilla Bug 523771</a>
14 <p id="display"></p>
15 <iframe name="target_iframe" id="target_iframe"></iframe>
16 <form action="form_submit_server.sjs" target="target_iframe" id="form"
17 method="POST" enctype="multipart/form-data">
18 <table>
19 <tr>
20 <td>Control type</td>
21 <td>Name and value</td>
22 <td>Name, empty value</td>
23 <td>Name, no value</td>
24 <td>Empty name, with value</td>
25 <td>No name, with value</td>
26 <td>No name or value</td>
27 <td>Strange name/value</td>
28 </tr>
29 <tr>
30 <td>Default input</td>
31 <td><input name="n1_1" value="v1_1"></td>
32 <td><input name="n1_2" value=""></td>
33 <td><input name="n1_3"></td>
34 <td><input name="" value="v1_4"></td>
35 <td><input value="v1_5"></td>
36 <td><input></td>
37 <td><input name="n1_7_ _ _ _ _""
38 value="v1_7_ _ _ _ _""></td>
39 </tr>
40 <tr>
41 <td>Text input</td>
42 <td><input type=text name="n2_1" value="v2_1"></td>
43 <td><input type=text name="n2_2" value=""></td>
44 <td><input type=text name="n2_3"></td>
45 <td><input type=text name="" value="v2_4"></td>
46 <td><input type=text value="v2_5"></td>
47 <td><input type=text></td>
48 <td><input type=text name="n2_7_ _ _ _ _""
49 value="v2_7_ _ _ _ _""></td>
50 </tr>
51 <tr>
52 <td>Checkbox unchecked</td>
53 <td><input type=checkbox name="n3_1" value="v3_1"></td>
54 <td><input type=checkbox name="n3_2" value=""></td>
55 <td><input type=checkbox name="n3_3"></td>
56 <td><input type=checkbox name="" value="v3_4"></td>
57 <td><input type=checkbox value="v3_5"></td>
58 <td><input type=checkbox></td>
59 <td><input type=checkbox name="n3_7_ _ _ _ _""
60 value="v3_7_ _ _ _ _""></td>
61 </tr>
62 <tr>
63 <td>Checkbox checked</td>
64 <td><input checked type=checkbox name="n4_1" value="v4_1"></td>
65 <td><input checked type=checkbox name="n4_2" value=""></td>
66 <td><input checked type=checkbox name="n4_3"></td>
67 <td><input checked type=checkbox name="" value="v4_4"></td>
68 <td><input checked type=checkbox value="v4_5"></td>
69 <td><input checked type=checkbox></td>
70 <td><input checked type=checkbox
71 name="n4_7_ _ _ _ _""
72 value="v4_7_ _ _ _ _""></td>
73 </tr>
74 <tr>
75 <td>Radio unchecked</td>
76 <td><input type=radio name="n5_1" value="v5_1"></td>
77 <td><input type=radio name="n5_2" value=""></td>
78 <td><input type=radio name="n5_3"></td>
79 <td><input type=radio name="" value="v5_4"></td>
80 <td><input type=radio value="v5_5"></td>
81 <td><input type=radio></td>
82 <td><input type=radio name="n5_7_ _ _ _ _""
83 value="v5_7_ _ _ _ _""></td>
84 </tr>
85 <tr>
86 <td>Radio checked</td>
87 <td><input checked type=radio name="n6_1" value="v6_1"></td>
88 <td><input checked type=radio name="n6_2" value=""></td>
89 <td><input checked type=radio name="n6_3"></td>
90 <td><input checked type=radio name="" value="v6_4"></td>
91 <td><input checked type=radio value="v6_5"></td>
92 <td><input checked type=radio></td>
93 <td><input checked type=radio
94 name="n6_7_ _ _ _ _""
95 value="v6_7_ _ _ _ _""></td>
96 </tr>
97 <tr>
98 <td>Hidden input</td>
99 <td><input type=hidden name="n7_1" value="v7_1"></td>
100 <td><input type=hidden name="n7_2" value=""></td>
101 <td><input type=hidden name="n7_3"></td>
102 <td><input type=hidden nane="" value="v7_4"></td>
103 <td><input type=hidden value="v7_5"></td>
104 <td><input type=hidden></td>
105 <td><input type=hidden name="n7_7_ _ _ _ _""
106 value="v7_7_ _ _ _ _""></td>
107 </tr>
108 <tr>
109 <td>Password input</td>
110 <td><input type=password name="n8_1" value="v8_1"></td>
111 <td><input type=password name="n8_2" value=""></td>
112 <td><input type=password name="n8_3"></td>
113 <td><input type=password name="" value="v8_4"></td>
114 <td><input type=password value="v8_5"></td>
115 <td><input type=password></td>
116 <td><input type=password name="n8_7_ _ _ _ _""
117 value="v8_7_ _ _ _ _""></td>
118 </tr>
119 <tr>
120 <td>Submit input</td>
121 <td><input type=submit name="n9_1" value="v9_1"></td>
122 <td><input type=submit name="n9_2" value=""></td>
123 <td><input type=submit name="n9_3"></td>
124 <td><input type=submit name="" value="v9_4"></td>
125 <td><input type=submit value="v9_5"></td>
126 <td><input type=submit></td>
127 <td><input type=submit name="n9_7_ _ _ _ _""
128 value="v9_7_ _ _ _ _""></td>
129 </tr>
130 <tr>
131 <td>Button input</td>
132 <td><input type=button name="n10_1" value="v10_1"></td>
133 <td><input type=button name="n10_2" value=""></td>
134 <td><input type=button name="n10_3"></td>
135 <td><input type=button name="" value="v10_4"></td>
136 <td><input type=button value="v10_5"></td>
137 <td><input type=button></td>
138 <td><input type=button name="n10_7_ _ _ _ _""
139 value="v10_7_ _ _ _ _""></td>
140 </tr>
141 <tr>
142 <td>Image input</td>
143 <td><input type=image src="file_formSubmission_img.jpg" name="n11_1" value="v11_1"></td>
144 <td><input type=image src="file_formSubmission_img.jpg" name="n11_2" value=""></td>
145 <td><input type=image src="file_formSubmission_img.jpg" name="n11_3"></td>
146 <td><input type=image src="file_formSubmission_img.jpg" name="" value="v11_4"></td>
147 <td><input type=image src="file_formSubmission_img.jpg" value="v11_5"></td>
148 <td><input type=image src="file_formSubmission_img.jpg"></td>
149 <td><input type=image src="file_formSubmission_img.jpg"
150 name="n11_7_ _ _ _ _""
151 value="v11_7_ _ _ _ _""></td>
152 </tr>
153 <tr>
154 <td>Reset input</td>
155 <td><input type=reset name="n12_1" value="v12_1"></td>
156 <td><input type=reset name="n12_2" value=""></td>
157 <td><input type=reset name="n12_3"></td>
158 <td><input type=reset name="" value="v12_4"></td>
159 <td><input type=reset value="v12_5"></td>
160 <td><input type=reset></td>
161 <td><input type=reset name="n12_7_ _ _ _ _""
162 value="v12_7_ _ _ _ _""></td>
163 </tr>
164 <tr>
165 <td>Unknown input</td>
166 <td><input type=foobar name="n13_1" value="v13_1"></td>
167 <td><input type=foobar name="n13_2" value=""></td>
168 <td><input type=foobar name="n13_3"></td>
169 <td><input type=foobar name="" value="v13_4"></td>
170 <td><input type=foobar value="v13_5"></td>
171 <td><input type=foobar></td>
172 <td><input type=foobar name="n13_7_ _ _ _ _""
173 value="v13_7_ _ _ _ _""></td>
174 </tr>
175 <tr>
176 <td>Default button</td>
177 <td><button name="n14_1" value="v14_1"></button></td>
178 <td><button name="n14_2" value=""></button></td>
179 <td><button name="n14_3"></button></td>
180 <td><button name="" value="v14_4"></button></td>
181 <td><button value="v14_5"></button></td>
182 <td><button></button></td>
183 <td><button name="n14_7_ _ _ _ _""
184 value="v14_7_ _ _ _ _""></button></td>
185 </tr>
186 <tr>
187 <td>Submit button</td>
188 <td><button type=submit name="n15_1" value="v15_1"></button></td>
189 <td><button type=submit name="n15_2" value=""></button></td>
190 <td><button type=submit name="n15_3"></button></td>
191 <td><button type=submit name="" value="v15_4"></button></td>
192 <td><button type=submit value="v15_5"></button></td>
193 <td><button type=submit></button></td>
194 <td><button type=submit name="n15_7_ _ _ _ _""
195 value="v15_7_ _ _ _ _""></button></td>
196 </tr>
197 <tr>
198 <td>Button button</td>
199 <td><button type=button name="n16_1" value="v16_1"></button></td>
200 <td><button type=button name="n16_2" value=""></button></td>
201 <td><button type=button name="n16_3"></button></td>
202 <td><button type=button name="" value="v16_4"></button></td>
203 <td><button type=button value="v16_5"></button></td>
204 <td><button type=button></button></td>
205 <td><button type=button name="n16_7_ _ _ _ _""
206 value="v16_7_ _ _ _ _""></button></td>
207 </tr>
208 <tr>
209 <td>Reset button</td>
210 <td><button type=reset name="n17_1" value="v17_1"></button></td>
211 <td><button type=reset name="n17_2" value=""></button></td>
212 <td><button type=reset name="n17_3"></button></td>
213 <td><button type=reset name="" value="v17_4"></button></td>
214 <td><button type=reset value="v17_5"></button></td>
215 <td><button type=reset></button></td>
216 <td><button type=reset name="n17_7_ _ _ _ _""
217 value="v17_7_ _ _ _ _""></button></td>
218 </tr>
219 <tr>
220 <td>Unknown button</td>
221 <td><button type=foobar name="n18_1" value="v18_1"></button></td>
222 <td><button type=foobar name="n18_2" value=""></button></td>
223 <td><button type=foobar name="n18_3"></button></td>
224 <td><button type=foobar name="" value="v18_4"></button></td>
225 <td><button type=foobar value="v18_5"></button></td>
226 <td><button type=foobar ></button></td>
227 <td><button type=foobar name="n18_7_ _ _ _ _""
228 value="v18_7_ _ _ _ _""></button></td>
229 </tr>
230 <tr>
231 <td><input type='url'></td>
232 <td><input type=url name="n19_1" value="http://v19_1.org"></td>
233 <td><input type=url name="n19_2" value=""></td>
234 <td><input type=url name="n19_3"></td>
235 <td><input type=url name="" value="http://v19_4.org"></td>
236 <td><input type=url value="http://v19_5.org"></td>
237 <td><input type=url ></td>
238 <td><input type=url name="n19_7_ _ _ __""
239 value="http://v19_7_ _ _ __"">
240 <!-- Put UTF-8 value in the "strange" column. -->
241 <input type=url name="n19_8" value="http://mózillä.órg"></td>
242 </tr>
243 <tr>
244 <td><input type='email'></td>
245 <td><input type=email name="n20_1" value="v20_1@bar"></td>
246 <td><input type=email name="n20_2" value=""></td>
247 <td><input type=email name="n20_3"></td>
248 <td><input type=email name="" value="v20_4@bar"></td>
249 <td><input type=email value="v20_5@bar"></td>
250 <td><input type=email ></td>
251 <td><input type=email name="n20_7_ _ _ __""
252 value="v20_7_ _ _ __"@bar">
253 <!-- Put UTF-8 value is the "strange" column. -->
254 <input type=email name="n20_8" value="foo@mózillä.órg"></td>
255 </tr>
256 </table>
258 <p>
259 File input:
260 <input type=file name="file_1" class="setfile">
261 <input type=file name="file_2">
262 <input type=file name="" class="setfile">
263 <input type=file name="">
264 <input type=file class="setfile">
265 <input type=file>
266 </p>
267 <p>
268 Multifile input:
269 <input multiple type=file name="file_3" class="setfile">
270 <input multiple type=file name="file_4" class="setfile multi">
271 <input multiple type=file name="file_5">
272 <input multiple type=file name="" class="setfile">
273 <input multiple type=file name="" class="setfile multi">
274 <input multiple type=file name="">
275 <input multiple type=file class="setfile">
276 <input multiple type=file class="setfile multi">
277 <input multiple type=file>
278 </p>
280 <p>
281 Textarea:
282 <textarea name="t1">t_1_v</textarea>
283 <textarea name="t2"></textarea>
284 <textarea name="">t_3_v</textarea>
285 <textarea>t_4_v</textarea>
286 <textarea></textarea>
287 <textarea name="t6">
288 t_6_v</textarea>
289 <textarea name="t7">t_7_v
290 </textarea>
291 <textarea name="t8">
293 t_8_v
294 </textarea>
295 <textarea name="t9_ _ _ _ _"">t_9_ _ _ _ _"_v</textarea>
296 <textarea name="t10" value="t_10_bogus">t_10_v</textarea>
297 </p>
299 <p>
300 Select one:
302 <select name="sel_1"></select>
303 <select name="sel_1b"><option></option></select>
304 <select name="sel_1c"><option selected></option></select>
306 <select name="sel_2"><option value="sel_2_v"></option></select>
307 <select name="sel_3"><option selected value="sel_3_v"></option></select>
309 <select name="sel_4"><option value="sel_4_v1"></option><option value="sel_4_v2"></option></select>
310 <select name="sel_5"><option selected value="sel_5_v1"></option><option value="sel_5_v2"></option></select>
311 <select name="sel_6"><option value="sel_6_v1"></option><option selected value="sel_6_v2"></option></select>
313 <select name="sel_7"><option>sel_7_v1</option><option>sel_7_v2</option></select>
314 <select name="sel_8"><option selected>sel_8_v1</option><option>sel_8_v2</option></select>
315 <select name="sel_9"><option>sel_9_v1</option><option selected>sel_9_v2</option></select>
317 <select name="sel_10"><option value="sel_10_v1">sel_10_v1_text</option><option value="sel_10_v2">sel_10_v2_text</option></select>
318 <select name="sel_11"><option selected value="sel_11_v1">sel_11_v1_text</option><option value="sel_11_v2">sel_11_v2_text</option></select>
319 <select name="sel_12"><option value="sel_12_v1">sel_12_v1_text</option><option selected value="sel_12_v2">sel_12_v2_text</option></select>
321 <select name="sel_13"><option disabled>sel_13_v1</option><option>sel_13_v2</option></select>
322 <select name="sel_14"><option disabled selected>sel_14_v1</option><option>sel_14_v2</option></select>
323 <select name="sel_15"><option disabled>sel_15_v1</option><option selected>sel_15_v2</option></select>
325 <select name="sel_16"><option>sel_16_v1</option><option disabled>sel_16_v2</option></select>
326 <select name="sel_17"><option selected>sel_17_v1</option><option disabled>sel_17_v2</option></select>
327 <select name="sel_18"><option>sel_18_v1</option><option disabled selected>sel_18_v2</option></select>
329 <select name=""><option selected value="sel_13_v1"></option><option value="sel_13_v2"></option></select>
330 <select name=""><option value="sel_14_v1"></option><option selected value="sel_14_v2"></option></select>
331 <select name=""><option selected>sel_15_v1</option><option>sel_15_v2</option></select>
332 <select name=""><option>sel_16_v1</option><option selected>sel_16_v2</option></select>
334 <select><option selected value="sel_17_v1"></option><option value="sel_17_v2"></option></select>
335 <select><option value="sel_18_v1"></option><option selected value="sel_18_v2"></option></select>
336 <select><option selected>sel_19_v1</option><option>sel_19_v2</option></select>
337 <select><option>sel_20_v1</option><option selected>sel_20_v2</option></select>
338 </p>
340 <p>
341 Select multiple:
343 <select multiple name="msel_1"></select>
344 <select multiple name="msel_1b"><option></option></select>
345 <select multiple name="msel_1c"><option selected></option></select>
347 <select multiple name="msel_2"><option value="msel_2_v"></option></select>
348 <select multiple name="msel_3"><option selected value="msel_3_v"></option></select>
350 <select multiple name="msel_4"><option value="msel_4_v1"></option><option value="msel_4_v2"></option></select>
351 <select multiple name="msel_5"><option selected value="msel_5_v1"></option><option value="msel_5_v2"></option></select>
352 <select multiple name="msel_6"><option value="msel_6_v1"></option><option selected value="msel_6_v2"></option></select>
353 <select multiple name="msel_7"><option selected value="msel_7_v1"></option><option selected value="msel_7_v2"></option></select>
355 <select multiple name="msel_8"><option>msel_8_v1</option><option>msel_8_v2</option></select>
356 <select multiple name="msel_9"><option selected>msel_9_v1</option><option>msel_9_v2</option></select>
357 <select multiple name="msel_10"><option>msel_10_v1</option><option selected>msel_10_v2</option></select>
358 <select multiple name="msel_11"><option selected>msel_11_v1</option><option selected>msel_11_v2</option></select>
360 <select multiple name="msel_12"><option value="msel_12_v1">msel_12_v1_text</option><option value="msel_12_v2">msel_12_v2_text</option></select>
361 <select multiple name="msel_13"><option selected value="msel_13_v1">msel_13_v1_text</option><option value="msel_13_v2">msel_13_v2_text</option></select>
362 <select multiple name="msel_14"><option value="msel_14_v1">msel_14_v1_text</option><option selected value="msel_14_v2">msel_14_v2_text</option></select>
363 <select multiple name="msel_15"><option selected value="msel_15_v1">msel_15_v1_text</option><option selected value="msel_15_v2">msel_15_v2_text</option></select>
365 <select multiple name="msel_16"><option>msel_16_v1</option><option>msel_16_v2</option><option>msel_16_v3</option></select>
366 <select multiple name="msel_17"><option selected>msel_17_v1</option><option>msel_17_v2</option><option>msel_17_v3</option></select>
367 <select multiple name="msel_18"><option>msel_18_v1</option><option selected>msel_18_v2</option><option>msel_18_v3</option></select>
368 <select multiple name="msel_19"><option selected>msel_19_v1</option><option selected>msel_19_v2</option><option>msel_19_v3</option></select>
369 <select multiple name="msel_20"><option>msel_20_v1</option><option>msel_20_v2</option><option selected>msel_20_v3</option></select>
370 <select multiple name="msel_21"><option selected>msel_21_v1</option><option>msel_21_v2</option><option selected>msel_21_v3</option></select>
371 <select multiple name="msel_22"><option>msel_22_v1</option><option selected>msel_22_v2</option><option selected>msel_22_v3</option></select>
372 <select multiple name="msel_23"><option selected>msel_23_v1</option><option selected>msel_23_v2</option><option selected>msel_23_v3</option></select>
374 <select multiple name="msel_24"><option disabled>msel_24_v1</option><option>msel_24_v2</option></select>
375 <select multiple name="msel_25"><option disabled selected>msel_25_v1</option><option>msel_25_v2</option></select>
376 <select multiple name="msel_26"><option disabled>msel_26_v1</option><option selected>msel_26_v2</option></select>
377 <select multiple name="msel_27"><option disabled selected>msel_27_v1</option><option selected>msel_27_v2</option></select>
379 <select multiple name="msel_28"><option>msel_28_v1</option><option disabled>msel_28_v2</option></select>
380 <select multiple name="msel_29"><option selected>msel_29_v1</option><option disabled>msel_29_v2</option></select>
381 <select multiple name="msel_30"><option>msel_30_v1</option><option disabled selected>msel_30_v2</option></select>
382 <select multiple name="msel_31"><option selected>msel_31_v1</option><option disabled selected>msel_31_v2</option></select>
384 <select multiple name="msel_32"><option disabled selected>msel_32_v1</option><option disabled selected>msel_32_v2</option></select>
386 <select multiple name=""><option>msel_33_v1</option><option>msel_33_v2</option></select>
387 <select multiple name=""><option selected>msel_34_v1</option><option>msel_34_v2</option></select>
388 <select multiple name=""><option>msel_35_v1</option><option selected>msel_35_v2</option></select>
389 <select multiple name=""><option selected>msel_36_v1</option><option selected>msel_36_v2</option></select>
391 <select multiple><option>msel_37_v1</option><option>msel_37_v2</option></select>
392 <select multiple><option selected>msel_38_v1</option><option>msel_38_v2</option></select>
393 <select multiple><option>msel_39_v1</option><option selected>msel_39_v2</option></select>
394 <select multiple><option selected>msel_40_v1</option><option selected>msel_40_v2</option></select>
395 </p>
396 </form>
397 <pre id="test">
398 <script class="testbody" type="text/javascript;version=1.8">
400 SimpleTest.waitForExplicitFinish();
402 var myFile1, myFile2, emptyFile;
404 (function setFileNames() {
405 let xhr = new XMLHttpRequest;
406 xhr.open("GET", "/dynamic/getMyDirectory.sjs", false);
407 xhr.send();
408 var basePath = xhr.responseText;
410 singleFile = basePath + "file_formSubmission_text.txt";
411 multiFile = [basePath + "file_formSubmission_text.txt",
412 basePath + "file_formSubmission_img.jpg"];
414 var addList = document.getElementsByClassName("setfile");
415 let i = 0;
416 var input;
417 while (input = addList[i++]) {
418 if (input.classList.contains("multi")) {
419 SpecialPowers.wrap(input).mozSetFileNameArray(multiFile, multiFile.length);
420 }
421 else {
422 SpecialPowers.wrap(input).value = singleFile;
423 }
424 }
426 input = document.createElement("input");
427 input.type = "file";
428 input.multiple = true;
429 SpecialPowers.wrap(input).mozSetFileNameArray(multiFile, multiFile.length);
430 myFile1 = input.files[0];
431 myFile2 = input.files[1];
432 is(myFile1.size, 20, "File1 size");
433 is(myFile2.size, 2711, "File2 size");
434 emptyFile = { name: "", type: "application/octet-stream" };
435 })();
438 var expectedSub = [
439 // Default input
440 { name: "n1_1", value: "v1_1" },
441 { name: "n1_2", value: "" },
442 { name: "n1_3", value: "" },
443 { name: "n1_7_\r\n_\r\n_\r\n_ _\"", value: "v1_7____ _\"" },
444 // Text input
445 { name: "n2_1", value: "v2_1" },
446 { name: "n2_2", value: "" },
447 { name: "n2_3", value: "" },
448 { name: "n2_7_\r\n_\r\n_\r\n_ _\"", value: "v2_7____ _\"" },
449 // Checkbox unchecked
450 // Checkbox checked
451 { name: "n4_1", value: "v4_1" },
452 { name: "n4_2", value: "" },
453 { name: "n4_3", value: "on" },
454 { name: "n4_7_\r\n_\r\n_\r\n_ _\"", value: "v4_7_\r\n_\r\n_\r\n_ _\"" },
455 // Radio unchecked
456 // Radio checked
457 { name: "n6_1", value: "v6_1" },
458 { name: "n6_2", value: "" },
459 { name: "n6_3", value: "on" },
460 { name: "n6_7_\r\n_\r\n_\r\n_ _\"", value: "v6_7_\r\n_\r\n_\r\n_ _\"" },
461 // Hidden input
462 { name: "n7_1", value: "v7_1" },
463 { name: "n7_2", value: "" },
464 { name: "n7_3", value: "" },
465 { name: "n7_7_\r\n_\r\n_\r\n_ _\"", value: "v7_7_\r\n_\r\n_\r\n_ _\"" },
466 // Password input
467 { name: "n8_1", value: "v8_1" },
468 { name: "n8_2", value: "" },
469 { name: "n8_3", value: "" },
470 { name: "n8_7_\r\n_\r\n_\r\n_ _\"", value: "v8_7____ _\"" },
471 // Submit input
472 // Button input
473 // Image input
474 // Reset input
475 // Unknown input
476 { name: "n13_1", value: "v13_1" },
477 { name: "n13_2", value: "" },
478 { name: "n13_3", value: "" },
479 { name: "n13_7_\r\n_\r\n_\r\n_ _\"", value: "v13_7____ _\"" },
480 // <input type='url'>
481 { name: "n19_1", value: "http://v19_1.org" },
482 { name: "n19_2", value: "" },
483 { name: "n19_3", value: "" },
484 { name: "n19_7_\r\n_\r\n_\r\n__\"", value: "http://v19_7_____\"" },
485 { name: "n19_8", value: "http://m\xf3zill\xe4.\xf3rg" },
486 // <input type='email'>
487 { name: "n20_1", value: "v20_1@bar" },
488 { name: "n20_2", value: "" },
489 { name: "n20_3", value: "" },
490 { name: "n20_7_\r\n_\r\n_\r\n__\"", value: "v20_7_____\"@bar" },
491 { name: "n20_8", value: "foo@mózillä.órg" },
492 // Default button
493 // Submit button
494 // Button button
495 // Reset button
496 // Unknown button
497 // File
498 { name: "file_1", value: myFile1 },
499 { name: "file_2", value: emptyFile },
500 // Multiple file
501 { name: "file_3", value: myFile1 },
502 { name: "file_4", value: myFile1 },
503 { name: "file_4", value: myFile2 },
504 { name: "file_5", value: emptyFile },
505 // Textarea
506 { name: "t1", value: "t_1_v" },
507 { name: "t2", value: "" },
508 { name: "t6", value: "t_6_v" },
509 { name: "t7", value: "t_7_v\r\n" },
510 { name: "t8", value: "\r\n t_8_v \r\n" },
511 { name: "t9_\r\n_\r\n_\r\n_ _\"", value: "t_9_\r\n_\r\n_\r\n_ _\"_v" },
512 { name: "t10", value: "t_10_v" },
514 // Select one
515 { name: "sel_1b", value: "" },
516 { name: "sel_1c", value: "" },
517 { name: "sel_2", value: "sel_2_v" },
518 { name: "sel_3", value: "sel_3_v" },
519 { name: "sel_4", value: "sel_4_v1" },
520 { name: "sel_5", value: "sel_5_v1" },
521 { name: "sel_6", value: "sel_6_v2" },
522 { name: "sel_7", value: "sel_7_v1" },
523 { name: "sel_8", value: "sel_8_v1" },
524 { name: "sel_9", value: "sel_9_v2" },
525 { name: "sel_10", value: "sel_10_v1" },
526 { name: "sel_11", value: "sel_11_v1" },
527 { name: "sel_12", value: "sel_12_v2" },
528 { name: "sel_13", value: "sel_13_v2" },
529 { name: "sel_15", value: "sel_15_v2" },
530 { name: "sel_16", value: "sel_16_v1" },
531 { name: "sel_17", value: "sel_17_v1" },
532 // Select three
533 { name: "msel_1c", value: "" },
534 { name: "msel_3", value: "msel_3_v" },
535 { name: "msel_5", value: "msel_5_v1" },
536 { name: "msel_6", value: "msel_6_v2" },
537 { name: "msel_7", value: "msel_7_v1" },
538 { name: "msel_7", value: "msel_7_v2" },
539 { name: "msel_9", value: "msel_9_v1" },
540 { name: "msel_10", value: "msel_10_v2" },
541 { name: "msel_11", value: "msel_11_v1" },
542 { name: "msel_11", value: "msel_11_v2" },
543 { name: "msel_13", value: "msel_13_v1" },
544 { name: "msel_14", value: "msel_14_v2" },
545 { name: "msel_15", value: "msel_15_v1" },
546 { name: "msel_15", value: "msel_15_v2" },
547 { name: "msel_17", value: "msel_17_v1" },
548 { name: "msel_18", value: "msel_18_v2" },
549 { name: "msel_19", value: "msel_19_v1" },
550 { name: "msel_19", value: "msel_19_v2" },
551 { name: "msel_20", value: "msel_20_v3" },
552 { name: "msel_21", value: "msel_21_v1" },
553 { name: "msel_21", value: "msel_21_v3" },
554 { name: "msel_22", value: "msel_22_v2" },
555 { name: "msel_22", value: "msel_22_v3" },
556 { name: "msel_23", value: "msel_23_v1" },
557 { name: "msel_23", value: "msel_23_v2" },
558 { name: "msel_23", value: "msel_23_v3" },
559 { name: "msel_26", value: "msel_26_v2" },
560 { name: "msel_27", value: "msel_27_v2" },
561 { name: "msel_29", value: "msel_29_v1" },
562 { name: "msel_31", value: "msel_31_v1" },
563 ];
565 expectedAugment = [
566 { name: "aName", value: "aValue" },
567 //{ name: "aNameBool", value: "false" },
568 { name: "aNameNum", value: "9.2" },
569 { name: "aNameFile1", value: myFile1 },
570 { name: "aNameFile2", value: myFile2 },
571 //{ name: "aNameObj", value: "[object XMLHttpRequest]" },
572 //{ name: "aNameNull", value: "null" },
573 //{ name: "aNameUndef", value: "undefined" },
574 ];
576 function checkMPSubmission(sub, expected, test) {
577 function getPropCount(o) {
578 var x, l = 0;
579 for (x in o) ++l;
580 return l;
581 }
582 function mpquote(s) {
583 return s.replace("\r\n", " ", "g")
584 .replace("\r", " ", "g")
585 .replace("\n", " ", "g")
586 .replace("\"", "\\\"", "g");
587 }
589 is(sub.length, expected.length,
590 "Correct number of multipart items in " + test);
592 if (sub.length != expected.length) {
593 alert(JSON.stringify(sub));
594 }
596 var i;
597 for (i = 0; i < expected.length; ++i) {
598 if (!("fileName" in expected[i])) {
599 is(sub[i].headers["Content-Disposition"],
600 "form-data; name=\"" + mpquote(expected[i].name) + "\"",
601 "Correct name in " + test);
602 is (getPropCount(sub[i].headers), 1,
603 "Wrong number of headers in " + test);
604 is(sub[i].body,
605 expected[i].value.replace(/\r\n|\r|\n/, "\r\n"),
606 "Correct value in " + test);
607 }
608 else {
609 is(sub[i].headers["Content-Disposition"],
610 "form-data; name=\"" + mpquote(expected[i].name) + "\"; filename=\"" +
611 mpquote(expected[i].fileName) + "\"",
612 "Correct name in " + test);
613 is(sub[i].headers["Content-Type"],
614 expected[i].contentType,
615 "Correct content type in " + test);
616 is (getPropCount(sub[i].headers), 2,
617 "Wrong number of headers in " + test);
618 is(sub[i].body,
619 expected[i].value,
620 "Correct value in " + test);
621 }
622 }
623 }
625 function utf8encode(s) {
626 return unescape(encodeURIComponent(s));
627 }
629 function checkURLSubmission(sub, expected) {
630 function urlEscape(s) {
631 return escape(utf8encode(s)).replace("%20", "+", "g")
632 .replace("/", "%2F", "g")
633 .replace("@", "%40", "g");
634 }
636 subItems = sub.split("&");
637 is(subItems.length, expected.length,
638 "Correct number of url items");
639 var i;
640 for (i = 0; i < expected.length; ++i) {
641 let expect = urlEscape(expected[i].name) + "=" +
642 urlEscape(("fileName" in expected[i]) ? expected[i].fileName : expected[i].value);
643 is (subItems[i], expect, "expected URL part");
644 }
645 }
647 function checkPlainSubmission(sub, expected) {
649 is(sub,
650 expected.map(function(v) {
651 return v.name + "=" +
652 (("fileName" in v) ? v.fileName : v.value) +
653 "\r\n";
654 }).join(""),
655 "Correct submission");
656 }
658 function setDisabled(list, state) {
659 Array.prototype.forEach.call(list, function(e) {
660 e.disabled = state;
661 });
662 }
664 var gen = runTest();
665 addLoadEvent(function() {
666 gen.next();
667 });
669 function runTest() {
670 // Set up the expectedSub array
671 fileReader1 = new FileReader;
672 fileReader1.readAsBinaryString(myFile1);
673 fileReader2 = new FileReader;
674 fileReader2.readAsBinaryString(myFile2);
675 fileReader1.onload = fileReader2.onload = function() { gen.next(); };
676 yield undefined; // Wait for both FileReaders. We don't care which order they finish.
677 yield undefined;
678 function fileFixup(o) {
679 if (o.value == myFile1) {
680 o.value = fileReader1.result;
681 o.fileName = myFile1.name;
682 o.contentType = myFile1.type;
683 }
684 else if (o.value == myFile2) {
685 o.value = fileReader2.result;
686 o.fileName = myFile2.name;
687 o.contentType = myFile2.type;
688 }
689 else if (o.value == emptyFile) {
690 o.value = "";
691 o.fileName = emptyFile.name;
692 o.contentType = emptyFile.type;
693 }
694 };
695 expectedSub.forEach(fileFixup);
696 expectedAugment.forEach(fileFixup);
698 var form = $("form");
700 // multipart/form-data
702 var iframe = $("target_iframe");
703 iframe.onload = function() { gen.next(); };
705 // Make normal submission
706 form.submit();
707 yield undefined; // Wait for iframe to load as a result of the submission
708 var submission = JSON.parse(iframe.contentDocument.documentElement.textContent);
709 checkMPSubmission(submission, expectedSub, "normal submission");
711 // Disabled controls
712 setDisabled(document.querySelectorAll("input, select, textarea"), true);
713 form.submit();
714 yield undefined;
715 submission = JSON.parse(iframe.contentDocument.documentElement.textContent);
716 checkMPSubmission(submission, [], "disabled controls");
718 // Reenabled controls
719 setDisabled(document.querySelectorAll("input, select, textarea"), false);
720 form.submit();
721 yield undefined;
722 submission = JSON.parse(iframe.contentDocument.documentElement.textContent);
723 checkMPSubmission(submission, expectedSub, "reenabled controls");
725 // text/plain
726 form.action = "form_submit_server.sjs?plain";
727 form.enctype = "text/plain";
728 form.submit();
729 yield undefined;
730 submission = JSON.parse(iframe.contentDocument.documentElement.textContent);
731 checkPlainSubmission(submission, expectedSub);
733 // application/x-www-form-urlencoded
734 form.action = "form_submit_server.sjs?url";
735 form.enctype = "application/x-www-form-urlencoded";
736 form.submit();
737 yield undefined;
738 submission = JSON.parse(iframe.contentDocument.documentElement.textContent);
739 checkURLSubmission(submission, expectedSub);
741 // application/x-www-form-urlencoded
742 form.action = "form_submit_server.sjs?xxyy";
743 form.method = "GET";
744 form.enctype = "";
745 form.submit();
746 yield undefined;
747 submission = JSON.parse(iframe.contentDocument.documentElement.textContent);
748 checkURLSubmission(submission, expectedSub);
750 // application/x-www-form-urlencoded
751 form.action = "form_submit_server.sjs";
752 form.method = "";
753 form.enctype = "";
754 form.submit();
755 yield undefined;
756 submission = JSON.parse(iframe.contentDocument.documentElement.textContent);
757 checkURLSubmission(submission, expectedSub);
759 // Send form using XHR and FormData
760 xhr = new XMLHttpRequest();
761 xhr.onload = function() { gen.next(); };
762 xhr.open("POST", "form_submit_server.sjs");
763 xhr.send(new FormData(form));
764 yield undefined; // Wait for XHR load
765 checkMPSubmission(JSON.parse(xhr.responseText), expectedSub, "send form using XHR and FormData");
767 // Send disabled form using XHR and FormData
768 setDisabled(document.querySelectorAll("input, select, textarea"), true);
769 xhr.open("POST", "form_submit_server.sjs");
770 xhr.send(new FormData(form));
771 yield undefined;
772 checkMPSubmission(JSON.parse(xhr.responseText), [], "send disabled form using XHR and FormData");
773 setDisabled(document.querySelectorAll("input, select, textarea"), false);
775 // Send FormData
776 function addToFormData(fd) {
777 fd.append("aName", "aValue");
778 fd.append("aNameNum", 9.2);
779 fd.append("aNameFile1", myFile1);
780 fd.append("aNameFile2", myFile2);
781 }
782 var fd = new FormData();
783 addToFormData(fd);
784 xhr.open("POST", "form_submit_server.sjs");
785 xhr.send(fd);
786 yield undefined;
787 checkMPSubmission(JSON.parse(xhr.responseText), expectedAugment, "send FormData");
789 // Augment <form> using FormData
790 fd = new FormData(form);
791 addToFormData(fd);
792 xhr.open("POST", "form_submit_server.sjs");
793 xhr.send(fd);
794 yield undefined;
795 checkMPSubmission(JSON.parse(xhr.responseText),
796 expectedSub.concat(expectedAugment), "send augmented FormData");
798 SimpleTest.finish();
799 yield undefined;
800 }
802 </script>
803 </pre>
804 </body>
805 </html>