1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Test autocomplete behavior when tabbing between form fields</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="pwmgr_common.js"></script>
<script type="text/javascript" src="../../../satchel/test/satchel_common.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<!-- we presumably can't hide the content for this test. -->
<div id="content"></div>
<pre id="test">
<script class="testbody" type="text/javascript">
const { TestUtils } = SpecialPowers.ChromeUtils.importESModule(
"resource://testing-common/TestUtils.sys.mjs"
);
const availableLogins = {
"exampleUser1": [location.origin, "https://autofill", null, "user1", "pass1", "uname", "pword"],
"subdomainUser1": ["https://sub." + location.host, "https://autofill", null, "user1", "pass1", "uname", "pword"],
"emptyUsername": [location.origin, "https://autofill", null, "", "pass2", "uname", "pword"],
}
const tests = [
{
name: "single_login_exact_origin_no_inputs",
logins: ["exampleUser1"],
expectedAutofillUsername: "user1",
expectedAutofillPassword: "pass1",
expectedACLabels: ["user1"],
typeUsername: null,
expectedTabbedUsername: "",
expectedTabbedPassword: "",
},
{
name: "single_login_exact_origin_initial_letter",
logins: ["exampleUser1"],
expectedAutofillUsername: "user1",
expectedAutofillPassword: "pass1",
expectedACLabels: ["user1"],
typeUsername: "u",
expectedTabbedUsername: "u",
expectedTabbedPassword: "",
},
{
name: "single_login_exact_origin_type_username",
logins: ["exampleUser1"],
expectedAutofillUsername: "user1",
expectedAutofillPassword: "pass1",
expectedACLabels: ["user1"],
typeUsername: "user1",
expectedTabbedUsername: "user1",
expectedTabbedPassword: "pass1",
},
{
name: "single_login_subdomain_no_inputs",
logins: ["subdomainUser1"],
expectedAutofillUsername: "",
expectedAutofillPassword: "",
expectedACLabels: ["user1"],
typeUsername: null,
expectedTabbedUsername: "",
expectedTabbedPassword: "",
},
{
name: "single_login_subdomain_type_username",
logins: ["subdomainUser1"],
expectedAutofillUsername: "",
expectedAutofillPassword: "",
expectedACLabels: ["user1"],
typeUsername: "user1",
expectedTabbedUsername: "user1",
expectedTabbedPassword: "",
},
{
name: "two_logins_one_with_empty_username",
logins: ["exampleUser1", "emptyUsername"],
expectedAutofillUsername: "user1",
expectedAutofillPassword: "pass1",
expectedACLabels: ["user1"],
typeUsername: "",
expectedTabbedUsername: "",
expectedTabbedPassword: "",
},
];
add_setup(async () => {
await SpecialPowers.pushPrefEnv({"set": [["signon.includeOtherSubdomainsInLookup", true]]});
});
async function testResultOfTabInteractions(testData) {
const logins = testData.logins.map(name => availableLogins[name]);
await setStoredLoginsAsync(...logins);
const form = createLoginForm({
action: "https://autofill"
});
await promiseFormsProcessedInSameProcess();
await SimpleTest.promiseFocus(window);
// check autofill results
checkForm(1, testData.expectedAutofillUsername, testData.expectedAutofillPassword);
SpecialPowers.wrap(form.pword).setUserInput("");
SpecialPowers.wrap(form.uname).setUserInput("");
info("Placing focus in the password field");
form.pword.focus();
await synthesizeKey("KEY_Tab", { shiftKey: true }); // blur pw, focus un
// moving focus shouldn't change anything
await ensureLoginFormStaysFilledWith(form.uname, "", form.pword, "");
info("waiting for AC results");
const results = await popupByArrowDown();
info("checking results");
checkAutoCompleteResults(results, testData.expectedACLabels,
window.location.host, "Check all rows are correct");
if (testData.typeUsername) {
await sendString(testData.typeUsername);
}
// don't select anything from the AC menu
await synthesizeKey("KEY_Escape");
await TestUtils.waitForCondition(async () => {
let popupState = await getPopupState();
return !popupState.open;
}, "AutoComplete popup should have closed");
await synthesizeKey("KEY_Tab");
// wait until username and password are automatically filled in with the
// expected values...
await TestUtils.waitForCondition(() => {
return form.uname.value === testData.expectedTabbedUsername & form.pword.value === testData.expectedTabbedPassword;
}, "Username and password field should be filled");
// ...and if the value is not different from the original value in the form,
// make sure that the form keeps its values
if (testData.expectedTabbedPassword === "") {
await ensureLoginFormStaysFilledWith(form.uname, testData.expectedTabbedUsername, form.pword, testData.expectedTabbedPassword);
}
ok(form.pword.matches("input:focus"), "pword field is focused");
}
for (const testData of tests) {
const tmp = {
async [testData.name]() {
await testResultOfTabInteractions(testData);
},
};
add_task(tmp[testData.name]);
}
</script>
</pre>
</body>
</html>
|