Commit 418b75e0 authored by akalin@chromium.org's avatar akalin@chromium.org

[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
parent 39607f74
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "chrome/browser/sync/glue/extension_sync.h" #include "chrome/browser/sync/glue/extension_sync.h"
#include "chrome/browser/sync/glue/extension_util.h" #include "chrome/browser/sync/glue/extension_util.h"
#include "chrome/browser/sync/protocol/extension_specifics.pb.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/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension.h"
#include "content/browser/browser_thread.h" #include "content/browser/browser_thread.h"
......
...@@ -127,12 +127,12 @@ class AutofillDataTypeControllerTest : public TestingBrowserProcessTest { ...@@ -127,12 +127,12 @@ class AutofillDataTypeControllerTest : public TestingBrowserProcessTest {
WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true)));
EXPECT_CALL(*model_associator_, AssociateModels(_)). EXPECT_CALL(*model_associator_, AssociateModels(_)).
WillRepeatedly(Return(true)); WillRepeatedly(Return(true));
EXPECT_CALL(service_, ActivateDataType(_, _)); EXPECT_CALL(service_, ActivateDataType(_, _, _));
EXPECT_CALL(*change_processor_, IsRunning()).WillRepeatedly(Return(true)); EXPECT_CALL(*change_processor_, IsRunning()).WillRepeatedly(Return(true));
} }
void SetStopExpectations() { void SetStopExpectations() {
EXPECT_CALL(service_, DeactivateDataType(_, _)); EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_));
} }
...@@ -182,7 +182,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhilePDMStarting) { ...@@ -182,7 +182,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhilePDMStarting) {
autofill_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); autofill_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run));
EXPECT_EQ(DataTypeController::MODEL_STARTING, autofill_dtc_->state()); 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, _)); EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED, _));
autofill_dtc_->Stop(); autofill_dtc_->Stop();
EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state()); EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state());
...@@ -200,7 +200,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileWDSStarting) { ...@@ -200,7 +200,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileWDSStarting) {
autofill_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run)); autofill_dtc_->Start(NewCallback(&start_callback_, &StartCallback::Run));
EXPECT_EQ(DataTypeController::MODEL_STARTING, autofill_dtc_->state()); 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, _)); EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED, _));
autofill_dtc_->Stop(); autofill_dtc_->Stop();
EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state()); EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state());
...@@ -240,7 +240,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileAssociatingNotActivated) { ...@@ -240,7 +240,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileAssociatingNotActivated) {
wait_for_db_thread_pause.Wait(); wait_for_db_thread_pause.Wait();
EXPECT_EQ(DataTypeController::ASSOCIATING, autofill_dtc_->state()); EXPECT_EQ(DataTypeController::ASSOCIATING, autofill_dtc_->state());
EXPECT_CALL(service_, DeactivateDataType(_, _)).Times(0); EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED, _)); EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED, _));
autofill_dtc_->Stop(); autofill_dtc_->Stop();
EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state()); EXPECT_EQ(DataTypeController::NOT_RUNNING, autofill_dtc_->state());
...@@ -269,7 +269,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileAssociatingActivated) { ...@@ -269,7 +269,7 @@ TEST_F(AutofillDataTypeControllerTest, AbortWhileAssociatingActivated) {
// ActivateDataType() before allowing it to continue. // ActivateDataType() before allowing it to continue.
WaitableEvent pause_db_thread(false, false); WaitableEvent pause_db_thread(false, false);
WaitableEvent wait_for_db_thread_pause(false, false); WaitableEvent wait_for_db_thread_pause(false, false);
EXPECT_CALL(service_, ActivateDataType(_, _)). EXPECT_CALL(service_, ActivateDataType(_, _, _)).
WillOnce(DoAll( WillOnce(DoAll(
SignalEvent(&wait_for_db_thread_pause), SignalEvent(&wait_for_db_thread_pause),
WaitOnEvent(&pause_db_thread))); WaitOnEvent(&pause_db_thread)));
......
...@@ -77,11 +77,11 @@ class BookmarkDataTypeControllerTest : public TestingBrowserProcessTest { ...@@ -77,11 +77,11 @@ class BookmarkDataTypeControllerTest : public TestingBrowserProcessTest {
WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true)));
EXPECT_CALL(*model_associator_, AssociateModels(_)). EXPECT_CALL(*model_associator_, AssociateModels(_)).
WillRepeatedly(Return(true)); WillRepeatedly(Return(true));
EXPECT_CALL(service_, ActivateDataType(_, _)); EXPECT_CALL(service_, ActivateDataType(_, _, _));
} }
void SetStopExpectations() { void SetStopExpectations() {
EXPECT_CALL(service_, DeactivateDataType(_, _)); EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_));
} }
......
...@@ -209,9 +209,26 @@ void DataTypeManagerImpl::Restart(sync_api::ConfigureReason reason, ...@@ -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. // Tell the backend about the new set of data types we wish to sync.
// The task will be invoked when updates are downloaded. // The task will be invoked when updates are downloaded.
state_ = DOWNLOAD_PENDING; 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( backend_->ConfigureDataTypes(
controllers_, types_to_add,
last_requested_types_, types_to_remove,
reason, reason,
base::Bind(&DataTypeManagerImpl::DownloadReady, base::Bind(&DataTypeManagerImpl::DownloadReady,
weak_ptr_factory_.GetWeakPtr()), weak_ptr_factory_.GetWeakPtr()),
......
...@@ -31,6 +31,7 @@ class DataTypeManagerImpl : public DataTypeManager { ...@@ -31,6 +31,7 @@ class DataTypeManagerImpl : public DataTypeManager {
virtual void Configure(const TypeSet& desired_types, virtual void Configure(const TypeSet& desired_types,
sync_api::ConfigureReason reason); sync_api::ConfigureReason reason);
// Needed only for backend migration.
virtual void ConfigureWithoutNigori(const TypeSet& desired_types, virtual void ConfigureWithoutNigori(const TypeSet& desired_types,
sync_api::ConfigureReason reason); sync_api::ConfigureReason reason);
......
...@@ -315,8 +315,8 @@ TEST_F(DataTypeManagerImplTest, ConfigureOneThenSwitch) { ...@@ -315,8 +315,8 @@ TEST_F(DataTypeManagerImplTest, ConfigureOneThenSwitch) {
} }
void DoConfigureDataTypes( void DoConfigureDataTypes(
const DataTypeController::TypeMap& data_type_controllers, const syncable::ModelTypeSet& types_to_add,
const syncable::ModelTypeSet& types, const syncable::ModelTypeSet& types_to_remove,
sync_api::ConfigureReason reason, sync_api::ConfigureReason reason,
base::Callback<void(bool)> ready_task, base::Callback<void(bool)> ready_task,
bool enable_nigori) { bool enable_nigori) {
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "chrome/browser/sync/glue/extension_sync.h" #include "chrome/browser/sync/glue/extension_sync.h"
#include "chrome/browser/sync/glue/extension_util.h" #include "chrome/browser/sync/glue/extension_util.h"
#include "chrome/browser/sync/protocol/extension_specifics.pb.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/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension.h"
#include "content/browser/browser_thread.h" #include "content/browser/browser_thread.h"
......
...@@ -65,11 +65,11 @@ class ExtensionDataTypeControllerTest : public TestingBrowserProcessTest { ...@@ -65,11 +65,11 @@ class ExtensionDataTypeControllerTest : public TestingBrowserProcessTest {
} }
void SetActivateExpectations() { void SetActivateExpectations() {
EXPECT_CALL(service_, ActivateDataType(_, _)); EXPECT_CALL(service_, ActivateDataType(_, _, _));
} }
void SetStopExpectations() { void SetStopExpectations() {
EXPECT_CALL(service_, DeactivateDataType(_, _)); EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_));
} }
......
...@@ -101,7 +101,8 @@ bool FrontendDataTypeController::Associate() { ...@@ -101,7 +101,8 @@ bool FrontendDataTypeController::Associate() {
return false; return false;
} }
sync_service_->ActivateDataType(this, change_processor_.get()); sync_service_->ActivateDataType(type(), model_safe_group(),
change_processor_.get());
state_ = RUNNING; state_ = RUNNING;
FinishStart(!sync_has_nodes ? OK_FIRST_RUN : OK, FROM_HERE); FinishStart(!sync_has_nodes ? OK_FIRST_RUN : OK, FROM_HERE);
return true; return true;
...@@ -151,8 +152,7 @@ void FrontendDataTypeController::Stop() { ...@@ -151,8 +152,7 @@ void FrontendDataTypeController::Stop() {
CleanUpState(); CleanUpState();
if (change_processor_.get()) sync_service_->DeactivateDataType(type());
sync_service_->DeactivateDataType(this, change_processor_.get());
if (model_associator()) { if (model_associator()) {
SyncError error; SyncError error;
......
...@@ -118,13 +118,13 @@ class FrontendDataTypeControllerTest : public TestingBrowserProcessTest { ...@@ -118,13 +118,13 @@ class FrontendDataTypeControllerTest : public TestingBrowserProcessTest {
} }
void SetActivateExpectations(DataTypeController::StartResult result) { void SetActivateExpectations(DataTypeController::StartResult result) {
EXPECT_CALL(service_, ActivateDataType(_, _)); EXPECT_CALL(service_, ActivateDataType(_, _, _));
EXPECT_CALL(start_callback_, Run(result,_)); EXPECT_CALL(start_callback_, Run(result,_));
} }
void SetStopExpectations() { void SetStopExpectations() {
EXPECT_CALL(*dtc_mock_, CleanUpState()); EXPECT_CALL(*dtc_mock_, CleanUpState());
EXPECT_CALL(service_, DeactivateDataType(_, _)); EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_));
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "chrome/browser/sync/api/sync_error.h" #include "chrome/browser/sync/api/sync_error.h"
#include "chrome/browser/sync/engine/syncapi.h" #include "chrome/browser/sync/engine/syncapi.h"
#include "chrome/browser/sync/syncable/nigori_util.h" #include "chrome/browser/sync/syncable/nigori_util.h"
#include "chrome/browser/sync/unrecoverable_error_handler.h"
namespace browser_sync { namespace browser_sync {
......
...@@ -113,7 +113,8 @@ void NonFrontendDataTypeController::StartAssociation() { ...@@ -113,7 +113,8 @@ void NonFrontendDataTypeController::StartAssociation() {
return; 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); StartDone(!sync_has_nodes ? OK_FIRST_RUN : OK, RUNNING, FROM_HERE);
} }
...@@ -199,8 +200,7 @@ void NonFrontendDataTypeController::Stop() { ...@@ -199,8 +200,7 @@ void NonFrontendDataTypeController::Stop() {
// Deactivate the change processor on the UI thread. We dont want to listen // Deactivate the change processor on the UI thread. We dont want to listen
// for any more changes or process them from server. // for any more changes or process them from server.
if (change_processor_.get()) profile_sync_service_->DeactivateDataType(type());
profile_sync_service_->DeactivateDataType(this, change_processor_.get());
if (StopAssociationAsync()) { if (StopAssociationAsync()) {
datatype_stopped_.Wait(); datatype_stopped_.Wait();
......
...@@ -159,14 +159,14 @@ class NonFrontendDataTypeControllerTest : public TestingBrowserProcessTest { ...@@ -159,14 +159,14 @@ class NonFrontendDataTypeControllerTest : public TestingBrowserProcessTest {
} }
void SetActivateExpectations(DataTypeController::StartResult result) { void SetActivateExpectations(DataTypeController::StartResult result) {
EXPECT_CALL(service_, ActivateDataType(_, _)); EXPECT_CALL(service_, ActivateDataType(_, _, _));
EXPECT_CALL(start_callback_, Run(result,_)); EXPECT_CALL(start_callback_, Run(result,_));
} }
void SetStopExpectations() { void SetStopExpectations() {
EXPECT_CALL(*dtc_mock_, StopAssociationAsync()); EXPECT_CALL(*dtc_mock_, StopAssociationAsync());
EXPECT_CALL(*dtc_mock_, StopModels()); EXPECT_CALL(*dtc_mock_, StopModels());
EXPECT_CALL(service_, DeactivateDataType(_, _)); EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_));
} }
...@@ -312,7 +312,7 @@ TEST_F(NonFrontendDataTypeControllerTest, AbortDuringAssociationInactive) { ...@@ -312,7 +312,7 @@ TEST_F(NonFrontendDataTypeControllerTest, AbortDuringAssociationInactive) {
SignalEvent(&pause_db_thread)); SignalEvent(&pause_db_thread));
EXPECT_CALL(*model_associator_, AssociateModels(_)).WillOnce(Return(true)); EXPECT_CALL(*model_associator_, AssociateModels(_)).WillOnce(Return(true));
EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_)); EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_));
EXPECT_CALL(service_, ActivateDataType(_, _)); EXPECT_CALL(service_, ActivateDataType(_, _, _));
EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_)); EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_));
EXPECT_CALL(*dtc_mock_, RecordStartFailure(DataTypeController::ABORTED)); EXPECT_CALL(*dtc_mock_, RecordStartFailure(DataTypeController::ABORTED));
SetStopExpectations(); SetStopExpectations();
...@@ -342,7 +342,7 @@ TEST_F(NonFrontendDataTypeControllerTest, AbortDuringAssociationActivated) { ...@@ -342,7 +342,7 @@ TEST_F(NonFrontendDataTypeControllerTest, AbortDuringAssociationActivated) {
EXPECT_CALL(*model_associator_, AssociateModels(_)). EXPECT_CALL(*model_associator_, AssociateModels(_)).
WillOnce(Return(true)); WillOnce(Return(true));
EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_)); EXPECT_CALL(*dtc_mock_, RecordAssociationTime(_));
EXPECT_CALL(service_, ActivateDataType(_, _)).WillOnce(DoAll( EXPECT_CALL(service_, ActivateDataType(_, _, _)).WillOnce(DoAll(
SignalEvent(&wait_for_db_thread_pause), SignalEvent(&wait_for_db_thread_pause),
WaitOnEvent(&pause_db_thread))); WaitOnEvent(&pause_db_thread)));
EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_)); EXPECT_CALL(start_callback_, Run(DataTypeController::ABORTED,_));
......
...@@ -67,11 +67,11 @@ class PreferenceDataTypeControllerTest : public TestingBrowserProcessTest { ...@@ -67,11 +67,11 @@ class PreferenceDataTypeControllerTest : public TestingBrowserProcessTest {
} }
void SetActivateExpectations() { void SetActivateExpectations() {
EXPECT_CALL(service_, ActivateDataType(_, _)); EXPECT_CALL(service_, ActivateDataType(_, _, _));
} }
void SetStopExpectations() { void SetStopExpectations() {
EXPECT_CALL(service_, DeactivateDataType(_, _)); EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_));
} }
......
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
#include "base/timer.h" #include "base/timer.h"
#include "chrome/browser/sync/engine/configure_reason.h" #include "chrome/browser/sync/engine/configure_reason.h"
#include "chrome/browser/sync/engine/model_safe_worker.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/glue/ui_model_worker.h"
#include "chrome/browser/sync/js/js_backend.h" #include "chrome/browser/sync/js/js_backend.h"
#include "chrome/browser/sync/notifier/sync_notifier_factory.h" #include "chrome/browser/sync/notifier/sync_notifier_factory.h"
...@@ -46,7 +44,6 @@ struct SyncSessionSnapshot; ...@@ -46,7 +44,6 @@ struct SyncSessionSnapshot;
} }
class ChangeProcessor; class ChangeProcessor;
class DataTypeController;
class JsEventHandler; class JsEventHandler;
// SyncFrontend is the interface used by SyncBackendHost to communicate with // SyncFrontend is the interface used by SyncBackendHost to communicate with
...@@ -133,7 +130,7 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { ...@@ -133,7 +130,7 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
void Initialize(SyncFrontend* frontend, void Initialize(SyncFrontend* frontend,
const WeakHandle<JsEventHandler>& event_handler, const WeakHandle<JsEventHandler>& event_handler,
const GURL& service_url, const GURL& service_url,
const syncable::ModelTypeSet& types, const syncable::ModelTypeSet& initial_types,
const sync_api::SyncCredentials& credentials, const sync_api::SyncCredentials& credentials,
bool delete_sync_data_folder); bool delete_sync_data_folder);
...@@ -160,11 +157,11 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { ...@@ -160,11 +157,11 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
// Changes the set of data types that are currently being synced. // Changes the set of data types that are currently being synced.
// The ready_task will be run when all of the requested data types // 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 // are up-to-date and ready for activation. The task will be
// upon shutdown. The method takes ownership of the task pointer. // cancelled upon shutdown.
virtual void ConfigureDataTypes( virtual void ConfigureDataTypes(
const DataTypeController::TypeMap& data_type_controllers, const syncable::ModelTypeSet& types_to_add,
const syncable::ModelTypeSet& types, const syncable::ModelTypeSet& types_to_remove,
sync_api::ConfigureReason reason, sync_api::ConfigureReason reason,
base::Callback<void(bool)> ready_task, base::Callback<void(bool)> ready_task,
bool enable_nigori); bool enable_nigori);
...@@ -186,12 +183,12 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { ...@@ -186,12 +183,12 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
// be called synchronously with the data type's model association so // be called synchronously with the data type's model association so
// no changes are dropped between model association and change // no changes are dropped between model association and change
// processor activation. // processor activation.
void ActivateDataType(DataTypeController* data_type_controller, void ActivateDataType(
ChangeProcessor* change_processor); syncable::ModelType type, ModelSafeGroup group,
ChangeProcessor* change_processor);
// Deactivates change processing for the given data type. // Deactivates change processing for the given data type.
void DeactivateDataType(DataTypeController* data_type_controller, void DeactivateDataType(syncable::ModelType type);
ChangeProcessor* change_processor);
// Asks the server to clear all data associated with ChromeSync. // Asks the server to clear all data associated with ChromeSync.
virtual bool RequestClearServerData(); virtual bool RequestClearServerData();
...@@ -357,7 +354,8 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { ...@@ -357,7 +354,8 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
void DoShutdown(bool stopping_sync); void DoShutdown(bool stopping_sync);
// Posts a config request on the sync thread. // 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); sync_api::ConfigureReason reason);
// Start the configuration mode. // Start the configuration mode.
...@@ -408,9 +406,6 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { ...@@ -408,9 +406,6 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
virtual ~Core(); 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 // Invoked when initialization of syncapi is complete and we can start
// our timer. // our timer.
// This must be called from the thread on which SaveChanges is intended to // This must be called from the thread on which SaveChanges is intended to
...@@ -458,9 +453,6 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { ...@@ -458,9 +453,6 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
void FinishConfigureDataTypesOnFrontendLoop(); void FinishConfigureDataTypesOnFrontendLoop();
// Return true if a model lives on the current thread.
bool IsCurrentThreadSafeForModel(syncable::ModelType model_type);
Profile* profile_; Profile* profile_;
// Our parent SyncBackendHost // Our parent SyncBackendHost
...@@ -528,26 +520,34 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar { ...@@ -528,26 +520,34 @@ class SyncBackendHost : public browser_sync::ModelSafeWorkerRegistrar {
// The set of types that we are waiting to be initially synced in a // The set of types that we are waiting to be initially synced in a
// configuration cycle. // configuration cycle.
syncable::ModelTypeSet initial_types; syncable::ModelTypeSet types_to_add;
// Additional details about which types were added. // Additional details about which types were added.
syncable::ModelTypeBitSet added_types; syncable::ModelTypeSet added_types;
sync_api::ConfigureReason reason; sync_api::ConfigureReason reason;
}; };
UIModelWorker* ui_worker(); UIModelWorker* ui_worker();
// Helper function for ConfigureDataTypes() that fills in |state| // Return change processor for a particular model (return NULL on failure).
// and |deleted_type|. Does not take ownership of routing_info|. 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( static void GetPendingConfigModeState(
const DataTypeController::TypeMap& data_type_controllers, const syncable::ModelTypeSet& types_to_add,
const syncable::ModelTypeSet& types, const syncable::ModelTypeSet& types_to_remove,
base::Callback<void(bool)> ready_task, base::Callback<void(bool)> ready_task,
ModelSafeRoutingInfo* routing_info, ModelSafeRoutingInfo* routing_info,
sync_api::ConfigureReason reason, sync_api::ConfigureReason reason,
bool nigori_enabled, PendingConfigureDataTypesState* state);
PendingConfigureDataTypesState* state,
bool* deleted_type);
// For convenience, checks if initialization state is INITIALIZED. // For convenience, checks if initialization state is INITIALIZED.
bool initialized() const { return initialization_state_ == INITIALIZED; } bool initialized() const { return initialization_state_ == INITIALIZED; }
......
...@@ -6,14 +6,15 @@ ...@@ -6,14 +6,15 @@
namespace browser_sync { namespace browser_sync {
using ::testing::_;
ACTION(InvokeTask) { ACTION(InvokeTask) {
arg3.Run(true); arg3.Run(true);
} }
SyncBackendHostMock::SyncBackendHostMock() { SyncBackendHostMock::SyncBackendHostMock() {
// By default, invoke the ready callback. // By default, invoke the ready callback.
ON_CALL(*this, ConfigureDataTypes(testing::_, testing::_, testing::_, ON_CALL(*this, ConfigureDataTypes(_, _, _, _, _)).
testing::_, testing::_)).
WillByDefault(InvokeTask()); WillByDefault(InvokeTask());
} }
......
...@@ -22,7 +22,7 @@ class SyncBackendHostMock : public SyncBackendHost { ...@@ -22,7 +22,7 @@ class SyncBackendHostMock : public SyncBackendHost {
virtual ~SyncBackendHostMock(); virtual ~SyncBackendHostMock();
MOCK_METHOD5(ConfigureDataTypes, MOCK_METHOD5(ConfigureDataTypes,
void(const DataTypeController::TypeMap&, void(const std::set<syncable::ModelType>&,
const std::set<syncable::ModelType>&, const std::set<syncable::ModelType>&,
sync_api::ConfigureReason, sync_api::ConfigureReason,
base::Callback<void(bool)>, base::Callback<void(bool)>,
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include "base/message_loop.h" #include "base/message_loop.h"
#include "chrome/browser/sync/engine/model_safe_worker.h" #include "chrome/browser/sync/engine/model_safe_worker.h"
#include "chrome/browser/sync/engine/syncapi.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/browser/sync/syncable/model_type.h"
#include "chrome/test/base/test_url_request_context_getter.h" #include "chrome/test/base/test_url_request_context_getter.h"
#include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile.h"
...@@ -112,160 +111,93 @@ TEST_F(SyncBackendHostTest, InitShutdown) { ...@@ -112,160 +111,93 @@ TEST_F(SyncBackendHostTest, InitShutdown) {
TEST_F(SyncBackendHostTest, GetPendingConfigModeState) { TEST_F(SyncBackendHostTest, GetPendingConfigModeState) {
SyncBackendHost::PendingConfigureDataTypesState state; SyncBackendHost::PendingConfigureDataTypesState state;
bool deleted_type = false;
// Empty. // Empty.
{ {
DataTypeController::TypeMap data_type_controllers; syncable::ModelTypeSet types_to_add;
syncable::ModelTypeSet types; syncable::ModelTypeSet types_to_remove;
ModelSafeRoutingInfo routing_info; ModelSafeRoutingInfo routing_info;
SyncBackendHost::GetPendingConfigModeState( 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, &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
false, &state, &deleted_type); &state);
EXPECT_TRUE(routing_info.empty()); EXPECT_TRUE(routing_info.empty());
EXPECT_TRUE(state.ready_task.is_null()); EXPECT_TRUE(state.ready_task.is_null());
EXPECT_EQ(types, state.initial_types); EXPECT_TRUE(state.types_to_add.empty());
EXPECT_FALSE(deleted_type); EXPECT_TRUE(state.added_types.empty());
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());
} }
// Add type. // Add type.
{ {
DataTypeController::TypeMap data_type_controllers; syncable::ModelTypeSet types_to_add;
data_type_controllers[syncable::BOOKMARKS] = NULL; types_to_add.insert(syncable::BOOKMARKS);
syncable::ModelTypeSet types; syncable::ModelTypeSet types_to_remove;
types.insert(syncable::BOOKMARKS);
types.insert(syncable::NIGORI);
ModelSafeRoutingInfo routing_info; ModelSafeRoutingInfo routing_info;
SyncBackendHost::GetPendingConfigModeState( 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, &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
true, &state, &deleted_type); &state);
ModelSafeRoutingInfo expected_routing_info; ModelSafeRoutingInfo expected_routing_info;
expected_routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE; expected_routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE;
EXPECT_EQ(expected_routing_info, routing_info); EXPECT_EQ(expected_routing_info, routing_info);
EXPECT_TRUE(state.ready_task.is_null()); EXPECT_TRUE(state.ready_task.is_null());
EXPECT_EQ(types, state.initial_types); EXPECT_EQ(types_to_add, state.types_to_add);
EXPECT_FALSE(deleted_type); EXPECT_EQ(types_to_add, state.added_types);
syncable::ModelTypeBitSet expected_added_types;
expected_added_types.set(syncable::BOOKMARKS);
EXPECT_EQ(expected_added_types, state.added_types);
} }
// Add existing type. // Add existing type.
{ {
DataTypeController::TypeMap data_type_controllers; syncable::ModelTypeSet types_to_add;
data_type_controllers[syncable::BOOKMARKS] = NULL; types_to_add.insert(syncable::BOOKMARKS);
syncable::ModelTypeSet types; syncable::ModelTypeSet types_to_remove;
types.insert(syncable::BOOKMARKS);
types.insert(syncable::NIGORI);
ModelSafeRoutingInfo routing_info; ModelSafeRoutingInfo routing_info;
routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE; routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE;
ModelSafeRoutingInfo expected_routing_info = routing_info; ModelSafeRoutingInfo expected_routing_info = routing_info;
SyncBackendHost::GetPendingConfigModeState( 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, &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
true, &state, &deleted_type); &state);
EXPECT_EQ(expected_routing_info, routing_info); EXPECT_EQ(expected_routing_info, routing_info);
EXPECT_TRUE(state.ready_task.is_null()); EXPECT_TRUE(state.ready_task.is_null());
EXPECT_EQ(types, state.initial_types); EXPECT_EQ(types_to_add, state.types_to_add);
EXPECT_FALSE(deleted_type); EXPECT_TRUE(state.added_types.empty());
EXPECT_TRUE(state.added_types.none());
} }
// Delete type. // Delete type.
{ {
DataTypeController::TypeMap data_type_controllers; syncable::ModelTypeSet types_to_add;
data_type_controllers[syncable::BOOKMARKS] = NULL; syncable::ModelTypeSet types_to_remove;
syncable::ModelTypeSet types; types_to_remove.insert(syncable::BOOKMARKS);
types.insert(syncable::NIGORI);
ModelSafeRoutingInfo routing_info; ModelSafeRoutingInfo routing_info;
routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE; routing_info[syncable::BOOKMARKS] = GROUP_PASSIVE;
SyncBackendHost::GetPendingConfigModeState( 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);
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)>(),
&routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION, &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
false, &state, &deleted_type); &state);
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);
syncable::ModelTypeBitSet expected_added_types; EXPECT_TRUE(routing_info.empty());
expected_added_types.set(syncable::NIGORI);
EXPECT_EQ(expected_added_types, state.added_types);
} }
// Delete Nigori. // Delete nonexistent type.
{ {
DataTypeController::TypeMap data_type_controllers; syncable::ModelTypeSet types_to_add;
syncable::ModelTypeSet types; syncable::ModelTypeSet types_to_remove;
types_to_remove.insert(syncable::BOOKMARKS);
ModelSafeRoutingInfo routing_info; ModelSafeRoutingInfo routing_info;
routing_info[syncable::NIGORI] = GROUP_PASSIVE;
SyncBackendHost::GetPendingConfigModeState( 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, &routing_info, sync_api::CONFIGURE_REASON_RECONFIGURATION,
true, &state, &deleted_type); &state);
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()); EXPECT_TRUE(routing_info.empty());
} }
} }
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "chrome/browser/sync/engine/syncapi.h" #include "chrome/browser/sync/engine/syncapi.h"
#include "chrome/browser/sync/glue/theme_util.h" #include "chrome/browser/sync/glue/theme_util.h"
#include "chrome/browser/sync/protocol/theme_specifics.pb.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.h"
#include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/common/chrome_notification_types.h" #include "chrome/common/chrome_notification_types.h"
......
...@@ -64,11 +64,11 @@ class ThemeDataTypeControllerTest : public TestingBrowserProcessTest { ...@@ -64,11 +64,11 @@ class ThemeDataTypeControllerTest : public TestingBrowserProcessTest {
} }
void SetActivateExpectations() { void SetActivateExpectations() {
EXPECT_CALL(service_, ActivateDataType(_, _)); EXPECT_CALL(service_, ActivateDataType(_, _, _));
} }
void SetStopExpectations() { void SetStopExpectations() {
EXPECT_CALL(service_, DeactivateDataType(_, _)); EXPECT_CALL(service_, DeactivateDataType(_));
EXPECT_CALL(*model_associator_, DisassociateModels(_)); EXPECT_CALL(*model_associator_, DisassociateModels(_));
} }
......
...@@ -367,12 +367,12 @@ void ProfileSyncService::InitializeBackend(bool delete_sync_data_folder) { ...@@ -367,12 +367,12 @@ void ProfileSyncService::InitializeBackend(bool delete_sync_data_folder) {
return; return;
} }
syncable::ModelTypeSet types; syncable::ModelTypeSet initial_types;
// If sync setup hasn't finished, we don't want to initialize routing info // 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 // for any data types so that we don't download updates for types that the
// user chooses not to sync on the first DownloadUpdatesCommand. // user chooses not to sync on the first DownloadUpdatesCommand.
if (HasSyncSetupCompleted()) { if (HasSyncSetupCompleted()) {
GetPreferredDataTypes(&types); GetPreferredDataTypes(&initial_types);
} }
SyncCredentials credentials = GetCredentials(); SyncCredentials credentials = GetCredentials();
...@@ -384,7 +384,7 @@ void ProfileSyncService::InitializeBackend(bool delete_sync_data_folder) { ...@@ -384,7 +384,7 @@ void ProfileSyncService::InitializeBackend(bool delete_sync_data_folder) {
this, this,
WeakHandle<JsEventHandler>(sync_js_controller_.AsWeakPtr()), WeakHandle<JsEventHandler>(sync_js_controller_.AsWeakPtr()),
sync_service_url_, sync_service_url_,
types, initial_types,
credentials, credentials,
delete_sync_data_folder); delete_sync_data_folder);
} }
...@@ -1198,22 +1198,20 @@ void ProfileSyncService::GetModelSafeRoutingInfo( ...@@ -1198,22 +1198,20 @@ void ProfileSyncService::GetModelSafeRoutingInfo(
} }
void ProfileSyncService::ActivateDataType( void ProfileSyncService::ActivateDataType(
DataTypeController* data_type_controller, syncable::ModelType type, browser_sync::ModelSafeGroup group,
ChangeProcessor* change_processor) { ChangeProcessor* change_processor) {
if (!backend_.get()) { if (!backend_.get()) {
NOTREACHED(); NOTREACHED();
return; return;
} }
DCHECK(backend_initialized_); DCHECK(backend_initialized_);
backend_->ActivateDataType(data_type_controller, change_processor); backend_->ActivateDataType(type, group, change_processor);
} }
void ProfileSyncService::DeactivateDataType( void ProfileSyncService::DeactivateDataType(syncable::ModelType type) {
DataTypeController* data_type_controller,
ChangeProcessor* change_processor) {
if (!backend_.get()) if (!backend_.get())
return; return;
backend_->DeactivateDataType(data_type_controller, change_processor); backend_->DeactivateDataType(type);
} }
void ProfileSyncService::SetPassphrase(const std::string& passphrase, void ProfileSyncService::SetPassphrase(const std::string& passphrase,
......
...@@ -389,13 +389,12 @@ class ProfileSyncService : public browser_sync::SyncFrontend, ...@@ -389,13 +389,12 @@ class ProfileSyncService : public browser_sync::SyncFrontend,
// remove this function. // remove this function.
void GetModelSafeRoutingInfo(browser_sync::ModelSafeRoutingInfo* out); void GetModelSafeRoutingInfo(browser_sync::ModelSafeRoutingInfo* out);
// Overridden by tests.
// TODO(zea): Remove these and have the dtc's call directly into the SBH. // TODO(zea): Remove these and have the dtc's call directly into the SBH.
virtual void ActivateDataType( virtual void ActivateDataType(
browser_sync::DataTypeController* data_type_controller, syncable::ModelType type, browser_sync::ModelSafeGroup group,
browser_sync::ChangeProcessor* change_processor);
virtual void DeactivateDataType(
browser_sync::DataTypeController* data_type_controller,
browser_sync::ChangeProcessor* change_processor); browser_sync::ChangeProcessor* change_processor);
virtual void DeactivateDataType(syncable::ModelType type);
// NotificationObserver implementation. // NotificationObserver implementation.
virtual void Observe(int type, virtual void Observe(int type,
......
...@@ -37,12 +37,10 @@ class ProfileSyncServiceMock : public ProfileSyncService { ...@@ -37,12 +37,10 @@ class ProfileSyncServiceMock : public ProfileSyncService {
MOCK_METHOD2(OnUnrecoverableError, MOCK_METHOD2(OnUnrecoverableError,
void(const tracked_objects::Location& location, void(const tracked_objects::Location& location,
const std::string& message)); const std::string& message));
MOCK_METHOD2(ActivateDataType, MOCK_METHOD3(ActivateDataType,
void(browser_sync::DataTypeController* data_type_controller, void(syncable::ModelType, browser_sync::ModelSafeGroup,
browser_sync::ChangeProcessor* change_processor)); browser_sync::ChangeProcessor*));
MOCK_METHOD2(DeactivateDataType, MOCK_METHOD1(DeactivateDataType, void(syncable::ModelType));
void(browser_sync::DataTypeController* data_type_controller,
browser_sync::ChangeProcessor* change_processor));
MOCK_METHOD0(InitializeBackend, void()); MOCK_METHOD0(InitializeBackend, void());
MOCK_METHOD1(AddObserver, void(Observer*)); MOCK_METHOD1(AddObserver, void(Observer*));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment