summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortim@chromium.org <tim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-25 05:47:19 +0000
committertim@chromium.org <tim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-25 05:47:19 +0000
commit06d282476c058600baa9e8b6b7e61546ce32e6f0 (patch)
treeff5b83a03a5313374ccb158c7f7b4365afc06cab
parent568d05fc2a803feff55660a9b2afa2dc1f068932 (diff)
downloadchromium_src-06d282476c058600baa9e8b6b7e61546ce32e6f0.zip
chromium_src-06d282476c058600baa9e8b6b7e61546ce32e6f0.tar.gz
chromium_src-06d282476c058600baa9e8b6b7e61546ce32e6f0.tar.bz2
Fixed handling of preferred login info in password manager.
BUG=23850 TEST=Go to a login page (i.e. gmail), log in with several different user accounts. Observe that the last used account is now the one that is used for the initial page autofill. Patch by zelidrag@chromium.org Original Review: http://codereview.chromium.org/437032 Review URL: http://codereview.chromium.org/434070 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33051 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/password_manager/password_form_manager.cc36
-rw-r--r--chrome/browser/password_manager/password_form_manager.h10
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.