diff options
Diffstat (limited to 'chromium/chrome/browser/signin/identity_manager_factory.cc')
-rw-r--r-- | chromium/chrome/browser/signin/identity_manager_factory.cc | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/chromium/chrome/browser/signin/identity_manager_factory.cc b/chromium/chrome/browser/signin/identity_manager_factory.cc new file mode 100644 index 00000000000..cac771bf1e2 --- /dev/null +++ b/chromium/chrome/browser/signin/identity_manager_factory.cc @@ -0,0 +1,171 @@ +// Copyright 2017 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/signin/identity_manager_factory.h" + +#include <memory> +#include <utility> + +#include "base/files/file_path.h" +#include "build/build_config.h" +#include "build/chromeos_buildflags.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/image_fetcher/image_decoder_impl.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/signin/account_consistency_mode_manager.h" +#include "chrome/browser/signin/chrome_signin_client_factory.h" +#include "chrome/browser/signin/identity_manager_provider.h" +#include "components/keyed_service/content/browser_context_dependency_manager.h" +#include "components/keyed_service/core/keyed_service.h" +#include "components/pref_registry/pref_registry_syncable.h" +#include "components/signin/public/base/signin_buildflags.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "components/signin/public/identity_manager/identity_manager_builder.h" +#include "components/signin/public/webdata/token_web_data.h" +#include "content/public/browser/network_service_instance.h" + +#if BUILDFLAG(ENABLE_DICE_SUPPORT) +#include "chrome/browser/content_settings/cookie_settings_factory.h" +#include "chrome/browser/web_data_service_factory.h" +#include "components/content_settings/core/browser/cookie_settings.h" +#include "components/keyed_service/core/service_access_type.h" +#include "components/signin/core/browser/cookie_settings_util.h" +#endif + +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "chrome/browser/ash/profiles/profile_helper.h" +#include "chrome/browser/browser_process_platform_part.h" +#include "components/account_manager_core/chromeos/account_manager_facade_factory.h" +#endif + +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chrome/browser/lacros/account_manager/profile_account_manager.h" +#include "chrome/browser/lacros/account_manager/profile_account_manager_factory.h" +#include "components/account_manager_core/chromeos/account_manager_facade_factory.h" +#endif + +#if defined(OS_WIN) +#include "base/bind.h" +#include "chrome/browser/signin/signin_util_win.h" +#endif + +void IdentityManagerFactory::RegisterProfilePrefs( + user_prefs::PrefRegistrySyncable* registry) { + signin::IdentityManager::RegisterProfilePrefs(registry); +} + +IdentityManagerFactory::IdentityManagerFactory() + : BrowserContextKeyedServiceFactory( + "IdentityManager", + BrowserContextDependencyManager::GetInstance()) { +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + DependsOn(WebDataServiceFactory::GetInstance()); +#endif +#if BUILDFLAG(IS_CHROMEOS_LACROS) + DependsOn(ProfileAccountManagerFactory::GetInstance()); +#endif + DependsOn(ChromeSigninClientFactory::GetInstance()); + signin::SetIdentityManagerProvider( + base::BindRepeating([](content::BrowserContext* context) { + return GetForProfile(Profile::FromBrowserContext(context)); + })); +} + +IdentityManagerFactory::~IdentityManagerFactory() { + signin::SetIdentityManagerProvider({}); +} + +// static +signin::IdentityManager* IdentityManagerFactory::GetForProfile( + Profile* profile) { + return static_cast<signin::IdentityManager*>( + GetInstance()->GetServiceForBrowserContext(profile, true)); +} + +// static +signin::IdentityManager* IdentityManagerFactory::GetForProfileIfExists( + const Profile* profile) { + return static_cast<signin::IdentityManager*>( + GetInstance()->GetServiceForBrowserContext(const_cast<Profile*>(profile), + false)); +} + +// static +IdentityManagerFactory* IdentityManagerFactory::GetInstance() { + return base::Singleton<IdentityManagerFactory>::get(); +} + +// static +void IdentityManagerFactory::EnsureFactoryAndDependeeFactoriesBuilt() { + IdentityManagerFactory::GetInstance(); + ChromeSigninClientFactory::GetInstance(); +} + +void IdentityManagerFactory::AddObserver(Observer* observer) { + observer_list_.AddObserver(observer); +} + +void IdentityManagerFactory::RemoveObserver(Observer* observer) { + observer_list_.RemoveObserver(observer); +} + +KeyedService* IdentityManagerFactory::BuildServiceInstanceFor( + content::BrowserContext* context) const { + Profile* profile = Profile::FromBrowserContext(context); + + signin::IdentityManagerBuildParams params; + params.account_consistency = + AccountConsistencyModeManager::GetMethodForProfile(profile), + params.image_decoder = std::make_unique<ImageDecoderImpl>(); + params.local_state = g_browser_process->local_state(); + params.network_connection_tracker = content::GetNetworkConnectionTracker(); + params.pref_service = profile->GetPrefs(); + params.profile_path = profile->GetPath(); + params.signin_client = ChromeSigninClientFactory::GetForProfile(profile); + +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + params.delete_signin_cookies_on_exit = + signin::SettingsDeleteSigninCookiesOnExit( + CookieSettingsFactory::GetForProfile(profile).get()); + params.token_web_data = WebDataServiceFactory::GetTokenWebDataForProfile( + profile, ServiceAccessType::EXPLICIT_ACCESS); +#endif + +#if BUILDFLAG(IS_CHROMEOS_ASH) + params.account_manager_facade = + GetAccountManagerFacade(profile->GetPath().value()); + params.is_regular_profile = + chromeos::ProfileHelper::IsRegularProfile(profile); +#endif + +#if BUILDFLAG(IS_CHROMEOS_LACROS) + // The system and (original profile of the) guest profiles are not regular. + const bool is_regular_profile = profile->IsRegularProfile(); + const bool use_profile_account_manager = + is_regular_profile && + // `ProfileManager` may be null in tests, and is required for account + // consistency. + g_browser_process->profile_manager(); + + params.account_manager_facade = + use_profile_account_manager + ? ProfileAccountManagerFactory::GetForProfile(profile) + : GetAccountManagerFacade(profile->GetPath().value()); + params.is_regular_profile = is_regular_profile; +#endif + +#if defined(OS_WIN) + params.reauth_callback = + base::BindRepeating(&signin_util::ReauthWithCredentialProviderIfPossible, + base::Unretained(profile)); +#endif + + std::unique_ptr<signin::IdentityManager> identity_manager = + signin::BuildIdentityManager(¶ms); + + for (Observer& observer : observer_list_) + observer.IdentityManagerCreated(identity_manager.get()); + + return identity_manager.release(); +} |