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 #ifndef CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_FACTORY_H_
      6 #define CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_FACTORY_H_
      7 
      8 #include "base/memory/singleton.h"
      9 #include "base/observer_list.h"
     10 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
     11 
     12 class SigninManager;
     13 class SigninManagerBase;
     14 class PrefRegistrySimple;
     15 class Profile;
     16 
     17 // Singleton that owns all SigninManagers and associates them with
     18 // Profiles. Listens for the Profile's destruction notification and cleans up
     19 // the associated SigninManager.
     20 class SigninManagerFactory : public BrowserContextKeyedServiceFactory {
     21  public:
     22   class Observer {
     23    public:
     24     // Called when a SigninManager(Base) instance is created.
     25     virtual void SigninManagerCreated(SigninManagerBase* manager) {}
     26 
     27     // Called when a SigninManager(Base) instance is being shut down. Observers
     28     // of |manager| should remove themselves at this point.
     29     virtual void SigninManagerShutdown(SigninManagerBase* manager) {}
     30 
     31    protected:
     32     virtual ~Observer() {}
     33   };
     34 
     35 #if defined(OS_CHROMEOS)
     36   // Returns the instance of SigninManager associated with this profile
     37   // (creating one if none exists). Returns NULL if this profile cannot have a
     38   // SigninManager (for example, if |profile| is incognito).
     39   static SigninManagerBase* GetForProfile(Profile* profile);
     40 
     41   // Returns the instance of SigninManager associated with this profile. Returns
     42   // null if no SigninManager instance currently exists (will not create a new
     43   // instance).
     44   static SigninManagerBase* GetForProfileIfExists(Profile* profile);
     45 #else
     46   // On non-ChromeOS platforms, the SigninManager the factory creates will be
     47   // an instance of the extended SigninManager class.
     48   static SigninManager* GetForProfile(Profile* profile);
     49   static SigninManager* GetForProfileIfExists(Profile* profile);
     50 #endif
     51 
     52   // Returns an instance of the SigninManagerFactory singleton.
     53   static SigninManagerFactory* GetInstance();
     54 
     55   // Implementation of BrowserContextKeyedServiceFactory (public so tests
     56   // can call it).
     57   virtual void RegisterProfilePrefs(
     58       user_prefs::PrefRegistrySyncable* registry) OVERRIDE;
     59 
     60   // Registers the browser-global prefs used by SigninManager.
     61   static void RegisterPrefs(PrefRegistrySimple* registry);
     62 
     63   // Methods to register or remove observers of SigninManager creation/shutdown.
     64   void AddObserver(Observer* observer);
     65   void RemoveObserver(Observer* observer);
     66 
     67   // Notifies observers of |manager|'s creation. Should be called only by test
     68   // SigninManager subclasses whose construction does not occur in
     69   // |BuildServiceInstanceFor()|.
     70   void NotifyObserversOfSigninManagerCreationForTesting(
     71       SigninManagerBase* manager);
     72 
     73  private:
     74   friend struct DefaultSingletonTraits<SigninManagerFactory>;
     75 
     76   SigninManagerFactory();
     77   virtual ~SigninManagerFactory();
     78 
     79 #if defined(OS_MACOSX)
     80   // List of observers. Does not check that list is empty on destruction, as
     81   // there are some leaky singletons that observe the SigninManagerFactory.
     82   mutable ObserverList<Observer> observer_list_;
     83 #else
     84   // List of observers. Checks that list is empty on destruction.
     85   mutable ObserverList<Observer, true> observer_list_;
     86 #endif
     87 
     88   // BrowserContextKeyedServiceFactory:
     89   virtual KeyedService* BuildServiceInstanceFor(
     90       content::BrowserContext* profile) const OVERRIDE;
     91   virtual void BrowserContextShutdown(content::BrowserContext* context)
     92       OVERRIDE;
     93 };
     94 
     95 #endif  // CHROME_BROWSER_SIGNIN_SIGNIN_MANAGER_FACTORY_H_
     96