Chromium Code Reviews| Index: chrome/browser/extensions/event_router.cc |
| diff --git a/chrome/browser/extensions/event_router.cc b/chrome/browser/extensions/event_router.cc |
| index b6683a6f4c5df142df87e9a811be43e2215f674f..248e5b5517e05cb3538cdf651060caa5be8f64e9 100644 |
| --- a/chrome/browser/extensions/event_router.cc |
| +++ b/chrome/browser/extensions/event_router.cc |
| @@ -13,8 +13,6 @@ |
| #include "base/values.h" |
| #include "base/version.h" |
| #include "chrome/browser/browser_process.h" |
| -#include "chrome/browser/extensions/api/processes/processes_api_constants.h" |
| -#include "chrome/browser/extensions/api/processes/processes_api.h" |
| #include "chrome/browser/extensions/api/runtime/runtime_api.h" |
| #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
| #include "chrome/browser/extensions/event_names.h" |
| @@ -120,10 +118,8 @@ void EventRouter::DispatchEvent(IPC::Sender* ipc_sender, |
| event_args.get(), event_url, user_gesture, info); |
| } |
| -EventRouter::EventRouter(Profile* profile, ExtensionPrefs* extension_prefs) |
| +EventRouter::EventRouter(Profile* profile) |
| : profile_(profile), |
| - extension_devtools_manager_( |
| - ExtensionSystem::Get(profile)->devtools_manager()), |
| listeners_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
| dispatch_chrome_updated_event_(false) { |
| registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, |
| @@ -138,19 +134,18 @@ EventRouter::EventRouter(Profile* profile, ExtensionPrefs* extension_prefs) |
| content::Source<Profile>(profile_)); |
| registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, |
| content::Source<Profile>(profile_)); |
| - |
| - // NULL in unit_tests. |
| - if (extension_prefs) { |
| - // Check if registered events are up-to-date. We need to do this before |
| - // reading the registered events, because it deletes them if they're out of |
| - // date. |
| - dispatch_chrome_updated_event_ = |
| - !extension_prefs->CheckRegisteredEventsUpToDate(); |
| - } |
| } |
| EventRouter::~EventRouter() {} |
| +void EventRouter::InitWithPrefs(ExtensionPrefs* extension_prefs) { |
| + // Check if registered events are up-to-date. We need to do this before |
| + // reading the registered events, because it deletes them if they're out of |
| + // date. |
| + dispatch_chrome_updated_event_ = |
| + !extension_prefs->CheckRegisteredEventsUpToDate(); |
| +} |
| + |
| void EventRouter::AddEventListener(const std::string& event_name, |
| content::RenderProcessHost* process, |
| const std::string& extension_id) { |
| @@ -166,23 +161,37 @@ void EventRouter::RemoveEventListener(const std::string& event_name, |
| listeners_.RemoveListener(&listener); |
| } |
| +void EventRouter::RegisterObserver(Observer* observer, |
| + const std::string& event_name) { |
| + observers_[event_name] = observer; |
| +} |
| + |
| +void EventRouter::UnregisterObserver(Observer* observer) { |
| + std::vector<ObserverMap::iterator> iters_to_remove; |
| + for (ObserverMap::iterator iter = observers_.begin(); |
| + iter != observers_.end(); ++iter) { |
| + if (iter->second == observer) |
| + iters_to_remove.push_back(iter); |
| + } |
| + for (size_t i = 0; i < iters_to_remove.size(); ++i) |
| + observers_.erase(iters_to_remove[i]); |
| +} |
| + |
| void EventRouter::OnListenerAdded(const EventListener* listener) { |
| // We don't care about lazy events being added. |
| if (!listener->process) |
| return; |
| - if (extension_devtools_manager_.get()) |
| - extension_devtools_manager_->AddEventListener(listener->event_name, |
| - listener->process->GetID()); |
| - |
| - // We lazily tell the TaskManager to start updating when listeners to the |
| - // processes.onUpdated or processes.onUpdatedWithMemory events arrive. |
| const std::string& event_name = listener->event_name; |
| - if (event_name.compare( |
| - extensions::processes_api_constants::kOnUpdated) == 0 || |
| - event_name.compare( |
| - extensions::processes_api_constants::kOnUpdatedWithMemory) == 0) |
| - extensions::ProcessesEventRouter::GetInstance()->ListenerAdded(); |
| + ObserverMap::iterator observer = observers_.find(event_name); |
| + if (observer != observers_.end()) |
| + observer->second->OnListenerAdded(event_name); |
| + |
| + ExtensionDevToolsManager* extension_devtools_manager = |
|
Aaron Boodman
2012/11/07 23:51:28
Add a TODO to get rid of this?
Also, out of curio
Yoyo Zhou
2012/11/08 00:18:16
Done.
|
| + ExtensionSystem::Get(profile_)->devtools_manager(); |
| + if (extension_devtools_manager) |
| + extension_devtools_manager->AddEventListener(event_name, |
| + listener->process->GetID()); |
| if (SystemInfoEventRouter::IsSystemInfoEvent(event_name)) |
| SystemInfoEventRouter::GetInstance()->AddEventListener(event_name); |
| @@ -194,23 +203,20 @@ void EventRouter::OnListenerRemoved(const EventListener* listener) { |
| return; |
| const std::string& event_name = listener->event_name; |
| - if (extension_devtools_manager_.get()) |
| - extension_devtools_manager_->RemoveEventListener( |
| + ObserverMap::iterator observer = observers_.find(event_name); |
| + if (observer != observers_.end()) |
| + observer->second->OnListenerRemoved(event_name); |
| + |
| + ExtensionDevToolsManager* extension_devtools_manager = |
| + ExtensionSystem::Get(profile_)->devtools_manager(); |
| + if (extension_devtools_manager) |
| + extension_devtools_manager->RemoveEventListener( |
| event_name, listener->process->GetID()); |
| - // 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. |
| - if (event_name.compare( |
| - extensions::processes_api_constants::kOnUpdated) == 0 || |
| - event_name.compare( |
| - extensions::processes_api_constants::kOnUpdatedWithMemory) == 0) |
| - extensions::ProcessesEventRouter::GetInstance()->ListenerRemoved(); |
| - |
| BrowserThread::PostTask( |
| BrowserThread::IO, FROM_HERE, |
| base::Bind(&NotifyEventListenerRemovedOnIOThread, |
| - profile_, listener->extension_id, listener->event_name)); |
| + profile_, listener->extension_id, event_name)); |
| if (SystemInfoEventRouter::IsSystemInfoEvent(event_name)) |
| SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name); |