| OLD | NEW | 
|---|
|  | (Empty) | 
| 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 "chrome/browser/sync/profile_sync_components_factory_impl.h" |  | 
| 6 |  | 
| 7 #include "base/command_line.h" |  | 
| 8 #include "base/memory/ref_counted.h" |  | 
| 9 #include "base/prefs/pref_service.h" |  | 
| 10 #include "build/build_config.h" |  | 
| 11 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |  | 
| 12 #include "chrome/browser/profiles/profile.h" |  | 
| 13 #include "chrome/browser/search_engines/template_url_service_factory.h" |  | 
| 14 #include "chrome/browser/sync/glue/theme_data_type_controller.h" |  | 
| 15 #include "chrome/common/channel_info.h" |  | 
| 16 #include "chrome/common/chrome_switches.h" |  | 
| 17 #include "chrome/common/pref_names.h" |  | 
| 18 #include "components/autofill/core/browser/autofill_wallet_data_type_controller.
     h" |  | 
| 19 #include "components/autofill/core/browser/webdata/autofill_data_type_controller
     .h" |  | 
| 20 #include "components/autofill/core/browser/webdata/autofill_profile_data_type_co
     ntroller.h" |  | 
| 21 #include "components/autofill/core/common/autofill_pref_names.h" |  | 
| 22 #include "components/autofill/core/common/autofill_switches.h" |  | 
| 23 #include "components/browser_sync/browser/profile_sync_service.h" |  | 
| 24 #include "components/browser_sync/common/browser_sync_switches.h" |  | 
| 25 #include "components/dom_distiller/core/dom_distiller_features.h" |  | 
| 26 #include "components/history/core/browser/history_delete_directives_data_type_co
     ntroller.h" |  | 
| 27 #include "components/history/core/browser/typed_url_change_processor.h" |  | 
| 28 #include "components/history/core/browser/typed_url_data_type_controller.h" |  | 
| 29 #include "components/history/core/browser/typed_url_model_associator.h" |  | 
| 30 #include "components/password_manager/sync/browser/password_data_type_controller
     .h" |  | 
| 31 #include "components/search_engines/search_engine_data_type_controller.h" |  | 
| 32 #include "components/sync_bookmarks/bookmark_change_processor.h" |  | 
| 33 #include "components/sync_bookmarks/bookmark_data_type_controller.h" |  | 
| 34 #include "components/sync_bookmarks/bookmark_model_associator.h" |  | 
| 35 #include "components/sync_driver/data_type_manager_impl.h" |  | 
| 36 #include "components/sync_driver/device_info_data_type_controller.h" |  | 
| 37 #include "components/sync_driver/glue/chrome_report_unrecoverable_error.h" |  | 
| 38 #include "components/sync_driver/glue/sync_backend_host.h" |  | 
| 39 #include "components/sync_driver/glue/sync_backend_host_impl.h" |  | 
| 40 #include "components/sync_driver/local_device_info_provider_impl.h" |  | 
| 41 #include "components/sync_driver/proxy_data_type_controller.h" |  | 
| 42 #include "components/sync_driver/sync_client.h" |  | 
| 43 #include "components/sync_driver/ui_data_type_controller.h" |  | 
| 44 #include "components/sync_sessions/session_data_type_controller.h" |  | 
| 45 #include "content/public/browser/browser_thread.h" |  | 
| 46 #include "google_apis/gaia/oauth2_token_service.h" |  | 
| 47 #include "google_apis/gaia/oauth2_token_service_request.h" |  | 
| 48 #include "net/url_request/url_request_context_getter.h" |  | 
| 49 #include "sync/internal_api/public/attachments/attachment_downloader.h" |  | 
| 50 #include "sync/internal_api/public/attachments/attachment_service.h" |  | 
| 51 #include "sync/internal_api/public/attachments/attachment_service_impl.h" |  | 
| 52 #include "sync/internal_api/public/attachments/attachment_uploader_impl.h" |  | 
| 53 #include "ui/base/device_form_factor.h" |  | 
| 54 |  | 
| 55 #if defined(ENABLE_APP_LIST) |  | 
| 56 #include "ui/app_list/app_list_switches.h" |  | 
| 57 #endif |  | 
| 58 |  | 
| 59 #if defined(ENABLE_EXTENSIONS) |  | 
| 60 #include "chrome/browser/sync/glue/extension_data_type_controller.h" |  | 
| 61 #include "chrome/browser/sync/glue/extension_setting_data_type_controller.h" |  | 
| 62 #endif |  | 
| 63 |  | 
| 64 #if defined(ENABLE_SUPERVISED_USERS) |  | 
| 65 #include "chrome/browser/supervised_user/supervised_user_sync_data_type_controll
     er.h" |  | 
