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