| 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>();
|
| }
|
| }
|
|
|
|
|