| 66 #endif |  | 
| 67 |  | 
| 68 using bookmarks::BookmarkModel; |  | 
| 69 using browser_sync::AutofillDataTypeController; |  | 
| 70 using browser_sync::AutofillProfileDataTypeController; |  | 
| 71 using browser_sync::BookmarkChangeProcessor; |  | 
| 72 using browser_sync::BookmarkDataTypeController; |  | 
| 73 using browser_sync::BookmarkModelAssociator; |  | 
| 74 using browser_sync::ChromeReportUnrecoverableError; |  | 
| 75 #if defined(ENABLE_EXTENSIONS) |  | 
| 76 using browser_sync::ExtensionDataTypeController; |  | 
| 77 using browser_sync::ExtensionSettingDataTypeController; |  | 
| 78 #endif |  | 
| 79 using browser_sync::HistoryDeleteDirectivesDataTypeController; |  | 
| 80 using browser_sync::PasswordDataTypeController; |  | 
| 81 using browser_sync::SearchEngineDataTypeController; |  | 
| 82 using browser_sync::SessionDataTypeController; |  | 
| 83 using browser_sync::SyncBackendHost; |  | 
| 84 using browser_sync::ThemeDataTypeController; |  | 
| 85 using browser_sync::TypedUrlChangeProcessor; |  | 
| 86 using browser_sync::TypedUrlDataTypeController; |  | 
| 87 using browser_sync::TypedUrlModelAssociator; |  | 
| 88 using content::BrowserThread; |  | 
| 89 using sync_driver::DataTypeController; |  | 
| 90 using sync_driver::DataTypeErrorHandler; |  | 
| 91 using sync_driver::DataTypeManager; |  | 
| 92 using sync_driver::DataTypeManagerImpl; |  | 
| 93 using sync_driver::DataTypeManagerObserver; |  | 
| 94 using sync_driver::DeviceInfoDataTypeController; |  | 
| 95 using sync_driver::ProxyDataTypeController; |  | 
| 96 using sync_driver::UIDataTypeController; |  | 
| 97 |  | 
| 98 namespace { |  | 
| 99 |  | 
| 100 syncer::ModelTypeSet GetDisabledTypesFromCommandLine( |  | 
| 101     const base::CommandLine& command_line) { |  | 
| 102   syncer::ModelTypeSet disabled_types; |  | 
| 103   std::string disabled_types_str = |  | 
| 104       command_line.GetSwitchValueASCII(switches::kDisableSyncTypes); |  | 
| 105 |  | 
| 106   disabled_types = syncer::ModelTypeSetFromString(disabled_types_str); |  | 
| 107   return disabled_types; |  | 
| 108 } |  | 
| 109 |  | 
| 110 syncer::ModelTypeSet GetEnabledTypesFromCommandLine( |  | 
| 111     const base::CommandLine& command_line) { |  | 
| 112   return syncer::ModelTypeSet(); |  | 
| 113 } |  | 
| 114 |  | 
| 115 }  // namespace |  | 
| 116 |  | 
| 117 ProfileSyncComponentsFactoryImpl::ProfileSyncComponentsFactoryImpl( |  | 
| 118     Profile* profile, |  | 
| 119     base::CommandLine* command_line, |  | 
| 120     const GURL& sync_service_url, |  | 
| 121     OAuth2TokenService* token_service, |  | 
| 122     net::URLRequestContextGetter* url_request_context_getter) |  | 
| 123     : profile_(profile), |  | 
| 124       command_line_(command_line), |  | 
| 125       sync_service_url_(sync_service_url), |  | 
| 126       token_service_(token_service), |  | 
| 127       url_request_context_getter_(url_request_context_getter), |  | 
| 128       weak_factory_(this) { |  | 
| 129   DCHECK(token_service_); |  | 
| 130   DCHECK(url_request_context_getter_); |  | 
| 131 } |  | 
| 132 |  | 
| 133 ProfileSyncComponentsFactoryImpl::~ProfileSyncComponentsFactoryImpl() { |  | 
| 134 } |  | 
| 135 |  | 
| 136 void ProfileSyncComponentsFactoryImpl::RegisterDataTypes( |  | 
| 137     sync_driver::SyncClient* sync_client) { |  | 
| 138   syncer::ModelTypeSet disabled_types = |  | 
| 139       GetDisabledTypesFromCommandLine(*command_line_); |  | 
| 140   syncer::ModelTypeSet enabled_types = |  | 
| 141       GetEnabledTypesFromCommandLine(*command_line_); |  | 
| 142   RegisterCommonDataTypes(disabled_types, enabled_types, sync_client); |  | 
| 143 #if !defined(OS_ANDROID) |  | 
| 144   RegisterDesktopDataTypes(disabled_types, enabled_types, sync_client); |  | 
| 145 #endif |  | 
| 146 } |  | 
| 147 |  | 
| 148 void ProfileSyncComponentsFactoryImpl::RegisterCommonDataTypes( |  | 
| 149     syncer::ModelTypeSet disabled_types, |  | 
| 150     syncer::ModelTypeSet enabled_types, |  | 
| 151     sync_driver::SyncClient* sync_client) { |  | 
| 152   sync_driver::SyncService* sync_service = sync_client->GetSyncService(); |  | 
| 153   base::Closure error_callback = |  | 
| 154       base::Bind(&ChromeReportUnrecoverableError, chrome::GetChannel()); |  | 
| 155   const scoped_refptr<base::SingleThreadTaskRunner> ui_thread = |  | 
| 156       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); |  | 
| 157   const scoped_refptr<base::SingleThreadTaskRunner> db_thread = |  | 
| 158       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB); |  | 
| 159 |  | 
| 160   // TODO(stanisc): can DEVICE_INFO be one of disabled datatypes? |  | 
| 161   sync_service->RegisterDataTypeController(new DeviceInfoDataTypeController( |  | 
| 162       ui_thread, error_callback, sync_client, |  | 
| 163       sync_service->GetLocalDeviceInfoProvider())); |  | 
| 164 |  | 
| 165   // Autofill sync is enabled by default.  Register unless explicitly |  | 
| 166   // disabled. |  | 
| 167   if (!disabled_types.Has(syncer::AUTOFILL)) { |  | 
| 168     sync_service->RegisterDataTypeController(new AutofillDataTypeController( |  | 
| 169         ui_thread, db_thread, error_callback, sync_client)); |  | 
| 170   } |  | 
| 171 |  | 
| 172   // Autofill profile sync is enabled by default.  Register unless explicitly |  | 
| 173   // disabled. |  | 
| 174   if (!disabled_types.Has(syncer::AUTOFILL_PROFILE)) { |  | 
| 175     sync_service->RegisterDataTypeController( |  | 
| 176         new AutofillProfileDataTypeController(ui_thread, db_thread, |  | 
| 177                                               error_callback, sync_client)); |  | 
| 178   } |  | 
| 179 |  | 
| 180   // Wallet data sync is enabled by default, but behind a syncer experiment |  | 
| 181   // enforced by the datatype controller. Register unless explicitly disabled. |  | 
| 182   bool wallet_disabled = disabled_types.Has(syncer::AUTOFILL_WALLET_DATA); |  | 
| 183   if (!wallet_disabled) { |  | 
| 184     sync_service->RegisterDataTypeController( |  | 
| 185         new browser_sync::AutofillWalletDataTypeController( |  | 
| 186             ui_thread, db_thread, error_callback, sync_client, |  | 
| 187             syncer::AUTOFILL_WALLET_DATA)); |  | 
| 188   } |  | 
| 189 |  | 
| 190   // Wallet metadata sync depends on Wallet data sync. Register if Wallet data |  | 
| 191   // is syncing and metadata sync is not explicitly disabled. |  | 
| 192   if (!wallet_disabled && |  | 
| 193       !disabled_types.Has(syncer::AUTOFILL_WALLET_METADATA)) { |  | 
| 194     sync_service->RegisterDataTypeController( |  | 
| 195         new browser_sync::AutofillWalletDataTypeController( |  | 
| 196             ui_thread, db_thread, error_callback, sync_client, |  | 
| 197             syncer::AUTOFILL_WALLET_METADATA)); |  | 
| 198   } |  | 
| 199 |  | 
| 200   // Bookmark sync is enabled by default.  Register unless explicitly |  | 
| 201   // disabled. |  | 
| 202   if (!disabled_types.Has(syncer::BOOKMARKS)) { |  | 
| 203     sync_service->RegisterDataTypeController( |  | 
| 204         new BookmarkDataTypeController(ui_thread, error_callback, sync_client)); |  | 
| 205   } |  | 
| 206 |  | 
| 207   const bool history_disabled = |  | 
| 208       profile_->GetPrefs()->GetBoolean(prefs::kSavingBrowserHistoryDisabled); |  | 
| 209   // TypedUrl sync is enabled by default.  Register unless explicitly disabled, |  | 
| 210   // or if saving history is disabled. |  | 
| 211   if (!disabled_types.Has(syncer::TYPED_URLS) && !history_disabled) { |  | 
| 212     sync_service->RegisterDataTypeController( |  | 
| 213         new TypedUrlDataTypeController(ui_thread, error_callback, sync_client, |  | 
| 214                                        prefs::kSavingBrowserHistoryDisabled)); |  | 
| 215   } |  | 
| 216 |  | 
| 217   // Delete directive sync is enabled by default.  Register unless full history |  | 
| 218   // sync is disabled. |  | 
| 219   if (!disabled_types.Has(syncer::HISTORY_DELETE_DIRECTIVES) && |  | 
| 220       !history_disabled) { |  | 
| 221     sync_service->RegisterDataTypeController( |  | 
| 222         new HistoryDeleteDirectivesDataTypeController(ui_thread, error_callback, |  | 
| 223                                                       sync_client)); |  | 
| 224   } |  | 
| 225 |  | 
| 226   // Session sync is enabled by default.  Register unless explicitly disabled. |  | 
| 227   // This is also disabled if the browser history is disabled, because the |  | 
| 228   // tab sync data is added to the web history on the server. |  | 
| 229   if (!disabled_types.Has(syncer::PROXY_TABS) && !history_disabled) { |  | 
| 230     sync_service->RegisterDataTypeController( |  | 
| 231         new ProxyDataTypeController(ui_thread, syncer::PROXY_TABS)); |  | 
| 232     // TODO(zea): remove this once SyncedWindowDelegateGetter is componentized. |  | 
| 233     // For now, we know that the implementation of SyncService is always a |  | 
| 234     // ProfileSyncService at this level. |  | 
| 235     ProfileSyncService* pss = static_cast<ProfileSyncService*>(sync_service); |  | 
| 236     sync_service->RegisterDataTypeController(new SessionDataTypeController( |  | 
| 237         ui_thread, error_callback, sync_client, |  | 
| 238         pss->GetSyncedWindowDelegatesGetter(), |  | 
| 239         sync_service->GetLocalDeviceInfoProvider(), |  | 
| 240         prefs::kSavingBrowserHistoryDisabled)); |  | 
| 241   } |  | 
| 242 |  | 
| 243   // Favicon sync is enabled by default. Register unless explicitly disabled. |  | 
| 244   if (!disabled_types.Has(syncer::FAVICON_IMAGES) && |  | 
| 245       !disabled_types.Has(syncer::FAVICON_TRACKING) && |  | 
| 246       !history_disabled) { |  | 
| 247     // crbug/384552. We disable error uploading for this data types for now. |  | 
| 248     sync_service->RegisterDataTypeController(new UIDataTypeController( |  | 
| 249         ui_thread, base::Closure(), syncer::FAVICON_IMAGES, sync_client)); |  | 
| 250     sync_service->RegisterDataTypeController(new UIDataTypeController( |  | 
| 251         ui_thread, base::Closure(), syncer::FAVICON_TRACKING, sync_client)); |  | 
| 252   } |  | 
| 253 |  | 
| 254   // Password sync is enabled by default.  Register unless explicitly |  | 
| 255   // disabled. |  | 
| 256   if (!disabled_types.Has(syncer::PASSWORDS)) { |  | 
| 257     sync_service->RegisterDataTypeController(new PasswordDataTypeController( |  | 
| 258         ui_thread, error_callback, sync_client, |  | 
| 259         sync_client->GetPasswordStateChangedCallback())); |  | 
| 260   } |  | 
| 261 |  | 
| 262   if (!disabled_types.Has(syncer::PRIORITY_PREFERENCES)) { |  | 
| 263     sync_service->RegisterDataTypeController(new UIDataTypeController( |  | 
| 264         ui_thread, error_callback, syncer::PRIORITY_PREFERENCES, sync_client)); |  | 
| 265   } |  | 
| 266 |  | 
| 267   // Article sync is disabled by default.  Register only if explicitly enabled. |  | 
| 268   if (dom_distiller::IsEnableSyncArticlesSet()) { |  | 
| 269     sync_service->RegisterDataTypeController(new UIDataTypeController( |  | 
| 270         ui_thread, error_callback, syncer::ARTICLES, sync_client)); |  | 
| 271   } |  | 
| 272 |  | 
| 273 #if defined(ENABLE_SUPERVISED_USERS) |  | 
| 274   sync_service->RegisterDataTypeController( |  | 
| 275       new SupervisedUserSyncDataTypeController(syncer::SUPERVISED_USER_SETTINGS, |  | 
| 276                                                error_callback, sync_client, |  | 
| 277                                                profile_)); |  | 
| 278   sync_service->RegisterDataTypeController( |  | 
| 279       new SupervisedUserSyncDataTypeController( |  | 
| 280           syncer::SUPERVISED_USER_WHITELISTS, error_callback, sync_client, |  | 
| 281           profile_)); |  | 
| 282 #endif |  | 
| 283 } |  | 
| 284 |  | 
| 285 void ProfileSyncComponentsFactoryImpl::RegisterDesktopDataTypes( |  | 
| 286     syncer::ModelTypeSet disabled_types, |  | 
| 287     syncer::ModelTypeSet enabled_types, |  | 
| 288     sync_driver::SyncClient* sync_client) { |  | 
| 289   sync_driver::SyncService* sync_service = sync_client->GetSyncService(); |  | 
| 290   base::Closure error_callback = |  | 
| 291       base::Bind(&ChromeReportUnrecoverableError, chrome::GetChannel()); |  | 
| 292   const scoped_refptr<base::SingleThreadTaskRunner> ui_thread = |  | 
| 293       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); |  | 
| 294 |  | 
| 295 #if defined(ENABLE_EXTENSIONS) |  | 
| 296   // App sync is enabled by default.  Register unless explicitly |  | 
| 297   // disabled. |  | 
| 298   if (!disabled_types.Has(syncer::APPS)) { |  | 
| 299     sync_service->RegisterDataTypeController(new ExtensionDataTypeController( |  | 
| 300         syncer::APPS, error_callback, sync_client, profile_)); |  | 
| 301   } |  | 
| 302 |  | 
| 303   // Extension sync is enabled by default.  Register unless explicitly |  | 
| 304   // disabled. |  | 
| 305   if (!disabled_types.Has(syncer::EXTENSIONS)) { |  | 
| 306     sync_service->RegisterDataTypeController(new ExtensionDataTypeController( |  | 
| 307         syncer::EXTENSIONS, error_callback, sync_client, profile_)); |  | 
| 308   } |  | 
| 309 #endif |  | 
| 310 |  | 
| 311   // Preference sync is enabled by default.  Register unless explicitly |  | 
| 312   // disabled. |  | 
| 313   if (!disabled_types.Has(syncer::PREFERENCES)) { |  | 
| 314     sync_service->RegisterDataTypeController(new UIDataTypeController( |  | 
| 315         ui_thread, error_callback, syncer::PREFERENCES, sync_client)); |  | 
| 316   } |  | 
| 317 |  | 
| 318 #if defined(ENABLE_THEMES) |  | 
| 319   // Theme sync is enabled by default.  Register unless explicitly disabled. |  | 
| 320   if (!disabled_types.Has(syncer::THEMES)) { |  | 
| 321     sync_service->RegisterDataTypeController( |  | 
| 322         new ThemeDataTypeController(error_callback, sync_client, profile_)); |  | 
| 323   } |  | 
| 324 #endif |  | 
| 325 |  | 
| 326   // Search Engine sync is enabled by default.  Register unless explicitly |  | 
| 327   // disabled. |  | 
| 328   if (!disabled_types.Has(syncer::SEARCH_ENGINES)) { |  | 
| 329     sync_service->RegisterDataTypeController(new SearchEngineDataTypeController( |  | 
| 330         ui_thread, error_callback, sync_client, |  | 
| 331         TemplateURLServiceFactory::GetForProfile(profile_))); |  | 
| 332   } |  | 
| 333 |  | 
| 334 #if defined(ENABLE_EXTENSIONS) |  | 
| 335   // Extension setting sync is enabled by default.  Register unless explicitly |  | 
| 336   // disabled. |  | 
| 337   if (!disabled_types.Has(syncer::EXTENSION_SETTINGS)) { |  | 
| 338     sync_service->RegisterDataTypeController( |  | 
| 339         new ExtensionSettingDataTypeController( |  | 
| 340             syncer::EXTENSION_SETTINGS, error_callback, sync_client, profile_)); |  | 
| 341   } |  | 
| 342 |  | 
| 343   // App setting sync is enabled by default.  Register unless explicitly |  | 
| 344   // disabled. |  | 
| 345   if (!disabled_types.Has(syncer::APP_SETTINGS)) { |  | 
| 346     sync_service->RegisterDataTypeController( |  | 
| 347         new ExtensionSettingDataTypeController( |  | 
| 348             syncer::APP_SETTINGS, error_callback, sync_client, profile_)); |  | 
| 349   } |  | 
| 350 #endif |  | 
| 351 |  | 
| 352 #if defined(ENABLE_APP_LIST) |  | 
| 353   if (app_list::switches::IsAppListSyncEnabled()) { |  | 
| 354     sync_service->RegisterDataTypeController(new UIDataTypeController( |  | 
| 355         ui_thread, error_callback, syncer::APP_LIST, sync_client)); |  | 
| 356   } |  | 
| 357 #endif |  | 
| 358 |  | 
| 359 #if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_CHROMEOS) |  | 
| 360   // Dictionary sync is enabled by default. |  | 
| 361   if (!disabled_types.Has(syncer::DICTIONARY)) { |  | 
| 362     sync_service->RegisterDataTypeController(new UIDataTypeController( |  | 
| 363         ui_thread, error_callback, syncer::DICTIONARY, sync_client)); |  | 
| 364   } |  | 
| 365 #endif |  | 
| 366 |  | 
| 367 #if defined(ENABLE_SUPERVISED_USERS) |  | 
| 368   sync_service->RegisterDataTypeController( |  | 
| 369       new SupervisedUserSyncDataTypeController( |  | 
| 370           syncer::SUPERVISED_USERS, error_callback, sync_client, profile_)); |  | 
| 371   sync_service->RegisterDataTypeController( |  | 
| 372       new SupervisedUserSyncDataTypeController( |  | 
| 373           syncer::SUPERVISED_USER_SHARED_SETTINGS, error_callback, sync_client, |  | 
| 374           profile_)); |  | 
| 375 #endif |  | 
| 376 |  | 
| 377 #if defined(OS_CHROMEOS) |  | 
| 378   if (command_line_->HasSwitch(switches::kEnableWifiCredentialSync) && |  | 
| 379       !disabled_types.Has(syncer::WIFI_CREDENTIALS)) { |  | 
| 380     sync_service->RegisterDataTypeController(new UIDataTypeController( |  | 
| 381         ui_thread, error_callback, syncer::WIFI_CREDENTIALS, sync_client)); |  | 
| 382   } |  | 
| 383 #endif |  | 
| 384 } |  | 
| 385 |  | 
| 386 DataTypeManager* ProfileSyncComponentsFactoryImpl::CreateDataTypeManager( |  | 
| 387     const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& |  | 
| 388         debug_info_listener, |  | 
| 389     const DataTypeController::TypeMap* controllers, |  | 
| 390     const sync_driver::DataTypeEncryptionHandler* encryption_handler, |  | 
| 391     SyncBackendHost* backend, |  | 
| 392     DataTypeManagerObserver* observer) { |  | 
| 393   return new DataTypeManagerImpl(debug_info_listener, controllers, |  | 
| 394                                  encryption_handler, backend, observer); |  | 
| 395 } |  | 
| 396 |  | 
| 397 browser_sync::SyncBackendHost* |  | 
| 398 ProfileSyncComponentsFactoryImpl::CreateSyncBackendHost( |  | 
| 399     const std::string& name, |  | 
| 400     sync_driver::SyncClient* sync_client, |  | 
| 401     invalidation::InvalidationService* invalidator, |  | 
| 402     const base::WeakPtr<sync_driver::SyncPrefs>& sync_prefs, |  | 
| 403     const base::FilePath& sync_folder) { |  | 
| 404   return new browser_sync::SyncBackendHostImpl( |  | 
| 405       name, sync_client, |  | 
| 406       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), |  | 
| 407       invalidator, sync_prefs, sync_folder); |  | 
| 408 } |  | 
| 409 |  | 
| 410 scoped_ptr<sync_driver::LocalDeviceInfoProvider> |  | 
| 411 ProfileSyncComponentsFactoryImpl::CreateLocalDeviceInfoProvider() { |  | 
| 412   return scoped_ptr<sync_driver::LocalDeviceInfoProvider>( |  | 
| 413       new browser_sync::LocalDeviceInfoProviderImpl( |  | 
| 414           chrome::GetChannel(), |  | 
| 415           chrome::GetVersionString(), |  | 
| 416           ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET)); |  | 
| 417 } |  | 
| 418 |  | 
| 419 class TokenServiceProvider |  | 
| 420     : public OAuth2TokenServiceRequest::TokenServiceProvider { |  | 
| 421  public: |  | 
| 422   TokenServiceProvider( |  | 
| 423       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |  | 
| 424       OAuth2TokenService* token_service); |  | 
| 425 |  | 
| 426   // OAuth2TokenServiceRequest::TokenServiceProvider implementation. |  | 
| 427   scoped_refptr<base::SingleThreadTaskRunner> GetTokenServiceTaskRunner() |  | 
| 428       override; |  | 
| 429   OAuth2TokenService* GetTokenService() override; |  | 
| 430 |  | 
| 431  private: |  | 
| 432   ~TokenServiceProvider() override; |  | 
| 433 |  | 
| 434   scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |  | 
| 435   OAuth2TokenService* token_service_; |  | 
| 436 }; |  | 
| 437 |  | 
| 438 TokenServiceProvider::TokenServiceProvider( |  | 
| 439     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |  | 
| 440     OAuth2TokenService* token_service) |  | 
| 441     : task_runner_(task_runner), token_service_(token_service) { |  | 
| 442 } |  | 
| 443 |  | 
| 444 TokenServiceProvider::~TokenServiceProvider() { |  | 
| 445 } |  | 
| 446 |  | 
| 447 scoped_refptr<base::SingleThreadTaskRunner> |  | 
| 448 TokenServiceProvider::GetTokenServiceTaskRunner() { |  | 
| 449   return task_runner_; |  | 
| 450 } |  | 
| 451 |  | 
| 452 OAuth2TokenService* TokenServiceProvider::GetTokenService() { |  | 
| 453   return token_service_; |  | 
| 454 } |  | 
| 455 |  | 
| 456 scoped_ptr<syncer::AttachmentService> |  | 
| 457 ProfileSyncComponentsFactoryImpl::CreateAttachmentService( |  | 
| 458     scoped_ptr<syncer::AttachmentStoreForSync> attachment_store, |  | 
| 459     const syncer::UserShare& user_share, |  | 
| 460     const std::string& store_birthday, |  | 
| 461     syncer::ModelType model_type, |  | 
| 462     syncer::AttachmentService::Delegate* delegate) { |  | 
| 463   scoped_ptr<syncer::AttachmentUploader> attachment_uploader; |  | 
| 464   scoped_ptr<syncer::AttachmentDownloader> attachment_downloader; |  | 
| 465   // Only construct an AttachmentUploader and AttachmentDownload if we have sync |  | 
| 466   // credentials. We may not have sync credentials because there may not be a |  | 
| 467   // signed in sync user (e.g. sync is running in "backup" mode). |  | 
| 468   if (!user_share.sync_credentials.email.empty() && |  | 
| 469       !user_share.sync_credentials.scope_set.empty()) { |  | 
| 470     const scoped_refptr<base::SingleThreadTaskRunner> ui_thread = |  | 
| 471         BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); |  | 
| 472 |  | 
| 473     scoped_refptr<OAuth2TokenServiceRequest::TokenServiceProvider> |  | 
| 474         token_service_provider( |  | 
| 475             new TokenServiceProvider(ui_thread, token_service_)); |  | 
| 476     // TODO(maniscalco): Use shared (one per profile) thread-safe instances of |  | 
| 477     // AttachmentUploader and AttachmentDownloader instead of creating a new one |  | 
| 478     // per AttachmentService (bug 369536). |  | 
| 479     attachment_uploader.reset(new syncer::AttachmentUploaderImpl( |  | 
| 480         sync_service_url_, url_request_context_getter_, |  | 
| 481         user_share.sync_credentials.email, |  | 
| 482         user_share.sync_credentials.scope_set, token_service_provider, |  | 
| 483         store_birthday, model_type)); |  | 
| 484 |  | 
| 485     token_service_provider = |  | 
| 486         new TokenServiceProvider(ui_thread, token_service_); |  | 
| 487     attachment_downloader = syncer::AttachmentDownloader::Create( |  | 
| 488         sync_service_url_, url_request_context_getter_, |  | 
| 489         user_share.sync_credentials.email, |  | 
| 490         user_share.sync_credentials.scope_set, token_service_provider, |  | 
| 491         store_birthday, model_type); |  | 
| 492   } |  | 
| 493 |  | 
| 494   // It is important that the initial backoff delay is relatively large.  For |  | 
| 495   // whatever reason, the server may fail all requests for a short period of |  | 
| 496   // time.  When this happens we don't want to overwhelm the server with |  | 
| 497   // requests so we use a large initial backoff. |  | 
| 498   const base::TimeDelta initial_backoff_delay = |  | 
| 499       base::TimeDelta::FromMinutes(30); |  | 
| 500   const base::TimeDelta max_backoff_delay = base::TimeDelta::FromHours(4); |  | 
| 501   scoped_ptr<syncer::AttachmentService> attachment_service( |  | 
| 502       new syncer::AttachmentServiceImpl( |  | 
| 503           attachment_store.Pass(), attachment_uploader.Pass(), |  | 
| 504           attachment_downloader.Pass(), delegate, initial_backoff_delay, |  | 
| 505           max_backoff_delay)); |  | 
| 506   return attachment_service.Pass(); |  | 
| 507 } |  | 
| 508 |  | 
| 509 sync_driver::SyncApiComponentFactory::SyncComponents |  | 
| 510     ProfileSyncComponentsFactoryImpl::CreateBookmarkSyncComponents( |  | 
| 511         sync_driver::SyncService* sync_service, |  | 
| 512         sync_driver::DataTypeErrorHandler* error_handler) { |  | 
| 513   BookmarkModel* bookmark_model = |  | 
| 514       BookmarkModelFactory::GetForProfile(profile_); |  | 
| 515   syncer::UserShare* user_share = sync_service->GetUserShare(); |  | 
| 516   // TODO(akalin): We may want to propagate this switch up eventually. |  | 
| 517 #if defined(OS_ANDROID) |  | 
| 518   const bool kExpectMobileBookmarksFolder = true; |  | 
| 519 #else |  | 
| 520   const bool kExpectMobileBookmarksFolder = false; |  | 
| 521 #endif |  | 
| 522   BookmarkModelAssociator* model_associator = new BookmarkModelAssociator( |  | 
| 523       bookmark_model, sync_service->GetSyncClient(), user_share, error_handler, |  | 
| 524       kExpectMobileBookmarksFolder); |  | 
| 525   BookmarkChangeProcessor* change_processor = new BookmarkChangeProcessor( |  | 
| 526       sync_service->GetSyncClient(), model_associator, error_handler); |  | 
| 527   return SyncComponents(model_associator, change_processor); |  | 
| 528 } |  | 
| 529 |  | 
| 530 sync_driver::SyncApiComponentFactory::SyncComponents |  | 
| 531     ProfileSyncComponentsFactoryImpl::CreateTypedUrlSyncComponents( |  | 
| 532         sync_driver::SyncService* sync_service, |  | 
| 533         history::HistoryBackend* history_backend, |  | 
| 534         sync_driver::DataTypeErrorHandler* error_handler) { |  | 
| 535   DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI)); |  | 
| 536 |  | 
| 537   const scoped_refptr<base::SingleThreadTaskRunner> ui_thread = |  | 
| 538       BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); |  | 
| 539 |  | 
| 540   // TODO(zea): Once TypedURLs are converted to SyncableService, remove |  | 
| 541   // |sync_service_| member, and make GetSyncService require it be called on |  | 
| 542   // the UI thread. |  | 
| 543   TypedUrlModelAssociator* model_associator = |  | 
| 544       new TypedUrlModelAssociator(sync_service, |  | 
| 545                                   history_backend, |  | 
| 546                                   error_handler); |  | 
| 547   TypedUrlChangeProcessor* change_processor = new TypedUrlChangeProcessor( |  | 
| 548       model_associator, history_backend, error_handler, ui_thread); |  | 
| 549   return SyncComponents(model_associator, change_processor); |  | 
| 550 } |  | 
| OLD | NEW | 
|---|