| Index: components/autofill/browser/personal_data_manager.cc
|
| diff --git a/components/autofill/browser/personal_data_manager.cc b/components/autofill/browser/personal_data_manager.cc
|
| index a3995485e567040d7f3716867acd3910d225dff9..dac1648d62dd4f35e8000796f1f78841af578861 100644
|
| --- a/components/autofill/browser/personal_data_manager.cc
|
| +++ b/components/autofill/browser/personal_data_manager.cc
|
| @@ -725,41 +725,41 @@ bool PersonalDataManager::IsValidLearnableProfile(
|
|
|
| // static
|
| bool PersonalDataManager::MergeProfile(
|
| - const AutofillProfile& profile,
|
| + const AutofillProfile& new_profile,
|
| const std::vector<AutofillProfile*>& existing_profiles,
|
| const std::string& app_locale,
|
| std::vector<AutofillProfile>* merged_profiles) {
|
| merged_profiles->clear();
|
|
|
| - // Set to true if |profile| is merged into |existing_profiles|.
|
| - bool merged = false;
|
| + // Set to true if |existing_profiles| already contains an equivalent profile.
|
| + bool matching_profile_found = false;
|
|
|
| // If we have already saved this address, merge in any missing values.
|
| // Only merge with the first match.
|
| for (std::vector<AutofillProfile*>::const_iterator iter =
|
| existing_profiles.begin();
|
| iter != existing_profiles.end(); ++iter) {
|
| - if (!merged) {
|
| - if (!profile.PrimaryValue().empty() &&
|
| - StringToLowerASCII((*iter)->PrimaryValue()) ==
|
| - StringToLowerASCII(profile.PrimaryValue())) {
|
| - merged = true;
|
| -
|
| - // Automatically aggregated profiles should never overwrite explicitly
|
| - // user-entered ones. If one would, just drop it.
|
| - DCHECK(!profile.IsVerified());
|
| - if (!(*iter)->IsVerified())
|
| - (*iter)->OverwriteWithOrAddTo(profile, app_locale);
|
| - }
|
| + AutofillProfile* existing_profile = *iter;
|
| + if (!matching_profile_found &&
|
| + !new_profile.PrimaryValue().empty() &&
|
| + StringToLowerASCII(existing_profile->PrimaryValue()) ==
|
| + StringToLowerASCII(new_profile.PrimaryValue())) {
|
| + // Unverified profiles should always be updated with the newer data,
|
| + // whereas verified profiles should only ever be overwritten by verified
|
| + // data. If an automatically aggregated profile would overwrite a
|
| + // verified profile, just drop it.
|
| + matching_profile_found = true;
|
| + if (!existing_profile->IsVerified() || new_profile.IsVerified())
|
| + existing_profile->OverwriteWithOrAddTo(new_profile, app_locale);
|
| }
|
| - merged_profiles->push_back(**iter);
|
| + merged_profiles->push_back(*existing_profile);
|
| }
|
|
|
| // If the new profile was not merged with an existing one, add it to the list.
|
| - if (!merged)
|
| - merged_profiles->push_back(profile);
|
| + if (!matching_profile_found)
|
| + merged_profiles->push_back(new_profile);
|
|
|
| - return merged;
|
| + return matching_profile_found;
|
| }
|
|
|
| void PersonalDataManager::SetProfiles(std::vector<AutofillProfile>* profiles) {
|
|
|