// 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_