1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#ifndef CHROME_BROWSER_PROFILES_PROFILE_DEPENDENCY_MANAGER_H_
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define CHROME_BROWSER_PROFILES_PROFILE_DEPENDENCY_MANAGER_H_
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <map>
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <vector>
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass Profile;
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ProfileKeyedServiceFactory;
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// A singleton that listens for profile destruction notifications and
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// rebroadcasts them to each ProfileKeyedServiceFactory in a safe order based
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// on the stated dependencies by each service.
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ProfileDependencyManager {
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Adds/Removes a component from our list of live components. Removing will
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // also remove live dependency links.
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void AddComponent(ProfileKeyedServiceFactory* component);
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RemoveComponent(ProfileKeyedServiceFactory* component);
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Adds a dependency between two factories.
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void AddEdge(ProfileKeyedServiceFactory* depended,
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen               ProfileKeyedServiceFactory* dependee);
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Called by each Profile to alert us that we should destroy services
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // associated with it.
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Why not use the existing PROFILE_DESTROYED notification?
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // - Because we need to do everything here after the application has handled
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //   being notified about PROFILE_DESTROYED.
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // - Because this class is a singleton and Singletons can't rely on
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //   NotificationService in unit tests because NotificationService is
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //   replaced in many tests.
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void DestroyProfileServices(Profile* profile);
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static ProfileDependencyManager* GetInstance();
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class ProfileDependencyManagerUnittests;
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend struct DefaultSingletonTraits<ProfileDependencyManager>;
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef std::multimap<ProfileKeyedServiceFactory*,
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        ProfileKeyedServiceFactory*> EdgeMap;
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ProfileDependencyManager();
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~ProfileDependencyManager();
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Using the dependency graph defined in |edges_|, fills |destruction_order_|
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // so that Observe() can notify each ProfileKeyedServiceFactory in order.
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void BuildDestructionOrder();
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<ProfileKeyedServiceFactory*> all_components_;
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EdgeMap edges_;
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::vector<ProfileKeyedServiceFactory*> destruction_order_;
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif  // CHROME_BROWSER_PROFILES_PROFILE_DEPENDENCY_MANAGER_H_
66