diff options
author | stanisc <stanisc@chromium.org> | 2015-01-13 08:18:44 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-13 16:20:24 +0000 |
commit | 77c3c0b325b1154fcf2ec3708217cd34794e904f (patch) | |
tree | 7308654a71fc4bb84542049736fa506634753e11 /components/sync_driver | |
parent | 8c61ffcb737c9cb45e15114b117830d58784b19f (diff) | |
download | chromium_src-77c3c0b325b1154fcf2ec3708217cd34794e904f.zip chromium_src-77c3c0b325b1154fcf2ec3708217cd34794e904f.tar.gz chromium_src-77c3c0b325b1154fcf2ec3708217cd34794e904f.tar.bz2 |
Sync: Allow DeviceInfoTracker listener to be set early.
ProfileSyncService::GetDeviceInfoTracker implementation
returns NULL when DeviceInfo datatype isn't syncing.
This makes it impossible to register DeviceInfo observer
in advance.
This problem was introduced during recent refactoring of
DeviceInfo datatype when all functionality related to
consumption of synced DeviceInfo has been moved to a separate
interface called DeviceInfoTracker.
In fact ProfileSyncService doesn't have to return NULL. It
was done primarily to preserve the previously existing
access pattern to DeviceInfo synced data.
Description of the fix:
1) ProfileSyncService::GetDeviceInfoTracker() now returns
a non-NULL pointer to DeviceInfoTracker regardless of
DeviceInfo datatype state.
2) DeviceInfoTracker.IsSyncing method is used to check
whether DeviceInfo data is available.
3) Made minor changes in UI and extensions code depending on
GetDeviceInfoTracker().
Adding a unit test for this particular scenario at
ProfileSyncService turned out to be non-trivial. However
there are already unit tests for this functionality at
DeviceInfoSyncService level.
I've also tested this code with a demo signedInDevices
API extension.
BUG=446493
Review URL: https://codereview.chromium.org/843633002
Cr-Commit-Position: refs/heads/master@{#311276}
Diffstat (limited to 'components/sync_driver')
4 files changed, 28 insertions, 1 deletions
diff --git a/components/sync_driver/device_info_sync_service.cc b/components/sync_driver/device_info_sync_service.cc index cdb98e1..76ea831 100644 --- a/components/sync_driver/device_info_sync_service.cc +++ b/components/sync_driver/device_info_sync_service.cc @@ -40,7 +40,7 @@ SyncMergeResult DeviceInfoSyncService::MergeDataAndStartSyncing( DCHECK(error_handler.get()); DCHECK_EQ(type, syncer::DEVICE_INFO); - DCHECK(all_data_.empty()); + DCHECK(!IsSyncing()); sync_processor_ = sync_processor.Pass(); error_handler_ = error_handler.Pass(); @@ -131,11 +131,21 @@ SyncMergeResult DeviceInfoSyncService::MergeDataAndStartSyncing( return result; } +bool DeviceInfoSyncService::IsSyncing() const { + return !all_data_.empty(); +} + void DeviceInfoSyncService::StopSyncing(syncer::ModelType type) { + bool was_syncing = IsSyncing(); + all_data_.clear(); sync_processor_.reset(); error_handler_.reset(); clear_local_device_backup_time(); + + if (was_syncing) { + NotifyObservers(); + } } SyncDataList DeviceInfoSyncService::GetAllSyncData( diff --git a/components/sync_driver/device_info_sync_service.h b/components/sync_driver/device_info_sync_service.h index a214fc0..5255155 100644 --- a/components/sync_driver/device_info_sync_service.h +++ b/components/sync_driver/device_info_sync_service.h @@ -37,6 +37,7 @@ class DeviceInfoSyncService : public syncer::SyncableService, const syncer::SyncChangeList& change_list) override; // DeviceInfoTracker implementation. + bool IsSyncing() const override; scoped_ptr<DeviceInfo> GetDeviceInfo( const std::string& client_id) const override; ScopedVector<DeviceInfo> GetAllDeviceInfo() const override; diff --git a/components/sync_driver/device_info_sync_service_unittest.cc b/components/sync_driver/device_info_sync_service_unittest.cc index b083e12..1eb5116 100644 --- a/components/sync_driver/device_info_sync_service_unittest.cc +++ b/components/sync_driver/device_info_sync_service_unittest.cc @@ -156,12 +156,15 @@ class DeviceInfoSyncServiceTest : public testing::Test, // Sync with empty initial data. TEST_F(DeviceInfoSyncServiceTest, StartSyncEmptyInitialData) { + EXPECT_FALSE(sync_service_->IsSyncing()); + SyncMergeResult merge_result = sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, SyncDataList(), PassProcessor(), CreateAndPassSyncErrorFactory()); + EXPECT_TRUE(sync_service_->IsSyncing()); EXPECT_EQ(0, merge_result.num_items_added()); EXPECT_EQ(0, merge_result.num_items_modified()); EXPECT_EQ(0, merge_result.num_items_deleted()); @@ -179,6 +182,17 @@ TEST_F(DeviceInfoSyncServiceTest, StartSyncEmptyInitialData) { EXPECT_FALSE(sync_service_->GetDeviceInfo("guid_0")); } +TEST_F(DeviceInfoSyncServiceTest, StopSyncing) { + SyncMergeResult merge_result = sync_service_->MergeDataAndStartSyncing( + syncer::DEVICE_INFO, SyncDataList(), PassProcessor(), + CreateAndPassSyncErrorFactory()); + EXPECT_TRUE(sync_service_->IsSyncing()); + EXPECT_EQ(1, num_device_info_changed_callbacks_); + sync_service_->StopSyncing(syncer::DEVICE_INFO); + EXPECT_FALSE(sync_service_->IsSyncing()); + EXPECT_EQ(2, num_device_info_changed_callbacks_); +} + // Sync with initial data matching the local device data. TEST_F(DeviceInfoSyncServiceTest, StartSyncMatchingInitialData) { SyncDataList sync_data; diff --git a/components/sync_driver/device_info_tracker.h b/components/sync_driver/device_info_tracker.h index cad6e87..4c90530 100644 --- a/components/sync_driver/device_info_tracker.h +++ b/components/sync_driver/device_info_tracker.h @@ -22,6 +22,8 @@ class DeviceInfoTracker { virtual void OnDeviceInfoChange() = 0; }; + // Returns true when DeviceInfo datatype is enabled and syncing. + virtual bool IsSyncing() const = 0; // Gets DeviceInfo the synced device with specified client ID. // Returns an empty scoped_ptr if device with the given |client_id| hasn't // been synced. |