| Index: chrome/browser/sync/chrome_sync_client.cc
 | 
| diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
 | 
| index 6669f37510fc8c7d1c91e4172bf2cb86c55ed79a..dfd6a4b7757b11dc19ca7e21cfa96ed100b806ed 100644
 | 
| --- a/chrome/browser/sync/chrome_sync_client.cc
 | 
| +++ b/chrome/browser/sync/chrome_sync_client.cc
 | 
| @@ -120,75 +120,21 @@
 | 
|  #include "components/sync_wifi/wifi_credential_syncable_service_factory.h"
 | 
|  #endif  // defined(OS_CHROMEOS)
 | 
|  
 | 
| -using base::Callback;
 | 
| -using base::WeakPtr;
 | 
| +using content::BrowserThread;
 | 
|  #if BUILDFLAG(ENABLE_EXTENSIONS)
 | 
|  using browser_sync::ExtensionDataTypeController;
 | 
|  using browser_sync::ExtensionSettingDataTypeController;
 | 
|  #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 | 
|  using browser_sync::SearchEngineDataTypeController;
 | 
| -using content::BrowserThread;
 | 
|  using syncer::AsyncDirectoryTypeController;
 | 
| -using syncer::SyncableService;
 | 
| -
 | 
| -using ServiceProvider = syncer::SyncClient::ServiceProvider;
 | 
|  
 | 
|  namespace browser_sync {
 | 
|  
 | 
|  namespace {
 | 
| -
 | 
|  #if defined(OS_WIN)
 | 
|  const base::FilePath::CharType kLoopbackServerBackendFilename[] =
 | 
|      FILE_PATH_LITERAL("profile.pb");
 | 
|  #endif  // defined(OS_WIN)
 | 
| -
 | 
| -// The following are a set of functions to facilitate returning SyncableServices
 | 
| -// and SyncBridges. Non-UI model types sometimes have difficulties providing a
 | 
| -// WeakPtr to their integration object on the UI thread. By instead returning a
 | 
| -// Callback we are able to give model types a little bit of flexibility.
 | 
| -
 | 
| -// The preferred and simpler approach is to to retrieve your corresponding
 | 
| -// WeakPtr on the UI thread, which is where GetSyncableServiceForType() and
 | 
| -// GetSyncBridgeForModelType() are invoked. A simple Callback that just captures
 | 
| -// the WeakPtr can easy be returned. Trampoline() is all that's really required
 | 
| -// for this, with WrapInCallback() and WrapInProvider() adding syntactic sugar.
 | 
| -// All UI thread model types should be able to follow this pattern.
 | 
| -
 | 
| -// The other approach is capturing an intermediate thread safe object that is
 | 
| -// subsequently used on the model thread. Most model types that follow this
 | 
| -// pattern do things a little bit uniquely, but a common problem is not having
 | 
| -// a method that's going to return exactly the right type. For example, needing
 | 
| -// to up-cast or grab a WeakPtr after the model type specific functions are run
 | 
| -// in a Callback.
 | 
| -
 | 
| -template <typename T>
 | 
| -T Trampoline(T arg) {
 | 
| -  return arg;
 | 
| -}
 | 
| -
 | 
| -template <typename T>
 | 
| -Callback<T()> WrapInCallback(T arg) {
 | 
| -  return base::Bind(&Trampoline<T>, arg);
 | 
| -}
 | 
| -
 | 
| -WeakPtr<SyncableService> ServiceAsWeakPtr(SyncableService* ptr) {
 | 
| -  return ptr ? ptr->AsWeakPtr() : WeakPtr<SyncableService>();
 | 
| -}
 | 
| -
 | 
| -ServiceProvider WrapInProvider(SyncableService* service) {
 | 
| -  return WrapInCallback(ServiceAsWeakPtr(service));
 | 
| -}
 | 
| -
 | 
| -template <typename T>
 | 
| -WeakPtr<SyncableService> CallbackResultAsWeakPtr(Callback<T()> callback) {
 | 
| -  return ServiceAsWeakPtr(callback.Run());
 | 
| -}
 | 
| -
 | 
| -template <typename T>
 | 
| -ServiceProvider WrapInWeakPtrCallback(Callback<T()> callback) {
 | 
| -  return base::Bind(&CallbackResultAsWeakPtr<T>, callback);
 | 
| -}
 | 
| -
 | 
|  }  // namespace
 | 
|  
 | 
|  // Chrome implementation of SyncSessionsClient. Needs to be in a separate class
 | 
| @@ -353,7 +299,7 @@
 | 
|  history::HistoryService* ChromeSyncClient::GetHistoryService() {
 | 
|    DCHECK_CURRENTLY_ON(BrowserThread::UI);
 | 
|    return HistoryServiceFactory::GetForProfile(
 | 
| -      profile_, ServiceAccessType::IMPLICIT_ACCESS);
 | 
| +      profile_, ServiceAccessType::EXPLICIT_ACCESS);
 | 
|  }
 | 
