| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/browser_context_keyed_service/browser_context_dependency_ma
nager.h" | 5 #include "components/browser_context_keyed_service/browser_context_dependency_ma
nager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <iterator> | 9 #include <iterator> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "components/browser_context_keyed_service/browser_context_keyed_base_fa
ctory.h" | 12 #include "components/browser_context_keyed_service/browser_context_keyed_base_fa
ctory.h" |
| 13 #include "content/public/browser/browser_context.h" | 13 #include "content/public/browser/browser_context.h" |
| 14 | 14 |
| 15 #ifndef NDEBUG | 15 #ifndef NDEBUG |
| 16 #include "base/command_line.h" | 16 #include "base/command_line.h" |
| 17 #include "base/file_util.h" | 17 #include "base/file_util.h" |
| 18 #include "content/public/common/content_switches.h" | 18 #include "content/public/common/content_switches.h" |
| 19 #endif | 19 #endif |
| 20 | 20 |
| 21 class Profile; | 21 void BrowserContextDependencyManager::AddComponent( |
| 22 | 22 BrowserContextKeyedBaseFactory* component) { |
| 23 void ProfileDependencyManager::AddComponent( | |
| 24 ProfileKeyedBaseFactory* component) { | |
| 25 dependency_graph_.AddNode(component); | 23 dependency_graph_.AddNode(component); |
| 26 } | 24 } |
| 27 | 25 |
| 28 void ProfileDependencyManager::RemoveComponent( | 26 void BrowserContextDependencyManager::RemoveComponent( |
| 29 ProfileKeyedBaseFactory* component) { | 27 BrowserContextKeyedBaseFactory* component) { |
| 30 dependency_graph_.RemoveNode(component); | 28 dependency_graph_.RemoveNode(component); |
| 31 } | 29 } |
| 32 | 30 |
| 33 void ProfileDependencyManager::AddEdge(ProfileKeyedBaseFactory* depended, | 31 void BrowserContextDependencyManager::AddEdge( |
| 34 ProfileKeyedBaseFactory* dependee) { | 32 BrowserContextKeyedBaseFactory* depended, |
| 33 BrowserContextKeyedBaseFactory* dependee) { |
| 35 dependency_graph_.AddEdge(depended, dependee); | 34 dependency_graph_.AddEdge(depended, dependee); |
| 36 } | 35 } |
| 37 | 36 |
| 38 void ProfileDependencyManager::CreateProfileServices( | 37 void BrowserContextDependencyManager::CreateBrowserContextServices( |
| 39 content::BrowserContext* profile, bool is_testing_profile) { | 38 content::BrowserContext* context, bool is_testing_context) { |
| 40 #ifndef NDEBUG | 39 #ifndef NDEBUG |
| 41 // Unmark |profile| as dead. This exists because of unit tests, which will | 40 // Unmark |context| as dead. This exists because of unit tests, which will |
| 42 // often have similar stack structures. 0xWhatever might be created, go out | 41 // often have similar stack structures. 0xWhatever might be created, go out |
| 43 // of scope, and then a new Profile object might be created at 0xWhatever. | 42 // of scope, and then a new BrowserContext object might be created |
| 44 dead_profile_pointers_.erase(profile); | 43 // at 0xWhatever. |
| 44 dead_context_pointers_.erase(context); |
| 45 #endif | 45 #endif |
| 46 | 46 |
| 47 std::vector<DependencyNode*> construction_order; | 47 std::vector<DependencyNode*> construction_order; |
| 48 if (!dependency_graph_.GetConstructionOrder(&construction_order)) { | 48 if (!dependency_graph_.GetConstructionOrder(&construction_order)) { |
| 49 NOTREACHED(); | 49 NOTREACHED(); |
| 50 } | 50 } |
| 51 | 51 |
| 52 #ifndef NDEBUG | 52 #ifndef NDEBUG |
| 53 DumpProfileDependencies(profile); | 53 DumpBrowserContextDependencies(context); |
| 54 #endif | 54 #endif |
| 55 | 55 |
| 56 for (size_t i = 0; i < construction_order.size(); i++) { | 56 for (size_t i = 0; i < construction_order.size(); i++) { |
| 57 ProfileKeyedBaseFactory* factory = | 57 BrowserContextKeyedBaseFactory* factory = |
| 58 static_cast<ProfileKeyedBaseFactory*>(construction_order[i]); | 58 static_cast<BrowserContextKeyedBaseFactory*>(construction_order[i]); |
| 59 | 59 |
| 60 if (!profile->IsOffTheRecord()) { | 60 if (!context->IsOffTheRecord()) { |
| 61 // We only register preferences on normal profiles because the incognito | 61 // We only register preferences on normal contexts because the incognito |
| 62 // profile shares the pref service with the normal one. | 62 // context shares the pref service with the normal one. |
| 63 factory->RegisterUserPrefsOnProfile(profile); | 63 factory->RegisterUserPrefsOnBrowserContext(context); |
| 64 } | 64 } |
| 65 | 65 |
| 66 if (is_testing_profile && factory->ServiceIsNULLWhileTesting()) { | 66 if (is_testing_context && factory->ServiceIsNULLWhileTesting()) { |
| 67 factory->SetEmptyTestingFactory(profile); | 67 factory->SetEmptyTestingFactory(context); |
| 68 } else if (factory->ServiceIsCreatedWithProfile()) { | 68 } else if (factory->ServiceIsCreatedWithBrowserContext()) { |
| 69 // Create the service. | 69 // Create the service. |
| 70 factory->CreateServiceNow(profile); | 70 factory->CreateServiceNow(context); |
| 71 } | 71 } |
| 72 } | 72 } |
| 73 } | 73 } |
| 74 | 74 |
| 75 void ProfileDependencyManager::DestroyProfileServices( | 75 void BrowserContextDependencyManager::DestroyBrowserContextServices( |
| 76 content::BrowserContext* profile) { | 76 content::BrowserContext* context) { |
| 77 std::vector<DependencyNode*> destruction_order; | 77 std::vector<DependencyNode*> destruction_order; |
| 78 if (!dependency_graph_.GetDestructionOrder(&destruction_order)) { | 78 if (!dependency_graph_.GetDestructionOrder(&destruction_order)) { |
| 79 NOTREACHED(); | 79 NOTREACHED(); |
| 80 } | 80 } |
| 81 | 81 |
| 82 #ifndef NDEBUG | 82 #ifndef NDEBUG |
| 83 DumpProfileDependencies(profile); | 83 DumpBrowserContextDependencies(context); |
| 84 #endif | 84 #endif |
| 85 | 85 |
| 86 for (size_t i = 0; i < destruction_order.size(); i++) { | 86 for (size_t i = 0; i < destruction_order.size(); i++) { |
| 87 ProfileKeyedBaseFactory* factory = | 87 BrowserContextKeyedBaseFactory* factory = |
| 88 static_cast<ProfileKeyedBaseFactory*>(destruction_order[i]); | 88 static_cast<BrowserContextKeyedBaseFactory*>(destruction_order[i]); |
| 89 factory->ProfileShutdown(profile); | 89 factory->BrowserContextShutdown(context); |
| 90 } | 90 } |
| 91 | 91 |
| 92 #ifndef NDEBUG | 92 #ifndef NDEBUG |
| 93 // The profile is now dead to the rest of the program. | 93 // The context is now dead to the rest of the program. |
| 94 dead_profile_pointers_.insert(profile); | 94 dead_context_pointers_.insert(context); |
| 95 #endif | 95 #endif |
| 96 | 96 |
| 97 for (size_t i = 0; i < destruction_order.size(); i++) { | 97 for (size_t i = 0; i < destruction_order.size(); i++) { |
| 98 ProfileKeyedBaseFactory* factory = | 98 BrowserContextKeyedBaseFactory* factory = |
| 99 static_cast<ProfileKeyedBaseFactory*>(destruction_order[i]); | 99 static_cast<BrowserContextKeyedBaseFactory*>(destruction_order[i]); |
| 100 factory->ProfileDestroyed(profile); | 100 factory->BrowserContextDestroyed(context); |
| 101 } | 101 } |
| 102 } | 102 } |
| 103 | 103 |
| 104 #ifndef NDEBUG | 104 #ifndef NDEBUG |
| 105 void ProfileDependencyManager::AssertProfileWasntDestroyed( | 105 void BrowserContextDependencyManager::AssertBrowserContextWasntDestroyed( |
| 106 content::BrowserContext* profile) { | 106 content::BrowserContext* context) { |
| 107 if (dead_profile_pointers_.find(profile) != dead_profile_pointers_.end()) { | 107 if (dead_context_pointers_.find(context) != dead_context_pointers_.end()) { |
| 108 NOTREACHED() << "Attempted to access a Profile that was ShutDown(). This " | 108 NOTREACHED() << "Attempted to access a BrowserContext that was ShutDown(). " |
| 109 << "is most likely a heap smasher in progress. After " | 109 << "This is most likely a heap smasher in progress. After " |
| 110 << "ProfileKeyedService::Shutdown() completes, your service " | 110 << "BrowserContextKeyedService::Shutdown() completes, your " |
| 111 << "MUST NOT refer to depended Profile services again."; | 111 << "service MUST NOT refer to depended BrowserContext " |
| 112 << "services again."; |
| 112 } | 113 } |
| 113 } | 114 } |
| 114 #endif | 115 #endif |
| 115 | 116 |
| 116 // static | 117 // static |
| 117 ProfileDependencyManager* ProfileDependencyManager::GetInstance() { | 118 BrowserContextDependencyManager* |
| 118 return Singleton<ProfileDependencyManager>::get(); | 119 BrowserContextDependencyManager::GetInstance() { |
| 120 return Singleton<BrowserContextDependencyManager>::get(); |
| 119 } | 121 } |
| 120 | 122 |
| 121 ProfileDependencyManager::ProfileDependencyManager() { | 123 BrowserContextDependencyManager::BrowserContextDependencyManager() { |
| 122 } | 124 } |
| 123 | 125 |
| 124 ProfileDependencyManager::~ProfileDependencyManager() { | 126 BrowserContextDependencyManager::~BrowserContextDependencyManager() { |
| 125 } | 127 } |
| 126 | 128 |
| 127 #ifndef NDEBUG | 129 #ifndef NDEBUG |
| 128 namespace { | 130 namespace { |
| 129 | 131 |
| 130 std::string ProfileKeyedBaseFactoryGetNodeName(DependencyNode* node) { | 132 std::string BrowserContextKeyedBaseFactoryGetNodeName(DependencyNode* node) { |
| 131 return static_cast<ProfileKeyedBaseFactory*>(node)->name(); | 133 return static_cast<BrowserContextKeyedBaseFactory*>(node)->name(); |
| 132 } | 134 } |
| 133 | 135 |
| 134 } // namespace | 136 } // namespace |
| 135 | 137 |
| 136 void ProfileDependencyManager::DumpProfileDependencies( | 138 void BrowserContextDependencyManager::DumpBrowserContextDependencies( |
| 137 content::BrowserContext* profile) { | 139 content::BrowserContext* context) { |
| 138 // Whenever we try to build a destruction ordering, we should also dump a | 140 // Whenever we try to build a destruction ordering, we should also dump a |
| 139 // dependency graph to "/path/to/profile/profile-dependencies.dot". | 141 // dependency graph to "/path/to/context/context-dependencies.dot". |
| 140 if (CommandLine::ForCurrentProcess()->HasSwitch( | 142 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 141 switches::kDumpBrowserContextDependencyGraph)) { | 143 switches::kDumpBrowserContextDependencyGraph)) { |
| 142 base::FilePath dot_file = | 144 base::FilePath dot_file = |
| 143 profile->GetPath().AppendASCII("browser-context-dependencies.dot"); | 145 context->GetPath().AppendASCII("browser-context-dependencies.dot"); |
| 144 std::string contents = dependency_graph_.DumpAsGraphviz( | 146 std::string contents = dependency_graph_.DumpAsGraphviz( |
| 145 "Profile", base::Bind(&ProfileKeyedBaseFactoryGetNodeName)); | 147 "BrowserContext", |
| 148 base::Bind(&BrowserContextKeyedBaseFactoryGetNodeName)); |
| 146 file_util::WriteFile(dot_file, contents.c_str(), contents.size()); | 149 file_util::WriteFile(dot_file, contents.c_str(), contents.size()); |
| 147 } | 150 } |
| 148 } | 151 } |
| 149 #endif // NDEBUG | 152 #endif // NDEBUG |
| OLD | NEW |