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