Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Unified Diff: chrome/browser/extensions/api/processes/processes_api.cc

Issue 11359081: Lazy initialization for ProcessesEventRouter. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixor Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/processes/processes_api.cc
diff --git a/chrome/browser/extensions/api/processes/processes_api.cc b/chrome/browser/extensions/api/processes/processes_api.cc
index 6c10f6e17f4bb27b79aed8db9b7f00997a59bc2d..e235a2a663837eada3be645ccf770c2410f6d110 100644
--- a/chrome/browser/extensions/api/processes/processes_api.cc
+++ b/chrome/browser/extensions/api/processes/processes_api.cc
@@ -13,6 +13,7 @@
#include "base/values.h"
#include "chrome/browser/extensions/api/processes/processes_api_constants.h"
+#include "chrome/browser/extensions/api/processes/processes_api_factory.h"
#include "chrome/browser/extensions/api/tabs/tabs_constants.h"
#include "chrome/browser/extensions/event_router.h"
#include "chrome/browser/extensions/extension_function_util.h"
@@ -212,12 +213,9 @@ void AddMemoryDetails(DictionaryValue* result,
} // namespace
-ProcessesEventRouter* ProcessesEventRouter::GetInstance() {
- return Singleton<ProcessesEventRouter>::get();
-}
-
-ProcessesEventRouter::ProcessesEventRouter()
- : listeners_(0),
+ProcessesEventRouter::ProcessesEventRouter(Profile* profile)
+ : profile_(profile),
+ listeners_(0),
task_manager_listening_(false) {
#if defined(ENABLE_TASK_MANAGER)
model_ = TaskManager::GetInstance()->model();
@@ -244,10 +242,6 @@ ProcessesEventRouter::~ProcessesEventRouter() {
#endif // defined(ENABLE_TASK_MANAGER)
}
-void ProcessesEventRouter::ObserveProfile(Profile* profile) {
- profiles_.insert(profile);
-}
-
void ProcessesEventRouter::ListenerAdded() {
#if defined(ENABLE_TASK_MANAGER)
// The task manager has its own ref count to balance other callers of
@@ -323,7 +317,7 @@ void ProcessesEventRouter::OnItemsAdded(int start, int length) {
args->Append(process);
- NotifyProfiles(keys::kOnCreated, args.Pass());
+ DispatchEvent(keys::kOnCreated, args.Pass());
#endif // defined(ENABLE_TASK_MANAGER)
}
@@ -370,7 +364,7 @@ void ProcessesEventRouter::OnItemsChanged(int start, int length) {
scoped_ptr<ListValue> args(new ListValue());
args->Append(processes);
- NotifyProfiles(keys::kOnUpdated, args.Pass());
+ DispatchEvent(keys::kOnUpdated, args.Pass());
}
if (updated_memory) {
@@ -389,7 +383,7 @@ void ProcessesEventRouter::OnItemsChanged(int start, int length) {
scoped_ptr<ListValue> args(new ListValue());
args->Append(processes);
- NotifyProfiles(keys::kOnUpdatedWithMemory, args.Pass());
+ DispatchEvent(keys::kOnUpdatedWithMemory, args.Pass());
}
#endif // defined(ENABLE_TASK_MANAGER)
}
@@ -418,7 +412,7 @@ void ProcessesEventRouter::OnItemsToBeRemoved(int start, int length) {
// Third arg: The exit code for the process.
args->Append(Value::CreateIntegerValue(0));
- NotifyProfiles(keys::kOnExited, args.Pass());
+ DispatchEvent(keys::kOnExited, args.Pass());
#endif // defined(ENABLE_TASK_MANAGER)
}
@@ -448,7 +442,7 @@ void ProcessesEventRouter::ProcessHangEvent(content::RenderWidgetHost* widget) {
scoped_ptr<ListValue> args(new ListValue());
args->Append(process);
- NotifyProfiles(keys::kOnUnresponsive, args.Pass());
+ DispatchEvent(keys::kOnUnresponsive, args.Pass());
#endif // defined(ENABLE_TASK_MANAGER)
}
@@ -468,49 +462,58 @@ void ProcessesEventRouter::ProcessClosedEvent(
// Third arg: The exit code for the process.
args->Append(Value::CreateIntegerValue(details->exit_code));
- NotifyProfiles(keys::kOnExited, args.Pass());
+ DispatchEvent(keys::kOnExited, args.Pass());
#endif // defined(ENABLE_TASK_MANAGER)
}
-void ProcessesEventRouter::DispatchEvent(Profile* profile,
- const char* event_name,
+void ProcessesEventRouter::DispatchEvent(const char* event_name,
scoped_ptr<ListValue> event_args) {
- if (profile && extensions::ExtensionSystem::Get(profile)->event_router()) {
- extensions::ExtensionSystem::Get(profile)->event_router()->
+ if (extensions::ExtensionSystem::Get(profile_)->event_router()) {
+ extensions::ExtensionSystem::Get(profile_)->event_router()->
DispatchEventToRenderers(event_name, event_args.Pass(), NULL, GURL(),
extensions::EventFilteringInfo());
}
}
-void ProcessesEventRouter::NotifyProfiles(const char* event_name,
- scoped_ptr<ListValue> event_args) {
- for (ProfileSet::iterator it = profiles_.begin();
- it != profiles_.end(); ++it) {
- Profile* profile = *it;
- scoped_ptr<ListValue> event_args_copy(event_args->DeepCopy());
- DispatchEvent(profile, event_name, event_args_copy.Pass());
- }
-}
-
-// In order to determine whether there are any listeners for the event of
-// interest, we need to ask each profile whether it has one registered.
-// We only need to look for the profiles that have registered with the
-// this extension API.
bool ProcessesEventRouter::HasEventListeners(const std::string& event_name) {
- for (ProfileSet::iterator it = profiles_.begin();
- it != profiles_.end(); ++it) {
- Profile* profile = *it;
- extensions::EventRouter* router =
- extensions::ExtensionSystem::Get(profile)->event_router();
- if (!router)
- continue;
-
- if (router->HasEventListener(event_name))
+ extensions::EventRouter* router =
+ extensions::ExtensionSystem::Get(profile_)->event_router();
+ if (router && router->HasEventListener(event_name))
return true;
- }
return false;
}
+ProcessesAPI::ProcessesAPI(Profile* profile)
+ : profile_(profile),
+ processes_event_router_(new ProcessesEventRouter(profile)) {
+ ExtensionSystem::Get(profile_)->event_router()->RegisterObserver(
+ this, processes_api_constants::kOnUpdated);
+ ExtensionSystem::Get(profile_)->event_router()->RegisterObserver(
+ this, processes_api_constants::kOnUpdatedWithMemory);
+}
+
+ProcessesAPI::~ProcessesAPI() {
+ ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this);
+}
+
+// static
+ProcessesAPI* ProcessesAPI::Get(Profile* profile) {
+ return ProcessesAPIFactory::GetForProfile(profile);
+}
+
+void ProcessesAPI::OnListenerAdded(const std::string& event_name) {
+ // We lazily tell the TaskManager to start updating when listeners to the
+ // processes.onUpdated or processes.onUpdatedWithMemory events arrive.
+ processes_event_router_->ListenerAdded();
+}
+
+void ProcessesAPI::OnListenerRemoved(const std::string& event_name) {
+ // If a processes.onUpdated or processes.onUpdatedWithMemory event listener
+ // is removed (or a process with one exits), then we let the extension API
+ // know that it has one fewer listener.
+ processes_event_router_->ListenerRemoved();
+}
+
GetProcessIdForTabFunction::GetProcessIdForTabFunction() : tab_id_(-1) {
}
@@ -526,14 +529,16 @@ bool GetProcessIdForTabFunction::RunImpl() {
// which will invoke the callback once we have returned from this function.
// Otherwise, wait for the notification that the task manager is done with
// the data gathering.
- if (ProcessesEventRouter::GetInstance()->is_task_manager_listening()) {
+ if (ProcessesAPI::Get(profile_)->processes_event_router()->
+ is_task_manager_listening()) {
MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
&GetProcessIdForTabFunction::GetProcessIdForTab, this));
} else {
registrar_.Add(this,
chrome::NOTIFICATION_TASK_MANAGER_CHILD_PROCESSES_DATA_READY,
content::NotificationService::AllSources());
- ProcessesEventRouter::GetInstance()->StartTaskManagerListening();
+ ProcessesAPI::Get(profile_)->processes_event_router()->
+ StartTaskManagerListening();
}
return true;
@@ -587,14 +592,16 @@ bool TerminateFunction::RunImpl() {
// which will invoke the callback once we have returned from this function.
// Otherwise, wait for the notification that the task manager is done with
// the data gathering.
- if (ProcessesEventRouter::GetInstance()->is_task_manager_listening()) {
+ if (ProcessesAPI::Get(profile_)->processes_event_router()->
+ is_task_manager_listening()) {
MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
&TerminateFunction::TerminateProcess, this));
} else {
registrar_.Add(this,
chrome::NOTIFICATION_TASK_MANAGER_CHILD_PROCESSES_DATA_READY,
content::NotificationService::AllSources());
- ProcessesEventRouter::GetInstance()->StartTaskManagerListening();
+ ProcessesAPI::Get(profile_)->processes_event_router()->
+ StartTaskManagerListening();
}
return true;
@@ -673,14 +680,16 @@ bool GetProcessInfoFunction::RunImpl() {
// which will invoke the callback once we have returned from this function.
// Otherwise, wait for the notification that the task manager is done with
// the data gathering.
- if (ProcessesEventRouter::GetInstance()->is_task_manager_listening()) {
+ if (ProcessesAPI::Get(profile_)->processes_event_router()->
+ is_task_manager_listening()) {
MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
&GetProcessInfoFunction::GatherProcessInfo, this));
} else {
registrar_.Add(this,
chrome::NOTIFICATION_TASK_MANAGER_CHILD_PROCESSES_DATA_READY,
content::NotificationService::AllSources());
- ProcessesEventRouter::GetInstance()->StartTaskManagerListening();
+ ProcessesAPI::Get(profile_)->processes_event_router()->
+ StartTaskManagerListening();
}
return true;

Powered by Google App Engine
This is Rietveld 408576698