toolkit/components/satchel/test/test_form_autocomplete.html

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 <!DOCTYPE HTML>
     2 <html>
     3 <head>
     4   <title>Test for Form History Autocomplete</title>
     5   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
     6   <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
     7   <script type="text/javascript" src="satchel_common.js"></script>
     8   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
     9 </head>
    10 <body>
    11 Form History test: form field autocomplete
    12 <p id="display"></p>
    14 <!-- We presumably can't hide the content for this test. The large top padding is to allow
    15      listening for scrolls to occur. -->
    16 <div id="content" style="padding-top: 20000px;">
    18   <!-- normal, basic form -->
    19   <form id="form1" onsubmit="return false;">
    20     <input  type="text" name="field1">
    21     <button type="submit">Submit</button>
    22   </form>
    24   <!-- normal, basic form (new fieldname) -->
    25   <form id="form2" onsubmit="return false;">
    26     <input  type="text" name="field2">
    27     <button type="submit">Submit</button>
    28   </form>
    30   <!-- form with autocomplete=off on input -->
    31   <form id="form3" onsubmit="return false;">
    32     <input  type="text" name="field2" autocomplete="off">
    33     <button type="submit">Submit</button>
    34   </form>
    36   <!-- form with autocomplete=off on form -->
    37   <form id="form4" autocomplete="off" onsubmit="return false;">
    38     <input  type="text" name="field2">
    39     <button type="submit">Submit</button>
    40   </form>
    42   <!-- normal form for testing filtering -->
    43   <form id="form5" onsubmit="return false;">
    44     <input  type="text" name="field3">
    45     <button type="submit">Submit</button>
    46   </form>
    48   <!-- normal form for testing word boundary filtering -->
    49   <form id="form6" onsubmit="return false;">
    50     <input  type="text" name="field4">
    51     <button type="submit">Submit</button>
    52   </form>
    54   <!-- form with maxlength attribute on input -->
    55   <form id="form7" onsubmit="return false;">
    56     <input  type="text" name="field5" maxlength="10">
    57     <button type="submit">Submit</button>
    58   </form>
    60   <!-- form with input type='email' -->
    61   <form id="form8" onsubmit="return false;">
    62     <input  type="email" name="field6">
    63     <button type="submit">Submit</button>
    64   </form>
    66   <!-- form with input type='tel' -->
    67   <form id="form9" onsubmit="return false;">
    68     <input  type="tel" name="field7">
    69     <button type="submit">Submit</button>
    70   </form>
    72   <!-- form with input type='url' -->
    73   <form id="form10" onsubmit="return false;">
    74     <input  type="url" name="field8">
    75     <button type="submit">Submit</button>
    76   </form>
    78   <!-- form with input type='search' -->
    79   <form id="form11" onsubmit="return false;">
    80     <input  type="search" name="field9">
    81     <button type="submit">Submit</button>
    82   </form>
    84   <!-- form with input type='number' -->
    85   <form id="form12" onsubmit="return false;">
    86     <input  type="number" name="field10">
    87     <button type="submit">Submit</button>
    88   </form>
    90   <!-- normal, basic form (with fieldname='searchbar-history') -->
    91   <form id="form13" onsubmit="return false;">
    92     <input  type="text" name="searchbar-history">
    93     <button type="submit">Submit</button>
    94   </form>
    96   <!-- form with input type='date' -->
    97   <form id="form14" onsubmit="return false;">
    98     <input  type="date" name="field11">
    99     <button type="submit">Submit</button>
   100   </form>
   102   <!-- form with input type='time' -->
   103   <form id="form15" onsubmit="return false;">
   104     <input  type="time" name="field12">
   105     <button type="submit">Submit</button>
   106   </form>
   108   <!-- form with input type='range' -->
   109   <form id="form16" onsubmit="return false;">
   110     <input  type="range" name="field13" max="64">
   111     <button type="submit">Submit</button>
   112   </form>
   114   <!-- form with input type='color' -->
   115   <form id="form17" onsubmit="return false;">
   116     <input  type="color" name="field14">
   117     <button type="submit">Submit</button>
   118   </form>
   120 </div>
   122 <pre id="test">
   123 <script class="testbody" type="text/javascript">
   125 /** Test for Form History autocomplete **/
   127 var input = $_(1, "field1");
   128 const shiftModifier = Event.SHIFT_MASK;
   130 function setupFormHistory(aCallback) {
   131   updateFormHistory([
   132     { op : "remove" },
   133     { op : "add", fieldname : "field1", value : "value1" },
   134     { op : "add", fieldname : "field1", value : "value2" },
   135     { op : "add", fieldname : "field1", value : "value3" },
   136     { op : "add", fieldname : "field1", value : "value4" },
   137     { op : "add", fieldname : "field2", value : "value1" },
   138     { op : "add", fieldname : "field3", value : "a" },
   139     { op : "add", fieldname : "field3", value : "aa" },
   140     { op : "add", fieldname : "field3", value : "aaz" },
   141     { op : "add", fieldname : "field3", value : "aa\xe6" }, // 0xae == latin ae pair (0xc6 == AE)
   142     { op : "add", fieldname : "field3", value : "az" },
   143     { op : "add", fieldname : "field3", value : "z" },
   144     { op : "add", fieldname : "field4", value : "a\xe6" },
   145     { op : "add", fieldname : "field4", value : "aa a\xe6" },
   146     { op : "add", fieldname : "field4", value : "aba\xe6" },
   147     { op : "add", fieldname : "field4", value : "bc d\xe6" },
   148     { op : "add", fieldname : "field5", value : "1" },
   149     { op : "add", fieldname : "field5", value : "12" },
   150     { op : "add", fieldname : "field5", value : "123" },
   151     { op : "add", fieldname : "field5", value : "1234" },
   152     { op : "add", fieldname : "field6", value : "value" },
   153     { op : "add", fieldname : "field7", value : "value" },
   154     { op : "add", fieldname : "field8", value : "value" },
   155     { op : "add", fieldname : "field9", value : "value" },
   156     { op : "add", fieldname : "field10", value : "42" },
   157     { op : "add", fieldname : "field11", value : "2010-10-10" },
   158     { op : "add", fieldname : "field12", value : "21:21" },
   159     { op : "add", fieldname : "field13", value : "32" },  // not used, since type=range doesn't have a drop down menu
   160     { op : "add", fieldname : "field14", value : "#ffffff" }, // not used, since type=color doesn't have autocomplete currently
   161     { op : "add", fieldname : "searchbar-history", value : "blacklist test" },
   162   ], aCallback);
   163 }
   165 // All these non-implemeted types might need autocomplete tests in the future.
   166 var todoTypes = [ "datetime", "month", "week", "datetime-local" ];
   167 var todoInput = document.createElement("input");
   168 for (var type of todoTypes) {
   169   todoInput.type = type;
   170   todo_is(todoInput.type, type, type + " type shouldn't be implemented");
   171 }
   174 function setForm(value) {
   175   input.value = value;
   176   input.focus();
   177 }
   179 var autocompleteMenu = getAutocompletePopup();
   181 // Restore the form to the default state.
   182 function restoreForm() {
   183   setForm("");
   184 }
   186 // Check for expected form data.
   187 function checkForm(expectedValue) {
   188   var formID = input.parentNode.id;
   189   is(input.value, expectedValue, "Checking " + formID + " input");
   190 }
   192 var testNum = 0;
   193 var expectingPopup = false;
   195 function expectPopup()
   196 {
   197   info("expecting popup for test " + testNum);
   198   expectingPopup = true;
   199 }
   201 function popupShownListener()
   202 {
   203   info("popup shown for test " + testNum);
   204   if (expectingPopup) {
   205     expectingPopup = false;
   206     SimpleTest.executeSoon(runTest);
   207   }
   208   else {
   209     ok(false, "Autocomplete popup not expected during test " + testNum);
   210   }
   211 }
   213 SpecialPowers.addAutoCompletePopupEventListener(window, "popupshown", popupShownListener);
   215 /*
   216  * Main section of test...
   217  *
   218  * This is a bit hacky, as many operations happen asynchronously.
   219  * Various mechanisms call runTests as a result of operations:
   220  *   - set expectingPopup to true, and the next test will occur when the autocomplete popup is shown
   221  *   - call waitForMenuChange(x) to run the next test when the autocomplete popup to have x items in it 
   222  *   - addEntry calls runs the test when an entry has been added
   223  *   - some tests scroll the window. This is because the form fill controller happens to scroll
   224  *     the field into view near the end of the search, and there isn't any other good notification
   225  *     to listen to for when the search is complete.
   226  *   - some items still use setTimeout
   227  */
   228 function runTest() {
   229   testNum++;
   231   ok(true, "Starting test #" + testNum);
   233   switch(testNum) {
   234     case 1:
   235         // Make sure initial form is empty.
   236         checkForm("");
   237         // Trigger autocomplete popup
   238         expectPopup();
   239         restoreForm();
   240         doKey("down");
   241         break;
   243     case 2:
   244         checkMenuEntries(["value1", "value2", "value3", "value4"], testNum);
   245         // Check first entry
   246         doKey("down");
   247         checkForm(""); // value shouldn't update
   248         doKey("return"); // not "enter"!
   249         checkForm("value1");
   251         // Trigger autocomplete popup
   252         expectPopup();
   253         restoreForm();
   254         doKey("down");
   255         break;
   257     case 3:
   258         // Check second entry
   259         doKey("down");
   260         doKey("down");
   261         doKey("return"); // not "enter"!
   262         checkForm("value2");
   264         // Trigger autocomplete popup
   265         expectPopup();
   266         restoreForm();
   267         doKey("down");
   268         break;
   270     case 4:
   271         // Check third entry
   272         doKey("down");
   273         doKey("down");
   274         doKey("down");
   275         doKey("return");
   276         checkForm("value3");
   278         // Trigger autocomplete popup
   279         expectPopup();
   280         restoreForm();
   281         doKey("down");
   282         break;
   284     case 5:
   285         // Check fourth entry
   286         doKey("down");
   287         doKey("down");
   288         doKey("down");
   289         doKey("down");
   290         doKey("return");
   291         checkForm("value4");
   293         // Trigger autocomplete popup
   294         expectPopup();
   295         restoreForm();
   296         doKey("down");
   297         break;
   299     case 6:
   300         // Check first entry (wraparound)
   301         doKey("down");
   302         doKey("down");
   303         doKey("down");
   304         doKey("down");
   305         doKey("down"); // deselects
   306         doKey("down");
   307         doKey("return");
   308         checkForm("value1");
   310         // Trigger autocomplete popup
   311         expectPopup();
   312         restoreForm();
   313         doKey("down");
   314         break;
   316     case 7:
   317         // Check the last entry via arrow-up
   318         doKey("up");
   319         doKey("return");
   320         checkForm("value4");
   322         // Trigger autocomplete popup
   323         expectPopup();
   324         restoreForm();
   325         doKey("down");
   326         break;
   328     case 8:
   329         // Check the last entry via arrow-up
   330         doKey("down"); // select first entry
   331         doKey("up");   // selects nothing!
   332         doKey("up");   // select last entry
   333         doKey("return");
   334         checkForm("value4");
   336         // Trigger autocomplete popup
   337         expectPopup();
   338         restoreForm();
   339         doKey("down");
   340         break;
   342     case 9:
   343         // Check the last entry via arrow-up (wraparound)
   344         doKey("down");
   345         doKey("up"); // deselects
   346         doKey("up"); // last entry
   347         doKey("up");
   348         doKey("up");
   349         doKey("up"); // first entry
   350         doKey("up"); // deselects
   351         doKey("up"); // last entry
   352         doKey("return");
   353         checkForm("value4");
   355         // Trigger autocomplete popup
   356         expectPopup();
   357         restoreForm();
   358         doKey("down");
   359         break;
   361     case 10:
   362         // Set first entry w/o triggering autocomplete
   363         doKey("down");
   364         doKey("right");
   365         checkForm("value1");
   367         // Trigger autocomplete popup
   368         expectPopup();
   369         restoreForm();
   370         doKey("down");
   371         break;
   373     case 11:
   374         // Set first entry w/o triggering autocomplete
   375         doKey("down");
   376         doKey("left");
   377         checkForm("value1");
   379         // Trigger autocomplete popup
   380         expectPopup();
   381         restoreForm();
   382         doKey("down");
   383         break;
   385     case 12:
   386         // Check first entry (page up)
   387         doKey("down");
   388         doKey("down");
   389         doKey("page_up");
   390         doKey("return");
   391         checkForm("value1");
   393         // Trigger autocomplete popup
   394         expectPopup();
   395         restoreForm();
   396         doKey("down");
   397         break;
   399     case 13:
   400         // Check last entry (page down)
   401         doKey("down");
   402         doKey("page_down");
   403         doKey("return");
   404         checkForm("value4");
   406         // Trigger autocomplete popup
   407         testNum = 49;
   408         expectPopup();
   409         restoreForm();
   410         doKey("down");
   411         break;
   413     /* Test removing entries from the dropdown */
   415     case 50:
   416         checkMenuEntries(["value1", "value2", "value3", "value4"], testNum);
   417         // Delete the first entry (of 4)
   418         setForm("value");
   419         doKey("down");
   421         // On OS X, shift-backspace and shift-delete work, just delete does not.
   422         // On Win/Linux, shift-backspace does not work, delete and shift-delete do.
   423         if (SpecialPowers.OS == "Darwin")
   424           doKey("back_space", shiftModifier);
   425         else
   426           doKey("delete", shiftModifier);
   428         // This tests that on OS X shift-backspace didn't delete the last character
   429         // in the input (bug 480262).
   430         waitForMenuChange(3);
   431         break;
   433     case 51:
   434         checkForm("value");
   435         countEntries("field1", "value1",
   436           function (num) {
   437             ok(!num, testNum + " checking that f1/v1 was deleted");
   438             runTest();
   439           });
   440         break;
   442     case 52:
   443         doKey("return");
   444         checkForm("value2");
   446         // Trigger autocomplete popup
   447         expectPopup();
   448         restoreForm();
   449         doKey("down");
   450         break;
   452     case 53:
   453         checkMenuEntries(["value2", "value3", "value4"], testNum);
   454         // Check the new first entry (of 3)
   455         doKey("down");
   456         doKey("return");
   457         checkForm("value2");
   459         // Trigger autocomplete popup
   460         expectPopup();
   461         restoreForm();
   462         doKey("down");
   463         break;
   465     case 54:
   466         // Delete the second entry (of 3)
   467         doKey("down");
   468         doKey("down");
   469         doKey("delete", shiftModifier);
   470         waitForMenuChange(2);
   471         break;
   473     case 55:
   474         checkForm("");
   475         countEntries("field1", "value3",
   476           function (num) {
   477             ok(!num, testNum + " checking that f1/v3 was deleted");
   478             runTest();
   479           });
   480         break;
   482     case 56:
   483         doKey("return");
   484         checkForm("value4")
   486         // Trigger autocomplete popup
   487         expectPopup();
   488         restoreForm();
   489         doKey("down");
   490         break;
   492     case 57:
   493         checkMenuEntries(["value2", "value4"], testNum);
   494         // Check the new first entry (of 2)
   495         doKey("down");
   496         doKey("return");
   497         checkForm("value2");
   499         // Trigger autocomplete popup
   500         expectPopup();
   501         restoreForm();
   502         doKey("down");
   503         break;
   505     case 58:
   506         // Delete the last entry (of 2)
   507         doKey("down");
   508         doKey("down");
   509         doKey("delete", shiftModifier);
   510         checkForm("");
   511         waitForMenuChange(1);
   512         break;
   514     case 59:
   515         countEntries("field1", "value4",
   516           function (num) {
   517             ok(!num, testNum + " checking that f1/v4 was deleted");
   518             runTest();
   519           });
   520         break;
   522     case 60:
   523         doKey("return");
   524         checkForm("value2");
   526         // Trigger autocomplete popup
   527         expectPopup();
   528         restoreForm();
   529         doKey("down");
   530         break;
   532     case 61:
   533         checkMenuEntries(["value2"], testNum);
   534         // Check the new first entry (of 1)
   535         doKey("down");
   536         doKey("return");
   537         checkForm("value2");
   539         // Trigger autocomplete popup
   540         expectPopup();
   541         restoreForm();
   542         doKey("down");
   543         break;
   545     case 62:
   546         // Delete the only remaining entry
   547         doKey("down");
   548         doKey("delete", shiftModifier);
   549         waitForMenuChange(0);
   550         break;
   552     case 63:
   553         checkForm("");
   554         countEntries("field1", "value2",
   555           function (num) {
   556             ok(!num, testNum + " checking that f1/v2 was deleted");
   557             runTest();
   558           });
   559         break;
   561     case 64:
   562         // Look at form 2, trigger autocomplete popup
   563         input = $_(2, "field2");
   564         testNum = 99;
   565         expectPopup();
   566         restoreForm();
   567         doKey("down");
   568         break;
   570     /* Test entries with autocomplete=off */
   572     case 100:
   573         // Select first entry
   574         doKey("down");
   575         doKey("return");
   576         checkForm("value1");
   578         // Look at form 3, try to trigger autocomplete popup
   579         input = $_(3, "field2");
   580         restoreForm();
   581         // Sometimes, this will fail if scrollTo(0, 0) is called, so that doesn't
   582         // happen here. Fortunately, a different input is used from the last test,
   583         // so a scroll should still occur.
   584         doKey("down");
   585         waitForScroll();
   586         break;
   588     case 101:
   589         // Ensure there's no autocomplete dropdown (autocomplete=off is present)
   590         doKey("down");
   591         doKey("return");
   592         checkForm("");
   594         // Look at form 4, try to trigger autocomplete popup
   595         input = $_(4, "field2");
   596         restoreForm();
   597         doKey("down");
   598         waitForMenuChange(0);
   599         break;
   601     case 102:
   602         // Ensure there's no autocomplete dropdown (autocomplete=off is present)
   603         doKey("down");
   604         doKey("return");
   605         checkForm("");
   607         // Look at form 5, try to trigger autocomplete popup
   608         input = $_(5, "field3");
   609         restoreForm();
   610         testNum = 199;
   611         expectPopup();
   612         input.focus();
   613         sendChar("a");
   614         break;
   616     /* Test filtering as characters are typed. */
   618     case 200:
   619         checkMenuEntries(["a", "aa", "aaz", "aa\xe6", "az"], testNum);
   620         input.focus();
   621         sendChar("a");
   622         waitForMenuChange(3);
   623         break;
   625     case 201:
   626         checkMenuEntries(["aa", "aaz", "aa\xe6"], testNum);
   627         input.focus();
   628         sendChar("\xc6");
   629         waitForMenuChange(1);
   630         break;
   632     case 202:
   633         checkMenuEntries(["aa\xe6"], testNum);
   634         doKey("back_space");
   635         waitForMenuChange(3);
   636         break;
   638     case 203:
   639         checkMenuEntries(["aa", "aaz", "aa\xe6"], testNum);
   640         doKey("back_space");
   641         waitForMenuChange(5);
   642         break;
   644     case 204:
   645         checkMenuEntries(["a", "aa", "aaz", "aa\xe6", "az"], testNum);
   646         input.focus();
   647         sendChar("z");
   648         waitForMenuChange(2);
   649         break;
   651     case 205:
   652         checkMenuEntries(["az", "aaz"], testNum);
   653         input.focus();
   654         doKey("left");
   655         expectPopup();
   656         sendChar("a");
   657         break;
   659     case 206:
   660         checkMenuEntries(["aaz"], testNum);
   661         addEntry("field3", "aazq");
   662         break;
   664     case 207:
   665         input.focus();
   666         doKey("right");
   667         sendChar("q");
   668         waitForMenuChange(0);
   669         break;
   671     case 208:
   672         // check that results were cached
   673         checkMenuEntries([], testNum);
   674         addEntry("field3", "aazqq");
   675         break;
   677     case 209:
   678         input.focus();
   679         window.scrollTo(0, 0);
   680         sendChar("q");
   681         waitForScroll();
   682         break;
   684     case 210:
   685         // check that empty results were cached - bug 496466
   686         checkMenuEntries([], testNum);
   687         doKey("escape");
   689         // Look at form 6, try to trigger autocomplete popup
   690         input = $_(6, "field4");
   691         restoreForm();
   692         testNum = 249;
   693         expectPopup();
   694         input.focus();
   695         sendChar("a");
   696         break;
   698     /* Test substring matches and word boundary bonuses */
   700     case 250:
   701         // alphabetical results for first character
   702         checkMenuEntries(["aa a\xe6", "aba\xe6", "a\xe6"], testNum);
   703         input.focus();
   705         // for this test, hide the popup first as it contains the same number of menu 
   707         sendChar("\xc6");
   708         waitForMenuChange(3, "a\xe6");
   709         break;
   711     case 251:
   712         // prefix match comes first, then word boundary match
   713         // followed by substring match
   714         checkMenuEntries(["a\xe6", "aa a\xe6", "aba\xe6"], testNum);
   716         restoreForm();
   717         input.focus();
   718         sendChar("b");
   719         waitForMenuChange(1, "bc d\xe6");
   720         break;
   722     case 252:
   723         checkMenuEntries(["bc d\xe6"], testNum);
   724         input.focus();
   725         sendChar(" ");
   726         setTimeout(runTest, 300);
   727         break;
   729     case 253:
   730         // check that trailing space has no effect after single char.
   731         checkMenuEntries(["bc d\xe6"], testNum);
   732         input.focus();
   733         sendChar("\xc6");
   734         waitForMenuChange(2);
   735         break;
   737     case 254:
   738         // check multi-word substring matches
   739         checkMenuEntries(["bc d\xe6", "aba\xe6"]);
   740         input.focus();
   741         expectPopup();
   742         doKey("left");
   743         sendChar("d");
   744         break;
   746     case 255:
   747         // check inserting in multi-word searches
   748         checkMenuEntries(["bc d\xe6"], testNum);
   749         input.focus();
   750         sendChar("z");
   751         waitForMenuChange(0);
   752         break;
   754     case 256:
   755         checkMenuEntries([], testNum);
   757         // Look at form 7, try to trigger autocomplete popup
   758         input = $_(7, "field5");
   759         testNum = 299;
   760         expectPopup();
   761         restoreForm();
   762         doKey("down");
   763         break;
   765     case 300:
   766         checkMenuEntries(["1", "12", "123", "1234"], testNum);
   767         input.maxLength = 4;
   768         expectPopup();
   769         doKey("escape");
   770         doKey("down");
   771         break;
   773     case 301:
   774         checkMenuEntries(["1", "12", "123", "1234"], testNum);
   775         input.maxLength = 3;
   776         expectPopup();
   777         doKey("escape");
   778         doKey("down");
   779         break;
   781     case 302:
   782         checkMenuEntries(["1", "12", "123"], testNum);
   783         input.maxLength = 2;
   784         expectPopup();
   785         doKey("escape");
   786         doKey("down");
   787         break;
   789     case 303:
   790         checkMenuEntries(["1", "12"], testNum);
   791         input.maxLength = 1;
   792         expectPopup();
   793         doKey("escape");
   794         doKey("down");
   795         break;
   797     case 304:
   798         checkMenuEntries(["1"], testNum);
   799         input.maxLength = 0;
   800         doKey("escape");
   801         doKey("down");
   802         waitForMenuChange(0);
   803         break;
   805     case 305:
   806         checkMenuEntries([], testNum);
   807         input.maxLength = 4;
   809         // now again with a character typed
   810         input.focus();
   811         sendChar("1");
   812         expectPopup();
   813         doKey("escape");
   814         doKey("down");
   815         break;
   817     case 306:
   818         checkMenuEntries(["1", "12", "123", "1234"], testNum);
   819         input.maxLength = 3;
   820         expectPopup();
   821         doKey("escape");
   822         doKey("down");
   823         break;
   825     case 307:
   826         checkMenuEntries(["1", "12", "123"], testNum);
   827         input.maxLength = 2;
   828         expectPopup();
   829         doKey("escape");
   830         doKey("down");
   831         break;
   833     case 308:
   834         checkMenuEntries(["1", "12"], testNum);
   835         input.maxLength = 1;
   836         expectPopup();
   837         doKey("escape");
   838         doKey("down");
   839         break;
   841     case 309:
   842         checkMenuEntries(["1"], testNum);
   843         input.maxLength = 0;
   844         doKey("escape");
   845         doKey("down");
   846         waitForMenuChange(0);
   847         break;
   849     case 310:
   850         checkMenuEntries([], testNum);
   852         input = $_(8, "field6");
   853         testNum = 399;
   854         expectPopup();
   855         restoreForm();
   856         doKey("down");
   857         break;
   859     case 400:
   860     case 401:
   861     case 402:
   862     case 403:
   863         checkMenuEntries(["value"], testNum);
   864         doKey("down");
   865         doKey("return");
   866         checkForm("value");
   868         if (testNum == 400) {
   869           input = $_(9, "field7");
   870         } else if (testNum == 401) {
   871           input = $_(10, "field8");
   872         } else if (testNum == 402) {
   873           input = $_(11, "field9");
   874         } else if (testNum == 403) {
   875           input = $_(12, "field10");
   876         }
   878         expectPopup();
   879         restoreForm();
   880         doKey("down");
   881         break;
   883     case 404:
   884         checkMenuEntries(["42"], testNum);
   885         doKey("down");
   886         doKey("return");
   887         checkForm("42");
   889         input = $_(14, "field11");
   890         restoreForm();
   891         expectPopup();
   892         doKey("down");
   893         break;
   895     case 405:
   896         checkMenuEntries(["2010-10-10"]);
   897         doKey("down");
   898         doKey("return");
   899         checkForm("2010-10-10");
   901         input = $_(15, "field12");
   902         restoreForm();
   903         expectPopup();
   904         doKey("down");
   905         break;
   907     case 406:
   908         checkMenuEntries(["21:21"]);
   909         doKey("down");
   910         doKey("return");
   911         checkForm("21:21");
   913         input = $_(16, "field13");
   914         restoreForm();
   915         doKey("down");
   916         waitForMenuChange(0);
   917         break;
   919     case 407:
   920         checkMenuEntries([]); // type=range does not have a drop down menu
   921         doKey("down");
   922         doKey("return");
   923         checkForm("30"); // default (midway between minimum (0) and maximum (64)) - step
   925         input = $_(17, "field14");
   926         restoreForm();
   927         waitForMenuChange(0);
   928         break;
   930     case 408:
   931         checkMenuEntries([]); // type=color does not have a drop down menu
   932         checkForm("#000000"); // default color value
   934         addEntry("field1", "value1");
   935         break;
   937     case 409:
   938         input = $_(1, "field1");
   939         // Go to test 500.
   940         testNum = 499;
   942         expectPopup();
   943         restoreForm();
   944         doKey("down");
   945         break;
   947     // Check that the input event is fired.
   948     case 500:
   949       input.addEventListener("input", function(event) {
   950         input.removeEventListener("input", arguments.callee, false);
   951         ok(true, testNum + " oninput should have been received");
   952         ok(event.bubbles, testNum + " input event should bubble");
   953         ok(event.cancelable, testNum + " input event should be cancelable");
   954       }, false);
   956       doKey("down");
   957       checkForm("");
   958       doKey("return");
   959       checkForm("value1");
   960       testNum = 599;
   961       setTimeout(runTest, 100);
   962       break;
   964     case 600:
   965         // check we don't show autocomplete for searchbar-history
   966         input = $_(13, "searchbar-history");
   968         // Trigger autocomplete popup
   969         checkForm("");
   970         restoreForm();
   971         doKey("down");
   972         waitForMenuChange(0);
   973         break;
   975     case 601:
   976         checkMenuEntries([], testNum);
   977         SpecialPowers.removeAutoCompletePopupEventListener(window, "popupshown", popupShownListener);
   978         SimpleTest.finish();
   979         return;
   981     default:
   982         ok(false, "Unexpected invocation of test #" + testNum);
   983         SpecialPowers.removeAutoCompletePopupEventListener(window, "popupshown", popupShownListener);
   984         SimpleTest.finish();
   985         return;
   986   }
   987 }
   989 function addEntry(name, value)
   990 {
   991   updateFormHistory({ op : "add", fieldname : name, value: value }, runTest);
   992 }
   994 // Runs the next test when scroll event occurs
   995 function waitForScroll()
   996 {
   997   addEventListener("scroll", function() {
   998     if (!window.pageYOffset)
   999       return;
  1001     removeEventListener("scroll", arguments.callee, false);
  1002     setTimeout(runTest, 50);
  1003   }, false);
  1006 function waitForMenuChange(expectedCount, expectedFirstValue)
  1008   if (autocompleteMenu.tree.view.rowCount != expectedCount) {
  1009     SimpleTest.executeSoon(function () waitForMenuChange(expectedCount, expectedFirstValue));
  1011   else if (expectedFirstValue && autocompleteMenu.tree.view.rowCount > 1 &&
  1012            autocompleteMenu.tree.view.getValueAt(0, autocompleteMenu.tree.columns[0]) != expectedFirstValue) {
  1013     SimpleTest.executeSoon(function () waitForMenuChange(expectedCount, expectedFirstValue));
  1015   else {
  1016     runTest();
  1020 function checkMenuEntries(expectedValues, testNum) {
  1021     var actualValues = getMenuEntries();
  1022     is(actualValues.length, expectedValues.length, testNum + " Checking length of expected menu");
  1023     for (var i = 0; i < expectedValues.length; i++)
  1024         is(actualValues[i], expectedValues[i], testNum + " Checking menu entry #"+i);
  1027 function getMenuEntries() {
  1028     var entries = [];
  1030     // Could perhaps pull values directly from the controller, but it seems
  1031     // more reliable to test the values that are actually in the tree?
  1032     var column = autocompleteMenu.tree.columns[0];
  1033     var numRows = autocompleteMenu.tree.view.rowCount;
  1034     for (var i = 0; i < numRows; i++) {
  1035         entries.push(autocompleteMenu.tree.view.getValueAt(i, column));
  1037     return entries;
  1040 function startTest() {
  1041     setupFormHistory(function() {
  1042         runTest();
  1043     });
  1046 window.onload = startTest;
  1048 SimpleTest.waitForExplicitFinish();
  1049 </script>
  1050 </pre>
  1051 </body>
  1052 </html>

mercurial