summaryrefslogtreecommitdiffstats
path: root/toolkit/components/satchel/test/test_form_autocomplete_with_list.html
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/satchel/test/test_form_autocomplete_with_list.html')
-rw-r--r--toolkit/components/satchel/test/test_form_autocomplete_with_list.html506
1 files changed, 506 insertions, 0 deletions
diff --git a/toolkit/components/satchel/test/test_form_autocomplete_with_list.html b/toolkit/components/satchel/test/test_form_autocomplete_with_list.html
new file mode 100644
index 000000000..04fb080c9
--- /dev/null
+++ b/toolkit/components/satchel/test/test_form_autocomplete_with_list.html
@@ -0,0 +1,506 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for Form History Autocomplete</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+ <script type="text/javascript" src="satchel_common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+Form History test: form field autocomplete
+<p id="display"></p>
+
+<!-- we presumably can't hide the content for this test. -->
+<div id="content">
+
+ <!-- normal, basic form -->
+ <form id="form1" onsubmit="return false;">
+ <input list="suggest" type="text" name="field1">
+ <button type="submit">Submit</button>
+ </form>
+
+ <!-- form with autocomplete=off on input -->
+ <form id="form3" onsubmit="return false;">
+ <input list="suggest" type="text" name="field2" autocomplete="off">
+ <button type="submit">Submit</button>
+ </form>
+
+ <!-- form with autocomplete=off on form -->
+ <form id="form4" autocomplete="off" onsubmit="return false;">
+ <input list="suggest" type="text" name="field2">
+ <button type="submit">Submit</button>
+ </form>
+
+ <datalist id="suggest">
+ <option value="Google" label="PASS1">FAIL</option>
+ <option value="Reddit">PASS2</option>
+ <option value="final"></option>
+ </datalist>
+</div>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/** Test for Form History autocomplete **/
+
+var input = $_(1, "field1");
+const shiftModifier = Components.interfaces.nsIDOMEvent.SHIFT_MASK;
+
+function setupFormHistory(aCallback) {
+ updateFormHistory([
+ { op : "remove" },
+ { op : "add", fieldname : "field1", value : "historyvalue" },
+ { op : "add", fieldname : "field2", value : "othervalue" },
+ ], aCallback);
+}
+
+function setForm(value) {
+ input.value = value;
+ input.focus();
+}
+
+// Restore the form to the default state.
+function restoreForm() {
+ setForm("");
+}
+
+// Check for expected form data.
+function checkForm(expectedValue) {
+ var formID = input.parentNode.id;
+ is(input.value, expectedValue, "Checking " + formID + " input");
+}
+
+var testNum = 0;
+var prevValue;
+var expectingPopup = false;
+
+function expectPopup() {
+ info("expecting popup for test " + testNum);
+ expectingPopup = true;
+}
+
+function popupShownListener() {
+ info("popup shown for test " + testNum);
+ if (expectingPopup) {
+ expectingPopup = false;
+ SimpleTest.executeSoon(runTest);
+ }
+ else {
+ ok(false, "Autocomplete popup not expected during test " + testNum);
+ }
+}
+
+registerPopupShownListener(popupShownListener);
+
+/*
+* Main section of test...
+*
+* This is a bit hacky, as many operations happen asynchronously.
+* Various mechanisms call runTests as a result of operations:
+* - set expectingPopup to true, and the next test will occur when the autocomplete popup is shown
+* - call waitForMenuChange(x) to run the next test when the autocomplete popup to have x items in it
+*/
+function runTest() {
+ testNum++;
+
+ info("Starting test #" + testNum);
+
+ switch (testNum) {
+ case 1:
+ // Make sure initial form is empty.
+ checkForm("");
+ // Trigger autocomplete popup
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+ case 2:
+ checkMenuEntries(["historyvalue", "PASS1", "PASS2", "final"], testNum);
+ // Check first entry
+ doKey("down");
+ checkForm(""); // value shouldn't update
+ doKey("return"); // not "enter"!
+ checkForm("historyvalue");
+
+ // Trigger autocomplete popup
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 3:
+ // Check second entry
+ doKey("down");
+ doKey("down");
+ doKey("return"); // not "enter"!
+ checkForm("Google");
+
+ // Trigger autocomplete popup
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 4:
+ // Check third entry
+ doKey("down");
+ doKey("down");
+ doKey("down");
+ doKey("return");
+ checkForm("Reddit");
+
+ // Trigger autocomplete popup
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 5:
+ // Check fourth entry
+ doKey("down");
+ doKey("down");
+ doKey("down");
+ doKey("down");
+ doKey("return");
+ checkForm("final");
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 6:
+ // Delete the first entry (of 3)
+ doKey("down");
+ doKey("delete", shiftModifier);
+ waitForMenuChange(3);
+ break;
+
+ case 7:
+ checkForm("");
+ countEntries("field1", "historyvalue",
+ function (num) {
+ ok(!num, testNum + " checking that form history value was deleted");
+ runTest();
+ });
+ break;
+
+ case 8:
+ doKey("return");
+ checkForm("Google")
+
+ // Trigger autocomplete popup
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 9:
+ // Test deletion
+ checkMenuEntries(["PASS1", "PASS2", "final"], testNum);
+ // Check the new first entry (of 3)
+ doKey("down");
+ doKey("return");
+ checkForm("Google");
+
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 10:
+ // Test autocompletion of datalists with cached results.
+ sendString("PAS");
+ waitForMenuChange(2);
+ break;
+
+ case 11:
+ // Continuation of test 10
+ sendString("S1");
+ waitForMenuChange(1);
+ break;
+
+ case 12:
+ doKey("down");
+ doKey("return");
+ checkForm("Google");
+
+ // Trigger autocomplete popup
+ // Look at form 3, try to trigger autocomplete popup
+ input.value = "";
+ input = $_(3, "field2");
+ testNum = 99;
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 100:
+ checkMenuEntries(["PASS1", "PASS2", "final"], testNum);
+ // Check first entry
+ doKey("down");
+ checkForm(""); // value shouldn't update
+ doKey("return"); // not "enter"!
+ checkForm("Google");
+
+ // Trigger autocomplete popup
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 101:
+ // Check second entry
+ doKey("down");
+ doKey("down");
+ doKey("return"); // not "enter"!
+ checkForm("Reddit");
+
+ // Trigger autocomplete popup
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 102:
+ // Check third entry
+ doKey("down");
+ doKey("down");
+ doKey("down");
+ doKey("return");
+ checkForm("final");
+
+ // Trigger autocomplete popup
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 103:
+ checkMenuEntries(["PASS1", "PASS2", "final"], testNum);
+ // Check first entry
+ doKey("down");
+ checkForm(""); // value shouldn't update
+ doKey("return"); // not "enter"!
+ checkForm("Google");
+
+ // Trigger autocomplete popup
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 104:
+ // Check second entry
+ doKey("down");
+ doKey("down");
+ doKey("return"); // not "enter"!
+ checkForm("Reddit");
+
+ // Trigger autocomplete popup
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 105:
+ // Check third entry
+ doKey("down");
+ doKey("down");
+ doKey("down");
+ doKey("return");
+ checkForm("final");
+
+ testNum = 199;
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ // Test dynamic updates.
+ // For some reasons, when there is an update of the list, the selection is
+ // lost so we need to go down like if we were at the beginning of the list
+ // again.
+ case 200:
+ // Removing the second element while on the first then going down and
+ // push enter. Value should be one from the third suggesion.
+ doKey("down");
+ var datalist = document.getElementById('suggest');
+ var toRemove = datalist.children[1]
+ datalist.removeChild(toRemove);
+
+ SimpleTest.executeSoon(function() {
+ doKey("down");
+ doKey("down");
+ doKey("return");
+ checkForm("final");
+
+ // Restore the element.
+ datalist.insertBefore(toRemove, datalist.children[1]);
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ });
+ break;
+
+ case 201:
+ // Adding an attribute after the first one while on the first then going
+ // down and push enter. Value should be the on from the new suggestion.
+ doKey("down");
+ datalist = document.getElementById('suggest');
+ var added = new Option("Foo");
+ datalist.insertBefore(added, datalist.children[1]);
+ waitForMenuChange(4);
+ break;
+
+ case 202:
+ doKey("down");
+ doKey("down");
+ doKey("return");
+ checkForm("Foo");
+
+ // Remove the element.
+ datalist = document.getElementById('suggest');
+ datalist.removeChild(datalist.children[1]);
+ waitForMenuChange(0);
+ break;
+
+ case 203:
+ // Change the first element value attribute.
+ restoreForm();
+ datalist = document.getElementById('suggest');
+ prevValue = datalist.children[0].value;
+ datalist.children[0].value = "foo";
+ expectPopup();
+ break;
+
+ case 204:
+ doKey("down");
+ doKey("return");
+ checkForm("foo");
+
+ datalist = document.getElementById('suggest');
+ datalist.children[0].value = prevValue;
+ waitForMenuChange(0);
+ break;
+
+ case 205:
+ // Change the textContent to update the value attribute.
+ restoreForm();
+ datalist = document.getElementById('suggest');
+ prevValue = datalist.children[0].getAttribute('value');
+ datalist.children[0].removeAttribute('value');
+ datalist.children[0].textContent = "foobar";
+ expectPopup();
+ break;
+
+ case 206:
+ doKey("down");
+ doKey("return");
+ checkForm("foobar");
+
+ datalist = document.getElementById('suggest');
+ datalist.children[0].setAttribute('value', prevValue);
+ testNum = 299;
+ waitForMenuChange(0);
+ break;
+
+ // Tests for filtering (or not).
+ case 300:
+ // Filters with first letter of the word.
+ restoreForm();
+ synthesizeKey("f", {});
+ expectPopup();
+ break;
+
+ case 301:
+ doKey("down");
+ doKey("return");
+ checkForm("final");
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 302:
+ // Filter with a letter in the middle of the word.
+ synthesizeKey("i", {});
+ synthesizeKey("n", {});
+ waitForMenuChange(1);
+ break;
+
+ case 303:
+ // Continuation of test 302.
+ doKey("down");
+ doKey("return");
+ checkForm("final");
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 304:
+ // Filter is disabled with mozNoFilter.
+ input.setAttribute('mozNoFilter', 'true');
+ synthesizeKey("f", {});
+ waitForMenuChange(3); // no change
+ break;
+
+ case 305:
+ // Continuation of test 304.
+ doKey("down");
+ doKey("return");
+ checkForm("Google");
+ input.removeAttribute('mozNoFilter');
+ testNum = 399;
+ expectPopup();
+ restoreForm();
+ doKey("down");
+ break;
+
+ case 400:
+ // Check that the input event is fired.
+ input.addEventListener("input", function(event) {
+ input.removeEventListener("input", arguments.callee, false);
+ ok(true, "oninput should have been received");
+ ok(event.bubbles, "input event should bubble");
+ ok(event.cancelable, "input event should be cancelable");
+ checkForm("Google");
+ input.blur();
+ SimpleTest.finish();
+ }, false);
+
+ doKey("down");
+ checkForm("");
+ doKey("return");
+ break;
+
+ default:
+ ok(false, "Unexpected invocation of test #" + testNum);
+ SimpleTest.finish();
+ return;
+ }
+}
+
+function waitForMenuChange(expectedCount) {
+ notifyMenuChanged(expectedCount, null, runTest);
+}
+
+function checkMenuEntries(expectedValues, testNumber) {
+ var actualValues = getMenuEntries();
+ is(actualValues.length, expectedValues.length, testNumber + " Checking length of expected menu");
+ for (var i = 0; i < expectedValues.length; i++)
+ is(actualValues[i], expectedValues[i], testNumber + " Checking menu entry #"+i);
+}
+
+function startTest() {
+ setupFormHistory(runTest);
+}
+
+window.onload = startTest;
+
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+</body>
+</html>