Commit 2b56601a authored by John Z Wu's avatar John Z Wu Committed by Commit Bot

Introduce WebViewSyncClient in //ios/web_view.

//ios/web_view will implement sync for autofill and passwords in the
near future. This is one of many CLs needed.

Cq-Include-Trybots: luci.chromium.try:ios-simulator-full-configs;master.tryserver.chromium.mac:ios-simulator-cronet
Change-Id: I378520039e2be7b4c5827554bad93322ad0b743d
Bug: 865558
Reviewed-on: https://chromium-review.googlesource.com/1141093
Commit-Queue: John Wu <jzw@chromium.org>
Reviewed-by: default avatarNico Weber <thakis@chromium.org>
Reviewed-by: default avatarMikel Astiz <mastiz@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Reviewed-by: default avatarVasilii Sukhanov <vasilii@chromium.org>
Reviewed-by: default avatarHiroshi Ichikawa <ichikawa@chromium.org>
Cr-Commit-Position: refs/heads/master@{#582717}
parent 63c11722
...@@ -157,10 +157,16 @@ ios_web_view_sources = [ ...@@ -157,10 +157,16 @@ ios_web_view_sources = [
"internal/signin/web_view_signin_error_controller_factory.mm", "internal/signin/web_view_signin_error_controller_factory.mm",
"internal/signin/web_view_signin_manager_factory.h", "internal/signin/web_view_signin_manager_factory.h",
"internal/signin/web_view_signin_manager_factory.mm", "internal/signin/web_view_signin_manager_factory.mm",
"internal/sync/web_view_model_type_store_service_factory.h",
"internal/sync/web_view_model_type_store_service_factory.mm",
"internal/sync/web_view_gcm_profile_service_factory.h", "internal/sync/web_view_gcm_profile_service_factory.h",
"internal/sync/web_view_gcm_profile_service_factory.mm", "internal/sync/web_view_gcm_profile_service_factory.mm",
"internal/sync/web_view_profile_invalidation_provider_factory.h", "internal/sync/web_view_profile_invalidation_provider_factory.h",
"internal/sync/web_view_profile_invalidation_provider_factory.mm", "internal/sync/web_view_profile_invalidation_provider_factory.mm",
"internal/sync/web_view_profile_sync_service_factory.h",
"internal/sync/web_view_profile_sync_service_factory.mm",
"internal/sync/web_view_sync_client.h",
"internal/sync/web_view_sync_client.mm",
"internal/translate/cwv_translation_controller.mm", "internal/translate/cwv_translation_controller.mm",
"internal/translate/cwv_translation_controller_internal.h", "internal/translate/cwv_translation_controller_internal.h",
"internal/translate/cwv_translation_language_internal.h", "internal/translate/cwv_translation_language_internal.h",
...@@ -228,6 +234,7 @@ ios_web_view_deps = [ ...@@ -228,6 +234,7 @@ ios_web_view_deps = [
"//components/autofill/core/common", "//components/autofill/core/common",
"//components/autofill/ios/browser", "//components/autofill/ios/browser",
"//components/autofill/ios/form_util", "//components/autofill/ios/form_util",
"//components/browser_sync",
"//components/content_settings/core/browser", "//components/content_settings/core/browser",
"//components/flags_ui", "//components/flags_ui",
"//components/gcm_driver", "//components/gcm_driver",
...@@ -239,7 +246,6 @@ ios_web_view_deps = [ ...@@ -239,7 +246,6 @@ ios_web_view_deps = [
"//components/language/core/browser", "//components/language/core/browser",
"//components/language/core/common", "//components/language/core/common",
"//components/net_log", "//components/net_log",
"//components/network_time",
"//components/password_manager/core/browser", "//components/password_manager/core/browser",
"//components/password_manager/core/browser/form_parsing:form_parsing", "//components/password_manager/core/browser/form_parsing:form_parsing",
"//components/password_manager/core/common", "//components/password_manager/core/common",
...@@ -255,6 +261,8 @@ ios_web_view_deps = [ ...@@ -255,6 +261,8 @@ ios_web_view_deps = [
"//components/translate/core/browser", "//components/translate/core/browser",
"//components/translate/core/common", "//components/translate/core/common",
"//components/translate/ios/browser", "//components/translate/ios/browser",
"//components/version_info",
"//components/version_info:version_string",
"//components/web_resource", "//components/web_resource",
"//components/webdata_services", "//components/webdata_services",
"//google_apis", "//google_apis",
......
include_rules = [ include_rules = [
"+base", "+base",
"+components/autofill", "+components/autofill",
"+components/browser_sync",
"+components/content_settings/core", "+components/content_settings/core",
"+components/flags_ui", "+components/flags_ui",
"+components/gcm_driver", "+components/gcm_driver",
...@@ -12,7 +13,8 @@ include_rules = [ ...@@ -12,7 +13,8 @@ include_rules = [
"+components/language/core/browser", "+components/language/core/browser",
"+components/language/core/common", "+components/language/core/common",
"+components/net_log", "+components/net_log",
"+components/password_manager", "+components/password_manager/core",
"+components/password_manager/sync",
"+components/pref_registry", "+components/pref_registry",
"+components/prefs", "+components/prefs",
"+components/proxy_config", "+components/proxy_config",
...@@ -22,6 +24,7 @@ include_rules = [ ...@@ -22,6 +24,7 @@ include_rules = [
"+components/sync", "+components/sync",
"+components/translate/core", "+components/translate/core",
"+components/translate/ios", "+components/translate/ios",
"+components/version_info",
"+components/webdata_services", "+components/webdata_services",
"+components/web_resource", "+components/web_resource",
"+google_apis", "+google_apis",
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/sequenced_task_runner.h" #include "base/sequenced_task_runner.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/sequenced_task_runner_handle.h"
#include "components/browser_sync/profile_sync_service.h"
#include "components/keyed_service/core/service_access_type.h" #include "components/keyed_service/core/service_access_type.h"
#include "components/keyed_service/ios/browser_state_dependency_manager.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h"
#include "components/password_manager/core/browser/android_affiliation/affiliated_match_helper.h" #include "components/password_manager/core/browser/android_affiliation/affiliated_match_helper.h"
...@@ -21,6 +22,7 @@ ...@@ -21,6 +22,7 @@
#include "components/password_manager/core/browser/login_database.h" #include "components/password_manager/core/browser/login_database.h"
#include "components/password_manager/core/browser/password_store_default.h" #include "components/password_manager/core/browser/password_store_default.h"
#include "components/password_manager/core/browser/password_store_factory_util.h" #include "components/password_manager/core/browser/password_store_factory_util.h"
#import "ios/web_view/internal/sync/web_view_profile_sync_service_factory.h"
#include "ios/web_view/internal/web_view_browser_state.h" #include "ios/web_view/internal/web_view_browser_state.h"
#include "ios/web_view/internal/webdata_services/web_view_web_data_service_wrapper_factory.h" #include "ios/web_view/internal/webdata_services/web_view_web_data_service_wrapper_factory.h"
...@@ -51,6 +53,19 @@ WebViewPasswordStoreFactory* WebViewPasswordStoreFactory::GetInstance() { ...@@ -51,6 +53,19 @@ WebViewPasswordStoreFactory* WebViewPasswordStoreFactory::GetInstance() {
return base::Singleton<WebViewPasswordStoreFactory>::get(); return base::Singleton<WebViewPasswordStoreFactory>::get();
} }
// static
void WebViewPasswordStoreFactory::OnPasswordsSyncedStatePotentiallyChanged(
WebViewBrowserState* browser_state) {
scoped_refptr<password_manager::PasswordStore> password_store =
GetForBrowserState(browser_state, ServiceAccessType::EXPLICIT_ACCESS);
syncer::SyncService* sync_service =
WebViewProfileSyncServiceFactory::GetForBrowserState(browser_state);
password_manager::ToggleAffiliationBasedMatchingBasedOnPasswordSyncedState(
password_store.get(), sync_service,
browser_state->GetSharedURLLoaderFactory(),
browser_state->GetStatePath());
}
WebViewPasswordStoreFactory::WebViewPasswordStoreFactory() WebViewPasswordStoreFactory::WebViewPasswordStoreFactory()
: RefcountedBrowserStateKeyedServiceFactory( : RefcountedBrowserStateKeyedServiceFactory(
"PasswordStore", "PasswordStore",
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
namespace prefs { namespace prefs {
// The value to use for Accept-Languages HTTP header when making an HTTP
// request.
const char kAcceptLanguages[] = "intl.accept_languages"; const char kAcceptLanguages[] = "intl.accept_languages";
const char kSavingBrowserHistoryDisabled[] = "history.saving_disabled";
} // namespace prefs } // namespace prefs
...@@ -7,8 +7,13 @@ ...@@ -7,8 +7,13 @@
namespace prefs { namespace prefs {
// The value to use for Accept-Languages HTTP header when making an HTTP
// request. Currently only used for Translate related requests.
extern const char kAcceptLanguages[]; extern const char kAcceptLanguages[];
// Boolean controlling whether history saving is disabled.
extern const char kSavingBrowserHistoryDisabled[];
} // namespace prefs } // namespace prefs
#endif // IOS_WEB_VIEW_INTERNAL_PREF_NAMES_H_ #endif // IOS_WEB_VIEW_INTERNAL_PREF_NAMES_H_
// Copyright 2018 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.
#ifndef IOS_WEB_VIEW_INTERNAL_SYNC_WEB_VIEW_MODEL_TYPE_STORE_SERVICE_FACTORY_H_
#define IOS_WEB_VIEW_INTERNAL_SYNC_WEB_VIEW_MODEL_TYPE_STORE_SERVICE_FACTORY_H_
#include <memory>
#include "base/macros.h"
#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
namespace base {
template <typename T>
struct DefaultSingletonTraits;
} // namespace base
namespace syncer {
class ModelTypeStoreService;
} // namespace syncer
namespace ios_web_view {
class WebViewBrowserState;
// Singleton that owns all ModelTypeStoreService and associates them with
// WebViewBrowserState
class WebViewModelTypeStoreServiceFactory
: public BrowserStateKeyedServiceFactory {
public:
static syncer::ModelTypeStoreService* GetForBrowserState(
WebViewBrowserState* browser_state);
static WebViewModelTypeStoreServiceFactory* GetInstance();
private:
friend struct base::DefaultSingletonTraits<
WebViewModelTypeStoreServiceFactory>;
WebViewModelTypeStoreServiceFactory();
~WebViewModelTypeStoreServiceFactory() override;
// BrowserStateKeyedServiceFactory implementation.
std::unique_ptr<KeyedService> BuildServiceInstanceFor(
web::BrowserState* context) const override;
web::BrowserState* GetBrowserStateToUse(
web::BrowserState* context) const override;
DISALLOW_COPY_AND_ASSIGN(WebViewModelTypeStoreServiceFactory);
};
} // namespace ios_web_view
#endif // IOS_WEB_VIEW_INTERNAL_SYNC_WEB_VIEW_MODEL_TYPE_STORE_SERVICE_FACTORY_H_
// Copyright 2018 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.
#import "ios/web_view/internal/sync/web_view_model_type_store_service_factory.h"
#include <utility>
#include "base/memory/singleton.h"
#include "components/keyed_service/ios/browser_state_dependency_manager.h"
#include "components/sync/model_impl/model_type_store_service_impl.h"
#include "ios/web_view/internal/web_view_browser_state.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace ios_web_view {
// static
WebViewModelTypeStoreServiceFactory*
WebViewModelTypeStoreServiceFactory::GetInstance() {
return base::Singleton<WebViewModelTypeStoreServiceFactory>::get();
}
// static
syncer::ModelTypeStoreService*
WebViewModelTypeStoreServiceFactory::GetForBrowserState(
WebViewBrowserState* browser_state) {
return static_cast<syncer::ModelTypeStoreService*>(
GetInstance()->GetServiceForBrowserState(browser_state, true));
}
WebViewModelTypeStoreServiceFactory::WebViewModelTypeStoreServiceFactory()
: BrowserStateKeyedServiceFactory(
"ModelTypeStoreService",
BrowserStateDependencyManager::GetInstance()) {}
WebViewModelTypeStoreServiceFactory::~WebViewModelTypeStoreServiceFactory() {}
std::unique_ptr<KeyedService>
WebViewModelTypeStoreServiceFactory::BuildServiceInstanceFor(
web::BrowserState* context) const {
WebViewBrowserState* browser_state =
WebViewBrowserState::FromBrowserState(context);
return std::make_unique<syncer::ModelTypeStoreServiceImpl>(
browser_state->GetStatePath());
}
web::BrowserState* WebViewModelTypeStoreServiceFactory::GetBrowserStateToUse(
web::BrowserState* context) const {
WebViewBrowserState* browser_state =
WebViewBrowserState::FromBrowserState(context);
return browser_state->GetRecordingBrowserState();
}
} // namespace ios_web_view
// Copyright 2018 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.
#ifndef IOS_WEB_VIEW_INTERNAL_SYNC_WEB_VIEW_PROFILE_SYNC_SERVICE_FACTORY_H_
#define IOS_WEB_VIEW_INTERNAL_SYNC_WEB_VIEW_PROFILE_SYNC_SERVICE_FACTORY_H_
#include <memory>
#include "base/macros.h"
#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
namespace base {
template <typename T>
struct DefaultSingletonTraits;
} // namespace base
namespace browser_sync {
class ProfileSyncService;
} // namespace browser_sync
namespace ios_web_view {
class WebViewBrowserState;
// Singleton that owns all ProfileSyncService and associates them with
// WebViewBrowserState.
class WebViewProfileSyncServiceFactory
: public BrowserStateKeyedServiceFactory {
public:
static browser_sync::ProfileSyncService* GetForBrowserState(
WebViewBrowserState* browser_state);
static WebViewProfileSyncServiceFactory* GetInstance();
private:
friend struct base::DefaultSingletonTraits<WebViewProfileSyncServiceFactory>;
WebViewProfileSyncServiceFactory();
~WebViewProfileSyncServiceFactory() override;
// BrowserStateKeyedServiceFactory implementation.
std::unique_ptr<KeyedService> BuildServiceInstanceFor(
web::BrowserState* context) const override;
DISALLOW_COPY_AND_ASSIGN(WebViewProfileSyncServiceFactory);
};
} // namespace ios_web_view
#endif // IOS_WEB_VIEW_INTERNAL_SYNC_WEB_VIEW_PROFILE_SYNC_SERVICE_FACTORY_H_
// Copyright 2018 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.
#import "ios/web_view/internal/sync/web_view_profile_sync_service_factory.h"
#include <utility>
#include "base/memory/singleton.h"
#include "base/time/time.h"
#include "components/browser_sync/profile_sync_service.h"
#include "components/keyed_service/ios/browser_state_dependency_manager.h"
#include "components/signin/core/browser/profile_oauth2_token_service.h"
#include "components/signin/core/browser/signin_manager.h"
#include "components/sync/base/model_type.h"
#include "components/sync/driver/signin_manager_wrapper.h"
#include "components/sync/driver/startup_controller.h"
#include "components/sync/driver/sync_util.h"
#include "ios/web/public/web_thread.h"
#include "ios/web_view/internal/app/application_context.h"
#include "ios/web_view/internal/autofill/web_view_personal_data_manager_factory.h"
#include "ios/web_view/internal/passwords/web_view_password_store_factory.h"
#include "ios/web_view/internal/signin/ios_web_view_signin_client.h"
#include "ios/web_view/internal/signin/web_view_identity_manager_factory.h"
#include "ios/web_view/internal/signin/web_view_oauth2_token_service_factory.h"
#include "ios/web_view/internal/signin/web_view_signin_client_factory.h"
#include "ios/web_view/internal/signin/web_view_signin_manager_factory.h"
#import "ios/web_view/internal/sync/web_view_gcm_profile_service_factory.h"
#import "ios/web_view/internal/sync/web_view_model_type_store_service_factory.h"
#import "ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.h"
#import "ios/web_view/internal/sync/web_view_sync_client.h"
#include "ios/web_view/internal/web_view_browser_state.h"
#include "ios/web_view/internal/webdata_services/web_view_web_data_service_wrapper_factory.h"
#include "services/identity/public/cpp/identity_manager.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "url/gurl.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace ios_web_view {
using browser_sync::ProfileSyncService;
// static
WebViewProfileSyncServiceFactory*
WebViewProfileSyncServiceFactory::GetInstance() {
return base::Singleton<WebViewProfileSyncServiceFactory>::get();
}
// static
ProfileSyncService* WebViewProfileSyncServiceFactory::GetForBrowserState(
WebViewBrowserState* browser_state) {
return static_cast<ProfileSyncService*>(
GetInstance()->GetServiceForBrowserState(browser_state, true));
}
WebViewProfileSyncServiceFactory::WebViewProfileSyncServiceFactory()
: BrowserStateKeyedServiceFactory(
"ProfileSyncService",
BrowserStateDependencyManager::GetInstance()) {
// The ProfileSyncService depends on various SyncableServices being around
// when it is shut down. Specify those dependencies here to build the proper
// destruction order.
DependsOn(WebViewIdentityManagerFactory::GetInstance());
DependsOn(WebViewSigninManagerFactory::GetInstance());
DependsOn(WebViewOAuth2TokenServiceFactory::GetInstance());
DependsOn(WebViewSigninClientFactory::GetInstance());
DependsOn(WebViewPersonalDataManagerFactory::GetInstance());
DependsOn(WebViewWebDataServiceWrapperFactory::GetInstance());
DependsOn(WebViewPasswordStoreFactory::GetInstance());
DependsOn(WebViewGCMProfileServiceFactory::GetInstance());
DependsOn(WebViewProfileInvalidationProviderFactory::GetInstance());
DependsOn(WebViewModelTypeStoreServiceFactory::GetInstance());
}
WebViewProfileSyncServiceFactory::~WebViewProfileSyncServiceFactory() {}
std::unique_ptr<KeyedService>
WebViewProfileSyncServiceFactory::BuildServiceInstanceFor(
web::BrowserState* context) const {
WebViewBrowserState* browser_state =
WebViewBrowserState::FromBrowserState(context);
identity::IdentityManager* identity_manager =
WebViewIdentityManagerFactory::GetForBrowserState(browser_state);
SigninManagerBase* signin =
WebViewSigninManagerFactory::GetForBrowserState(browser_state);
IOSWebViewSigninClient* signin_client =
WebViewSigninClientFactory::GetForBrowserState(browser_state);
WebViewGCMProfileServiceFactory::GetForBrowserState(browser_state);
ProfileSyncService::InitParams init_params;
init_params.signin_wrapper =
std::make_unique<SigninManagerWrapper>(identity_manager, signin);
init_params.start_behavior = ProfileSyncService::MANUAL_START;
init_params.sync_client = std::make_unique<WebViewSyncClient>(browser_state);
init_params.url_request_context = browser_state->GetRequestContext();
init_params.url_loader_factory = browser_state->GetSharedURLLoaderFactory();
// ios/web_view has no need to update network time.
init_params.network_time_update_callback = base::DoNothing();
init_params.signin_scoped_device_id_callback =
base::BindRepeating(&IOSWebViewSigninClient::GetSigninScopedDeviceId,
base::Unretained(signin_client));
auto profile_sync_service =
std::make_unique<ProfileSyncService>(std::move(init_params));
// Will also initialize the sync client.
profile_sync_service->Initialize();
return profile_sync_service;
}
} // namespace ios_web_view
// Copyright 2018 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.
#ifndef IOS_WEB_VIEW_INTERNAL_SYNC_WEB_VIEW_SYNC_CLIENT_H_
#define IOS_WEB_VIEW_INTERNAL_SYNC_WEB_VIEW_SYNC_CLIENT_H_
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/single_thread_task_runner.h"
#include "components/sync/driver/sync_client.h"
namespace autofill {
class AutofillWebDataService;
} // namespace autofill
namespace password_manager {
class PasswordStore;
} // namespace password_manager
namespace syncer {
class SyncApiComponentFactory;
class SyncService;
} // namespace syncer
namespace ios_web_view {
class WebViewBrowserState;
class WebViewSyncClient : public syncer::SyncClient {
public:
WebViewSyncClient(WebViewBrowserState* browser_state);
~WebViewSyncClient() override;
// SyncClient implementation.
void Initialize() override;
syncer::SyncService* GetSyncService() override;
PrefService* GetPrefService() override;
base::FilePath GetLocalSyncBackendFolder() override;
syncer::ModelTypeStoreService* GetModelTypeStoreService() override;
bookmarks::BookmarkModel* GetBookmarkModel() override;
favicon::FaviconService* GetFaviconService() override;
history::HistoryService* GetHistoryService() override;
bool HasPasswordStore() override;
base::RepeatingClosure GetPasswordStateChangedCallback() override;
syncer::DataTypeController::TypeVector CreateDataTypeControllers(
syncer::LocalDeviceInfoProvider* local_device_info_provider) override;
autofill::PersonalDataManager* GetPersonalDataManager() override;
invalidation::InvalidationService* GetInvalidationService() override;
BookmarkUndoService* GetBookmarkUndoServiceIfExists() override;
scoped_refptr<syncer::ExtensionsActivity> GetExtensionsActivity() override;
sync_sessions::SyncSessionsClient* GetSyncSessionsClient() override;
base::WeakPtr<syncer::SyncableService> GetSyncableServiceForType(
syncer::ModelType type) override;
base::WeakPtr<syncer::ModelTypeControllerDelegate>
GetControllerDelegateForModelType(syncer::ModelType type) override;
scoped_refptr<syncer::ModelSafeWorker> CreateModelWorkerForGroup(
syncer::ModelSafeGroup group) override;
syncer::SyncApiComponentFactory* GetSyncApiComponentFactory() override;
private:
WebViewBrowserState* browser_state_ = nullptr;
scoped_refptr<autofill::AutofillWebDataService> profile_web_data_service_;
scoped_refptr<autofill::AutofillWebDataService> account_web_data_service_;
scoped_refptr<password_manager::PasswordStore> password_store_;
std::unique_ptr<syncer::SyncApiComponentFactory> component_factory_;
scoped_refptr<base::SingleThreadTaskRunner> db_thread_;
DISALLOW_COPY_AND_ASSIGN(WebViewSyncClient);
};
} // namespace ios_web_view
#endif // IOS_WEB_VIEW_INTERNAL_SYNC_WEB_VIEW_SYNC_CLIENT_H_
// Copyright 2018 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.
#import "ios/web_view/internal/sync/web_view_sync_client.h"
#include "base/command_line.h"
#include "base/logging.h"
#include "components/autofill/core/browser/webdata/autofill_profile_sync_bridge.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/autofill/core/common/autofill_features.h"
#include "components/browser_sync/browser_sync_switches.h"
#include "components/browser_sync/profile_sync_components_factory_impl.h"
#include "components/browser_sync/profile_sync_service.h"
#include "components/invalidation/impl/profile_invalidation_provider.h"
#include "components/keyed_service/core/service_access_type.h"
#include "components/password_manager/core/browser/password_store.h"
#include "components/password_manager/sync/browser/password_model_worker.h"
#include "components/sync/driver/sync_api_component_factory.h"
#include "components/sync/driver/sync_util.h"
#include "components/sync/engine/passive_model_worker.h"
#include "components/sync/engine/sequenced_model_worker.h"
#include "components/sync/engine/ui_model_worker.h"
#include "components/sync/user_events/user_event_service.h"
#include "components/version_info/version_info.h"
#include "components/version_info/version_string.h"
#include "ios/web/public/web_thread.h"
#include "ios/web_view/internal/autofill/web_view_personal_data_manager_factory.h"
#include "ios/web_view/internal/passwords/web_view_password_store_factory.h"
#include "ios/web_view/internal/pref_names.h"
#import "ios/web_view/internal/sync/web_view_model_type_store_service_factory.h"
#import "ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.h"
#import "ios/web_view/internal/sync/web_view_profile_sync_service_factory.h"
#include "ios/web_view/internal/web_view_browser_state.h"
#include "ios/web_view/internal/webdata_services/web_view_web_data_service_wrapper_factory.h"
#include "ui/base/device_form_factor.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace ios_web_view {
namespace {
syncer::ModelTypeSet GetDisabledTypes() {
syncer::ModelTypeSet disabled_types = syncer::UserSelectableTypes();
// Don't need to sync preferences.
disabled_types.Put(syncer::PRIORITY_PREFERENCES);
// Only want autofill and passwords.
disabled_types.Remove(syncer::AUTOFILL);
disabled_types.Remove(syncer::PASSWORDS);
return disabled_types;
}
} // namespace
WebViewSyncClient::WebViewSyncClient(WebViewBrowserState* browser_state)
: browser_state_(browser_state) {}
WebViewSyncClient::~WebViewSyncClient() {}
void WebViewSyncClient::Initialize() {
DCHECK_CURRENTLY_ON(web::WebThread::UI);
profile_web_data_service_ =
WebViewWebDataServiceWrapperFactory::GetAutofillWebDataForBrowserState(
browser_state_, ServiceAccessType::IMPLICIT_ACCESS);
account_web_data_service_ =
base::FeatureList::IsEnabled(
autofill::features::kAutofillEnableAccountWalletStorage)
? WebViewWebDataServiceWrapperFactory::GetAutofillWebDataForAccount(
browser_state_, ServiceAccessType::IMPLICIT_ACCESS)
: nullptr;
db_thread_ = profile_web_data_service_
? profile_web_data_service_->GetDBTaskRunner()
: nullptr;
password_store_ = WebViewPasswordStoreFactory::GetForBrowserState(
browser_state_, ServiceAccessType::IMPLICIT_ACCESS);
component_factory_.reset(new browser_sync::ProfileSyncComponentsFactoryImpl(
this, version_info::Channel::UNKNOWN, version_info::GetVersionNumber(),
ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET,
prefs::kSavingBrowserHistoryDisabled,
web::WebThread::GetTaskRunnerForThread(web::WebThread::UI), db_thread_,
profile_web_data_service_, account_web_data_service_, password_store_,
/*bookmark_sync_service=*/nullptr));
}
syncer::SyncService* WebViewSyncClient::GetSyncService() {
DCHECK_CURRENTLY_ON(web::WebThread::UI);
return WebViewProfileSyncServiceFactory::GetForBrowserState(browser_state_);
}
PrefService* WebViewSyncClient::GetPrefService() {
DCHECK_CURRENTLY_ON(web::WebThread::UI);
return browser_state_->GetPrefs();
}
base::FilePath WebViewSyncClient::GetLocalSyncBackendFolder() {
return base::FilePath();
}
syncer::ModelTypeStoreService* WebViewSyncClient::GetModelTypeStoreService() {
return WebViewModelTypeStoreServiceFactory::GetForBrowserState(
browser_state_);
}
bookmarks::BookmarkModel* WebViewSyncClient::GetBookmarkModel() {
return nullptr;
}
favicon::FaviconService* WebViewSyncClient::GetFaviconService() {
return nullptr;
}
history::HistoryService* WebViewSyncClient::GetHistoryService() {
return nullptr;
}
bool WebViewSyncClient::HasPasswordStore() {
return true;
}
autofill::PersonalDataManager* WebViewSyncClient::GetPersonalDataManager() {
DCHECK_CURRENTLY_ON(web::WebThread::UI);
return WebViewPersonalDataManagerFactory::GetForBrowserState(browser_state_);
}
base::RepeatingClosure WebViewSyncClient::GetPasswordStateChangedCallback() {
return base::BindRepeating(
&WebViewPasswordStoreFactory::OnPasswordsSyncedStatePotentiallyChanged,
base::Unretained(browser_state_));
}
syncer::DataTypeController::TypeVector
WebViewSyncClient::CreateDataTypeControllers(
syncer::LocalDeviceInfoProvider* local_device_info_provider) {
// The iOS port does not have any platform-specific datatypes.
return component_factory_->CreateCommonDataTypeControllers(
GetDisabledTypes(), local_device_info_provider);
}
BookmarkUndoService* WebViewSyncClient::GetBookmarkUndoServiceIfExists() {
return nullptr;
}
invalidation::InvalidationService* WebViewSyncClient::GetInvalidationService() {
invalidation::ProfileInvalidationProvider* provider =
WebViewProfileInvalidationProviderFactory::GetForBrowserState(
browser_state_);
if (provider) {
return provider->GetInvalidationService();
}
return nullptr;
}
scoped_refptr<syncer::ExtensionsActivity>
WebViewSyncClient::GetExtensionsActivity() {
return nullptr;
}
sync_sessions::SyncSessionsClient* WebViewSyncClient::GetSyncSessionsClient() {
return nullptr;
}
base::WeakPtr<syncer::SyncableService>
WebViewSyncClient::GetSyncableServiceForType(syncer::ModelType type) {
if (!profile_web_data_service_) {
NOTREACHED();
return base::WeakPtr<syncer::SyncableService>();
}
switch (type) {
case syncer::AUTOFILL_PROFILE:
return autofill::AutofillProfileSyncableService::FromWebDataService(
profile_web_data_service_.get())
->AsWeakPtr();
case syncer::AUTOFILL_WALLET_DATA:
return autofill::AutofillWalletSyncableService::FromWebDataService(
profile_web_data_service_.get())
->AsWeakPtr();
case syncer::AUTOFILL_WALLET_METADATA:
return autofill::AutofillWalletMetadataSyncableService::
FromWebDataService(profile_web_data_service_.get())
->AsWeakPtr();
case syncer::PASSWORDS:
return password_store_ ? password_store_->GetPasswordSyncableService()
: base::WeakPtr<syncer::SyncableService>();
default:
NOTREACHED();
return base::WeakPtr<syncer::SyncableService>();
}
}
base::WeakPtr<syncer::ModelTypeControllerDelegate>
WebViewSyncClient::GetControllerDelegateForModelType(syncer::ModelType type) {
switch (type) {
case syncer::DEVICE_INFO:
// TODO(crbug.com/872420): Distinguish ios/web_view from ios/chrome.
return WebViewProfileSyncServiceFactory::GetForBrowserState(
browser_state_)
->GetDeviceInfoSyncControllerDelegate();
default:
NOTREACHED();
// TODO(crbug.com/873790): Figure out if USER_CONSENTS need to be enabled.
return base::WeakPtr<syncer::ModelTypeControllerDelegate>();
}
}
scoped_refptr<syncer::ModelSafeWorker>
WebViewSyncClient::CreateModelWorkerForGroup(syncer::ModelSafeGroup group) {
DCHECK_CURRENTLY_ON(web::WebThread::UI);
switch (group) {
case syncer::GROUP_DB:
return new syncer::SequencedModelWorker(db_thread_, syncer::GROUP_DB);
case syncer::GROUP_UI:
return new syncer::UIModelWorker(
web::WebThread::GetTaskRunnerForThread(web::WebThread::UI));
case syncer::GROUP_PASSIVE:
return new syncer::PassiveModelWorker();
case syncer::GROUP_PASSWORD:
if (!password_store_)
return nullptr;
return new browser_sync::PasswordModelWorker(password_store_);
default:
return nullptr;
}
}
syncer::SyncApiComponentFactory*
WebViewSyncClient::GetSyncApiComponentFactory() {
return component_factory_.get();
}
} // namespace ios_web_view
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include "components/prefs/pref_filter.h" #include "components/prefs/pref_filter.h"
#include "components/prefs/pref_service_factory.h" #include "components/prefs/pref_service_factory.h"
#include "components/signin/ios/browser/active_state_manager.h" #include "components/signin/ios/browser/active_state_manager.h"
#include "components/sync/base/pref_names.h"
#include "components/sync/base/sync_prefs.h"
#include "components/translate/core/browser/translate_pref_names.h" #include "components/translate/core/browser/translate_pref_names.h"
#include "components/translate/core/browser/translate_prefs.h" #include "components/translate/core/browser/translate_prefs.h"
#include "ios/web/public/web_thread.h" #include "ios/web/public/web_thread.h"
...@@ -42,7 +44,9 @@ ...@@ -42,7 +44,9 @@
#include "ios/web_view/internal/signin/web_view_signin_error_controller_factory.h" #include "ios/web_view/internal/signin/web_view_signin_error_controller_factory.h"
#include "ios/web_view/internal/signin/web_view_signin_manager_factory.h" #include "ios/web_view/internal/signin/web_view_signin_manager_factory.h"
#import "ios/web_view/internal/sync/web_view_gcm_profile_service_factory.h" #import "ios/web_view/internal/sync/web_view_gcm_profile_service_factory.h"
#import "ios/web_view/internal/sync/web_view_model_type_store_service_factory.h"
#import "ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.h" #import "ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.h"
#import "ios/web_view/internal/sync/web_view_profile_sync_service_factory.h"
#include "ios/web_view/internal/translate/web_view_translate_accept_languages_factory.h" #include "ios/web_view/internal/translate/web_view_translate_accept_languages_factory.h"
#include "ios/web_view/internal/translate/web_view_translate_ranker_factory.h" #include "ios/web_view/internal/translate/web_view_translate_ranker_factory.h"
#include "ios/web_view/internal/web_view_url_request_context_getter.h" #include "ios/web_view/internal/web_view_url_request_context_getter.h"
...@@ -160,6 +164,8 @@ void WebViewBrowserState::RegisterPrefs( ...@@ -160,6 +164,8 @@ void WebViewBrowserState::RegisterPrefs(
pref_registry->RegisterStringPref(prefs::kAcceptLanguages, pref_registry->RegisterStringPref(prefs::kAcceptLanguages,
l10n_util::GetLocaleOverride()); l10n_util::GetLocaleOverride());
pref_registry->RegisterBooleanPref(prefs::kOfferTranslateEnabled, true); pref_registry->RegisterBooleanPref(prefs::kOfferTranslateEnabled, true);
pref_registry->RegisterBooleanPref(prefs::kSavingBrowserHistoryDisabled,
true);
translate::TranslatePrefs::RegisterProfilePrefs(pref_registry); translate::TranslatePrefs::RegisterProfilePrefs(pref_registry);
#if BUILDFLAG(IOS_WEB_VIEW_ENABLE_AUTOFILL) #if BUILDFLAG(IOS_WEB_VIEW_ENABLE_AUTOFILL)
...@@ -169,6 +175,7 @@ void WebViewBrowserState::RegisterPrefs( ...@@ -169,6 +175,7 @@ void WebViewBrowserState::RegisterPrefs(
#if BUILDFLAG(IOS_WEB_VIEW_ENABLE_SYNC) #if BUILDFLAG(IOS_WEB_VIEW_ENABLE_SYNC)
gcm::GCMChannelStatusSyncer::RegisterProfilePrefs(pref_registry); gcm::GCMChannelStatusSyncer::RegisterProfilePrefs(pref_registry);
syncer::SyncPrefs::RegisterProfilePrefs(pref_registry);
#endif // BUILDFLAG(IOS_WEB_VIEW_ENABLE_SYNC) #endif // BUILDFLAG(IOS_WEB_VIEW_ENABLE_SYNC)
// Instantiate all factories to setup dependency graph for pref registration. // Instantiate all factories to setup dependency graph for pref registration.
...@@ -197,6 +204,8 @@ void WebViewBrowserState::RegisterPrefs( ...@@ -197,6 +204,8 @@ void WebViewBrowserState::RegisterPrefs(
WebViewIdentityManagerFactory::GetInstance(); WebViewIdentityManagerFactory::GetInstance();
WebViewGCMProfileServiceFactory::GetInstance(); WebViewGCMProfileServiceFactory::GetInstance();
WebViewProfileInvalidationProviderFactory::GetInstance(); WebViewProfileInvalidationProviderFactory::GetInstance();
WebViewProfileSyncServiceFactory::GetInstance();
WebViewModelTypeStoreServiceFactory::GetInstance();
#endif // BUILDFLAG(IOS_WEB_VIEW_ENABLE_SYNC) #endif // BUILDFLAG(IOS_WEB_VIEW_ENABLE_SYNC)
BrowserStateDependencyManager::GetInstance() BrowserStateDependencyManager::GetInstance()
......
...@@ -41,6 +41,16 @@ WebViewWebDataServiceWrapperFactory::GetAutofillWebDataForBrowserState( ...@@ -41,6 +41,16 @@ WebViewWebDataServiceWrapperFactory::GetAutofillWebDataForBrowserState(
return wrapper ? wrapper->GetProfileAutofillWebData() : nullptr; return wrapper ? wrapper->GetProfileAutofillWebData() : nullptr;
} }
// static
scoped_refptr<autofill::AutofillWebDataService>
WebViewWebDataServiceWrapperFactory::GetAutofillWebDataForAccount(
WebViewBrowserState* browser_state,
ServiceAccessType access_type) {
WebDataServiceWrapper* wrapper =
GetForBrowserState(browser_state, access_type);
return wrapper ? wrapper->GetAccountAutofillWebData() : nullptr;
}
// static // static
scoped_refptr<TokenWebData> scoped_refptr<TokenWebData>
WebViewWebDataServiceWrapperFactory::GetTokenWebDataForBrowserState( WebViewWebDataServiceWrapperFactory::GetTokenWebDataForBrowserState(
......
...@@ -46,6 +46,12 @@ class WebViewWebDataServiceWrapperFactory ...@@ -46,6 +46,12 @@ class WebViewWebDataServiceWrapperFactory
GetAutofillWebDataForBrowserState(WebViewBrowserState* browser_state, GetAutofillWebDataForBrowserState(WebViewBrowserState* browser_state,
ServiceAccessType access_type); ServiceAccessType access_type);
// Returns the account-scoped AutofillWebDataService associated with the
// |browser_state|.
static scoped_refptr<autofill::AutofillWebDataService>
GetAutofillWebDataForAccount(WebViewBrowserState* browser_state,
ServiceAccessType access_type);
// Returns the TokenWebData associated with |browser_state|. // Returns the TokenWebData associated with |browser_state|.
static scoped_refptr<TokenWebData> GetTokenWebDataForBrowserState( static scoped_refptr<TokenWebData> GetTokenWebDataForBrowserState(
WebViewBrowserState* browser_state, WebViewBrowserState* browser_state,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment