| 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 64ee48432d667ad9c90c7270335c0b16cbc1f648..f86f7eacc3dbf912f930bbdbb7c7decc1c039b8c 100644
|
| --- a/chrome/browser/webdata/autocomplete_syncable_service.cc
|
| +++ b/chrome/browser/webdata/autocomplete_syncable_service.cc
|
| @@ -108,16 +108,44 @@ 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;
|
| + base::Time culling_time = base::Time::Now() -
|
| + base::TimeDelta::FromDays(AutofillEntry::kExpirationPeriodInDays);
|
| + for (size_t i = 0; i < new_synced_entries.size() && !need_to_cull_data; ++i) {
|
| + if (new_synced_entries[i].HasTimestampsOlder(culling_time))
|
| + 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))));
|
| + if (i->second.second->CullExpiredTimeStamps(culling_time))
|
| + need_to_cull_data = true;
|
| + // Sync back only the data that appeared after |culling_time|.
|
| + if (!i->second.second->timestamps().empty()) {
|
| + new_changes.push_back(
|
| + SyncChange(i->second.first, CreateSyncData(*(i->second.second))));
|
| + } else {
|
| + // Key is not on the server and is too old, it will not ever be synced -
|
| + // delete it locally.
|
| + if (SyncChange::ACTION_ADD == i->second.first)
|
| + 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_->RemoveFormElementsAddedBetween(base::Time(),
|
| + culling_time);
|
| }
|
|
|
| SyncError error = sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes);
|
| @@ -357,10 +385,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 +404,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(
|
|
|