| 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 "components/browser_sync/browser/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 "components/autofill/core/browser/autofill_wallet_data_type_controller.
h" | |
| 12 #include "components/autofill/core/browser/webdata/autofill_data_type_controller
.h" | |
| 13 #include "components/autofill/core/browser/webdata/autofill_profile_data_type_co
ntroller.h" | |
| 14 #include "components/autofill/core/common/autofill_pref_names.h" | |
| 15 #include "components/autofill/core/common/autofill_switches.h" | |
| 16 #include "components/browser_sync/browser/profile_sync_service.h" | |
| 17 #include "components/browser_sync/common/browser_sync_switches.h" | |
| 18 #include "components/dom_distiller/core/dom_distiller_features.h" | |
| 19 #include "components/history/core/browser/history_delete_directives_data_type_co
ntroller.h" | |
| 20 #include "components/history/core/browser/typed_url_change_processor.h" | |
| 21 #include "components/history/core/browser/typed_url_data_type_controller.h" | |
| 22 #include "components/history/core/browser/typed_url_model_associator.h" | |
| 23 #include "components/password_manager/sync/browser/password_data_type_controller
.h" | |
| 24 #include "components/sync_bookmarks/bookmark_change_processor.h" | |
| 25 #include "components/sync_bookmarks/bookmark_data_type_controller.h" | |
| 26 #include "components/sync_bookmarks/bookmark_model_associator.h" | |
| 27 #include "components/sync_driver/data_type_manager_impl.h" | |
| 28 #include "components/sync_driver/device_info_data_type_controller.h" | |
| 29 #include "components/sync_driver/glue/chrome_report_unrecoverable_error.h" | |
| 30 #include "components/sync_driver/glue/sync_backend_host.h" | |
| 31 #include "components/sync_driver/glue/sync_backend_host_impl.h" | |
| 32 #include "components/sync_driver/local_device_info_provider_impl.h" | |
| 33 #include "components/sync_driver/proxy_data_type_controller.h" | |
| 34 #include "components/sync_driver/sync_client.h" | |
| 35 #include "components/sync_driver/ui_data_type_controller.h" | |
| 36 #include "components/sync_sessions/session_data_type_controller.h" | |
| 37 #include "google_apis/gaia/oauth2_token_service.h" | |
| 38 #include "google_apis/gaia/oauth2_token_service_request.h" | |
| 39 #include "net/url_request/url_request_context_getter.h" | |
| 40 #include "sync/internal_api/public/attachments/attachment_downloader.h" | |
| 41 #include "sync/internal_api/public/attachments/attachment_service.h" | |
| 42 #include "sync/internal_api/public/attachments/attachment_service_impl.h" | |
| 43 #include "sync/internal_api/public/attachments/attachment_uploader_impl.h" | |
| 44 | |
| 45 using bookmarks::BookmarkModel; | |
| 46 using browser_sync::AutofillDataTypeController; | |
| 47 using browser_sync::AutofillProfileDataTypeController; | |
| 48 using browser_sync::BookmarkChangeProcessor; | |
| 49 using browser_sync::BookmarkDataTypeController; | |
| 50 using browser_sync::BookmarkModelAssociator; | |
| 51 using browser_sync::ChromeReportUnrecoverableError; | |
| 52 using browser_sync::HistoryDeleteDirectivesDataTypeController; | |
| 53 using browser_sync::PasswordDataTypeController; | |
| 54 using browser_sync::SessionDataTypeController; | |
| 55 using browser_sync::SyncBackendHost; | |
| 56 using browser_sync::TypedUrlChangeProcessor; | |
| 57 using browser_sync::TypedUrlDataTypeController; | |
| 58 using browser_sync::TypedUrlModelAssociator; | |
| 59 using sync_driver::DataTypeController; | |
| 60 using sync_driver::DataTypeErrorHandler; | |
| 61 using sync_driver::DataTypeManager; | |
| 62 using sync_driver::DataTypeManagerImpl; | |
| 63 using sync_driver::DataTypeManagerObserver; | |
| 64 using sync_driver::DeviceInfoDataTypeController; | |
| 65 using sync_driver::ProxyDataTypeController; | |
| 66 using sync_driver::UIDataTypeController; | |
| 67 | |
| 68 namespace { | |
| 69 | |
| 70 syncer::ModelTypeSet GetDisabledTypesFromCommandLine( | |
| 71 const base::CommandLine& command_line) { | |
| 72 syncer::ModelTypeSet disabled_types; | |
| 73 std::string disabled_types_str = | |
| 74 command_line.GetSwitchValueASCII(switches::kDisableSyncTypes); | |
| 75 | |
| 76 disabled_types = syncer::ModelTypeSetFromString(disabled_types_str); | |
| 77 return disabled_types; | |
| 78 } | |
| 79 | |
| 80 syncer::ModelTypeSet GetEnabledTypesFromCommandLine( | |
| 81 const base::CommandLine& command_line) { | |
| 82 syncer::ModelTypeSet enabled_types; | |
| 83 if (command_line.HasSwitch(autofill::switches::kEnableWalletMetadataSync)) | |
| 84 enabled_types.Put(syncer::AUTOFILL_WALLET_METADATA); | |
| 85 | |
| 86 return enabled_types; | |
| 87 } | |
| 88 | |
| 89 } // namespace | |
| 90 | |
| 91 ProfileSyncComponentsFactoryImpl::ProfileSyncComponentsFactoryImpl( | |
| 92 sync_driver::SyncClient* sync_client, | |
| 93 version_info::Channel channel, | |
| 94 const std::string& version, | |
| 95 bool is_tablet, | |
| 96 const base::CommandLine& command_line, | |
| 97 const char* history_disabled_pref, | |
| 98 const GURL& sync_service_url, | |
| 99 const scoped_refptr<base::SingleThreadTaskRunner>& ui_thread, | |
| 100 const scoped_refptr<base::SingleThreadTaskRunner>& db_thread, | |
| 101 OAuth2TokenService* token_service, | |
| 102 net::URLRequestContextGetter* url_request_context_getter) | |
| 103 : sync_client_(sync_client), | |
| 104 channel_(channel), | |
| 105 version_(version), | |
| 106 is_tablet_(is_tablet), | |
| 107 command_line_(command_line), | |
| 108 history_disabled_pref_(history_disabled_pref), | |
| 109 sync_service_url_(sync_service_url), | |
| 110 ui_thread_(ui_thread), | |
| 111 db_thread_(db_thread), | |
| 112 token_service_(token_service), | |
| 113 url_request_context_getter_(url_request_context_getter), | |
| 114 weak_factory_(this) { | |
| 115 DCHECK(token_service_); | |
| 116 DCHECK(url_request_context_getter_); | |
| 117 } | |
| 118 | |
| 119 ProfileSyncComponentsFactoryImpl::~ProfileSyncComponentsFactoryImpl() {} | |
| 120 | |
| 121 void ProfileSyncComponentsFactoryImpl::RegisterDataTypes( | |
| 122 const RegisterDataTypesMethod& register_platform_types_method) { | |
| 123 syncer::ModelTypeSet disabled_types = | |
| 124 GetDisabledTypesFromCommandLine(command_line_); | |
| 125 syncer::ModelTypeSet enabled_types = | |
| 126 GetEnabledTypesFromCommandLine(command_line_); | |
| 127 RegisterCommonDataTypes(disabled_types, enabled_types); | |
| 128 if (!register_platform_types_method.is_null()) | |
| 129 register_platform_types_method.Run(disabled_types, enabled_types); | |
| 130 } | |
| 131 | |
| 132 void ProfileSyncComponentsFactoryImpl::RegisterCommonDataTypes( | |
| 133 syncer::ModelTypeSet disabled_types, | |
| 134 syncer::ModelTypeSet enabled_types) { | |
| 135 sync_driver::SyncService* sync_service = sync_client_->GetSyncService(); | |
| 136 base::Closure error_callback = | |
| 137 base::Bind(&ChromeReportUnrecoverableError, channel_); | |
| 138 | |
| 139 // TODO(stanisc): can DEVICE_INFO be one of disabled datatypes? | |
| 140 sync_service->RegisterDataTypeController(new DeviceInfoDataTypeController( | |
| 141 ui_thread_, error_callback, sync_client_, | |
| 142 sync_service->GetLocalDeviceInfoProvider())); | |
| 143 | |
| 144 // Autofill sync is enabled by default. Register unless explicitly | |
| 145 // disabled. | |
| 146 if (!disabled_types.Has(syncer::AUTOFILL)) { | |
| 147 sync_service->RegisterDataTypeController(new AutofillDataTypeController( | |
| 148 ui_thread_, db_thread_, error_callback, sync_client_)); | |
| 149 } | |
| 150 | |
| 151 // Autofill profile sync is enabled by default. Register unless explicitly | |
| 152 // disabled. | |
| 153 if (!disabled_types.Has(syncer::AUTOFILL_PROFILE)) { | |
| 154 sync_service->RegisterDataTypeController( | |
| 155 new AutofillProfileDataTypeController(ui_thread_, db_thread_, | |
| 156 error_callback, sync_client_)); | |
| 157 } | |
| 158 | |
| 159 // Wallet data sync is enabled by default, but behind a syncer experiment | |
| 160 // enforced by the datatype controller. Register unless explicitly disabled. | |
| 161 bool wallet_disabled = disabled_types.Has(syncer::AUTOFILL_WALLET_DATA); | |
| 162 if (!wallet_disabled) { | |
| 163 sync_service->RegisterDataTypeController( | |
| 164 new browser_sync::AutofillWalletDataTypeController( | |
| 165 ui_thread_, db_thread_, error_callback, sync_client_, | |
| 166 syncer::AUTOFILL_WALLET_DATA)); | |
| 167 } | |
| 168 | |
| 169 // Wallet metadata sync depends on Wallet data sync and is disabled by | |
| 170 // default. Register if Wallet data is syncing and metadata sync is explicitly | |
| 171 // enabled. | |
| 172 if (!wallet_disabled && enabled_types.Has(syncer::AUTOFILL_WALLET_METADATA)) { | |
| 173 sync_service->RegisterDataTypeController( | |
| 174 new browser_sync::AutofillWalletDataTypeController( | |
| 175 ui_thread_, db_thread_, error_callback, sync_client_, | |
| 176 syncer::AUTOFILL_WALLET_METADATA)); | |
| 177 } | |
| 178 | |
| 179 // Bookmark sync is enabled by default. Register unless explicitly | |
| 180 // disabled. | |
| 181 if (!disabled_types.Has(syncer::BOOKMARKS)) { | |
| 182 sync_service->RegisterDataTypeController(new BookmarkDataTypeController( | |
| 183 ui_thread_, error_callback, sync_client_)); | |
| 184 } | |
| 185 | |
| 186 const bool history_disabled = | |
| 187 sync_client_->GetPrefService()->GetBoolean(history_disabled_pref_); | |
| 188 // TypedUrl sync is enabled by default. Register unless explicitly disabled, | |
| 189 // or if saving history is disabled. | |
| 190 if (!disabled_types.Has(syncer::TYPED_URLS) && !history_disabled) { | |
| 191 sync_service->RegisterDataTypeController(new TypedUrlDataTypeController( | |
| 192 ui_thread_, error_callback, sync_client_, history_disabled_pref_)); | |
| 193 } | |
| 194 | |
| 195 // Delete directive sync is enabled by default. Register unless full history | |
| 196 // sync is disabled. | |
| 197 if (!disabled_types.Has(syncer::HISTORY_DELETE_DIRECTIVES) && | |
| 198 !history_disabled) { | |
| 199 sync_service->RegisterDataTypeController( | |
| 200 new HistoryDeleteDirectivesDataTypeController( | |
| 201 ui_thread_, error_callback, sync_client_)); | |
| 202 } | |
| 203 | |
| 204 // Session sync is enabled by default. Register unless explicitly disabled. | |
| 205 // This is also disabled if the browser history is disabled, because the | |
| 206 // tab sync data is added to the web history on the server. | |
| 207 if (!disabled_types.Has(syncer::PROXY_TABS) && !history_disabled) { | |
| 208 sync_service->RegisterDataTypeController( | |
| 209 new ProxyDataTypeController(ui_thread_, syncer::PROXY_TABS)); | |
| 210 // TODO(zea): remove this once SyncedWindowDelegateGetter is componentized. | |
| 211 // For now, we know that the implementation of SyncService is always a | |
| 212 // ProfileSyncService at this level. | |
| 213 ProfileSyncService* pss = static_cast<ProfileSyncService*>(sync_service); | |
| 214 sync_service->RegisterDataTypeController(new SessionDataTypeController( | |
| 215 ui_thread_, error_callback, sync_client_, | |
| 216 pss->GetSyncedWindowDelegatesGetter(), | |
| 217 sync_service->GetLocalDeviceInfoProvider(), history_disabled_pref_)); | |
| 218 } | |
| 219 | |
| 220 // Favicon sync is enabled by default. Register unless explicitly disabled. | |
| 221 if (!disabled_types.Has(syncer::FAVICON_IMAGES) && | |
| 222 !disabled_types.Has(syncer::FAVICON_TRACKING) && !history_disabled) { | |
| 223 // crbug/384552. We disable error uploading for this data types for now. | |
| 224 sync_service->RegisterDataTypeController(new UIDataTypeController( | |
| 225 ui_thread_, base::Closure(), syncer::FAVICON_IMAGES, sync_client_)); | |
| 226 sync_service->RegisterDataTypeController(new UIDataTypeController( | |
| 227 ui_thread_, base::Closure(), syncer::FAVICON_TRACKING, sync_client_)); | |
| 228 } | |
| 229 | |
| 230 // Password sync is enabled by default. Register unless explicitly | |
| 231 // disabled. | |
| 232 if (!disabled_types.Has(syncer::PASSWORDS)) { | |
| 233 sync_service->RegisterDataTypeController(new PasswordDataTypeController( | |
| 234 ui_thread_, error_callback, sync_client_, | |
| 235 sync_client_->GetPasswordStateChangedCallback())); | |
| 236 } | |
| 237 | |
| 238 if (!disabled_types.Has(syncer::PRIORITY_PREFERENCES)) { | |
| 239 sync_service->RegisterDataTypeController( | |
| 240 new UIDataTypeController(ui_thread_, error_callback, | |
| 241 syncer::PRIORITY_PREFERENCES, sync_client_)); | |
| 242 } | |
| 243 | |
| 244 // Article sync is disabled by default. Register only if explicitly enabled. | |
| 245 if (dom_distiller::IsEnableSyncArticlesSet()) { | |
| 246 sync_service->RegisterDataTypeController(new UIDataTypeController( | |
| 247 ui_thread_, error_callback, syncer::ARTICLES, sync_client_)); | |
| 248 } | |
| 249 } | |
| 250 | |
| 251 DataTypeManager* ProfileSyncComponentsFactoryImpl::CreateDataTypeManager( | |
| 252 const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>& | |
| 253 debug_info_listener, | |
| 254 const DataTypeController::TypeMap* controllers, | |
| 255 const sync_driver::DataTypeEncryptionHandler* encryption_handler, | |
| 256 SyncBackendHost* backend, | |
| 257 DataTypeManagerObserver* observer) { | |
| 258 return new DataTypeManagerImpl(debug_info_listener, controllers, | |
| 259 encryption_handler, backend, observer); | |
| 260 } | |
| 261 | |
| 262 browser_sync::SyncBackendHost* | |
| 263 ProfileSyncComponentsFactoryImpl::CreateSyncBackendHost( | |
| 264 const std::string& name, | |
| 265 invalidation::InvalidationService* invalidator, | |
| 266 const base::WeakPtr<sync_driver::SyncPrefs>& sync_prefs, | |
| 267 const base::FilePath& sync_folder) { | |
| 268 return new browser_sync::SyncBackendHostImpl( | |
| 269 name, sync_client_, ui_thread_, invalidator, sync_prefs, sync_folder); | |
| 270 } | |
| 271 | |
| 272 scoped_ptr<sync_driver::LocalDeviceInfoProvider> | |
| 273 ProfileSyncComponentsFactoryImpl::CreateLocalDeviceInfoProvider() { | |
| 274 return scoped_ptr<sync_driver::LocalDeviceInfoProvider>( | |
| 275 new browser_sync::LocalDeviceInfoProviderImpl(channel_, version_, | |
| 276 is_tablet_)); | |
| 277 } | |
| 278 | |
| 279 class TokenServiceProvider | |
| 280 : public OAuth2TokenServiceRequest::TokenServiceProvider { | |
| 281 public: | |
| 282 TokenServiceProvider( | |
| 283 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | |
| 284 OAuth2TokenService* token_service); | |
| 285 | |
| 286 // OAuth2TokenServiceRequest::TokenServiceProvider implementation. | |
| 287 scoped_refptr<base::SingleThreadTaskRunner> GetTokenServiceTaskRunner() | |
| 288 override; | |
| 289 OAuth2TokenService* GetTokenService() override; | |
| 290 | |
| 291 private: | |
| 292 ~TokenServiceProvider() override; | |
| 293 | |
| 294 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | |
| 295 OAuth2TokenService* token_service_; | |
| 296 }; | |
| 297 | |
| 298 TokenServiceProvider::TokenServiceProvider( | |
| 299 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | |
| 300 OAuth2TokenService* token_service) | |
| 301 : task_runner_(task_runner), token_service_(token_service) {} | |
| 302 | |
| 303 TokenServiceProvider::~TokenServiceProvider() {} | |
| 304 | |
| 305 scoped_refptr<base::SingleThreadTaskRunner> | |
| 306 TokenServiceProvider::GetTokenServiceTaskRunner() { | |
| 307 return task_runner_; | |
| 308 } | |
| 309 | |
| 310 OAuth2TokenService* TokenServiceProvider::GetTokenService() { | |
| 311 return token_service_; | |
| 312 } | |
| 313 | |
| 314 scoped_ptr<syncer::AttachmentService> | |
| 315 ProfileSyncComponentsFactoryImpl::CreateAttachmentService( | |
| 316 scoped_ptr<syncer::AttachmentStoreForSync> attachment_store, | |
| 317 const syncer::UserShare& user_share, | |
| 318 const std::string& store_birthday, | |
| 319 syncer::ModelType model_type, | |
| 320 syncer::AttachmentService::Delegate* delegate) { | |
| 321 scoped_ptr<syncer::AttachmentUploader> attachment_uploader; | |
| 322 scoped_ptr<syncer::AttachmentDownloader> attachment_downloader; | |
| 323 // Only construct an AttachmentUploader and AttachmentDownload if we have sync | |
| 324 // credentials. We may not have sync credentials because there may not be a | |
| 325 // signed in sync user (e.g. sync is running in "backup" mode). | |
| 326 if (!user_share.sync_credentials.email.empty() && | |
| 327 !user_share.sync_credentials.scope_set.empty()) { | |
| 328 scoped_refptr<OAuth2TokenServiceRequest::TokenServiceProvider> | |
| 329 token_service_provider( | |
| 330 new TokenServiceProvider(ui_thread_, token_service_)); | |
| 331 // TODO(maniscalco): Use shared (one per profile) thread-safe instances of | |
| 332 // AttachmentUploader and AttachmentDownloader instead of creating a new one | |
| 333 // per AttachmentService (bug 369536). | |
| 334 attachment_uploader.reset(new syncer::AttachmentUploaderImpl( | |
| 335 sync_service_url_, url_request_context_getter_, | |
| 336 user_share.sync_credentials.email, | |
| 337 user_share.sync_credentials.scope_set, token_service_provider, | |
| 338 store_birthday, model_type)); | |
| 339 | |
| 340 token_service_provider = | |
| 341 new TokenServiceProvider(ui_thread_, token_service_); | |
| 342 attachment_downloader = syncer::AttachmentDownloader::Create( | |
| 343 sync_service_url_, url_request_context_getter_, | |
| 344 user_share.sync_credentials.email, | |
| 345 user_share.sync_credentials.scope_set, token_service_provider, | |
| 346 store_birthday, model_type); | |
| 347 } | |
| 348 | |
| 349 // It is important that the initial backoff delay is relatively large. For | |
| 350 // whatever reason, the server may fail all requests for a short period of | |
| 351 // time. When this happens we don't want to overwhelm the server with | |
| 352 // requests so we use a large initial backoff. | |
| 353 const base::TimeDelta initial_backoff_delay = | |
| 354 base::TimeDelta::FromMinutes(30); | |
| 355 const base::TimeDelta max_backoff_delay = base::TimeDelta::FromHours(4); | |
| 356 scoped_ptr<syncer::AttachmentService> attachment_service( | |
| 357 new syncer::AttachmentServiceImpl( | |
| 358 attachment_store.Pass(), attachment_uploader.Pass(), | |
| 359 attachment_downloader.Pass(), delegate, initial_backoff_delay, | |
| 360 max_backoff_delay)); | |
| 361 return attachment_service.Pass(); | |
| 362 } | |
| 363 | |
| 364 sync_driver::SyncApiComponentFactory::SyncComponents | |
| 365 ProfileSyncComponentsFactoryImpl::CreateBookmarkSyncComponents( | |
| 366 sync_driver::SyncService* sync_service, | |
| 367 sync_driver::DataTypeErrorHandler* error_handler) { | |
| 368 BookmarkModel* bookmark_model = | |
| 369 sync_service->GetSyncClient()->GetBookmarkModel(); | |
| 370 syncer::UserShare* user_share = sync_service->GetUserShare(); | |
| 371 // TODO(akalin): We may want to propagate this switch up eventually. | |
| 372 #if defined(OS_ANDROID) || defined(OS_IOS) | |
| 373 const bool kExpectMobileBookmarksFolder = true; | |
| 374 #else | |
| 375 const bool kExpectMobileBookmarksFolder = false; | |
| 376 #endif | |
| 377 BookmarkModelAssociator* model_associator = new BookmarkModelAssociator( | |
| 378 bookmark_model, sync_service->GetSyncClient(), user_share, error_handler, | |
| 379 kExpectMobileBookmarksFolder); | |
| 380 BookmarkChangeProcessor* change_processor = new BookmarkChangeProcessor( | |
| 381 sync_service->GetSyncClient(), model_associator, error_handler); | |
| 382 return SyncComponents(model_associator, change_processor); | |
| 383 } | |
| 384 | |
| 385 sync_driver::SyncApiComponentFactory::SyncComponents | |
| 386 ProfileSyncComponentsFactoryImpl::CreateTypedUrlSyncComponents( | |
| 387 sync_driver::SyncService* sync_service, | |
| 388 history::HistoryBackend* history_backend, | |
| 389 sync_driver::DataTypeErrorHandler* error_handler) { | |
| 390 DCHECK(!ui_thread_->BelongsToCurrentThread()); | |
| 391 | |
| 392 // TODO(zea): Once TypedURLs are converted to SyncableService, remove | |
| 393 // |sync_service_| member, and make GetSyncService require it be called on | |
| 394 // the UI thread. | |
| 395 TypedUrlModelAssociator* model_associator = | |
| 396 new TypedUrlModelAssociator(sync_service, history_backend, error_handler); | |
| 397 TypedUrlChangeProcessor* change_processor = new TypedUrlChangeProcessor( | |
| 398 model_associator, history_backend, error_handler, ui_thread_); | |
| 399 return SyncComponents(model_associator, change_processor); | |
| 400 } | |
| OLD | NEW |