Index: chrome/browser/task_manager/task_manager_resource_providers.cc |
diff --git a/chrome/browser/task_manager/task_manager_resource_providers.cc b/chrome/browser/task_manager/task_manager_resource_providers.cc |
index 63f92e12e9a2ebcf8c437f83f8270e76efd39b0c..89c193a1e4b4fd966b46649e1a382d1b3e5a6c57 100644 |
--- a/chrome/browser/task_manager/task_manager_resource_providers.cc |
+++ b/chrome/browser/task_manager/task_manager_resource_providers.cc |
@@ -1211,83 +1211,53 @@ void TaskManagerChildProcessResourceProvider::StartUpdating() { |
DCHECK(!updating_); |
updating_ = true; |
- // Register for notifications to get new child processes. |
- registrar_.Add(this, content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED, |
- content::NotificationService::AllBrowserContextsAndSources()); |
- registrar_.Add(this, content::NOTIFICATION_CHILD_PROCESS_HOST_DISCONNECTED, |
- content::NotificationService::AllBrowserContextsAndSources()); |
- |
// Get the existing child processes. |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
base::Bind( |
&TaskManagerChildProcessResourceProvider::RetrieveChildProcessData, |
this)); |
+ |
+ BrowserChildProcessObserver::Add(this); |
} |
void TaskManagerChildProcessResourceProvider::StopUpdating() { |
DCHECK(updating_); |
updating_ = false; |
- // Unregister for notifications to get new plugin processes. |
- registrar_.Remove( |
- this, content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED, |
- content::NotificationService::AllBrowserContextsAndSources()); |
- registrar_.Remove( |
- this, |
- content::NOTIFICATION_CHILD_PROCESS_HOST_DISCONNECTED, |
- content::NotificationService::AllBrowserContextsAndSources()); |
- |
// Delete all the resources. |
STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); |
resources_.clear(); |
pid_to_resources_.clear(); |
-} |
-void TaskManagerChildProcessResourceProvider::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- content::ChildProcessData data = |
- *content::Details<content::ChildProcessData>(details).ptr(); |
- switch (type) { |
- case content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED: |
- Add(data); |
- break; |
- case content::NOTIFICATION_CHILD_PROCESS_HOST_DISCONNECTED: |
- Remove(data); |
- break; |
- default: |
- NOTREACHED() << "Unexpected notification."; |
- return; |
- } |
+ BrowserChildProcessObserver::Remove(this); |
} |
-void TaskManagerChildProcessResourceProvider::Add( |
- const content::ChildProcessData& child_process_data) { |
- if (!updating_) |
- return; |
+void TaskManagerChildProcessResourceProvider::BrowserChildProcessHostConnected( |
+ const content::ChildProcessData& data) { |
+ DCHECK(updating_); |
+ |
// Workers are handled by TaskManagerWorkerResourceProvider. |
- if (child_process_data.type == content::PROCESS_TYPE_WORKER) |
+ if (data.type == content::PROCESS_TYPE_WORKER) |
return; |
- if (resources_.count(child_process_data.handle)) { |
+ if (resources_.count(data.handle)) { |
// The case may happen that we have added a child_process_info as part of |
// the iteration performed during StartUpdating() call but the notification |
// that it has connected was not fired yet. So when the notification |
// happens, we already know about this plugin and just ignore it. |
return; |
} |
- AddToTaskManager(child_process_data); |
+ AddToTaskManager(data); |
} |
-void TaskManagerChildProcessResourceProvider::Remove( |
- const content::ChildProcessData& child_process_data) { |
- if (!updating_) |
- return; |
- if (child_process_data.type == content::PROCESS_TYPE_WORKER) |
+void TaskManagerChildProcessResourceProvider:: |
+BrowserChildProcessHostDisconnected(const content::ChildProcessData& data) { |
+ DCHECK(updating_); |
+ |
+ if (data.type == content::PROCESS_TYPE_WORKER) |
return; |
- ChildProcessMap::iterator iter = resources_.find(child_process_data.handle); |
+ ChildProcessMap::iterator iter = resources_.find(data.handle); |
if (iter == resources_.end()) { |
// ChildProcessData disconnection notifications are asynchronous, so we |
// might be notified for a plugin we don't know anything about (if it was |
@@ -1330,6 +1300,8 @@ void TaskManagerChildProcessResourceProvider::RetrieveChildProcessData() { |
// Only add processes which are already started, since we need their handle. |
if (iter.GetData().handle == base::kNullProcessHandle) |
continue; |
+ if (iter.GetData().type == content::PROCESS_TYPE_WORKER) |
+ continue; |
child_processes.push_back(iter.GetData()); |
} |
// Now notify the UI thread that we have retrieved information about child |
@@ -1345,7 +1317,7 @@ void TaskManagerChildProcessResourceProvider::RetrieveChildProcessData() { |
void TaskManagerChildProcessResourceProvider::ChildProcessDataRetreived( |
const std::vector<content::ChildProcessData>& child_processes) { |
for (size_t i = 0; i < child_processes.size(); ++i) |
- Add(child_processes[i]); |
+ AddToTaskManager(child_processes[i]); |
content::NotificationService::current()->Notify( |
chrome::NOTIFICATION_TASK_MANAGER_CHILD_PROCESSES_DATA_READY, |