15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/bookmarks/enhanced_bookmarks_features.h"
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/dom_distiller/dom_distiller_service_factory.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/notifications/sync_notifier/chrome_notifier_service.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/notifications/sync_notifier/chrome_notifier_service_factory.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/password_manager/password_store_factory.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/pref_service_flags_storage.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/pref_model_associator.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/autofill_data_type_controller.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/autofill_profile_data_type_controller.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/bookmark_change_processor.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/bookmark_data_type_controller.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/bookmark_model_associator.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/sync/glue/chrome_report_unrecoverable_error.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/sync/glue/extension_backed_data_type_controller.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/extension_data_type_controller.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/extension_setting_data_type_controller.h"
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/sync/glue/history_delete_directives_data_type_controller.h"
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/glue/local_device_info_provider_impl.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/password_data_type_controller.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/search_engine_data_type_controller.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/sync_backend_host.h"
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/sync_backend_host_impl.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/theme_data_type_controller.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/typed_url_change_processor.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/typed_url_data_type_controller.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/typed_url_model_associator.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory_impl.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/sync/sessions/session_data_type_controller.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/themes/theme_service_factory.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_syncable_service.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/autocomplete_syncable_service.h"
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/webdata/web_data_service_factory.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/chrome_version_info.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h"
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/dom_distiller/core/dom_distiller_service.h"
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/password_manager/core/browser/password_store.h"
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/sync_driver/data_type_manager_impl.h"
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_manager_observer.h"
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/sync_driver/device_info_data_type_controller.h"
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/sync_driver/generic_change_processor.h"
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/proxy_data_type_controller.h"
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/sync_driver/shared_change_processor.h"
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/sync_driver/ui_data_type_controller.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service_request.h"
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/api/attachments/fake_attachment_store.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/syncable_service.h"
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_downloader.h"
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_service.h"
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_service_impl.h"
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_uploader_impl.h"
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(ENABLE_APP_LIST)
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/app_list/app_list_syncable_service.h"
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/app_list/app_list_switches.h"
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/extensions/api/storage/settings_sync_util.h"
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/extensions/api/synced_notifications_private/synced_notifications_shim.h"
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/extensions/extension_sync_service.h"
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_settings_service.h"
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h"
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_shared_settings_service.h"
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_shared_settings_service_factory.h"
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/supervised_user/supervised_user_sync_data_type_controller.h"
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service.h"
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service_factory.h"
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(ENABLE_SPELLCHECK)
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_factory.h"
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/spellchecker/spellcheck_service.h"
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::AutofillDataTypeController;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::AutofillProfileDataTypeController;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::BookmarkChangeProcessor;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::BookmarkDataTypeController;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::BookmarkModelAssociator;
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using browser_sync::ChromeReportUnrecoverableError;
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing browser_sync::ExtensionBackedDataTypeController;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::ExtensionDataTypeController;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::ExtensionSettingDataTypeController;
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing browser_sync::HistoryDeleteDirectivesDataTypeController;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::PasswordDataTypeController;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::SearchEngineDataTypeController;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::SessionDataTypeController;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::SyncBackendHost;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::ThemeDataTypeController;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::TypedUrlChangeProcessor;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::TypedUrlDataTypeController;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::TypedUrlModelAssociator;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::DataTypeController;
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::DataTypeErrorHandler;
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::DataTypeManager;
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::DataTypeManagerImpl;
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::DataTypeManagerObserver;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing sync_driver::DeviceInfoDataTypeController;
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::ProxyDataTypeController;
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::SharedChangeProcessor;
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::UIDataTypeController;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace {
13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)syncer::ModelTypeSet GetDisabledTypesFromCommandLine(
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const CommandLine& command_line) {
13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  syncer::ModelTypeSet disabled_types;
13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::string disabled_types_str =
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      command_line.GetSwitchValueASCII(switches::kDisableSyncTypes);
13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  disabled_types = syncer::ModelTypeSetFromString(disabled_types_str);
13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return disabled_types;
14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
14123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)syncer::ModelTypeSet GetEnabledTypesFromCommandLine(
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const CommandLine& command_line) {
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  syncer::ModelTypeSet enabled_types;
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (command_line.HasSwitch(switches::kEnableSyncSyncedNotifications)) {
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    enabled_types.Put(syncer::SYNCED_NOTIFICATIONS);
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return enabled_types;
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace
15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProfileSyncComponentsFactoryImpl::ProfileSyncComponentsFactoryImpl(
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Profile* profile,
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    CommandLine* command_line,
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const GURL& sync_service_url,
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    OAuth2TokenService* token_service,
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    net::URLRequestContextGetter* url_request_context_getter)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      command_line_(command_line),
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      web_data_service_(WebDataServiceFactory::GetAutofillWebDataForProfile(
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          profile_, Profile::EXPLICIT_ACCESS)),
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      sync_service_url_(sync_service_url),
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      token_service_(token_service),
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      url_request_context_getter_(url_request_context_getter),
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      weak_factory_(this) {
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(token_service_);
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(url_request_context_getter_);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProfileSyncComponentsFactoryImpl::~ProfileSyncComponentsFactoryImpl() {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncComponentsFactoryImpl::RegisterDataTypes(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProfileSyncService* pss) {
17623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  syncer::ModelTypeSet disabled_types =
177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GetDisabledTypesFromCommandLine(*command_line_);
178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  syncer::ModelTypeSet enabled_types =
179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GetEnabledTypesFromCommandLine(*command_line_);
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  RegisterCommonDataTypes(disabled_types, enabled_types, pss);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID)
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  RegisterDesktopDataTypes(disabled_types, enabled_types, pss);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncComponentsFactoryImpl::RegisterCommonDataTypes(
18723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    syncer::ModelTypeSet disabled_types,
188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    syncer::ModelTypeSet enabled_types,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProfileSyncService* pss) {
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(stanisc): can DEVICE_INFO be one of disabled datatypes?
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pss->RegisterDataTypeController(new DeviceInfoDataTypeController(
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&ChromeReportUnrecoverableError),
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      this,
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pss->GetLocalDeviceInfoProvider()));
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Autofill sync is enabled by default.  Register unless explicitly
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // disabled.
19923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::AUTOFILL)) {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pss->RegisterDataTypeController(
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new AutofillDataTypeController(this, profile_));
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Autofill profile sync is enabled by default.  Register unless explicitly
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // disabled.
20623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::AUTOFILL_PROFILE)) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pss->RegisterDataTypeController(
2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new AutofillProfileDataTypeController(this, profile_));
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bookmark sync is enabled by default.  Register unless explicitly
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled.
21323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::BOOKMARKS)) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pss->RegisterDataTypeController(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new BookmarkDataTypeController(this, profile_, pss));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const bool history_disabled =
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      profile_->GetPrefs()->GetBoolean(prefs::kSavingBrowserHistoryDisabled);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TypedUrl sync is enabled by default.  Register unless explicitly disabled,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or if saving history is disabled.
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!disabled_types.Has(syncer::TYPED_URLS) && !history_disabled) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pss->RegisterDataTypeController(
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TypedUrlDataTypeController(this, profile_, pss));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Delete directive sync is enabled by default.  Register unless full history
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // sync is disabled.
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!disabled_types.Has(syncer::HISTORY_DELETE_DIRECTIVES) &&
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !history_disabled) {
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pss->RegisterDataTypeController(
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new HistoryDeleteDirectivesDataTypeController(this, pss));
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Session sync is enabled by default.  Register unless explicitly disabled.
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This is also disabled if the browser history is disabled, because the
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // tab sync data is added to the web history on the server.
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!disabled_types.Has(syncer::PROXY_TABS) && !history_disabled) {
2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    pss->RegisterDataTypeController(new ProxyDataTypeController(
2406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        syncer::PROXY_TABS));
24223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    pss->RegisterDataTypeController(
2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new SessionDataTypeController(this,
2446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      profile_,
2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      pss->GetSyncedWindowDelegatesGetter(),
2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      pss->GetLocalDeviceInfoProvider()));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Favicon sync is enabled by default. Register unless explicitly disabled.
25023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::FAVICON_IMAGES) &&
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !disabled_types.Has(syncer::FAVICON_TRACKING) &&
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !history_disabled) {
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // crbug/384552. We disable error uploading for this data types for now.
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pss->RegisterDataTypeController(
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new UIDataTypeController(
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            base::Closure(),
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            syncer::FAVICON_IMAGES,
259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            this));
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pss->RegisterDataTypeController(
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new UIDataTypeController(
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            base::Closure(),
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            syncer::FAVICON_TRACKING,
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            this));
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Password sync is enabled by default.  Register unless explicitly
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // disabled.
27023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::PASSWORDS)) {
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pss->RegisterDataTypeController(
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new PasswordDataTypeController(this, profile_));
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Article sync is disabled by default.  Register only if explicitly enabled.
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (IsEnableSyncArticlesSet()) {
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    pss->RegisterDataTypeController(
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new UIDataTypeController(
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::Bind(&ChromeReportUnrecoverableError),
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            syncer::ARTICLES,
282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            this));
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pss->RegisterDataTypeController(
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new SupervisedUserSyncDataTypeController(
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          syncer::SUPERVISED_USER_SETTINGS,
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          this,
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          profile_));
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfileSyncComponentsFactoryImpl::RegisterDesktopDataTypes(
29523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    syncer::ModelTypeSet disabled_types,
296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    syncer::ModelTypeSet enabled_types,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProfileSyncService* pss) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // App sync is enabled by default.  Register unless explicitly
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled.
30023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::APPS)) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pss->RegisterDataTypeController(
3026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new ExtensionDataTypeController(syncer::APPS, this, profile_));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension sync is enabled by default.  Register unless explicitly
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled.
30723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::EXTENSIONS)) {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pss->RegisterDataTypeController(
3096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new ExtensionDataTypeController(syncer::EXTENSIONS, this, profile_));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Preference sync is enabled by default.  Register unless explicitly
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled.
31423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::PREFERENCES)) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pss->RegisterDataTypeController(
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new UIDataTypeController(
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::Bind(&ChromeReportUnrecoverableError),
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            syncer::PREFERENCES,
320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            this));
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::PRIORITY_PREFERENCES)) {
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    pss->RegisterDataTypeController(
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new UIDataTypeController(
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::Bind(&ChromeReportUnrecoverableError),
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            syncer::PRIORITY_PREFERENCES,
329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            this));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_THEMES)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Theme sync is enabled by default.  Register unless explicitly disabled.
33423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::THEMES)) {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pss->RegisterDataTypeController(
3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new ThemeDataTypeController(this, profile_));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Search Engine sync is enabled by default.  Register unless explicitly
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled.
34223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::SEARCH_ENGINES)) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pss->RegisterDataTypeController(
3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new SearchEngineDataTypeController(this, profile_));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extension setting sync is enabled by default.  Register unless explicitly
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled.
34923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::EXTENSION_SETTINGS)) {
3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    pss->RegisterDataTypeController(new ExtensionSettingDataTypeController(
3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        syncer::EXTENSION_SETTINGS, this, profile_));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // App setting sync is enabled by default.  Register unless explicitly
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled.
35623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::APP_SETTINGS)) {
3576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    pss->RegisterDataTypeController(new ExtensionSettingDataTypeController(
3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        syncer::APP_SETTINGS, this, profile_));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_APP_LIST)
362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (app_list::switches::IsAppListSyncEnabled()) {
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pss->RegisterDataTypeController(
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new UIDataTypeController(
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::Bind(&ChromeReportUnrecoverableError),
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            syncer::APP_LIST,
368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            this));
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Synced Notifications are disabled by default.
373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) && defined(ENABLE_NOTIFICATIONS)
374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (enabled_types.Has(syncer::SYNCED_NOTIFICATIONS)) {
37523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    pss->RegisterDataTypeController(
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new ExtensionBackedDataTypeController(
37723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)              syncer::SYNCED_NOTIFICATIONS,
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              "",  // TODO(dewittj): pass the extension hash here.
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              this,
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              profile_));
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pss->RegisterDataTypeController(
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new ExtensionBackedDataTypeController(
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              syncer::SYNCED_NOTIFICATION_APP_INFO,
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              "",  // TODO(dewittj): pass the extension hash here.
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              this,
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              profile_));
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_CHROMEOS)
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dictionary sync is enabled by default.
39323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!disabled_types.Has(syncer::DICTIONARY)) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pss->RegisterDataTypeController(
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new UIDataTypeController(
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::Bind(&ChromeReportUnrecoverableError),
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            syncer::DICTIONARY,
399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            this));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(ENABLE_MANAGED_USERS)
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pss->RegisterDataTypeController(
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new SupervisedUserSyncDataTypeController(
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          syncer::SUPERVISED_USERS,
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          this,
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          profile_));
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pss->RegisterDataTypeController(
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new SupervisedUserSyncDataTypeController(
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          syncer::SUPERVISED_USER_SHARED_SETTINGS,
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          this,
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          profile_));
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DataTypeManager* ProfileSyncComponentsFactoryImpl::CreateDataTypeManager(
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>&
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        debug_info_listener,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DataTypeController::TypeMap* controllers,
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const sync_driver::DataTypeEncryptionHandler* encryption_handler,
422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SyncBackendHost* backend,
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DataTypeManagerObserver* observer) {
424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return new DataTypeManagerImpl(base::Bind(ChromeReportUnrecoverableError),
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 debug_info_listener,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 controllers,
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 encryption_handler,
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 backend,
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 observer);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)browser_sync::SyncBackendHost*
43323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)ProfileSyncComponentsFactoryImpl::CreateSyncBackendHost(
43423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    const std::string& name,
43523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    Profile* profile,
436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    invalidation::InvalidationService* invalidator,
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::WeakPtr<sync_driver::SyncPrefs>& sync_prefs,
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::FilePath& sync_folder) {
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return new browser_sync::SyncBackendHostImpl(name, profile, invalidator,
440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                               sync_prefs, sync_folder);
441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<sync_driver::LocalDeviceInfoProvider>
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ProfileSyncComponentsFactoryImpl::CreateLocalDeviceInfoProvider() {
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return scoped_ptr<sync_driver::LocalDeviceInfoProvider>(
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new browser_sync::LocalDeviceInfoProviderImpl());
4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::WeakPtr<syncer::SyncableService> ProfileSyncComponentsFactoryImpl::
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetSyncableServiceForType(syncer::ModelType type) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!profile_) {  // For tests.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     return base::WeakPtr<syncer::SyncableService>();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case syncer::DEVICE_INFO:
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return ProfileSyncServiceFactory::GetForProfile(profile_)
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ->GetDeviceInfoSyncableService()
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ->AsWeakPtr();
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::PREFERENCES:
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return PrefServiceSyncable::FromProfile(
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          profile_)->GetSyncableService(syncer::PREFERENCES)->AsWeakPtr();
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case syncer::PRIORITY_PREFERENCES:
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return PrefServiceSyncable::FromProfile(profile_)->GetSyncableService(
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          syncer::PRIORITY_PREFERENCES)->AsWeakPtr();
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::AUTOFILL:
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::AUTOFILL_PROFILE: {
467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (!web_data_service_.get())
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return base::WeakPtr<syncer::SyncableService>();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (type == syncer::AUTOFILL) {
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return AutocompleteSyncableService::FromWebDataService(
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            web_data_service_.get())->AsWeakPtr();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return autofill::AutofillProfileSyncableService::FromWebDataService(
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            web_data_service_.get())->AsWeakPtr();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case syncer::SEARCH_ENGINES:
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return TemplateURLServiceFactory::GetForProfile(profile_)->AsWeakPtr();
479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::APPS:
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::EXTENSIONS:
4821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return ExtensionSyncService::Get(profile_)->AsWeakPtr();
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::APP_SETTINGS:
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::EXTENSION_SETTINGS:
485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return extensions::settings_sync_util::GetSyncableService(profile_, type)
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ->AsWeakPtr();
487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(ENABLE_APP_LIST)
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case syncer::APP_LIST:
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return app_list::AppListSyncableServiceFactory::GetForProfile(profile_)->
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          AsWeakPtr();
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_THEMES)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::THEMES:
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ThemeServiceFactory::GetForProfile(profile_)->
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetThemeSyncableService()->AsWeakPtr();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::HISTORY_DELETE_DIRECTIVES: {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HistoryService* history =
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          HistoryServiceFactory::GetForProfile(
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              profile_, Profile::EXPLICIT_ACCESS);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return history ? history->AsWeakPtr() : base::WeakPtr<HistoryService>();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
504f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
505f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case syncer::SYNCED_NOTIFICATIONS:
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case syncer::SYNCED_NOTIFICATION_APP_INFO: {
507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return notifier::ChromeNotifierServiceFactory::GetForProfile(
508f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 profile_, Profile::IMPLICIT_ACCESS)
509f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          ->GetSyncedNotificationsShim()
510f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          ->AsWeakPtr();
511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
513a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(ENABLE_SPELLCHECK)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case syncer::DICTIONARY:
515d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return SpellcheckServiceFactory::GetForContext(profile_)->
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetCustomDictionary()->AsWeakPtr();
517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case syncer::FAVICON_IMAGES:
5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case syncer::FAVICON_TRACKING: {
520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      browser_sync::FaviconCache* favicons =
5217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          ProfileSyncServiceFactory::GetForProfile(profile_)->
522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              GetFaviconCache();
523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return favicons ? favicons->AsWeakPtr()
524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                      : base::WeakPtr<syncer::SyncableService>();
5257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case syncer::SUPERVISED_USER_SETTINGS:
528f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return SupervisedUserSettingsServiceFactory::GetForProfile(profile_)->
52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          AsWeakPtr();
530f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case syncer::SUPERVISED_USERS:
531f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return SupervisedUserSyncServiceFactory::GetForProfile(profile_)->
532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          AsWeakPtr();
533f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case syncer::SUPERVISED_USER_SHARED_SETTINGS:
534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return SupervisedUserSharedSettingsServiceFactory::GetForBrowserContext(
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          profile_)->AsWeakPtr();
53690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case syncer::ARTICLES: {
538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      dom_distiller::DomDistillerService* service =
539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          dom_distiller::DomDistillerServiceFactory::GetForBrowserContext(
540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              profile_);
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (service)
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return service->GetSyncableService()->AsWeakPtr();
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return base::WeakPtr<syncer::SyncableService>();
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case syncer::SESSIONS: {
546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return ProfileSyncServiceFactory::GetForProfile(profile_)->
547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          GetSessionsSyncableService()->AsWeakPtr();
548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case syncer::PASSWORDS: {
550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(PASSWORD_MANAGER_ENABLE_SYNC)
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_refptr<password_manager::PasswordStore> password_store =
552c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          PasswordStoreFactory::GetForProfile(profile_,
553c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                              Profile::EXPLICIT_ACCESS);
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return password_store.get() ? password_store->GetPasswordSyncableService()
5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  : base::WeakPtr<syncer::SyncableService>();
556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return base::WeakPtr<syncer::SyncableService>();
558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The following datatypes still need to be transitioned to the
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // syncer::SyncableService API:
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Bookmarks
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Typed URLs
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return base::WeakPtr<syncer::SyncableService>();
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
570f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class TokenServiceProvider
571f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : public OAuth2TokenServiceRequest::TokenServiceProvider {
572f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  TokenServiceProvider(
574f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      OAuth2TokenService* token_service);
576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // OAuth2TokenServiceRequest::TokenServiceProvider implementation.
578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual scoped_refptr<base::SingleThreadTaskRunner>
579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GetTokenServiceTaskRunner() OVERRIDE;
580f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual OAuth2TokenService* GetTokenService() OVERRIDE;
581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
5836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~TokenServiceProvider();
5846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
585f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  OAuth2TokenService* token_service_;
587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
588f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TokenServiceProvider::TokenServiceProvider(
590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    OAuth2TokenService* token_service)
592f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : task_runner_(task_runner), token_service_(token_service) {
593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
594f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
595f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TokenServiceProvider::~TokenServiceProvider() {
596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)scoped_refptr<base::SingleThreadTaskRunner>
599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TokenServiceProvider::GetTokenServiceTaskRunner() {
600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return task_runner_;
601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
602f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
603f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)OAuth2TokenService* TokenServiceProvider::GetTokenService() {
604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return token_service_;
605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<syncer::AttachmentService>
608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ProfileSyncComponentsFactoryImpl::CreateAttachmentService(
6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const scoped_refptr<syncer::AttachmentStore>& attachment_store,
610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const syncer::UserShare& user_share,
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    syncer::AttachmentService::Delegate* delegate) {
612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<syncer::AttachmentUploader> attachment_uploader;
613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<syncer::AttachmentDownloader> attachment_downloader;
614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Only construct an AttachmentUploader and AttachmentDownload if we have sync
615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // credentials. We may not have sync credentials because there may not be a
616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // signed in sync user (e.g. sync is running in "backup" mode).
617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!user_share.sync_credentials.email.empty() &&
618116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !user_share.sync_credentials.scope_set.empty()) {
6196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_refptr<OAuth2TokenServiceRequest::TokenServiceProvider>
620116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        token_service_provider(new TokenServiceProvider(
621116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            content::BrowserThread::GetMessageLoopProxyForThread(
622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                content::BrowserThread::UI),
623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            token_service_));
624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // TODO(maniscalco): Use shared (one per profile) thread-safe instances of
625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // AttachmentUploader and AttachmentDownloader instead of creating a new one
626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // per AttachmentService (bug 369536).
627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    attachment_uploader.reset(new syncer::AttachmentUploaderImpl(
628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        sync_service_url_,
629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        url_request_context_getter_,
630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        user_share.sync_credentials.email,
631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        user_share.sync_credentials.scope_set,
6326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        token_service_provider));
633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    token_service_provider = new TokenServiceProvider(
635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::BrowserThread::GetMessageLoopProxyForThread(
636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            content::BrowserThread::UI),
6376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        token_service_);
638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    attachment_downloader = syncer::AttachmentDownloader::Create(
639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        sync_service_url_,
640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        url_request_context_getter_,
641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        user_share.sync_credentials.email,
642116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        user_share.sync_credentials.scope_set,
6436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        token_service_provider);
644116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
645116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // It is important that the initial backoff delay is relatively large.  For
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // whatever reason, the server may fail all requests for a short period of
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // time.  When this happens we don't want to overwhelm the server with
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // requests so we use a large initial backoff.
6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::TimeDelta initial_backoff_delay =
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::TimeDelta::FromMinutes(30);
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::TimeDelta max_backoff_delay = base::TimeDelta::FromHours(4);
653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<syncer::AttachmentService> attachment_service(
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new syncer::AttachmentServiceImpl(attachment_store,
65546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                        attachment_uploader.Pass(),
65646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                        attachment_downloader.Pass(),
6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        delegate,
6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        initial_backoff_delay,
6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        max_backoff_delay));
660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return attachment_service.Pass();
6610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
6620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProfileSyncComponentsFactory::SyncComponents
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProfileSyncComponentsFactoryImpl::CreateBookmarkSyncComponents(
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ProfileSyncService* profile_sync_service,
6665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        sync_driver::DataTypeErrorHandler* error_handler) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* bookmark_model =
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BookmarkModelFactory::GetForProfile(profile_sync_service->profile());
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::UserShare* user_share = profile_sync_service->GetUserShare();
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(akalin): We may want to propagate this switch up eventually.
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kExpectMobileBookmarksFolder = true;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kExpectMobileBookmarksFolder = false;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModelAssociator* model_associator =
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new BookmarkModelAssociator(bookmark_model,
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  profile_sync_service->profile(),
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  user_share,
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  error_handler,
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  kExpectMobileBookmarksFolder);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkChangeProcessor* change_processor =
6830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      new BookmarkChangeProcessor(profile_sync_service->profile(),
6840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                  model_associator,
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  error_handler);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SyncComponents(model_associator, change_processor);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProfileSyncComponentsFactory::SyncComponents
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProfileSyncComponentsFactoryImpl::CreateTypedUrlSyncComponents(
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ProfileSyncService* profile_sync_service,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        history::HistoryBackend* history_backend,
6935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        sync_driver::DataTypeErrorHandler* error_handler) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TypedUrlModelAssociator* model_associator =
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TypedUrlModelAssociator(profile_sync_service,
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  history_backend,
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  error_handler);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TypedUrlChangeProcessor* change_processor =
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TypedUrlChangeProcessor(profile_,
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  model_associator,
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  history_backend,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  error_handler);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SyncComponents(model_associator, change_processor);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705