diff options
Diffstat (limited to 'toolkit/components/passwordmgr/test/chrome')
8 files changed, 590 insertions, 0 deletions
diff --git a/toolkit/components/passwordmgr/test/chrome/chrome.ini b/toolkit/components/passwordmgr/test/chrome/chrome.ini new file mode 100644 index 000000000..093b87b7d --- /dev/null +++ b/toolkit/components/passwordmgr/test/chrome/chrome.ini @@ -0,0 +1,13 @@ +[DEFAULT] +skip-if = os == 'android' + +[test_privbrowsing_perwindowpb.html] +skip-if = true # Bug 1173337 +support-files = + ../formsubmit.sjs + notification_common.js + privbrowsing_perwindowpb_iframe.html + subtst_privbrowsing_1.html + subtst_privbrowsing_2.html + subtst_privbrowsing_3.html + subtst_privbrowsing_4.html diff --git a/toolkit/components/passwordmgr/test/chrome/notification_common.js b/toolkit/components/passwordmgr/test/chrome/notification_common.js new file mode 100644 index 000000000..e8a52929d --- /dev/null +++ b/toolkit/components/passwordmgr/test/chrome/notification_common.js @@ -0,0 +1,111 @@ +/* + * Initialization: for each test, remove any prior notifications. + */ +function cleanUpPopupNotifications() { + var container = getPopupNotifications(window.top); + var notes = container._currentNotifications; + info(true, "Removing " + notes.length + " popup notifications."); + for (var i = notes.length - 1; i >= 0; i--) { + notes[i].remove(); + } +} +cleanUpPopupNotifications(); + +/* + * getPopupNotifications + * + * Fetches the popup notification for the specified window. + */ +function getPopupNotifications(aWindow) { + var Ci = SpecialPowers.Ci; + var Cc = SpecialPowers.Cc; + ok(Ci != null, "Access Ci"); + ok(Cc != null, "Access Cc"); + + var chromeWin = SpecialPowers.wrap(aWindow) + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShell) + .chromeEventHandler.ownerDocument.defaultView; + + var popupNotifications = chromeWin.PopupNotifications; + return popupNotifications; +} + + +/** + * Checks if we have a password popup notification + * of the right type and with the right label. + * + * @deprecated Write a browser-chrome test instead and use the fork of this method there. + * @returns the found password popup notification. + */ +function getPopup(aPopupNote, aKind) { + ok(true, "Looking for " + aKind + " popup notification"); + var notification = aPopupNote.getNotification("password"); + if (notification) { + is(notification.options.passwordNotificationType, aKind, "Notification type matches."); + if (aKind == "password-change") { + is(notification.mainAction.label, "Update", "Main action label matches update doorhanger."); + } else if (aKind == "password-save") { + is(notification.mainAction.label, "Remember", "Main action label matches save doorhanger."); + } + } + return notification; +} + + +/** + * @deprecated - Use a browser chrome test instead. + * + * Clicks the specified popup notification button. + */ +function clickPopupButton(aPopup, aButtonIndex) { + ok(true, "Looking for action at index " + aButtonIndex); + + var notifications = SpecialPowers.wrap(aPopup.owner).panel.childNodes; + ok(notifications.length > 0, "at least one notification displayed"); + ok(true, notifications.length + " notifications"); + var notification = notifications[0]; + + if (aButtonIndex == 0) { + ok(true, "Triggering main action"); + notification.button.doCommand(); + } else if (aButtonIndex <= aPopup.secondaryActions.length) { + var index = aButtonIndex; + ok(true, "Triggering secondary action " + index); + notification.childNodes[index].doCommand(); + } +} + +const kRememberButton = 0; +const kNeverButton = 1; + +const kChangeButton = 0; +const kDontChangeButton = 1; + +function dumpNotifications() { + try { + // PopupNotifications + var container = getPopupNotifications(window.top); + ok(true, "is popup panel open? " + container.isPanelOpen); + var notes = container._currentNotifications; + ok(true, "Found " + notes.length + " popup notifications."); + for (let i = 0; i < notes.length; i++) { + ok(true, "#" + i + ": " + notes[i].id); + } + + // Notification bars + var chromeWin = SpecialPowers.wrap(window.top) + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShell) + .chromeEventHandler.ownerDocument.defaultView; + var nb = chromeWin.getNotificationBox(window.top); + notes = nb.allNotifications; + ok(true, "Found " + notes.length + " notification bars."); + for (let i = 0; i < notes.length; i++) { + ok(true, "#" + i + ": " + notes[i].getAttribute("value")); + } + } catch (e) { todo(false, "WOAH! " + e); } +} diff --git a/toolkit/components/passwordmgr/test/chrome/privbrowsing_perwindowpb_iframe.html b/toolkit/components/passwordmgr/test/chrome/privbrowsing_perwindowpb_iframe.html new file mode 100644 index 000000000..2efdab265 --- /dev/null +++ b/toolkit/components/passwordmgr/test/chrome/privbrowsing_perwindowpb_iframe.html @@ -0,0 +1,9 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="utf-8"> +</head> +<body> +<iframe id="iframe"></iframe> +</body> +</html> diff --git a/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_1.html b/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_1.html new file mode 100644 index 000000000..8c7202dd0 --- /dev/null +++ b/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_1.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Subtest for Login Manager notifications (private browsing)</title> +</head> +<body> +<h2>Subtest 1</h2> +<!-- + Make sure that the password-save notification appears outside of + the private mode, but not inside it. +--> +<form id="form" action="formsubmit.sjs"> + <input id="user" name="user" type="text"> + <input id="pass" name="pass" type="password"> + <button type='submit'>Submit</button> +</form> + +<script> +function submitForm() { + userField.value = "notifyu1"; + passField.value = "notifyp1"; + form.submit(); +} + +window.onload = submitForm; +var form = document.getElementById("form"); +var userField = document.getElementById("user"); +var passField = document.getElementById("pass"); + +</script> +</body> +</html> diff --git a/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_2.html b/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_2.html new file mode 100644 index 000000000..bf3b85159 --- /dev/null +++ b/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_2.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Subtest for Login Manager notifications (private browsing)</title> +</head> +<body> +<h2>Subtest 2</h2> +<!-- + Make sure that the password-change notification appears outside of + the private mode, but not inside it. +--> +<form id="form" action="formsubmit.sjs"> + <input id="pass" name="pass" type="password"> + <input id="newpass" name="newpass" type="password"> + <button type='submit'>Submit</button> +</form> + +<script> +function submitForm() { + passField.value = "notifyp1"; + passField2.value = "notifyp2"; + form.submit(); +} + +window.onload = submitForm; +var form = document.getElementById("form"); +var passField = document.getElementById("pass"); +var passField2 = document.getElementById("newpass"); + +</script> +</body> +</html> diff --git a/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_3.html b/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_3.html new file mode 100644 index 000000000..e88a302e0 --- /dev/null +++ b/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_3.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Subtest for Login Manager notifications (private browsing)</title> +</head> +<body> +<h2>Subtest 3</h2> +<!-- + Make sure that the user/pass fields are auto-filled outside of + the private mode, but not inside it. +--> +<form id="form" action="formsubmit.sjs"> + <input id="user" name="user" type="text"> + <input id="pass" name="pass" type="password"> + <button type='submit'>Submit</button> +</form> + +<script> +function submitForm() { + form.submit(); +} + +var form = document.getElementById("form"); +window.addEventListener('message', () => { submitForm(); }); + +</script> +</body> +</html> diff --git a/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_4.html b/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_4.html new file mode 100644 index 000000000..184142743 --- /dev/null +++ b/toolkit/components/passwordmgr/test/chrome/subtst_privbrowsing_4.html @@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Subtest for Login Manager notifications (private browsing)</title> + <script type="text/javascript" src="pwmgr_common.js"></script> +</head> +<body> +<h2>Subtest 4</h2> +<!-- + Make sure that the user/pass fields have manual filling enabled + in private mode. +--> +<form id="form" action="formsubmit.sjs"> + <input id="user" name="user" type="text"> + <input id="pass" name="pass" type="password"> + <button type='submit'>Submit</button> +</form> + +<script> +function startAutocomplete() { + userField.focus(); + doKey("down"); + setTimeout(submitForm, 100); +} + +function submitForm() { + doKey("down"); + doKey("return"); + setTimeout(function() { form.submit(); }, 100); +} + +var form = document.getElementById("form"); +var userField = document.getElementById("user"); + +window.addEventListener('message', () => { startAutocomplete(); }); + +</script> +</body> +</html> diff --git a/toolkit/components/passwordmgr/test/chrome/test_privbrowsing_perwindowpb.html b/toolkit/components/passwordmgr/test/chrome/test_privbrowsing_perwindowpb.html new file mode 100644 index 000000000..6b7d4abb3 --- /dev/null +++ b/toolkit/components/passwordmgr/test/chrome/test_privbrowsing_perwindowpb.html @@ -0,0 +1,322 @@ +<!DOCTYPE HTML> +<html> +<!-- +https://bugzilla.mozilla.org/show_bug.cgi?id=248970 +--> +<head> + <meta charset="utf-8"> + <title>Test for Private Browsing</title> + <script type="application/javascript" + src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> + <script type="text/javascript" src="notification_common.js"></script> + <link rel="stylesheet" type="text/css" + href="chrome://mochikit/content/tests/SimpleTest/test.css"> +</head> +<body> +<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=248970">Mozilla Bug 248970</a> +<p id="display"></p> +<pre id="test"> +<script class="testbody" type="text/javascript"> + +/** Test for Bug 248970 **/ +// based on test_notifications.html + +const Ci = SpecialPowers.Ci; +const Cc = SpecialPowers.Cc; +const Cr = SpecialPowers.Cr; + +Components.utils.import("resource://gre/modules/Services.jsm"); + +var testpath = "/chrome/toolkit/components/passwordmgr/test/chrome/"; +var prefix = "http://test2.example.com" + testpath; +var subtests = [ + "subtst_privbrowsing_1.html", // 1 + "subtst_privbrowsing_1.html", // 2 + "subtst_privbrowsing_1.html", // 3 + "subtst_privbrowsing_2.html", // 4 + "subtst_privbrowsing_2.html", // 5 + "subtst_privbrowsing_2.html", // 6 + "subtst_privbrowsing_3.html", // 7 + "subtst_privbrowsing_3.html", // 8 + "subtst_privbrowsing_4.html", // 9 + "subtst_privbrowsing_3.html" // 10 + ]; +var observer; + +var testNum = 0; +function loadNextTest() { + // run the initialization code for each test + switch (++ testNum) { + case 1: + popupNotifications = normalWindowPopupNotifications; + iframe = normalWindowIframe; + break; + + case 2: + popupNotifications = privateWindowPopupNotifications; + iframe = privateWindowIframe; + break; + + case 3: + popupNotifications = normalWindowPopupNotifications; + iframe = normalWindowIframe; + break; + + case 4: + pwmgr.addLogin(login); + break; + + case 5: + popupNotifications = privateWindowPopupNotifications; + iframe = privateWindowIframe; + break; + + case 6: + popupNotifications = normalWindowPopupNotifications; + iframe = normalWindowIframe; + break; + + case 7: + pwmgr.addLogin(login); + break; + + case 8: + popupNotifications = privateWindowPopupNotifications; + iframe = privateWindowIframe; + break; + + case 9: + break; + + case 10: + popupNotifications = normalWindowPopupNotifications; + iframe = normalWindowIframe; + break; + + default: + ok(false, "Unexpected call to loadNextTest for test #" + testNum); + } + + if (testNum === 7) { + observer = SpecialPowers.wrapCallback(function(subject, topic, data) { + SimpleTest.executeSoon(() => { iframe.contentWindow.postMessage("go", "*"); }); + }); + SpecialPowers.addObserver(observer, "passwordmgr-processed-form", false); + } + + ok(true, "Starting test #" + testNum); + iframe.src = prefix + subtests[testNum - 1]; +} + +function checkTest() { + var popup; + var gotUser; + var gotPass; + + switch (testNum) { + case 1: + // run outside of private mode, popup notification should appear + popup = getPopup(popupNotifications, "password-save"); + ok(popup, "got popup notification"); + popup.remove(); + break; + + case 2: + // run inside of private mode, popup notification should not appear + popup = getPopup(popupNotifications, "password-save"); + ok(!popup, "checking for no popup notification"); + break; + + case 3: + // run outside of private mode, popup notification should appear + popup = getPopup(popupNotifications, "password-save"); + ok(popup, "got popup notification"); + popup.remove(); + break; + + case 4: + // run outside of private mode, popup notification should appear + popup = getPopup(popupNotifications, "password-change"); + ok(popup, "got popup notification"); + popup.remove(); + break; + + case 5: + // run inside of private mode, popup notification should not appear + popup = getPopup(popupNotifications, "password-change"); + ok(!popup, "checking for no popup notification"); + break; + + case 6: + // run outside of private mode, popup notification should appear + popup = getPopup(popupNotifications, "password-change"); + ok(popup, "got popup notification"); + popup.remove(); + pwmgr.removeLogin(login); + break; + + case 7: + // verify that the user/pass pair was autofilled + gotUser = iframe.contentDocument.getElementById("user").textContent; + gotPass = iframe.contentDocument.getElementById("pass").textContent; + is(gotUser, "notifyu1", "Checking submitted username"); + is(gotPass, "notifyp1", "Checking submitted password"); + break; + + case 8: + // verify that the user/pass pair was not autofilled + gotUser = iframe.contentDocument.getElementById("user").textContent; + gotPass = iframe.contentDocument.getElementById("pass").textContent; + is(gotUser, "", "Checking submitted username"); + is(gotPass, "", "Checking submitted password"); + break; + + case 9: + // verify that the user/pass pair was available for autocomplete + gotUser = iframe.contentDocument.getElementById("user").textContent; + gotPass = iframe.contentDocument.getElementById("pass").textContent; + is(gotUser, "notifyu1", "Checking submitted username"); + is(gotPass, "notifyp1", "Checking submitted password"); + break; + + case 10: + // verify that the user/pass pair was autofilled + gotUser = iframe.contentDocument.getElementById("user").textContent; + gotPass = iframe.contentDocument.getElementById("pass").textContent; + is(gotUser, "notifyu1", "Checking submitted username"); + is(gotPass, "notifyp1", "Checking submitted password"); + pwmgr.removeLogin(login); + break; + + default: + ok(false, "Unexpected call to checkTest for test #" + testNum); + + } +} + +var mainWindow = window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShellTreeItem) + .rootTreeItem + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindow); +var contentPage = "http://mochi.test:8888/chrome/toolkit/components/passwordmgr/test/chrome/privbrowsing_perwindowpb_iframe.html"; +var testWindows = []; + +function whenDelayedStartupFinished(aWindow, aCallback) { + Services.obs.addObserver(function obs(aSubject, aTopic) { + if (aWindow == aSubject) { + Services.obs.removeObserver(obs, aTopic); + setTimeout(aCallback, 0); + } + }, "browser-delayed-startup-finished", false); +} + +function testOnWindow(aIsPrivate, aCallback) { + var win = mainWindow.OpenBrowserWindow({private: aIsPrivate}); + win.addEventListener("load", function onLoad() { + win.removeEventListener("load", onLoad, false); + whenDelayedStartupFinished(win, function() { + win.addEventListener("DOMContentLoaded", function onInnerLoad() { + if (win.content.location.href != contentPage) { + win.gBrowser.loadURI(contentPage); + return; + } + win.removeEventListener("DOMContentLoaded", onInnerLoad, true); + + win.content.addEventListener('load', function innerLoad2() { + win.content.removeEventListener('load', innerLoad2, false); + testWindows.push(win); + SimpleTest.executeSoon(function() { aCallback(win); }); + }, false, true); + }, true); + SimpleTest.executeSoon(function() { win.gBrowser.loadURI(contentPage); }); + }); + }, true); +} + +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); + + checkTest(); + + if (testNum < subtests.length) { + loadNextTest(); + } else { + ok(true, "private browsing notification tests finished."); + + testWindows.forEach(function(aWin) { + aWin.close(); + }); + + SpecialPowers.removeObserver(observer, "passwordmgr-processed-form"); + SimpleTest.finish(); + } +} + +var pwmgr = Cc["@mozilla.org/login-manager;1"]. + getService(Ci.nsILoginManager); +ok(pwmgr != null, "Access pwmgr"); + +// We need to make sure no logins have been stored by previous tests +// for forms in |url|, otherwise the change password notification +// would turn into a prompt, and the test will fail. +var url = "http://test2.example.com"; +is(pwmgr.countLogins(url, "", null), 0, "No logins should be stored for " + url); + +var nsLoginInfo = new SpecialPowers.wrap(SpecialPowers.Components).Constructor("@mozilla.org/login-manager/loginInfo;1", + Ci.nsILoginInfo, "init"); +var login = new nsLoginInfo(url, url, null, "notifyu1", "notifyp1", "user", "pass"); + +var normalWindow; +var privateWindow; + +var iframe; +var normalWindowIframe; +var privateWindowIframe; + +var popupNotifications; +var normalWindowPopupNotifications; +var privateWindowPopupNotifications; + +testOnWindow(false, function(aWin) { + var selectedBrowser = aWin.gBrowser.selectedBrowser; + normalWindowIframe = selectedBrowser.contentDocument.getElementById("iframe"); + normalWindowIframe.onload = handleLoad; + selectedBrowser.focus(); + + normalWindowPopupNotifications = getPopupNotifications(selectedBrowser.contentWindow.top); + ok(normalWindowPopupNotifications, "Got popupNotifications in normal window"); + // ignore the first load for this window; + ignoreLoad = false; + + testOnWindow(true, function(aPrivateWin) { + selectedBrowser = aPrivateWin.gBrowser.selectedBrowser; + privateWindowIframe = selectedBrowser.contentDocument.getElementById("iframe"); + privateWindowIframe.onload = handleLoad; + selectedBrowser.focus(); + + privateWindowPopupNotifications = getPopupNotifications(selectedBrowser.contentWindow.top); + ok(privateWindowPopupNotifications, "Got popupNotifications in private window"); + // ignore the first load for this window; + ignoreLoad = false; + + SimpleTest.executeSoon(loadNextTest); + }); +}); + +SimpleTest.waitForExplicitFinish(); +</script> +</pre> +</body> +</html> + |