| Index: components/autofill/core/browser/personal_data_manager.cc
|
| diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
|
| index 6637fdac5154289ca9480e04be0f4b999e63342c..712ffa318b360106dadff1053917c07f7786a081 100644
|
| --- a/components/autofill/core/browser/personal_data_manager.cc
|
| +++ b/components/autofill/core/browser/personal_data_manager.cc
|
| @@ -14,6 +14,7 @@
|
|
|
| #include "base/i18n/case_conversion.h"
|
| #include "base/i18n/timezone.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/profiler/scoped_tracker.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_util.h"
|
| @@ -68,6 +69,10 @@ class FormGroupMatchesByGUIDFunctor {
|
| return form_group->guid() == guid_;
|
| }
|
|
|
| + bool operator()(const std::unique_ptr<T>& form_group) {
|
| + return form_group->guid() == guid_;
|
| + }
|
| +
|
| private:
|
| const std::string guid_;
|
| };
|
| @@ -180,18 +185,15 @@ base::string16 GetInfoInOneLine(const AutofillProfile* profile,
|
| // server and local profiles and credit cards.
|
| template <typename ValueType>
|
| void ReceiveLoadedDbValues(WebDataServiceBase::Handle h,
|
| - const WDTypedResult* result,
|
| + WDTypedResult* result,
|
| WebDataServiceBase::Handle* pending_handle,
|
| - ScopedVector<ValueType>* dest) {
|
| + std::vector<std::unique_ptr<ValueType>>* dest) {
|
| DCHECK_EQ(*pending_handle, h);
|
| *pending_handle = 0;
|
|
|
| - const WDResult<std::vector<ValueType*>>* r =
|
| - static_cast<const WDResult<std::vector<ValueType*>>*>(result);
|
| -
|
| - dest->clear();
|
| - for (ValueType* value : r->GetValue())
|
| - dest->push_back(value);
|
| + *dest = std::move(
|
| + static_cast<WDResult<std::vector<std::unique_ptr<ValueType>>>*>(result)
|
| + ->GetValue());
|
| }
|
|
|
| // A helper function for finding the maximum value in a string->int map.
|
| @@ -221,7 +223,7 @@ bool IsValidSuggestionForFieldContents(base::string16 suggestion_canon,
|
|
|
| // For card number fields, suggest the card if:
|
| // - the number matches any part of the card, or
|
| - // - it's a masked card and there are 6 or fewers typed so far.
|
| + // - it's a masked card and there are 6 or fewer typed so far.
|
| if (type.GetStorableType() == CREDIT_CARD_NUMBER) {
|
| if (suggestion_canon.find(field_contents_canon) == base::string16::npos &&
|
| (!is_masked_server_card || field_contents_canon.size() >= 6)) {
|
| @@ -331,7 +333,7 @@ void PersonalDataManager::OnSyncServiceInitialized(
|
|
|
| void PersonalDataManager::OnWebDataServiceRequestDone(
|
| WebDataServiceBase::Handle h,
|
| - const WDTypedResult* result) {
|
| + std::unique_ptr<WDTypedResult> result) {
|
| DCHECK(pending_profiles_query_ || pending_server_profiles_query_ ||
|
| pending_creditcards_query_ || pending_server_creditcards_query_);
|
|
|
| @@ -353,11 +355,11 @@ void PersonalDataManager::OnWebDataServiceRequestDone(
|
| switch (result->GetType()) {
|
| case AUTOFILL_PROFILES_RESULT:
|
| if (h == pending_profiles_query_) {
|
| - ReceiveLoadedDbValues(h, result, &pending_profiles_query_,
|
| + ReceiveLoadedDbValues(h, result.get(), &pending_profiles_query_,
|
| &web_profiles_);
|
| LogProfileCount(); // This only logs local profiles.
|
| } else {
|
| - ReceiveLoadedDbValues(h, result, &pending_server_profiles_query_,
|
| + ReceiveLoadedDbValues(h, result.get(), &pending_server_profiles_query_,
|
| &server_profiles_);
|
|
|
| if (!server_profiles_.empty()) {
|
| @@ -370,7 +372,7 @@ void PersonalDataManager::OnWebDataServiceRequestDone(
|
| // request, in which case there is no point updating
|
| // |server_profiles_| as it will be cleared.
|
| if (!email.empty()) {
|
| - for (AutofillProfile* profile : server_profiles_)
|
| + for (auto& profile : server_profiles_)
|
| profile->SetRawInfo(EMAIL_ADDRESS, email);
|
| }
|
| }
|
| @@ -378,11 +380,12 @@ void PersonalDataManager::OnWebDataServiceRequestDone(
|
| break;
|
| case AUTOFILL_CREDITCARDS_RESULT:
|
| if (h == pending_creditcards_query_) {
|
| - ReceiveLoadedDbValues(h, result, &pending_creditcards_query_,
|
| + ReceiveLoadedDbValues(h, result.get(), &pending_creditcards_query_,
|
| &local_credit_cards_);
|
| LogLocalCreditCardCount();
|
| } else {
|
| - ReceiveLoadedDbValues(h, result, &pending_server_creditcards_query_,
|
| + ReceiveLoadedDbValues(h, result.get(),
|
| + &pending_server_creditcards_query_,
|
| &server_credit_cards_);
|
|
|
| // If the user has a saved unmasked server card and the experiment is
|
| @@ -605,9 +608,9 @@ void PersonalDataManager::UpdateServerCreditCard(
|
|
|
| // Look up by server id, not GUID.
|
| const CreditCard* existing_credit_card = nullptr;
|
| - for (const auto* server_card : server_credit_cards_) {
|
| + for (const auto& server_card : server_credit_cards_) {
|
| if (credit_card.server_id() == server_card->server_id()) {
|
| - existing_credit_card = server_card;
|
| + existing_credit_card = server_card.get();
|
| break;
|
| }
|
| }
|
| @@ -634,9 +637,9 @@ void PersonalDataManager::UpdateServerCardBillingAddress(
|
| return;
|
|
|
| CreditCard* existing_credit_card = nullptr;
|
| - for (auto* server_card : server_credit_cards_) {
|
| + for (auto& server_card : server_credit_cards_) {
|
| if (credit_card.server_id() == server_card->server_id()) {
|
| - existing_credit_card = server_card;
|
| + existing_credit_card = server_card.get();
|
| break;
|
| }
|
| }
|
| @@ -654,7 +657,7 @@ void PersonalDataManager::UpdateServerCardBillingAddress(
|
| }
|
|
|
| void PersonalDataManager::ResetFullServerCard(const std::string& guid) {
|
| - for (const CreditCard* card : server_credit_cards_) {
|
| + for (const auto& card : server_credit_cards_) {
|
| if (card->guid() == guid) {
|
| DCHECK_EQ(card->record_type(), CreditCard::FULL_SERVER_CARD);
|
| CreditCard card_copy = *card;
|
| @@ -667,7 +670,7 @@ void PersonalDataManager::ResetFullServerCard(const std::string& guid) {
|
| }
|
|
|
| void PersonalDataManager::ResetFullServerCards() {
|
| - for (const CreditCard* card : server_credit_cards_) {
|
| + for (const auto& card : server_credit_cards_) {
|
| if (card->record_type() == CreditCard::FULL_SERVER_CARD) {
|
| CreditCard card_copy = *card;
|
| card_copy.set_record_type(CreditCard::MASKED_SERVER_CARD);
|
| @@ -693,7 +696,7 @@ void PersonalDataManager::ClearAllServerData() {
|
|
|
| void PersonalDataManager::AddServerCreditCardForTest(
|
| std::unique_ptr<CreditCard> credit_card) {
|
| - server_credit_cards_.push_back(credit_card.release());
|
| + server_credit_cards_.push_back(std::move(credit_card));
|
| }
|
|
|
| void PersonalDataManager::RemoveByGUID(const std::string& guid) {
|
| @@ -741,22 +744,27 @@ const std::vector<AutofillProfile*>& PersonalDataManager::GetProfiles() const {
|
| return GetProfiles(false);
|
| }
|
|
|
| -const std::vector<AutofillProfile*>& PersonalDataManager::web_profiles() const {
|
| - return web_profiles_.get();
|
| +std::vector<AutofillProfile*> PersonalDataManager::web_profiles() const {
|
| + std::vector<AutofillProfile*> result;
|
| + for (const auto& profile : web_profiles_)
|
| + result.push_back(profile.get());
|
| + return result;
|
| }
|
|
|
| -const std::vector<CreditCard*>& PersonalDataManager::GetLocalCreditCards()
|
| - const {
|
| - return local_credit_cards_.get();
|
| +std::vector<CreditCard*> PersonalDataManager::GetLocalCreditCards() const {
|
| + std::vector<CreditCard*> result;
|
| + for (const auto& card : local_credit_cards_)
|
| + result.push_back(card.get());
|
| + return result;
|
| }
|
|
|
| const std::vector<CreditCard*>& PersonalDataManager::GetCreditCards() const {
|
| credit_cards_.clear();
|
| - credit_cards_.insert(credit_cards_.end(), local_credit_cards_.begin(),
|
| - local_credit_cards_.end());
|
| + for (const auto& card : local_credit_cards_)
|
| + credit_cards_.push_back(card.get());
|
| if (pref_service_->GetBoolean(prefs::kAutofillWalletImportEnabled)) {
|
| - credit_cards_.insert(credit_cards_.end(), server_credit_cards_.begin(),
|
| - server_credit_cards_.end());
|
| + for (const auto& card : server_credit_cards_)
|
| + credit_cards_.push_back(card.get());
|
| }
|
| return credit_cards_;
|
| }
|
| @@ -972,7 +980,7 @@ bool PersonalDataManager::IsValidLearnableProfile(
|
| // variables.
|
| std::string PersonalDataManager::MergeProfile(
|
| const AutofillProfile& new_profile,
|
| - std::vector<AutofillProfile*> existing_profiles,
|
| + std::vector<std::unique_ptr<AutofillProfile>>* existing_profiles,
|
| const std::string& app_locale,
|
| std::vector<AutofillProfile>* merged_profiles) {
|
| merged_profiles->clear();
|
| @@ -983,12 +991,12 @@ std::string PersonalDataManager::MergeProfile(
|
| // profiles.
|
| // TODO(crbug.com/620521): Remove the check for verified from the sort.
|
| base::Time comparison_time = base::Time::Now();
|
| - std::sort(existing_profiles.begin(), existing_profiles.end(),
|
| - [comparison_time](const AutofillDataModel* a,
|
| - const AutofillDataModel* b) {
|
| + std::sort(existing_profiles->begin(), existing_profiles->end(),
|
| + [comparison_time](const std::unique_ptr<AutofillProfile>& a,
|
| + const std::unique_ptr<AutofillProfile>& b) {
|
| if (a->IsVerified() != b->IsVerified())
|
| return !a->IsVerified();
|
| - return a->CompareFrecency(b, comparison_time);
|
| + return a->CompareFrecency(b.get(), comparison_time);
|
| });
|
|
|
| // Set to true if |existing_profiles| already contains an equivalent profile.
|
| @@ -998,7 +1006,7 @@ std::string PersonalDataManager::MergeProfile(
|
| // If we have already saved this address, merge in any missing values.
|
| // Only merge with the first match.
|
| AutofillProfileComparator comparator(app_locale);
|
| - for (AutofillProfile* existing_profile : existing_profiles) {
|
| + for (const auto& existing_profile : *existing_profiles) {
|
| if (!matching_profile_found &&
|
| comparator.AreMergeable(new_profile, *existing_profile) &&
|
| existing_profile->SaveAdditionalInfo(new_profile, app_locale)) {
|
| @@ -1116,7 +1124,7 @@ void PersonalDataManager::SetProfiles(std::vector<AutofillProfile>* profiles) {
|
|
|
| // Any profiles that are not in the new profile list should be removed from
|
| // the web database.
|
| - for (const AutofillProfile* it : web_profiles_) {
|
| + for (const auto& it : web_profiles_) {
|
| if (!FindByGUID<AutofillProfile>(*profiles, it->guid()))
|
| database_->RemoveAutofillProfile(it->guid());
|
| }
|
| @@ -1137,7 +1145,7 @@ void PersonalDataManager::SetProfiles(std::vector<AutofillProfile>* profiles) {
|
| // Copy in the new profiles.
|
| web_profiles_.clear();
|
| for (const AutofillProfile& it : *profiles) {
|
| - web_profiles_.push_back(new AutofillProfile(it));
|
| + web_profiles_.push_back(base::MakeUnique<AutofillProfile>(it));
|
| }
|
|
|
| // Refresh our local cache and send notifications to observers.
|
| @@ -1159,7 +1167,7 @@ void PersonalDataManager::SetCreditCards(
|
|
|
| // Any credit cards that are not in the new credit card list should be
|
| // removed.
|
| - for (const CreditCard* card : local_credit_cards_) {
|
| + for (const auto& card : local_credit_cards_) {
|
| if (!FindByGUID<CreditCard>(*credit_cards, card->guid()))
|
| database_->RemoveCreditCard(card->guid());
|
| }
|
| @@ -1180,7 +1188,7 @@ void PersonalDataManager::SetCreditCards(
|
| // Copy in the new credit cards.
|
| local_credit_cards_.clear();
|
| for (const CreditCard& card : *credit_cards)
|
| - local_credit_cards_.push_back(new CreditCard(card));
|
| + local_credit_cards_.push_back(base::MakeUnique<CreditCard>(card));
|
|
|
| // Refresh our local cache and send notifications to observers.
|
| Refresh();
|
| @@ -1231,7 +1239,7 @@ std::string PersonalDataManager::SaveImportedProfile(
|
|
|
| // Don't save a web profile if the data in the profile is a subset of a
|
| // server profile, but do record the fact that it was used.
|
| - for (const AutofillProfile* profile : server_profiles_) {
|
| + for (const auto& profile : server_profiles_) {
|
| if (imported_profile.IsSubsetOf(*profile, app_locale_)) {
|
| RecordUseOf(*profile);
|
| return profile->guid();
|
| @@ -1239,8 +1247,8 @@ std::string PersonalDataManager::SaveImportedProfile(
|
| }
|
|
|
| std::vector<AutofillProfile> profiles;
|
| - std::string guid = MergeProfile(imported_profile, web_profiles_.get(),
|
| - app_locale_, &profiles);
|
| + std::string guid =
|
| + MergeProfile(imported_profile, &web_profiles_, app_locale_, &profiles);
|
| SetProfiles(&profiles);
|
| return guid;
|
| }
|
| @@ -1261,7 +1269,7 @@ std::string PersonalDataManager::SaveImportedCreditCard(
|
|
|
| std::string guid = imported_card.guid();
|
| std::vector<CreditCard> credit_cards;
|
| - for (CreditCard* card : local_credit_cards_) {
|
| + for (auto& card : local_credit_cards_) {
|
| // If |imported_card| has not yet been merged, check whether it should be
|
| // with the current |card|.
|
| if (!merged && card->UpdateFromImportedCard(imported_card, app_locale_)) {
|
| @@ -1296,7 +1304,7 @@ void PersonalDataManager::LogLocalCreditCardCount() const {
|
| void PersonalDataManager::LogServerCreditCardCounts() const {
|
| if (!has_logged_server_credit_card_counts_) {
|
| size_t unmasked_cards = 0, masked_cards = 0;
|
| - for (CreditCard* card : server_credit_cards_) {
|
| + for (const auto& card : server_credit_cards_) {
|
| if (card->record_type() == CreditCard::MASKED_SERVER_CARD) {
|
| masked_cards++;
|
| } else if (card->record_type() == CreditCard::FULL_SERVER_CARD) {
|
| @@ -1530,7 +1538,7 @@ bool PersonalDataManager::ImportCreditCard(
|
| // true which indicates that upload is enabled. In this case, it's useful to
|
| // present the upload prompt to the user to promote the card from a local card
|
| // to a synced server card.
|
| - for (const CreditCard* card : local_credit_cards_) {
|
| + for (const auto& card : local_credit_cards_) {
|
| // Make a local copy so that the data in |local_credit_cards_| isn't
|
| // modified directly by the UpdateFromImportedCard() call.
|
| CreditCard card_copy(*card);
|
| @@ -1551,7 +1559,7 @@ bool PersonalDataManager::ImportCreditCard(
|
| // server card, upload is guaranteed to fail. There's no mechanism for entries
|
| // with the same number but different names or expiration dates as there is
|
| // for local cards.
|
| - for (const CreditCard* card : server_credit_cards_) {
|
| + for (const auto& card : server_credit_cards_) {
|
| if (candidate_credit_card.HasSameNumberAs(*card))
|
| return false;
|
| }
|
| @@ -1563,11 +1571,11 @@ bool PersonalDataManager::ImportCreditCard(
|
| const std::vector<AutofillProfile*>& PersonalDataManager::GetProfiles(
|
| bool record_metrics) const {
|
| profiles_.clear();
|
| - profiles_.insert(profiles_.end(), web_profiles().begin(),
|
| - web_profiles().end());
|
| + for (const auto& profile : web_profiles_)
|
| + profiles_.push_back(profile.get());
|
| if (pref_service_->GetBoolean(prefs::kAutofillWalletImportEnabled)) {
|
| - profiles_.insert(
|
| - profiles_.end(), server_profiles_.begin(), server_profiles_.end());
|
| + for (const auto& profile : server_profiles_)
|
| + profiles_.push_back(profile.get());
|
| }
|
| return profiles_;
|
| }
|
| @@ -1670,7 +1678,7 @@ bool PersonalDataManager::ApplyDedupingRoutine() {
|
| is_autofill_profile_dedupe_pending_ = false;
|
|
|
| // No need to de-duplicate if there are less than two profiles.
|
| - if (web_profiles_.get().size() < 2) {
|
| + if (web_profiles_.size() < 2) {
|
| DVLOG(1) << "Autofill profile de-duplication not needed.";
|
| return false;
|
| }
|
| @@ -1685,16 +1693,15 @@ bool PersonalDataManager::ApplyDedupingRoutine() {
|
| }
|
|
|
| DVLOG(1) << "Starting autofill profile de-duplication.";
|
| - std::vector<AutofillProfile*> existing_profiles = web_profiles_.get();
|
| std::unordered_set<AutofillProfile*> profiles_to_delete;
|
| - profiles_to_delete.reserve(existing_profiles.size());
|
| + profiles_to_delete.reserve(web_profiles_.size());
|
|
|
| - DedupeProfiles(&existing_profiles, &profiles_to_delete);
|
| + DedupeProfiles(&web_profiles_, &profiles_to_delete);
|
|
|
| // Apply the changes to the database.
|
| - for (AutofillProfile* profile : existing_profiles) {
|
| + for (const auto& profile : web_profiles_) {
|
| // If the profile was set to be deleted, remove it from the database.
|
| - if (profiles_to_delete.count(profile)) {
|
| + if (profiles_to_delete.count(profile.get())) {
|
| database_->RemoveAutofillProfile(profile->guid());
|
| } else {
|
| // Otherwise, update the profile in the database.
|
| @@ -1713,7 +1720,7 @@ bool PersonalDataManager::ApplyDedupingRoutine() {
|
| }
|
|
|
| void PersonalDataManager::DedupeProfiles(
|
| - std::vector<AutofillProfile*>* existing_profiles,
|
| + std::vector<std::unique_ptr<AutofillProfile>>* existing_profiles,
|
| std::unordered_set<AutofillProfile*>* profiles_to_delete) {
|
| AutofillMetrics::LogNumberOfProfilesConsideredForDedupe(
|
| existing_profiles->size());
|
| @@ -1727,17 +1734,17 @@ void PersonalDataManager::DedupeProfiles(
|
| // similar verified profile will be discarded.
|
| base::Time comparison_time = base::Time::Now();
|
| std::sort(existing_profiles->begin(), existing_profiles->end(),
|
| - [comparison_time](const AutofillDataModel* a,
|
| - const AutofillDataModel* b) {
|
| + [comparison_time](const std::unique_ptr<AutofillProfile>& a,
|
| + const std::unique_ptr<AutofillProfile>& b) {
|
| if (a->IsVerified() != b->IsVerified())
|
| return !a->IsVerified();
|
| - return a->CompareFrecency(b, comparison_time);
|
| + return a->CompareFrecency(b.get(), comparison_time);
|
| });
|
|
|
| AutofillProfileComparator comparator(app_locale_);
|
|
|
| for (size_t i = 0; i < existing_profiles->size(); ++i) {
|
| - AutofillProfile* profile_to_merge = (*existing_profiles)[i];
|
| + AutofillProfile* profile_to_merge = (*existing_profiles)[i].get();
|
|
|
| // If the profile was set to be deleted, skip it. It has already been
|
| // merged into another profile.
|
| @@ -1752,7 +1759,7 @@ void PersonalDataManager::DedupeProfiles(
|
| // If we have not reached the last profile, try to merge |profile_to_merge|
|
| // with all the less relevant |existing_profiles|.
|
| for (size_t j = i + 1; j < existing_profiles->size(); ++j) {
|
| - AutofillProfile* existing_profile = (*existing_profiles)[j];
|
| + AutofillProfile* existing_profile = (*existing_profiles)[j].get();
|
|
|
| // Don't try to merge a profile that was already set for deletion.
|
| if (profiles_to_delete->count(existing_profile))
|
| @@ -1769,7 +1776,7 @@ void PersonalDataManager::DedupeProfiles(
|
| if (existing_profile->SaveAdditionalInfo(*profile_to_merge,
|
| app_locale_)) {
|
| // Since |profile_to_merge| was a duplicate of |existing_profile|
|
| - // and was merged sucessfully, it can now be deleted.
|
| + // and was merged successfully, it can now be deleted.
|
| profiles_to_delete->insert(profile_to_merge);
|
|
|
| // Now try to merge the new resulting profile with the rest of the
|
|
|