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

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

Issue 2769113002: [Sync] Stop accessing BrowserContextKeyedServiceFactory on non-UI thread. (Closed)
Patch Set: Rebase Created 3 years, 9 months 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
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync/chrome_sync_client.h" 5 #include "chrome/browser/sync/chrome_sync_client.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 #include "chrome/browser/chromeos/arc/arc_util.h" 113 #include "chrome/browser/chromeos/arc/arc_util.h"
114 #include "chrome/browser/chromeos/printing/printers_manager.h" 114 #include "chrome/browser/chromeos/printing/printers_manager.h"
115 #include "chrome/browser/chromeos/printing/printers_manager_factory.h" 115 #include "chrome/browser/chromeos/printing/printers_manager_factory.h"
116 #include "chrome/browser/chromeos/printing/printers_sync_bridge.h" 116 #include "chrome/browser/chromeos/printing/printers_sync_bridge.h"
117 #include "chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.h " 117 #include "chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.h "
118 #include "chrome/browser/ui/app_list/arc/arc_package_syncable_service.h" 118 #include "chrome/browser/ui/app_list/arc/arc_package_syncable_service.h"
119 #include "components/sync_wifi/wifi_credential_syncable_service.h" 119 #include "components/sync_wifi/wifi_credential_syncable_service.h"
120 #include "components/sync_wifi/wifi_credential_syncable_service_factory.h" 120 #include "components/sync_wifi/wifi_credential_syncable_service_factory.h"
121 #endif 121 #endif
122 122
123 using content::BrowserThread; 123 using autofill::AutocompleteSyncableService;
pavely 2017/03/27 19:38:25 nit: autofill related classes are only mentioned i
skym 2017/03/27 21:45:26 Done.
124 using autofill::AutofillProfileSyncableService;
125 using autofill::AutofillWalletMetadataSyncableService;
126 using autofill::AutofillWalletSyncableService;
127 using base::Callback;
128 using base::WeakPtr;
124 #if BUILDFLAG(ENABLE_EXTENSIONS) 129 #if BUILDFLAG(ENABLE_EXTENSIONS)
125 using browser_sync::ExtensionDataTypeController; 130 using browser_sync::ExtensionDataTypeController;
126 using browser_sync::ExtensionSettingDataTypeController; 131 using browser_sync::ExtensionSettingDataTypeController;
127 #endif 132 #endif
128 using browser_sync::SearchEngineDataTypeController; 133 using browser_sync::SearchEngineDataTypeController;
134 using content::BrowserThread;
129 using syncer::AsyncDirectoryTypeController; 135 using syncer::AsyncDirectoryTypeController;
136 using syncer::SyncableService;
137
138 using ServiceProvider = syncer::SyncClient::ServiceProvider;
130 139
131 namespace browser_sync { 140 namespace browser_sync {
132 141
133 namespace { 142 namespace {
143
134 #if defined(OS_WIN) 144 #if defined(OS_WIN)
135 const base::FilePath::CharType kLoopbackServerBackendFilename[] = 145 const base::FilePath::CharType kLoopbackServerBackendFilename[] =
136 FILE_PATH_LITERAL("profile.pb"); 146 FILE_PATH_LITERAL("profile.pb");
137 #endif 147 #endif
148
149 template <typename T>
pavely 2017/03/27 19:38:25 Could you add comment explaining how these functio
skym 2017/03/27 21:45:26 Done.
150 T Trampoline(T arg) {
151 return arg;
152 }
153
154 template <typename T>
155 Callback<T()> WrapInCallback(T arg) {
156 return base::Bind(&Trampoline<T>, arg);
157 }
158
159 WeakPtr<SyncableService> ServiceAsWeakPtr(SyncableService* ptr) {
160 return ptr ? ptr->AsWeakPtr() : WeakPtr<SyncableService>();
161 }
162
163 ServiceProvider WrapInProvider(SyncableService* service) {
164 return WrapInCallback(ServiceAsWeakPtr(service));
165 }
166
167 template <typename T>
168 WeakPtr<SyncableService> CallbackResultAsWeakPtr(Callback<T()> callback) {
169 return ServiceAsWeakPtr(callback.Run());
170 }
171
172 template <typename T>
173 ServiceProvider WrapInWeakPtrCallback(Callback<T()> callback) {
174 return base::Bind(&CallbackResultAsWeakPtr<T>, callback);
175 }
176
138 } // namespace 177 } // namespace
139 178
140 // Chrome implementation of SyncSessionsClient. Needs to be in a separate class 179 // Chrome implementation of SyncSessionsClient. Needs to be in a separate class
141 // due to possible multiple inheritance issues, wherein ChromeSyncClient might 180 // due to possible multiple inheritance issues, wherein ChromeSyncClient might
142 // inherit from other interfaces with same methods. 181 // inherit from other interfaces with same methods.
143 class SyncSessionsClientImpl : public sync_sessions::SyncSessionsClient { 182 class SyncSessionsClientImpl : public sync_sessions::SyncSessionsClient {
144 public: 183 public:
145 explicit SyncSessionsClientImpl(Profile* profile) : profile_(profile) { 184 explicit SyncSessionsClientImpl(Profile* profile) : profile_(profile) {
146 window_delegates_getter_.reset( 185 window_delegates_getter_.reset(
147 #if defined(OS_ANDROID) 186 #if defined(OS_ANDROID)
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 331
293 favicon::FaviconService* ChromeSyncClient::GetFaviconService() { 332 favicon::FaviconService* ChromeSyncClient::GetFaviconService() {
294 DCHECK_CURRENTLY_ON(BrowserThread::UI); 333 DCHECK_CURRENTLY_ON(BrowserThread::UI);
295 return FaviconServiceFactory::GetForProfile( 334 return FaviconServiceFactory::GetForProfile(
296 profile_, ServiceAccessType::IMPLICIT_ACCESS); 335 profile_, ServiceAccessType::IMPLICIT_ACCESS);
297 } 336 }
298 337
299 history::HistoryService* ChromeSyncClient::GetHistoryService() { 338 history::HistoryService* ChromeSyncClient::GetHistoryService() {
300 DCHECK_CURRENTLY_ON(BrowserThread::UI); 339 DCHECK_CURRENTLY_ON(BrowserThread::UI);
301 return HistoryServiceFactory::GetForProfile( 340 return HistoryServiceFactory::GetForProfile(
302 profile_, ServiceAccessType::EXPLICIT_ACCESS); 341 profile_, ServiceAccessType::IMPLICIT_ACCESS);
303 } 342 }
304 343
305 bool ChromeSyncClient::HasPasswordStore() { 344 bool ChromeSyncClient::HasPasswordStore() {
306 return password_store_ != nullptr; 345 return password_store_ != nullptr;
307 } 346 }
308 347
309 autofill::PersonalDataManager* ChromeSyncClient::GetPersonalDataManager() { 348 autofill::PersonalDataManager* ChromeSyncClient::GetPersonalDataManager() {
310 DCHECK_CURRENTLY_ON(BrowserThread::UI); 349 DCHECK_CURRENTLY_ON(BrowserThread::UI);
311 return autofill::PersonalDataManagerFactory::GetForProfile(profile_); 350 return autofill::PersonalDataManagerFactory::GetForProfile(profile_);
312 } 351 }
(...skipping 29 matching lines...) Expand all
342 381
343 scoped_refptr<syncer::ExtensionsActivity> 382 scoped_refptr<syncer::ExtensionsActivity>
344 ChromeSyncClient::GetExtensionsActivity() { 383 ChromeSyncClient::GetExtensionsActivity() {
345 return extensions_activity_monitor_.GetExtensionsActivity(); 384 return extensions_activity_monitor_.GetExtensionsActivity();
346 } 385 }
347 386
348 sync_sessions::SyncSessionsClient* ChromeSyncClient::GetSyncSessionsClient() { 387 sync_sessions::SyncSessionsClient* ChromeSyncClient::GetSyncSessionsClient() {
349 return sync_sessions_client_.get(); 388 return sync_sessions_client_.get();
350 } 389 }
351 390
352 base::WeakPtr<syncer::SyncableService> 391 ServiceProvider ChromeSyncClient::GetSyncableServiceForType(
353 ChromeSyncClient::GetSyncableServiceForType(syncer::ModelType type) { 392 syncer::ModelType type) {
393 DCHECK_CURRENTLY_ON(BrowserThread::UI);
354 if (!profile_) { // For tests. 394 if (!profile_) { // For tests.
355 return base::WeakPtr<syncer::SyncableService>(); 395 return WrapInProvider(nullptr);
356 } 396 }
357 switch (type) { 397 switch (type) {
358 case syncer::DEVICE_INFO: 398 case syncer::DEVICE_INFO:
359 return ProfileSyncServiceFactory::GetForProfile(profile_) 399 return WrapInProvider(ProfileSyncServiceFactory::GetForProfile(profile_)
360 ->GetDeviceInfoSyncableService() 400 ->GetDeviceInfoSyncableService());
361 ->AsWeakPtr();
362 case syncer::PREFERENCES: 401 case syncer::PREFERENCES:
363 return PrefServiceSyncableFromProfile(profile_)
364 ->GetSyncableService(syncer::PREFERENCES)
365 ->AsWeakPtr();
366 case syncer::PRIORITY_PREFERENCES: 402 case syncer::PRIORITY_PREFERENCES:
367 return PrefServiceSyncableFromProfile(profile_) 403 return WrapInProvider(
368 ->GetSyncableService(syncer::PRIORITY_PREFERENCES) 404 PrefServiceSyncableFromProfile(profile_)->GetSyncableService(type));
369 ->AsWeakPtr();
370 case syncer::AUTOFILL: 405 case syncer::AUTOFILL:
371 case syncer::AUTOFILL_PROFILE: 406 case syncer::AUTOFILL_PROFILE:
372 case syncer::AUTOFILL_WALLET_DATA: 407 case syncer::AUTOFILL_WALLET_DATA:
373 case syncer::AUTOFILL_WALLET_METADATA: { 408 case syncer::AUTOFILL_WALLET_METADATA: {
374 if (!web_data_service_) 409 if (!web_data_service_) {
375 return base::WeakPtr<syncer::SyncableService>(); 410 return WrapInProvider(nullptr);
376 if (type == syncer::AUTOFILL) { 411 } else if (type == syncer::AUTOFILL) {
377 return autofill::AutocompleteSyncableService::FromWebDataService( 412 return WrapInWeakPtrCallback(
378 web_data_service_.get())->AsWeakPtr(); 413 base::Bind(&AutocompleteSyncableService::FromWebDataService,
414 base::RetainedRef(web_data_service_)));
379 } else if (type == syncer::AUTOFILL_PROFILE) { 415 } else if (type == syncer::AUTOFILL_PROFILE) {
380 return autofill::AutofillProfileSyncableService::FromWebDataService( 416 return WrapInWeakPtrCallback(
381 web_data_service_.get())->AsWeakPtr(); 417 base::Bind(&AutofillProfileSyncableService::FromWebDataService,
418 base::RetainedRef(web_data_service_)));
382 } else if (type == syncer::AUTOFILL_WALLET_METADATA) { 419 } else if (type == syncer::AUTOFILL_WALLET_METADATA) {
383 return autofill::AutofillWalletMetadataSyncableService:: 420 return WrapInWeakPtrCallback(base::Bind(
384 FromWebDataService(web_data_service_.get())->AsWeakPtr(); 421 &AutofillWalletMetadataSyncableService::FromWebDataService,
422 base::RetainedRef(web_data_service_)));
423 } else {
424 return WrapInWeakPtrCallback(
425 base::Bind(&AutofillWalletSyncableService::FromWebDataService,
426 base::RetainedRef(web_data_service_)));
385 } 427 }
386 return autofill::AutofillWalletSyncableService::FromWebDataService(
387 web_data_service_.get())->AsWeakPtr();
388 } 428 }
389 case syncer::SEARCH_ENGINES: 429 case syncer::SEARCH_ENGINES:
390 return TemplateURLServiceFactory::GetForProfile(profile_)->AsWeakPtr(); 430 return WrapInProvider(TemplateURLServiceFactory::GetForProfile(profile_));
391 #if BUILDFLAG(ENABLE_EXTENSIONS) 431 #if BUILDFLAG(ENABLE_EXTENSIONS)
392 case syncer::APPS: 432 case syncer::APPS:
393 case syncer::EXTENSIONS: 433 case syncer::EXTENSIONS:
394 return ExtensionSyncService::Get(profile_)->AsWeakPtr(); 434 return WrapInProvider(ExtensionSyncService::Get(profile_));
395 case syncer::APP_SETTINGS: 435 case syncer::APP_SETTINGS:
396 case syncer::EXTENSION_SETTINGS: 436 case syncer::EXTENSION_SETTINGS:
397 return extensions::settings_sync_util::GetSyncableService(profile_, type) 437 return extensions::settings_sync_util::GetSyncableServiceProvider(
398 ->AsWeakPtr(); 438 profile_, type);
399 #endif 439 #endif
400 #if BUILDFLAG(ENABLE_APP_LIST) 440 #if BUILDFLAG(ENABLE_APP_LIST)
401 case syncer::APP_LIST: 441 case syncer::APP_LIST:
402 return app_list::AppListSyncableServiceFactory::GetForProfile(profile_)-> 442 return WrapInProvider(
403 AsWeakPtr(); 443 app_list::AppListSyncableServiceFactory::GetForProfile(profile_));
404 #endif 444 #endif
405 #if !defined(OS_ANDROID) 445 #if !defined(OS_ANDROID)
406 case syncer::THEMES: 446 case syncer::THEMES:
407 return ThemeServiceFactory::GetForProfile(profile_)-> 447 return WrapInProvider(ThemeServiceFactory::GetForProfile(profile_)
408 GetThemeSyncableService()->AsWeakPtr(); 448 ->GetThemeSyncableService());
409 #endif 449 #endif
410 case syncer::HISTORY_DELETE_DIRECTIVES: { 450 case syncer::HISTORY_DELETE_DIRECTIVES:
451 return WrapInProvider(GetHistoryService());
452 case syncer::TYPED_URLS: {
411 history::HistoryService* history = GetHistoryService(); 453 history::HistoryService* history = GetHistoryService();
412 return history ? history->AsWeakPtr() 454 return WrapInProvider(history ? history->GetTypedUrlSyncableService()
413 : base::WeakPtr<history::HistoryService>(); 455 : nullptr);
414 }
415 case syncer::TYPED_URLS: {
416 // We request history service with explicit access here because this
417 // codepath is executed on backend thread while HistoryServiceFactory
418 // checks preference value in implicit mode and PrefService expectes calls
419 // only from UI thread.
420 history::HistoryService* history = HistoryServiceFactory::GetForProfile(
421 profile_, ServiceAccessType::EXPLICIT_ACCESS);
422 if (!history)
423 return base::WeakPtr<history::TypedUrlSyncableService>();
424 return history->GetTypedUrlSyncableService()->AsWeakPtr();
425 } 456 }
426 #if BUILDFLAG(ENABLE_SPELLCHECK) 457 #if BUILDFLAG(ENABLE_SPELLCHECK)
427 case syncer::DICTIONARY: 458 case syncer::DICTIONARY:
428 return SpellcheckServiceFactory::GetForContext(profile_)-> 459 return WrapInProvider(SpellcheckServiceFactory::GetForContext(profile_)
429 GetCustomDictionary()->AsWeakPtr(); 460 ->GetCustomDictionary());
430 #endif 461 #endif
431 case syncer::FAVICON_IMAGES: 462 case syncer::FAVICON_IMAGES:
432 case syncer::FAVICON_TRACKING: { 463 case syncer::FAVICON_TRACKING:
433 sync_sessions::FaviconCache* favicons = 464 return WrapInProvider(ProfileSyncServiceFactory::GetForProfile(profile_)
434 ProfileSyncServiceFactory::GetForProfile(profile_)->GetFaviconCache(); 465 ->GetFaviconCache());
435 return favicons ? favicons->AsWeakPtr()
436 : base::WeakPtr<syncer::SyncableService>();
437 }
438 #if BUILDFLAG(ENABLE_SUPERVISED_USERS) 466 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
439 case syncer::SUPERVISED_USER_SETTINGS: 467 case syncer::SUPERVISED_USER_SETTINGS:
440 return SupervisedUserSettingsServiceFactory::GetForProfile(profile_)-> 468 return WrapInProvider(
441 AsWeakPtr(); 469 SupervisedUserSettingsServiceFactory::GetForProfile(profile_));
442 #if !defined(OS_ANDROID) 470 #if !defined(OS_ANDROID)
443 case syncer::SUPERVISED_USERS: 471 case syncer::SUPERVISED_USERS:
444 return SupervisedUserSyncServiceFactory::GetForProfile(profile_)-> 472 return WrapInProvider(
445 AsWeakPtr(); 473 SupervisedUserSyncServiceFactory::GetForProfile(profile_));
446 case syncer::SUPERVISED_USER_SHARED_SETTINGS: 474 case syncer::SUPERVISED_USER_SHARED_SETTINGS:
447 return SupervisedUserSharedSettingsServiceFactory::GetForBrowserContext( 475 return WrapInProvider(
448 profile_)->AsWeakPtr(); 476 SupervisedUserSharedSettingsServiceFactory::GetForBrowserContext(
477 profile_));
449 #endif 478 #endif
450 case syncer::SUPERVISED_USER_WHITELISTS: 479 case syncer::SUPERVISED_USER_WHITELISTS:
451 return SupervisedUserServiceFactory::GetForProfile(profile_) 480 return WrapInProvider(
452 ->GetWhitelistService() 481 SupervisedUserServiceFactory::GetForProfile(profile_)
453 ->AsWeakPtr(); 482 ->GetWhitelistService());
454 #endif 483 #endif
455 case syncer::ARTICLES: { 484 case syncer::ARTICLES: {
456 dom_distiller::DomDistillerService* service = 485 dom_distiller::DomDistillerService* distiller =
pavely 2017/03/27 19:38:25 nit: distiller => distiller_service?
skym 2017/03/27 21:45:26 Done.
457 dom_distiller::DomDistillerServiceFactory::GetForBrowserContext( 486 dom_distiller::DomDistillerServiceFactory::GetForBrowserContext(
458 profile_); 487 profile_);
459 if (service) 488 return WrapInProvider(distiller ? distiller->GetSyncableService()
460 return service->GetSyncableService()->AsWeakPtr(); 489 : nullptr);
461 return base::WeakPtr<syncer::SyncableService>();
462 } 490 }
463 case syncer::SESSIONS: { 491 case syncer::SESSIONS:
464 return ProfileSyncServiceFactory::GetForProfile(profile_)-> 492 return WrapInProvider(ProfileSyncServiceFactory::GetForProfile(profile_)
465 GetSessionsSyncableService()->AsWeakPtr(); 493 ->GetSessionsSyncableService());
466 } 494 case syncer::PASSWORDS:
467 case syncer::PASSWORDS: {
468 return password_store_.get() 495 return password_store_.get()
469 ? password_store_->GetPasswordSyncableService() 496 ? base::Bind(&password_manager::PasswordStore::
470 : base::WeakPtr<syncer::SyncableService>(); 497 GetPasswordSyncableService,
471 } 498 base::RetainedRef(password_store_))
499 : WrapInProvider(nullptr);
472 #if defined(OS_CHROMEOS) 500 #if defined(OS_CHROMEOS)
473 case syncer::WIFI_CREDENTIALS: 501 case syncer::WIFI_CREDENTIALS:
474 return sync_wifi::WifiCredentialSyncableServiceFactory:: 502 return WrapInProvider(
475 GetForBrowserContext(profile_) 503 sync_wifi::WifiCredentialSyncableServiceFactory::GetForBrowserContext(
476 ->AsWeakPtr(); 504 profile_));
477 case syncer::ARC_PACKAGE: 505 case syncer::ARC_PACKAGE:
478 return arc::ArcPackageSyncableService::Get(profile_)->AsWeakPtr(); 506 return WrapInProvider(arc::ArcPackageSyncableService::Get(profile_));
479 #endif 507 #endif
480 default: 508 default:
481 // The following datatypes still need to be transitioned to the 509 // The following datatypes still need to be transitioned to the
482 // syncer::SyncableService API: 510 // syncer::SyncableService API:
483 // Bookmarks 511 // Bookmarks
484 NOTREACHED(); 512 NOTREACHED();
485 return base::WeakPtr<syncer::SyncableService>(); 513 return WrapInProvider(nullptr);
486 } 514 }
487 } 515 }
488 516
489 base::WeakPtr<syncer::ModelTypeSyncBridge> 517 WeakPtr<syncer::ModelTypeSyncBridge>
490 ChromeSyncClient::GetSyncBridgeForModelType(syncer::ModelType type) { 518 ChromeSyncClient::GetSyncBridgeForModelType(syncer::ModelType type) {
491 switch (type) { 519 switch (type) {
492 case syncer::DEVICE_INFO: 520 case syncer::DEVICE_INFO:
493 return ProfileSyncServiceFactory::GetForProfile(profile_) 521 return ProfileSyncServiceFactory::GetForProfile(profile_)
494 ->GetDeviceInfoSyncBridge() 522 ->GetDeviceInfoSyncBridge()
495 ->AsWeakPtr(); 523 ->AsWeakPtr();
496 case syncer::READING_LIST: 524 case syncer::READING_LIST:
497 // Reading List is only supported on iOS at the moment. 525 // Reading List is only supported on iOS at the moment.
498 NOTREACHED(); 526 NOTREACHED();
499 return base::WeakPtr<syncer::ModelTypeSyncBridge>(); 527 return WeakPtr<syncer::ModelTypeSyncBridge>();
500 case syncer::AUTOFILL: 528 case syncer::AUTOFILL:
501 return autofill::AutocompleteSyncBridge::FromWebDataService( 529 return autofill::AutocompleteSyncBridge::FromWebDataService(
502 web_data_service_.get()); 530 web_data_service_.get());
503 #if defined(OS_CHROMEOS) 531 #if defined(OS_CHROMEOS)
504 case syncer::PRINTERS: 532 case syncer::PRINTERS:
505 return chromeos::PrintersManagerFactory::GetForBrowserContext(profile_) 533 return chromeos::PrintersManagerFactory::GetForBrowserContext(profile_)
506 ->GetSyncBridge() 534 ->GetSyncBridge()
507 ->AsWeakPtr(); 535 ->AsWeakPtr();
508 #endif 536 #endif
509 default: 537 default:
510 NOTREACHED(); 538 NOTREACHED();
511 return base::WeakPtr<syncer::ModelTypeSyncBridge>(); 539 return WeakPtr<syncer::ModelTypeSyncBridge>();
512 } 540 }
513 } 541 }
514 542
515 scoped_refptr<syncer::ModelSafeWorker> 543 scoped_refptr<syncer::ModelSafeWorker>
516 ChromeSyncClient::CreateModelWorkerForGroup(syncer::ModelSafeGroup group) { 544 ChromeSyncClient::CreateModelWorkerForGroup(syncer::ModelSafeGroup group) {
517 DCHECK_CURRENTLY_ON(BrowserThread::UI); 545 DCHECK_CURRENTLY_ON(BrowserThread::UI);
518 switch (group) { 546 switch (group) {
519 case syncer::GROUP_DB: 547 case syncer::GROUP_DB:
520 return new syncer::BrowserThreadModelWorker( 548 return new syncer::BrowserThreadModelWorker(
521 BrowserThread::GetTaskRunnerForThread(BrowserThread::DB), 549 BrowserThread::GetTaskRunnerForThread(BrowserThread::DB),
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 sync_service->RegisterDataTypeController( 730 sync_service->RegisterDataTypeController(
703 base::MakeUnique<SupervisedUserSyncDataTypeController>( 731 base::MakeUnique<SupervisedUserSyncDataTypeController>(
704 syncer::SUPERVISED_USER_SETTINGS, error_callback, this, profile_)); 732 syncer::SUPERVISED_USER_SETTINGS, error_callback, this, profile_));
705 sync_service->RegisterDataTypeController( 733 sync_service->RegisterDataTypeController(
706 base::MakeUnique<SupervisedUserSyncDataTypeController>( 734 base::MakeUnique<SupervisedUserSyncDataTypeController>(
707 syncer::SUPERVISED_USER_WHITELISTS, error_callback, this, profile_)); 735 syncer::SUPERVISED_USER_WHITELISTS, error_callback, this, profile_));
708 #endif 736 #endif
709 } 737 }
710 738
711 } // namespace browser_sync 739 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698