Skip to content

Instantly share code, notes, and snippets.

@nt1m
Created July 19, 2019 21:57
Show Gist options
  • Save nt1m/b88aba96c07a6e9bc578088f535aff57 to your computer and use it in GitHub Desktop.
Save nt1m/b88aba96c07a6e9bc578088f535aff57 to your computer and use it in GitHub Desktop.
# HG changeset patch
# User Tim Nguyen <ntim.bugs@gmail.com>
# Date 1563309579 25200
# Tue Jul 16 13:39:39 2019 -0700
# Node ID df4fffd32c55182601b078c5fd672d2964523a14
# Parent ca1dbd076e1e47a8616ab6ee3e6fd4083d576857
Bug 1566533 - Disable generated passwords feature on private windows.
Differential Revision: https://phabricator.services.mozilla.com/D38235
diff --git a/browser/base/content/nsContextMenu.js b/browser/base/content/nsContextMenu.js
--- a/browser/base/content/nsContextMenu.js
+++ b/browser/base/content/nsContextMenu.js
@@ -1035,6 +1035,12 @@ nsContextMenu.prototype = {
this.showItem("fill-login-generated-password", canFillGeneratedPassword);
this.showItem("generated-password-separator", canFillGeneratedPassword);
+ this.setItemAttr(
+ "fill-login-generated-password",
+ "disabled",
+ PrivateBrowsingUtils.isWindowPrivate(window)
+ );
+
if (!fragment) {
return;
}
diff --git a/toolkit/components/passwordmgr/LoginManagerParent.jsm b/toolkit/components/passwordmgr/LoginManagerParent.jsm
--- a/toolkit/components/passwordmgr/LoginManagerParent.jsm
+++ b/toolkit/components/passwordmgr/LoginManagerParent.jsm
@@ -410,7 +410,8 @@ this.LoginManagerParent = {
if (
isPasswordField &&
autocompleteInfo.fieldName == "new-password" &&
- Services.logins.getLoginSavingEnabled(formOrigin)
+ Services.logins.getLoginSavingEnabled(formOrigin) &&
+ !PrivateBrowsingUtils.isWindowPrivate(target.ownerGlobal)
) {
generatedPassword = this.getGeneratedPassword(browsingContextId);
}
diff --git a/toolkit/components/passwordmgr/test/LoginTestUtils.jsm b/toolkit/components/passwordmgr/test/LoginTestUtils.jsm
--- a/toolkit/components/passwordmgr/test/LoginTestUtils.jsm
+++ b/toolkit/components/passwordmgr/test/LoginTestUtils.jsm
@@ -43,6 +43,29 @@ this.LoginTestUtils = {
},
/**
+ * Add a new login to the store
+ */
+ async addLogin({
+ username,
+ password,
+ origin = "https://example.com",
+ }) {
+ const login = LoginTestUtils.testData.formLogin({
+ origin,
+ formActionOrigin: origin,
+ username,
+ password,
+ });
+ let storageChangedPromised = TestUtils.topicObserved(
+ "passwordmgr-storage-changed",
+ (_, data) => data == "addLogin"
+ );
+ Services.logins.addLogin(login);
+ await storageChangedPromised;
+ return login;
+ },
+
+ /**
* Checks that the currently stored list of nsILoginInfo matches the provided
* array. The comparison uses the "equals" method of nsILoginInfo, that does
* not include nsILoginMetaInfo properties in the test.
diff --git a/toolkit/components/passwordmgr/test/browser/browser.ini b/toolkit/components/passwordmgr/test/browser/browser.ini
--- a/toolkit/components/passwordmgr/test/browser/browser.ini
+++ b/toolkit/components/passwordmgr/test/browser/browser.ini
@@ -64,6 +64,7 @@ support-files =
[browser_generated_password_doorhangers.js]
support-files =
form_password_change.html
+[browser_generated_password_private_window.js]
[browser_hasInsecureLoginForms.js]
skip-if = fission || verify
[browser_hasInsecureLoginForms_streamConverter.js]
diff --git a/toolkit/components/passwordmgr/test/browser/browser_generated_password_doorhangers.js b/toolkit/components/passwordmgr/test/browser/browser_generated_password_doorhangers.js
--- a/toolkit/components/passwordmgr/test/browser/browser_generated_password_doorhangers.js
+++ b/toolkit/components/passwordmgr/test/browser/browser_generated_password_doorhangers.js
@@ -13,45 +13,9 @@ const FORM_PAGE_PATH =
const passwordInputSelector = "#form-basic-password";
const usernameInputSelector = "#form-basic-username";
-async function addLogin({ username, password }) {
- const login = LoginTestUtils.testData.formLogin({
- origin: "https://example.com",
- formActionOrigin: "https://example.com",
- username,
- password,
- });
- let storageChangedPromised = TestUtils.topicObserved(
- "passwordmgr-storage-changed",
- (_, data) => data == "addLogin"
- );
- Services.logins.addLogin(login);
- await storageChangedPromised;
- return login;
-}
-
let login1;
function addOneLogin() {
- login1 = addLogin({ username: "username", password: "pass1" });
-}
-
-function openACPopup(popup, browser, inputSelector) {
- return new Promise(async resolve => {
- let promiseShown = BrowserTestUtils.waitForEvent(popup, "popupshown");
-
- await SimpleTest.promiseFocus(browser);
- info("content window focused");
-
- // Focus the username field to open the popup.
- await ContentTask.spawn(browser, [inputSelector], function openAutocomplete(
- sel
- ) {
- content.document.querySelector(sel).focus();
- });
-
- let shown = await promiseShown;
- ok(shown, "autocomplete popup shown");
- resolve(shown);
- });
+ login1 = LoginTestUtils.addLogin({ username: "username", password: "pass1" });
}
async function fillGeneratedPasswordFromACPopup(
@@ -395,7 +359,7 @@ add_task(async function password_change_
async function(browser) {
await SimpleTest.promiseFocus(browser.ownerGlobal);
// Save 2nd login different from the 1st one
- addLogin({
+ LoginTestUtils.addLogin({
username: "username2",
password: "pass2",
});
diff --git a/toolkit/components/passwordmgr/test/browser/browser_generated_password_private_window.js b/toolkit/components/passwordmgr/test/browser/browser_generated_password_private_window.js
new file mode 100644
--- /dev/null
+++ b/toolkit/components/passwordmgr/test/browser/browser_generated_password_private_window.js
@@ -0,0 +1,52 @@
+// The origin for the test URIs.
+const TEST_ORIGIN = "https://example.com";
+const FORM_PAGE_PATH =
+ "/browser/toolkit/components/passwordmgr/test/browser/form_basic.html";
+const passwordInputSelector = "#form-basic-password";
+
+add_task(async function test_autocomplete_popup_item_hidden() {
+ await LoginTestUtils.addLogin({ username: "username", password: "pass1" });
+ const win = await BrowserTestUtils.openNewBrowserWindow({ private: true });
+ const doc = win.document;
+ await BrowserTestUtils.withNewTab(
+ {
+ gBrowser: win.gBrowser,
+ url: TEST_ORIGIN + FORM_PAGE_PATH,
+ },
+ async function(browser) {
+ await SimpleTest.promiseFocus(browser.ownerGlobal);
+ let popup = doc.getElementById("PopupAutoComplete");
+ ok(popup, "Got popup");
+ await openACPopup(popup, browser, passwordInputSelector);
+
+ let item = popup.querySelector(`[originaltype="generatedPassword"]`);
+ ok(!item, "Should not get 'Generate password' richlistitem");
+ }
+ );
+ await BrowserTestUtils.closeWindow(win);
+});
+
+add_task(async function test_autocomplete_menu_item_disabled() {
+ const win = await BrowserTestUtils.openNewBrowserWindow({ private: true });
+ const doc = win.document;
+ await BrowserTestUtils.withNewTab(
+ {
+ gBrowser: win.gBrowser,
+ url: TEST_ORIGIN + FORM_PAGE_PATH,
+ },
+ async function(browser) {
+ await SimpleTest.promiseFocus(browser);
+ await openPasswordContextMenu(browser, passwordInputSelector);
+ let generatedPasswordItem = doc.getElementById(
+ "fill-login-generated-password"
+ );
+ is(
+ generatedPasswordItem.getAttribute("disabled"),
+ "true",
+ "Generate password context menu item should be disabled in PB mode"
+ );
+ document.getElementById("contentAreaContextMenu").hidePopup();
+ }
+ );
+ await BrowserTestUtils.closeWindow(win);
+});
diff --git a/toolkit/components/passwordmgr/test/browser/head.js b/toolkit/components/passwordmgr/test/browser/head.js
--- a/toolkit/components/passwordmgr/test/browser/head.js
+++ b/toolkit/components/passwordmgr/test/browser/head.js
@@ -216,6 +216,28 @@ async function waitForPasswordManagerDia
return win;
}
+// Autocomplete popup related functions //
+
+function openACPopup(popup, browser, inputSelector) {
+ return new Promise(async resolve => {
+ let promiseShown = BrowserTestUtils.waitForEvent(popup, "popupshown");
+
+ await SimpleTest.promiseFocus(browser);
+ info("content window focused");
+
+ // Focus the username field to open the popup.
+ await ContentTask.spawn(browser, [inputSelector], function openAutocomplete(
+ sel
+ ) {
+ content.document.querySelector(sel).focus();
+ });
+
+ let shown = await promiseShown;
+ ok(shown, "autocomplete popup shown");
+ resolve(shown);
+ });
+}
+
// Contextmenu functions //
/**
@@ -229,9 +251,10 @@ async function openPasswordContextMenu(
passwordInput,
assertCallback = null
) {
- const CONTEXT_MENU = document.getElementById("contentAreaContextMenu");
- const POPUP_HEADER = document.getElementById("fill-login");
- const LOGIN_POPUP = document.getElementById("fill-login-popup");
+ const doc = browser.ownerDocument;
+ const CONTEXT_MENU = doc.getElementById("contentAreaContextMenu");
+ const POPUP_HEADER = doc.getElementById("fill-login");
+ const LOGIN_POPUP = doc.getElementById("fill-login-popup");
let contextMenuShownPromise = BrowserTestUtils.waitForEvent(
CONTEXT_MENU,
@@ -268,7 +291,7 @@ async function openPasswordContextMenu(
let popupShownPromise = BrowserTestUtils.waitForCondition(
() => POPUP_HEADER.open && BrowserTestUtils.is_visible(LOGIN_POPUP)
);
- EventUtils.synthesizeMouseAtCenter(POPUP_HEADER, {});
+ EventUtils.synthesizeMouseAtCenter(POPUP_HEADER, {}, browser.ownerGlobal);
await popupShownPromise;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment