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 3546bfe79bfb3e55ab159168001b38cc0d95608c..c406e009e616d3a144f36a12258fd08214472434 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(); |
+} |
+ |
} // namespace |
// static |
@@ -470,6 +480,27 @@ void PasswordManager::OnPasswordFormForceSaveRequested( |
OnLoginSuccessful(); |
} |
+void PasswordManager::ShowManualFallbackForSaving( |
+ password_manager::PasswordManagerDriver* driver, |
+ const PasswordForm& password_form) { |
+ ProvisionallySavePassword(password_form, driver); |
+ DCHECK(provisional_save_manager_); |
+ DCHECK(provisional_save_manager_->form_fetcher()); |
+ // TODO(crbug.com/741537): Process manual saving request even if there is |
+ // still no response from the store. |
+ if (provisional_save_manager_->form_fetcher()->GetState() == |
+ FormFetcher::State::WAITING) { |
+ return; |
+ } |
+ bool is_update = IsPasswordUpdate(*provisional_save_manager_); |
+ client_->ShowManualFallbackForSaving(std::move(provisional_save_manager_), |
+ is_update); |
+} |
+ |
+void PasswordManager::HideManualFallbackForSaving() { |
+ client_->HideManualFallbackForSaving(); |
+} |
+ |
void PasswordManager::OnPasswordFormsParsed( |
password_manager::PasswordManagerDriver* driver, |
const std::vector<PasswordForm>& forms) { |
@@ -753,12 +784,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) |