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 f6738f8c8622ff88b0c6dfbfbbbc60c8a71cf752..8664427b4acf2578f5b13e14d6c05820152c8f23 100644 |
| --- a/components/password_manager/core/browser/password_form_manager.cc |
| +++ b/components/password_manager/core/browser/password_form_manager.cc |
| @@ -290,6 +290,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); |
| @@ -861,6 +871,17 @@ void PasswordFormManager::CreatePendingCredentials() { |
| // credential. |
| selected_username_ = provisionally_saved_form_->username_value; |
| is_new_login_ = false; |
| + } else if (client_->IsUpdatePasswordUIEnabled() && |
| + provisionally_saved_form_ |
| + ->IsPossibleChangePasswordFormWithoutUsername()) { |
| + PasswordForm* best_update_match = FindBestMatchForUpdatePassword( |
| + provisionally_saved_form_->password_value); |
| + |
| + if (best_update_match) { |
| + pending_credentials_ = *best_update_match; |
|
vasilii
2015/07/27 15:44:49
Didn't you just overwrite the new password value?
dvadym
2015/07/30 11:22:44
No, username/password/new password are in provisio
|
| + } |
| + // 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; |
| @@ -965,6 +986,31 @@ int PasswordFormManager::ScoreResult(const PasswordForm& candidate) const { |
| return score; |
| } |
| +PasswordForm* PasswordFormManager::FindBestMatchForUpdatePassword( |
| + const base::string16& password) const { |
| + if (password.empty()) { |
| + if (best_matches_.size() == 1) { |
| + // In case when there is no old password on the form and the user has only |
| + // one piece of credentials, consider it the same as is being saved. |
| + return best_matches_.begin()->second; |
| + } |
| + return nullptr; |
| + } |
| + 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_) |