Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: chrome/browser/sync/profile_sync_components_factory_impl.cc

Issue 1421003007: [Sync] Componentize ProfileSyncComponentsFactoryImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Have ChromeSyncClient create its own SyncApiComponentFactory Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698