Bug 1294194 - WIP: Don't prompt to re-save cross-origin logins that the user filled
MozReview-Commit-ID: 6yzQtlas7pF
--- a/toolkit/components/passwordmgr/LoginManagerContent.jsm
+++ b/toolkit/components/passwordmgr/LoginManagerContent.jsm
@@ -884,23 +884,27 @@ var LoginManagerContent = {
let mockOldPassword = oldPasswordField ?
{ name: oldPasswordField.name,
value: oldPasswordField.value } :
null;
// Make sure to pass the opener's top in case it was in a frame.
let openerTopWindow = win.opener ? win.opener.top : null;
- messageManager.sendAsyncMessage("RemoteLogins:onFormSubmit",
- { hostname,
- formSubmitURL,
- usernameField: mockUsername,
- newPasswordField: mockPassword,
- oldPasswordField: mockOldPassword },
- { openerTopWindow });
+ messageManager.sendAsyncMessage("RemoteLogins:onFormSubmit", {
+ hostname,
+ formSubmitURL,
+ usernameField: mockUsername,
+ newPasswordField: mockPassword,
+ oldPasswordField: mockOldPassword,
+ autoFilledLogin,
+ },
+ {
+ openerTopWindow,
+ });
},
/**
* Attempt to find the username and password fields in a form, and fill them
* in using the provided logins and recipes.
*
* @param {FormLike} form
* @param {bool} autofillForm denotes if we should fill the form in automatically
--- a/toolkit/components/passwordmgr/LoginManagerParent.jsm
+++ b/toolkit/components/passwordmgr/LoginManagerParent.jsm
@@ -75,16 +75,17 @@ var LoginManagerParent = {
case "RemoteLogins:onFormSubmit": {
// TODO Verify msg.target's principals against the formOrigin?
this.onFormSubmit(data.hostname,
data.formSubmitURL,
data.usernameField,
data.newPasswordField,
data.oldPasswordField,
+ data.autoFilledLogin,
msg.objects.openerTopWindow,
msg.target);
break;
}
case "RemoteLogins:insecureLoginFormPresent": {
this.setHasInsecureLoginForms(msg.target, data.hasInsecureLoginForms);
break;
@@ -272,19 +273,19 @@ var LoginManagerParent = {
var jsLogins = LoginHelper.loginsToVanillaObjects(matchingLogins);
target.messageManager.sendAsyncMessage("RemoteLogins:loginsAutoCompleted", {
requestId,
logins: jsLogins,
});
},
onFormSubmit(hostname, formSubmitURL,
- usernameField, newPasswordField,
- oldPasswordField, openerTopWindow,
- target) {
+ usernameField, newPasswordField,
+ oldPasswordField, autoFilledLogin,
+ openerTopWindow, target) {
function getPrompter() {
var prompterSvc = Cc["@mozilla.org/login-manager/prompter;1"].
createInstance(Ci.nsILoginManagerPrompter);
prompterSvc.init(target.ownerGlobal);
prompterSvc.browser = target;
prompterSvc.opener = openerTopWindow;
return prompterSvc;
}
@@ -306,16 +307,29 @@ var LoginManagerParent = {
var formLogin = Cc["@mozilla.org/login-manager/loginInfo;1"].
createInstance(Ci.nsILoginInfo);
formLogin.init(hostname, formSubmitURL, null,
(usernameField ? usernameField.value : ""),
newPasswordField.value,
(usernameField ? usernameField.name : ""),
newPasswordField.name);
+ if (autoFilledLogin) {
+ let loginsForGuid = LoginHelper.searchLoginsWithObject({
+ guid: autoFilledLogin.guid,
+ });
+ if (loginsForGuid.length == 1 &&
+ loginsForGuid[0].password == formLogin.password &&
+ loginsForGuid[0].username == formLogin.username) {
+ log("The filled login matches the form submission. Nothing to change.");
+ recordLoginUse(loginsForGuid[0]);
+ return;
+ }
+ }
+
let logins = LoginHelper.searchLoginsWithObject({
formSubmitURL,
hostname,
schemeUpgrades: LoginHelper.schemeUpgrades,
});
// Dedupe so the length checks below still make sense with scheme upgrades.
// Below here we have one login per hostPort + action + username with the