| 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
|
|
|