profile_sync_factory_impl.cc revision dc0f95d653279beabeb9817299e2902918ba123e
1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/command_line.h"
6#include "chrome/browser/profiles/profile.h"
7#include "chrome/browser/sync/glue/app_data_type_controller.h"
8#include "chrome/browser/sync/glue/autofill_change_processor.h"
9#include "chrome/browser/sync/glue/autofill_data_type_controller.h"
10#include "chrome/browser/sync/glue/autofill_model_associator.h"
11#include "chrome/browser/sync/glue/autofill_profile_change_processor.h"
12#include "chrome/browser/sync/glue/autofill_profile_data_type_controller.h"
13#include "chrome/browser/sync/glue/autofill_profile_model_associator.h"
14#include "chrome/browser/sync/glue/bookmark_change_processor.h"
15#include "chrome/browser/sync/glue/bookmark_data_type_controller.h"
16#include "chrome/browser/sync/glue/bookmark_model_associator.h"
17#include "chrome/browser/sync/glue/data_type_manager_impl.h"
18#include "chrome/browser/sync/glue/data_type_manager_impl2.h"
19#include "chrome/browser/sync/glue/extension_change_processor.h"
20#include "chrome/browser/sync/glue/extension_data_type_controller.h"
21#include "chrome/browser/sync/glue/extension_model_associator.h"
22#include "chrome/browser/sync/glue/extension_sync_traits.h"
23#include "chrome/browser/sync/glue/password_change_processor.h"
24#include "chrome/browser/sync/glue/password_data_type_controller.h"
25#include "chrome/browser/sync/glue/password_model_associator.h"
26#include "chrome/browser/sync/glue/preference_change_processor.h"
27#include "chrome/browser/sync/glue/preference_data_type_controller.h"
28#include "chrome/browser/sync/glue/preference_model_associator.h"
29#include "chrome/browser/sync/glue/session_change_processor.h"
30#include "chrome/browser/sync/glue/session_data_type_controller.h"
31#include "chrome/browser/sync/glue/session_model_associator.h"
32#include "chrome/browser/sync/glue/sync_backend_host.h"
33#include "chrome/browser/sync/glue/theme_change_processor.h"
34#include "chrome/browser/sync/glue/theme_data_type_controller.h"
35#include "chrome/browser/sync/glue/theme_model_associator.h"
36#include "chrome/browser/sync/glue/typed_url_change_processor.h"
37#include "chrome/browser/sync/glue/typed_url_data_type_controller.h"
38#include "chrome/browser/sync/glue/typed_url_model_associator.h"
39#include "chrome/browser/sync/profile_sync_service.h"
40#include "chrome/browser/sync/profile_sync_factory_impl.h"
41#include "chrome/browser/webdata/web_data_service.h"
42#include "chrome/common/chrome_switches.h"
43
44using browser_sync::AppDataTypeController;
45using browser_sync::AutofillChangeProcessor;
46using browser_sync::AutofillProfileChangeProcessor;
47using browser_sync::AutofillDataTypeController;
48using browser_sync::AutofillProfileDataTypeController;
49using browser_sync::AutofillModelAssociator;
50using browser_sync::AutofillProfileModelAssociator;
51using browser_sync::BookmarkChangeProcessor;
52using browser_sync::BookmarkDataTypeController;
53using browser_sync::BookmarkModelAssociator;
54using browser_sync::DataTypeController;
55using browser_sync::DataTypeManager;
56using browser_sync::DataTypeManagerImpl;
57using browser_sync::DataTypeManagerImpl2;
58using browser_sync::ExtensionChangeProcessor;
59using browser_sync::ExtensionDataTypeController;
60using browser_sync::ExtensionModelAssociator;
61using browser_sync::PasswordChangeProcessor;
62using browser_sync::PasswordDataTypeController;
63using browser_sync::PasswordModelAssociator;
64using browser_sync::PreferenceChangeProcessor;
65using browser_sync::PreferenceDataTypeController;
66using browser_sync::PreferenceModelAssociator;
67using browser_sync::SessionChangeProcessor;
68using browser_sync::SessionDataTypeController;
69using browser_sync::SessionModelAssociator;
70using browser_sync::SyncBackendHost;
71using browser_sync::ThemeChangeProcessor;
72using browser_sync::ThemeDataTypeController;
73using browser_sync::ThemeModelAssociator;
74using browser_sync::TypedUrlChangeProcessor;
75using browser_sync::TypedUrlDataTypeController;
76using browser_sync::TypedUrlModelAssociator;
77using browser_sync::UnrecoverableErrorHandler;
78
79ProfileSyncFactoryImpl::ProfileSyncFactoryImpl(Profile* profile,
80                                               CommandLine* command_line)
81    : profile_(profile),
82      command_line_(command_line) {
83}
84
85ProfileSyncService* ProfileSyncFactoryImpl::CreateProfileSyncService(
86    const std::string& cros_user) {
87
88  ProfileSyncService* pss = new ProfileSyncService(
89      this, profile_, cros_user);
90
91  // App sync is enabled by default.  Register unless explicitly
92  // disabled.
93  if (!command_line_->HasSwitch(switches::kDisableSyncApps)) {
94    pss->RegisterDataTypeController(
95        new AppDataTypeController(this, profile_, pss));
96  }
97
98  // Autofill sync is enabled by default.  Register unless explicitly
99  // disabled.
100  if (!command_line_->HasSwitch(switches::kDisableSyncAutofill)) {
101    pss->RegisterDataTypeController(
102        new AutofillDataTypeController(this, profile_, pss));
103  }
104
105  // Bookmark sync is enabled by default.  Register unless explicitly
106  // disabled.
107  if (!command_line_->HasSwitch(switches::kDisableSyncBookmarks)) {
108    pss->RegisterDataTypeController(
109        new BookmarkDataTypeController(this, profile_, pss));
110  }
111
112  // Extension sync is enabled by default.  Register unless explicitly
113  // disabled.
114  if (!command_line_->HasSwitch(switches::kDisableSyncExtensions)) {
115    pss->RegisterDataTypeController(
116        new ExtensionDataTypeController(this, profile_, pss));
117  }
118
119#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_CHROMEOS)
120  if (command_line_->HasSwitch(switches::kEnableSyncPasswords)) {
121#else
122  // Password sync is enabled by default.  Register unless explicitly
123  // disabled.
124  if (!command_line_->HasSwitch(switches::kDisableSyncPasswords)) {
125#endif
126    pss->RegisterDataTypeController(
127        new PasswordDataTypeController(this, profile_, pss));
128  }
129
130  // Preference sync is enabled by default.  Register unless explicitly
131  // disabled.
132  if (!command_line_->HasSwitch(switches::kDisableSyncPreferences)) {
133    pss->RegisterDataTypeController(
134        new PreferenceDataTypeController(this, pss));
135  }
136
137  // Theme sync is enabled by default.  Register unless explicitly disabled.
138  if (!command_line_->HasSwitch(switches::kDisableSyncThemes)) {
139    pss->RegisterDataTypeController(
140        new ThemeDataTypeController(this, profile_, pss));
141  }
142
143  // TypedUrl sync is disabled by default.  Register only if
144  // explicitly enabled.
145  if (command_line_->HasSwitch(switches::kEnableSyncTypedUrls)) {
146    pss->RegisterDataTypeController(
147        new TypedUrlDataTypeController(this, profile_, pss));
148  }
149
150  // Session sync is disabled by default.  Register only if explicitly
151  // enabled.
152  if (command_line_->HasSwitch(switches::kEnableSyncSessions)) {
153    pss->RegisterDataTypeController(
154        new SessionDataTypeController(this, pss));
155  }
156
157  if (!command_line_->HasSwitch(switches::kDisableSyncAutofillProfile)) {
158    pss->RegisterDataTypeController(new AutofillProfileDataTypeController(
159        this, profile_, pss));
160  }
161  return pss;
162}
163
164DataTypeManager* ProfileSyncFactoryImpl::CreateDataTypeManager(
165    SyncBackendHost* backend,
166    const DataTypeController::TypeMap& controllers) {
167  if (command_line_->HasSwitch(switches::kNewSyncerThread))
168    return new DataTypeManagerImpl2(backend, controllers);
169  else
170    return new DataTypeManagerImpl(backend, controllers);
171}
172
173ProfileSyncFactory::SyncComponents
174ProfileSyncFactoryImpl::CreateAppSyncComponents(
175    ProfileSyncService* profile_sync_service,
176    UnrecoverableErrorHandler* error_handler) {
177  browser_sync::ExtensionSyncTraits traits = browser_sync::GetAppSyncTraits();
178  // For now we simply use extensions sync objects with the app sync
179  // traits.  If apps become more than simply extensions, we may have
180  // to write our own apps model associator and/or change processor.
181  ExtensionModelAssociator* model_associator =
182      new ExtensionModelAssociator(traits, profile_sync_service);
183  ExtensionChangeProcessor* change_processor =
184      new ExtensionChangeProcessor(traits, error_handler);
185  return SyncComponents(model_associator, change_processor);
186}
187
188ProfileSyncFactory::SyncComponents
189ProfileSyncFactoryImpl::CreateAutofillSyncComponents(
190    ProfileSyncService* profile_sync_service,
191    WebDatabase* web_database,
192    PersonalDataManager* personal_data,
193    browser_sync::UnrecoverableErrorHandler* error_handler) {
194
195  AutofillModelAssociator* model_associator =
196      new AutofillModelAssociator(profile_sync_service,
197                                  web_database,
198                                  personal_data);
199  AutofillChangeProcessor* change_processor =
200      new AutofillChangeProcessor(model_associator,
201                                  web_database,
202                                  personal_data,
203                                  error_handler);
204  return SyncComponents(model_associator, change_processor);
205}
206
207ProfileSyncFactory::SyncComponents
208ProfileSyncFactoryImpl::CreateAutofillProfileSyncComponents(
209    ProfileSyncService* profile_sync_service,
210    WebDatabase* web_database,
211    PersonalDataManager* personal_data,
212    browser_sync::UnrecoverableErrorHandler* error_handler) {
213
214  AutofillProfileModelAssociator* model_associator =
215      new AutofillProfileModelAssociator(profile_sync_service,
216                                  web_database,
217                                  personal_data);
218  AutofillProfileChangeProcessor* change_processor =
219      new AutofillProfileChangeProcessor(model_associator,
220                                  web_database,
221                                  personal_data,
222                                  error_handler);
223  return SyncComponents(model_associator, change_processor);
224}
225
226ProfileSyncFactory::SyncComponents
227ProfileSyncFactoryImpl::CreateBookmarkSyncComponents(
228    ProfileSyncService* profile_sync_service,
229    UnrecoverableErrorHandler* error_handler) {
230  BookmarkModelAssociator* model_associator =
231      new BookmarkModelAssociator(profile_sync_service,
232                                  error_handler);
233  BookmarkChangeProcessor* change_processor =
234      new BookmarkChangeProcessor(model_associator,
235                                  error_handler);
236  return SyncComponents(model_associator, change_processor);
237}
238
239ProfileSyncFactory::SyncComponents
240ProfileSyncFactoryImpl::CreateExtensionSyncComponents(
241    ProfileSyncService* profile_sync_service,
242    UnrecoverableErrorHandler* error_handler) {
243  browser_sync::ExtensionSyncTraits traits =
244      browser_sync::GetExtensionSyncTraits();
245  ExtensionModelAssociator* model_associator =
246      new ExtensionModelAssociator(traits, profile_sync_service);
247  ExtensionChangeProcessor* change_processor =
248      new ExtensionChangeProcessor(traits, error_handler);
249  return SyncComponents(model_associator, change_processor);
250}
251
252ProfileSyncFactory::SyncComponents
253ProfileSyncFactoryImpl::CreatePasswordSyncComponents(
254    ProfileSyncService* profile_sync_service,
255    PasswordStore* password_store,
256    UnrecoverableErrorHandler* error_handler) {
257  PasswordModelAssociator* model_associator =
258      new PasswordModelAssociator(profile_sync_service,
259                                  password_store);
260  PasswordChangeProcessor* change_processor =
261      new PasswordChangeProcessor(model_associator,
262                                  password_store,
263                                  error_handler);
264  return SyncComponents(model_associator, change_processor);
265}
266
267ProfileSyncFactory::SyncComponents
268ProfileSyncFactoryImpl::CreatePreferenceSyncComponents(
269    ProfileSyncService* profile_sync_service,
270    UnrecoverableErrorHandler* error_handler) {
271  PreferenceModelAssociator* model_associator =
272      new PreferenceModelAssociator(profile_sync_service);
273  PreferenceChangeProcessor* change_processor =
274      new PreferenceChangeProcessor(model_associator,
275                                    error_handler);
276  return SyncComponents(model_associator, change_processor);
277}
278
279ProfileSyncFactory::SyncComponents
280ProfileSyncFactoryImpl::CreateThemeSyncComponents(
281    ProfileSyncService* profile_sync_service,
282    UnrecoverableErrorHandler* error_handler) {
283  ThemeModelAssociator* model_associator =
284      new ThemeModelAssociator(profile_sync_service);
285  ThemeChangeProcessor* change_processor =
286      new ThemeChangeProcessor(error_handler);
287  return SyncComponents(model_associator, change_processor);
288}
289
290ProfileSyncFactory::SyncComponents
291ProfileSyncFactoryImpl::CreateTypedUrlSyncComponents(
292    ProfileSyncService* profile_sync_service,
293    history::HistoryBackend* history_backend,
294    browser_sync::UnrecoverableErrorHandler* error_handler) {
295  TypedUrlModelAssociator* model_associator =
296      new TypedUrlModelAssociator(profile_sync_service,
297                                  history_backend);
298  TypedUrlChangeProcessor* change_processor =
299      new TypedUrlChangeProcessor(model_associator,
300                                  history_backend,
301                                  error_handler);
302  return SyncComponents(model_associator, change_processor);
303}
304
305ProfileSyncFactory::SyncComponents
306ProfileSyncFactoryImpl::CreateSessionSyncComponents(
307    ProfileSyncService* profile_sync_service,
308    UnrecoverableErrorHandler* error_handler) {
309  SessionModelAssociator* model_associator =
310      new SessionModelAssociator(profile_sync_service);
311  SessionChangeProcessor* change_processor =
312      new SessionChangeProcessor(error_handler, model_associator);
313  return SyncComponents(model_associator, change_processor);
314}
315