summaryrefslogtreecommitdiffstats
path: root/toolkit/components/passwordmgr/test/browser/browser_username_select_dialog.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/passwordmgr/test/browser/browser_username_select_dialog.js')
-rw-r--r--toolkit/components/passwordmgr/test/browser/browser_username_select_dialog.js177
1 files changed, 177 insertions, 0 deletions
diff --git a/toolkit/components/passwordmgr/test/browser/browser_username_select_dialog.js b/toolkit/components/passwordmgr/test/browser/browser_username_select_dialog.js
new file mode 100644
index 0000000000..03ac74e9ef
--- /dev/null
+++ b/toolkit/components/passwordmgr/test/browser/browser_username_select_dialog.js
@@ -0,0 +1,177 @@
+/*
+ * Test username selection dialog, on password update from a p-only form,
+ * when there are multiple saved logins on the domain.
+ */
+
+// Copied from prompt_common.js. TODO: share the code.
+function getSelectDialogDoc() {
+ // Trudge through all the open windows, until we find the one
+ // that has selectDialog.xhtml loaded.
+ // var enumerator = Services.wm.getEnumerator("navigator:browser");
+ for (let { docShell } of Services.wm.getEnumerator(null)) {
+ var containedDocShells = docShell.getAllDocShellsInSubtree(
+ docShell.typeChrome,
+ docShell.ENUMERATE_FORWARDS
+ );
+ for (let childDocShell of containedDocShells) {
+ // We don't want it if it's not done loading.
+ if (childDocShell.busyFlags != Ci.nsIDocShell.BUSY_FLAGS_NONE) {
+ continue;
+ }
+ var childDoc = childDocShell.contentViewer.DOMDocument;
+
+ if (
+ childDoc.location.href == "chrome://global/content/selectDialog.xhtml"
+ ) {
+ return childDoc;
+ }
+ }
+ }
+
+ return null;
+}
+
+let nsLoginInfo = new Components.Constructor(
+ "@mozilla.org/login-manager/loginInfo;1",
+ Ci.nsILoginInfo,
+ "init"
+);
+let login1 = new nsLoginInfo(
+ "https://example.com",
+ "https://example.com",
+ null,
+ "notifyu1",
+ "notifyp1",
+ "user",
+ "pass"
+);
+let login1B = new nsLoginInfo(
+ "https://example.com",
+ "https://example.com",
+ null,
+ "notifyu1B",
+ "notifyp1B",
+ "user",
+ "pass"
+);
+
+add_task(async function test_changeUPLoginOnPUpdateForm_accept() {
+ info(
+ "Select an u+p login from multiple logins, on password update form, and accept."
+ );
+ await Services.logins.addLogins([login1, login1B]);
+
+ let selectDialogPromise = TestUtils.topicObserved("select-dialog-loaded");
+
+ await testSubmittingLoginForm(
+ "subtst_notifications_change_p.html",
+ async function (fieldValues) {
+ Assert.equal(fieldValues.username, "null", "Checking submitted username");
+ Assert.equal(
+ fieldValues.password,
+ "pass2",
+ "Checking submitted password"
+ );
+
+ info("Waiting for select dialog to appear.");
+ let doc = (await selectDialogPromise)[0].document;
+ let dialog = doc.getElementsByTagName("dialog")[0];
+ let listbox = doc.getElementById("list");
+
+ Assert.equal(listbox.selectedIndex, 0, "Checking selected index");
+ Assert.equal(listbox.itemCount, 2, "Checking selected length");
+ ["notifyu1", "notifyu1B"].forEach((username, i) => {
+ Assert.equal(
+ listbox.getItemAtIndex(i).label,
+ username,
+ "Check username selection on dialog"
+ );
+ });
+
+ dialog.acceptDialog();
+
+ await TestUtils.waitForCondition(() => {
+ return !getSelectDialogDoc();
+ }, "Wait for selection dialog to disappear.");
+ }
+ );
+
+ let logins = Services.logins.getAllLogins();
+ Assert.equal(logins.length, 2, "Should have 2 logins");
+
+ let login = SpecialPowers.wrap(logins[0]).QueryInterface(Ci.nsILoginMetaInfo);
+ Assert.equal(login.username, "notifyu1", "Check the username unchanged");
+ Assert.equal(login.password, "pass2", "Check the password changed");
+ Assert.equal(login.timesUsed, 2, "Check times used");
+
+ login = SpecialPowers.wrap(logins[1]).QueryInterface(Ci.nsILoginMetaInfo);
+ Assert.equal(login.username, "notifyu1B", "Check the username unchanged");
+ Assert.equal(login.password, "notifyp1B", "Check the password unchanged");
+ Assert.equal(login.timesUsed, 1, "Check times used");
+
+ // cleanup
+ login1.password = "pass2";
+ Services.logins.removeLogin(login1);
+ login1.password = "notifyp1";
+
+ Services.logins.removeLogin(login1B);
+});
+
+add_task(async function test_changeUPLoginOnPUpdateForm_cancel() {
+ info(
+ "Select an u+p login from multiple logins, on password update form, and cancel."
+ );
+ await Services.logins.addLogins([login1, login1B]);
+
+ let selectDialogPromise = TestUtils.topicObserved("select-dialog-loaded");
+
+ await testSubmittingLoginForm(
+ "subtst_notifications_change_p.html",
+ async function (fieldValues) {
+ Assert.equal(fieldValues.username, "null", "Checking submitted username");
+ Assert.equal(
+ fieldValues.password,
+ "pass2",
+ "Checking submitted password"
+ );
+
+ info("Waiting for select dialog to appear.");
+ let doc = (await selectDialogPromise)[0].document;
+ let dialog = doc.getElementsByTagName("dialog")[0];
+ let listbox = doc.getElementById("list");
+
+ Assert.equal(listbox.selectedIndex, 0, "Checking selected index");
+ Assert.equal(listbox.itemCount, 2, "Checking selected length");
+ ["notifyu1", "notifyu1B"].forEach((username, i) => {
+ Assert.equal(
+ listbox.getItemAtIndex(i).label,
+ username,
+ "Check username selection on dialog"
+ );
+ });
+
+ dialog.cancelDialog();
+
+ await TestUtils.waitForCondition(() => {
+ return !getSelectDialogDoc();
+ }, "Wait for selection dialog to disappear.");
+ }
+ );
+
+ let logins = Services.logins.getAllLogins();
+ Assert.equal(logins.length, 2, "Should have 2 logins");
+
+ let login = SpecialPowers.wrap(logins[0]).QueryInterface(Ci.nsILoginMetaInfo);
+ Assert.equal(login.username, "notifyu1", "Check the username unchanged");
+ Assert.equal(login.password, "notifyp1", "Check the password unchanged");
+ Assert.equal(login.timesUsed, 1, "Check times used");
+
+ login = SpecialPowers.wrap(logins[1]).QueryInterface(Ci.nsILoginMetaInfo);
+ Assert.equal(login.username, "notifyu1B", "Check the username unchanged");
+ Assert.equal(login.password, "notifyp1B", "Check the password unchanged");
+ Assert.equal(login.timesUsed, 1, "Check times used");
+
+ // cleanup
+ Services.logins.removeLogin(login1);
+ Services.logins.removeLogin(login1B);
+});