Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/*
* Test capture popup notifications in content opened by window.open
*/
let nsLoginInfo = new Components.Constructor(
"@mozilla.org/login-manager/loginInfo;1",
Ci.nsILoginInfo,
"init"
);
let login1 = new nsLoginInfo(
null,
"notifyu1",
"notifyp1",
"user",
"pass"
);
let login2 = new nsLoginInfo(
null,
"notifyu2",
"notifyp2",
"user",
"pass"
);
function withTestTabUntilStorageChange(aPageFile, aTaskFn) {
function storageChangedObserved(_subject, data) {
// Watch for actions triggered from a doorhanger (not cleanup tasks with removeLogin)
if (data == "removeLogin") {
return false;
}
return true;
}
let storageChangedPromised = TestUtils.topicObserved(
"passwordmgr-storage-changed",
storageChangedObserved
);
return BrowserTestUtils.withNewTab(
{
gBrowser,
url: "http://mochi.test:8888" + DIRECTORY_PATH + aPageFile,
},
async function (_browser) {
Assert.ok(true, "loaded " + aPageFile);
info("running test case task");
await aTaskFn();
info("waiting for storage change");
await storageChangedPromised;
}
);
}
add_setup(async function () {
await SimpleTest.promiseFocus(window);
});
add_task(async function test_saveChromeHiddenAutoClose() {
let notifShownPromise = BrowserTestUtils.waitForEvent(
PopupNotifications.panel,
"popupshown"
);
// query arguments are: username, password, features, auto-close (delimited by '|')
let url =
"subtst_notifications_11.html?notifyu1|notifyp1|" +
"menubar=no,toolbar=no,location=no|autoclose";
await withTestTabUntilStorageChange(url, async function () {
info("waiting for popupshown");
await notifShownPromise;
// the popup closes and the doorhanger should appear in the opener
let popup = await getCaptureDoorhangerThatMayOpen("password-save");
Assert.ok(popup, "got notification popup");
await checkDoorhangerUsernamePassword("notifyu1", "notifyp1");
// Sanity check, no logins should exist yet.
let logins = await Services.logins.getAllLogins();
Assert.equal(logins.length, 0, "Should not have any logins yet");
clickDoorhangerButton(popup, REMEMBER_BUTTON);
});
// Check result of clicking Remember
let logins = await Services.logins.getAllLogins();
Assert.equal(logins.length, 1, "Should only have 1 login");
let login = logins[0].QueryInterface(Ci.nsILoginMetaInfo);
Assert.equal(login.timesUsed, 1, "Check times used on new entry");
Assert.equal(
login.username,
"notifyu1",
"Check the username used on the new entry"
);
Assert.equal(
login.password,
"notifyp1",
"Check the password used on the new entry"
);
});
add_task(async function test_changeChromeHiddenAutoClose() {
let notifShownPromise = BrowserTestUtils.waitForEvent(
PopupNotifications.panel,
"popupshown"
);
let url =
"subtst_notifications_11.html?notifyu1|pass2|menubar=no,toolbar=no,location=no|autoclose";
await withTestTabUntilStorageChange(url, async function () {
info("waiting for popupshown");
await notifShownPromise;
let popup = await getCaptureDoorhangerThatMayOpen("password-change");
Assert.ok(popup, "got notification popup");
await checkDoorhangerUsernamePassword("notifyu1", "pass2");
clickDoorhangerButton(popup, CHANGE_BUTTON);
});
// Check to make sure we updated the password, timestamps and use count for
// the login being changed with this form.
let logins = await Services.logins.getAllLogins();
Assert.equal(logins.length, 1, "Should only have 1 login");
let login = logins[0].QueryInterface(Ci.nsILoginMetaInfo);
Assert.equal(login.username, "notifyu1", "Check the username");
Assert.equal(login.password, "pass2", "Check password changed");
Assert.equal(login.timesUsed, 2, "check .timesUsed incremented on change");
Assert.ok(login.timeCreated < login.timeLastUsed, "timeLastUsed bumped");
Assert.ok(
login.timeLastUsed == login.timePasswordChanged,
"timeUsed == timeChanged"
);
login1.password = "pass2";
Services.logins.removeLogin(login1);
login1.password = "notifyp1";
});
add_task(async function test_saveChromeVisibleSameWindow() {
// This test actually opens a new tab in the same window with default browser settings.
let url = "subtst_notifications_11.html?notifyu2|notifyp2||";
let notifShownPromise = BrowserTestUtils.waitForEvent(
PopupNotifications.panel,
"popupshown"
);
await withTestTabUntilStorageChange(url, async function () {
await notifShownPromise;
let popup = await getCaptureDoorhangerThatMayOpen("password-save");
Assert.ok(popup, "got notification popup");
await checkDoorhangerUsernamePassword("notifyu2", "notifyp2");
clickDoorhangerButton(popup, REMEMBER_BUTTON);
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
// Check result of clicking Remember
let logins = await Services.logins.getAllLogins();
Assert.equal(logins.length, 1, "Should only have 1 login now");
let login = logins[0].QueryInterface(Ci.nsILoginMetaInfo);
Assert.equal(
login.username,
"notifyu2",
"Check the username used on the new entry"
);
Assert.equal(
login.password,
"notifyp2",
"Check the password used on the new entry"
);
Assert.equal(login.timesUsed, 1, "Check times used on new entry");
});
add_task(async function test_changeChromeVisibleSameWindow() {
let url = "subtst_notifications_11.html?notifyu2|pass2||";
let notifShownPromise = BrowserTestUtils.waitForEvent(
PopupNotifications.panel,
"popupshown"
);
await withTestTabUntilStorageChange(url, async function () {
await notifShownPromise;
let popup = await getCaptureDoorhangerThatMayOpen("password-change");
Assert.ok(popup, "got notification popup");
await checkDoorhangerUsernamePassword("notifyu2", "pass2");
clickDoorhangerButton(popup, CHANGE_BUTTON);
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
// Check to make sure we updated the password, timestamps and use count for
// the login being changed with this form.
let logins = await Services.logins.getAllLogins();
Assert.equal(logins.length, 1, "Should have 1 login");
let login = logins[0].QueryInterface(Ci.nsILoginMetaInfo);
Assert.equal(login.username, "notifyu2", "Check the username");
Assert.equal(login.password, "pass2", "Check password changed");
Assert.equal(login.timesUsed, 2, "check .timesUsed incremented on change");
Assert.ok(login.timeCreated < login.timeLastUsed, "timeLastUsed bumped");
Assert.ok(
login.timeLastUsed == login.timePasswordChanged,
"timeUsed == timeChanged"
);
// cleanup
login2.password = "pass2";
Services.logins.removeLogin(login2);
login2.password = "notifyp2";
});