Home | History | Annotate | Download | only in signin
      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 
     18 SigninManagerFactory::SigninManagerFactory()
     19     : BrowserContextKeyedServiceFactory(
     20         "SigninManager",
     21         BrowserContextDependencyManager::GetInstance()) {
     22   DependsOn(ChromeSigninClientFactory::GetInstance());
     23   DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance());
     24 }
     25 
     26 SigninManagerFactory::~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
     45 SigninManagerBase* SigninManagerFactory::GetForProfileIfExists(
     46     Profile* profile) {
     47   return static_cast<SigninManagerBase*>(
     48       GetInstance()->GetServiceForBrowserContext(profile, false));
     49 }
     50 
     51 // static
     52 SigninManagerBase* SigninManagerFactory::GetForProfile(
     53     Profile* profile) {
     54   return static_cast<SigninManagerBase*>(
     55       GetInstance()->GetServiceForBrowserContext(profile, true));
     56 }
     57 
     58 #else
     59 // static
     60 SigninManager* SigninManagerFactory::GetForProfile(Profile* profile) {
     61   return static_cast<SigninManager*>(
     62       GetInstance()->GetServiceForBrowserContext(profile, true));
     63 }
     64 
     65 // static
     66 SigninManager* SigninManagerFactory::GetForProfileIfExists(Profile* profile) {
     67   return static_cast<SigninManager*>(
     68       GetInstance()->GetServiceForBrowserContext(profile, false));
     69 }
     70 #endif
     71 
     72 // static
     73 SigninManagerFactory* SigninManagerFactory::GetInstance() {
     74   return Singleton<SigninManagerFactory>::get();
     75 }
     76 
     77 void 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
    106 void SigninManagerFactory::RegisterPrefs(PrefRegistrySimple* registry) {
    107   registry->RegisterStringPref(prefs::kGoogleServicesUsernamePattern,
    108                                std::string());
    109 }
    110 
    111 void SigninManagerFactory::AddObserver(Observer* observer) {
    112   observer_list_.AddObserver(observer);
    113 }
    114 
    115 void SigninManagerFactory::RemoveObserver(Observer* observer) {
    116   observer_list_.RemoveObserver(observer);
    117 }
    118 
    119 void SigninManagerFactory::NotifyObserversOfSigninManagerCreationForTesting(
    120     SigninManagerBase* manager) {
    121   FOR_EACH_OBSERVER(Observer, observer_list_, SigninManagerCreated(manager));
    122 }
    123 
    124 KeyedService* 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 
    141 void 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