| Index: ios/chrome/browser/sync/ios_chrome_sync_client.mm
 | 
| diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
 | 
| index 7309de7c4f8c9d76a0452ae7f3ea4de60ace94c7..0a61212fbd82bb293e4ff6f5903cbff556298840 100644
 | 
| --- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm
 | 
| +++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
 | 
| @@ -69,45 +69,7 @@
 | 
|  #error "This file requires ARC support."
 | 
|  #endif
 | 
|  
 | 
| -using autofill::AutocompleteSyncableService;
 | 
| -using autofill::AutofillProfileSyncableService;
 | 
| -using autofill::AutofillWalletMetadataSyncableService;
 | 
| -using autofill::AutofillWalletSyncableService;
 | 
| -using base::Callback;
 | 
| -using base::WeakPtr;
 | 
| -using syncer::SyncableService;
 | 
| -
 | 
| -using ServiceProvider = syncer::SyncClient::ServiceProvider;
 | 
| -
 | 
|  namespace {
 | 
| -
 | 
| -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);
 | 
| -}
 | 
|  
 | 
|  // iOS implementation of SyncSessionsClient. Needs to be in a separate class
 | 
|  // due to possible multiple inheritance issues, wherein IOSChromeSyncClient
 | 
| @@ -300,78 +262,87 @@
 | 
|    return sync_sessions_client_.get();
 | 
|  }
 | 
|  
 | 
| -ServiceProvider IOSChromeSyncClient::GetSyncableServiceForType(
 | 
| -    syncer::ModelType type) {
 | 
| +base::WeakPtr<syncer::SyncableService>
 | 
| +IOSChromeSyncClient::GetSyncableServiceForType(syncer::ModelType type) {
 | 
|    switch (type) {
 | 
|      case syncer::DEVICE_INFO:
 | 
| -      return WrapInProvider(
 | 
| -          IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state_)
 | 
| -              ->GetDeviceInfoSyncableService());
 | 
| +      return IOSChromeProfileSyncServiceFactory::GetForBrowserState(
 | 
| +                 browser_state_)
 | 
| +          ->GetDeviceInfoSyncableService()
 | 
| +          ->AsWeakPtr();
 | 
|      case syncer::PREFERENCES:
 | 
| +      return browser_state_->GetSyncablePrefs()
 | 
| +          ->GetSyncableService(syncer::PREFERENCES)
 | 
| +          ->AsWeakPtr();
 | 
|      case syncer::PRIORITY_PREFERENCES:
 | 
| -      return WrapInProvider(
 | 
| -          browser_state_->GetSyncablePrefs()->GetSyncableService(type));
 | 
| +      return browser_state_->GetSyncablePrefs()
 | 
| +          ->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);
 | 
| +        return base::WeakPtr<syncer::SyncableService>();
 | 
|        if (type == syncer::AUTOFILL) {
 | 
| -        return WrapInWeakPtrCallback(
 | 
| -            base::Bind(&AutocompleteSyncableService::FromWebDataService,
 | 
| -                       base::RetainedRef(web_data_service_)));
 | 
| +        return autofill::AutocompleteSyncableService::FromWebDataService(
 | 
| +                   web_data_service_.get())
 | 
| +            ->AsWeakPtr();
 | 
|        } else if (type == syncer::AUTOFILL_PROFILE) {
 | 
| -        return WrapInWeakPtrCallback(
 | 
| -            base::Bind(&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(
 | 
| -            &AutofillWalletMetadataSyncableService::FromWebDataService,
 | 
| -            base::RetainedRef(web_data_service_)));
 | 
| +        return autofill::AutofillWalletMetadataSyncableService::
 | 
| +            FromWebDataService(web_data_service_.get())
 | 
| +                ->AsWeakPtr();
 | 
|        }
 | 
| -      return WrapInWeakPtrCallback(
 | 
| -          base::Bind(&AutofillWalletSyncableService::FromWebDataService,
 | 
| -                     base::RetainedRef(web_data_service_)));
 | 
| +      return autofill::AutofillWalletSyncableService::FromWebDataService(
 | 
| +                 web_data_service_.get())
 | 
| +          ->AsWeakPtr();
 | 
|      }
 | 
|      case syncer::HISTORY_DELETE_DIRECTIVES: {
 | 
| -      return WrapInProvider(ios::HistoryServiceFactory::GetForBrowserState(
 | 
| -          browser_state_, ServiceAccessType::EXPLICIT_ACCESS));
 | 
| +      history::HistoryService* history =
 | 
| +          ios::HistoryServiceFactory::GetForBrowserState(
 | 
| +              browser_state_, ServiceAccessType::EXPLICIT_ACCESS);
 | 
| +      return history ? history->AsWeakPtr()
 | 
| +                     : base::WeakPtr<history::HistoryService>();
 | 
|      }
 | 
|      case syncer::TYPED_URLS: {
 | 
|        history::HistoryService* history =
 | 
|            ios::HistoryServiceFactory::GetForBrowserState(
 | 
|                browser_state_, ServiceAccessType::EXPLICIT_ACCESS);
 | 
| -      return WrapInProvider(history ? history->GetTypedUrlSyncableService()
 | 
| -                                    : nullptr);
 | 
| +      return history ? history->GetTypedUrlSyncableService()->AsWeakPtr()
 | 
| +                     : base::WeakPtr<syncer::SyncableService>();
 | 
|      }
 | 
|      case syncer::FAVICON_IMAGES:
 | 
|      case syncer::FAVICON_TRACKING: {
 | 
| -      return WrapInProvider(
 | 
| +      sync_sessions::FaviconCache* favicons =
 | 
|            IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state_)
 | 
| -              ->GetFaviconCache());
 | 
| +              ->GetFaviconCache();
 | 
| +      return favicons ? favicons->AsWeakPtr()
 | 
| +                      : base::WeakPtr<syncer::SyncableService>();
 | 
|      }
 | 
|      case syncer::ARTICLES: {
 | 
|        // DomDistillerService is used in iOS ReadingList. The distilled articles
 | 
|        // are saved separately and must not be synced.
 | 
|        // Add a not reached to avoid having ARTICLES sync be enabled silently.
 | 
|        NOTREACHED();
 | 
| -      return WrapInProvider(nullptr);
 | 
| +      return base::WeakPtr<syncer::SyncableService>();
 | 
|      }
 | 
|      case syncer::SESSIONS: {
 | 
| -      return WrapInProvider(
 | 
| -          IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state_)
 | 
| -              ->GetSessionsSyncableService());
 | 
| +      return IOSChromeProfileSyncServiceFactory::GetForBrowserState(
 | 
| +                 browser_state_)
 | 
| +          ->GetSessionsSyncableService()
 | 
| +          ->AsWeakPtr();
 | 
|      }
 | 
|      case syncer::PASSWORDS: {
 | 
| -      return password_store_ ? base::Bind(&password_manager::PasswordStore::
 | 
| -                                              GetPasswordSyncableService,
 | 
| -                                          base::RetainedRef(password_store_))
 | 
| -                             : WrapInProvider(nullptr);
 | 
| +      return password_store_ ? password_store_->GetPasswordSyncableService()
 | 
| +                             : base::WeakPtr<syncer::SyncableService>();
 | 
|      }
 | 
|      default:
 | 
|        NOTREACHED();
 | 
| -      return WrapInProvider(nullptr);
 | 
| +      return base::WeakPtr<syncer::SyncableService>();
 | 
|    }
 | 
|  }
 | 
|  
 | 
| 
 |