diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-11 04:58:24 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-11 04:58:24 +0000 |
commit | 418b75e0f077a184e6f1ae81f7e41e98454706dd (patch) | |
tree | 9057712927d66f7e29e2981840cc86304e3d2d59 /chrome/browser/sync | |
parent | 39607f7425de9ec7b89a593ae16f24b7b1198d8c (diff) | |
download | chromium_src-418b75e0f077a184e6f1ae81f7e41e98454706dd.zip chromium_src-418b75e0f077a184e6f1ae81f7e41e98454706dd.tar.gz chromium_src-418b75e0f077a184e6f1ae81f7e41e98454706dd.tar.bz2 |
[Sync] Refactor data type configuration/activation/deactivation
Changed ConfigureDataTypes to take a set of types to add and a set of types to remove.
Changed Activate/DeactivateDataType to take ModelTypes instead of
the DataTypeControllers directly.
BUG=
TEST=
Review URL: http://codereview.chromium.org/7511004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96326 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/sync')
24 files changed, 229 insertions, 278 deletions
diff --git a/chrome/browser/sync/glue/app_change_processor.cc b/chrome/browser/sync/glue/app_change_processor.cc index 31e2624..f8e69a8 100644 --- a/chrome/browser/sync/glue/app_change_processor.cc +++ b/chrome/browser/sync/glue/app_change_processor.cc @@ -14,6 +14,7 @@ #include "chrome/browser/sync/glue/extension_sync.h" #include "chrome/browser/sync/glue/extension_util.h" #include "chrome/browser/sync/protocol/extension_specifics.pb.h" +#include "chrome/browser/sync/unrecoverable_error_handler.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/extensions/extension.h" #include "content/browser/browser_thread.h" diff --git a/chrome/browser/sync/glue/autofill_data_type_controller_unittest.cc b/chrome/browser/sync/glue/autofill_data_type_controller_unittest.cc index f3f88e6..f975491 100644 --- a/chrome/browser/sync/glue/autofill_data_type_controller_unittest.cc +++ b/chrome/browser/sync/glue/autofill_data_type_controller_unittest.cc @@ -127,12 +127,12 @@ class AutofillDataTypeControllerTest : public TestingBrowserProcessTest { WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); EXPECT_CALL(*model_associator_, AssociateModels(_)). WillRepeatedly(Return(true)); - EXPECT_CALL(service_, ActivateDataType(_, _)); + EXPECT_CALL(service_, ActivateDataType(_, _, _)); EXPECT_CALL(*change_processor_, IsRunning()).WillRepeatedly(Return(true)); } void SetStopExpectations() { - EXPECT_CALL(service_, DeactivateDataType(_, _)); + EXPECT_CALL(service_, DeactivateDataType(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_)); } @@ -182,7 +182,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhilePDMStarting) { autofill_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); EXPECT_EQ(DataTypeController::MODEL_STARTING, autofill_dtc_->state()); - EXPECT_CALL(service_, DeactivateDataType(_, _)).Times(0); + EXPECT_CALL(service_, DeactivateDataType(_)).Times(0); EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED, _)); autofill_dtc_->Stop(); EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state()); @@ -200,7 +200,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileWDSStarting) { autofill_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); EXPECT_EQ(DataTypeController::MODEL_STARTING, autofill_dtc_->state()); - EXPECT_CALL(service_, DeactivateDataType(_, _)).Times(0); + EXPECT_CALL(service_, DeactivateDataType(_)).Times(0); EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED, _)); autofill_dtc_->Stop(); EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state()); @@ -240,7 +240,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileAssociatingNotActivated) { wait_for_db_thread_pause.Wait(); EXPECT_EQ(DataTypeController::ASSOCIATING, autofill_dtc_->state()); - EXPECT_CALL(service_, DeactivateDataType(_, _)).Times(0); + EXPECT_CALL(service_, DeactivateDataType(_)); EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED, _)); autofill_dtc_->Stop(); EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state()); @@ -269,7 +269,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileAssociatingActivated) { // ActivateDataType() before allowing it to continue. WaitableEvent pause_db_thread(false, false); WaitableEvent wait_for_db_thread_pause(false, false); - EXPECT_CALL(service_, ActivateDataType(_, _)). + EXPECT_CALL(service_, ActivateDataType(_, _, _)). WillOnce(DoAll( SignalEvent(&wait_for_db_thread_pause), WaitOnEvent(&pause_db_thread))); diff --git a/chrome/browser/sync/glue/bookmark_data_type_controller_unittest.cc b/chrome/browser/sync/glue/bookmark_data_type_controller_unittest.cc index e034c3f..79a5348 100644 --- a/chrome/browser/sync/glue/bookmark_data_type_controller_unittest.cc +++ b/chrome/browser/sync/glue/bookmark_data_type_controller_unittest.cc @@ -77,11 +77,11 @@ class BookmarkDataTypeControllerTest : public TestingBrowserProcessTest { WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); EXPECT_CALL(*model_associator_, AssociateModels(_)). WillRepeatedly(Return(true)); - EXPECT_CALL(service_, ActivateDataType(_, _)); + EXPECT_CALL(service_, ActivateDataType(_, _, _)); } void SetStopExpectations() { - EXPECT_CALL(service_, DeactivateDataType(_, _)); + EXPECT_CALL(service_, DeactivateDataType(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_)); } diff --git a/chrome/browser/sync/glue/data_type_manager_impl.cc b/chrome/browser/sync/glue/data_type_manager_impl.cc index 4a957e6..fed4319 100644 --- a/chrome/browser/sync/glue/data_type_manager_impl.cc +++ b/chrome/browser/sync/glue/data_type_manager_impl.cc @@ -209,9 +209,26 @@ void DataTypeManagerImpl::Restart(sync_api::ConfigureReason reason, // Tell the backend about the new set of data types we wish to sync. // The task will be invoked when updates are downloaded. state_ = DOWNLOAD_PENDING; + // Hopefully http://crbug.com/79970 will make this less verbose. + syncable::ModelTypeSet all_types; + const syncable::ModelTypeSet& types_to_add = last_requested_types_; + syncable::ModelTypeSet types_to_remove; + for (DataTypeController::TypeMap::const_iterator it = + controllers_.begin(); it != controllers_.end(); ++it) { + all_types.insert(it->first); + } + // Check that types_to_add \subseteq all_types. + DCHECK(std::includes(all_types.begin(), all_types.end(), + types_to_add.begin(), types_to_add.end())); + // Set types_to_remove to all_types \setminus types_to_add. + ignore_result( + std::set_difference( + all_types.begin(), all_types.end(), + types_to_add.begin(), types_to_add.end(), + std::inserter(types_to_remove, types_to_remove.end()))); backend_->ConfigureDataTypes( - controllers_, - last_requested_types_, + types_to_add, + types_to_remove, reason, base::Bind(&DataTypeManagerImpl::DownloadReady, weak_ptr_factory_.GetWeakPtr()), diff --git a/chrome/browser/sync/glue/data_type_manager_impl.h b/chrome/browser/sync/glue/data_type_manager_impl.h index 65db005..28c9751 100644 --- a/chrome/browser/sync/glue/data_type_manager_impl.h +++ b/chrome/browser/sync/glue/data_type_manager_impl.h @@ -31,6 +31,7 @@ class DataTypeManagerImpl : public DataTypeManager { virtual void Configure(const TypeSet& desired_types, sync_api::ConfigureReason reason); + // Needed only for backend migration. virtual void ConfigureWithoutNigori(const TypeSet& desired_types, sync_api::ConfigureReason reason); diff --git a/chrome/browser/sync/glue/data_type_manager_impl_unittest.cc b/chrome/browser/sync/glue/data_type_manager_impl_unittest.cc index 17701e5..5ae48b1 100644 --- a/chrome/browser/sync/glue/data_type_manager_impl_unittest.cc +++ b/chrome/browser/sync/glue/data_type_manager_impl_unittest.cc @@ -315,8 +315,8 @@ TEST_F(DataTypeManagerImplTest, ConfigureOneThenSwitch) { } void DoConfigureDataTypes( - const DataTypeController::TypeMap& data_type_controllers, - const syncable::ModelTypeSet& types, + const syncable::ModelTypeSet& types_to_add, + const syncable::ModelTypeSet& types_to_remove, sync_api::ConfigureReason reason, base::Callback<void(bool)> ready_task, bool enable_nigori) { diff --git a/chrome/browser/sync/glue/extension_change_processor.cc b/chrome/browser/sync/glue/extension_change_processor.cc index 9d6ed26..6d97dc4 100644 --- a/chrome/browser/sync/glue/extension_change_processor.cc +++ b/chrome/browser/sync/glue/extension_change_processor.cc @@ -14,6 +14,7 @@ #include "chrome/browser/sync/glue/extension_sync.h" #include "chrome/browser/sync/glue/extension_util.h" #include "chrome/browser/sync/protocol/extension_specifics.pb.h" +#include "chrome/browser/sync/unrecoverable_error_handler.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/extensions/extension.h" #include "content/browser/browser_thread.h" diff --git a/chrome/browser/sync/glue/extension_data_type_controller_unittest.cc b/chrome/browser/sync/glue/extension_data_type_controller_unittest.cc index 753d128..cdd22de 100644 --- a/chrome/browser/sync/glue/extension_data_type_controller_unittest.cc +++ b/chrome/browser/sync/glue/extension_data_type_controller_unittest.cc @@ -65,11 +65,11 @@ class ExtensionDataTypeControllerTest : public TestingBrowserProcessTest { } void SetActivateExpectations() { - EXPECT_CALL(service_, ActivateDataType(_, _)); + EXPECT_CALL(service_, ActivateDataType(_, _, _)); } void SetStopExpectations() { - EXPECT_CALL(service_, DeactivateDataType(_, _)); + EXPECT_CALL(service_, DeactivateDataType(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_)); } diff --git a/chrome/browser/sync/glue/frontend_data_type_controller.cc b/chrome/browser/sync/glue/frontend_data_type_controller.cc index 6d99787..aac04d8 100644 --- a/chrome/browser/sync/glue/frontend_data_type_controller.cc +++ b/chrome/browser/sync/glue/frontend_data_type_controller.cc @@ -101,7 +101,8 @@ bool FrontendDataTypeController::Associate() { return false; } - sync_service_->ActivateDataType(this, change_processor_.get()); + sync_service_->ActivateDataType(type(), model_safe_group(), + change_processor_.get()); state_ = RUNNING; FinishStart(!sync_has_nodes ? OK_FIRST_RUN : OK, FROM_HERE); return true; @@ -151,8 +152,7 @@ void FrontendDataTypeController::Stop() { CleanUpState(); - if (change_processor_.get()) - sync_service_->DeactivateDataType(this, change_processor_.get()); + sync_service_->DeactivateDataType(type()); if (model_associator()) { SyncError error; diff --git a/chrome/browser/sync/glue/frontend_data_type_controller_unittest.cc b/chrome/browser/sync/glue/frontend_data_type_controller_unittest.cc index 5a8a1cf..c0374bc 100644 --- a/chrome/browser/sync/glue/frontend_data_type_controller_unittest.cc +++ b/chrome/browser/sync/glue/frontend_data_type_controller_unittest.cc @@ -118,13 +118,13 @@ class FrontendDataTypeControllerTest : public TestingBrowserProcessTest { } void SetActivateExpectations(DataTypeController::StartResult result) { - EXPECT_CALL(service_, ActivateDataType(_, _)); + EXPECT_CALL(service_, ActivateDataType(_, _, _)); EXPECT_CALL(start_callback_, Run(result,_)); } void SetStopExpectations() { EXPECT_CALL(*dtc_mock_, CleanUpState()); - EXPECT_CALL(service_, DeactivateDataType(_, _)); + EXPECT_CALL(service_, DeactivateDataType(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_)); } diff --git a/chrome/browser/sync/glue/generic_change_processor.cc b/chrome/browser/sync/glue/generic_change_processor.cc index 4d7e154..28aa4f0 100644 --- a/chrome/browser/sync/glue/generic_change_processor.cc +++ b/chrome/browser/sync/glue/generic_change_processor.cc @@ -11,6 +11,7 @@ #include "chrome/browser/sync/api/sync_error.h" #include "chrome/browser/sync/engine/syncapi.h" #include "chrome/browser/sync/syncable/nigori_util.h" +#include "chrome/browser/sync/unrecoverable_error_handler.h" namespace browser_sync { diff --git a/chrome/browser/sync/glue/non_frontend_data_type_controller.cc b/chrome/browser/sync/glue/non_frontend_data_type_controller.cc index 96d6843..11b54ed 100644 --- a/chrome/browser/sync/glue/non_frontend_data_type_controller.cc +++ b/chrome/browser/sync/glue/non_frontend_data_type_controller.cc @@ -113,7 +113,8 @@ void NonFrontendDataTypeController::StartAssociation() { return; } - profile_sync_service_->ActivateDataType(this, change_processor_.get()); + profile_sync_service_->ActivateDataType(type(), model_safe_group(), + change_processor_.get()); StartDone(!sync_has_nodes ? OK_FIRST_RUN : OK, RUNNING, FROM_HERE); } @@ -199,8 +200,7 @@ void NonFrontendDataTypeController::Stop() { // Deactivate the change processor on the UI thread. We dont want to listen // for any more changes or process them from server. - if (change_processor_.get()) - profile_sync_service_->DeactivateDataType(this, change_processor_.get()); + profile_sync_service_->DeactivateDataType(type()); if (StopAssociationAsync()) { datatype_stopped_.Wait(); diff --git a/chrome/browser/sync/glue/non_frontend_data_type_controller_unittest.cc b/chrome/browser/sync/glue/non_frontend_data_type_controller_unittest.cc index a791e6e..154a93c 100644 --- a/chrome/browser/sync/glue/non_frontend_data_type_controller_unittest.cc +++ b/chrome/browser/sync/glue/non_frontend_data_type_controller_unittest.cc @@ -159,14 +159,14 @@ class NonFrontendDataTypeControllerTest : public TestingBrowserProcessTest { } void SetActivateExpectations(DataTypeController::StartResult result) { - EXPECT_CALL(service_, ActivateDataType(_, _)); + EXPECT_CALL(service_, ActivateDataType(_, _, _)); EXPECT_CALL(start_callback_, Run(result,_)); } void SetStopExpectations() { EXPECT_CALL(*dtc_mock_, StopAssociationAsync()); EXPECT_CALL(*dtc_mock_, StopModels()); - EXPECT_CALL(service_, DeactivateDataType(_, _)); + EXPECT_CALL(service_, DeactivateDataType(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_)); } @@ -312,7 +312,7 @@ TEST_F(NonFrontendDataTypeControllerTest, AbortDuringAssociationInactive) { SignalEvent(&pause_db_thread)); EXPECT_CALL(*model_associator_, AssociateModels(_)).WillOnce(Return(true)); EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_)); - EXPECT_CALL(service_, ActivateDataType(_, _)); + EXPECT_CALL(service_, ActivateDataType(_, _, _)); EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_)); EXPECT_CALL(*dtc_mock_, RecordStartFailure(DataTypeController::ABORTED)); SetStopExpectations(); @@ -342,7 +342,7 @@ TEST_F(NonFrontendDataTypeControllerTest, AbortDuringAssociationActivated) { EXPECT_CALL(*model_associator_, AssociateModels(_)). WillOnce(Return(true)); EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_)); - EXPECT_CALL(service_, ActivateDataType(_, _)).WillOnce(DoAll( + EXPECT_CALL(service_, ActivateDataType(_, _, _)).WillOnce(DoAll( SignalEvent(&wait_for_db_thread_pause), WaitOnEvent(&pause_db_thread))); EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_)); diff --git a/chrome/browser/sync/glue/preference_data_type_controller_unittest.cc b/chrome/browser/sync/glue/preference_data_type_controller_unittest.cc index 9cb955a..9f0a299 100644 --- a/chrome/browser/sync/glue/preference_data_type_controller_unittest.cc +++ b/chrome/browser/sync/glue/preference_data_type_controller_unittest.cc @@ -67,11 +67,11 @@ class PreferenceDataTypeControllerTest : public TestingBrowserProcessTest { } void SetActivateExpectations() { - EXPECT_CALL(service_, ActivateDataType(_, _)); + EXPECT_CALL(service_, ActivateDataType(_, _, _)); } void SetStopExpectations() { - EXPECT_CALL(service_, DeactivateDataType(_, _)); + EXPECT_CALL(service_, DeactivateDataType(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_)); } diff --git a/chrome/browser/sync/glue/sync_backend_host.cc b/chrome/browser/sync/glue/sync_backend_host.cc index 86f4478..cac510d 100644 --- a/chrome/browser/sync/glue/sync_backend_host.cc +++ b/chrome/browser/sync/glue/sync_backend_host.cc @@ -49,7 +49,6 @@ static const int kSaveChangesIntervalSeconds = 10; static const FilePath::CharType kSyncDataFolderName[] = FILE_PATH_LITERAL("Sync Data"); -using browser_sync::DataTypeController; typedef TokenService::TokenAvailableDetails TokenAvailableDetails; typedef GoogleServiceAuthError AuthError; @@ -96,7 +95,7 @@ void SyncBackendHost::Initialize( SyncFrontend* frontend, const WeakHandle<JsEventHandler>& event_handler, const GURL& sync_service_url, - const syncable::ModelTypeSet& types, + const syncable::ModelTypeSet& initial_types, const SyncCredentials& credentials, bool delete_sync_data_folder) { if (!sync_thread_.Start()) @@ -114,8 +113,8 @@ void SyncBackendHost::Initialize( // Any datatypes that we want the syncer to pull down must // be in the routing_info map. We set them to group passive, meaning that // updates will be applied to sync, but not dispatched to the native models. - for (syncable::ModelTypeSet::const_iterator it = types.begin(); - it != types.end(); ++it) { + for (syncable::ModelTypeSet::const_iterator it = initial_types.begin(); + it != initial_types.end(); ++it) { registrar_.routing_info[(*it)] = GROUP_PASSIVE; } @@ -128,8 +127,8 @@ void SyncBackendHost::Initialize( registrar_.workers[GROUP_PASSWORD] = new PasswordModelWorker(password_store); } else { - LOG_IF(WARNING, types.count(syncable::PASSWORDS) > 0) << "Password store " - << "not initialized, cannot sync passwords"; + LOG_IF(WARNING, initial_types.count(syncable::PASSWORDS) > 0) + << "Password store not initialized, cannot sync passwords"; registrar_.routing_info.erase(syncable::PASSWORDS); } @@ -281,82 +280,74 @@ SyncBackendHost::PendingConfigureDataTypesState:: ~PendingConfigureDataTypesState() {} void SyncBackendHost::GetPendingConfigModeState( - const DataTypeController::TypeMap& data_type_controllers, - const syncable::ModelTypeSet& types, + const syncable::ModelTypeSet& types_to_add, + const syncable::ModelTypeSet& types_to_remove, base::Callback<void(bool)> ready_task, ModelSafeRoutingInfo* routing_info, sync_api::ConfigureReason reason, - bool nigori_enabled, - SyncBackendHost::PendingConfigureDataTypesState* state, - bool* deleted_type) { + SyncBackendHost::PendingConfigureDataTypesState* state) { + if (DCHECK_IS_ON()) { + syncable::ModelTypeSet intersection; + std::set_intersection( + types_to_add.begin(), types_to_add.end(), + types_to_remove.begin(), types_to_remove.end(), + std::inserter(intersection, intersection.end())); + DCHECK(intersection.empty()); + } *state = SyncBackendHost::PendingConfigureDataTypesState(); - *deleted_type = false; - for (DataTypeController::TypeMap::const_iterator it = - data_type_controllers.begin(); - it != data_type_controllers.end(); ++it) { - syncable::ModelType type = it->first; - // If a type is not specified, remove it from the routing_info. - if (types.count(type) == 0) { - *deleted_type = true; - routing_info->erase(type); - } else { - // Add a newly specified data type as GROUP_PASSIVE into the - // routing_info, if it does not already exist. - if (routing_info->count(type) == 0) { - (*routing_info)[type] = GROUP_PASSIVE; - state->added_types.set(type); - } + + for (syncable::ModelTypeSet::const_iterator it = types_to_add.begin(); + it != types_to_add.end(); ++it) { + syncable::ModelType type = *it; + // Add a newly specified data type as GROUP_PASSIVE into the + // routing_info, if it does not already exist. + if (routing_info->count(type) == 0) { + (*routing_info)[type] = GROUP_PASSIVE; + state->added_types.insert(type); } } - // We must handle NIGORI separately as it has no DataTypeController. - if (types.count(syncable::NIGORI) == 0) { - if (nigori_enabled) { // Nigori is currently enabled. - *deleted_type = true; - routing_info->erase(syncable::NIGORI); - // IsNigoriEnabled is now false. - } - } else { // Nigori needs to be enabled. - if (!nigori_enabled) { - // Currently it is disabled. So enable it. - (*routing_info)[syncable::NIGORI] = GROUP_PASSIVE; - state->added_types.set(syncable::NIGORI); - } + for (syncable::ModelTypeSet::const_iterator it = types_to_remove.begin(); + it != types_to_remove.end(); ++it) { + routing_info->erase(*it); } state->ready_task = ready_task; - state->initial_types = types; + state->types_to_add = types_to_add; state->reason = reason; } void SyncBackendHost::ConfigureDataTypes( - const DataTypeController::TypeMap& data_type_controllers, - const syncable::ModelTypeSet& types, + const syncable::ModelTypeSet& types_to_add, + const syncable::ModelTypeSet& types_to_remove, sync_api::ConfigureReason reason, base::Callback<void(bool)> ready_task, bool enable_nigori) { + syncable::ModelTypeSet types_to_add_with_nigori = types_to_add; + syncable::ModelTypeSet types_to_remove_with_nigori = types_to_remove; + if (enable_nigori) { + types_to_add_with_nigori.insert(syncable::NIGORI); + types_to_remove_with_nigori.erase(syncable::NIGORI); + } else { + types_to_add_with_nigori.erase(syncable::NIGORI); + types_to_remove_with_nigori.insert(syncable::NIGORI); + } // Only one configure is allowed at a time. DCHECK(!pending_config_mode_state_.get()); DCHECK(!pending_download_state_.get()); DCHECK_GT(initialization_state_, NOT_INITIALIZED); - syncable::ModelTypeSet types_copy = types; - if (enable_nigori) { - types_copy.insert(syncable::NIGORI); - } - bool nigori_currently_enabled = IsNigoriEnabled(); pending_config_mode_state_.reset(new PendingConfigureDataTypesState()); - bool deleted_type = false; { base::AutoLock lock(registrar_lock_); - GetPendingConfigModeState(data_type_controllers, types_copy, - ready_task, ®istrar_.routing_info, reason, - nigori_currently_enabled, - pending_config_mode_state_.get(), - &deleted_type); + GetPendingConfigModeState(types_to_add_with_nigori, + types_to_remove_with_nigori, + ready_task, + ®istrar_.routing_info, reason, + pending_config_mode_state_.get()); } - if (deleted_type) { + if (!types_to_remove.empty()) { sync_thread_.message_loop()->PostTask( FROM_HERE, NewRunnableMethod( @@ -392,7 +383,7 @@ void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop() { VLOG(1) << "Syncer in config mode. SBH executing" << "FinishConfigureDataTypesOnFrontendLoop"; - if (pending_config_mode_state_->added_types.none() && + if (pending_config_mode_state_->added_types.empty() && !core_->sync_manager()->InitialSyncEndedForAllEnabledTypes()) { LOG(WARNING) << "No new types, but initial sync not finished." << "Possible sync db corruption / removal."; @@ -401,13 +392,12 @@ void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop() { // types that are needed... but this is a rare corruption edge case or // implies the user mucked around with their syncdb, so for now do all. pending_config_mode_state_->added_types = - syncable::ModelTypeBitSetFromSet( - pending_config_mode_state_->initial_types); + pending_config_mode_state_->types_to_add; } // If we've added types, we always want to request a nudge/config (even if // the initial sync is ended), in case we could not decrypt the data. - if (pending_config_mode_state_->added_types.none()) { + if (pending_config_mode_state_->added_types.empty()) { VLOG(1) << "SyncBackendHost(" << this << "): No new types added. " << "Calling ready_task directly"; // No new types - just notify the caller that the types are available. @@ -415,15 +405,18 @@ void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop() { } else { pending_download_state_.reset(pending_config_mode_state_.release()); - syncable::ModelTypeBitSet types_copy(pending_download_state_->added_types); - if (IsNigoriEnabled()) - types_copy.set(syncable::NIGORI); + // Always configure nigori if it's enabled. + syncable::ModelTypeSet types_to_config = + pending_download_state_->added_types; + if (IsNigoriEnabled()) { + types_to_config.insert(syncable::NIGORI); + } VLOG(1) << "SyncBackendHost(" << this << "):New Types added. " << "Calling DoRequestConfig"; sync_thread_.message_loop()->PostTask(FROM_HERE, NewRunnableMethod(core_.get(), &SyncBackendHost::Core::DoRequestConfig, - types_copy, + syncable::ModelTypeBitSetFromSet(types_to_config), pending_download_state_->reason)); } @@ -449,18 +442,17 @@ syncable::ModelTypeSet SyncBackendHost::GetEncryptedDataTypes() const { } void SyncBackendHost::ActivateDataType( - DataTypeController* data_type_controller, + syncable::ModelType type, ModelSafeGroup group, ChangeProcessor* change_processor) { base::AutoLock lock(registrar_lock_); // Ensure that the given data type is in the PASSIVE group. browser_sync::ModelSafeRoutingInfo::iterator i = - registrar_.routing_info.find(data_type_controller->type()); + registrar_.routing_info.find(type); DCHECK(i != registrar_.routing_info.end()); DCHECK((*i).second == GROUP_PASSIVE); - syncable::ModelType type = data_type_controller->type(); // Change the data type's routing info to its group. - registrar_.routing_info[type] = data_type_controller->model_safe_group(); + registrar_.routing_info[type] = group; // Add the data type's change processor to the list of change // processors so it can receive updates. @@ -469,19 +461,21 @@ void SyncBackendHost::ActivateDataType( // Start the change processor. change_processor->Start(profile_, GetUserShare()); + DCHECK(GetProcessorUnsafe(type)); } -void SyncBackendHost::DeactivateDataType( - DataTypeController* data_type_controller, - ChangeProcessor* change_processor) { +void SyncBackendHost::DeactivateDataType(syncable::ModelType type) { base::AutoLock lock(registrar_lock_); - registrar_.routing_info.erase(data_type_controller->type()); + registrar_.routing_info.erase(type); + std::map<syncable::ModelType, ChangeProcessor*>::iterator it = + processors_.find(type); // Stop the change processor and remove it from the list of processors. - change_processor->Stop(); - std::map<syncable::ModelType, ChangeProcessor*>::size_type erased = - processors_.erase(data_type_controller->type()); - DCHECK_EQ(erased, 1U); + if (it != processors_.end()) { + it->second->Stop(); + processors_.erase(it); + } + DCHECK(!GetProcessorUnsafe(type)); } bool SyncBackendHost::RequestClearServerData() { @@ -738,9 +732,9 @@ void SyncBackendHost::Core::DoEncryptDataTypes( } void SyncBackendHost::Core::DoRequestConfig( - const syncable::ModelTypeBitSet& added_types, + const syncable::ModelTypeBitSet& types_to_config, sync_api::ConfigureReason reason) { - sync_manager_->RequestConfig(added_types, reason); + sync_manager_->RequestConfig(types_to_config, reason); } void SyncBackendHost::Core::DoStartConfiguration(Callback0::Type* callback) { @@ -771,10 +765,17 @@ void SyncBackendHost::Core::DoShutdown(bool sync_disabled) { host_ = NULL; } -ChangeProcessor* SyncBackendHost::Core::GetProcessor( +ChangeProcessor* SyncBackendHost::GetProcessor( syncable::ModelType model_type) { + base::AutoLock lock(registrar_lock_); + return GetProcessorUnsafe(model_type); +} + +ChangeProcessor* SyncBackendHost::GetProcessorUnsafe( + syncable::ModelType model_type) { + registrar_lock_.AssertAcquired(); std::map<syncable::ModelType, ChangeProcessor*>::const_iterator it = - host_->processors_.find(model_type); + processors_.find(model_type); // Until model association happens for a datatype, it will not appear in // the processors list. During this time, it is OK to drop changes on @@ -783,7 +784,7 @@ ChangeProcessor* SyncBackendHost::Core::GetProcessor( // processor is added to the processors_ list. This all happens on // the UI thread so we will never drop any changes after model // association. - if (it == host_->processors_.end()) + if (it == processors_.end()) return NULL; if (!IsCurrentThreadSafeForModel(model_type)) { @@ -812,7 +813,7 @@ void SyncBackendHost::Core::OnChangesApplied( DCHECK(false) << "OnChangesApplied called after Shutdown?"; return; } - ChangeProcessor* processor = GetProcessor(model_type); + ChangeProcessor* processor = host_->GetProcessor(model_type); if (!processor) return; @@ -826,7 +827,7 @@ void SyncBackendHost::Core::OnChangesComplete( return; } - ChangeProcessor* processor = GetProcessor(model_type); + ChangeProcessor* processor = host_->GetProcessor(model_type); if (!processor) return; @@ -861,13 +862,13 @@ void SyncBackendHost::Core::HandleSyncCycleCompletedOnFrontendLoop( if (host_->pending_download_state_.get()) { scoped_ptr<PendingConfigureDataTypesState> state( host_->pending_download_state_.release()); - bool found_all_added = true; - syncable::ModelTypeSet::const_iterator it; - for (it = state->initial_types.begin(); it != state->initial_types.end(); - ++it) { - if (state->added_types.test(*it)) - found_all_added &= snapshot->initial_sync_ended.test(*it); - } + DCHECK( + std::includes(state->types_to_add.begin(), state->types_to_add.end(), + state->added_types.begin(), state->added_types.end())); + syncable::ModelTypeBitSet added_types = + syncable::ModelTypeBitSetFromSet(state->added_types); + bool found_all_added = + (added_types & snapshot->initial_sync_ended) == added_types; state->ready_task.Run(found_all_added); if (!found_all_added) return; @@ -928,7 +929,7 @@ void SyncBackendHost::HandleInitializationCompletedOnFrontendLoop( initialization_state_ = DOWNLOADING_NIGORI; ConfigureDataTypes( - DataTypeController::TypeMap(), + syncable::ModelTypeSet(), syncable::ModelTypeSet(), sync_api::CONFIGURE_REASON_NEW_CLIENT, base::Bind( @@ -937,17 +938,17 @@ void SyncBackendHost::HandleInitializationCompletedOnFrontendLoop( true); } -bool SyncBackendHost::Core::IsCurrentThreadSafeForModel( - syncable::ModelType model_type) { - base::AutoLock lock(host_->registrar_lock_); +bool SyncBackendHost::IsCurrentThreadSafeForModel( + syncable::ModelType model_type) const { + registrar_lock_.AssertAcquired(); browser_sync::ModelSafeRoutingInfo::const_iterator routing_it = - host_->registrar_.routing_info.find(model_type); - if (routing_it == host_->registrar_.routing_info.end()) + registrar_.routing_info.find(model_type); + if (routing_it == registrar_.routing_info.end()) return false; browser_sync::ModelSafeGroup group = routing_it->second; - WorkerMap::const_iterator worker_it = host_->registrar_.workers.find(group); - if (worker_it == host_->registrar_.workers.end()) + WorkerMap::const_iterator worker_it = registrar_.workers.find(group); + if (worker_it == registrar_.workers.end()) return false; ModelSafeWorker* worker = worker_it->second; return worker->CurrentThreadIsWorkThread(); diff --git a/chrome/browser/sync/glue/sync_backend_host.h b/chrome/browser/sync/glue/sync_backend_host.h index 1f7d8c1..7e6ee22 100644 --- a/chrome/browser/sync/glue/sync_backend_host.h +++ b/chrome/browser/sync/glue/sync_backend_host.h @@ -21,8 +21,6 @@ #include "base/timer.h" #include "chrome/browser/sync/engine/configure_reason.h" #include "chrome/browser/sync/engine/model_safe_worker.h" -#include "chrome/browser/sync/engine/syncapi.h" -#include "chrome/browser/sync/glue/data_type_controller.h" #include "chrome/browser/sync/glue/ui_model_worker.h" #include "chrome/browser/sync/js/js_backend.h" #include "chrome/browser/sync/notifier/sync_notifier_factory.h" @@ -46,7 +44,6 @@ struct SyncSessionSnapshot; } class ChangeProcessor; -class DataTypeController; class JsEventHandler; // SyncFrontend is the interface used by SyncBackendHost to communicate with @@ -133,7 +130,7 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { void Initialize(SyncFrontend* frontend, const WeakHandle<JsEventHandler>& event_handler, const GURL& service_url, - const syncable::ModelTypeSet& types, + const syncable::ModelTypeSet& initial_types, const sync_api::SyncCredentials& credentials, bool delete_sync_data_folder); @@ -160,11 +157,11 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { // Changes the set of data types that are currently being synced. // The ready_task will be run when all of the requested data types - // are up-to-date and ready for activation. The task will cancelled - // upon shutdown. The method takes ownership of the task pointer. + // are up-to-date and ready for activation. The task will be + // cancelled upon shutdown. virtual void ConfigureDataTypes( - const DataTypeController::TypeMap& data_type_controllers, - const syncable::ModelTypeSet& types, + const syncable::ModelTypeSet& types_to_add, + const syncable::ModelTypeSet& types_to_remove, sync_api::ConfigureReason reason, base::Callback<void(bool)> ready_task, bool enable_nigori); @@ -186,12 +183,12 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { // be called synchronously with the data type's model association so // no changes are dropped between model association and change // processor activation. - void ActivateDataType(DataTypeController* data_type_controller, - ChangeProcessor* change_processor); + void ActivateDataType( + syncable::ModelType type, ModelSafeGroup group, + ChangeProcessor* change_processor); // Deactivates change processing for the given data type. - void DeactivateDataType(DataTypeController* data_type_controller, - ChangeProcessor* change_processor); + void DeactivateDataType(syncable::ModelType type); // Asks the server to clear all data associated with ChromeSync. virtual bool RequestClearServerData(); @@ -357,7 +354,8 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { void DoShutdown(bool stopping_sync); // Posts a config request on the sync thread. - virtual void DoRequestConfig(const syncable::ModelTypeBitSet& added_types, + virtual void DoRequestConfig( + const syncable::ModelTypeBitSet& types_to_config, sync_api::ConfigureReason reason); // Start the configuration mode. @@ -408,9 +406,6 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { virtual ~Core(); - // Return change processor for a particular model (return NULL on failure). - ChangeProcessor* GetProcessor(syncable::ModelType modeltype); - // Invoked when initialization of syncapi is complete and we can start // our timer. // This must be called from the thread on which SaveChanges is intended to @@ -458,9 +453,6 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { void FinishConfigureDataTypesOnFrontendLoop(); - // Return true if a model lives on the current thread. - bool IsCurrentThreadSafeForModel(syncable::ModelType model_type); - Profile* profile_; // Our parent SyncBackendHost @@ -528,26 +520,34 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { // The set of types that we are waiting to be initially synced in a // configuration cycle. - syncable::ModelTypeSet initial_types; + syncable::ModelTypeSet types_to_add; // Additional details about which types were added. - syncable::ModelTypeBitSet added_types; + syncable::ModelTypeSet added_types; sync_api::ConfigureReason reason; }; UIModelWorker* ui_worker(); - // Helper function for ConfigureDataTypes() that fills in |state| - // and |deleted_type|. Does not take ownership of routing_info|. + // Return change processor for a particular model (return NULL on failure). + ChangeProcessor* GetProcessor(syncable::ModelType modeltype); + + // Like GetProcessor(), but |registrar_lock_| must already be + // held. + ChangeProcessor* GetProcessorUnsafe(syncable::ModelType modeltype); + + // Return true if a model lives on the current thread. + bool IsCurrentThreadSafeForModel(syncable::ModelType model_type) const; + + // Helper function for ConfigureDataTypes() that fills in |state|. + // Does not take ownership of |routing_info|. static void GetPendingConfigModeState( - const DataTypeController::TypeMap& data_type_controllers, - const syncable::ModelTypeSet& types, + const syncable::ModelTypeSet& types_to_add, + const syncable::ModelTypeSet& types_to_remove, base::Callback<void(bool)> ready_task, ModelSafeRoutingInfo* routing_info, sync_api::ConfigureReason reason, - bool nigori_enabled, - PendingConfigureDataTypesState* state, - bool* deleted_type); + PendingConfigureDataTypesState* state); // For convenience, checks if initialization state is INITIALIZED. bool initialized() const { return initialization_state_ == INITIALIZED; } diff --git a/chrome/browser/sync/glue/sync_backend_host_mock.cc b/chrome/browser/sync/glue/sync_backend_host_mock.cc index ff661b7..1e5705a 100644 --- a/chrome/browser/sync/glue/sync_backend_host_mock.cc +++ b/chrome/browser/sync/glue/sync_backend_host_mock.cc @@ -6,14 +6,15 @@ namespace browser_sync { +using ::testing::_; + ACTION(InvokeTask) { arg3.Run(true); } SyncBackendHostMock::SyncBackendHostMock() { // By default, invoke the ready callback. - ON_CALL(*this, ConfigureDataTypes(testing::_, testing::_, testing::_, - testing::_, testing::_)). + ON_CALL(*this, ConfigureDataTypes(_, _, _, _, _)). WillByDefault(InvokeTask()); } diff --git a/chrome/browser/sync/glue/sync_backend_host_mock.h b/chrome/browser/sync/glue/sync_backend_host_mock.h index e63d778..15eb570 100644 --- a/chrome/browser/sync/glue/sync_backend_host_mock.h +++ b/chrome/browser/sync/glue/sync_backend_host_mock.h @@ -22,7 +22,7 @@ class SyncBackendHostMock : public SyncBackendHost { virtual ~SyncBackendHostMock(); MOCK_METHOD5(ConfigureDataTypes, - void(const DataTypeController::TypeMap&, + void(const std::set<syncable::ModelType>&, const std::set<syncable::ModelType>&, sync_api::ConfigureReason, base::Callback<void(bool)>, diff --git a/chrome/browser/sync/glue/sync_backend_host_unittest.cc b/chrome/browser/sync/glue/sync_backend_host_unittest.cc index 25b6da7..328a9ab 100644 --- a/chrome/browser/sync/glue/sync_backend_host_unittest.cc +++ b/chrome/browser/sync/glue/sync_backend_host_unittest.cc @@ -10,7 +10,6 @@ #include "base/message_loop.h" #include "chrome/browser/sync/engine/model_safe_worker.h" #include "chrome/browser/sync/engine/syncapi.h" -#include "chrome/browser/sync/glue/data_type_controller.h" #include "chrome/browser/sync/syncable/model_type.h" #include "chrome/test/base/test_url_request_context_getter.h" #include "chrome/test/base/testing_profile.h" @@ -112,160 +111,93 @@ TEST_F(SyncBackendHostTest, InitShutdown) { TEST_F(SyncBackendHostTest, GetPendingConfigModeState) { SyncBackendHost::PendingConfigureDataTypesState state; - bool deleted_type = false; // Empty. { - DataTypeController::TypeMap data_type_controllers; - syncable::ModelTypeSet types; + syncable::ModelTypeSet types_to_add; + syncable::ModelTypeSet types_to_remove; ModelSafeRoutingInfo routing_info; SyncBackendHost::GetPendingConfigModeState( - data_type_controllers, types, base::Callback<void(bool)>(), + types_to_add, types_to_remove, base::Callback<void(bool)>(), &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION, - false, &state, &deleted_type); + &state); EXPECT_TRUE(routing_info.empty()); EXPECT_TRUE(state.ready_task.is_null()); - EXPECT_EQ(types, state.initial_types); - EXPECT_FALSE(deleted_type); - EXPECT_TRUE(state.added_types.none()); - } - - // No enabled types. - { - DataTypeController::TypeMap data_type_controllers; - data_type_controllers[syncable::BOOKMARKS] = NULL; - syncable::ModelTypeSet types; - ModelSafeRoutingInfo routing_info; - - types.insert(syncable::NIGORI); - SyncBackendHost::GetPendingConfigModeState( - data_type_controllers, types, base::Callback<void(bool)>(), - &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION, - true, &state, &deleted_type); - - EXPECT_TRUE(routing_info.empty()); - EXPECT_TRUE(state.ready_task.is_null()); - EXPECT_EQ(types, state.initial_types); - EXPECT_TRUE(deleted_type); - EXPECT_TRUE(state.added_types.none()); + EXPECT_TRUE(state.types_to_add.empty()); + EXPECT_TRUE(state.added_types.empty()); } // Add type. { - DataTypeController::TypeMap data_type_controllers; - data_type_controllers[syncable::BOOKMARKS] = NULL; - syncable::ModelTypeSet types; - types.insert(syncable::BOOKMARKS); - types.insert(syncable::NIGORI); + syncable::ModelTypeSet types_to_add; + types_to_add.insert(syncable::BOOKMARKS); + syncable::ModelTypeSet types_to_remove; ModelSafeRoutingInfo routing_info; SyncBackendHost::GetPendingConfigModeState( - data_type_controllers, types, base::Callback<void(bool)>(), + types_to_add, types_to_remove, base::Callback<void(bool)>(), &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION, - true, &state, &deleted_type); + &state); ModelSafeRoutingInfo expected_routing_info; expected_routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE; EXPECT_EQ(expected_routing_info, routing_info); EXPECT_TRUE(state.ready_task.is_null()); - EXPECT_EQ(types, state.initial_types); - EXPECT_FALSE(deleted_type); - - syncable::ModelTypeBitSet expected_added_types; - expected_added_types.set(syncable::BOOKMARKS); - EXPECT_EQ(expected_added_types, state.added_types); + EXPECT_EQ(types_to_add, state.types_to_add); + EXPECT_EQ(types_to_add, state.added_types); } // Add existing type. { - DataTypeController::TypeMap data_type_controllers; - data_type_controllers[syncable::BOOKMARKS] = NULL; - syncable::ModelTypeSet types; - types.insert(syncable::BOOKMARKS); - types.insert(syncable::NIGORI); + syncable::ModelTypeSet types_to_add; + types_to_add.insert(syncable::BOOKMARKS); + syncable::ModelTypeSet types_to_remove; ModelSafeRoutingInfo routing_info; routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE; ModelSafeRoutingInfo expected_routing_info = routing_info; SyncBackendHost::GetPendingConfigModeState( - data_type_controllers, types, base::Callback<void(bool)>(), + types_to_add, types_to_remove, base::Callback<void(bool)>(), &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION, - true, &state, &deleted_type); + &state); EXPECT_EQ(expected_routing_info, routing_info); EXPECT_TRUE(state.ready_task.is_null()); - EXPECT_EQ(types, state.initial_types); - EXPECT_FALSE(deleted_type); - EXPECT_TRUE(state.added_types.none()); + EXPECT_EQ(types_to_add, state.types_to_add); + EXPECT_TRUE(state.added_types.empty()); } // Delete type. { - DataTypeController::TypeMap data_type_controllers; - data_type_controllers[syncable::BOOKMARKS] = NULL; - syncable::ModelTypeSet types; - types.insert(syncable::NIGORI); + syncable::ModelTypeSet types_to_add; + syncable::ModelTypeSet types_to_remove; + types_to_remove.insert(syncable::BOOKMARKS); ModelSafeRoutingInfo routing_info; routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE; SyncBackendHost::GetPendingConfigModeState( - data_type_controllers, types, base::Callback<void(bool)>(), - &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION, - true, &state, &deleted_type); - - ModelSafeRoutingInfo expected_routing_info; - EXPECT_EQ(expected_routing_info, routing_info); - EXPECT_TRUE(state.ready_task.is_null()); - EXPECT_EQ(types, state.initial_types); - EXPECT_TRUE(deleted_type); - EXPECT_TRUE(state.added_types.none()); - } - - // Add Nigori. - { - DataTypeController::TypeMap data_type_controllers; - syncable::ModelTypeSet types; - types.insert(syncable::NIGORI); - ModelSafeRoutingInfo routing_info; - - SyncBackendHost::GetPendingConfigModeState( - data_type_controllers, types, base::Callback<void(bool)>(), + types_to_add, types_to_remove, base::Callback<void(bool)>(), &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION, - false, &state, &deleted_type); - - ModelSafeRoutingInfo expected_routing_info; - expected_routing_info[syncable::NIGORI] = GROUP_PASSIVE; - EXPECT_EQ(expected_routing_info, routing_info); - EXPECT_TRUE(state.ready_task.is_null()); - EXPECT_EQ(types, state.initial_types); - EXPECT_FALSE(deleted_type); + &state); - syncable::ModelTypeBitSet expected_added_types; - expected_added_types.set(syncable::NIGORI); - EXPECT_EQ(expected_added_types, state.added_types); + EXPECT_TRUE(routing_info.empty()); } - // Delete Nigori. + // Delete nonexistent type. { - DataTypeController::TypeMap data_type_controllers; - syncable::ModelTypeSet types; + syncable::ModelTypeSet types_to_add; + syncable::ModelTypeSet types_to_remove; + types_to_remove.insert(syncable::BOOKMARKS); ModelSafeRoutingInfo routing_info; - routing_info[syncable::NIGORI] = GROUP_PASSIVE; SyncBackendHost::GetPendingConfigModeState( - data_type_controllers, types, base::Callback<void(bool)>(), + types_to_add, types_to_remove, base::Callback<void(bool)>(), &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION, - true, &state, &deleted_type); - - ModelSafeRoutingInfo expected_routing_info; - EXPECT_EQ(expected_routing_info, routing_info); - EXPECT_TRUE(state.ready_task.is_null()); - EXPECT_EQ(types, state.initial_types); - EXPECT_TRUE(deleted_type); + &state); - EXPECT_TRUE(state.added_types.none()); + EXPECT_TRUE(routing_info.empty()); } } diff --git a/chrome/browser/sync/glue/theme_change_processor.cc b/chrome/browser/sync/glue/theme_change_processor.cc index 8ffd402..0783225 100644 --- a/chrome/browser/sync/glue/theme_change_processor.cc +++ b/chrome/browser/sync/glue/theme_change_processor.cc @@ -10,6 +10,7 @@ #include "chrome/browser/sync/engine/syncapi.h" #include "chrome/browser/sync/glue/theme_util.h" #include "chrome/browser/sync/protocol/theme_specifics.pb.h" +#include "chrome/browser/sync/unrecoverable_error_handler.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/common/chrome_notification_types.h" diff --git a/chrome/browser/sync/glue/theme_data_type_controller_unittest.cc b/chrome/browser/sync/glue/theme_data_type_controller_unittest.cc index 30b9beb..9b6324a 100644 --- a/chrome/browser/sync/glue/theme_data_type_controller_unittest.cc +++ b/chrome/browser/sync/glue/theme_data_type_controller_unittest.cc @@ -64,11 +64,11 @@ class ThemeDataTypeControllerTest : public TestingBrowserProcessTest { } void SetActivateExpectations() { - EXPECT_CALL(service_, ActivateDataType(_, _)); + EXPECT_CALL(service_, ActivateDataType(_, _, _)); } void SetStopExpectations() { - EXPECT_CALL(service_, DeactivateDataType(_, _)); + EXPECT_CALL(service_, DeactivateDataType(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_)); } diff --git a/chrome/browser/sync/profile_sync_service.cc b/chrome/browser/sync/profile_sync_service.cc index 1d400fa..7488ed9 100644 --- a/chrome/browser/sync/profile_sync_service.cc +++ b/chrome/browser/sync/profile_sync_service.cc @@ -367,12 +367,12 @@ void ProfileSyncService::InitializeBackend(bool delete_sync_data_folder) { return; } - syncable::ModelTypeSet types; + syncable::ModelTypeSet initial_types; // If sync setup hasn't finished, we don't want to initialize routing info // for any data types so that we don't download updates for types that the // user chooses not to sync on the first DownloadUpdatesCommand. if (HasSyncSetupCompleted()) { - GetPreferredDataTypes(&types); + GetPreferredDataTypes(&initial_types); } SyncCredentials credentials = GetCredentials(); @@ -384,7 +384,7 @@ void ProfileSyncService::InitializeBackend(bool delete_sync_data_folder) { this, WeakHandle<JsEventHandler>(sync_js_controller_.AsWeakPtr()), sync_service_url_, - types, + initial_types, credentials, delete_sync_data_folder); } @@ -1198,22 +1198,20 @@ void ProfileSyncService::GetModelSafeRoutingInfo( } void ProfileSyncService::ActivateDataType( - DataTypeController* data_type_controller, + syncable::ModelType type, browser_sync::ModelSafeGroup group, ChangeProcessor* change_processor) { if (!backend_.get()) { NOTREACHED(); return; } DCHECK(backend_initialized_); - backend_->ActivateDataType(data_type_controller, change_processor); + backend_->ActivateDataType(type, group, change_processor); } -void ProfileSyncService::DeactivateDataType( - DataTypeController* data_type_controller, - ChangeProcessor* change_processor) { +void ProfileSyncService::DeactivateDataType(syncable::ModelType type) { if (!backend_.get()) return; - backend_->DeactivateDataType(data_type_controller, change_processor); + backend_->DeactivateDataType(type); } void ProfileSyncService::SetPassphrase(const std::string& passphrase, diff --git a/chrome/browser/sync/profile_sync_service.h b/chrome/browser/sync/profile_sync_service.h index c795659..558c548 100644 --- a/chrome/browser/sync/profile_sync_service.h +++ b/chrome/browser/sync/profile_sync_service.h @@ -389,13 +389,12 @@ class ProfileSyncService : public browser_sync::SyncFrontend, // remove this function. void GetModelSafeRoutingInfo(browser_sync::ModelSafeRoutingInfo* out); + // Overridden by tests. // TODO(zea): Remove these and have the dtc's call directly into the SBH. virtual void ActivateDataType( - browser_sync::DataTypeController* data_type_controller, - browser_sync::ChangeProcessor* change_processor); - virtual void DeactivateDataType( - browser_sync::DataTypeController* data_type_controller, + syncable::ModelType type, browser_sync::ModelSafeGroup group, browser_sync::ChangeProcessor* change_processor); + virtual void DeactivateDataType(syncable::ModelType type); // NotificationObserver implementation. virtual void Observe(int type, diff --git a/chrome/browser/sync/profile_sync_service_mock.h b/chrome/browser/sync/profile_sync_service_mock.h index 69785ff..0c81c9c 100644 --- a/chrome/browser/sync/profile_sync_service_mock.h +++ b/chrome/browser/sync/profile_sync_service_mock.h @@ -37,12 +37,10 @@ class ProfileSyncServiceMock : public ProfileSyncService { MOCK_METHOD2(OnUnrecoverableError, void(const tracked_objects::Location& location, const std::string& message)); - MOCK_METHOD2(ActivateDataType, - void(browser_sync::DataTypeController* data_type_controller, - browser_sync::ChangeProcessor* change_processor)); - MOCK_METHOD2(DeactivateDataType, - void(browser_sync::DataTypeController* data_type_controller, - browser_sync::ChangeProcessor* change_processor)); + MOCK_METHOD3(ActivateDataType, + void(syncable::ModelType, browser_sync::ModelSafeGroup, + browser_sync::ChangeProcessor*)); + MOCK_METHOD1(DeactivateDataType, void(syncable::ModelType)); MOCK_METHOD0(InitializeBackend, void()); MOCK_METHOD1(AddObserver, void(Observer*)); |