content/html/content/test/test_formSubmission.html

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

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_&#13;_&#10;_&#13;&#10;_ _&quot;"
    38                  value="v1_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
    49                  value="v2_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
    60                  value="v3_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
    72                  value="v4_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
    83                  value="v5_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
    95                  value="v6_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   106                  value="v7_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   117                  value="v8_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   128                  value="v9_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   139                  value="v10_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   151                  value="v11_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   162                  value="v12_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   173                  value="v13_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   184                   value="v14_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   195                   value="v15_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   206                   value="v16_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   217                   value="v17_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></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_&#13;_&#10;_&#13;&#10;_ _&quot;"
   228                   value="v18_7_&#13;_&#10;_&#13;&#10;_ _&quot;"></button></td>
   229     </tr>
   230     <tr>
   231       <td>&lt;input type='url'&gt;</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_&#13;_&#10;_&#13;&#10;__&quot;"
   239                  value="http://v19_7_&#13;_&#10;_&#13;&#10;__&quot;">
   240           <!-- Put UTF-8 value in the "strange" column. -->
   241           <input type=url name="n19_8" value="http://m&#xf3;zill&auml;.&#xf3;rg"></td>
   242     </tr>
   243     <tr>
   244       <td>&lt;input type='email'&gt;</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_&#13;_&#10;_&#13;&#10;__&quot;"
   252                  value="v20_7_&#13;_&#10;_&#13;&#10;__&quot;@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_&#13;_&#10;_&#13;&#10;_ _&quot;">t_9_&#13;_&#10;_&#13;&#10;_ _&quot;_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>

mercurial