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 0a61212fbd82bb293e4ff6f5903cbff556298840..7309de7c4f8c9d76a0452ae7f3ea4de60ace94c7 100644 |
--- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm |
+++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm |
@@ -69,8 +69,46 @@ |
#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 |
// might inherit from other interfaces with same methods. |
@@ -262,87 +300,78 @@ IOSChromeSyncClient::GetSyncSessionsClient() { |
return sync_sessions_client_.get(); |
} |
-base::WeakPtr<syncer::SyncableService> |
-IOSChromeSyncClient::GetSyncableServiceForType(syncer::ModelType type) { |
+ServiceProvider IOSChromeSyncClient::GetSyncableServiceForType( |
+ syncer::ModelType type) { |
switch (type) { |
case syncer::DEVICE_INFO: |
- return IOSChromeProfileSyncServiceFactory::GetForBrowserState( |
- browser_state_) |
- ->GetDeviceInfoSyncableService() |
- ->AsWeakPtr(); |
+ return WrapInProvider( |
+ IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state_) |
+ ->GetDeviceInfoSyncableService()); |
case syncer::PREFERENCES: |
- return browser_state_->GetSyncablePrefs() |
- ->GetSyncableService(syncer::PREFERENCES) |
- ->AsWeakPtr(); |
case syncer::PRIORITY_PREFERENCES: |
- return browser_state_->GetSyncablePrefs() |
- ->GetSyncableService(syncer::PRIORITY_PREFERENCES) |
- ->AsWeakPtr(); |
+ return WrapInProvider( |
+ browser_state_->GetSyncablePrefs()->GetSyncableService(type)); |
case syncer::AUTOFILL: |
case syncer::AUTOFILL_PROFILE: |
case syncer::AUTOFILL_WALLET_DATA: |
case syncer::AUTOFILL_WALLET_METADATA: { |
if (!web_data_service_) |
- return base::WeakPtr<syncer::SyncableService>(); |
+ return WrapInProvider(nullptr); |
if (type == syncer::AUTOFILL) { |
- return autofill::AutocompleteSyncableService::FromWebDataService( |
- web_data_service_.get()) |
- ->AsWeakPtr(); |
+ return WrapInWeakPtrCallback( |
+ base::Bind(&AutocompleteSyncableService::FromWebDataService, |
+ base::RetainedRef(web_data_service_))); |
} else if (type == syncer::AUTOFILL_PROFILE) { |
- return autofill::AutofillProfileSyncableService::FromWebDataService( |
- web_data_service_.get()) |
- ->AsWeakPtr(); |
+ return WrapInWeakPtrCallback( |
+ base::Bind(&AutofillProfileSyncableService::FromWebDataService, |
+ base::RetainedRef(web_data_service_))); |
} else if (type == syncer::AUTOFILL_WALLET_METADATA) { |
- return autofill::AutofillWalletMetadataSyncableService:: |
- FromWebDataService(web_data_service_.get()) |
- ->AsWeakPtr(); |
+ return WrapInWeakPtrCallback(base::Bind( |
+ &AutofillWalletMetadataSyncableService::FromWebDataService, |
+ base::RetainedRef(web_data_service_))); |
} |
- return autofill::AutofillWalletSyncableService::FromWebDataService( |
- web_data_service_.get()) |
- ->AsWeakPtr(); |
+ return WrapInWeakPtrCallback( |
+ base::Bind(&AutofillWalletSyncableService::FromWebDataService, |
+ base::RetainedRef(web_data_service_))); |
} |
case syncer::HISTORY_DELETE_DIRECTIVES: { |
- history::HistoryService* history = |
- ios::HistoryServiceFactory::GetForBrowserState( |
- browser_state_, ServiceAccessType::EXPLICIT_ACCESS); |
- return history ? history->AsWeakPtr() |
- : base::WeakPtr<history::HistoryService>(); |
+ return WrapInProvider(ios::HistoryServiceFactory::GetForBrowserState( |
+ browser_state_, ServiceAccessType::EXPLICIT_ACCESS)); |
} |
case syncer::TYPED_URLS: { |
history::HistoryService* history = |
ios::HistoryServiceFactory::GetForBrowserState( |
browser_state_, ServiceAccessType::EXPLICIT_ACCESS); |
- return history ? history->GetTypedUrlSyncableService()->AsWeakPtr() |
- : base::WeakPtr<syncer::SyncableService>(); |
+ return WrapInProvider(history ? history->GetTypedUrlSyncableService() |
+ : nullptr); |
} |
case syncer::FAVICON_IMAGES: |
case syncer::FAVICON_TRACKING: { |
- sync_sessions::FaviconCache* favicons = |
+ return WrapInProvider( |
IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state_) |
- ->GetFaviconCache(); |
- return favicons ? favicons->AsWeakPtr() |
- : base::WeakPtr<syncer::SyncableService>(); |
+ ->GetFaviconCache()); |
} |
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 base::WeakPtr<syncer::SyncableService>(); |
+ return WrapInProvider(nullptr); |
} |
case syncer::SESSIONS: { |
- return IOSChromeProfileSyncServiceFactory::GetForBrowserState( |
- browser_state_) |
- ->GetSessionsSyncableService() |
- ->AsWeakPtr(); |
+ return WrapInProvider( |
+ IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state_) |
+ ->GetSessionsSyncableService()); |
} |
case syncer::PASSWORDS: { |
- return password_store_ ? password_store_->GetPasswordSyncableService() |
- : base::WeakPtr<syncer::SyncableService>(); |
+ return password_store_ ? base::Bind(&password_manager::PasswordStore:: |
+ GetPasswordSyncableService, |
+ base::RetainedRef(password_store_)) |
+ : WrapInProvider(nullptr); |
} |
default: |
NOTREACHED(); |
- return base::WeakPtr<syncer::SyncableService>(); |
+ return WrapInProvider(nullptr); |
} |
} |