summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync
diff options
context:
space:
mode:
authorakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-11 04:58:24 +0000
committerakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-11 04:58:24 +0000
commit418b75e0f077a184e6f1ae81f7e41e98454706dd (patch)
tree9057712927d66f7e29e2981840cc86304e3d2d59 /chrome/browser/sync
parent39607f7425de9ec7b89a593ae16f24b7b1198d8c (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/sync/glue/app_change_processor.cc1
-rw-r--r--chrome/browser/sync/glue/autofill_data_type_controller_unittest.cc12
-rw-r--r--chrome/browser/sync/glue/bookmark_data_type_controller_unittest.cc4
-rw-r--r--chrome/browser/sync/glue/data_type_manager_impl.cc21
-rw-r--r--chrome/browser/sync/glue/data_type_manager_impl.h1
-rw-r--r--chrome/browser/sync/glue/data_type_manager_impl_unittest.cc4
-rw-r--r--chrome/browser/sync/glue/extension_change_processor.cc1
-rw-r--r--chrome/browser/sync/glue/extension_data_type_controller_unittest.cc4
-rw-r--r--chrome/browser/sync/glue/frontend_data_type_controller.cc6
-rw-r--r--chrome/browser/sync/glue/frontend_data_type_controller_unittest.cc4
-rw-r--r--chrome/browser/sync/glue/generic_change_processor.cc1
-rw-r--r--chrome/browser/sync/glue/non_frontend_data_type_controller.cc6
-rw-r--r--chrome/browser/sync/glue/non_frontend_data_type_controller_unittest.cc8
-rw-r--r--chrome/browser/sync/glue/preference_data_type_controller_unittest.cc4
-rw-r--r--chrome/browser/sync/glue/sync_backend_host.cc195
-rw-r--r--chrome/browser/sync/glue/sync_backend_host.h56
-rw-r--r--chrome/browser/sync/glue/sync_backend_host_mock.cc5
-rw-r--r--chrome/browser/sync/glue/sync_backend_host_mock.h2
-rw-r--r--chrome/browser/sync/glue/sync_backend_host_unittest.cc134
-rw-r--r--chrome/browser/sync/glue/theme_change_processor.cc1
-rw-r--r--chrome/browser/sync/glue/theme_data_type_controller_unittest.cc4
-rw-r--r--chrome/browser/sync/profile_sync_service.cc16
-rw-r--r--chrome/browser/sync/profile_sync_service.h7
-rw-r--r--chrome/browser/sync/profile_sync_service_mock.h10
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, &registrar_.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,
+ &registrar_.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*));