toolkit/components/satchel/test/test_form_submission.html

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 <!DOCTYPE HTML>
     2 <html>
     3 <head>
     4   <title>Satchel Test for Form Submisstion</title>
     5   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>  
     6   <script type="text/javascript" src="satchel_common.js"></script>
     7   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
     8 </head>
     9 <body>
    10 <p id="display"></p>
    11 <iframe id="iframe" src="https://example.com/tests/toolkit/components/satchel/test/subtst_form_submission_1.html"></iframe>
    12 <div id="content" style="display: none">
    14   <!-- ===== Things that should not be saved. ===== -->
    16   <!-- autocomplete=off for input -->
    17   <form id="form1" onsubmit="return checkSubmit(1)">
    18     <input type="text" name="test1" autocomplete="off">
    19     <button type="submit">Submit</button>
    20   </form>
    22   <!-- autocomplete=off for form -->
    23   <form id="form2" onsubmit="return checkSubmit(2)" autocomplete="off">
    24     <input type="text" name="test1">
    25     <button type="submit">Submit</button>
    26   </form>
    28   <!-- don't save type=hidden -->
    29   <form id="form3" onsubmit="return checkSubmit(3)">
    30     <input type="hidden" name="test1">
    31     <button type="submit">Submit</button>
    32   </form>
    34   <!-- don't save type=checkbox -->
    35   <form id="form4" onsubmit="return checkSubmit(4)">
    36     <input type="checkbox" name="test1">
    37     <button type="submit">Submit</button>
    38   </form>
    40   <!-- Don't save empty values. -->
    41   <form id="form5" onsubmit="return checkSubmit(5)">
    42     <input type="text" name="test1" value="originalValue">
    43     <button type="submit">Submit</button>
    44   </form>
    46   <!-- Don't save unchanged values. -->
    47   <form id="form6" onsubmit="return checkSubmit(6)">
    48     <input type="text" name="test1" value="dontSaveThis">
    49     <button type="submit">Submit</button>
    50   </form>
    52   <!-- Don't save unchanged values. (.value not touched) -->
    53   <form id="form7" onsubmit="return checkSubmit(7)">
    54     <input type="text" name="test1" value="dontSaveThis">
    55     <button type="submit">Submit</button>
    56   </form>
    58   <!-- No field name or ID. -->
    59   <form id="form8" onsubmit="return checkSubmit(8)">
    60     <input type="text">
    61     <button type="submit">Submit</button>
    62   </form>
    64   <!-- Nothing to save! -->
    65   <form id="form9" onsubmit="return checkSubmit(9)">
    66     <button type="submit">Submit</button>
    67   </form>
    69   <!-- input with name too long (300 chars.) -->
    70   <form id="form10" onsubmit="return checkSubmit(10)">
    71     <input type="text" name="12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890">
    72     <button type="submit">Submit</button>
    73   </form>
    75   <!-- input with value too long (300 chars.) -->
    76   <form id="form11" onsubmit="return checkSubmit(11)">
    77     <input type="text" name="test1">
    78     <button type="submit">Submit</button>
    79   </form>
    81   <!-- input with value of one space (which should be trimmed) -->
    82   <form id="form12" onsubmit="return checkSubmit(12)">
    83     <input type="text" name="test1">
    84     <button type="submit">Submit</button>
    85   </form>
    87   <!-- password field -->
    88   <form id="form13" onsubmit="return checkSubmit(13)">
    89     <input type="password" name="test1">
    90     <button type="submit">Submit</button>
    91   </form>
    93   <!-- password field (type changed after pageload) -->
    94   <form id="form14" onsubmit="return checkSubmit(14)">
    95     <input type="text" name="test1">
    96     <button type="submit">Submit</button>
    97   </form>
    99   <!-- input with sensitive data (16 digit credit card number) -->
   100   <form id="form15" onsubmit="return checkSubmit(15)">
   101     <script type="text/javascript">
   102       var form = document.getElementById('form15');
   103       for (var i = 0; i != 10; i++)
   104       {
   105         var input = document.createElement('input');
   106         input.type = 'text';
   107         input.name = 'test' + (i + 1);
   108         form.appendChild(input);
   109       }
   110     </script>
   111     <button type="submit">Submit</button>
   112   </form>
   114   <!-- input with sensitive data (15 digit credit card number) -->
   115   <form id="form16" onsubmit="return checkSubmit(16)">
   116     <script type="text/javascript">
   117       var form = document.getElementById('form16');
   118       for (var i = 0; i != 10; i++)
   119       {
   120         var input = document.createElement('input');
   121         input.type = 'text';
   122         input.name = 'test' + (i + 1);
   123         form.appendChild(input);
   124       }
   125     </script>
   126     <button type="submit">Submit</button>
   127   </form>
   129   <!-- input with sensitive data (9 digit credit card number) -->
   130   <form id="form17" onsubmit="return checkSubmit(17)">
   131     <input type="text" name="test1">
   132     <button type="submit">Submit</button>
   133   </form>
   135   <!-- input with sensitive data (16 digit hyphenated credit card number) -->
   136   <form id="form18" onsubmit="return checkSubmit(18)">
   137     <input type="text" name="test1">
   138     <button type="submit">Submit</button>
   139   </form>
   141   <!-- input with sensitive data (15 digit whitespace-separated credit card number) -->
   142   <form id="form19" onsubmit="return checkSubmit(19)">
   143     <input type="text" name="test1">
   144     <button type="submit">Submit</button>
   145   </form>
   147   <!-- form data submitted through HTTPS, when browser.formfill.saveHttpsForms is false -->
   148   <form id="form20" action="https://www.example.com/" onsubmit="return checkSubmit(20)">
   149     <input type="text" name="test1">
   150     <button type="submit">Submit</button>
   151   </form>
   153   <!-- Form 21 is submitted into an iframe, not declared here. -->
   155   <!-- Don't save values if the form is invalid. -->
   156   <form id="form22" onsubmit="return checkSubmit(22);">
   157     <input type='email' name='test1' oninvalid="return checkSubmit(22);">
   158     <button type='submit'>Submit</button>
   159   </form>
   161   <!-- Don't save values if the form is invalid. -->
   162   <form id="form23" onsubmit="return checkSubmit(23);">
   163     <input type='email' value='foo' oninvalid="return checkSubmit(23);">
   164     <input type='text' name='test1'>
   165     <button type='submit'>Submit</button>
   166   </form>
   168   <!-- Don't save values if the input name is 'searchbar-history' -->
   169   <form id="form24" onsubmit="return checkSubmit(24);">
   170     <input type='text' name='searchbar-history'>
   171     <button type='submit'>Submit</button>
   172   </form>
   174   <!-- ===== Things that should be saved ===== -->
   176   <!-- Form 100 is submitted into an iframe, not declared here. -->
   178   <!-- input with no default value -->
   179   <form id="form101" onsubmit="return checkSubmit(101)">
   180     <input type="text" name="test1">
   181     <button type="submit">Submit</button>
   182   </form>
   184   <!-- input with a default value -->
   185   <form id="form102" onsubmit="return checkSubmit(102)">
   186     <input type="text" name="test2" value="originalValue">
   187     <button type="submit">Submit</button>
   188   </form>
   190   <!-- input uses id but not name -->
   191   <form id="form103" onsubmit="return checkSubmit(103)">
   192     <input type="text" id="test3">
   193     <button type="submit">Submit</button>
   194   </form>
   196   <!-- input with leading and trailing space -->
   197   <form id="form104" onsubmit="return checkSubmit(104)">
   198     <input type="text" name="test4">
   199     <button type="submit">Submit</button>
   200   </form>
   202   <!-- input with leading and trailing whitespace -->
   203   <form id="form105" onsubmit="return checkSubmit(105)">
   204     <input type="text" name="test5">
   205     <button type="submit">Submit</button>
   206   </form>
   208   <!-- input that looks like sensitive data but doesn't
   209        satisfy the requirements (incorrect length) -->
   210   <form id="form106" onsubmit="return checkSubmit(106)">
   211     <input type="text" name="test6">
   212     <button type="submit">Submit</button>
   213   </form>
   215   <!-- input that looks like sensitive data but doesn't
   216        satisfy the requirements (Luhn check fails for 16 chars) -->
   217   <form id="form107" onsubmit="return checkSubmit(107)">
   218     <script type="text/javascript">
   219       var form = document.getElementById('form107');
   220       for (var i = 0; i != 10; i++)
   221       {
   222         var input = document.createElement('input');
   223         input.type = 'text';
   224         input.name = 'test7_' + (i + 1);
   225         form.appendChild(input);
   226       }
   227     </script>
   228     <button type="submit">Submit</button>
   229   </form>
   231   <!-- input that looks like sensitive data but doesn't
   232        satisfy the requirements (Luhn check fails for 15 chars) -->
   233   <form id="form108" onsubmit="return checkSubmit(108)">
   234     <script type="text/javascript">
   235       var form = document.getElementById('form108');
   236       for (var i = 0; i != 10; i++)
   237       {
   238         var input = document.createElement('input');
   239         input.type = 'text';
   240         input.name = 'test8_' + (i + 1);
   241         form.appendChild(input);
   242       }
   243     </script>
   244     <button type="submit">Submit</button>
   245   </form>
   247   <!-- form data submitted through HTTPS, when browser.formfill.saveHttpsForms is true -->
   248   <form id="form109" action="https://www.example.com/" onsubmit="return checkSubmit(109)">
   249     <input type="text" name="test9">
   250     <button type="submit">Submit</button>
   251   </form>
   253   <!-- regular form data, when browser.formfill.saveHttpsForms is false -->
   254   <form id="form110" onsubmit="return checkSubmit(110)">
   255     <input type="text" name="test10">
   256     <button type="submit">Submit</button>
   257   </form>
   259 </div>
   260 <pre id="test">
   261 <script class="testbody" type="text/javascript">
   263 var numSubmittedForms = 0;
   265 var ccNumbers = {
   266   valid15: [
   267     "930771457288760", "474915027480942",
   268     "924894781317325", "714816113937185",
   269     "790466087343106", "474320195408363",
   270     "219211148122351", "633038472250799",
   271     "354236732906484", "095347810189325",
   272   ],
   273   valid16: [
   274     "3091269135815020", "5471839082338112",
   275     "0580828863575793", "5015290610002932",
   276     "9465714503078607", "4302068493801686",
   277     "2721398408985465", "6160334316984331",
   278     "8643619970075142", "0218246069710785"
   279   ],
   280   invalid15: [
   281     "526931005800649", "724952425140686",
   282     "379761391174135", "030551436468583",
   283     "947377014076746", "254848023655752",
   284     "226871580283345", "708025346034339",
   285     "917585839076788", "918632588027666"
   286   ],
   287   invalid16: [
   288     "9946177098017064", "4081194386488872",
   289     "3095975979578034", "3662215692222536",
   290     "6723210018630429", "4411962856225025",
   291     "8276996369036686", "4449796938248871",
   292     "3350852696538147", "5011802870046957"
   293   ],
   294 };
   296 function checkInitialState() {
   297   countEntries(null, null,
   298     function (num) {
   299       ok(!num, "checking for initially empty storage");
   300       startTest();
   301     });
   302 }
   304 function startTest() {
   305   // Fill in values for the various fields. We could just set the <input>'s
   306   // value attribute, but we don't save default form values (and we want to
   307   // ensure unsaved values are because of autocomplete=off or whatever).
   308   $_(1, "test1").value = "dontSaveThis";
   309   $_(2, "test1").value = "dontSaveThis";
   310   $_(3, "test1").value = "dontSaveThis";
   311   $_(4, "test1").value = "dontSaveThis";
   312   $_(5, "test1").value = "";
   313   $_(6, "test1").value = "dontSaveThis";
   314   // Form 7 deliberately left untouched.
   315   // Form 8 has an input with no name or input attribute.
   316   var input = document.getElementById("form8").elements[0];
   317   is(input.type, "text", "checking we got unidentified input");
   318   input.value = "dontSaveThis";
   319   // Form 9 has nothing to modify.
   320   $_(10, "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890").value = "dontSaveThis";
   321   $_(11, "test1").value = "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
   322   $_(12, "test1").value = " ";
   323   $_(13, "test1").value = "dontSaveThis";
   324   $_(14, "test1").type  = "password";
   325   $_(14, "test1").value = "dontSaveThis";
   327   var testData = ccNumbers.valid16;
   328   for (var i = 0; i != testData.length; i++) {
   329     $_(15, "test" + (i + 1)).value = testData[i];
   330   }
   332   testData = ccNumbers.valid15;
   333   for (var i = 0; i != testData.length; i++) {
   334     $_(16, "test" + (i + 1)).value = testData[i];
   335   }
   336   $_(17, "test1").value = "001064088";
   337   $_(18, "test1").value = "0000-0000-0080-4609";
   338   $_(19, "test1").value = "0000 0000 0222 331";
   339   $_(20, "test1").value = "dontSaveThis";
   340   $_(22, "test1").value = "dontSaveThis";
   341   $_(23, "test1").value = "dontSaveThis";
   342   $_(24, "searchbar-history").value = "dontSaveThis";
   344   $_(101, "test1").value = "savedValue";
   345   $_(102, "test2").value = "savedValue";
   346   $_(103, "test3").value = "savedValue";
   347   $_(104, "test4").value = " trimTrailingAndLeadingSpace ";
   348   $_(105, "test5").value = "\t trimTrailingAndLeadingWhitespace\t ";
   349   $_(106, "test6").value = "00000000109181";
   351   var testData = ccNumbers.invalid16;
   352   for (var i = 0; i != testData.length; i++) {
   353     $_(107, "test7_" + (i + 1)).value = testData[i];
   354   }
   356   var testData = ccNumbers.invalid15;
   357   for (var i = 0; i != testData.length; i++) {
   358     $_(108, "test8_" + (i + 1)).value = testData[i];
   359   }
   361   $_(109, "test9").value = "savedValue";
   362   $_(110, "test10").value = "savedValue";
   364   // submit the first form.
   365   var button = getFormSubmitButton(1);
   366   button.click();
   367 }
   370 // Called by each form's onsubmit handler.
   371 function checkSubmit(formNum) {
   372   netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
   374   ok(true, "form " + formNum + " submitted");
   375   numSubmittedForms++;
   377   // Check for expected storage state.
   378   switch (formNum) {
   379     // Test 1-24 should not save anything.
   380     case 1:
   381     case 2:
   382     case 3:
   383     case 4:
   384     case 5:
   385     case 6:
   386     case 7:
   387     case 8:
   388     case 9:
   389     case 10:
   390     case 11:
   391     case 12:
   392     case 13:
   393     case 14:
   394     case 15:
   395     case 16:
   396     case 17:
   397     case 18:
   398     case 19:
   399     case 20:
   400     case 21:
   401     case 22:
   402     case 23:
   403     case 24:
   404       countEntries(null, null,
   405         function (num) {
   406           ok(!num, "checking for empty storage");
   407           submitForm(formNum);
   408         });
   409         return false;
   410         break;
   411     case 100:
   412         checkForSave("subtest2", "subtestValue", "checking saved subtest value");
   413         break;
   414     case 101:
   415         checkForSave("test1", "savedValue", "checking saved value");
   416         break;
   417     case 102:
   418         checkForSave("test2", "savedValue", "checking saved value");
   419         break;
   420     case 103:
   421         checkForSave("test3", "savedValue", "checking saved value");
   422         break;
   423     case 104:
   424         checkForSave("test4", "trimTrailingAndLeadingSpace", "checking saved value is trimmed on both sides");
   425         break;
   426     case 105:
   427         checkForSave("test5", "trimTrailingAndLeadingWhitespace", "checking saved value is trimmed on both sides");
   428         break;
   429     case 106:
   430         checkForSave("test6", "00000000109181", "checking saved value");
   431         break;
   432     case 107:
   433         for (var i = 0; i != ccNumbers.invalid16.length; i++) {
   434           checkForSave("test7_" + (i + 1), ccNumbers.invalid16[i], "checking saved value");
   435         }
   436         break;
   437     case 108:
   438         for (var i = 0; i != ccNumbers.invalid15.length; i++) {
   439           checkForSave("test8_" + (i + 1), ccNumbers.invalid15[i], "checking saved value");
   440         }
   441         break;
   442     case 109:
   443         checkForSave("test9", "savedValue", "checking saved value");
   444         break;
   445     case 110:
   446         checkForSave("test10", "savedValue", "checking saved value");
   447         break;
   448     default:
   449         ok(false, "Unexpected form submission");
   450         break;
   451   }
   453   return submitForm(formNum);
   454 }
   456 function submitForm(formNum)
   457 {
   458   // Forms 13 and 14 would trigger a save-password notification. Temporarily
   459   // disable pwmgr, then reenable it.
   460   if (formNum == 12)
   461       SpecialPowers.setBoolPref("signon.rememberSignons", false);
   462   if (formNum == 14)
   463       SpecialPowers.clearUserPref("signon.rememberSignons");
   465   // Forms 20 and 21 requires browser.formfill.saveHttpsForms to be false
   466   if (formNum == 19)
   467     SpecialPowers.setBoolPref("browser.formfill.saveHttpsForms", false);
   468   // Reset preference now that 20 and 21 are over
   469   if (formNum == 21)
   470     SpecialPowers.clearUserPref("browser.formfill.saveHttpsForms");
   472   // End the test now on SeaMonkey.
   473   if (formNum == 21 && navigator.userAgent.match(/ SeaMonkey\//)) {
   474     Services.obs.removeObserver(checkObserver, "satchel-storage-changed");
   475     is(numSubmittedForms, 21, "Ensuring all forms were submitted.");
   477     todo(false, "Skipping remaining checks on SeaMonkey ftb. (Bug 589471)");
   478     // finish(), yet let the test actually end first, to be safe.
   479     SimpleTest.executeSoon(SimpleTest.finish);
   481     return false; // return false to cancel current form submission
   482   }
   484   // Form 109 requires browser.formfill.save_https_forms to be true;
   485   // Form 110 requires it to be false.
   486   if (formNum == 108)
   487     SpecialPowers.setBoolPref("browser.formfill.saveHttpsForms", true);
   488   if (formNum == 109)
   489     SpecialPowers.setBoolPref("browser.formfill.saveHttpsForms", false);
   490   if (formNum == 110)
   491     SpecialPowers.clearUserPref("browser.formfill.saveHttpsForms");
   493   // End the test at the last form.
   494   if (formNum == 110) {
   495     is(numSubmittedForms, 35, "Ensuring all forms were submitted.");
   496     Services.obs.removeObserver(checkObserver, "satchel-storage-changed");
   497     SimpleTest.finish();
   498     return false; // return false to cancel current form submission
   499   }
   501   // This timeout is here so that button.click() is never called before this
   502   // function returns. If button.click() is called before returning, a long
   503   // chain of submits will happen recursively since the submit is dispatched
   504   // immediately.
   505   //
   506   // This in itself is fine, but if there are errors in the code, mochitests
   507   // will in some cases give you "server too busy", which is hard to debug!
   508   //
   509   setTimeout(function() {
   510     checkObserver.waitForChecks(function() {
   511       var nextFormNum = formNum == 24 ? 100 : (formNum + 1);
   513       // Submit the next form. Special cases are Forms 21 and 100, which happen
   514       // from an HTTPS domain in an iframe.
   515       if (nextFormNum == 21 || nextFormNum == 100) {
   516         ok(true, "submitting iframe test " + nextFormNum);
   517         document.getElementById("iframe").contentWindow.clickButton(nextFormNum);
   518       }
   519       else {
   520         var button = getFormSubmitButton(nextFormNum);
   521         button.click();
   522       }
   523     });
   524   }, 0);
   526   return false; // cancel current form submission
   527 }
   529 Services.obs.addObserver(checkObserver, "satchel-storage-changed", false);
   531 window.onload = checkInitialState;
   533 SimpleTest.waitForExplicitFinish();
   535 </script>
   536 </pre>
   537 </body>
   538 </html>

mercurial