Chromium Code Reviews| 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 5d0ba2afdec63b1dbbf3c58f65d1d2c62669685e..54fa6861c376a7207e317527ce7ecd20296d02b4 100644 |
| --- a/components/password_manager/core/browser/password_form_manager.cc |
| +++ b/components/password_manager/core/browser/password_form_manager.cc |
| @@ -294,6 +294,16 @@ void PasswordFormManager::Save() { |
| UpdateLogin(); |
| } |
| +void PasswordFormManager::Update( |
| + const autofill::PasswordForm& credentials_to_update) { |
| + base::string16 password_to_save = pending_credentials_.password_value; |
| + pending_credentials_ = credentials_to_update; |
| + pending_credentials_.password_value = password_to_save; |
| + pending_credentials_.preferred = true; |
| + is_new_login_ = false; |
| + UpdateLogin(); |
| +} |
| + |
| void PasswordFormManager::FetchMatchingLoginsFromPasswordStore( |
| PasswordStore::AuthorizationPromptPolicy prompt_policy) { |
| DCHECK_EQ(state_, PRE_MATCHING_PHASE); |
| @@ -325,7 +335,8 @@ void PasswordFormManager::SetSubmittedForm(const autofill::PasswordForm& form) { |
| is_ignorable_change_password_form_ = |
| is_change_password_form && !form.username_marked_by_site && |
| !DoesUsenameAndPasswordMatchCredentials( |
| - form.username_value, form.password_value, best_matches_); |
| + form.username_value, form.password_value, best_matches_) && |
| + !client_->IsUpdatePasswordUIEnabled(); |
| bool is_signup_form = |
| !form.new_password_value.empty() && form.password_value.empty(); |
| bool no_username = form.username_element.empty(); |
| @@ -866,6 +877,19 @@ void PasswordFormManager::CreatePendingCredentials() { |
| // credential. |
| selected_username_ = provisionally_saved_form_->username_value; |
| is_new_login_ = false; |
| + } else if (client_->IsUpdatePasswordUIEnabled() && !best_matches_.empty() && |
| + provisionally_saved_form_ |
| + ->IsPossibleChangePasswordFormWithoutUsername()) { |
| + PasswordForm* best_update_match = FindBestMatchForUpdatePassword( |
| + provisionally_saved_form_->password_value); |
| + |
| + if (best_update_match) |
| + pending_credentials_ = *best_update_match; |
| + else |
| + pending_credentials_.origin = provisionally_saved_form_->origin; |
| + is_new_login_ = false; |
| + // We don't care about |pending_credentials_| if we didn't find the best |
| + // match, since the user will select the correct one. |
| } else { |
| // User typed in a new, unknown username. |
| user_action_ = kUserActionOverrideUsernameAndPassword; |
| @@ -971,6 +995,30 @@ int PasswordFormManager::ScoreResult(const PasswordForm& candidate) const { |
| return score; |
| } |
| +PasswordForm* PasswordFormManager::FindBestMatchForUpdatePassword( |
| + const base::string16& password) const { |
| + if (best_matches_.size() == 1) { |
| + // In case when there is no old password on the form and the user has only |
|
vasilii
2015/08/05 17:34:08
Update the comment
dvadym
2015/08/06 08:41:18
Done.
|
| + // one piece of credentials, consider it the same as is being saved. |
| + return best_matches_.begin()->second; |
| + } |
| + return nullptr; |
|
vasilii
2015/08/05 17:34:08
Are you sure? :-)
dvadym
2015/08/06 08:41:18
Thanks, done.
|
| + |
| + PasswordFormMap::const_iterator best_password_match_it = best_matches_.end(); |
| + for (auto it = best_matches_.begin(); it != best_matches_.end(); ++it) { |
| + if (it->second->password_value == password) { |
| + if (best_password_match_it != best_matches_.end()) { |
| + // Found a second credential with the same password, do nothing. |
| + return nullptr; |
| + } |
| + best_password_match_it = it; |
| + } |
| + } |
| + return best_password_match_it == best_matches_.end() |
| + ? nullptr |
| + : best_password_match_it->second; |
| +} |
| + |
| void PasswordFormManager::SubmitPassed() { |
| submit_result_ = kSubmitResultPassed; |
| if (has_generated_password_) |