// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_BROWSER_CONTEXT_KEYED_SERVICE_BROWSER_CONTEXT_DEPENDENCY_MANAGER_H_ #define COMPONENTS_BROWSER_CONTEXT_KEYED_SERVICE_BROWSER_CONTEXT_DEPENDENCY_MANAGER_H_ #include "base/memory/singleton.h" #include "components/browser_context_keyed_service/browser_context_keyed_service_export.h" #include "components/browser_context_keyed_service/dependency_graph.h" #ifndef NDEBUG #include #endif class BrowserContextKeyedBaseFactory; namespace content { class BrowserContext; } // A singleton that listens for context destruction notifications and // rebroadcasts them to each BrowserContextKeyedBaseFactory in a safe order // based on the stated dependencies by each service. class BROWSER_CONTEXT_KEYED_SERVICE_EXPORT BrowserContextDependencyManager { public: // Adds/Removes a component from our list of live components. Removing will // also remove live dependency links. void AddComponent(BrowserContextKeyedBaseFactory* component); void RemoveComponent(BrowserContextKeyedBaseFactory* component); // Adds a dependency between two factories. void AddEdge(BrowserContextKeyedBaseFactory* depended, BrowserContextKeyedBaseFactory* dependee); // Called by each BrowserContext to alert us of its creation. Several services // want to be started when a context is created. If you want your // BrowserContextKeyedService to be started with the BrowserContext, override // BrowserContextKeyedBaseFactory::ServiceIsCreatedWithBrowserContext() to // return true. This method also registers any service-related preferences // for non-incognito profiles. void CreateBrowserContextServices(content::BrowserContext* context); // Similar to CreateBrowserContextServices(), except this is used for creating // test BrowserContexts - these contexts will not create services for any // BrowserContextKeyedBaseFactories that return true from // ServiceIsNULLWhileTesting(). Callers can pass |force_register_prefs| as // true to have preferences registered even for incognito profiles - this // allows tests to specify a standalone incognito profile without an // associated normal profile. void CreateBrowserContextServicesForTest(content::BrowserContext* context, bool force_register_prefs); // Called by each BrowserContext to alert us that we should destroy services // associated with it. void DestroyBrowserContextServices(content::BrowserContext* context); #ifndef NDEBUG // Debugging assertion called as part of GetServiceForBrowserContext in debug // mode. This will NOTREACHED() whenever the user is trying to access a stale // BrowserContext*. void AssertBrowserContextWasntDestroyed(content::BrowserContext* context); #endif static BrowserContextDependencyManager* GetInstance(); private: friend class BrowserContextDependencyManagerUnittests; friend struct DefaultSingletonTraits; // Helper function used by CreateBrowserContextServices[ForTest]. void DoCreateBrowserContextServices(content::BrowserContext* context, bool is_testing_context, bool force_register_prefs); BrowserContextDependencyManager(); virtual ~BrowserContextDependencyManager(); #ifndef NDEBUG void DumpBrowserContextDependencies(content::BrowserContext* context); #endif DependencyGraph dependency_graph_; #ifndef NDEBUG // A list of context objects that have gone through the Shutdown() // phase. These pointers are most likely invalid, but we keep track of their // locations in memory so we can nicely assert if we're asked to do anything // with them. std::set dead_context_pointers_; #endif }; #endif // COMPONENTS_BROWSER_CONTEXT_KEYED_SERVICE_BROWSER_CONTEXT_DEPENDENCY_MANAGER_H_