Bug 1294194 - WIP: Don't prompt to re-save cross-origin logins that the user filled draft
authorMatthew Noorenberghe <mozilla@noorenberghe.ca>
Tue, 31 Jan 2017 23:34:14 -0800
changeset 468923 e0248f76876180248c9378beadab7b42ae2989f2
parent 468922 4bbaf3af0336c4d9a3d073b212703bbf07205ab2
child 544057 8195d8d34d886fe8199cad18f18643ee2d692f9d
push id43579
push usermozilla@noorenberghe.ca
push dateWed, 01 Feb 2017 07:38:38 +0000
bugs1294194
milestone54.0a1
Bug 1294194 - WIP: Don't prompt to re-save cross-origin logins that the user filled MozReview-Commit-ID: 6yzQtlas7pF
toolkit/components/passwordmgr/LoginManagerContent.jsm
toolkit/components/passwordmgr/LoginManagerParent.jsm
--- 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