profile_sync_components_factory_impl.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright (c) 2012 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 "build/build_config.h"
7#include "chrome/browser/about_flags.h"
8#include "chrome/browser/bookmarks/bookmark_model_factory.h"
9#include "chrome/browser/bookmarks/enhanced_bookmarks_features.h"
10#include "chrome/browser/browser_process.h"
11#include "chrome/browser/dom_distiller/dom_distiller_service_factory.h"
12#include "chrome/browser/extensions/api/storage/settings_frontend.h"
13#include "chrome/browser/extensions/extension_service.h"
14#include "chrome/browser/extensions/extension_sync_service.h"
15#include "chrome/browser/history/history_service.h"
16#include "chrome/browser/history/history_service_factory.h"
17#include "chrome/browser/pref_service_flags_storage.h"
18#include "chrome/browser/prefs/pref_model_associator.h"
19#include "chrome/browser/prefs/pref_service_syncable.h"
20#include "chrome/browser/profiles/profile.h"
21#include "chrome/browser/search_engines/template_url_service.h"
22#include "chrome/browser/search_engines/template_url_service_factory.h"
23#include "chrome/browser/signin/signin_manager.h"
24#include "chrome/browser/signin/signin_manager_factory.h"
25#include "chrome/browser/sync/glue/autofill_data_type_controller.h"
26#include "chrome/browser/sync/glue/autofill_profile_data_type_controller.h"
27#include "chrome/browser/sync/glue/bookmark_change_processor.h"
28#include "chrome/browser/sync/glue/bookmark_data_type_controller.h"
29#include "chrome/browser/sync/glue/bookmark_model_associator.h"
30#include "chrome/browser/sync/glue/chrome_report_unrecoverable_error.h"
31#include "chrome/browser/sync/glue/data_type_manager_impl.h"
32#include "chrome/browser/sync/glue/extension_data_type_controller.h"
33#include "chrome/browser/sync/glue/extension_setting_data_type_controller.h"
34#include "chrome/browser/sync/glue/generic_change_processor.h"
35#include "chrome/browser/sync/glue/password_change_processor.h"
36#include "chrome/browser/sync/glue/password_data_type_controller.h"
37#include "chrome/browser/sync/glue/password_model_associator.h"
38#include "chrome/browser/sync/glue/search_engine_data_type_controller.h"
39#include "chrome/browser/sync/glue/session_change_processor.h"
40#include "chrome/browser/sync/glue/session_data_type_controller.h"
41#include "chrome/browser/sync/glue/session_model_associator.h"
42#include "chrome/browser/sync/glue/shared_change_processor.h"
43#include "chrome/browser/sync/glue/sync_backend_host.h"
44#include "chrome/browser/sync/glue/sync_backend_host_impl.h"
45#include "chrome/browser/sync/glue/theme_data_type_controller.h"
46#include "chrome/browser/sync/glue/typed_url_change_processor.h"
47#include "chrome/browser/sync/glue/typed_url_data_type_controller.h"
48#include "chrome/browser/sync/glue/typed_url_model_associator.h"
49#include "chrome/browser/sync/glue/ui_data_type_controller.h"
50#include "chrome/browser/sync/profile_sync_components_factory_impl.h"
51#include "chrome/browser/sync/profile_sync_service.h"
52#include "chrome/browser/sync/profile_sync_service_factory.h"
53#include "chrome/browser/sync/sessions2/session_data_type_controller2.h"
54#include "chrome/browser/themes/theme_service.h"
55#include "chrome/browser/themes/theme_service_factory.h"
56#include "chrome/browser/themes/theme_syncable_service.h"
57#include "chrome/browser/ui/app_list/app_list_syncable_service.h"
58#include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
59#include "chrome/browser/webdata/autocomplete_syncable_service.h"
60#include "chrome/browser/webdata/web_data_service_factory.h"
61#include "chrome/common/chrome_switches.h"
62#include "chrome/common/pref_names.h"
63#include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h"
64#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
65#include "components/dom_distiller/core/dom_distiller_service.h"
66#include "components/sync_driver/data_type_manager_observer.h"
67#include "components/sync_driver/proxy_data_type_controller.h"
68#include "content/public/browser/browser_thread.h"
69#include "extensions/browser/extension_system.h"
70#include "sync/api/syncable_service.h"
71
72#if defined(ENABLE_MANAGED_USERS)
73#include "chrome/browser/managed_mode/managed_user_settings_service.h"
74#include "chrome/browser/managed_mode/managed_user_settings_service_factory.h"
75#include "chrome/browser/managed_mode/managed_user_shared_settings_service.h"
76#include "chrome/browser/managed_mode/managed_user_shared_settings_service_factory.h"
77#include "chrome/browser/managed_mode/managed_user_sync_service.h"
78#include "chrome/browser/managed_mode/managed_user_sync_service_factory.h"
79#endif
80
81#if !defined(OS_ANDROID)
82#include "chrome/browser/notifications/sync_notifier/chrome_notifier_service.h"
83#include "chrome/browser/notifications/sync_notifier/chrome_notifier_service_factory.h"
84#endif
85
86#if defined(ENABLE_SPELLCHECK)
87#include "chrome/browser/spellchecker/spellcheck_factory.h"
88#include "chrome/browser/spellchecker/spellcheck_service.h"
89#endif
90
91using browser_sync::AutofillDataTypeController;
92using browser_sync::AutofillProfileDataTypeController;
93using browser_sync::BookmarkChangeProcessor;
94using browser_sync::BookmarkDataTypeController;
95using browser_sync::BookmarkModelAssociator;
96using browser_sync::ChromeReportUnrecoverableError;
97using browser_sync::DataTypeController;
98using browser_sync::DataTypeErrorHandler;
99using browser_sync::DataTypeManager;
100using browser_sync::DataTypeManagerImpl;
101using browser_sync::DataTypeManagerObserver;
102using browser_sync::ExtensionDataTypeController;
103using browser_sync::ExtensionSettingDataTypeController;
104using browser_sync::GenericChangeProcessor;
105using browser_sync::PasswordChangeProcessor;
106using browser_sync::PasswordDataTypeController;
107using browser_sync::PasswordModelAssociator;
108using browser_sync::ProxyDataTypeController;
109using browser_sync::SearchEngineDataTypeController;
110using browser_sync::SessionChangeProcessor;
111using browser_sync::SessionDataTypeController;
112using browser_sync::SessionDataTypeController2;
113using browser_sync::SessionModelAssociator;
114using browser_sync::SharedChangeProcessor;
115using browser_sync::SyncBackendHost;
116using browser_sync::ThemeDataTypeController;
117using browser_sync::TypedUrlChangeProcessor;
118using browser_sync::TypedUrlDataTypeController;
119using browser_sync::TypedUrlModelAssociator;
120using browser_sync::UIDataTypeController;
121using content::BrowserThread;
122
123ProfileSyncComponentsFactoryImpl::ProfileSyncComponentsFactoryImpl(
124    Profile* profile, CommandLine* command_line)
125    : profile_(profile),
126      command_line_(command_line),
127      extension_system_(extensions::ExtensionSystem::Get(profile)),
128      web_data_service_(
129          WebDataServiceFactory::GetAutofillWebDataForProfile(
130              profile_, Profile::EXPLICIT_ACCESS)) {
131}
132
133ProfileSyncComponentsFactoryImpl::~ProfileSyncComponentsFactoryImpl() {
134}
135
136void ProfileSyncComponentsFactoryImpl::RegisterDataTypes(
137    ProfileSyncService* pss) {
138  RegisterCommonDataTypes(pss);
139#if !defined(OS_ANDROID)
140  RegisterDesktopDataTypes(pss);
141#endif
142}
143
144void ProfileSyncComponentsFactoryImpl::RegisterCommonDataTypes(
145    ProfileSyncService* pss) {
146  // Autofill sync is enabled by default.  Register unless explicitly
147  // disabled.
148  if (!command_line_->HasSwitch(switches::kDisableSyncAutofill)) {
149    pss->RegisterDataTypeController(
150        new AutofillDataTypeController(this, profile_, pss));
151  }
152
153  // Autofill profile sync is enabled by default.  Register unless explicitly
154  // disabled.
155  if (!command_line_->HasSwitch(switches::kDisableSyncAutofillProfile)) {
156    pss->RegisterDataTypeController(
157        new AutofillProfileDataTypeController(this, profile_, pss));
158  }
159
160  // Bookmark sync is enabled by default.  Register unless explicitly
161  // disabled.
162  if (!command_line_->HasSwitch(switches::kDisableSyncBookmarks)) {
163    pss->RegisterDataTypeController(
164        new BookmarkDataTypeController(this, profile_, pss));
165  }
166
167  // TypedUrl sync is enabled by default.  Register unless explicitly disabled,
168  // or if saving history is disabled.
169  if (!profile_->GetPrefs()->GetBoolean(prefs::kSavingBrowserHistoryDisabled) &&
170      !command_line_->HasSwitch(switches::kDisableSyncTypedUrls)) {
171    pss->RegisterDataTypeController(
172        new TypedUrlDataTypeController(this, profile_, pss));
173  }
174
175  // Delete directive sync is enabled by default.  Register unless full history
176  // sync is disabled.
177  if (!command_line_->HasSwitch(switches::kHistoryDisableFullHistorySync)) {
178    pss->RegisterDataTypeController(
179        new UIDataTypeController(
180            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
181            base::Bind(&ChromeReportUnrecoverableError),
182            syncer::HISTORY_DELETE_DIRECTIVES,
183            this,
184            profile_,
185            pss));
186  }
187
188  // Session sync is enabled by default.  Register unless explicitly disabled.
189  if (!command_line_->HasSwitch(switches::kDisableSyncTabs)) {
190      pss->RegisterDataTypeController(new ProxyDataTypeController(
191         BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
192         syncer::PROXY_TABS));
193    if (command_line_->HasSwitch(switches::kDisableSyncSessionsV2)) {
194      pss->RegisterDataTypeController(
195          new SessionDataTypeController(this, profile_, pss));
196    } else {
197      pss->RegisterDataTypeController(
198          new SessionDataTypeController2(this, profile_, pss));
199    }
200  }
201
202  // Favicon sync is enabled by default. Register unless explicitly disabled.
203  if (!command_line_->HasSwitch(switches::kDisableSyncFavicons)) {
204    pss->RegisterDataTypeController(
205        new UIDataTypeController(
206            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
207            base::Bind(&ChromeReportUnrecoverableError),
208            syncer::FAVICON_IMAGES,
209            this,
210            profile_,
211            pss));
212    pss->RegisterDataTypeController(
213        new UIDataTypeController(
214            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
215            base::Bind(&ChromeReportUnrecoverableError),
216            syncer::FAVICON_TRACKING,
217            this,
218            profile_,
219            pss));
220  }
221
222  // Password sync is enabled by default.  Register unless explicitly
223  // disabled.
224  if (!command_line_->HasSwitch(switches::kDisableSyncPasswords)) {
225    pss->RegisterDataTypeController(
226        new PasswordDataTypeController(this, profile_, pss));
227  }
228  ExtensionService* extension_service = extension_system_->extension_service();
229  if (extension_service) {
230    if (IsBookmarksExtensionInstalled(
231            extension_service->extensions()->GetIDs())) {
232      OptInIntoBookmarksExperiment();
233    }
234  }
235  // Article sync is disabled by default.  Register only if explicitly enabled.
236  if (IsEnableSyncArticlesSet()) {
237    pss->RegisterDataTypeController(
238        new UIDataTypeController(
239            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
240            base::Bind(&ChromeReportUnrecoverableError),
241            syncer::ARTICLES,
242            this,
243            profile_,
244            pss));
245  }
246
247#if defined(ENABLE_MANAGED_USERS)
248  if (profile_->IsManaged()) {
249    pss->RegisterDataTypeController(
250        new UIDataTypeController(
251            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
252            base::Bind(&ChromeReportUnrecoverableError),
253            syncer::MANAGED_USER_SETTINGS,
254            this,
255            profile_,
256            pss));
257  } else {
258    pss->RegisterDataTypeController(
259        new UIDataTypeController(
260            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
261            base::Bind(&ChromeReportUnrecoverableError),
262            syncer::MANAGED_USERS,
263            this,
264            profile_,
265            pss));
266  }
267  pss->RegisterDataTypeController(
268      new UIDataTypeController(
269            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
270            base::Bind(&ChromeReportUnrecoverableError),
271            syncer::MANAGED_USER_SHARED_SETTINGS,
272            this,
273            profile_,
274            pss));
275#endif
276}
277
278void ProfileSyncComponentsFactoryImpl::RegisterDesktopDataTypes(
279    ProfileSyncService* pss) {
280  // App sync is enabled by default.  Register unless explicitly
281  // disabled.
282  if (!command_line_->HasSwitch(switches::kDisableSyncApps)) {
283    pss->RegisterDataTypeController(
284        new ExtensionDataTypeController(syncer::APPS, this, profile_, pss));
285  }
286
287  // Extension sync is enabled by default.  Register unless explicitly
288  // disabled.
289  if (!command_line_->HasSwitch(switches::kDisableSyncExtensions)) {
290    pss->RegisterDataTypeController(
291        new ExtensionDataTypeController(syncer::EXTENSIONS,
292                                        this, profile_, pss));
293  }
294
295  // Preference sync is enabled by default.  Register unless explicitly
296  // disabled.
297  if (!command_line_->HasSwitch(switches::kDisableSyncPreferences)) {
298    pss->RegisterDataTypeController(
299        new UIDataTypeController(
300            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
301            base::Bind(&ChromeReportUnrecoverableError),
302            syncer::PREFERENCES,
303            this,
304            profile_,
305            pss));
306
307  }
308
309  if (!command_line_->HasSwitch(switches::kDisableSyncPriorityPreferences)) {
310    pss->RegisterDataTypeController(
311        new UIDataTypeController(
312            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
313            base::Bind(&ChromeReportUnrecoverableError),
314            syncer::PRIORITY_PREFERENCES,
315            this,
316            profile_,
317            pss));
318  }
319
320#if defined(ENABLE_THEMES)
321  // Theme sync is enabled by default.  Register unless explicitly disabled.
322  if (!command_line_->HasSwitch(switches::kDisableSyncThemes)) {
323    pss->RegisterDataTypeController(
324        new ThemeDataTypeController(this, profile_, pss));
325  }
326#endif
327
328  // Search Engine sync is enabled by default.  Register unless explicitly
329  // disabled.
330  if (!command_line_->HasSwitch(switches::kDisableSyncSearchEngines)) {
331    pss->RegisterDataTypeController(
332        new SearchEngineDataTypeController(this, profile_, pss));
333  }
334
335  // Extension setting sync is enabled by default.  Register unless explicitly
336  // disabled.
337  if (!command_line_->HasSwitch(switches::kDisableSyncExtensionSettings)) {
338    pss->RegisterDataTypeController(
339        new ExtensionSettingDataTypeController(
340            syncer::EXTENSION_SETTINGS, this, profile_, pss));
341  }
342
343  // App setting sync is enabled by default.  Register unless explicitly
344  // disabled.
345  if (!command_line_->HasSwitch(switches::kDisableSyncAppSettings)) {
346    pss->RegisterDataTypeController(
347        new ExtensionSettingDataTypeController(
348            syncer::APP_SETTINGS, this, profile_, pss));
349  }
350
351#if defined(ENABLE_APP_LIST)
352  // App List sync is disabled by default.  Register only if enabled.
353  if (command_line_->HasSwitch(switches::kEnableSyncAppList)) {
354    pss->RegisterDataTypeController(
355        new UIDataTypeController(
356            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
357            base::Bind(&ChromeReportUnrecoverableError),
358            syncer::APP_LIST,
359            this,
360            profile_,
361            pss));
362  }
363#endif
364
365  // Synced Notifications are enabled by default.
366  pss->RegisterDataTypeController(
367      new UIDataTypeController(
368            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
369            base::Bind(&ChromeReportUnrecoverableError),
370            syncer::SYNCED_NOTIFICATIONS,
371            this,
372            profile_,
373            pss));
374
375  // TODO(petewil): Enable the data type controller once we have a handler.
376
377#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_CHROMEOS)
378  // Dictionary sync is enabled by default.
379  if (!command_line_->HasSwitch(switches::kDisableSyncDictionary)) {
380    pss->RegisterDataTypeController(
381        new UIDataTypeController(
382            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
383            base::Bind(&ChromeReportUnrecoverableError),
384            syncer::DICTIONARY,
385            this,
386            profile_,
387            pss));
388  }
389#endif
390}
391
392DataTypeManager* ProfileSyncComponentsFactoryImpl::CreateDataTypeManager(
393    const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>&
394        debug_info_listener,
395    const DataTypeController::TypeMap* controllers,
396    const browser_sync::DataTypeEncryptionHandler* encryption_handler,
397    SyncBackendHost* backend,
398    DataTypeManagerObserver* observer,
399    browser_sync::FailedDataTypesHandler* failed_data_types_handler) {
400  return new DataTypeManagerImpl(debug_info_listener,
401                                 controllers,
402                                 encryption_handler,
403                                 backend,
404                                 observer,
405                                 failed_data_types_handler);
406}
407
408browser_sync::SyncBackendHost*
409    ProfileSyncComponentsFactoryImpl::CreateSyncBackendHost(
410      const std::string& name,
411      Profile* profile,
412      const base::WeakPtr<browser_sync::SyncPrefs>& sync_prefs) {
413  return new browser_sync::SyncBackendHostImpl(name, profile, sync_prefs);
414}
415
416browser_sync::GenericChangeProcessor*
417    ProfileSyncComponentsFactoryImpl::CreateGenericChangeProcessor(
418        ProfileSyncService* profile_sync_service,
419        browser_sync::DataTypeErrorHandler* error_handler,
420        const base::WeakPtr<syncer::SyncableService>& local_service,
421        const base::WeakPtr<syncer::SyncMergeResult>& merge_result) {
422  syncer::UserShare* user_share = profile_sync_service->GetUserShare();
423  return new GenericChangeProcessor(error_handler,
424                                    local_service,
425                                    merge_result,
426                                    user_share);
427}
428
429browser_sync::SharedChangeProcessor* ProfileSyncComponentsFactoryImpl::
430    CreateSharedChangeProcessor() {
431  return new SharedChangeProcessor();
432}
433
434base::WeakPtr<syncer::SyncableService> ProfileSyncComponentsFactoryImpl::
435    GetSyncableServiceForType(syncer::ModelType type) {
436  if (!profile_) {  // For tests.
437     return base::WeakPtr<syncer::SyncableService>();
438  }
439  switch (type) {
440    case syncer::PREFERENCES:
441      return PrefServiceSyncable::FromProfile(
442          profile_)->GetSyncableService(syncer::PREFERENCES)->AsWeakPtr();
443    case syncer::PRIORITY_PREFERENCES:
444      return PrefServiceSyncable::FromProfile(profile_)->GetSyncableService(
445          syncer::PRIORITY_PREFERENCES)->AsWeakPtr();
446    case syncer::AUTOFILL:
447    case syncer::AUTOFILL_PROFILE: {
448      if (!web_data_service_.get())
449        return base::WeakPtr<syncer::SyncableService>();
450      if (type == syncer::AUTOFILL) {
451        return AutocompleteSyncableService::FromWebDataService(
452            web_data_service_.get())->AsWeakPtr();
453      } else {
454        return autofill::AutofillProfileSyncableService::FromWebDataService(
455            web_data_service_.get())->AsWeakPtr();
456      }
457    }
458    case syncer::APPS:
459    case syncer::EXTENSIONS:
460      return ExtensionSyncService::Get(profile_)->AsWeakPtr();
461    case syncer::SEARCH_ENGINES:
462      return TemplateURLServiceFactory::GetForProfile(profile_)->AsWeakPtr();
463    case syncer::APP_SETTINGS:
464    case syncer::EXTENSION_SETTINGS:
465      return extension_system_->extension_service()->settings_frontend()->
466          GetBackendForSync(type)->AsWeakPtr();
467#if defined(ENABLE_APP_LIST)
468    case syncer::APP_LIST:
469      return app_list::AppListSyncableServiceFactory::GetForProfile(profile_)->
470          AsWeakPtr();
471#endif
472#if defined(ENABLE_THEMES)
473    case syncer::THEMES:
474      return ThemeServiceFactory::GetForProfile(profile_)->
475          GetThemeSyncableService()->AsWeakPtr();
476#endif
477    case syncer::HISTORY_DELETE_DIRECTIVES: {
478      HistoryService* history =
479          HistoryServiceFactory::GetForProfile(
480              profile_, Profile::EXPLICIT_ACCESS);
481      return history ? history->AsWeakPtr() : base::WeakPtr<HistoryService>();
482    }
483#if !defined(OS_ANDROID)
484    case syncer::SYNCED_NOTIFICATIONS: {
485      notifier::ChromeNotifierService* notifier_service =
486          notifier::ChromeNotifierServiceFactory::GetForProfile(
487              profile_, Profile::EXPLICIT_ACCESS);
488      return notifier_service ? notifier_service->AsWeakPtr()
489          : base::WeakPtr<syncer::SyncableService>();
490    }
491#endif
492#if defined(ENABLE_SPELLCHECK)
493    case syncer::DICTIONARY:
494      return SpellcheckServiceFactory::GetForContext(profile_)->
495          GetCustomDictionary()->AsWeakPtr();
496#endif
497    case syncer::FAVICON_IMAGES:
498    case syncer::FAVICON_TRACKING: {
499      browser_sync::FaviconCache* favicons =
500          ProfileSyncServiceFactory::GetForProfile(profile_)->
501              GetFaviconCache();
502      return favicons ? favicons->AsWeakPtr()
503                      : base::WeakPtr<syncer::SyncableService>();
504    }
505#if defined(ENABLE_MANAGED_USERS)
506    case syncer::MANAGED_USER_SETTINGS:
507      return ManagedUserSettingsServiceFactory::GetForProfile(profile_)->
508          AsWeakPtr();
509    case syncer::MANAGED_USERS:
510      return ManagedUserSyncServiceFactory::GetForProfile(profile_)->
511          AsWeakPtr();
512    case syncer::MANAGED_USER_SHARED_SETTINGS:
513      return ManagedUserSharedSettingsServiceFactory::GetForBrowserContext(
514          profile_)->AsWeakPtr();
515#endif
516    case syncer::ARTICLES: {
517      dom_distiller::DomDistillerService* service =
518          dom_distiller::DomDistillerServiceFactory::GetForBrowserContext(
519              profile_);
520      if (service)
521        return service->GetSyncableService()->AsWeakPtr();
522      return base::WeakPtr<syncer::SyncableService>();
523    }
524    case syncer::SESSIONS: {
525      DCHECK(!command_line_->HasSwitch(switches::kDisableSyncSessionsV2));
526      return ProfileSyncServiceFactory::GetForProfile(profile_)->
527          GetSessionsSyncableService()->AsWeakPtr();
528    }
529    default:
530      // The following datatypes still need to be transitioned to the
531      // syncer::SyncableService API:
532      // Bookmarks
533      // Passwords
534      // Typed URLs
535      NOTREACHED();
536      return base::WeakPtr<syncer::SyncableService>();
537  }
538}
539
540ProfileSyncComponentsFactory::SyncComponents
541    ProfileSyncComponentsFactoryImpl::CreateBookmarkSyncComponents(
542        ProfileSyncService* profile_sync_service,
543        DataTypeErrorHandler* error_handler) {
544  BookmarkModel* bookmark_model =
545      BookmarkModelFactory::GetForProfile(profile_sync_service->profile());
546  syncer::UserShare* user_share = profile_sync_service->GetUserShare();
547  // TODO(akalin): We may want to propagate this switch up eventually.
548#if defined(OS_ANDROID)
549  const bool kExpectMobileBookmarksFolder = true;
550#else
551  const bool kExpectMobileBookmarksFolder = false;
552#endif
553  BookmarkModelAssociator* model_associator =
554      new BookmarkModelAssociator(bookmark_model,
555                                  profile_sync_service->profile(),
556                                  user_share,
557                                  error_handler,
558                                  kExpectMobileBookmarksFolder);
559  BookmarkChangeProcessor* change_processor =
560      new BookmarkChangeProcessor(model_associator,
561                                  error_handler);
562  return SyncComponents(model_associator, change_processor);
563}
564
565ProfileSyncComponentsFactory::SyncComponents
566    ProfileSyncComponentsFactoryImpl::CreatePasswordSyncComponents(
567        ProfileSyncService* profile_sync_service,
568        PasswordStore* password_store,
569        DataTypeErrorHandler* error_handler) {
570  PasswordModelAssociator* model_associator =
571      new PasswordModelAssociator(profile_sync_service,
572                                  password_store,
573                                  error_handler);
574  PasswordChangeProcessor* change_processor =
575      new PasswordChangeProcessor(model_associator,
576                                  password_store,
577                                  error_handler);
578  return SyncComponents(model_associator, change_processor);
579}
580
581ProfileSyncComponentsFactory::SyncComponents
582    ProfileSyncComponentsFactoryImpl::CreateTypedUrlSyncComponents(
583        ProfileSyncService* profile_sync_service,
584        history::HistoryBackend* history_backend,
585        browser_sync::DataTypeErrorHandler* error_handler) {
586  TypedUrlModelAssociator* model_associator =
587      new TypedUrlModelAssociator(profile_sync_service,
588                                  history_backend,
589                                  error_handler);
590  TypedUrlChangeProcessor* change_processor =
591      new TypedUrlChangeProcessor(profile_,
592                                  model_associator,
593                                  history_backend,
594                                  error_handler);
595  return SyncComponents(model_associator, change_processor);
596}
597
598ProfileSyncComponentsFactory::SyncComponents
599    ProfileSyncComponentsFactoryImpl::CreateSessionSyncComponents(
600       ProfileSyncService* profile_sync_service,
601        DataTypeErrorHandler* error_handler) {
602  SessionModelAssociator* model_associator =
603      new SessionModelAssociator(profile_sync_service, error_handler);
604  SessionChangeProcessor* change_processor =
605      new SessionChangeProcessor(error_handler, model_associator);
606  return SyncComponents(model_associator, change_processor);
607}
608