Created
July 19, 2019 21:57
-
-
Save nt1m/b88aba96c07a6e9bc578088f535aff57 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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