signin_manager_factory.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/signin/signin_manager_factory.h" 6 7#include "base/prefs/pref_registry_simple.h" 8#include "chrome/browser/browser_process.h" 9#include "chrome/browser/profiles/profile.h" 10#include "chrome/browser/signin/chrome_signin_client_factory.h" 11#include "chrome/browser/signin/local_auth.h" 12#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 13#include "chrome/common/pref_names.h" 14#include "components/keyed_service/content/browser_context_dependency_manager.h" 15#include "components/pref_registry/pref_registry_syncable.h" 16#include "components/signin/core/browser/signin_manager.h" 17 18SigninManagerFactory::SigninManagerFactory() 19 : BrowserContextKeyedServiceFactory( 20 "SigninManager", 21 BrowserContextDependencyManager::GetInstance()) { 22 DependsOn(ChromeSigninClientFactory::GetInstance()); 23 DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance()); 24} 25 26SigninManagerFactory::~SigninManagerFactory() { 27#if defined(OS_MACOSX) 28 // Check that the number of remaining observers is as expected. Mac has a 29 // known issue wherein there might be a remaining observer 30 // (UIAppListViewDelegate). 31 int num_observers = 0; 32 if (observer_list_.might_have_observers()) { 33 ObserverListBase<SigninManagerFactory::Observer>::Iterator it( 34 observer_list_); 35 while (it.GetNext()) { 36 num_observers++; 37 } 38 } 39 DCHECK_LE(num_observers, 1); 40#endif // defined(OS_MACOSX) 41} 42 43#if defined(OS_CHROMEOS) 44// static 45SigninManagerBase* SigninManagerFactory::GetForProfileIfExists( 46 Profile* profile) { 47 return static_cast<SigninManagerBase*>( 48 GetInstance()->GetServiceForBrowserContext(profile, false)); 49} 50 51// static 52SigninManagerBase* SigninManagerFactory::GetForProfile( 53 Profile* profile) { 54 return static_cast<SigninManagerBase*>( 55 GetInstance()->GetServiceForBrowserContext(profile, true)); 56} 57 58#else 59// static 60SigninManager* SigninManagerFactory::GetForProfile(Profile* profile) { 61 return static_cast<SigninManager*>( 62 GetInstance()->GetServiceForBrowserContext(profile, true)); 63} 64 65// static 66SigninManager* SigninManagerFactory::GetForProfileIfExists(Profile* profile) { 67 return static_cast<SigninManager*>( 68 GetInstance()->GetServiceForBrowserContext(profile, false)); 69} 70#endif 71 72// static 73SigninManagerFactory* SigninManagerFactory::GetInstance() { 74 return Singleton<SigninManagerFactory>::get(); 75} 76 77void SigninManagerFactory::RegisterProfilePrefs( 78 user_prefs::PrefRegistrySyncable* registry) { 79 registry->RegisterStringPref( 80 prefs::kGoogleServicesLastUsername, 81 std::string(), 82 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 83 registry->RegisterStringPref( 84 prefs::kGoogleServicesUserAccountId, 85 std::string(), 86 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 87 registry->RegisterStringPref( 88 prefs::kGoogleServicesUsername, 89 std::string(), 90 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 91 registry->RegisterBooleanPref( 92 prefs::kAutologinEnabled, 93 true, 94 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 95 registry->RegisterBooleanPref( 96 prefs::kReverseAutologinEnabled, 97 true, 98 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 99 registry->RegisterListPref(prefs::kReverseAutologinRejectedEmailList, 100 new base::ListValue, 101 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 102 chrome::RegisterLocalAuthPrefs(registry); 103} 104 105// static 106void SigninManagerFactory::RegisterPrefs(PrefRegistrySimple* registry) { 107 registry->RegisterStringPref(prefs::kGoogleServicesUsernamePattern, 108 std::string()); 109} 110 111void SigninManagerFactory::AddObserver(Observer* observer) { 112 observer_list_.AddObserver(observer); 113} 114 115void SigninManagerFactory::RemoveObserver(Observer* observer) { 116 observer_list_.RemoveObserver(observer); 117} 118 119void SigninManagerFactory::NotifyObserversOfSigninManagerCreationForTesting( 120 SigninManagerBase* manager) { 121 FOR_EACH_OBSERVER(Observer, observer_list_, SigninManagerCreated(manager)); 122} 123 124KeyedService* SigninManagerFactory::BuildServiceInstanceFor( 125 content::BrowserContext* context) const { 126 SigninManagerBase* service = NULL; 127 Profile* profile = static_cast<Profile*>(context); 128 SigninClient* client = 129 ChromeSigninClientFactory::GetInstance()->GetForProfile(profile); 130#if defined(OS_CHROMEOS) 131 service = new SigninManagerBase(client); 132#else 133 service = new SigninManager( 134 client, ProfileOAuth2TokenServiceFactory::GetForProfile(profile)); 135#endif 136 service->Initialize(g_browser_process->local_state()); 137 FOR_EACH_OBSERVER(Observer, observer_list_, SigninManagerCreated(service)); 138 return service; 139} 140 141void SigninManagerFactory::BrowserContextShutdown( 142 content::BrowserContext* context) { 143 SigninManagerBase* manager = static_cast<SigninManagerBase*>( 144 GetServiceForBrowserContext(context, false)); 145 if (manager) 146 FOR_EACH_OBSERVER(Observer, observer_list_, SigninManagerShutdown(manager)); 147 BrowserContextKeyedServiceFactory::BrowserContextShutdown(context); 148} 149