1// Copyright 2014 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_KEYED_SERVICE_CONTENT_REFCOUNTED_BROWSER_CONTEXT_KEYED_SERVICE_FACTORY_H_
6#define COMPONENTS_KEYED_SERVICE_CONTENT_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/keyed_service/content/browser_context_keyed_service_factory.h"
12#include "components/keyed_service/content/refcounted_browser_context_keyed_service.h"
13#include "components/keyed_service/core/keyed_service_export.h"
14
15class RefcountedBrowserContextKeyedService;
16
17namespace content {
18class 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.
30class KEYED_SERVICE_EXPORT RefcountedBrowserContextKeyedServiceFactory
31    : public BrowserContextKeyedBaseFactory {
32 public:
33  // A function that supplies the instance of a KeyedService for a given
34  // BrowserContext. This is used primarily for testing, where we want to feed
35  // a specific mock into the BCKSF system.
36  typedef scoped_refptr<RefcountedBrowserContextKeyedService>(
37      *TestingFactoryFunction)(content::BrowserContext* context);
38
39  // Associates |factory| with |context| so that |factory| is used to create
40  // the KeyedService when requested.  |factory| can be NULL to signal that
41  // KeyedService should be NULL. Multiple calls to SetTestingFactory() are
42  // allowed; previous services will be shut down.
43  void SetTestingFactory(content::BrowserContext* context,
44                         TestingFactoryFunction factory);
45
46  // Associates |factory| with |context| and immediately returns the created
47  // KeyedService. Since the factory will be used immediately, it may not be
48  // NULL.
49  scoped_refptr<RefcountedBrowserContextKeyedService> SetTestingFactoryAndUse(
50      content::BrowserContext* context,
51      TestingFactoryFunction factory);
52
53 protected:
54  RefcountedBrowserContextKeyedServiceFactory(
55      const char* name,
56      BrowserContextDependencyManager* manager);
57  virtual ~RefcountedBrowserContextKeyedServiceFactory();
58
59  scoped_refptr<RefcountedBrowserContextKeyedService>
60      GetServiceForBrowserContext(content::BrowserContext* context,
61                                  bool create);
62
63  // Maps |context| to |service| with debug checks to prevent duplication.
64  void Associate(
65      content::BrowserContext* context,
66      const scoped_refptr<RefcountedBrowserContextKeyedService>& service);
67
68  // All subclasses of RefcountedBrowserContextKeyedServiceFactory must return
69  // a RefcountedBrowserContextKeyedService instead of just
70  // a BrowserContextKeyedBase.
71  virtual scoped_refptr<RefcountedBrowserContextKeyedService>
72      BuildServiceInstanceFor(content::BrowserContext* context) const = 0;
73
74  virtual void BrowserContextShutdown(content::BrowserContext* context)
75      OVERRIDE;
76  virtual void BrowserContextDestroyed(content::BrowserContext* context)
77      OVERRIDE;
78  virtual void SetEmptyTestingFactory(content::BrowserContext* context)
79      OVERRIDE;
80  virtual bool HasTestingFactory(content::BrowserContext* context) OVERRIDE;
81  virtual void CreateServiceNow(content::BrowserContext* context) OVERRIDE;
82
83 private:
84  typedef std::map<content::BrowserContext*,
85                   scoped_refptr<RefcountedBrowserContextKeyedService> >
86      RefCountedStorage;
87  typedef std::map<content::BrowserContext*, TestingFactoryFunction>
88      BrowserContextOverriddenTestingFunctions;
89
90  // The mapping between a BrowserContext and its refcounted service.
91  RefCountedStorage mapping_;
92
93  // The mapping between a BrowserContext and its overridden
94  // TestingFactoryFunction.
95  BrowserContextOverriddenTestingFunctions testing_factories_;
96
97  DISALLOW_COPY_AND_ASSIGN(RefcountedBrowserContextKeyedServiceFactory);
98};
99
100#endif  // COMPONENTS_KEYED_SERVICE_CONTENT_REFCOUNTED_BROWSER_CONTEXT_KEYED_SERVICE_FACTORY_H_
101