OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/password_manager/core/browser/password_manager.h" | 5 #include "components/password_manager/core/browser/password_manager.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <map> | 8 #include <map> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 } | 130 } |
131 | 131 |
132 return PreferredRealmIsFromAndroid(fill_data); | 132 return PreferredRealmIsFromAndroid(fill_data); |
133 } | 133 } |
134 | 134 |
135 bool AreAllFieldsEmpty(const PasswordForm& form) { | 135 bool AreAllFieldsEmpty(const PasswordForm& form) { |
136 return form.username_value.empty() && form.password_value.empty() && | 136 return form.username_value.empty() && form.password_value.empty() && |
137 form.new_password_value.empty(); | 137 form.new_password_value.empty(); |
138 } | 138 } |
139 | 139 |
| 140 // Helper function that determines whether update or save prompt should be |
| 141 // shown for credentials in |provisional_save_manager|. |
| 142 bool IsPasswordUpdate(const PasswordFormManager& provisional_save_manager) { |
| 143 return (!provisional_save_manager.best_matches().empty() && |
| 144 provisional_save_manager |
| 145 .is_possible_change_password_form_without_username()) || |
| 146 provisional_save_manager.password_overridden() || |
| 147 provisional_save_manager.retry_password_form_password_update(); |
| 148 } |
| 149 |
140 // Finds the matched form manager for |form| in |pending_login_managers|. | 150 // Finds the matched form manager for |form| in |pending_login_managers|. |
141 PasswordFormManager* FindMatchedManager( | 151 PasswordFormManager* FindMatchedManager( |
142 const autofill::PasswordForm& form, | 152 const autofill::PasswordForm& form, |
143 const std::vector<std::unique_ptr<PasswordFormManager>>& | 153 const std::vector<std::unique_ptr<PasswordFormManager>>& |
144 pending_login_managers, | 154 pending_login_managers, |
145 const password_manager::PasswordManagerDriver* driver, | 155 const password_manager::PasswordManagerDriver* driver, |
146 BrowserSavePasswordProgressLogger* logger) { | 156 BrowserSavePasswordProgressLogger* logger) { |
147 auto matched_manager_it = pending_login_managers.end(); | 157 auto matched_manager_it = pending_login_managers.end(); |
148 PasswordFormManager::MatchResultMask current_match_result = | 158 PasswordFormManager::MatchResultMask current_match_result = |
149 PasswordFormManager::RESULT_NO_MATCH; | 159 PasswordFormManager::RESULT_NO_MATCH; |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 password_manager::PasswordManagerDriver* driver, | 470 password_manager::PasswordManagerDriver* driver, |
461 const PasswordForm& password_form) { | 471 const PasswordForm& password_form) { |
462 // TODO(msramek): This is just a sketch. We will need to show a custom bubble, | 472 // TODO(msramek): This is just a sketch. We will need to show a custom bubble, |
463 // mark the form as force saved, and recreate the pending login managers, | 473 // mark the form as force saved, and recreate the pending login managers, |
464 // because the password store might have changed. | 474 // because the password store might have changed. |
465 ProvisionallySavePassword(password_form, driver); | 475 ProvisionallySavePassword(password_form, driver); |
466 if (provisional_save_manager_) | 476 if (provisional_save_manager_) |
467 OnLoginSuccessful(); | 477 OnLoginSuccessful(); |
468 } | 478 } |
469 | 479 |
| 480 void PasswordManager::ShowManualFallbackForSaving( |
| 481 password_manager::PasswordManagerDriver* driver, |
| 482 const PasswordForm& password_form) { |
| 483 if (!client_->IsSavingAndFillingEnabledForCurrentPage() || |
| 484 ShouldBlockPasswordForSameOriginButDifferentScheme(password_form)) |
| 485 return; |
| 486 |
| 487 PasswordFormManager* matched_manager = FindMatchedManager( |
| 488 password_form, pending_login_managers_, driver, nullptr); |
| 489 if (!matched_manager) |
| 490 return; |
| 491 // TODO(crbug.com/741537): Process manual saving request even if there is |
| 492 // still no response from the store. |
| 493 if (matched_manager->form_fetcher()->GetState() == |
| 494 FormFetcher::State::WAITING) { |
| 495 return; |
| 496 } |
| 497 ProvisionallySaveManager(password_form, matched_manager, nullptr); |
| 498 |
| 499 DCHECK(provisional_save_manager_); |
| 500 bool is_update = IsPasswordUpdate(*provisional_save_manager_); |
| 501 bool has_generated_password = |
| 502 provisional_save_manager_->has_generated_password(); |
| 503 client_->ShowManualFallbackForSaving(std::move(provisional_save_manager_), |
| 504 has_generated_password, is_update); |
| 505 } |
| 506 |
| 507 void PasswordManager::HideManualFallbackForSaving() { |
| 508 client_->HideManualFallbackForSaving(); |
| 509 } |
| 510 |
470 void PasswordManager::OnPasswordFormsParsed( | 511 void PasswordManager::OnPasswordFormsParsed( |
471 password_manager::PasswordManagerDriver* driver, | 512 password_manager::PasswordManagerDriver* driver, |
472 const std::vector<PasswordForm>& forms) { | 513 const std::vector<PasswordForm>& forms) { |
473 CreatePendingLoginManagers(driver, forms); | 514 CreatePendingLoginManagers(driver, forms); |
474 } | 515 } |
475 | 516 |
476 void PasswordManager::CreatePendingLoginManagers( | 517 void PasswordManager::CreatePendingLoginManagers( |
477 password_manager::PasswordManagerDriver* driver, | 518 password_manager::PasswordManagerDriver* driver, |
478 const std::vector<PasswordForm>& forms) { | 519 const std::vector<PasswordForm>& forms) { |
479 std::unique_ptr<BrowserSavePasswordProgressLogger> logger; | 520 std::unique_ptr<BrowserSavePasswordProgressLogger> logger; |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
773 | 814 |
774 RecordWhetherTargetDomainDiffers(main_frame_url_, client_->GetMainFrameURL()); | 815 RecordWhetherTargetDomainDiffers(main_frame_url_, client_->GetMainFrameURL()); |
775 | 816 |
776 if (ShouldPromptUserToSavePassword()) { | 817 if (ShouldPromptUserToSavePassword()) { |
777 bool empty_password = | 818 bool empty_password = |
778 provisional_save_manager_->pending_credentials().username_value.empty(); | 819 provisional_save_manager_->pending_credentials().username_value.empty(); |
779 UMA_HISTOGRAM_BOOLEAN("PasswordManager.EmptyUsernames.OfferedToSave", | 820 UMA_HISTOGRAM_BOOLEAN("PasswordManager.EmptyUsernames.OfferedToSave", |
780 empty_password); | 821 empty_password); |
781 if (logger) | 822 if (logger) |
782 logger->LogMessage(Logger::STRING_DECISION_ASK); | 823 logger->LogMessage(Logger::STRING_DECISION_ASK); |
783 bool update_password = | 824 bool update_password = IsPasswordUpdate(*provisional_save_manager_); |
784 (!provisional_save_manager_->best_matches().empty() && | |
785 provisional_save_manager_ | |
786 ->is_possible_change_password_form_without_username()) || | |
787 provisional_save_manager_->password_overridden() || | |
788 provisional_save_manager_->retry_password_form_password_update(); | |
789 if (client_->PromptUserToSaveOrUpdatePassword( | 825 if (client_->PromptUserToSaveOrUpdatePassword( |
790 std::move(provisional_save_manager_), update_password)) { | 826 std::move(provisional_save_manager_), update_password)) { |
791 if (logger) | 827 if (logger) |
792 logger->LogMessage(Logger::STRING_SHOW_PASSWORD_PROMPT); | 828 logger->LogMessage(Logger::STRING_SHOW_PASSWORD_PROMPT); |
793 } | 829 } |
794 } else { | 830 } else { |
795 if (logger) | 831 if (logger) |
796 logger->LogMessage(Logger::STRING_DECISION_SAVE); | 832 logger->LogMessage(Logger::STRING_DECISION_SAVE); |
797 provisional_save_manager_->Save(); | 833 provisional_save_manager_->Save(); |
798 | 834 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 current_match_result = result; | 987 current_match_result = result; |
952 } else if (result > current_match_result) { | 988 } else if (result > current_match_result) { |
953 matched_manager = login_manager.get(); | 989 matched_manager = login_manager.get(); |
954 current_match_result = result; | 990 current_match_result = result; |
955 } | 991 } |
956 } | 992 } |
957 return matched_manager; | 993 return matched_manager; |
958 } | 994 } |
959 | 995 |
960 } // namespace password_manager | 996 } // namespace password_manager |
OLD | NEW |