summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorskrul@chromium.org <skrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-11 21:29:26 +0000
committerskrul@chromium.org <skrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-11 21:29:26 +0000
commit371d04994828cbb44f679f2191bbe515ded93809 (patch)
treece92451ab201ba3c001f4c9606e41a6e5176245e /chrome
parent3c3651b12c736550eb815bcc88e7dbe521225fac (diff)
downloadchromium_src-371d04994828cbb44f679f2191bbe515ded93809.zip
chromium_src-371d04994828cbb44f679f2191bbe515ded93809.tar.gz
chromium_src-371d04994828cbb44f679f2191bbe515ded93809.tar.bz2
Create preferences DTC and wire it into the profile sync factory.
Also includes a small valgrind error fix. Review URL: http://codereview.chromium.org/598046 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38815 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/sync/glue/bookmark_change_processor.cc2
-rw-r--r--chrome/browser/sync/glue/bookmark_change_processor.h4
-rw-r--r--chrome/browser/sync/glue/bookmark_data_type_controller.cc8
-rw-r--r--chrome/browser/sync/glue/bookmark_data_type_controller_unittest.cc6
-rw-r--r--chrome/browser/sync/glue/preference_change_processor.cc10
-rw-r--r--chrome/browser/sync/glue/preference_change_processor.h9
-rw-r--r--chrome/browser/sync/glue/preference_data_type_controller.cc88
-rw-r--r--chrome/browser/sync/glue/preference_data_type_controller.h61
-rw-r--r--chrome/browser/sync/glue/preference_data_type_controller_unittest.cc145
-rw-r--r--chrome/browser/sync/profile_sync_factory.h24
-rw-r--r--chrome/browser/sync/profile_sync_factory_impl.cc50
-rw-r--r--chrome/browser/sync/profile_sync_factory_impl.h6
-rw-r--r--chrome/browser/sync/profile_sync_factory_impl_unittest.cc11
-rw-r--r--chrome/browser/sync/profile_sync_factory_mock.cc12
-rw-r--r--chrome/browser/sync/profile_sync_factory_mock.h9
-rw-r--r--chrome/browser/sync/profile_sync_service_unittest.cc11
-rwxr-xr-xchrome/chrome_browser.gypi2
-rwxr-xr-xchrome/chrome_tests.gypi1
-rw-r--r--chrome/common/chrome_switches.cc6
-rw-r--r--chrome/common/chrome_switches.h2
-rwxr-xr-xchrome/test/sync/engine/mock_server_connection.cc1
21 files changed, 419 insertions, 49 deletions
diff --git a/chrome/browser/sync/glue/bookmark_change_processor.cc b/chrome/browser/sync/glue/bookmark_change_processor.cc
index d41ec3e..4b7d9d6 100644
--- a/chrome/browser/sync/glue/bookmark_change_processor.cc
+++ b/chrome/browser/sync/glue/bookmark_change_processor.cc
@@ -23,6 +23,8 @@ BookmarkChangeProcessor::BookmarkChangeProcessor(
: ChangeProcessor(error_handler),
bookmark_model_(NULL),
model_associator_(model_associator) {
+ DCHECK(model_associator);
+ DCHECK(error_handler);
}
void BookmarkChangeProcessor::StartImpl(Profile* profile) {
diff --git a/chrome/browser/sync/glue/bookmark_change_processor.h b/chrome/browser/sync/glue/bookmark_change_processor.h
index 5ae1811..5e26dac 100644
--- a/chrome/browser/sync/glue/bookmark_change_processor.h
+++ b/chrome/browser/sync/glue/bookmark_change_processor.h
@@ -25,8 +25,8 @@ namespace browser_sync {
class BookmarkChangeProcessor : public BookmarkModelObserver,
public ChangeProcessor {
public:
- explicit BookmarkChangeProcessor(BookmarkModelAssociator* model_associator,
- UnrecoverableErrorHandler* error_handler);
+ BookmarkChangeProcessor(BookmarkModelAssociator* model_associator,
+ UnrecoverableErrorHandler* error_handler);
virtual ~BookmarkChangeProcessor() {}
// BookmarkModelObserver implementation.
diff --git a/chrome/browser/sync/glue/bookmark_data_type_controller.cc b/chrome/browser/sync/glue/bookmark_data_type_controller.cc
index b37c899..744b7e6 100644
--- a/chrome/browser/sync/glue/bookmark_data_type_controller.cc
+++ b/chrome/browser/sync/glue/bookmark_data_type_controller.cc
@@ -101,10 +101,10 @@ void BookmarkDataTypeController::Associate() {
DCHECK_EQ(state_, MODEL_STARTING);
state_ = ASSOCIATING;
- ProfileSyncFactory::BookmarkComponents bookmark_components =
- profile_sync_factory_->CreateBookmarkComponents(sync_service_);
- model_associator_.reset(bookmark_components.model_associator);
- change_processor_.reset(bookmark_components.change_processor);
+ ProfileSyncFactory::SyncComponents sync_components =
+ profile_sync_factory_->CreateBookmarkSyncComponents(sync_service_);
+ model_associator_.reset(sync_components.model_associator);
+ change_processor_.reset(sync_components.change_processor);
bool needs_merge = model_associator_->ChromeModelHasUserCreatedNodes() &&
model_associator_->SyncModelHasUserCreatedNodes();
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 26f025b..4598d66 100644
--- a/chrome/browser/sync/glue/bookmark_data_type_controller_unittest.cc
+++ b/chrome/browser/sync/glue/bookmark_data_type_controller_unittest.cc
@@ -68,7 +68,7 @@ class BookmarkDataTypeControllerTest : public testing::Test {
}
void SetAssociateExpectations() {
- EXPECT_CALL(*profile_sync_factory_, CreateBookmarkComponents(_));
+ EXPECT_CALL(*profile_sync_factory_, CreateBookmarkSyncComponents(_));
EXPECT_CALL(*model_associator_, ChromeModelHasUserCreatedNodes()).
WillRepeatedly(Return(false));
EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes()).
@@ -148,7 +148,7 @@ TEST_F(BookmarkDataTypeControllerTest, StartBusy) {
TEST_F(BookmarkDataTypeControllerTest, StartNeedsMerge) {
SetStartExpectations();
- EXPECT_CALL(*profile_sync_factory_, CreateBookmarkComponents(_));
+ EXPECT_CALL(*profile_sync_factory_, CreateBookmarkSyncComponents(_));
EXPECT_CALL(*model_associator_, ChromeModelHasUserCreatedNodes()).
WillRepeatedly(Return(true));
EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes()).
@@ -175,7 +175,7 @@ TEST_F(BookmarkDataTypeControllerTest, StartMergeAllowed) {
TEST_F(BookmarkDataTypeControllerTest, StartAssociationFailed) {
SetStartExpectations();
// Set up association to fail.
- EXPECT_CALL(*profile_sync_factory_, CreateBookmarkComponents(_));
+ EXPECT_CALL(*profile_sync_factory_, CreateBookmarkSyncComponents(_));
EXPECT_CALL(*model_associator_, ChromeModelHasUserCreatedNodes()).
WillRepeatedly(Return(false));
EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes()).
diff --git a/chrome/browser/sync/glue/preference_change_processor.cc b/chrome/browser/sync/glue/preference_change_processor.cc
index 4252a6f..d16b7e6 100644
--- a/chrome/browser/sync/glue/preference_change_processor.cc
+++ b/chrome/browser/sync/glue/preference_change_processor.cc
@@ -6,6 +6,7 @@
#include "base/string_util.h"
#include "chrome/browser/profile.h"
+#include "chrome/browser/sync/glue/preference_model_associator.h"
#include "chrome/browser/sync/profile_sync_service.h"
#include "chrome/browser/sync/protocol/preference_specifics.pb.h"
#include "chrome/common/json_value_serializer.h"
@@ -15,10 +16,13 @@
namespace browser_sync {
PreferenceChangeProcessor::PreferenceChangeProcessor(
+ PreferenceModelAssociator* model_associator,
UnrecoverableErrorHandler* error_handler)
: ChangeProcessor(error_handler),
pref_service_(NULL),
- model_associator_(NULL) {
+ model_associator_(model_associator) {
+ DCHECK(model_associator);
+ DCHECK(error_handler);
}
void PreferenceChangeProcessor::Observe(NotificationType type,
@@ -148,7 +152,7 @@ void PreferenceChangeProcessor::StopImpl() {
void PreferenceChangeProcessor::StartObserving() {
- DCHECK(model_associator_ && pref_service_);
+ DCHECK(pref_service_);
for (std::set<std::wstring>::const_iterator it =
model_associator_->synced_preferences().begin();
it != model_associator_->synced_preferences().end(); ++it) {
@@ -157,7 +161,7 @@ void PreferenceChangeProcessor::StartObserving() {
}
void PreferenceChangeProcessor::StopObserving() {
- DCHECK(model_associator_ && pref_service_);
+ DCHECK(pref_service_);
for (std::set<std::wstring>::const_iterator it =
model_associator_->synced_preferences().begin();
it != model_associator_->synced_preferences().end(); ++it) {
diff --git a/chrome/browser/sync/glue/preference_change_processor.h b/chrome/browser/sync/glue/preference_change_processor.h
index e3b7a96..c9787c8 100644
--- a/chrome/browser/sync/glue/preference_change_processor.h
+++ b/chrome/browser/sync/glue/preference_change_processor.h
@@ -8,13 +8,13 @@
#include "base/scoped_ptr.h"
#include "chrome/browser/sync/engine/syncapi.h"
#include "chrome/browser/sync/glue/change_processor.h"
-#include "chrome/browser/sync/glue/preference_model_associator.h"
#include "chrome/browser/sync/glue/sync_backend_host.h"
#include "chrome/common/notification_observer.h"
#include "chrome/common/pref_service.h"
namespace browser_sync {
+class PreferenceModelAssociator;
class UnrecoverableErrorHandler;
// This class is responsible for taking changes from the PrefService and
@@ -23,13 +23,10 @@ class UnrecoverableErrorHandler;
class PreferenceChangeProcessor : public ChangeProcessor,
public NotificationObserver {
public:
- explicit PreferenceChangeProcessor(UnrecoverableErrorHandler* error_handler);
+ PreferenceChangeProcessor(PreferenceModelAssociator* model_associator,
+ UnrecoverableErrorHandler* error_handler);
virtual ~PreferenceChangeProcessor() {}
- void set_model_associator(PreferenceModelAssociator* model_associator) {
- model_associator_ = model_associator;
- }
-
// NotificationObserver implementation.
// PrefService -> sync_api model change application.
virtual void Observe(NotificationType type,
diff --git a/chrome/browser/sync/glue/preference_data_type_controller.cc b/chrome/browser/sync/glue/preference_data_type_controller.cc
new file mode 100644
index 0000000..312e4f8
--- /dev/null
+++ b/chrome/browser/sync/glue/preference_data_type_controller.cc
@@ -0,0 +1,88 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/histogram.h"
+#include "base/logging.h"
+#include "base/time.h"
+#include "chrome/browser/chrome_thread.h"
+#include "chrome/browser/sync/glue/preference_change_processor.h"
+#include "chrome/browser/sync/glue/preference_data_type_controller.h"
+#include "chrome/browser/sync/glue/preference_model_associator.h"
+#include "chrome/browser/sync/profile_sync_service.h"
+#include "chrome/browser/sync/profile_sync_factory.h"
+
+namespace browser_sync {
+
+PreferenceDataTypeController::PreferenceDataTypeController(
+ ProfileSyncFactory* profile_sync_factory,
+ ProfileSyncService* sync_service)
+ : profile_sync_factory_(profile_sync_factory),
+ sync_service_(sync_service),
+ state_(NOT_RUNNING) {
+ DCHECK(profile_sync_factory);
+ DCHECK(sync_service);
+}
+
+PreferenceDataTypeController::~PreferenceDataTypeController() {
+}
+
+void PreferenceDataTypeController::Start(bool merge_allowed,
+ StartCallback* start_callback) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+ if (state_ != NOT_RUNNING) {
+ start_callback->Run(BUSY);
+ delete start_callback;
+ return;
+ }
+
+ // No additional services need to be started before we can proceed
+ // with model association.
+ ProfileSyncFactory::SyncComponents sync_components =
+ profile_sync_factory_->CreatePreferenceSyncComponents(sync_service_);
+ model_associator_.reset(sync_components.model_associator);
+ change_processor_.reset(sync_components.change_processor);
+ bool needs_merge = model_associator_->ChromeModelHasUserCreatedNodes() &&
+ model_associator_->SyncModelHasUserCreatedNodes();
+ if (needs_merge && !merge_allowed) {
+ model_associator_.reset();
+ change_processor_.reset();
+ start_callback->Run(NEEDS_MERGE);
+ delete start_callback;
+ return;
+ }
+
+ base::TimeTicks start_time = base::TimeTicks::Now();
+ bool first_run = !model_associator_->SyncModelHasUserCreatedNodes();
+ bool merge_success = model_associator_->AssociateModels();
+ UMA_HISTOGRAM_TIMES("Sync.PreferenceAssociationTime",
+ base::TimeTicks::Now() - start_time);
+ if (!merge_success) {
+ model_associator_.reset();
+ change_processor_.reset();
+ start_callback->Run(ASSOCIATION_FAILED);
+ delete start_callback;
+ return;
+ }
+
+ sync_service_->ActivateDataType(this, change_processor_.get());
+ state_ = RUNNING;
+ start_callback->Run(first_run ? OK_FIRST_RUN : OK);
+ delete start_callback;
+}
+
+void PreferenceDataTypeController::Stop() {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+ if (change_processor_ != NULL)
+ sync_service_->DeactivateDataType(this, change_processor_.get());
+
+ if (model_associator_ != NULL)
+ model_associator_->DisassociateModels();
+
+ change_processor_.reset();
+ model_associator_.reset();
+
+ state_ = NOT_RUNNING;
+}
+
+} // namespace browser_sync
diff --git a/chrome/browser/sync/glue/preference_data_type_controller.h b/chrome/browser/sync/glue/preference_data_type_controller.h
new file mode 100644
index 0000000..bffd6b2
--- /dev/null
+++ b/chrome/browser/sync/glue/preference_data_type_controller.h
@@ -0,0 +1,61 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SYNC_GLUE_PREFERENCE_DATA_TYPE_CONTROLLER_H__
+#define CHROME_BROWSER_SYNC_GLUE_PREFERENCE_DATA_TYPE_CONTROLLER_H__
+
+#include "base/basictypes.h"
+#include "base/scoped_ptr.h"
+#include "chrome/browser/sync/glue/data_type_controller.h"
+
+class ProfileSyncFactory;
+class ProfileSyncService;
+
+namespace browser_sync {
+
+class AssociatorInterface;
+class ChangeProcessor;
+
+class PreferenceDataTypeController : public DataTypeController {
+ public:
+ PreferenceDataTypeController(
+ ProfileSyncFactory* profile_sync_factory,
+ ProfileSyncService* sync_service);
+ virtual ~PreferenceDataTypeController();
+
+ virtual void Start(bool merge_allowed, StartCallback* start_callback);
+
+ virtual void Stop();
+
+ virtual bool enabled() {
+ return true;
+ }
+
+ virtual syncable::ModelType type() {
+ return syncable::PREFERENCES;
+ }
+
+ virtual browser_sync::ModelSafeGroup model_safe_group() {
+ return browser_sync::GROUP_UI;
+ }
+
+ virtual State state() {
+ return state_;
+ }
+
+ private:
+ ProfileSyncFactory* profile_sync_factory_;
+ ProfileSyncService* sync_service_;
+
+ State state_;
+
+ scoped_ptr<AssociatorInterface> model_associator_;
+ scoped_ptr<ChangeProcessor> change_processor_;
+
+ DISALLOW_COPY_AND_ASSIGN(PreferenceDataTypeController);
+};
+
+} // namespace browser_sync
+
+#endif // CHROME_BROWSER_SYNC_GLUE_PREFERENCE_DATA_TYPE_CONTROLLER_H__
diff --git a/chrome/browser/sync/glue/preference_data_type_controller_unittest.cc b/chrome/browser/sync/glue/preference_data_type_controller_unittest.cc
new file mode 100644
index 0000000..47f7cb6
--- /dev/null
+++ b/chrome/browser/sync/glue/preference_data_type_controller_unittest.cc
@@ -0,0 +1,145 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include "base/message_loop.h"
+#include "base/scoped_ptr.h"
+#include "base/task.h"
+#include "chrome/browser/chrome_thread.h"
+#include "chrome/browser/sync/glue/preference_data_type_controller.h"
+#include "chrome/browser/sync/glue/change_processor_mock.h"
+#include "chrome/browser/sync/glue/model_associator_mock.h"
+#include "chrome/browser/sync/profile_sync_factory_mock.h"
+#include "chrome/browser/sync/profile_sync_service_mock.h"
+
+using browser_sync::PreferenceDataTypeController;
+using browser_sync::ChangeProcessorMock;
+using browser_sync::DataTypeController;
+using browser_sync::ModelAssociatorMock;
+using testing::_;
+using testing::Return;
+
+class StartCallback {
+ public:
+ MOCK_METHOD1(Run, void(DataTypeController::StartResult result));
+};
+
+class PreferenceDataTypeControllerTest : public testing::Test {
+ public:
+ PreferenceDataTypeControllerTest()
+ : ui_thread_(ChromeThread::UI, &message_loop_) {}
+
+ virtual void SetUp() {
+ profile_sync_factory_.reset(new ProfileSyncFactoryMock());
+ preference_dtc_.reset(
+ new PreferenceDataTypeController(profile_sync_factory_.get(),
+ &service_));
+ }
+
+ protected:
+ void SetAssociateExpectations() {
+ model_associator_ = new ModelAssociatorMock();
+ change_processor_ = new ChangeProcessorMock();
+ EXPECT_CALL(*profile_sync_factory_, CreatePreferenceSyncComponents(_)).
+ WillOnce(Return(ProfileSyncFactory::SyncComponents(model_associator_,
+ change_processor_)));
+ EXPECT_CALL(*model_associator_, ChromeModelHasUserCreatedNodes()).
+ WillRepeatedly(Return(false));
+ EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes()).
+ WillRepeatedly(Return(true));
+ EXPECT_CALL(*model_associator_, AssociateModels()).
+ WillRepeatedly(Return(true));
+ }
+
+ void SetActivateExpectations() {
+ EXPECT_CALL(service_, ActivateDataType(_, _));
+ }
+
+ void SetStopExpectations() {
+ EXPECT_CALL(service_, DeactivateDataType(_, _));
+ EXPECT_CALL(*model_associator_, DisassociateModels());
+ }
+
+ MessageLoopForUI message_loop_;
+ ChromeThread ui_thread_;
+ scoped_ptr<PreferenceDataTypeController> preference_dtc_;
+ scoped_ptr<ProfileSyncFactoryMock> profile_sync_factory_;
+ ProfileSyncServiceMock service_;
+ ModelAssociatorMock* model_associator_;
+ ChangeProcessorMock* change_processor_;
+ StartCallback start_callback_;
+};
+
+TEST_F(PreferenceDataTypeControllerTest, Start) {
+ SetAssociateExpectations();
+ SetActivateExpectations();
+ EXPECT_EQ(DataTypeController::NOT_RUNNING, preference_dtc_->state());
+ EXPECT_CALL(start_callback_, Run(DataTypeController::OK));
+ preference_dtc_->Start(false,
+ NewCallback(&start_callback_, &StartCallback::Run));
+ EXPECT_EQ(DataTypeController::RUNNING, preference_dtc_->state());
+}
+
+TEST_F(PreferenceDataTypeControllerTest, StartFirstRun) {
+ SetAssociateExpectations();
+ SetActivateExpectations();
+ EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes()).
+ WillRepeatedly(Return(false));
+ EXPECT_CALL(start_callback_, Run(DataTypeController::OK_FIRST_RUN));
+ preference_dtc_->Start(false,
+ NewCallback(&start_callback_, &StartCallback::Run));
+}
+
+TEST_F(PreferenceDataTypeControllerTest, StartNeedsMerge) {
+ SetAssociateExpectations();
+ EXPECT_CALL(*model_associator_, ChromeModelHasUserCreatedNodes()).
+ WillRepeatedly(Return(true));
+ EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes()).
+ WillRepeatedly(Return(true));
+
+ EXPECT_CALL(start_callback_, Run(DataTypeController::NEEDS_MERGE));
+ preference_dtc_->Start(false,
+ NewCallback(&start_callback_, &StartCallback::Run));
+}
+
+TEST_F(PreferenceDataTypeControllerTest, StartMergeAllowed) {
+ SetAssociateExpectations();
+ SetActivateExpectations();
+ EXPECT_CALL(*model_associator_, ChromeModelHasUserCreatedNodes()).
+ WillRepeatedly(Return(true));
+ EXPECT_CALL(*model_associator_, SyncModelHasUserCreatedNodes()).
+ WillRepeatedly(Return(true));
+
+ EXPECT_CALL(start_callback_, Run(DataTypeController::OK));
+ preference_dtc_->Start(true,
+ NewCallback(&start_callback_, &StartCallback::Run));
+}
+
+TEST_F(PreferenceDataTypeControllerTest, StartAssociationFailed) {
+ SetAssociateExpectations();
+ EXPECT_CALL(*model_associator_, AssociateModels()).
+ WillRepeatedly(Return(false));
+
+ EXPECT_CALL(start_callback_, Run(DataTypeController::ASSOCIATION_FAILED));
+ preference_dtc_->Start(true,
+ NewCallback(&start_callback_, &StartCallback::Run));
+ EXPECT_EQ(DataTypeController::NOT_RUNNING, preference_dtc_->state());
+}
+
+TEST_F(PreferenceDataTypeControllerTest, Stop) {
+ SetAssociateExpectations();
+ SetActivateExpectations();
+ SetStopExpectations();
+
+ EXPECT_EQ(DataTypeController::NOT_RUNNING, preference_dtc_->state());
+
+ EXPECT_CALL(start_callback_, Run(DataTypeController::OK));
+ preference_dtc_->Start(false,
+ NewCallback(&start_callback_, &StartCallback::Run));
+ EXPECT_EQ(DataTypeController::RUNNING, preference_dtc_->state());
+ preference_dtc_->Stop();
+ EXPECT_EQ(DataTypeController::NOT_RUNNING, preference_dtc_->state());
+
+}
diff --git a/chrome/browser/sync/profile_sync_factory.h b/chrome/browser/sync/profile_sync_factory.h
index 107807e..dc728af 100644
--- a/chrome/browser/sync/profile_sync_factory.h
+++ b/chrome/browser/sync/profile_sync_factory.h
@@ -18,11 +18,15 @@ class ChangeProcessor;
// Factory class for all profile sync related classes.
class ProfileSyncFactory {
public:
- struct BookmarkComponents {
+ // The various factory methods for the data type model associators
+ // and change processors all return this struct. This is needed
+ // because the change processors typically require a type-specific
+ // model associator at construction time.
+ struct SyncComponents {
browser_sync::AssociatorInterface* model_associator;
browser_sync::ChangeProcessor* change_processor;
- BookmarkComponents(browser_sync::AssociatorInterface* ma,
- browser_sync::ChangeProcessor* cp)
+ SyncComponents(browser_sync::AssociatorInterface* ma,
+ browser_sync::ChangeProcessor* cp)
: model_associator(ma), change_processor(cp) {}
};
@@ -34,11 +38,15 @@ class ProfileSyncFactory {
virtual ProfileSyncService* CreateProfileSyncService() = 0;
// Instantiates both a model associator and change processor for the
- // bookmark data type. Ideally we would have separate factory
- // methods for these components, but the bookmark implementation of
- // these are tightly coupled and must be created at the same time.
- // The pointers in the return struct are owned by the caller.
- virtual BookmarkComponents CreateBookmarkComponents(
+ // bookmark data type. The pointers in the return struct are owned
+ // by the caller.
+ virtual SyncComponents CreateBookmarkSyncComponents(
+ ProfileSyncService* profile_sync_service) = 0;
+
+ // Instantiates both a model associator and change processor for the
+ // preference data type. The pointers in the return struct are
+ // owned by the caller.
+ virtual SyncComponents CreatePreferenceSyncComponents(
ProfileSyncService* profile_sync_service) = 0;
};
diff --git a/chrome/browser/sync/profile_sync_factory_impl.cc b/chrome/browser/sync/profile_sync_factory_impl.cc
index d7658de..f3a4379 100644
--- a/chrome/browser/sync/profile_sync_factory_impl.cc
+++ b/chrome/browser/sync/profile_sync_factory_impl.cc
@@ -8,11 +8,21 @@
#include "chrome/browser/sync/glue/bookmark_change_processor.h"
#include "chrome/browser/sync/glue/bookmark_data_type_controller.h"
#include "chrome/browser/sync/glue/bookmark_model_associator.h"
+#include "chrome/browser/sync/glue/preference_change_processor.h"
+#include "chrome/browser/sync/glue/preference_data_type_controller.h"
+#include "chrome/browser/sync/glue/preference_model_associator.h"
#include "chrome/browser/sync/glue/model_associator.h"
#include "chrome/browser/sync/profile_sync_service.h"
#include "chrome/browser/sync/profile_sync_factory_impl.h"
#include "chrome/common/chrome_switches.h"
+using browser_sync::BookmarkDataTypeController;
+using browser_sync::PreferenceDataTypeController;
+using browser_sync::BookmarkChangeProcessor;
+using browser_sync::BookmarkModelAssociator;
+using browser_sync::PreferenceChangeProcessor;
+using browser_sync::PreferenceModelAssociator;
+
ProfileSyncFactoryImpl::ProfileSyncFactoryImpl(
Profile* profile,
CommandLine* command_line)
@@ -22,21 +32,41 @@ ProfileSyncFactoryImpl::ProfileSyncFactoryImpl(
ProfileSyncService* ProfileSyncFactoryImpl::CreateProfileSyncService() {
ProfileSyncService* pss = new ProfileSyncService(profile_);
- // Bookmark sync is enabled by default. Register unless explicitly disabled.
+ // Bookmark sync is enabled by default. Register unless explicitly
+ // disabled.
if (!command_line_->HasSwitch(switches::kDisableSyncBookmarks)) {
pss->RegisterDataTypeController(
- new browser_sync::BookmarkDataTypeController(this, profile_, pss));
+ new BookmarkDataTypeController(this, profile_, pss));
+ }
+
+ // Preference sync is disabled by default. Register only if
+ // explicitly enabled.
+ if (command_line_->HasSwitch(switches::kEnableSyncPreferences)) {
+ pss->RegisterDataTypeController(
+ new PreferenceDataTypeController(this, pss));
}
+
return pss;
}
-ProfileSyncFactory::BookmarkComponents
-ProfileSyncFactoryImpl::CreateBookmarkComponents(
+ProfileSyncFactory::SyncComponents
+ProfileSyncFactoryImpl::CreateBookmarkSyncComponents(
+ ProfileSyncService* profile_sync_service) {
+ BookmarkModelAssociator* model_associator =
+ new BookmarkModelAssociator(profile_sync_service);
+ BookmarkChangeProcessor* change_processor =
+ new BookmarkChangeProcessor(model_associator,
+ profile_sync_service);
+ return SyncComponents(model_associator, change_processor);
+}
+
+ProfileSyncFactory::SyncComponents
+ProfileSyncFactoryImpl::CreatePreferenceSyncComponents(
ProfileSyncService* profile_sync_service) {
- browser_sync::BookmarkModelAssociator* model_associator =
- new browser_sync::BookmarkModelAssociator(profile_sync_service);
- browser_sync::BookmarkChangeProcessor* change_processor =
- new browser_sync::BookmarkChangeProcessor(model_associator,
- profile_sync_service);
- return BookmarkComponents(model_associator, change_processor);
+ PreferenceModelAssociator* model_associator =
+ new PreferenceModelAssociator(profile_sync_service);
+ PreferenceChangeProcessor* change_processor =
+ new PreferenceChangeProcessor(model_associator,
+ profile_sync_service);
+ return SyncComponents(model_associator, change_processor);
}
diff --git a/chrome/browser/sync/profile_sync_factory_impl.h b/chrome/browser/sync/profile_sync_factory_impl.h
index 638a508..a6c9547 100644
--- a/chrome/browser/sync/profile_sync_factory_impl.h
+++ b/chrome/browser/sync/profile_sync_factory_impl.h
@@ -16,9 +16,13 @@ class ProfileSyncFactoryImpl : public ProfileSyncFactory {
ProfileSyncFactoryImpl(Profile* profile, CommandLine* command_line);
virtual ~ProfileSyncFactoryImpl() {}
+ // ProfileSyncFactory interface.
virtual ProfileSyncService* CreateProfileSyncService();
- virtual BookmarkComponents CreateBookmarkComponents(
+ virtual SyncComponents CreateBookmarkSyncComponents(
+ ProfileSyncService* profile_sync_service);
+
+ virtual SyncComponents CreatePreferenceSyncComponents(
ProfileSyncService* profile_sync_service);
private:
diff --git a/chrome/browser/sync/profile_sync_factory_impl_unittest.cc b/chrome/browser/sync/profile_sync_factory_impl_unittest.cc
index 1dbbdb3..9645ec0 100644
--- a/chrome/browser/sync/profile_sync_factory_impl_unittest.cc
+++ b/chrome/browser/sync/profile_sync_factory_impl_unittest.cc
@@ -52,3 +52,14 @@ TEST_F(ProfileSyncFactoryImplTest, CreatePSSDisableBookmarks) {
EXPECT_EQ(0U, controllers.size());
EXPECT_EQ(0U, controllers.count(syncable::BOOKMARKS));
}
+
+TEST_F(ProfileSyncFactoryImplTest, CreatePSSEnablePreferences) {
+ command_line_->AppendSwitch(switches::kEnableSyncPreferences);
+ scoped_ptr<ProfileSyncService> pss;
+ pss.reset(profile_sync_service_factory_->CreateProfileSyncService());
+ ProfileSyncService::DataTypeControllerMap controllers(
+ pss->data_type_controllers());
+ EXPECT_EQ(2U, controllers.size());
+ EXPECT_EQ(1U, controllers.count(syncable::BOOKMARKS));
+ EXPECT_EQ(1U, controllers.count(syncable::PREFERENCES));
+}
diff --git a/chrome/browser/sync/profile_sync_factory_mock.cc b/chrome/browser/sync/profile_sync_factory_mock.cc
index c30331f..1a5179a 100644
--- a/chrome/browser/sync/profile_sync_factory_mock.cc
+++ b/chrome/browser/sync/profile_sync_factory_mock.cc
@@ -16,15 +16,15 @@ ProfileSyncFactoryMock::ProfileSyncFactoryMock(
ChangeProcessor* bookmark_change_processor)
: bookmark_model_associator_(bookmark_model_associator),
bookmark_change_processor_(bookmark_change_processor) {
- ON_CALL(*this, CreateBookmarkComponents(_)).
+ ON_CALL(*this, CreateBookmarkSyncComponents(_)).
WillByDefault(
InvokeWithoutArgs(
this,
- &ProfileSyncFactoryMock::MakeBookmarkComponents));
+ &ProfileSyncFactoryMock::MakeBookmarkSyncComponents));
}
-ProfileSyncFactory::BookmarkComponents
-ProfileSyncFactoryMock::MakeBookmarkComponents() {
- return BookmarkComponents(bookmark_model_associator_.release(),
- bookmark_change_processor_.release());
+ProfileSyncFactory::SyncComponents
+ProfileSyncFactoryMock::MakeBookmarkSyncComponents() {
+ return SyncComponents(bookmark_model_associator_.release(),
+ bookmark_change_processor_.release());
}
diff --git a/chrome/browser/sync/profile_sync_factory_mock.h b/chrome/browser/sync/profile_sync_factory_mock.h
index 3ac7d51..ec2ff2c 100644
--- a/chrome/browser/sync/profile_sync_factory_mock.h
+++ b/chrome/browser/sync/profile_sync_factory_mock.h
@@ -17,17 +17,20 @@ class ChangeProcessor;
class ProfileSyncFactoryMock : public ProfileSyncFactory {
public:
+ ProfileSyncFactoryMock() {}
ProfileSyncFactoryMock(
browser_sync::AssociatorInterface* bookmark_model_associator,
browser_sync::ChangeProcessor* bookmark_change_processor);
MOCK_METHOD0(CreateProfileSyncService,
ProfileSyncService*(void));
- MOCK_METHOD1(CreateBookmarkComponents,
- BookmarkComponents(ProfileSyncService* profile_sync_service));
+ MOCK_METHOD1(CreateBookmarkSyncComponents,
+ SyncComponents(ProfileSyncService* profile_sync_service));
+ MOCK_METHOD1(CreatePreferenceSyncComponents,
+ SyncComponents(ProfileSyncService* profile_sync_service));
private:
- BookmarkComponents MakeBookmarkComponents();
+ SyncComponents MakeBookmarkSyncComponents();
scoped_ptr<browser_sync::AssociatorInterface> bookmark_model_associator_;
scoped_ptr<browser_sync::ChangeProcessor> bookmark_change_processor_;
diff --git a/chrome/browser/sync/profile_sync_service_unittest.cc b/chrome/browser/sync/profile_sync_service_unittest.cc
index 2e54c5b..1753370 100644
--- a/chrome/browser/sync/profile_sync_service_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_unittest.cc
@@ -51,10 +51,15 @@ class TestProfileSyncFactory : public ProfileSyncFactory {
return profile_sync_service_.release();
}
- virtual BookmarkComponents CreateBookmarkComponents(
+ virtual SyncComponents CreateBookmarkSyncComponents(
ProfileSyncService* service) {
- return BookmarkComponents(model_associator_.release(),
- change_processor_.release());
+ return SyncComponents(model_associator_.release(),
+ change_processor_.release());
+ }
+
+ virtual SyncComponents CreatePreferenceSyncComponents(
+ ProfileSyncService* service) {
+ return SyncComponents(NULL, NULL);
}
private:
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index d16a4d8..ff37766 100755
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1682,6 +1682,8 @@
'browser/sync/glue/model_associator.h',
'browser/sync/glue/preference_change_processor.cc',
'browser/sync/glue/preference_change_processor.h',
+ 'browser/sync/glue/preference_data_type_controller.cc',
+ 'browser/sync/glue/preference_data_type_controller.h',
'browser/sync/glue/preference_model_associator.cc',
'browser/sync/glue/preference_model_associator.h',
'browser/sync/glue/sync_backend_host.cc',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index fea4898..1a2c4b3 100755
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -1463,6 +1463,7 @@
'browser/sync/engine/syncproto_unittest.cc',
'browser/sync/glue/bookmark_data_type_controller_unittest.cc',
'browser/sync/glue/change_processor_mock.h',
+ 'browser/sync/glue/preference_data_type_controller_unittest.cc',
'browser/sync/notifier/base/mac/network_status_detector_task_mac_unittest.cc',
'browser/sync/notifier/listener/talk_mediator_unittest.cc',
'browser/sync/notifier/listener/send_update_task_unittest.cc',
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index eba0a6e..89b4c59 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -157,6 +157,9 @@ const char kDisableSync[] = "disable-sync";
// Disable syncing of bookmarks.
const char kDisableSyncBookmarks[] = "disable-sync-bookmarks";
+// Disable syncing of preferences.
+const char kDisableSyncPreferences[] = "disable-sync-preferences";
+
// Enables the backend service for web resources, used in the new tab page for
// loading tips and recommendations from a JSON feed.
const char kDisableWebResources[] = "disable-web-resources";
@@ -277,6 +280,9 @@ const char kEnableSync[] = "enable-sync";
// Enable syncing browser bookmarks.
const char kEnableSyncBookmarks[] = "enable-sync-bookmarks";
+// Enable syncing browser preferences.
+const char kEnableSyncPreferences[] = "enable-sync-preferences";
+
// Whether the multiple profiles feature based on the user-data-dir flag is
// enabled or not.
const char kEnableUserDataDirProfiles[] = "enable-udd-profiles";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 0cd2873..5fa0fef 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -60,6 +60,7 @@ extern const char kDisableSharedWorkers[];
extern const char kDisableSiteSpecificQuirks[];
extern const char kDisableSync[];
extern const char kDisableSyncBookmarks[];
+extern const char kDisableSyncPreferences[];
extern const char kDisableWebResources[];
extern const char kDisableWebSecurity[];
extern const char kDisableWebSockets[];
@@ -97,6 +98,7 @@ extern const char kEnableSessionStorage[];
extern const char kEnableStatsTable[];
extern const char kEnableSync[];
extern const char kEnableSyncBookmarks[];
+extern const char kEnableSyncPreferences[];
extern const char kEnableUserDataDirProfiles[];
extern const char kEnableVerticalTabs[];
extern const char kEnableWatchdog[];
diff --git a/chrome/test/sync/engine/mock_server_connection.cc b/chrome/test/sync/engine/mock_server_connection.cc
index cbea2d9..ce3b03d 100755
--- a/chrome/test/sync/engine/mock_server_connection.cc
+++ b/chrome/test/sync/engine/mock_server_connection.cc
@@ -46,6 +46,7 @@ MockConnectionManager::MockConnectionManager(DirectoryManager* dirmgr,
mid_commit_callback_(NULL),
mid_commit_observer_(NULL),
throttling_(false),
+ fail_with_auth_invalid_(false),
fail_non_periodic_get_updates_(false),
client_command_(NULL),
next_position_in_parent_(2),