Chromium Code Reviews| Index: chrome/browser/webdata/autofill_profile_syncable_service.cc |
| diff --git a/chrome/browser/webdata/autofill_profile_syncable_service.cc b/chrome/browser/webdata/autofill_profile_syncable_service.cc |
| index 60b73b5b522327ea3c75dc94d6e64c98279188f4..9e573745b7da75e7897701fb51ea03b5858c7282 100644 |
| --- a/chrome/browser/webdata/autofill_profile_syncable_service.cc |
| +++ b/chrome/browser/webdata/autofill_profile_syncable_service.cc |
| @@ -319,6 +319,15 @@ bool AutofillProfileSyncableService::OverwriteProfileWithServerData( |
| AutofillProfile* profile, |
| const std::string& app_locale) { |
| bool diff = false; |
| + if (profile->origin() != specifics.origin()) { |
| + bool was_verified = profile->IsVerified(); |
| + profile->set_origin(specifics.origin()); |
| + diff = true; |
| + |
| + // Verified profiles should never be overwritten by unverified ones. |
| + DCHECK(!was_verified || profile->IsVerified()); |
| + } |
| + |
| diff = UpdateMultivaluedField(autofill::NAME_FIRST, |
| specifics.name_first(), profile) || diff; |
| diff = UpdateMultivaluedField(autofill::NAME_MIDDLE, |
| @@ -368,6 +377,8 @@ void AutofillProfileSyncableService::WriteAutofillProfile( |
| specifics->clear_phone_home_whole_number(); |
| specifics->set_guid(profile.guid()); |
| + specifics->set_origin(profile.origin()); |
| + |
| std::vector<string16> values; |
| profile.GetRawMultiInfo(autofill::NAME_FIRST, &values); |
| for (size_t i = 0; i < values.size(); ++i) { |
| @@ -445,16 +456,23 @@ AutofillProfileSyncableService::CreateOrUpdateProfile( |
| } |
| } else { |
| // New profile synced. |
| - // TODO(isherman): Read the origin from |autofill_specifics|. |
| - AutofillProfile* new_profile( |
| - new AutofillProfile(autofill_specifics.guid(), std::string())); |
| + AutofillProfile* new_profile = new AutofillProfile( |
| + autofill_specifics.guid(), autofill_specifics.origin()); |
| OverwriteProfileWithServerData( |
| autofill_specifics, new_profile, app_locale_); |
| // Check if profile appears under a different guid. |
| + // Unverified profiles should never overwrite verified ones. |
| for (GUIDToProfileMap::iterator i = profile_map->begin(); |
| i != profile_map->end(); ++i) { |
|
Evan Stade
2013/06/12 22:12:24
nit: more readable if you create a local variable
Ilya Sherman
2013/06/13 04:19:32
Done.
|
| if (i->second->Compare(*new_profile) == 0) { |
| + // Ensure that a verified profile can never revert back to an unverified |
| + // one. |
| + if (i->second->IsVerified() && !new_profile->IsVerified()) { |
| + new_profile->set_origin(i->second->origin()); |
| + bundle->profiles_to_sync_back.push_back(new_profile); |
| + } |
| + |
| bundle->profiles_to_delete.push_back(i->second->guid()); |
| DVLOG(2) << "[AUTOFILL SYNC]" |
| << "Found in sync db but with a different guid: " |
| @@ -464,7 +482,9 @@ AutofillProfileSyncableService::CreateOrUpdateProfile( |
| << ". Profile to be deleted " << i->second->guid(); |
| profile_map->erase(i); |
| break; |
| - } else if (!i->second->PrimaryValue().empty() && |
| + } else if (!i->second->IsVerified() && |
| + !new_profile->IsVerified() && |
| + !i->second->PrimaryValue().empty() && |
| i->second->PrimaryValue() == new_profile->PrimaryValue()) { |
| // Add it to candidates for merge - if there is no profile with this |
| // guid we will merge them. |
| @@ -581,8 +601,11 @@ bool AutofillProfileSyncableService::MergeProfile( |
| const AutofillProfile& merge_from, |
| AutofillProfile* merge_into, |
| const std::string& app_locale) { |
| + DCHECK(!merge_into->IsVerified() || merge_from.IsVerified()); |
| + merge_into->set_origin(merge_from.origin()); |
| merge_into->OverwriteWithOrAddTo(merge_from, app_locale); |
| - return (merge_into->Compare(merge_from) != 0); |
| + return (merge_into->Compare(merge_from) != 0 || |
| + merge_into->origin() != merge_from.origin()); |
| } |
| AutofillTable* AutofillProfileSyncableService::GetAutofillTable() const { |