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