Index: components/password_manager/core/browser/password_form_manager.cc |
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc |
index 765afaa33f9c1e1718fa3264bbbfbd948fdd5cf9..dd9faa94bbfee8c1515fe22ca5a48c179ad3bb94 100644 |
--- a/components/password_manager/core/browser/password_form_manager.cc |
+++ b/components/password_manager/core/browser/password_form_manager.cc |
@@ -634,7 +634,10 @@ void PasswordFormManager::SaveAsNewLogin() { |
pending_credentials_.date_created = Time::Now(); |
SanitizePossibleUsernames(&pending_credentials_); |
- password_store->AddLogin(pending_credentials_); |
+ if (presaved_form_) |
+ ReplacePresavedPasswordWithPendingCredentials(password_store); |
+ else |
+ password_store->AddLogin(pending_credentials_); |
UpdatePreferredLoginState(password_store); |
} |
@@ -704,7 +707,9 @@ void PasswordFormManager::UpdateLogin() { |
bool password_was_updated = false; |
// Update the new preferred login. |
- if (!selected_username_.empty()) { |
+ if (presaved_form_) { |
+ ReplacePresavedPasswordWithPendingCredentials(password_store); |
+ } else if (!selected_username_.empty()) { |
// Username has changed. We set this selected username as the real |
// username. Given that |username_value| is part of the Sync and |
// PasswordStore primary key, the old primary key must be supplied. |
@@ -1388,4 +1393,40 @@ void PasswordFormManager::WipeStoreCopyIfOutdated() { |
} |
} |
+void PasswordFormManager::PresaveGeneratedPassword( |
+ const autofill::PasswordForm& form) { |
+ PasswordStore* store = client_->GetPasswordStore(); |
+ if (!store) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ if (presaved_form_) |
+ store->UpdateLoginWithPrimaryKey(form, *presaved_form_); |
+ else |
+ store->AddLogin(form); |
+ presaved_form_.reset(new autofill::PasswordForm(form)); |
+} |
+ |
+void PasswordFormManager::RemovePresavedPassword() { |
+ if (!presaved_form_) |
+ return; |
+ |
+ PasswordStore* store = client_->GetPasswordStore(); |
+ if (!store) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ store->RemoveLogin(*presaved_form_); |
+ presaved_form_.reset(); |
+} |
+ |
+void PasswordFormManager::ReplacePresavedPasswordWithPendingCredentials( |
+ PasswordStore* store) { |
+ DCHECK(store); |
+ DCHECK(presaved_form_); |
+ |
+ store->UpdateLoginWithPrimaryKey(pending_credentials_, *presaved_form_); |
+ presaved_form_.reset(); |
+} |
+ |
} // namespace password_manager |