blob: 5482aaa92831ef6332e89ab57d57ddf2beced6b3 [file] [log] [blame]
// 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 <set>
#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<BrowserContextDependencyManager>;
// 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<content::BrowserContext*> dead_context_pointers_;
#endif
};
#endif // COMPONENTS_BROWSER_CONTEXT_KEYED_SERVICE_BROWSER_CONTEXT_DEPENDENCY_MANAGER_H_