summaryrefslogtreecommitdiffstats
path: root/components/sync_driver
diff options
context:
space:
mode:
authorstanisc <stanisc@chromium.org>2015-01-13 08:18:44 -0800
committerCommit bot <commit-bot@chromium.org>2015-01-13 16:20:24 +0000
commit77c3c0b325b1154fcf2ec3708217cd34794e904f (patch)
tree7308654a71fc4bb84542049736fa506634753e11 /components/sync_driver
parent8c61ffcb737c9cb45e15114b117830d58784b19f (diff)
downloadchromium_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')
-rw-r--r--components/sync_driver/device_info_sync_service.cc12
-rw-r--r--components/sync_driver/device_info_sync_service.h1
-rw-r--r--components/sync_driver/device_info_sync_service_unittest.cc14
-rw-r--r--components/sync_driver/device_info_tracker.h2
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.