Index: components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc |
diff --git a/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc b/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc |
index 5baf5566b77c4b6ba794d4d7632f8b526076fdbf..ba1f3006a391b33de29fe335af28289491ef31d6 100644 |
--- a/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc |
+++ b/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc |
@@ -316,7 +316,7 @@ bool AutofillProfileSyncableService::OverwriteProfileWithServerData( |
AutofillProfile* profile, |
const std::string& app_locale) { |
bool diff = false; |
- if (profile->origin() != specifics.origin()) { |
+ if (specifics.has_origin() && profile->origin() != specifics.origin()) { |
bool was_verified = profile->IsVerified(); |
profile->set_origin(specifics.origin()); |
diff = true; |
@@ -374,6 +374,15 @@ bool AutofillProfileSyncableService::OverwriteProfileWithServerData( |
diff = UpdateField(ADDRESS_HOME_LINE2, |
specifics.address_home_line2(), profile) || diff; |
} |
+ |
+ // Update the BCP 47 language code that can be used to format the address for |
+ // display. |
+ if (specifics.has_address_home_language_code() && |
+ specifics.address_home_language_code() != profile->language_code()) { |
+ profile->set_language_code(specifics.address_home_language_code()); |
+ diff = true; |
+ } |
+ |
return diff; |
} |
@@ -431,6 +440,7 @@ void AutofillProfileSyncableService::WriteAutofillProfile( |
specifics->set_address_home_dependent_locality( |
LimitData( |
UTF16ToUTF8(profile.GetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY)))); |
+ specifics->set_address_home_language_code(LimitData(profile.language_code())); |
profile.GetRawMultiInfo(EMAIL_ADDRESS, &values); |
for (size_t i = 0; i < values.size(); ++i) { |
@@ -486,12 +496,12 @@ AutofillProfileSyncableService::CreateOrUpdateProfile( |
autofill_specifics.guid(), autofill_specifics.origin()); |
OverwriteProfileWithServerData(autofill_specifics, new_profile, app_locale_); |
- // Check if profile appears under a different guid. |
+ // Check if profile appears under a different guid or with a different origin. |
// Unverified profiles should never overwrite verified ones. |
for (GUIDToProfileMap::iterator it = profile_map->begin(); |
it != profile_map->end(); ++it) { |
AutofillProfile* local_profile = it->second; |
- if (local_profile->Compare(*new_profile) == 0) { |
+ if (local_profile->EqualsSansGuidAndOrigin(*new_profile)) { |
Ilya Sherman
2014/04/09 23:17:49
Hmm, I think this probably should still be Compare
please use gerrit instead
2014/04/09 23:43:58
True. We wouldn't want multiple profiles for the s
|
// Ensure that a verified profile can never revert back to an unverified |
// one. |
if (local_profile->IsVerified() && !new_profile->IsVerified()) { |
@@ -625,9 +635,10 @@ bool AutofillProfileSyncableService::MergeProfile( |
const AutofillProfile& merge_from, |
AutofillProfile* merge_into, |
const std::string& app_locale) { |
+ // Overwrites all single values and adds to mutli-values. Does not overwrite |
+ // GUID. |
merge_into->OverwriteWithOrAddTo(merge_from, app_locale); |
- return (merge_into->Compare(merge_from) != 0 || |
- merge_into->origin() != merge_from.origin()); |
+ return !merge_into->EqualsSansGuid(merge_from); |
} |
AutofillTable* AutofillProfileSyncableService::GetAutofillTable() const { |