|  
 | 
|  bool ChromeSyncClient::HasPasswordStore() {
 | 
| @@ -376,7 +322,7 @@
 | 
|    return base::Bind(
 | 
|  #if defined(OS_ANDROID)
 | 
|        &ChromeSyncClient::RegisterAndroidDataTypes,
 | 
| -#else  // defined(OS_ANDROID)
 | 
| +#else
 | 
|        &ChromeSyncClient::RegisterDesktopDataTypes,
 | 
|  #endif  // defined(OS_ANDROID)
 | 
|        weak_ptr_factory_.GetWeakPtr());
 | 
| @@ -403,135 +349,144 @@
 | 
|    return sync_sessions_client_.get();
 | 
|  }
 | 
|  
 | 
| -ServiceProvider ChromeSyncClient::GetSyncableServiceForType(
 | 
| -    syncer::ModelType type) {
 | 
| -  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 | 
| +base::WeakPtr<syncer::SyncableService>
 | 
| +ChromeSyncClient::GetSyncableServiceForType(syncer::ModelType type) {
 | 
|    if (!profile_) {  // For tests.
 | 
| -    return WrapInProvider(nullptr);
 | 
| +     return base::WeakPtr<syncer::SyncableService>();
 | 
|    }
 | 
|    switch (type) {
 | 
|      case syncer::DEVICE_INFO:
 | 
| -      return WrapInProvider(ProfileSyncServiceFactory::GetForProfile(profile_)
 | 
| -                                ->GetDeviceInfoSyncableService());
 | 
| +      return ProfileSyncServiceFactory::GetForProfile(profile_)
 | 
| +          ->GetDeviceInfoSyncableService()
 | 
| +          ->AsWeakPtr();
 | 
|      case syncer::PREFERENCES:
 | 
| +      return PrefServiceSyncableFromProfile(profile_)
 | 
| +          ->GetSyncableService(syncer::PREFERENCES)
 | 
| +          ->AsWeakPtr();
 | 
|      case syncer::PRIORITY_PREFERENCES:
 | 
| -      return WrapInProvider(
 | 
| -          PrefServiceSyncableFromProfile(profile_)->GetSyncableService(type));
 | 
| +      return PrefServiceSyncableFromProfile(profile_)
 | 
| +          ->GetSyncableService(syncer::PRIORITY_PREFERENCES)
 | 
| +          ->AsWeakPtr();
 | 
|      case syncer::AUTOFILL:
 | 
|      case syncer::AUTOFILL_PROFILE:
 | 
|      case syncer::AUTOFILL_WALLET_DATA:
 | 
|      case syncer::AUTOFILL_WALLET_METADATA: {
 | 
| -      if (!web_data_service_) {
 | 
| -        return WrapInProvider(nullptr);
 | 
| -      } else if (type == syncer::AUTOFILL) {
 | 
| -        return WrapInWeakPtrCallback(base::Bind(
 | 
| -            &autofill::AutocompleteSyncableService::FromWebDataService,
 | 
| -            base::RetainedRef(web_data_service_)));
 | 
| +      if (!web_data_service_)
 | 
| +        return base::WeakPtr<syncer::SyncableService>();
 | 
| +      if (type == syncer::AUTOFILL) {
 | 
| +        return autofill::AutocompleteSyncableService::FromWebDataService(
 | 
| +            web_data_service_.get())->AsWeakPtr();
 | 
|        } else if (type == syncer::AUTOFILL_PROFILE) {
 | 
| -        return WrapInWeakPtrCallback(base::Bind(
 | 
| -            &autofill::AutofillProfileSyncableService::FromWebDataService,
 | 
| -            base::RetainedRef(web_data_service_)));
 | 
| +        return autofill::AutofillProfileSyncableService::FromWebDataService(
 | 
| +            web_data_service_.get())->AsWeakPtr();
 | 
|        } else if (type == syncer::AUTOFILL_WALLET_METADATA) {
 | 
| -        return WrapInWeakPtrCallback(
 | 
| -            base::Bind(&autofill::AutofillWalletMetadataSyncableService::
 | 
| -                           FromWebDataService,
 | 
| -                       base::RetainedRef(web_data_service_)));
 | 
| -      } else {
 | 
| -        return WrapInWeakPtrCallback(base::Bind(
 | 
| -            &autofill::AutofillWalletSyncableService::FromWebDataService,
 | 
| -            base::RetainedRef(web_data_service_)));
 | 
| +        return autofill::AutofillWalletMetadataSyncableService::
 | 
| +            FromWebDataService(web_data_service_.get())->AsWeakPtr();
 | 
|        }
 | 
| +      return autofill::AutofillWalletSyncableService::FromWebDataService(
 | 
| +          web_data_service_.get())->AsWeakPtr();
 | 
|      }
 | 
|      case syncer::SEARCH_ENGINES:
 | 
| -      return WrapInProvider(TemplateURLServiceFactory::GetForProfile(profile_));
 | 
| +      return TemplateURLServiceFactory::GetForProfile(profile_)->AsWeakPtr();
 | 
|  #if BUILDFLAG(ENABLE_EXTENSIONS)
 | 
|      case syncer::APPS:
 | 
|      case syncer::EXTENSIONS:
 | 
| -      return WrapInProvider(ExtensionSyncService::Get(profile_));
 | 
| +      return ExtensionSyncService::Get(profile_)->AsWeakPtr();
 | 
|      case syncer::APP_SETTINGS:
 | 
|      case syncer::EXTENSION_SETTINGS:
 | 
| -      return extensions::settings_sync_util::GetSyncableServiceProvider(
 | 
| -          profile_, type);
 | 
| +      return extensions::settings_sync_util::GetSyncableService(profile_, type)
 | 
| +          ->AsWeakPtr();
 | 
|  #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 | 
|  #if BUILDFLAG(ENABLE_APP_LIST)
 | 
|      case syncer::APP_LIST:
 | 
| -      return WrapInProvider(
 | 
| -          app_list::AppListSyncableServiceFactory::GetForProfile(profile_));
 | 
| +      return app_list::AppListSyncableServiceFactory::GetForProfile(profile_)->
 | 
| +          AsWeakPtr();
 | 
|  #endif  // BUILDFLAG(ENABLE_APP_LIST)
 | 
|  #if !defined(OS_ANDROID)
 | 
|      case syncer::THEMES:
 | 
| -      return WrapInProvider(ThemeServiceFactory::GetForProfile(profile_)
 | 
| -                                ->GetThemeSyncableService());
 | 
| +      return ThemeServiceFactory::GetForProfile(profile_)->
 | 
| +          GetThemeSyncableService()->AsWeakPtr();
 | 
|  #endif  // !defined(OS_ANDROID)
 | 
| -    case syncer::HISTORY_DELETE_DIRECTIVES:
 | 
| -      return WrapInProvider(GetHistoryService());
 | 
| +    case syncer::HISTORY_DELETE_DIRECTIVES: {
 | 
| +      history::HistoryService* history = GetHistoryService();
 | 
| +      return history ? history->AsWeakPtr()
 | 
| +                     : base::WeakPtr<history::HistoryService>();
 | 
| +    }
 | 
|      case syncer::TYPED_URLS: {
 | 
| -      history::HistoryService* history = GetHistoryService();
 | 
| -      return WrapInProvider(history ? history->GetTypedUrlSyncableService()
 | 
| -                                    : nullptr);
 | 
| +      // We request history service with explicit access here because this
 | 
| +      // codepath is executed on backend thread while HistoryServiceFactory
 | 
| +      // checks preference value in implicit mode and PrefService expectes calls
 | 
| +      // only from UI thread.
 | 
| +      history::HistoryService* history = HistoryServiceFactory::GetForProfile(
 | 
| +          profile_, ServiceAccessType::EXPLICIT_ACCESS);
 | 
| +      if (!history)
 | 
| +        return base::WeakPtr<history::TypedUrlSyncableService>();
 | 
| +      return history->GetTypedUrlSyncableService()->AsWeakPtr();
 | 
|      }
 | 
|  #if BUILDFLAG(ENABLE_SPELLCHECK)
 | 
|      case syncer::DICTIONARY:
 | 
| -      return WrapInProvider(SpellcheckServiceFactory::GetForContext(profile_)
 | 
| -                                ->GetCustomDictionary());
 | 
| +      return SpellcheckServiceFactory::GetForContext(profile_)->
 | 
| +          GetCustomDictionary()->AsWeakPtr();
 | 
|  #endif  // BUILDFLAG(ENABLE_SPELLCHECK)
 | 
|      case syncer::FAVICON_IMAGES:
 | 
| -    case syncer::FAVICON_TRACKING:
 | 
| -      return WrapInProvider(ProfileSyncServiceFactory::GetForProfile(profile_)
 | 
| -                                ->GetFaviconCache());
 | 
| +    case syncer::FAVICON_TRACKING: {
 | 
| +      sync_sessions::FaviconCache* favicons =
 | 
| +          ProfileSyncServiceFactory::GetForProfile(profile_)->GetFaviconCache();
 | 
| +      return favicons ? favicons->AsWeakPtr()
 | 
| +                      : base::WeakPtr<syncer::SyncableService>();
 | 
| +    }
 | 
|  #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
 | 
|      case syncer::SUPERVISED_USER_SETTINGS:
 | 
| -      return WrapInProvider(
 | 
| -          SupervisedUserSettingsServiceFactory::GetForProfile(profile_));
 | 
| +      return SupervisedUserSettingsServiceFactory::GetForProfile(profile_)->
 | 
| +          AsWeakPtr();
 | 
|  #if !defined(OS_ANDROID)
 | 
|      case syncer::SUPERVISED_USERS:
 | 
| -      return WrapInProvider(
 | 
| -          SupervisedUserSyncServiceFactory::GetForProfile(profile_));
 | 
| +      return SupervisedUserSyncServiceFactory::GetForProfile(profile_)->
 | 
| +          AsWeakPtr();
 | 
|      case syncer::SUPERVISED_USER_SHARED_SETTINGS:
 | 
| -      return WrapInProvider(
 | 
| -          SupervisedUserSharedSettingsServiceFactory::GetForBrowserContext(
 | 
| -              profile_));
 | 
| +      return SupervisedUserSharedSettingsServiceFactory::GetForBrowserContext(
 | 
| +          profile_)->AsWeakPtr();
 | 
|  #endif  // !defined(OS_ANDROID)
 | 
|      case syncer::SUPERVISED_USER_WHITELISTS:
 | 
| -      return WrapInProvider(
 | 
| -          SupervisedUserServiceFactory::GetForProfile(profile_)
 | 
| -              ->GetWhitelistService());
 | 
| +      return SupervisedUserServiceFactory::GetForProfile(profile_)
 | 
| +          ->GetWhitelistService()
 | 
| +          ->AsWeakPtr();
 | 
|  #endif  // BUILDFLAG(ENABLE_SUPERVISED_USERS)
 | 
|      case syncer::ARTICLES: {
 | 
| -      dom_distiller::DomDistillerService* distiller_service =
 | 
| +      dom_distiller::DomDistillerService* service =
 | 
|            dom_distiller::DomDistillerServiceFactory::GetForBrowserContext(
 | 
|                profile_);
 | 
| -      return WrapInProvider(distiller_service
 | 
| -                                ? distiller_service->GetSyncableService()
 | 
| -                                : nullptr);
 | 
| -    }
 | 
| -    case syncer::SESSIONS:
 | 
| -      return WrapInProvider(ProfileSyncServiceFactory::GetForProfile(profile_)
 | 
| -                                ->GetSessionsSyncableService());
 | 
| -    case syncer::PASSWORDS:
 | 
| +      if (service)
 | 
| +        return service->GetSyncableService()->AsWeakPtr();
 | 
| +      return base::WeakPtr<syncer::SyncableService>();
 | 
| +    }
 | 
| +    case syncer::SESSIONS: {
 | 
| +      return ProfileSyncServiceFactory::GetForProfile(profile_)->
 | 
| +          GetSessionsSyncableService()->AsWeakPtr();
 | 
| +    }
 | 
| +    case syncer::PASSWORDS: {
 | 
|        return password_store_.get()
 | 
| -                 ? base::Bind(&password_manager::PasswordStore::
 | 
| -                                  GetPasswordSyncableService,
 | 
| -                              base::RetainedRef(password_store_))
 | 
| -                 : WrapInProvider(nullptr);
 | 
| +                 ? password_store_->GetPasswordSyncableService()
 | 
| +                 : base::WeakPtr<syncer::SyncableService>();
 | 
| +    }
 | 
|  #if defined(OS_CHROMEOS)
 | 
|      case syncer::WIFI_CREDENTIALS:
 | 
| -      return WrapInProvider(
 | 
| -          sync_wifi::WifiCredentialSyncableServiceFactory::GetForBrowserContext(
 | 
| -              profile_));
 | 
| +      return sync_wifi::WifiCredentialSyncableServiceFactory::
 | 
| +          GetForBrowserContext(profile_)
 | 
| +              ->AsWeakPtr();
 | 
|      case syncer::ARC_PACKAGE:
 | 
| -      return WrapInProvider(arc::ArcPackageSyncableService::Get(profile_));
 | 
| +      return arc::ArcPackageSyncableService::Get(profile_)->AsWeakPtr();
 | 
|  #endif  // defined(OS_CHROMEOS)
 | 
|      default:
 | 
|        // The following datatypes still need to be transitioned to the
 | 
|        // syncer::SyncableService API:
 | 
|        // Bookmarks
 | 
|        NOTREACHED();
 | 
| -      return WrapInProvider(nullptr);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -WeakPtr<syncer::ModelTypeSyncBridge>
 | 
| +      return base::WeakPtr<syncer::SyncableService>();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +base::WeakPtr<syncer::ModelTypeSyncBridge>
 | 
|  ChromeSyncClient::GetSyncBridgeForModelType(syncer::ModelType type) {
 | 
|    switch (type) {
 | 
|      case syncer::DEVICE_INFO:
 | 
| @@ -541,7 +496,7 @@
 | 
|      case syncer::READING_LIST:
 | 
|        // Reading List is only supported on iOS at the moment.
 | 
|        NOTREACHED();
 | 
| -      return WeakPtr<syncer::ModelTypeSyncBridge>();
 | 
| +      return base::WeakPtr<syncer::ModelTypeSyncBridge>();
 | 
|      case syncer::AUTOFILL:
 | 
|        return autofill::AutocompleteSyncBridge::FromWebDataService(
 | 
|            web_data_service_.get());
 | 
| @@ -553,7 +508,7 @@
 | 
|  #endif  // defined(OS_CHROMEOS)
 | 
|      default:
 | 
|        NOTREACHED();
 | 
| -      return WeakPtr<syncer::ModelTypeSyncBridge>();
 | 
| +      return base::WeakPtr<syncer::ModelTypeSyncBridge>();
 | 
|    }
 | 
|  }
 | 
|  
 | 
| 
 |