| // Copyright (c) 2011 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 CHROME_BROWSER_PROFILES_PROFILE_DEPENDENCY_MANAGER_H_ |
| #define CHROME_BROWSER_PROFILES_PROFILE_DEPENDENCY_MANAGER_H_ |
| |
| #include <map> |
| #include <vector> |
| |
| #include "base/memory/singleton.h" |
| |
| class Profile; |
| class ProfileKeyedServiceFactory; |
| |
| // A singleton that listens for profile destruction notifications and |
| // rebroadcasts them to each ProfileKeyedServiceFactory in a safe order based |
| // on the stated dependencies by each service. |
| class ProfileDependencyManager { |
| public: |
| // Adds/Removes a component from our list of live components. Removing will |
| // also remove live dependency links. |
| void AddComponent(ProfileKeyedServiceFactory* component); |
| void RemoveComponent(ProfileKeyedServiceFactory* component); |
| |
| // Adds a dependency between two factories. |
| void AddEdge(ProfileKeyedServiceFactory* depended, |
| ProfileKeyedServiceFactory* dependee); |
| |
| // Called by each Profile to alert us that we should destroy services |
| // associated with it. |
| // |
| // Why not use the existing PROFILE_DESTROYED notification? |
| // |
| // - Because we need to do everything here after the application has handled |
| // being notified about PROFILE_DESTROYED. |
| // - Because this class is a singleton and Singletons can't rely on |
| // NotificationService in unit tests because NotificationService is |
| // replaced in many tests. |
| void DestroyProfileServices(Profile* profile); |
| |
| static ProfileDependencyManager* GetInstance(); |
| |
| private: |
| friend class ProfileDependencyManagerUnittests; |
| friend struct DefaultSingletonTraits<ProfileDependencyManager>; |
| |
| typedef std::multimap<ProfileKeyedServiceFactory*, |
| ProfileKeyedServiceFactory*> EdgeMap; |
| |
| ProfileDependencyManager(); |
| virtual ~ProfileDependencyManager(); |
| |
| // Using the dependency graph defined in |edges_|, fills |destruction_order_| |
| // so that Observe() can notify each ProfileKeyedServiceFactory in order. |
| void BuildDestructionOrder(); |
| |
| std::vector<ProfileKeyedServiceFactory*> all_components_; |
| |
| EdgeMap edges_; |
| |
| std::vector<ProfileKeyedServiceFactory*> destruction_order_; |
| }; |
| |
| #endif // CHROME_BROWSER_PROFILES_PROFILE_DEPENDENCY_MANAGER_H_ |