summaryrefslogtreecommitdiffstats
path: root/toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html')
-rw-r--r--toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html198
1 files changed, 198 insertions, 0 deletions
diff --git a/toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html b/toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html
new file mode 100644
index 0000000000..2db691b1bf
--- /dev/null
+++ b/toolkit/components/passwordmgr/test/mochitest/test_password_field_autocomplete.html
@@ -0,0 +1,198 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Test basic login autocomplete</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script src="/tests/SimpleTest/EventUtils.js"></script>
+ <script type="text/javascript" src="../../../satchel/test/satchel_common.js"></script>
+ <script type="text/javascript" src="pwmgr_common.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+Login Manager test: multiple login autocomplete
+
+<script>
+var chromeScript = runChecksAfterCommonInit();
+
+const INSECURE_WARNING_TEXT = "This connection is not secure. Logins entered here could be compromised. Learn More";
+
+let origin = window.location.origin;
+addLoginsInParent(
+ // login0 has no username, so should be filtered out from the autocomplete list.
+ [origin, "http://autocomplete:8888", null, "", "user0pass", "", "pword"],
+ [origin, "http://autocomplete:8888", null, "tempuser1", "temppass1", "uname", "pword"],
+ [origin, "http://autocomplete:8888", null, "testuser2", "testpass2", "uname", "pword"],
+ [origin, "http://autocomplete:8888", null, "testuser3", "testpass3", "uname", "pword"],
+ [origin, "http://autocomplete:8888", null, "zzzuser4", "zzzpass4", "uname", "pword"]);
+</script>
+<p id="display"></p>
+
+<!-- we presumably can't hide the content for this test. -->
+<div id="content">
+
+ <!-- form1 tests multiple matching logins -->
+ <form id="form1" action="http://autocomplete:8888/formtest.js" onsubmit="return false;">
+ <h1>Sign in</h1>
+ <input type="text" name="uname">
+ <input type="password" name="pword">
+ <button type="submit">Submit</button>
+ </form>
+
+ <form id="form2" action="http://autocomplete:8888/formtest.js" onsubmit="return false;">
+ <input type="text" name="uname">
+ <input type="password" name="pword" readonly="true">
+ <button type="submit">Submit</button>
+ </form>
+
+ <form id="form3" action="http://autocomplete:8888/formtest.js" onsubmit="return false;">
+ <input type="text" name="uname">
+ <input type="password" name="pword" disabled="true">
+ <button type="submit">Submit</button>
+ </form>
+
+</div>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+/** Test for Login Manager: multiple login autocomplete. **/
+
+let uname = getFormElementByName(1, "uname");
+let pword = getFormElementByName(1, "pword");
+
+// Restore the form to the default state.
+async function reinitializeForm(index) {
+ // Using innerHTML is for creating the autocomplete popup again, so the
+ // preference value will be applied to the constructor of
+ // LoginAutoCompleteResult.
+ let form = document.getElementById("form" + index);
+ let temp = form.innerHTML;
+ form.innerHTML = "";
+ // eslint-disable-next-line no-unsanitized/property
+ form.innerHTML = temp;
+
+ await new Promise(resolve => {
+ let observer = SpecialPowers.wrapCallback(() => {
+ SpecialPowers.removeObserver(observer, "passwordmgr-processed-form");
+ resolve();
+ });
+ SpecialPowers.addObserver(observer, "passwordmgr-processed-form");
+ });
+
+ await SimpleTest.promiseFocus(window);
+
+ uname = getFormElementByName(index, "uname");
+ pword = getFormElementByName(index, "pword");
+ uname.value = "";
+ pword.value = "";
+ pword.focus();
+}
+
+function generateDateString(date) {
+ let dateAndTimeFormatter = new Services.intl.DateTimeFormat(undefined,
+ { dateStyle: "medium" });
+ return dateAndTimeFormatter.format(date);
+}
+
+const DATE_NOW_STRING = generateDateString(new Date());
+
+// Check for expected username/password in form.
+function checkACFormPasswordField(expectedPassword) {
+ var formID = uname.parentNode.id;
+ is(pword.value, expectedPassword, "Checking " + formID + " password is: " + JSON.stringify(expectedPassword));
+}
+
+async function userOpenAutocompleteOnForm1(autoFillInsecureForms) {
+ await SpecialPowers.pushPrefEnv({"set": [
+ ["signon.autofillForms.http", autoFillInsecureForms],
+ ]});
+ await reinitializeForm(1);
+ const autocompleteItems = await popupBy();
+
+ const popupState = await getPopupState();
+ is(popupState.selectedIndex, -1, "Check no entries are selected upon opening");
+
+ const expectedMenuItems = [INSECURE_WARNING_TEXT,
+ "No username (" + DATE_NOW_STRING + ")",
+ "tempuser1",
+ "testuser2",
+ "testuser3",
+ "zzzuser4"];
+ checkAutoCompleteResults(autocompleteItems, expectedMenuItems, "mochi.test", "Check all menuitems are displayed correctly.");
+}
+
+async function userPressedDown_passwordIs(value) {
+ synthesizeKey("KEY_ArrowDown");
+ await Promise.resolve(); // let focus happen
+ checkACFormPasswordField(value);
+}
+
+async function userPressedEnter_passwordIs(value) {
+ synthesizeKey("KEY_Enter");
+ await Promise.resolve(); // let focus happen
+ checkACFormPasswordField(value);
+}
+
+async function noPopupOnForm(formIndex, reason) {
+ await SpecialPowers.pushPrefEnv({"set": [
+ ["signon.autofillForms.http", true],
+ ]});
+ await reinitializeForm(formIndex);
+
+ // Trigger autocomplete popup
+ synthesizeKey("KEY_ArrowDown"); // open
+ let popupState = await getPopupState();
+ is(popupState.open, false, reason);
+}
+
+add_setup(async () => {
+ listenForUnexpectedPopupShown();
+});
+
+add_task(async function form1_initial_empty() {
+ await SimpleTest.promiseFocus(window);
+
+ // Make sure initial form is empty.
+ checkACFormPasswordField("");
+ let popupState = await getPopupState();
+ is(popupState.open, false, "Check popup is initially closed");
+});
+
+add_task(async function noAutocompleteForReadonlyField() {
+ await noPopupOnForm(2, "Check popup is closed for a readonly field.");
+});
+
+add_task(async function noAutocompleteForDisabledField() {
+ await noPopupOnForm(3, "Check popup is closed for a disabled field.");
+});
+
+add_task(async function insecureAutoFill_EnterOnWarning() {
+ await userOpenAutocompleteOnForm1(true);
+ await userPressedDown_passwordIs("");
+ await userPressedEnter_passwordIs("");
+});
+
+add_task(async function insecureAutoFill_EnterOnLogin() {
+ await userOpenAutocompleteOnForm1(true);
+ await userPressedDown_passwordIs(""); // select insecure warning
+ await userPressedDown_passwordIs(""); // select login
+ await userPressedEnter_passwordIs("user0pass");
+});
+
+add_task(async function noInsecureAutoFill_EnterOnWarning() {
+ await userOpenAutocompleteOnForm1(false);
+ await userPressedDown_passwordIs(""); // select insecure warning
+ await userPressedEnter_passwordIs("");
+});
+
+add_task(async function noInsecureAutoFill_EnterOnLogin() {
+ await userOpenAutocompleteOnForm1(false);
+ await userPressedDown_passwordIs(""); // select insecure warning
+ await userPressedDown_passwordIs(""); // select login
+ await userPressedEnter_passwordIs("user0pass");
+});
+
+</script>
+</pre>
+</body>
+</html>