| Index: components/password_manager/core/browser/password_manager.cc
|
| diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc
|
| index fb8178bc02c49ada89127b90f3aa58ee54d92117..1e7ac9dab35dec9de67cda451f5ccdde0ce1ff7a 100644
|
| --- a/components/password_manager/core/browser/password_manager.cc
|
| +++ b/components/password_manager/core/browser/password_manager.cc
|
| @@ -167,6 +167,14 @@ void PasswordManager::SetHasGeneratedPasswordForForm(
|
| bool password_is_generated) {
|
| DCHECK(client_->IsSavingEnabledForCurrentPage());
|
|
|
| + if (!password_is_generated) {
|
| + // Since this password was provisionally saved it was removed from
|
| + // |pending_login_managers_| and needs to be re-added.
|
| + provisional_save_manager_->set_has_generated_password(false);
|
| + pending_login_managers_.push_back(provisional_save_manager_.Pass());
|
| + return;
|
| + }
|
| +
|
| ScopedVector<PasswordFormManager>::iterator matched_manager_it =
|
| pending_login_managers_.end();
|
| PasswordFormManager::MatchResultMask current_match_result =
|
| @@ -201,15 +209,15 @@ void PasswordManager::SetHasGeneratedPasswordForForm(
|
| }
|
|
|
| if (matched_manager_it != pending_login_managers_.end()) {
|
| - (*matched_manager_it)->set_has_generated_password(password_is_generated);
|
| + (*matched_manager_it)->set_has_generated_password(true);
|
| +
|
| + // Provisionally save generated passwords now, as they should always be
|
| + // saved.
|
| + ProvisionallySavePassword(form);
|
| return;
|
| }
|
|
|
| - UMA_HISTOGRAM_BOOLEAN("PasswordManager.GeneratedFormHasNoFormManager",
|
| - password_is_generated);
|
| -
|
| - if (!password_is_generated)
|
| - return;
|
| + UMA_HISTOGRAM_BOOLEAN("PasswordManager.GeneratedFormHasNoFormManager", true);
|
|
|
| // If there is no corresponding PasswordFormManager, we create one. This is
|
| // not the common case, and should only happen when there is a bug in our
|
| @@ -219,6 +227,7 @@ void PasswordManager::SetHasGeneratedPasswordForForm(
|
| this, client_, driver->AsWeakPtr(), form, ssl_valid);
|
| pending_login_managers_.push_back(manager);
|
| manager->set_has_generated_password(true);
|
| + ProvisionallySavePassword(form);
|
| }
|
|
|
| void PasswordManager::ProvisionallySavePassword(const PasswordForm& form) {
|
| @@ -602,6 +611,10 @@ void PasswordManager::OnPasswordFormsRendered(
|
| if (did_stop_loading) {
|
| if (provisional_save_manager_->pending_credentials().scheme ==
|
| PasswordForm::SCHEME_HTML) {
|
| + // Generated passwords should always be saved.
|
| + if (provisional_save_manager_->has_generated_password())
|
| + all_visible_forms_.clear();
|
| +
|
| for (size_t i = 0; i < all_visible_forms_.size(); ++i) {
|
| // TODO(vabr): The similarity check is just action equality up to
|
| // HTTP<->HTTPS substitution for now. If it becomes more complex, it may
|
|
|