Chromium Code Reviews| Index: components/password_manager/core/browser/password_autofill_manager.cc |
| diff --git a/components/password_manager/core/browser/password_autofill_manager.cc b/components/password_manager/core/browser/password_autofill_manager.cc |
| index a7a71085d9f864199eab2892a8f79ac65636e17c..516276f2226de461bdc54188cb2be95aacef6c9d 100644 |
| --- a/components/password_manager/core/browser/password_autofill_manager.cc |
| +++ b/components/password_manager/core/browser/password_autofill_manager.cc |
| @@ -16,6 +16,7 @@ |
| #include "components/autofill/core/browser/suggestion.h" |
| #include "components/autofill/core/common/autofill_constants.h" |
| #include "components/autofill/core/common/autofill_data_validation.h" |
| +#include "components/autofill/core/common/autofill_util.h" |
| #include "components/password_manager/core/browser/affiliation_utils.h" |
| #include "components/password_manager/core/browser/password_manager_driver.h" |
| #include "components/password_manager/core/browser/password_manager_metrics_util.h" |
| @@ -59,43 +60,57 @@ base::string16 GetHumanReadableRealm(const std::string& signon_realm) { |
| return base::UTF8ToUTF16(signon_realm); |
| } |
| +// If |field_suggestion| matches |field_content|, creates a Suggestion out of it |
| +// and appends to |suggestions|. |
| +void AppendSuggestionIfMatching( |
| + const base::string16& field_suggestion, |
| + const base::string16& field_contents, |
| + const std::string& signon_realm, |
| + bool show_all, |
| + std::vector<autofill::Suggestion>* suggestions) { |
| + bool substring_matched_suggestion = false; |
| + if (show_all || base::StartsWith(field_suggestion, field_contents, false) || |
| + (substring_matched_suggestion = autofill::ContainsTokenThatStartsWith( |
|
please use gerrit instead
2015/06/29 22:06:29
If you can figure out a way to write this without
Pritam Nikam
2015/06/30 15:05:51
Done.
Changes to:
bool prefix_matched_suggest
please use gerrit instead
2015/06/30 19:06:22
Very nice.
|
| + field_suggestion, field_contents, false))) { |
| + autofill::Suggestion suggestion(ReplaceEmptyUsername(field_suggestion)); |
| + suggestion.label = GetHumanReadableRealm(signon_realm); |
| + suggestion.frontend_id = autofill::POPUP_ITEM_ID_PASSWORD_ENTRY; |
| + suggestion.match = substring_matched_suggestion |
| + ? autofill::Suggestion::SUBSTRING_MATCH |
| + : autofill::Suggestion::PREFIX_MATCH; |
| + suggestions->push_back(suggestion); |
| + } |
| +} |
| + |
| // This function attempts to fill |suggestions| and |realms| form |fill_data| |
| // based on |current_username|. Unless |show_all| is true, it only picks |
| -// suggestions where the username has |current_username| as a prefix. |
| +// suggestions where the username matches |current_username|. |
| void GetSuggestions(const autofill::PasswordFormFillData& fill_data, |
| const base::string16& current_username, |
| std::vector<autofill::Suggestion>* suggestions, |
| bool show_all) { |
| - if (show_all || base::StartsWith(fill_data.username_field.value, |
| - current_username, false)) { |
| - autofill::Suggestion suggestion( |
| - ReplaceEmptyUsername(fill_data.username_field.value)); |
| - suggestion.label = GetHumanReadableRealm(fill_data.preferred_realm); |
| - suggestion.frontend_id = autofill::POPUP_ITEM_ID_PASSWORD_ENTRY; |
| - suggestions->push_back(suggestion); |
| - } |
| + AppendSuggestionIfMatching(fill_data.username_field.value, current_username, |
| + fill_data.preferred_realm, show_all, suggestions); |
| for (const auto& login : fill_data.additional_logins) { |
| - if (show_all || base::StartsWith(login.first, current_username, false)) { |
| - autofill::Suggestion suggestion(ReplaceEmptyUsername(login.first)); |
| - suggestion.label = GetHumanReadableRealm(login.second.realm); |
| - suggestion.frontend_id = autofill::POPUP_ITEM_ID_PASSWORD_ENTRY; |
| - suggestions->push_back(suggestion); |
| - } |
| + AppendSuggestionIfMatching(login.first, current_username, |
| + login.second.realm, show_all, suggestions); |
| } |
| for (const auto& usernames : fill_data.other_possible_usernames) { |
| for (size_t i = 0; i < usernames.second.size(); ++i) { |
| - if (show_all || |
| - base::StartsWith(usernames.second[i], current_username, false)) { |
| - autofill::Suggestion suggestion( |
| - ReplaceEmptyUsername(usernames.second[i])); |
| - suggestion.label = GetHumanReadableRealm(usernames.first.realm); |
| - suggestion.frontend_id = autofill::POPUP_ITEM_ID_PASSWORD_ENTRY; |
| - suggestions->push_back(suggestion); |
| - } |
| + AppendSuggestionIfMatching(usernames.second[i], current_username, |
| + usernames.first.realm, show_all, suggestions); |
| } |
| } |
| + |
| + // Prefix matches should precede other token matches. |
| + if (autofill::IsFeatureSubstringMatchEnabled()) { |
| + std::sort(suggestions->begin(), suggestions->end(), |
| + [](const autofill::Suggestion& a, const autofill::Suggestion& b) { |
| + return a.match < b.match; |
| + }); |
| + } |
| } |
| } // namespace |