blob: ebc28ea6f2782d5ae1c60a901acc272b3f36e9ff [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/sync/chrome_sync_client.h"
#include <memory>
#include <utility>
#include "base/bind.h"
#include "base/command_line.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "build/build_config.h"
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/dom_distiller/dom_distiller_service_factory.h"
#include "chrome/browser/favicon/favicon_service_factory.h"
#include "chrome/browser/history/history_service_factory.h"
#include "chrome/browser/invalidation/profile_invalidation_provider_factory.h"
#include "chrome/browser/password_manager/password_store_factory.h"
#include "chrome/browser/prefs/pref_service_syncable_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
#include "chrome/browser/sync/glue/sync_start_util.h"
#include "chrome/browser/sync/glue/theme_data_type_controller.h"
#include "chrome/browser/sync/profile_sync_service_factory.h"
#include "chrome/browser/sync/sessions/notification_service_sessions_router.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/themes/theme_syncable_service.h"
#include "chrome/browser/ui/app_list/arc/arc_package_sync_data_type_controller.h"
#include "chrome/browser/ui/sync/browser_synced_window_delegates_getter.h"
#include "chrome/browser/undo/bookmark_undo_service_factory.h"
#include "chrome/browser/web_data_service_factory.h"
#include "chrome/common/channel_info.h"
#include "chrome/common/features.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "components/autofill/core/browser/webdata/autocomplete_syncable_service.h"
#include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h"
#include "components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.h"
#include "components/autofill/core/browser/webdata/autofill_wallet_syncable_service.h"
#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
#include "components/browser_sync/browser/profile_sync_components_factory_impl.h"
#include "components/browser_sync/browser/profile_sync_service.h"
#include "components/browser_sync/common/browser_sync_switches.h"
#include "components/dom_distiller/core/dom_distiller_service.h"
#include "components/history/core/browser/history_model_worker.h"
#include "components/history/core/browser/history_service.h"
#include "components/invalidation/impl/profile_invalidation_provider.h"
#include "components/password_manager/core/browser/password_store.h"
#include "components/password_manager/sync/browser/password_model_worker.h"
#include "components/search_engines/search_engine_data_type_controller.h"
#include "components/signin/core/browser/profile_oauth2_token_service.h"
#include "components/sync/driver/glue/browser_thread_model_worker.h"
#include "components/sync/driver/glue/chrome_report_unrecoverable_error.h"
#include "components/sync/driver/glue/ui_model_worker.h"
#include "components/sync/driver/sync_api_component_factory.h"
#include "components/sync/driver/sync_util.h"
#include "components/sync/driver/ui_data_type_controller.h"
#include "components/sync/engine/passive_model_worker.h"
#include "components/sync_sessions/sync_sessions_client.h"
#include "components/syncable_prefs/pref_service_syncable.h"
#include "content/public/browser/browser_thread.h"
#include "ui/base/device_form_factor.h"
#if defined(ENABLE_APP_LIST)
#include "chrome/browser/ui/app_list/app_list_syncable_service.h"
#include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
#include "ui/app_list/app_list_switches.h"
#endif
#if defined(ENABLE_EXTENSIONS)
#include "chrome/browser/extensions/api/storage/settings_sync_util.h"
#include "chrome/browser/extensions/extension_sync_service.h"
#include "chrome/browser/sync/glue/extension_data_type_controller.h"
#include "chrome/browser/sync/glue/extension_setting_data_type_controller.h"
#endif
#if defined(ENABLE_SUPERVISED_USERS)
#include "chrome/browser/supervised_user/legacy/supervised_user_shared_settings_service.h"
#include "chrome/browser/supervised_user/legacy/supervised_user_shared_settings_service_factory.h"
#include "chrome/browser/supervised_user/legacy/supervised_user_sync_service.h"
#include "chrome/browser/supervised_user/legacy/supervised_user_sync_service_factory.h"
#include "chrome/browser/supervised_user/supervised_user_service.h"
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#include "chrome/browser/supervised_user/supervised_user_settings_service.h"
#include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h"
#include "chrome/browser/supervised_user/supervised_user_sync_data_type_controller.h"
#include "chrome/browser/supervised_user/supervised_user_whitelist_service.h"
#endif
#if defined(ENABLE_SPELLCHECK)
#include "chrome/browser/spellchecker/spellcheck_factory.h"
#include "chrome/browser/spellchecker/spellcheck_service.h"
#endif
#if BUILDFLAG(ANDROID_JAVA_UI)
#include "chrome/browser/sync/glue/synced_window_delegates_getter_android.h"
#endif
#if defined(OS_CHROMEOS)
#include "chrome/browser/ui/app_list/arc/arc_package_syncable_service.h"
#include "components/wifi_sync/wifi_credential_syncable_service.h"
#include "components/wifi_sync/wifi_credential_syncable_service_factory.h"
#endif
using content::BrowserThread;
#if defined(ENABLE_EXTENSIONS)
using browser_sync::ExtensionDataTypeController;
using browser_sync::ExtensionSettingDataTypeController;
#endif
using browser_sync::SearchEngineDataTypeController;
using sync_driver::UIDataTypeController;
namespace browser_sync {
// Chrome implementation of SyncSessionsClient. Needs to be in a separate class
// due to possible multiple inheritance issues, wherein ChromeSyncClient might
// inherit from other interfaces with same methods.
class SyncSessionsClientImpl : public sync_sessions::SyncSessionsClient {
public:
explicit SyncSessionsClientImpl(Profile* profile) : profile_(profile) {
window_delegates_getter_.reset(
#if BUILDFLAG(ANDROID_JAVA_UI)
// Android doesn't have multi-profile support, so no need to pass the
// profile in.
new SyncedWindowDelegatesGetterAndroid());
#else
new browser_sync::BrowserSyncedWindowDelegatesGetter(profile));
#endif
}
~SyncSessionsClientImpl() override {}
// SyncSessionsClient implementation.
bookmarks::BookmarkModel* GetBookmarkModel() override {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
return BookmarkModelFactory::GetForBrowserContext(profile_);
}
favicon::FaviconService* GetFaviconService() override {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
return FaviconServiceFactory::GetForProfile(
profile_, ServiceAccessType::IMPLICIT_ACCESS);
}
history::HistoryService* GetHistoryService() override {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
return HistoryServiceFactory::GetForProfile(
profile_, ServiceAccessType::EXPLICIT_ACCESS);
}
bool ShouldSyncURL(const GURL& url) const override {
if (url == GURL(chrome::kChromeUIHistoryURL)) {
// The history page is treated specially as we want it to trigger syncable
// events for UI purposes.
return true;
}
return url.is_valid() && !url.SchemeIs(content::kChromeUIScheme) &&
!url.SchemeIs(chrome::kChromeNativeScheme) && !url.SchemeIsFile();
}
sync_sessions::SyncedWindowDelegatesGetter* GetSyncedWindowDelegatesGetter()
override {
return window_delegates_getter_.get();
}
std::unique_ptr<sync_sessions::LocalSessionEventRouter>
GetLocalSessionEventRouter() override {
syncer::SyncableService::StartSyncFlare flare(
sync_start_util::GetFlareForSyncableService(profile_->GetPath()));
return base::MakeUnique<sync_sessions::NotificationServiceSessionsRouter>(
profile_, this, flare);
}
private:
Profile* profile_;
std::unique_ptr<sync_sessions::SyncedWindowDelegatesGetter>
window_delegates_getter_;
DISALLOW_COPY_AND_ASSIGN(SyncSessionsClientImpl);
};
ChromeSyncClient::ChromeSyncClient(Profile* profile)
: profile_(profile),
sync_sessions_client_(new SyncSessionsClientImpl(profile)),
weak_ptr_factory_(this) {}
ChromeSyncClient::~ChromeSyncClient() {
}
void ChromeSyncClient::Initialize() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
web_data_service_ = WebDataServiceFactory::GetAutofillWebDataForProfile(
profile_, ServiceAccessType::IMPLICIT_ACCESS);
password_store_ = PasswordStoreFactory::GetForProfile(
profile_, ServiceAccessType::IMPLICIT_ACCESS);
// Component factory may already be set in tests.
if (!GetSyncApiComponentFactory()) {
const GURL sync_service_url = GetSyncServiceURL(
*base::CommandLine::ForCurrentProcess(), chrome::GetChannel());
ProfileOAuth2TokenService* token_service =
ProfileOAuth2TokenServiceFactory::GetForProfile(profile_);
net::URLRequestContextGetter* url_request_context_getter =
profile_->GetRequestContext();
component_factory_.reset(new ProfileSyncComponentsFactoryImpl(
this, chrome::GetChannel(), chrome::GetVersionString(),
ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET,
*base::CommandLine::ForCurrentProcess(),
prefs::kSavingBrowserHistoryDisabled, sync_service_url,
content::BrowserThread::GetTaskRunnerForThread(
content::BrowserThread::UI),
content::BrowserThread::GetTaskRunnerForThread(
content::BrowserThread::DB),
token_service, url_request_context_getter, web_data_service_,
password_store_));
}
}
sync_driver::SyncService* ChromeSyncClient::GetSyncService() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
return ProfileSyncServiceFactory::GetSyncServiceForBrowserContext(profile_);
}
PrefService* ChromeSyncClient::GetPrefService() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
return profile_->GetPrefs();
}
bookmarks::BookmarkModel* ChromeSyncClient::GetBookmarkModel() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
return BookmarkModelFactory::GetForBrowserContext(profile_);
}
favicon::FaviconService* ChromeSyncClient::GetFaviconService() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
return FaviconServiceFactory::GetForProfile(
profile_, ServiceAccessType::IMPLICIT_ACCESS);
}
history::HistoryService* ChromeSyncClient::GetHistoryService() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
return HistoryServiceFactory::GetForProfile(
profile_, ServiceAccessType::EXPLICIT_ACCESS);
}
autofill::PersonalDataManager* ChromeSyncClient::GetPersonalDataManager() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
return autofill::PersonalDataManagerFactory::GetForProfile(profile_);
}
base::Closure ChromeSyncClient::GetPasswordStateChangedCallback() {
return base::Bind(
&PasswordStoreFactory::OnPasswordsSyncedStatePotentiallyChanged,
base::Unretained(profile_));
}
sync_driver::SyncApiComponentFactory::RegisterDataTypesMethod
ChromeSyncClient::GetRegisterPlatformTypesCallback() {
return base::Bind(
#if BUILDFLAG(ANDROID_JAVA_UI)
&ChromeSyncClient::RegisterAndroidDataTypes,
#else
&ChromeSyncClient::RegisterDesktopDataTypes,
#endif // BUILDFLAG(ANDROID_JAVA_UI)
weak_ptr_factory_.GetWeakPtr());
}
BookmarkUndoService* ChromeSyncClient::GetBookmarkUndoServiceIfExists() {
return BookmarkUndoServiceFactory::GetForProfileIfExists(profile_);
}
invalidation::InvalidationService* ChromeSyncClient::GetInvalidationService() {
invalidation::ProfileInvalidationProvider* provider =
invalidation::ProfileInvalidationProviderFactory::GetForProfile(profile_);
if (provider)
return provider->GetInvalidationService();
return nullptr;
}
scoped_refptr<syncer::ExtensionsActivity>
ChromeSyncClient::GetExtensionsActivity() {
return extensions_activity_monitor_.GetExtensionsActivity();
}
sync_sessions::SyncSessionsClient* ChromeSyncClient::GetSyncSessionsClient() {
return sync_sessions_client_.get();
}
base::WeakPtr<syncer::SyncableService>
ChromeSyncClient::GetSyncableServiceForType(syncer::ModelType type) {
if (!profile_) { // For tests.
return base::WeakPtr<syncer::SyncableService>();
}
switch (type) {
case syncer::DEVICE_INFO:
return ProfileSyncServiceFactory::GetForProfile(profile_)
->GetDeviceInfoSyncableService()
->AsWeakPtr();
case syncer::PREFERENCES:
return PrefServiceSyncableFromProfile(profile_)
->GetSyncableService(syncer::PREFERENCES)
->AsWeakPtr();
case syncer::PRIORITY_PREFERENCES:
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 base::WeakPtr<syncer::SyncableService>();
if (type == syncer::AUTOFILL) {
return autofill::AutocompleteSyncableService::FromWebDataService(
web_data_service_.get())->AsWeakPtr();
} else if (type == syncer::AUTOFILL_PROFILE) {
return autofill::AutofillProfileSyncableService::FromWebDataService(
web_data_service_.get())->AsWeakPtr();
} else if (type == syncer::AUTOFILL_WALLET_METADATA) {
return autofill::AutofillWalletMetadataSyncableService::
FromWebDataService(web_data_service_.get())->AsWeakPtr();
}
return autofill::AutofillWalletSyncableService::FromWebDataService(
web_data_service_.get())->AsWeakPtr();
}
case syncer::SEARCH_ENGINES:
return TemplateURLServiceFactory::GetForProfile(profile_)->AsWeakPtr();
#if defined(ENABLE_EXTENSIONS)
case syncer::APPS:
case syncer::EXTENSIONS:
return ExtensionSyncService::Get(profile_)->AsWeakPtr();
case syncer::APP_SETTINGS:
case syncer::EXTENSION_SETTINGS:
return extensions::settings_sync_util::GetSyncableService(profile_, type)
->AsWeakPtr();
#endif
#if defined(ENABLE_APP_LIST)
case syncer::APP_LIST:
return app_list::AppListSyncableServiceFactory::GetForProfile(profile_)->
AsWeakPtr();
#endif
#if defined(ENABLE_THEMES)
case syncer::THEMES:
return ThemeServiceFactory::GetForProfile(profile_)->
GetThemeSyncableService()->AsWeakPtr();
#endif
case syncer::HISTORY_DELETE_DIRECTIVES: {
history::HistoryService* history = GetHistoryService();
return history ? history->AsWeakPtr()
: base::WeakPtr<history::HistoryService>();
}
case syncer::TYPED_URLS: {
// 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 defined(ENABLE_SPELLCHECK)
case syncer::DICTIONARY:
return SpellcheckServiceFactory::GetForContext(profile_)->
GetCustomDictionary()->AsWeakPtr();
#endif
case syncer::FAVICON_IMAGES:
case syncer::FAVICON_TRACKING: {
sync_sessions::FaviconCache* favicons =
ProfileSyncServiceFactory::GetForProfile(profile_)->GetFaviconCache();
return favicons ? favicons->AsWeakPtr()
: base::WeakPtr<syncer::SyncableService>();
}
#if defined(ENABLE_SUPERVISED_USERS)
case syncer::SUPERVISED_USER_SETTINGS:
return SupervisedUserSettingsServiceFactory::GetForProfile(profile_)->
AsWeakPtr();
#if !defined(OS_ANDROID)
case syncer::SUPERVISED_USERS:
return SupervisedUserSyncServiceFactory::GetForProfile(profile_)->
AsWeakPtr();
case syncer::SUPERVISED_USER_SHARED_SETTINGS:
return SupervisedUserSharedSettingsServiceFactory::GetForBrowserContext(
profile_)->AsWeakPtr();
#endif
case syncer::SUPERVISED_USER_WHITELISTS:
return SupervisedUserServiceFactory::GetForProfile(profile_)
->GetWhitelistService()
->AsWeakPtr();
#endif
case syncer::ARTICLES: {
dom_distiller::DomDistillerService* service =
dom_distiller::DomDistillerServiceFactory::GetForBrowserContext(
profile_);
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()
? password_store_->GetPasswordSyncableService()
: base::WeakPtr<syncer::SyncableService>();
}
#if defined(OS_CHROMEOS)
case syncer::WIFI_CREDENTIALS:
return wifi_sync::WifiCredentialSyncableServiceFactory::
GetForBrowserContext(profile_)->AsWeakPtr();
case syncer::ARC_PACKAGE:
return arc::ArcPackageSyncableService::Get(profile_)->AsWeakPtr();
#endif
default:
// The following datatypes still need to be transitioned to the
// syncer::SyncableService API:
// Bookmarks
NOTREACHED();
return base::WeakPtr<syncer::SyncableService>();
}
}
base::WeakPtr<syncer_v2::ModelTypeService>
ChromeSyncClient::GetModelTypeServiceForType(syncer::ModelType type) {
switch (type) {
case syncer::DEVICE_INFO:
return ProfileSyncServiceFactory::GetForProfile(profile_)
->GetDeviceInfoService()
->AsWeakPtr();
default:
NOTREACHED();
return base::WeakPtr<syncer_v2::ModelTypeService>();
}
}
scoped_refptr<syncer::ModelSafeWorker>
ChromeSyncClient::CreateModelWorkerForGroup(
syncer::ModelSafeGroup group,
syncer::WorkerLoopDestructionObserver* observer) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
switch (group) {
case syncer::GROUP_DB:
return new BrowserThreadModelWorker(
BrowserThread::GetTaskRunnerForThread(BrowserThread::DB),
syncer::GROUP_DB, observer);
case syncer::GROUP_FILE:
return new BrowserThreadModelWorker(
BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE),
syncer::GROUP_FILE, observer);
case syncer::GROUP_UI:
return new UIModelWorker(
BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), observer);
case syncer::GROUP_PASSIVE:
return new syncer::PassiveModelWorker(observer);
case syncer::GROUP_HISTORY: {
history::HistoryService* history_service = GetHistoryService();
if (!history_service)
return nullptr;
return new HistoryModelWorker(
history_service->AsWeakPtr(),
BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), observer);
}
case syncer::GROUP_PASSWORD: {
if (!password_store_.get())
return nullptr;
return new PasswordModelWorker(password_store_, observer);
}
default:
return nullptr;
}
}
sync_driver::SyncApiComponentFactory*
ChromeSyncClient::GetSyncApiComponentFactory() {
return component_factory_.get();
}
void ChromeSyncClient::SetSyncApiComponentFactoryForTesting(
std::unique_ptr<sync_driver::SyncApiComponentFactory> component_factory) {
component_factory_ = std::move(component_factory);
}
// static
void ChromeSyncClient::GetDeviceInfoTrackers(
std::vector<const sync_driver::DeviceInfoTracker*>* trackers) {
DCHECK(trackers);
ProfileManager* profile_manager = g_browser_process->profile_manager();
std::vector<Profile*> profile_list = profile_manager->GetLoadedProfiles();
for (Profile* profile : profile_list) {
const ProfileSyncService* profile_sync_service =
ProfileSyncServiceFactory::GetForProfile(profile);
if (profile_sync_service != nullptr) {
const sync_driver::DeviceInfoTracker* tracker =
profile_sync_service->GetDeviceInfoTracker();
if (tracker != nullptr) {
// Even when sync is disabled and/or user is signed out, a tracker will
// still be present. It will only be missing when the ProfileSyncService
// has not sufficiently initialized yet.
trackers->push_back(tracker);
}
}
}
}
void ChromeSyncClient::RegisterDesktopDataTypes(
sync_driver::SyncService* sync_service,
syncer::ModelTypeSet disabled_types,
syncer::ModelTypeSet enabled_types) {
base::Closure error_callback =
base::Bind(&ChromeReportUnrecoverableError, chrome::GetChannel());
#if defined(ENABLE_EXTENSIONS)
// App sync is enabled by default. Register unless explicitly
// disabled.
if (!disabled_types.Has(syncer::APPS)) {
sync_service->RegisterDataTypeController(
base::MakeUnique<ExtensionDataTypeController>(
syncer::APPS, error_callback, this, profile_));
}
// Extension sync is enabled by default. Register unless explicitly
// disabled.
if (!disabled_types.Has(syncer::EXTENSIONS)) {
sync_service->RegisterDataTypeController(
base::MakeUnique<ExtensionDataTypeController>(
syncer::EXTENSIONS, error_callback, this, profile_));
}
#endif
#if defined(ENABLE_THEMES)
// Theme sync is enabled by default. Register unless explicitly disabled.
if (!disabled_types.Has(syncer::THEMES)) {
sync_service->RegisterDataTypeController(
base::MakeUnique<ThemeDataTypeController>(error_callback, this,
profile_));
}
#endif
// Search Engine sync is enabled by default. Register unless explicitly
// disabled.
if (!disabled_types.Has(syncer::SEARCH_ENGINES)) {
sync_service->RegisterDataTypeController(
base::MakeUnique<SearchEngineDataTypeController>(
error_callback, this,
TemplateURLServiceFactory::GetForProfile(profile_)));
}
#if defined(ENABLE_EXTENSIONS)
// Extension setting sync is enabled by default. Register unless explicitly
// disabled.
if (!disabled_types.Has(syncer::EXTENSION_SETTINGS)) {
sync_service->RegisterDataTypeController(
base::MakeUnique<ExtensionSettingDataTypeController>(
syncer::EXTENSION_SETTINGS, error_callback, this, profile_));
}
// App setting sync is enabled by default. Register unless explicitly
// disabled.
if (!disabled_types.Has(syncer::APP_SETTINGS)) {
sync_service->RegisterDataTypeController(
base::MakeUnique<ExtensionSettingDataTypeController>(
syncer::APP_SETTINGS, error_callback, this, profile_));
}
#endif
#if defined(ENABLE_APP_LIST)
if (app_list::switches::IsAppListSyncEnabled()) {
sync_service->RegisterDataTypeController(
base::MakeUnique<UIDataTypeController>(syncer::APP_LIST, error_callback,
this));
}
#endif
#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_CHROMEOS)
// Dictionary sync is enabled by default.
if (!disabled_types.Has(syncer::DICTIONARY)) {
sync_service->RegisterDataTypeController(
base::MakeUnique<UIDataTypeController>(syncer::DICTIONARY,
error_callback, this));
}
#endif
#if defined(ENABLE_SUPERVISED_USERS)
sync_service->RegisterDataTypeController(
base::MakeUnique<SupervisedUserSyncDataTypeController>(
syncer::SUPERVISED_USER_SETTINGS, error_callback, this, profile_));
sync_service->RegisterDataTypeController(
base::MakeUnique<SupervisedUserSyncDataTypeController>(
syncer::SUPERVISED_USER_WHITELISTS, error_callback, this, profile_));
sync_service->RegisterDataTypeController(
base::MakeUnique<SupervisedUserSyncDataTypeController>(
syncer::SUPERVISED_USERS, error_callback, this, profile_));
sync_service->RegisterDataTypeController(
base::MakeUnique<SupervisedUserSyncDataTypeController>(
syncer::SUPERVISED_USER_SHARED_SETTINGS, error_callback, this,
profile_));
#endif
#if defined(OS_CHROMEOS)
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableWifiCredentialSync) &&
!disabled_types.Has(syncer::WIFI_CREDENTIALS)) {
sync_service->RegisterDataTypeController(
base::MakeUnique<UIDataTypeController>(syncer::WIFI_CREDENTIALS,
error_callback, this));
}
// TODO(lgcheng): Add switch for this.
sync_service->RegisterDataTypeController(
base::MakeUnique<ArcPackageSyncDataTypeController>(
syncer::ARC_PACKAGE, error_callback, this, profile_));
#endif
}
void ChromeSyncClient::RegisterAndroidDataTypes(
sync_driver::SyncService* sync_service,
syncer::ModelTypeSet disabled_types,
syncer::ModelTypeSet enabled_types) {
base::Closure error_callback =
base::Bind(&ChromeReportUnrecoverableError, chrome::GetChannel());
#if defined(ENABLE_SUPERVISED_USERS)
sync_service->RegisterDataTypeController(
base::MakeUnique<SupervisedUserSyncDataTypeController>(
syncer::SUPERVISED_USER_SETTINGS, error_callback, this, profile_));
sync_service->RegisterDataTypeController(
base::MakeUnique<SupervisedUserSyncDataTypeController>(
syncer::SUPERVISED_USER_WHITELISTS, error_callback, this, profile_));
#endif
}
} // namespace browser_sync