| 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;
|
|
|
|
|