| 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 704634c0584e1a0d3a5606f94311d1f6b1e1732d..339c2cb111f5e3bc3d2efebe786362f63b54f81a 100644
|
| --- a/components/password_manager/core/browser/password_manager.cc
|
| +++ b/components/password_manager/core/browser/password_manager.cc
|
| @@ -137,6 +137,16 @@ bool AreAllFieldsEmpty(const PasswordForm& form) {
|
| form.new_password_value.empty();
|
| }
|
|
|
| +// Helper function that determines whether update or save prompt should be
|
| +// shown for credentials in |provisional_save_manager|.
|
| +bool IsPasswordUpdate(const PasswordFormManager& provisional_save_manager) {
|
| + return (!provisional_save_manager.best_matches().empty() &&
|
| + provisional_save_manager
|
| + .is_possible_change_password_form_without_username()) ||
|
| + provisional_save_manager.password_overridden() ||
|
| + provisional_save_manager.retry_password_form_password_update();
|
| +}
|
| +
|
| // Finds the matched form manager for |form| in |pending_login_managers|.
|
| PasswordFormManager* FindMatchedManager(
|
| const autofill::PasswordForm& form,
|
| @@ -467,6 +477,37 @@ void PasswordManager::OnPasswordFormForceSaveRequested(
|
| OnLoginSuccessful();
|
| }
|
|
|
| +void PasswordManager::ShowManualFallbackForSaving(
|
| + password_manager::PasswordManagerDriver* driver,
|
| + const PasswordForm& password_form) {
|
| + if (!client_->IsSavingAndFillingEnabledForCurrentPage() ||
|
| + ShouldBlockPasswordForSameOriginButDifferentScheme(password_form))
|
| + return;
|
| +
|
| + PasswordFormManager* matched_manager = FindMatchedManager(
|
| + password_form, pending_login_managers_, driver, nullptr);
|
| + if (!matched_manager)
|
| + return;
|
| + // TODO(crbug.com/741537): Process manual saving request even if there is
|
| + // still no response from the store.
|
| + if (matched_manager->form_fetcher()->GetState() ==
|
| + FormFetcher::State::WAITING) {
|
| + return;
|
| + }
|
| + ProvisionallySaveManager(password_form, matched_manager, nullptr);
|
| +
|
| + DCHECK(provisional_save_manager_);
|
| + bool is_update = IsPasswordUpdate(*provisional_save_manager_);
|
| + bool has_generated_password =
|
| + provisional_save_manager_->has_generated_password();
|
| + client_->ShowManualFallbackForSaving(std::move(provisional_save_manager_),
|
| + has_generated_password, is_update);
|
| +}
|
| +
|
| +void PasswordManager::HideManualFallbackForSaving() {
|
| + client_->HideManualFallbackForSaving();
|
| +}
|
| +
|
| void PasswordManager::OnPasswordFormsParsed(
|
| password_manager::PasswordManagerDriver* driver,
|
| const std::vector<PasswordForm>& forms) {
|
| @@ -780,12 +821,7 @@ void PasswordManager::OnLoginSuccessful() {
|
| empty_password);
|
| if (logger)
|
| logger->LogMessage(Logger::STRING_DECISION_ASK);
|
| - bool update_password =
|
| - (!provisional_save_manager_->best_matches().empty() &&
|
| - provisional_save_manager_
|
| - ->is_possible_change_password_form_without_username()) ||
|
| - provisional_save_manager_->password_overridden() ||
|
| - provisional_save_manager_->retry_password_form_password_update();
|
| + bool update_password = IsPasswordUpdate(*provisional_save_manager_);
|
| if (client_->PromptUserToSaveOrUpdatePassword(
|
| std::move(provisional_save_manager_), update_password)) {
|
| if (logger)
|
|
|