Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Side by Side Diff: components/autofill/core/browser/personal_data_manager.cc

Issue 1982623002: [Autofill] Sort profiles and credit cards by frecency in PaymentRequest. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed mathp's comments Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/autofill/core/browser/personal_data_manager.h" 5 #include "components/autofill/core/browser/personal_data_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <list> 9 #include <list>
10 #include <map> 10 #include <map>
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 679
680 bool PersonalDataManager::HasServerData() const { 680 bool PersonalDataManager::HasServerData() const {
681 return !server_credit_cards_.empty() || !server_profiles_.empty(); 681 return !server_credit_cards_.empty() || !server_profiles_.empty();
682 } 682 }
683 683
684 void PersonalDataManager::Refresh() { 684 void PersonalDataManager::Refresh() {
685 LoadProfiles(); 685 LoadProfiles();
686 LoadCreditCards(); 686 LoadCreditCards();
687 } 687 }
688 688
689 const std::vector<AutofillProfile*> PersonalDataManager::GetProfilesToSuggest()
690 const {
691 std::vector<AutofillProfile*> profiles = GetProfiles(true);
692
693 // Rank the suggestions by frecency (see AutofillDataModel for details).
694 base::Time comparison_time = base::Time::Now();
695 std::sort(profiles.begin(), profiles.end(),
696 [comparison_time](const AutofillDataModel* a,
697 const AutofillDataModel* b) {
698 return a->CompareFrecency(b, comparison_time);
699 });
700
701 return profiles;
702 }
703
689 std::vector<Suggestion> PersonalDataManager::GetProfileSuggestions( 704 std::vector<Suggestion> PersonalDataManager::GetProfileSuggestions(
690 const AutofillType& type, 705 const AutofillType& type,
691 const base::string16& field_contents, 706 const base::string16& field_contents,
692 bool field_is_autofilled, 707 bool field_is_autofilled,
693 const std::vector<ServerFieldType>& other_field_types) { 708 const std::vector<ServerFieldType>& other_field_types) {
694 if (IsInAutofillSuggestionsDisabledExperiment()) 709 if (IsInAutofillSuggestionsDisabledExperiment())
695 return std::vector<Suggestion>(); 710 return std::vector<Suggestion>();
696 711
697 base::string16 field_contents_canon = 712 base::string16 field_contents_canon =
698 AutofillProfile::CanonicalizeProfileString(field_contents); 713 AutofillProfile::CanonicalizeProfileString(field_contents);
699 714
700 std::vector<AutofillProfile*> profiles = GetProfiles(true); 715 // Get the profiles to suggest, which are already sorted.
701 716 std::vector<AutofillProfile*> profiles = GetProfilesToSuggest();
702 // Rank the suggestions by frecency (see AutofillDataModel for details).
703 base::Time comparison_time = base::Time::Now();
704 std::sort(profiles.begin(), profiles.end(),
705 [comparison_time](const AutofillDataModel* a,
706 const AutofillDataModel* b) {
707 return a->CompareFrecency(b, comparison_time);
708 });
709 717
710 std::vector<Suggestion> suggestions; 718 std::vector<Suggestion> suggestions;
711 // Match based on a prefix search. 719 // Match based on a prefix search.
712 std::vector<AutofillProfile*> matched_profiles; 720 std::vector<AutofillProfile*> matched_profiles;
713 for (AutofillProfile* profile : profiles) { 721 for (AutofillProfile* profile : profiles) {
714 base::string16 value = GetInfoInOneLine(profile, type, app_locale_); 722 base::string16 value = GetInfoInOneLine(profile, type, app_locale_);
715 if (value.empty()) 723 if (value.empty())
716 continue; 724 continue;
717 725
718 bool prefix_matched_suggestion; 726 bool prefix_matched_suggestion;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 // trial group or SIZE_MAX if no limit is defined. 791 // trial group or SIZE_MAX if no limit is defined.
784 std::string limit_str = variations::GetVariationParamValue( 792 std::string limit_str = variations::GetVariationParamValue(
785 kFrecencyFieldTrialName, kFrecencyFieldTrialLimitParam); 793 kFrecencyFieldTrialName, kFrecencyFieldTrialLimitParam);
786 size_t limit = base::StringToSizeT(limit_str, &limit) ? limit : SIZE_MAX; 794 size_t limit = base::StringToSizeT(limit_str, &limit) ? limit : SIZE_MAX;
787 795
788 unique_suggestions.resize(std::min(unique_suggestions.size(), limit)); 796 unique_suggestions.resize(std::min(unique_suggestions.size(), limit));
789 797
790 return unique_suggestions; 798 return unique_suggestions;
791 } 799 }
792 800
801 // TODO(crbug.com/613187): Investigate if it would be more efficient to dedupe
802 // with a vector instead of a list.
803 const std::vector<CreditCard*> PersonalDataManager::GetCreditCardsToSuggest()
804 const {
805 std::vector<CreditCard*> credit_cards = GetCreditCards();
806
807 std::list<CreditCard*> cards_to_dedupe(credit_cards.begin(),
808 credit_cards.end());
809
810 DedupeCreditCardToSuggest(&cards_to_dedupe);
please use gerrit instead 2016/05/24 20:21:48 Can you check that this code path is not being use
sebsg 2016/05/24 21:41:22 The options page uses GetProfiles and GetCreditCar
please use gerrit instead 2016/05/25 00:54:41 What about getProfiles() and getCreditCards() in h
811
812 std::vector<CreditCard*> cards_to_suggest(
813 std::make_move_iterator(std::begin(cards_to_dedupe)),
814 std::make_move_iterator(std::end(cards_to_dedupe)));
815
816 // Rank the cards by frecency (see AutofillDataModel for details). All expired
817 // cards should be suggested last, also by frecency.
818 base::Time comparison_time = base::Time::Now();
819 std::stable_sort(cards_to_suggest.begin(), cards_to_suggest.end(),
820 [comparison_time](const CreditCard* a, const CreditCard* b) {
821 bool a_is_expired = a->IsExpired(comparison_time);
822 if (a_is_expired != b->IsExpired(comparison_time))
823 return !a_is_expired;
824
825 return a->CompareFrecency(b, comparison_time);
826 });
827
828 return cards_to_suggest;
829 }
830
793 std::vector<Suggestion> PersonalDataManager::GetCreditCardSuggestions( 831 std::vector<Suggestion> PersonalDataManager::GetCreditCardSuggestions(
794 const AutofillType& type, 832 const AutofillType& type,
795 const base::string16& field_contents) { 833 const base::string16& field_contents) {
796 if (IsInAutofillSuggestionsDisabledExperiment()) 834 if (IsInAutofillSuggestionsDisabledExperiment())
797 return std::vector<Suggestion>(); 835 return std::vector<Suggestion>();
798 836
799 const std::vector<CreditCard*> credit_cards = GetCreditCards(); 837 return GetSuggestionsForCards(type, field_contents,
800 std::list<const CreditCard*> cards_to_suggest(credit_cards.begin(), 838 GetCreditCardsToSuggest());
801 credit_cards.end());
802
803 DedupeCreditCardToSuggest(&cards_to_suggest);
804
805 // Rank the cards by frecency (see AutofillDataModel for details). All expired
806 // cards should be suggested last, also by frecency.
807 base::Time comparison_time = base::Time::Now();
808 cards_to_suggest.sort(
809 [comparison_time](const CreditCard* a, const CreditCard* b) {
810 bool a_is_expired = a->IsExpired(comparison_time);
811 if (a_is_expired != b->IsExpired(comparison_time))
812 return !a_is_expired;
813
814 return a->CompareFrecency(b, comparison_time);
815 });
816
817 return GetSuggestionsForCards(type, field_contents, cards_to_suggest);
818 } 839 }
819 840
820 bool PersonalDataManager::IsAutofillEnabled() const { 841 bool PersonalDataManager::IsAutofillEnabled() const {
821 return ::autofill::IsAutofillEnabled(pref_service_); 842 return ::autofill::IsAutofillEnabled(pref_service_);
822 } 843 }
823 844
824 std::string PersonalDataManager::CountryCodeForCurrentTimezone() const { 845 std::string PersonalDataManager::CountryCodeForCurrentTimezone() const {
825 return base::CountryCodeForCurrentTimezone(); 846 return base::CountryCodeForCurrentTimezone();
826 } 847 }
827 848
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
957 978
958 // Failing that, guess based on locale. 979 // Failing that, guess based on locale.
959 if (default_country_code_.empty()) 980 if (default_country_code_.empty())
960 default_country_code_ = AutofillCountry::CountryCodeForLocale(app_locale()); 981 default_country_code_ = AutofillCountry::CountryCodeForLocale(app_locale());
961 982
962 return default_country_code_; 983 return default_country_code_;
963 } 984 }
964 985
965 // static 986 // static
966 void PersonalDataManager::DedupeCreditCardToSuggest( 987 void PersonalDataManager::DedupeCreditCardToSuggest(
967 std::list<const CreditCard*>* cards_to_suggest) { 988 std::list<CreditCard*>* cards_to_suggest) {
968 for (auto outer_it = cards_to_suggest->begin(); 989 for (auto outer_it = cards_to_suggest->begin();
969 outer_it != cards_to_suggest->end(); ++outer_it) { 990 outer_it != cards_to_suggest->end(); ++outer_it) {
970 // If considering a full server card, look for local cards that are 991 // If considering a full server card, look for local cards that are
971 // duplicates of it and remove them. 992 // duplicates of it and remove them.
972 if ((*outer_it)->record_type() == CreditCard::FULL_SERVER_CARD) { 993 if ((*outer_it)->record_type() == CreditCard::FULL_SERVER_CARD) {
973 for (auto inner_it = cards_to_suggest->begin(); 994 for (auto inner_it = cards_to_suggest->begin();
974 inner_it != cards_to_suggest->end();) { 995 inner_it != cards_to_suggest->end();) {
975 auto inner_it_copy = inner_it++; 996 auto inner_it_copy = inner_it++;
976 if ((*inner_it_copy)->IsLocalDuplicateOfServerCard(**outer_it)) 997 if ((*inner_it_copy)->IsLocalDuplicateOfServerCard(**outer_it))
977 cards_to_suggest->erase(inner_it_copy); 998 cards_to_suggest->erase(inner_it_copy);
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
1441 if (pref_service_->GetBoolean(prefs::kAutofillWalletImportEnabled)) { 1462 if (pref_service_->GetBoolean(prefs::kAutofillWalletImportEnabled)) {
1442 profiles_.insert( 1463 profiles_.insert(
1443 profiles_.end(), server_profiles_.begin(), server_profiles_.end()); 1464 profiles_.end(), server_profiles_.begin(), server_profiles_.end());
1444 } 1465 }
1445 return profiles_; 1466 return profiles_;
1446 } 1467 }
1447 1468
1448 std::vector<Suggestion> PersonalDataManager::GetSuggestionsForCards( 1469 std::vector<Suggestion> PersonalDataManager::GetSuggestionsForCards(
1449 const AutofillType& type, 1470 const AutofillType& type,
1450 const base::string16& field_contents, 1471 const base::string16& field_contents,
1451 const std::list<const CreditCard*>& cards_to_suggest) const { 1472 const std::vector<CreditCard*>& cards_to_suggest) const {
1452 std::vector<Suggestion> suggestions; 1473 std::vector<Suggestion> suggestions;
1453 std::list<const CreditCard*> substring_matched_cards;
1454 base::string16 field_contents_lower = base::i18n::ToLower(field_contents); 1474 base::string16 field_contents_lower = base::i18n::ToLower(field_contents);
1455 for (const CreditCard* credit_card : cards_to_suggest) { 1475 for (const CreditCard* credit_card : cards_to_suggest) {
1456 // The value of the stored data for this field type in the |credit_card|. 1476 // The value of the stored data for this field type in the |credit_card|.
1457 base::string16 creditcard_field_value = 1477 base::string16 creditcard_field_value =
1458 credit_card->GetInfo(type, app_locale_); 1478 credit_card->GetInfo(type, app_locale_);
1459 if (creditcard_field_value.empty()) 1479 if (creditcard_field_value.empty())
1460 continue; 1480 continue;
1461 base::string16 creditcard_field_lower = 1481 base::string16 creditcard_field_lower =
1462 base::i18n::ToLower(creditcard_field_value); 1482 base::i18n::ToLower(creditcard_field_value);
1463 1483
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1508 std::stable_sort(suggestions.begin(), suggestions.end(), 1528 std::stable_sort(suggestions.begin(), suggestions.end(),
1509 [](const Suggestion& a, const Suggestion& b) { 1529 [](const Suggestion& a, const Suggestion& b) {
1510 return a.match < b.match; 1530 return a.match < b.match;
1511 }); 1531 });
1512 } 1532 }
1513 1533
1514 return suggestions; 1534 return suggestions;
1515 } 1535 }
1516 1536
1517 } // namespace autofill 1537 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698