Home | History | Annotate | Download | only in browser_context_keyed_service
      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 COMPONENTS_BROWSER_CONTEXT_KEYED_SERVICE_REFCOUNTED_BROWSER_CONTEXT_KEYED_SERVICE_FACTORY_H_
      6 #define COMPONENTS_BROWSER_CONTEXT_KEYED_SERVICE_REFCOUNTED_BROWSER_CONTEXT_KEYED_SERVICE_FACTORY_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/compiler_specific.h"
     10 #include "base/memory/ref_counted.h"
     11 #include "components/browser_context_keyed_service/browser_context_keyed_service_factory.h"
     12 #include "components/browser_context_keyed_service/browser_context_keyed_service_export.h"
     13 #include "components/browser_context_keyed_service/refcounted_browser_context_keyed_service.h"
     14 
     15 class RefcountedBrowserContextKeyedService;
     16 
     17 namespace content {
     18 class BrowserContext;
     19 }
     20 
     21 // A specialized BrowserContextKeyedServiceFactory that manages a
     22 // RefcountedThreadSafe<>.
     23 //
     24 // While the factory returns RefcountedThreadSafe<>s, the factory itself is a
     25 // base::NotThreadSafe. Only call methods on this object on the UI thread.
     26 //
     27 // Implementers of RefcountedBrowserContextKeyedService should note that
     28 // we guarantee that ShutdownOnUIThread() is called on the UI thread, but actual
     29 // object destruction can happen anywhere.
     30 class BROWSER_CONTEXT_KEYED_SERVICE_EXPORT
     31 RefcountedBrowserContextKeyedServiceFactory
     32     : public BrowserContextKeyedBaseFactory {
     33  public:
     34   // A function that supplies the instance of a BrowserContextKeyedService for
     35   // a given BrowserContext. This is used primarily for testing, where we want
     36   // to feed a specific mock into the BCKSF system.
     37   typedef scoped_refptr<RefcountedBrowserContextKeyedService>
     38       (*FactoryFunction)(content::BrowserContext* context);
     39 
     40   // Associates |factory| with |context| so that |factory| is used to create
     41   // the BrowserContextKeyedService when requested.  |factory| can be NULL
     42   // to signal that BrowserContextKeyedService should be NULL. Multiple calls to
     43   // SetTestingFactory() are allowed; previous services will be shut down.
     44   void SetTestingFactory(content::BrowserContext* context,
     45                          FactoryFunction factory);
     46 
     47   // Associates |factory| with |context| and immediately returns the created
     48   // BrowserContextKeyedService. Since the factory will be used immediately,
     49   // it may not be NULL.
     50   scoped_refptr<RefcountedBrowserContextKeyedService> SetTestingFactoryAndUse(
     51       content::BrowserContext* context,
     52       FactoryFunction factory);
     53 
     54  protected:
     55   RefcountedBrowserContextKeyedServiceFactory(
     56       const char* name,
     57       BrowserContextDependencyManager* manager);
     58   virtual ~RefcountedBrowserContextKeyedServiceFactory();
     59 
     60   scoped_refptr<RefcountedBrowserContextKeyedService>
     61       GetServiceForBrowserContext(
     62           content::BrowserContext* context,
     63           bool create);
     64 
     65   // Maps |context| to |service| with debug checks to prevent duplication.
     66   void Associate(
     67       content::BrowserContext* context,
     68       const scoped_refptr<RefcountedBrowserContextKeyedService>& service);
     69 
     70   // All subclasses of RefcountedBrowserContextKeyedServiceFactory must return
     71   // a RefcountedBrowserContextKeyedService instead of just
     72   // a BrowserContextKeyedBase.
     73   virtual scoped_refptr<RefcountedBrowserContextKeyedService>
     74       BuildServiceInstanceFor(content::BrowserContext* context) const = 0;
     75 
     76   virtual void BrowserContextShutdown(
     77       content::BrowserContext* context) OVERRIDE;
     78   virtual void BrowserContextDestroyed(
     79       content::BrowserContext* context) OVERRIDE;
     80   virtual void SetEmptyTestingFactory(
     81       content::BrowserContext* context) OVERRIDE;
     82   virtual void CreateServiceNow(content::BrowserContext* context) OVERRIDE;
     83 
     84  private:
     85   typedef std::map<content::BrowserContext*,
     86                    scoped_refptr<RefcountedBrowserContextKeyedService> >
     87       RefCountedStorage;
     88   typedef std::map<content::BrowserContext*,
     89                    FactoryFunction> BrowserContextOverriddenFunctions;
     90 
     91   // The mapping between a BrowserContext and its refcounted service.
     92   RefCountedStorage mapping_;
     93 
     94   // The mapping between a BrowserContext and its overridden FactoryFunction.
     95   BrowserContextOverriddenFunctions factories_;
     96 
     97   DISALLOW_COPY_AND_ASSIGN(RefcountedBrowserContextKeyedServiceFactory);
     98 };
     99 
    100 #endif  // COMPONENTS_BROWSER_CONTEXT_KEYED_SERVICE_REFCOUNTED_BROWSER_CONTEXT_KEYED_SERVICE_FACTORY_H_
    101