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

Unified Diff: chrome/browser/extensions/event_router.cc

Issue 11359081: Lazy initialization for ProcessesEventRouter. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase 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/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);

Powered by Google App Engine
This is Rietveld 408576698