rename from toolkit/components/passwordmgr/test/test_notifications.html
rename to toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger.js
--- a/toolkit/components/passwordmgr/test/test_notifications.html
+++ b/toolkit/components/passwordmgr/test/browser/browser_capture_doorhanger.js
@@ -1,591 +1,409 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <meta charset="utf-8">
- <title>Test for Login Manager</title>
- <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
- <script type="text/javascript" src="pwmgr_common.js"></script>
- <script type="text/javascript" src="notification_common.js"></script>
- <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-</head>
-<body>
-Login Manager test: notifications
-<p id="display"></p>
+/*
+ * Test capture popup notifications
+ */
-<div id="content" style="display: none">
- <iframe id="iframe"></iframe>
-</div>
-
-<pre id="test">
-<script class="testbody" type="application/javascript;version=1.8">
-
-/** Test for Login Manager: notifications. **/
-
-const { Services } = SpecialPowers.Cu.import("resource://gre/modules/Services.jsm");
-
-const BRAND_BUNDLE = "chrome://branding/locale/brand.properties";
-
-// Set testpath to the directory where we live. Used to load tests from
-// alternate Mochitest servers (different hostnames, same content).
-var testpath = document.location.pathname + "/../";
+const BRAND_BUNDLE = Services.strings.createBundle("chrome://branding/locale/brand.properties");
+const BRAND_SHORT_NAME = BRAND_BUNDLE.GetStringFromName("brandShortName");
-var subtests = [
- "subtst_notifications_1.html", // 1
- "subtst_notifications_1.html", // 2
- "subtst_notifications_1.html", // 3
- "subtst_notifications_1.html", // 4
- "subtst_notifications_1.html", // 5
- "subtst_notifications_1.html", // 6
- "subtst_notifications_1.html", // 7
- "subtst_notifications_1.html", // 8
- "subtst_notifications_2.html", // 9
- "subtst_notifications_3.html", // 10
- "subtst_notifications_4.html", // 11
- "subtst_notifications_5.html", // 12
- "subtst_notifications_1.html", // 13
- "subtst_notifications_6.html", // 14
- "subtst_notifications_1.html", // 15
- "subtst_notifications_6.html", // 16
- "subtst_notifications_8.html", // 17
- "subtst_notifications_8.html", // 18
- "subtst_notifications_9.html", // 19
- "subtst_notifications_10.html", // 20
- "http://test1.example.org:80" + testpath + "subtst_notifications_1.html", // 21
- "http://test1.example.org:80" + testpath + "subtst_notifications_7.html", // 22
- "http://test1.example.org:80" + testpath + "subtst_notifications_6.html", // 23
- "subtst_notifications_2pw_0un.html", // 24
- "subtst_notifications_2pw_0un.html", // 25
- "subtst_notifications_2pw_0un.html", // 26
- "subtst_notifications_2pw_0un.html", // 27
- "subtst_notifications_2pw_0un.html", // 28
- "http://example.org" + testpath + "subtst_notifications_2pw_1un_1text.html", // 29
- "http://example.org" + testpath + "subtst_notifications_2pw_1un_1text.html", // 30
- ];
+let nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",
+ Ci.nsILoginInfo, "init");
+let login1 = new nsLoginInfo("http://mochi.test:8888", "http://mochi.test:8888", null,
+ "notifyu1", "notifyp1", "user", "pass");
+let login2 = new nsLoginInfo("http://mochi.test:8888", "http://mochi.test:8888", null,
+ "", "notifyp1", "", "pass");
+let login1B = new nsLoginInfo("http://mochi.test:8888", "http://mochi.test:8888", null,
+ "notifyu1B", "notifyp1B", "user", "pass");
+let login2B = new nsLoginInfo("http://mochi.test:8888", "http://mochi.test:8888", null,
+ "", "notifyp1B", "", "pass");
-var ignoreLoad = false;
-function handleLoad(aEvent) {
- // ignore every other load event ... We get one for loading the subtest (which
- // we want to ignore), and another when the subtest's form submits itself
- // (which we want to handle, to start the next test).
- ignoreLoad = !ignoreLoad;
- if (ignoreLoad) {
- ok(true, "Ignoring load of subtest #" + testNum);
- return;
- }
- ok(true, "Processing submission of subtest #" + testNum);
+add_task(function* setup() {
+ // Load recipes for this test.
+ let recipeParent = yield LoginManagerParent.recipeParentPromise;
+ yield recipeParent.load({
+ siteRecipes: [{
+ hosts: ["example.org"],
+ usernameSelector: "#user",
+ passwordSelector: "#pass",
+ }],
+ });
+});
+
+add_task(function* test_remember_opens() {
+ yield testSubmittingLoginForm("subtst_notifications_1.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "got notification popup");
+ popup.remove();
+ });
+});
+
+add_task(function* test_clickNever() {
+ yield testSubmittingLoginForm("subtst_notifications_1.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "got notification popup");
+ is(true, Services.logins.getLoginSavingEnabled("http://mochi.test:8888"),
+ "Checking for login saving enabled");
+ clickPopupButton(popup, NEVER_BUTTON);
+ });
+
+ info("Make sure Never took effect");
+ yield testSubmittingLoginForm("subtst_notifications_1.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(!popup, "checking for no notification popup");
+ is(false, Services.logins.getLoginSavingEnabled("http://mochi.test:8888"),
+ "Checking for login saving disabled");
+ Services.logins.setLoginSavingEnabled("http://mochi.test:8888", true);
+ });
+});
+
+add_task(function* test_clickRemember() {
+ yield testSubmittingLoginForm("subtst_notifications_1.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "got notification popup");
+
+ is(Services.logins.getAllLogins().length, 0, "Should not have any logins yet");
+ clickPopupButton(popup, REMEMBER_BUTTON);
+ });
+
+ info("Make sure Remember took effect and we don't prompt for an existing login");
+ yield testSubmittingLoginForm("subtst_notifications_1.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(!popup, "checking for no notification popup");
+ });
+
+ checkOnlyLoginWasUsedTwice({ justChanged: false });
- checkTest();
+ // remove that login
+ Services.logins.removeLogin(login1);
+});
+
+/* signons.rememberSignons pref tests... */
+
+add_task(function* test_rememberSignonsFalse() {
+ info("Make sure we don't prompt with rememberSignons=false");
+ Services.prefs.setBoolPref("signon.rememberSignons", false);
- testNum++;
+ yield testSubmittingLoginForm("subtst_notifications_1.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(!popup, "checking for no notification popup");
+ });
+});
+
+add_task(function* test_rememberSignonsTrue() {
+ info("Make sure we prompt with rememberSignons=true");
+ Services.prefs.setBoolPref("signon.rememberSignons", true);
+
+ yield testSubmittingLoginForm("subtst_notifications_1.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "got notification popup");
+ popup.remove();
+ });
+});
+
+/* autocomplete=off tests... */
- if (testNum <= subtests.length) {
- ok(true, "Starting test #" + testNum);
- iframe.src = subtests[testNum-1];
- } else {
- ok(true, "notification tests finished.");
- SimpleTest.finish();
- }
-}
+add_task(function* test_autocompleteOffUsername() {
+ info("Check for notification popup when autocomplete=off present on username");
+
+ yield testSubmittingLoginForm("subtst_notifications_2.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "checking for notification popup");
+ popup.remove();
+ });
+});
+
+add_task(function* test_autocompleteOffPassword() {
+ info("Check for notification popup when autocomplete=off present on password");
+
+ yield testSubmittingLoginForm("subtst_notifications_3.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "checking for notification popup");
+ popup.remove();
+ });
+});
+
+add_task(function* test_autocompleteOffForm() {
+ info("Check for notification popup when autocomplete=off present on form");
+
+ yield testSubmittingLoginForm("subtst_notifications_4.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "checking for notification popup");
+ popup.remove();
+ });
+});
-// Remember, Never for This Site, Not Now
-function checkTest() {
- var popup, notificationText, expectedText;
-
- // The document generated from formsubmit.sjs contains the user/pass it
- // received inside <span id="blah">value</span>
- var gotUser = SpecialPowers.wrap(iframe).contentDocument.getElementById("user").textContent;
- var gotPass = SpecialPowers.wrap(iframe).contentDocument.getElementById("pass").textContent;
-
- let brandBundle = Services.strings.createBundle(BRAND_BUNDLE);
- let brandShortName = brandBundle.GetStringFromName("brandShortName");
-
- switch(testNum) {
-
- /* Basic Yes/No/Never tests... */
-
- case 1:
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
- popup.remove();
- break;
+add_task(function* test_noPasswordField() {
+ info("Check for no notification popup when no password field present");
- case 2:
- // Same subtest, this time click Never
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
- is(true, pwmgr.getLoginSavingEnabled("http://mochi.test:8888"),
- "Checking for login saving enabled");
- clickPopupButton(popup, kNeverButton);
- break;
-
- case 3:
- // Same subtest, make sure Never took effect
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(!popup, "checking for no notification popup");
- is(false, pwmgr.getLoginSavingEnabled("http://mochi.test:8888"),
- "Checking for login saving disabled");
- // reenable login saving.
- pwmgr.setLoginSavingEnabled("http://mochi.test:8888", true);
- break;
-
- case 4:
- // Same subtest, this time click Remember
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
+ yield testSubmittingLoginForm("subtst_notifications_5.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "null", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(!popup, "checking for no notification popup");
+ });
+});
- // Sanity check, no logins should exist yet.
- var logins = pwmgr.getAllLogins();
- is(logins.length, 0, "Should not have any logins yet");
-
- clickPopupButton(popup, kRememberButton);
- break;
-
- case 5:
- // Same subtest, make sure we didn't prompt for an existing login.
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(!popup, "checking for no notification popup");
-
- // Check to make sure we updated the timestamps and use count on the
- // existing login that was submitted for this form.
- var logins = pwmgr.getAllLogins();
- is(logins.length, 1, "Should only have 1 login");
- ok(SpecialPowers.call_Instanceof(logins[0], Ci.nsILoginMetaInfo), "metainfo QI");
- is(logins[0].timesUsed, 2, "check .timesUsed for existing login submission");
- ok(logins[0].timeLastUsed > logins[0].timeCreated, "timeLastUsed bumped");
- ok(logins[0].timeCreated == logins[0].timePasswordChanged, "timeChanged not updated");
-
- // remove that login
- pwmgr.removeLogin(login1);
- break;
-
- /* signons.rememberSignons pref tests... */
+add_task(function* test_pwOnlyLoginMatchesForm() {
+ info("Check for update popup when existing pw-only login matches form.");
+ Services.logins.addLogin(login2);
- case 6:
- // Same subtest, make sure we're getting the popup again.
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
- popup.remove();
- // Change prefs to no longer remember signons
- prefs.setBoolPref("rememberSignons", false);
- break;
+ yield testSubmittingLoginForm("subtst_notifications_1.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-change");
+ ok(popup, "checking for notification popup");
+ popup.remove();
+ });
- case 7:
- // Same subtest, make sure we're not prompting.
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(!popup, "checking for no notification popup");
- // Change prefs to remember signons again
- prefs.setBoolPref("rememberSignons", true);
- break;
-
- case 8:
- // Same subtest, make sure we're getting the popup again.
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
- popup.remove();
- break;
-
- /* autocomplete=off tests... */
+ Services.logins.removeLogin(login2);
+});
- case 9:
- // Check for notification popup when autocomplete=off present
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "checking for notification popup");
- popup.remove();
- break;
-
- case 10:
- // Check for notification popup when autocomplete=off present
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "checking for notification popup");
- popup.remove();
- break;
-
- case 11:
- // Check for notification popup when autocomplete=off present
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "checking for notification popup");
- popup.remove();
- break;
-
- /* no password field test... */
+add_task(function* test_pwOnlyFormMatchesLogin() {
+ info("Check for no notification popup when pw-only form matches existing login.");
+ Services.logins.addLogin(login1);
- case 12:
- // Check for no notification popup when no password field present
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "null", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(!popup, "checking for no notification popup");
-
- // Add login for the next test.
- pwmgr.addLogin(login2);
- break;
+ yield testSubmittingLoginForm("subtst_notifications_6.html", function*(fieldValues) {
+ is(fieldValues.username, "null", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(!popup, "checking for no notification popup");
+ });
- case 13:
- // Check for update popup when existing pw-only login matches form.
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-change");
- ok(popup, "checking for notification popup");
- popup.remove();
- pwmgr.removeLogin(login2);
-
- // Add login for the next test
- pwmgr.addLogin(login1);
- break;
-
- case 14:
- // Check for no notification popup when pw-only form matches existing login.
- is(gotUser, "null", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(!popup, "checking for no notification popup");
- pwmgr.removeLogin(login1);
+ Services.logins.removeLogin(login1);
+});
- // Add login for the next test
- pwmgr.addLogin(login2B);
- break;
-
- case 15:
- // Check for notification popup when existing pw-only login doesn't match form.
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
- pwmgr.removeLogin(login2B);
- popup.remove();
-
- // Add login for the next test
- pwmgr.addLogin(login1B);
- break;
-
- case 16:
- // Check for notification popup when pw-only form doesn't match existing login.
- is(gotUser, "null", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
- pwmgr.removeLogin(login1B);
- popup.remove();
-
- // Add login for the next tests
- pwmgr.addLogin(login1);
- break;
+add_task(function* test_pwOnlyFormDoesntMatchExisting() {
+ info("Check for notification popup when pw-only form doesn't match existing login.");
+ Services.logins.addLogin(login1B);
- case 17:
- // Check for change-password popup, u+p login on u+p form. (not changed)
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "pass2", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-change");
- ok(popup, "got notification popup");
- clickPopupButton(popup, kDontChangeButton);
- break;
-
- case 18:
- // Check for change-password popup, u+p login on u+p form.
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "pass2", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-change");
- ok(popup, "got notification popup");
- clickPopupButton(popup, kChangeButton);
+ yield testSubmittingLoginForm("subtst_notifications_6.html", function*(fieldValues) {
+ is(fieldValues.username, "null", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "got notification popup");
+ popup.remove();
+ });
- // Check to make sure we updated the timestamps and use count for
- // the login being changed with this form.
- var logins = pwmgr.getAllLogins();
- is(logins.length, 1, "Should only have 1 login");
- ok(SpecialPowers.call_Instanceof(logins[0], Ci.nsILoginMetaInfo), "metainfo QI");
- is(logins[0].timesUsed, 2, "check .timesUsed incremented on change");
- ok(logins[0].timeCreated < logins[0].timeLastUsed, "timeLastUsed bumped");
- ok(logins[0].timeLastUsed == logins[0].timePasswordChanged, "timeUsed == timeChanged");
+ Services.logins.removeLogin(login1B);
+});
- // cleanup
- login1.password = "pass2";
- pwmgr.removeLogin(login1);
- login1.password = "notifyp1";
-
- // Add login for the next test
- pwmgr.addLogin(login2);
- break;
-
- // ...can't change a u+p login on a p-only form...
+add_task(function* test_changeUPLoginOnUPForm_dont() {
+ info("Check for change-password popup, u+p login on u+p form. (not changed)");
+ Services.logins.addLogin(login1);
- case 19:
- // Check for change-password popup, p-only login on u+p form.
- // (needed a different subtest for this because the login created in
- // test_0init was interfering)
- is(gotUser, "", "Checking submitted username");
- is(gotPass, "pass2", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-change");
- ok(popup, "got notification popup");
- clickPopupButton(popup, kChangeButton);
- break;
-
- case 20:
- // Check for change-password popup, p-only login on p-only form.
- is(gotUser, "null", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-change");
- ok(popup, "got notification popup");
- clickPopupButton(popup, kChangeButton);
-
- pwmgr.removeLogin(login2);
- break;
+ yield testSubmittingLoginForm("subtst_notifications_8.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "pass2", "Checking submitted password");
+ let popup = getPopup("password-change");
+ ok(popup, "got notification popup");
+ clickPopupButton(popup, DONT_CHANGE_BUTTON);
+ });
- case 21:
- // Check text on a user+pass notification popup
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
- // Check the text, which comes from the localized saveLoginText string.
- notificationText = popup.message;
- expectedText = "Would you like " + brandShortName + " to remember this login?";
- is(expectedText, notificationText, "Checking text: " + notificationText);
- popup.remove();
- break;
-
- case 22:
- // Check text on a user+pass notification popup, username is really long
- is(gotUser, "nowisthetimeforallgoodmentocometotheaidoftheircountry", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
- // Check the text, which comes from the localized saveLoginText string.
- notificationText = popup.message;
- expectedText = "Would you like " + brandShortName + " to remember this login\?";
- is(expectedText, notificationText, "Checking text: " + notificationText);
- popup.remove();
- break;
-
- case 23:
- // Check text on a pass-only notification popup
- is(gotUser, "null", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
- // Check the text, which comes from the localized saveLoginTextNoUser string.
- notificationText = popup.message;
- expectedText = "Would you like " + brandShortName + " to remember this password\?";
- is(expectedText, notificationText, "Checking text: " + notificationText);
- popup.remove();
- break;
+ Services.logins.removeLogin(login1);
+});
- case 24:
- // Check for notification popup when a form with 2 password fields (no username) is
- // submitted and there are no saved logins.
- is(gotUser, "null", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
- popup.remove();
-
- // Add login for the next test
- pwmgr.addLogin(login1B);
- break;
-
- case 25:
- // Check for notification popup when a form with 2 password fields (no username) is
- // submitted and there is a saved login with a username and different password.
- is(gotUser, "null", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-change");
- ok(popup, "got notification popup");
- popup.remove();
- // remove that login
- pwmgr.removeLogin(login1B);
-
- // Add login for the next test
- pwmgr.addLogin(login2B);
- break;
+add_task(function* test_changeUPLoginOnUPForm_change() {
+ info("Check for change-password popup, u+p login on u+p form.");
+ Services.logins.addLogin(login1);
- case 26:
- // Check for notification popup when a form with 2 password fields (no username) is
- // submitted and there is a saved login with no username and a different password.
- is(gotUser, "null", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-change");
- ok(popup, "got notification popup");
- popup.remove();
- // remove that login
- pwmgr.removeLogin(login2B);
-
- // Add login for the next test
- pwmgr.addLogin(login1);
-
- break;
+ yield testSubmittingLoginForm("subtst_notifications_8.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "pass2", "Checking submitted password");
+ let popup = getPopup("password-change");
+ ok(popup, "got notification popup");
+ clickPopupButton(popup, CHANGE_BUTTON);
+ ok(!getPopup("password-change"), "popup should be gone");
+ });
- case 27:
- // Check for no notification popup when a form with 2 password fields (no username) is
- // submitted and there is a saved login with a username and the same password.
- is(gotUser, "null", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-change");
- ok(!popup, "checking for no notification popup");
-
- // Check to make sure we updated the timestamps and use count on the
- // existing login that was submitted for this form.
- var logins = pwmgr.getAllLogins();
- is(logins.length, 1, "Should only have 1 login");
- ok(SpecialPowers.call_Instanceof(logins[0], Ci.nsILoginMetaInfo), "metainfo QI");
- is(logins[0].timesUsed, 2, "check .timesUsed for existing login submission");
- ok(logins[0].timeLastUsed > logins[0].timeCreated, "timeLastUsed bumped");
- ok(logins[0].timeCreated == logins[0].timePasswordChanged, "timeChanged not updated");
+ checkOnlyLoginWasUsedTwice({ justChanged: true });
- // remove that login
- pwmgr.removeLogin(login1);
-
- // Add login for the next test
- pwmgr.addLogin(login2);
- break;
-
- case 28:
- // Check for no notification popup when a form with 2 password fields (no username) is
- // submitted and there is a saved login with no username and the same password.
- is(gotUser, "null", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-change");
- ok(!popup, "checking for no notification popup");
-
- // Check to make sure we updated the timestamps and use count on the
- // existing login that was submitted for this form.
- var logins = pwmgr.getAllLogins();
- is(logins.length, 1, "Should only have 1 login");
- ok(SpecialPowers.call_Instanceof(logins[0], Ci.nsILoginMetaInfo), "metainfo QI");
- is(logins[0].timesUsed, 2, "check .timesUsed for existing login submission");
- ok(logins[0].timeLastUsed > logins[0].timeCreated, "timeLastUsed bumped");
- ok(logins[0].timeCreated == logins[0].timePasswordChanged, "timeChanged not updated");
-
- // remove that login
- pwmgr.removeLogin(login2);
- break;
+ // cleanup
+ login1.password = "pass2";
+ Services.logins.removeLogin(login1);
+ login1.password = "notifyp1";
+});
- case 29: {
- // Check that we capture the proper fields when a field recipe is in use.
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(popup, "got notification popup");
-
- // Sanity check, no logins should exist yet.
- let logins = pwmgr.getAllLogins();
- is(logins.length, 0, "Should not have any logins yet");
-
- clickPopupButton(popup, kRememberButton);
- break;
- }
-
- case 30: {
- // Same subtest, make sure we didn't prompt for an existing login.
- is(gotUser, "notifyu1", "Checking submitted username");
- is(gotPass, "notifyp1", "Checking submitted password");
- popup = getPopup(popupNotifications, "password-save");
- ok(!popup, "checking for no notification popup");
-
- // Check to make sure we updated the timestamps and use count on the
- // existing login that was submitted for this form.
- let logins = pwmgr.getAllLogins();
- is(logins.length, 1, "Should only have 1 login");
- ok(SpecialPowers.call_Instanceof(logins[0], Ci.nsILoginMetaInfo), "metainfo QI");
- is(logins[0].username, "notifyu1", "check .username for existing login submission");
- is(logins[0].password, "notifyp1", "check .password for existing login submission");
- is(logins[0].timesUsed, 2, "check .timesUsed for existing login submission");
- ok(logins[0].timeLastUsed > logins[0].timeCreated, "timeLastUsed bumped");
- ok(logins[0].timeCreated == logins[0].timePasswordChanged, "timeChanged not updated");
+add_task(function* test_changePLoginOnUPForm() {
+ info("Check for change-password popup, p-only login on u+p form.");
+ Services.logins.addLogin(login2);
- // remove the added login
- pwmgr.removeAllLogins();
- break;
- }
-
- default:
- ok(false, "Unexpected call to checkTest for test #" + testNum);
-
- }
-
- // TODO:
- // * existing login test, form has different password --> change password, no save prompt
-}
-
-const Ci = SpecialPowers.Ci;
-const Cc = SpecialPowers.Cc;
-ok(Ci != null, "Access Ci");
-ok(Cc != null, "Access Cc");
-
-var pwmgr = Cc["@mozilla.org/login-manager;1"].
- getService(Ci.nsILoginManager);
-ok(pwmgr != null, "Access pwmgr");
-
-pwmgr.removeAllLogins();
-
-var prefs = Cc["@mozilla.org/preferences-service;1"].
- getService(Ci.nsIPrefService);
-ok(prefs != null, "Access prefs");
-prefs = prefs.getBranch("signon.");
-ok(prefs != null, "Access pref branch");
+ yield testSubmittingLoginForm("subtst_notifications_9.html", function*(fieldValues) {
+ is(fieldValues.username, "", "Checking submitted username");
+ is(fieldValues.password, "pass2", "Checking submitted password");
+ let popup = getPopup("password-change");
+ ok(popup, "got notification popup");
+ clickPopupButton(popup, CHANGE_BUTTON);
+ ok(!getPopup("password-change"), "popup should be gone");
+ });
+});
-var nsLoginInfo = new SpecialPowers.wrap(SpecialPowers.Components).Constructor("@mozilla.org/login-manager/loginInfo;1",
- Ci.nsILoginInfo, "init");
-var login1 = new nsLoginInfo("http://mochi.test:8888", "http://mochi.test:8888", null,
- "notifyu1", "notifyp1", "user", "pass");
-var login2 = new nsLoginInfo("http://mochi.test:8888", "http://mochi.test:8888", null,
- "", "notifyp1", "", "pass");
-var login1B = new nsLoginInfo("http://mochi.test:8888", "http://mochi.test:8888", null,
- "notifyu1B", "notifyp1B", "user", "pass");
-var login2B = new nsLoginInfo("http://mochi.test:8888", "http://mochi.test:8888", null,
- "", "notifyp1B", "", "pass");
-
-var parentScriptURL = SimpleTest.getTestFileURL("pwmgr_common.js");
-var mm = SpecialPowers.loadChromeScript(parentScriptURL);
+add_task(function* test_changePLoginOnPForm() {
+ info("Check for change-password popup, p-only login on p-only form.");
-var iframe = document.getElementById("iframe");
-iframe.onload = handleLoad;
-
-// popupNotifications (not *popup*) is a constant, per-tab container. So, we
-// only need to fetch it once.
-var popupNotifications = getPopupNotifications(window.top);
-ok(popupNotifications, "Got popupNotifications");
-
-var testNum = 1;
-
-// Load recipes for this test.
-mm.sendAsyncMessage("loadRecipes", {
- siteRecipes: [{
- hosts: ["example.org"],
- usernameSelector: "#user",
- passwordSelector: "#pass",
- }],
+ yield testSubmittingLoginForm("subtst_notifications_10.html", function*(fieldValues) {
+ is(fieldValues.username, "null", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-change");
+ ok(popup, "got notification popup");
+ clickPopupButton(popup, CHANGE_BUTTON);
+ ok(!getPopup("password-change"), "popup should be gone");
+ });
+ Services.logins.removeLogin(login2);
});
-mm.addMessageListener("loadedRecipes", function loadedRecipes() {
- ok(true, "Starting test #" + testNum);
- iframe.src = subtests[testNum-1];
-})
+add_task(function* test_checkUPSaveText() {
+ info("Check text on a user+pass notification popup");
+
+ yield testSubmittingLoginForm("subtst_notifications_1.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "got notification popup");
+ // Check the text, which comes from the localized saveLoginText string.
+ let notificationText = popup.message;
+ let expectedText = "Would you like " + BRAND_SHORT_NAME + " to remember this login?";
+ is(expectedText, notificationText, "Checking text: " + notificationText);
+ popup.remove();
+ });
+});
+
+add_task(function* test_checkPSaveText() {
+ info("Check text on a pass-only notification popup");
+
+ yield testSubmittingLoginForm("subtst_notifications_6.html", function*(fieldValues) {
+ is(fieldValues.username, "null", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "got notification popup");
+ // Check the text, which comes from the localized saveLoginTextNoUser string.
+ let notificationText = popup.message;
+ let expectedText = "Would you like " + BRAND_SHORT_NAME + " to remember this password?";
+ is(expectedText, notificationText, "Checking text: " + notificationText);
+ popup.remove();
+ });
+});
+
+add_task(function* test_capture2pw0un() {
+ info("Check for notification popup when a form with 2 password fields (no username) " +
+ "is submitted and there are no saved logins.");
+
+ yield testSubmittingLoginForm("subtst_notifications_2pw_0un.html", function*(fieldValues) {
+ is(fieldValues.username, "null", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "got notification popup");
+ popup.remove();
+ });
+});
+
+add_task(function* test_change2pw0unExistingDifferentUP() {
+ info("Check for notification popup when a form with 2 password fields (no username) " +
+ "is submitted and there is a saved login with a username and different password.");
+
+ Services.logins.addLogin(login1B);
+
+ yield testSubmittingLoginForm("subtst_notifications_2pw_0un.html", function*(fieldValues) {
+ is(fieldValues.username, "null", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-change");
+ ok(popup, "got notification popup");
+ popup.remove();
+ });
+
+ Services.logins.removeLogin(login1B);
+});
+
+add_task(function* test_change2pw0unExistingDifferentP() {
+ info("Check for notification popup when a form with 2 password fields (no username) " +
+ "is submitted and there is a saved login with no username and different password.");
+
+ Services.logins.addLogin(login2B);
-SimpleTest.waitForExplicitFinish();
-</script>
-</pre>
-</body>
-</html>
+ yield testSubmittingLoginForm("subtst_notifications_2pw_0un.html", function*(fieldValues) {
+ is(fieldValues.username, "null", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-change");
+ ok(popup, "got notification popup");
+ popup.remove();
+ });
+
+ Services.logins.removeLogin(login2B);
+});
+
+add_task(function* test_change2pw0unExistingWithSameP() {
+ info("Check for no notification popup when a form with 2 password fields (no username) " +
+ "is submitted and there is a saved login with a username and the same password.");
+
+ Services.logins.addLogin(login2);
+
+ yield testSubmittingLoginForm("subtst_notifications_2pw_0un.html", function*(fieldValues) {
+ is(fieldValues.username, "null", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-change");
+ ok(!popup, "checking for no notification popup");
+ });
+
+ checkOnlyLoginWasUsedTwice({ justChanged: false });
+
+ Services.logins.removeLogin(login2);
+});
+
+add_task(function* test_recipeCaptureFields_NewLogin() {
+ info("Check that we capture the proper fields when a field recipe is in use.");
+
+ yield testSubmittingLoginForm("subtst_notifications_2pw_1un_1text.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(popup, "got notification popup");
+
+ // Sanity check, no logins should exist yet.
+ let logins = Services.logins.getAllLogins();
+ is(logins.length, 0, "Should not have any logins yet");
+
+ clickPopupButton(popup, REMEMBER_BUTTON);
+ }, "http://example.org"); // The recipe is for example.org
+});
+
+add_task(function* test_recipeCaptureFields_ExistingLogin() {
+ info("Check that we capture the proper fields when a field recipe is in use " +
+ "and there is a matching login");
+
+ yield testSubmittingLoginForm("subtst_notifications_2pw_1un_1text.html", function*(fieldValues) {
+ is(fieldValues.username, "notifyu1", "Checking submitted username");
+ is(fieldValues.password, "notifyp1", "Checking submitted password");
+ let popup = getPopup("password-save");
+ ok(!popup, "checking for no notification popup");
+ }, "http://example.org");
+
+ checkOnlyLoginWasUsedTwice({ justChanged: false });
+ let logins = Services.logins.getAllLogins();
+ is(logins[0].username, "notifyu1", "check .username for existing login submission");
+ is(logins[0].password, "notifyp1", "check .password for existing login submission");
+
+ Services.logins.removeAllLogins();
+});
+
+// TODO:
+// * existing login test, form has different password --> change password, no save prompt