• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_BROWSER_CONTEXT_DEPENDENCY_MANAGER_H_
6 #define COMPONENTS_KEYED_SERVICE_CONTENT_BROWSER_CONTEXT_DEPENDENCY_MANAGER_H_
7 
8 #include "base/callback_forward.h"
9 #include "base/callback_list.h"
10 #include "base/memory/singleton.h"
11 #include "components/keyed_service/core/dependency_graph.h"
12 #include "components/keyed_service/core/keyed_service_export.h"
13 
14 #ifndef NDEBUG
15 #include <set>
16 #endif
17 
18 class BrowserContextKeyedBaseFactory;
19 
20 namespace content {
21 class BrowserContext;
22 }
23 
24 namespace user_prefs {
25 class PrefRegistrySyncable;
26 }
27 
28 // A singleton that listens for context destruction notifications and
29 // rebroadcasts them to each BrowserContextKeyedBaseFactory in a safe order
30 // based on the stated dependencies by each service.
31 class KEYED_SERVICE_EXPORT BrowserContextDependencyManager {
32  public:
33   // Adds/Removes a component from our list of live components. Removing will
34   // also remove live dependency links.
35   void AddComponent(BrowserContextKeyedBaseFactory* component);
36   void RemoveComponent(BrowserContextKeyedBaseFactory* component);
37 
38   // Adds a dependency between two factories.
39   void AddEdge(BrowserContextKeyedBaseFactory* depended,
40                BrowserContextKeyedBaseFactory* dependee);
41 
42   // Registers profile-specific preferences for all services via |registry|.
43   // |context| should be the BrowserContext containing |registry| and is used as
44   // a key to prevent multiple registrations on the same BrowserContext in
45   // tests.
46   void RegisterProfilePrefsForServices(
47       const content::BrowserContext* context,
48       user_prefs::PrefRegistrySyncable* registry);
49 
50   // Called by each BrowserContext to alert us of its creation. Several
51   // services want to be started when a context is created. If you want your
52   // KeyedService to be started with the BrowserContext, override
53   // BrowserContextKeyedBaseFactory::ServiceIsCreatedWithBrowserContext() to
54   // return true. This method also registers any service-related preferences
55   // for non-incognito profiles.
56   void CreateBrowserContextServices(content::BrowserContext* context);
57 
58   // Similar to CreateBrowserContextServices(), except this is used for creating
59   // test BrowserContexts - these contexts will not create services for any
60   // BrowserContextKeyedBaseFactories that return true from
61   // ServiceIsNULLWhileTesting().
62   void CreateBrowserContextServicesForTest(content::BrowserContext* context);
63 
64   // Called by each BrowserContext to alert us that we should destroy services
65   // associated with it.
66   void DestroyBrowserContextServices(content::BrowserContext* context);
67 
68   // Registers a |callback| that will be called just before executing
69   // CreateBrowserContextServices() or CreateBrowserContextServicesForTest().
70   // This can be useful in browser tests which wish to substitute test or mock
71   // builders for the keyed services.
72   scoped_ptr<base::CallbackList<void(content::BrowserContext*)>::Subscription>
73   RegisterWillCreateBrowserContextServicesCallbackForTesting(
74       const base::Callback<void(content::BrowserContext*)>& callback);
75 
76 #ifndef NDEBUG
77   // Debugging assertion called as part of GetServiceForBrowserContext in debug
78   // mode. This will NOTREACHED() whenever the user is trying to access a stale
79   // BrowserContext*.
80   void AssertBrowserContextWasntDestroyed(content::BrowserContext* context);
81 
82   // Marks |context| as live (i.e., not stale). This method can be called as a
83   // safeguard against |AssertBrowserContextWasntDestroyed()| checks going off
84   // due to |context| aliasing a BrowserContext instance from a prior test
85   // (i.e., 0xWhatever might be created, be destroyed, and then a new
86   // BrowserContext object might be created at 0xWhatever).
87   void MarkBrowserContextLiveForTesting(content::BrowserContext* context);
88 #endif
89 
90   static BrowserContextDependencyManager* GetInstance();
91 
92  private:
93   friend class BrowserContextDependencyManagerUnittests;
94   friend struct DefaultSingletonTraits<BrowserContextDependencyManager>;
95 
96   // Helper function used by CreateBrowserContextServices[ForTest].
97   void DoCreateBrowserContextServices(content::BrowserContext* context,
98                                       bool is_testing_context);
99 
100   BrowserContextDependencyManager();
101   virtual ~BrowserContextDependencyManager();
102 
103 #ifndef NDEBUG
104   void DumpBrowserContextDependencies(content::BrowserContext* context);
105 #endif
106 
107   DependencyGraph dependency_graph_;
108 
109   // A list of callbacks to call just before executing
110   // CreateBrowserContextServices() or CreateBrowserContextServicesForTest().
111   base::CallbackList<void(content::BrowserContext*)>
112       will_create_browser_context_services_callbacks_;
113 
114 #ifndef NDEBUG
115   // A list of context objects that have gone through the Shutdown()
116   // phase. These pointers are most likely invalid, but we keep track of their
117   // locations in memory so we can nicely assert if we're asked to do anything
118   // with them.
119   std::set<content::BrowserContext*> dead_context_pointers_;
120 #endif
121 };
122 
123 #endif  // COMPONENTS_KEYED_SERVICE_CONTENT_BROWSER_CONTEXT_DEPENDENCY_MANAGER_H_
124