diff options
-rw-r--r-- | chrome/browser/password_manager/password_form_manager.cc | 36 | ||||
-rw-r--r-- | chrome/browser/password_manager/password_form_manager.h | 10 |
2 files changed, 31 insertions, 15 deletions
diff --git a/chrome/browser/password_manager/password_form_manager.cc b/chrome/browser/password_manager/password_form_manager.cc index eb26ce8..1464214 100644 --- a/chrome/browser/password_manager/password_form_manager.cc +++ b/chrome/browser/password_manager/password_form_manager.cc @@ -120,7 +120,7 @@ void PasswordFormManager::PermanentlyBlacklist() { } // Save the pending_credentials_ entry marked as blacklisted. - SaveAsNewLogin(); + SaveAsNewLogin(false); } bool PasswordFormManager::IsNewLogin() { @@ -161,7 +161,7 @@ void PasswordFormManager::Save() { DCHECK(!profile_->IsOffTheRecord()); if (IsNewLogin()) - SaveAsNewLogin(); + SaveAsNewLogin(true); else UpdateLogin(); } @@ -293,7 +293,7 @@ bool PasswordFormManager::IgnoreResult(const PasswordForm& form) const { return false; } -void PasswordFormManager::SaveAsNewLogin() { +void PasswordFormManager::SaveAsNewLogin(bool reset_preferred_login) { DCHECK_EQ(state_, POST_MATCHING_PHASE); DCHECK(IsNewLogin()); // The new_form is being used to sign in, so it is preferred. @@ -312,6 +312,24 @@ void PasswordFormManager::SaveAsNewLogin() { pending_credentials_.date_created = Time::Now(); password_store->AddLogin(pending_credentials_); + + if (reset_preferred_login) { + UpdatePreferredLoginState(password_store); + } +} + +void PasswordFormManager::UpdatePreferredLoginState( + PasswordStore* password_store) { + DCHECK(password_store); + PasswordFormMap::iterator iter; + for (iter = best_matches_.begin(); iter != best_matches_.end(); iter++) { + if (iter->second->username_value != pending_credentials_.username_value && + iter->second->preferred) { + // This wasn't the selected login but it used to be preferred. + iter->second->preferred = false; + password_store->UpdateLogin(*iter->second); + } + } } void PasswordFormManager::UpdateLogin() { @@ -330,16 +348,8 @@ void PasswordFormManager::UpdateLogin() { return; } - // Update all matches to reflect new preferred status. - PasswordFormMap::iterator iter; - for (iter = best_matches_.begin(); iter != best_matches_.end(); iter++) { - if ((iter->second->username_value != pending_credentials_.username_value) && - iter->second->preferred) { - // This wasn't the selected login but it used to be preferred. - iter->second->preferred = false; - password_store->UpdateLogin(*iter->second); - } - } + UpdatePreferredLoginState(password_store); + // Update the new preferred login. // Note origin.spec().length > signon_realm.length implies the origin has a // path, since signon_realm is a prefix of origin for HTML password forms. diff --git a/chrome/browser/password_manager/password_form_manager.h b/chrome/browser/password_manager/password_form_manager.h index fe6ceee..5fe7d26 100644 --- a/chrome/browser/password_manager/password_form_manager.h +++ b/chrome/browser/password_manager/password_form_manager.h @@ -92,8 +92,9 @@ class PasswordFormManager : public PasswordStoreConsumer { // Helper for Save in the case that best_matches.size() == 0, meaning // we have no prior record of this form/username/password and the user - // has opted to 'Save Password'. - void SaveAsNewLogin(); + // has opted to 'Save Password'. If |reset_preferred_login| is set, + // the previously preferred login from |best_matches_| will be reset. + void SaveAsNewLogin(bool reset_preferred_login); // Helper for OnWebDataServiceRequestDone to score an individual result // against the observed_form_. @@ -106,6 +107,11 @@ class PasswordFormManager : public PasswordStoreConsumer { // is now implicitly 'preferred'. void UpdateLogin(); + // Update all login matches to reflect new preferred state - preferred flag + // will be reset on all matched logins that different than the current + // |pending_credentials_|. + void UpdatePreferredLoginState(PasswordStore* password_store); + // Set of PasswordForms from the DB that best match the form // being managed by this. Use a map instead of vector, because we most // frequently require lookups by username value in IsNewLogin. |