Bug 1330111 - Test changes for opening username autocomplete. r=johannh

MozReview-Commit-ID: CJKpsRmWorm
This commit is contained in:
Matthew Noorenberghe 2017-02-03 16:41:48 -08:00
Родитель 0cda4589e3
Коммит dcdc8e9897
7 изменённых файлов: 342 добавлений и 39 удалений

Просмотреть файл

@ -64,4 +64,6 @@ skip-if = os == "linux" || toolkit == 'android' # Tests desktop prompts
[test_prompt_promptAuth_proxy.html] [test_prompt_promptAuth_proxy.html]
skip-if = e10s || os == "linux" || toolkit == 'android' # Tests desktop prompts skip-if = e10s || os == "linux" || toolkit == 'android' # Tests desktop prompts
[test_recipe_login_fields.html] [test_recipe_login_fields.html]
[test_username_focus.html]
skip-if = toolkit == 'android' # android:autocomplete.
[test_xhr_2.html] [test_xhr_2.html]

Просмотреть файл

@ -56,6 +56,8 @@ add_task(function* setup() {
}); });
iframeDoc = iframe.contentDocument; iframeDoc = iframe.contentDocument;
SimpleTest.requestFlakyTimeout("Giving a chance for the unexpected popupshown to occur");
}); });
add_task(function* test_initial_focus() { add_task(function* test_initial_focus() {
@ -69,17 +71,41 @@ add_task(function* test_initial_focus() {
is(popupState.open, false, "Check popup is now closed"); is(popupState.open, false, "Check popup is now closed");
}); });
add_task(function* test_not_reopened_after_selecting() { // This depends on the filling from the previous test.
let formFillController = SpecialPowers.Cc["@mozilla.org/satchel/form-fill-controller;1"]. add_task(function* test_not_reopened_if_filled() {
getService(SpecialPowers.Ci.nsIFormFillController);
let usernameField = iframeDoc.getElementById("form-basic-username");
listenForUnexpectedPopupShown(); listenForUnexpectedPopupShown();
formFillController.markAsLoginManagerField(usernameField); let usernameField = iframeDoc.getElementById("form-basic-username");
SimpleTest.requestFlakyTimeout("Giving a chance for the unexpected popupshown to occur"); usernameField.focus();
info("Waiting to see if a popupshown occurs");
yield new Promise(resolve => setTimeout(resolve, 1000)); yield new Promise(resolve => setTimeout(resolve, 1000));
// cleanup // cleanup
gPopupShownExpected = true; gPopupShownExpected = true;
iframeDoc.getElementById("form-basic-submit").focus();
});
add_task(function* test_reopened_after_edit_not_matching_saved() {
let usernameField = iframeDoc.getElementById("form-basic-username");
usernameField.value = "nam";
let shownPromise = promiseACShown();
usernameField.focus();
yield shownPromise;
iframeDoc.getElementById("form-basic-submit").focus();
});
add_task(function* test_not_reopened_after_selecting() {
let formFillController = SpecialPowers.Cc["@mozilla.org/satchel/form-fill-controller;1"].
getService(SpecialPowers.Ci.nsIFormFillController);
let usernameField = iframeDoc.getElementById("form-basic-username");
usernameField.value = "";
iframeDoc.getElementById("form-basic-password").value = "";
listenForUnexpectedPopupShown();
formFillController.markAsLoginManagerField(usernameField);
info("Waiting to see if a popupshown occurs");
yield new Promise(resolve => setTimeout(resolve, 1000));
// Cleanup
gPopupShownExpected = true;
}); });
</script> </script>

Просмотреть файл

@ -833,6 +833,9 @@ add_task(function* test_form12_open_on_trusted_focus() {
uname.value = ""; uname.value = "";
pword.value = ""; pword.value = "";
// Move focus to the password field so we can test the first click on the
// username field.
pword.focus();
checkACForm("", ""); checkACForm("", "");
const firePrivEventPromise = new Promise((resolve) => { const firePrivEventPromise = new Promise((resolve) => {
uname.addEventListener("click", (e) => { uname.addEventListener("click", (e) => {

Просмотреть файл

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Test basic login autocomplete</title> <title>Test insecure form field autocomplete</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> <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="/tests/SimpleTest/EventUtils.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script> <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
@ -11,7 +11,6 @@
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head> </head>
<body> <body>
Login Manager test: multiple login autocomplete
<script> <script>
var chromeScript = runChecksAfterCommonInit(); var chromeScript = runChecksAfterCommonInit();

Просмотреть файл

@ -0,0 +1,263 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Test interaction between autocomplete and focus on username 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="/tests/SimpleTest/SpawnTask.js"></script>
<script type="text/javascript" src="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>
<script>
let pwmgrCommonScript = runInParent(SimpleTest.getTestFileURL("pwmgr_common.js"));
let readyPromise = registerRunTests();
let chromeScript = runInParent(function chromeSetup() {
const { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components;
let pwmgr = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
let login1A = Cc["@mozilla.org/login-manager/loginInfo;1"].
createInstance(Ci.nsILoginInfo);
let login1B = Cc["@mozilla.org/login-manager/loginInfo;1"].
createInstance(Ci.nsILoginInfo);
let login2A = Cc["@mozilla.org/login-manager/loginInfo;1"].
createInstance(Ci.nsILoginInfo);
let login2B = Cc["@mozilla.org/login-manager/loginInfo;1"].
createInstance(Ci.nsILoginInfo);
let login2C = Cc["@mozilla.org/login-manager/loginInfo;1"].
createInstance(Ci.nsILoginInfo);
login1A.init("http://mochi.test:8888", "http://username-focus-1", null,
"testuser1A", "testpass1A", "", "");
login2A.init("http://mochi.test:8888", "http://username-focus-2", null,
"testuser2A", "testpass2A", "", "");
login2B.init("http://mochi.test:8888", "http://username-focus-2", null,
"testuser2B", "testpass2B", "", "");
pwmgr.addLogin(login1A);
pwmgr.addLogin(login2A);
pwmgr.addLogin(login2B);
});
</script>
<p id="display"></p>
<div id="content">
<!-- first 3 forms have a matching user+pass login -->
<!-- user+pass form. -->
<form id="form-autofilled" action="http://username-focus-1">
<input type="text" name="uname">
<input type="password" name="pword">
<button type="submit" name="submit">Submit</button>
</form>
<!-- user+pass form, username prefilled -->
<form id="form-autofilled-prefilled-un" action="http://username-focus-1">
<input type="text" name="uname" value="testuser1A">
<input type="password" name="pword">
<button type="submit">Submit</button>
</form>
<!-- user+pass form. -->
<form id="form-autofilled-focused-dynamic" action="http://username-focus-1">
<input type="text" name="uname">
<input type="not-yet-password" name="pword">
<button type="submit">Submit</button>
</form>
<!-- next 5 forms have matching user+pass (2x) logins -->
<!-- user+pass form. -->
<form id="form-multiple" action="http://username-focus-2">
<input type="text" name="uname">
<input type="password" name="pword">
<button type="submit">Submit</button>
</form>
<!-- user+pass form dynamic with existing focus -->
<form id="form-multiple-dynamic" action="http://username-focus-2">
<input type="text" name="uname">
<input type="not-yet-password" name="pword">
<button type="submit">Submit</button>
</form>
<!-- user+pass form, username prefilled -->
<form id="form-multiple-prefilled-un1" action="http://username-focus-2">
<input type="text" name="uname" value="testuser2A">
<input type="password" name="pword">
<button type="submit">Submit</button>
</form>
<!-- user+pass form, different username prefilled -->
<form id="form-multiple-prefilled-un2" action="http://username-focus-2">
<input type="text" name="uname" value="testuser2B">
<input type="password" name="pword">
<button type="submit">Submit</button>
</form>
<!-- user+pass form, username prefilled with existing focus -->
<form id="form-multiple-prefilled-focused-dynamic" action="http://username-focus-2">
<input type="text" name="uname" value="testuser2B">
<input type="not-yet-password" name="pword">
<button type="submit">Submit</button>
</form>
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
function removeFocus() {
$_("-autofilled", "submit").focus();
}
add_task(function* setup() {
yield SpecialPowers.pushPrefEnv({"set": [
["security.insecure_field_warning.contextual.enabled", false],
]});
ok(readyPromise, "check promise is available");
yield readyPromise;
});
add_task(function* test_autofilled() {
let usernameField = $_("-autofilled", "uname");
info("Username and password already filled so don't show autocomplete");
let noPopupPromise = promiseNoUnexpectedPopupShown();
usernameField.focus();
yield noPopupPromise;
removeFocus();
usernameField.value = "testuser";
info("Focus when we don't have an exact match");
shownPromise = promiseACShown();
usernameField.focus();
yield shownPromise;
});
add_task(function* test_autofilled_prefilled_un() {
let usernameField = $_("-autofilled-prefilled-un", "uname");
info("Username and password already filled so don't show autocomplete");
let noPopupPromise = promiseNoUnexpectedPopupShown();
usernameField.focus();
yield noPopupPromise;
removeFocus();
usernameField.value = "testuser";
info("Focus when we don't have an exact match");
shownPromise = promiseACShown();
usernameField.focus();
yield shownPromise;
});
add_task(function* test_autofilled_focused_dynamic() {
let usernameField = $_("-autofilled-focused-dynamic", "uname");
let passwordField = $_("-autofilled-focused-dynamic", "pword");
info("Username and password will be filled while username focused");
let noPopupPromise = promiseNoUnexpectedPopupShown();
usernameField.focus();
yield noPopupPromise;
info("triggering autofill");
noPopupPromise = promiseNoUnexpectedPopupShown();
passwordField.type = "password";
yield noPopupPromise;
let popupState = yield getPopupState();
is(popupState.open, false, "Check popup is closed");
removeFocus();
passwordField.value = "test";
info("Focus when we don't have an exact match");
shownPromise = promiseACShown();
usernameField.focus();
yield shownPromise;
});
// Begin testing forms that have multiple saved logins
add_task(function* test_multiple() {
let usernameField = $_("-multiple", "uname");
info("Fields not filled due to multiple so autocomplete upon focus");
shownPromise = promiseACShown();
usernameField.focus();
yield shownPromise;
});
add_task(function* test_multiple_dynamic() {
let usernameField = $_("-multiple-dynamic", "uname");
let passwordField = $_("-multiple-dynamic", "pword");
info("Fields not filled but username is focused upon marking so open");
let noPopupPromise = promiseNoUnexpectedPopupShown();
usernameField.focus();
yield noPopupPromise;
info("triggering _fillForm code");
let shownPromise = promiseACShown();
passwordField.type = "password";
yield shownPromise;
});
add_task(function* test_multiple_prefilled_un1() {
let usernameField = $_("-multiple-prefilled-un1", "uname");
info("Username and password already filled so don't show autocomplete");
let noPopupPromise = promiseNoUnexpectedPopupShown();
usernameField.focus();
yield noPopupPromise;
removeFocus();
usernameField.value = "testuser";
info("Focus when we don't have an exact match");
shownPromise = promiseACShown();
usernameField.focus();
yield shownPromise;
});
add_task(function* test_multiple_prefilled_un2() {
let usernameField = $_("-multiple-prefilled-un2", "uname");
info("Username and password already filled so don't show autocomplete");
let noPopupPromise = promiseNoUnexpectedPopupShown();
usernameField.focus();
yield noPopupPromise;
removeFocus();
usernameField.value = "testuser";
info("Focus when we don't have an exact match");
shownPromise = promiseACShown();
usernameField.focus();
yield shownPromise;
});
add_task(function* test_multiple_prefilled_focused_dynamic() {
let usernameField = $_("-multiple-prefilled-focused-dynamic", "uname");
let passwordField = $_("-multiple-prefilled-focused-dynamic", "pword");
info("Username and password will be filled while username focused");
let noPopupPromise = promiseNoUnexpectedPopupShown();
usernameField.focus();
yield noPopupPromise;
info("triggering autofill");
noPopupPromise = promiseNoUnexpectedPopupShown();
passwordField.type = "password";
yield noPopupPromise;
let popupState = yield getPopupState();
is(popupState.open, false, "Check popup is closed");
removeFocus();
passwordField.value = "test";
info("Focus when we don't have an exact match");
shownPromise = promiseACShown();
usernameField.focus();
yield shownPromise;
});
add_task(function* cleanup() {
removeFocus();
});
</script>
</pre>
</body>
</html>

Просмотреть файл

@ -166,35 +166,38 @@ function commonInit(selfFilling) {
} }
function registerRunTests() { function registerRunTests() {
// We provide a general mechanism for our tests to know when they can return new Promise(resolve => {
// safely run: we add a final form that we know will be filled in, wait // We provide a general mechanism for our tests to know when they can
// for the login manager to tell us that it's filled in and then continue // safely run: we add a final form that we know will be filled in, wait
// with the rest of the tests. // for the login manager to tell us that it's filled in and then continue
window.addEventListener("DOMContentLoaded", (event) => { // with the rest of the tests.
var form = document.createElement("form"); window.addEventListener("DOMContentLoaded", (event) => {
form.id = "observerforcer"; var form = document.createElement("form");
var username = document.createElement("input"); form.id = "observerforcer";
username.name = "testuser"; var username = document.createElement("input");
form.appendChild(username); username.name = "testuser";
var password = document.createElement("input"); form.appendChild(username);
password.name = "testpass"; var password = document.createElement("input");
password.type = "password"; password.name = "testpass";
form.appendChild(password); password.type = "password";
form.appendChild(password);
var observer = SpecialPowers.wrapCallback(function(subject, topic, data) { var observer = SpecialPowers.wrapCallback(function(subject, topic, data) {
var formLikeRoot = subject.QueryInterface(SpecialPowers.Ci.nsIDOMNode); var formLikeRoot = subject.QueryInterface(SpecialPowers.Ci.nsIDOMNode);
if (formLikeRoot.id !== "observerforcer") if (formLikeRoot.id !== "observerforcer")
return; return;
SpecialPowers.removeObserver(observer, "passwordmgr-processed-form"); SpecialPowers.removeObserver(observer, "passwordmgr-processed-form");
formLikeRoot.remove(); formLikeRoot.remove();
SimpleTest.executeSoon(() => { SimpleTest.executeSoon(() => {
var runTestEvent = new Event("runTests"); var runTestEvent = new Event("runTests");
window.dispatchEvent(runTestEvent); window.dispatchEvent(runTestEvent);
resolve();
});
}); });
}); SpecialPowers.addObserver(observer, "passwordmgr-processed-form", false);
SpecialPowers.addObserver(observer, "passwordmgr-processed-form", false);
document.body.appendChild(form); document.body.appendChild(form);
});
}); });
} }

Просмотреть файл

@ -229,11 +229,18 @@ function getPopupState(then = null) {
} }
function listenForUnexpectedPopupShown() { function listenForUnexpectedPopupShown() {
gChromeScript.addMessageListener("onpopupshown", function onPopupShown() { gPopupShownListener = function onPopupShown() {
if (!gPopupShownExpected) { if (!gPopupShownExpected) {
ok(false, "Unexpected autocomplete popupshown event"); ok(false, "Unexpected autocomplete popupshown event");
} }
}); };
}
function* promiseNoUnexpectedPopupShown() {
gPopupShownExpected = false;
listenForUnexpectedPopupShown();
SimpleTest.requestFlakyTimeout("Giving a chance for an unexpected popupshown to occur");
yield new Promise(resolve => setTimeout(resolve, 1000));
} }
/** /**
@ -243,10 +250,10 @@ function listenForUnexpectedPopupShown() {
function promiseACShown() { function promiseACShown() {
gPopupShownExpected = true; gPopupShownExpected = true;
return new Promise(resolve => { return new Promise(resolve => {
gChromeScript.addMessageListener("onpopupshown", ({ results }) => { gPopupShownListener = ({ results }) => {
gPopupShownExpected = false; gPopupShownExpected = false;
resolve(results); resolve(results);
}); };
}); });
} }
@ -256,7 +263,7 @@ function satchelCommonSetup() {
gChromeScript.addMessageListener("onpopupshown", ({ results }) => { gChromeScript.addMessageListener("onpopupshown", ({ results }) => {
gLastAutoCompleteResults = results; gLastAutoCompleteResults = results;
if (gPopupShownListener) if (gPopupShownListener)
gPopupShownListener(); gPopupShownListener({results});
}); });
SimpleTest.registerCleanupFunction(() => { SimpleTest.registerCleanupFunction(() => {