Chromium Code Reviews| Index: chrome/browser/webdata/autocomplete_syncable_service.cc |
| diff --git a/chrome/browser/webdata/autocomplete_syncable_service.cc b/chrome/browser/webdata/autocomplete_syncable_service.cc |
| index af1cde14a5b5d40e0d27e42a3d6dcf4f89693d82..76ef2e92ba487cedc237836d56c3a356b5a997a4 100644 |
| --- a/chrome/browser/webdata/autocomplete_syncable_service.cc |
| +++ b/chrome/browser/webdata/autocomplete_syncable_service.cc |
| @@ -108,16 +108,40 @@ SyncError AutocompleteSyncableService::MergeDataAndStartSyncing( |
| CreateOrUpdateEntry(*sync_iter, &new_db_entries, &new_synced_entries); |
| } |
| + // Check if newly received items need culling. |
| + bool need_to_cull_data = false; |
| + for (size_t i = 0; i < new_synced_entries.size() && !need_to_cull_data; ++i) { |
| + if (new_synced_entries[i].IsExpired()) |
| + need_to_cull_data = true; |
| + } |
| + |
| if (!SaveChangesToWebData(new_synced_entries)) |
| return SyncError(FROM_HERE, "Failed to update webdata.", model_type()); |
| WebDataService::NotifyOfMultipleAutofillChanges(web_data_service_); |
| + keys_to_ignore_.clear(); |
| SyncChangeList new_changes; |
| for (AutocompleteEntryMap::iterator i = new_db_entries.begin(); |
| i != new_db_entries.end(); ++i) { |
| - new_changes.push_back( |
| - SyncChange(i->second.first, CreateSyncData(*(i->second.second)))); |
| + // Sync back only the data that appeared after |culling_time|. |
|
Ilya Sherman
2012/03/20 21:25:13
nit: |culling_time| is no longer a variable define
GeorgeY
2012/03/21 20:56:40
Done.
|
| + if (!i->second.second->IsExpired()) { |
| + new_changes.push_back( |
| + SyncChange(i->second.first, CreateSyncData(*(i->second.second)))); |
| + } else { |
| + need_to_cull_data = true; |
| + // Key is not on the server and is too old, it will not ever be synced - |
| + // delete it locally. |
| + if (i->second.first == SyncChange::ACTION_ADD) |
| + keys_to_ignore_.insert(i->first); |
| + } |
| + } |
| + |
| + if (need_to_cull_data) { |
| + // This will schedule deletion operation later on DB thread and we will |
| + // be notified on the results of the deletion and deletes will be synced to |
| + // the sync. |
| + web_data_service_->RemoveExpiredFormElements(); |
| } |
| SyncError error = sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes); |
| @@ -357,10 +381,12 @@ void AutocompleteSyncableService::ActOnChanges( |
| break; |
| } |
| case AutofillChange::REMOVE: { |
| - std::vector<base::Time> timestamps; |
| - AutofillEntry entry(change->key(), timestamps); |
| - new_changes.push_back(SyncChange(SyncChange::ACTION_DELETE, |
| - CreateSyncData(entry))); |
| + if (keys_to_ignore_.find(change->key()) == keys_to_ignore_.end()) { |
| + std::vector<base::Time> timestamps; |
| + AutofillEntry entry(change->key(), timestamps); |
| + new_changes.push_back(SyncChange(SyncChange::ACTION_DELETE, |
| + CreateSyncData(entry))); |
| + } |
| break; |
| } |
| default: |
| @@ -374,6 +400,8 @@ void AutocompleteSyncableService::ActOnChanges( |
| << " Failed processing change:" |
| << " Error:" << error.message(); |
| } |
| + // |keys_to_ignore_| are only needed for the very first notification. |
| + keys_to_ignore_.clear(); |
| } |
| SyncData AutocompleteSyncableService::CreateSyncData( |