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

Side by Side 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: 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/event_router.h" 5 #include "chrome/browser/extensions/event_router.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/stl_util.h" 12 #include "base/stl_util.h"
13 #include "base/values.h" 13 #include "base/values.h"
14 #include "base/version.h" 14 #include "base/version.h"
15 #include "chrome/browser/browser_process.h" 15 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/extensions/api/processes/processes_api_constants.h"
17 #include "chrome/browser/extensions/api/processes/processes_api.h"
18 #include "chrome/browser/extensions/api/runtime/runtime_api.h" 16 #include "chrome/browser/extensions/api/runtime/runtime_api.h"
19 #include "chrome/browser/extensions/api/web_request/web_request_api.h" 17 #include "chrome/browser/extensions/api/web_request/web_request_api.h"
20 #include "chrome/browser/extensions/event_names.h" 18 #include "chrome/browser/extensions/event_names.h"
21 #include "chrome/browser/extensions/extension_devtools_manager.h" 19 #include "chrome/browser/extensions/extension_devtools_manager.h"
22 #include "chrome/browser/extensions/extension_host.h" 20 #include "chrome/browser/extensions/extension_host.h"
23 #include "chrome/browser/extensions/extension_prefs.h" 21 #include "chrome/browser/extensions/extension_prefs.h"
24 #include "chrome/browser/extensions/extension_process_manager.h" 22 #include "chrome/browser/extensions/extension_process_manager.h"
25 #include "chrome/browser/extensions/extension_service.h" 23 #include "chrome/browser/extensions/extension_service.h"
26 #include "chrome/browser/extensions/extension_system.h" 24 #include "chrome/browser/extensions/extension_system.h"
27 #include "chrome/browser/extensions/lazy_background_task_queue.h" 25 #include "chrome/browser/extensions/lazy_background_task_queue.h"
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 scoped_ptr<ListValue> event_args, 113 scoped_ptr<ListValue> event_args,
116 const GURL& event_url, 114 const GURL& event_url,
117 UserGestureState user_gesture, 115 UserGestureState user_gesture,
118 const EventFilteringInfo& info) { 116 const EventFilteringInfo& info) {
119 DispatchExtensionMessage(ipc_sender, extension_id, event_name, 117 DispatchExtensionMessage(ipc_sender, extension_id, event_name,
120 event_args.get(), event_url, user_gesture, info); 118 event_args.get(), event_url, user_gesture, info);
121 } 119 }
122 120
123 EventRouter::EventRouter(Profile* profile, ExtensionPrefs* extension_prefs) 121 EventRouter::EventRouter(Profile* profile, ExtensionPrefs* extension_prefs)
124 : profile_(profile), 122 : profile_(profile),
125 extension_devtools_manager_(
126 ExtensionSystem::Get(profile)->devtools_manager()),
127 listeners_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 123 listeners_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
128 dispatch_chrome_updated_event_(false) { 124 dispatch_chrome_updated_event_(false) {
129 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, 125 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
130 content::NotificationService::AllSources()); 126 content::NotificationService::AllSources());
131 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, 127 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
132 content::NotificationService::AllSources()); 128 content::NotificationService::AllSources());
133 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, 129 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY,
134 content::Source<Profile>(profile_)); 130 content::Source<Profile>(profile_));
135 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, 131 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
136 content::Source<Profile>(profile_)); 132 content::Source<Profile>(profile_));
(...skipping 22 matching lines...) Expand all
159 } 155 }
160 156
161 void EventRouter::RemoveEventListener(const std::string& event_name, 157 void EventRouter::RemoveEventListener(const std::string& event_name,
162 content::RenderProcessHost* process, 158 content::RenderProcessHost* process,
163 const std::string& extension_id) { 159 const std::string& extension_id) {
164 EventListener listener(event_name, extension_id, process, 160 EventListener listener(event_name, extension_id, process,
165 scoped_ptr<DictionaryValue>()); 161 scoped_ptr<DictionaryValue>());
166 listeners_.RemoveListener(&listener); 162 listeners_.RemoveListener(&listener);
167 } 163 }
168 164
165 void EventRouter::RegisterObserver(Observer* observer,
166 const std::string& event_name) {
167 observers_[event_name] = observer;
168 }
169
170 void EventRouter::UnregisterObserver(Observer* observer) {
171 std::vector<ObserverMap::iterator> iters_to_remove;
172 for (ObserverMap::iterator iter = observers_.begin();
173 iter != observers_.end(); ++iter) {
174 if (iter->second == observer)
175 iters_to_remove.push_back(iter);
176 }
177 for (size_t i = 0; i < iters_to_remove.size(); ++i)
178 observers_.erase(iters_to_remove[i]);
179 }
180
169 void EventRouter::OnListenerAdded(const EventListener* listener) { 181 void EventRouter::OnListenerAdded(const EventListener* listener) {
170 // We don't care about lazy events being added. 182 // We don't care about lazy events being added.
171 if (!listener->process) 183 if (!listener->process)
172 return; 184 return;
173 185
174 if (extension_devtools_manager_.get()) 186 const std::string& event_name = listener->event_name;
175 extension_devtools_manager_->AddEventListener(listener->event_name, 187 ObserverMap::iterator observer = observers_.find(event_name);
176 listener->process->GetID()); 188 if (observer != observers_.end())
189 observer->second->OnListenerAdded(event_name);
177 190
178 // We lazily tell the TaskManager to start updating when listeners to the 191 // TODO(yoz): Migrate these to become EventRouter observers.
179 // processes.onUpdated or processes.onUpdatedWithMemory events arrive. 192 // EventRouter shouldn't need to know about them.
180 const std::string& event_name = listener->event_name; 193 ExtensionDevToolsManager* extension_devtools_manager =
181 if (event_name.compare( 194 ExtensionSystem::Get(profile_)->devtools_manager();
182 extensions::processes_api_constants::kOnUpdated) == 0 || 195 if (extension_devtools_manager)
183 event_name.compare( 196 extension_devtools_manager->AddEventListener(event_name,
184 extensions::processes_api_constants::kOnUpdatedWithMemory) == 0) 197 listener->process->GetID());
185 extensions::ProcessesEventRouter::GetInstance()->ListenerAdded();
186 198
187 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name)) 199 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name))
188 SystemInfoEventRouter::GetInstance()->AddEventListener(event_name); 200 SystemInfoEventRouter::GetInstance()->AddEventListener(event_name);
189 } 201 }
190 202
191 void EventRouter::OnListenerRemoved(const EventListener* listener) { 203 void EventRouter::OnListenerRemoved(const EventListener* listener) {
192 // We don't care about lazy events being removed. 204 // We don't care about lazy events being removed.
193 if (!listener->process) 205 if (!listener->process)
194 return; 206 return;
195 207
196 const std::string& event_name = listener->event_name; 208 const std::string& event_name = listener->event_name;
197 if (extension_devtools_manager_.get()) 209 ObserverMap::iterator observer = observers_.find(event_name);
198 extension_devtools_manager_->RemoveEventListener( 210 if (observer != observers_.end())
211 observer->second->OnListenerRemoved(event_name);
212
213 // TODO(yoz): Migrate these to become EventRouter observers.
214 // EventRouter shouldn't need to know about them.
215 ExtensionDevToolsManager* extension_devtools_manager =
216 ExtensionSystem::Get(profile_)->devtools_manager();
217 if (extension_devtools_manager)
218 extension_devtools_manager->RemoveEventListener(
199 event_name, listener->process->GetID()); 219 event_name, listener->process->GetID());
200 220
201 // If a processes.onUpdated or processes.onUpdatedWithMemory event listener
202 // is removed (or a process with one exits), then we let the extension API
203 // know that it has one fewer listener.
204 if (event_name.compare(
205 extensions::processes_api_constants::kOnUpdated) == 0 ||
206 event_name.compare(
207 extensions::processes_api_constants::kOnUpdatedWithMemory) == 0)
208 extensions::ProcessesEventRouter::GetInstance()->ListenerRemoved();
209
210 BrowserThread::PostTask( 221 BrowserThread::PostTask(
211 BrowserThread::IO, FROM_HERE, 222 BrowserThread::IO, FROM_HERE,
212 base::Bind(&NotifyEventListenerRemovedOnIOThread, 223 base::Bind(&NotifyEventListenerRemovedOnIOThread,
213 profile_, listener->extension_id, listener->event_name)); 224 profile_, listener->extension_id, event_name));
214 225
215 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name)) 226 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name))
216 SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name); 227 SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name);
217 } 228 }
218 229
219 void EventRouter::AddLazyEventListener(const std::string& event_name, 230 void EventRouter::AddLazyEventListener(const std::string& event_name,
220 const std::string& extension_id) { 231 const std::string& extension_id) {
221 scoped_ptr<EventListener> listener(new EventListener( 232 scoped_ptr<EventListener> listener(new EventListener(
222 event_name, extension_id, NULL, scoped_ptr<DictionaryValue>())); 233 event_name, extension_id, NULL, scoped_ptr<DictionaryValue>()));
223 bool is_new = listeners_.AddListener(listener.Pass()); 234 bool is_new = listeners_.AddListener(listener.Pass());
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 event_args(event_args.Pass()), 686 event_args(event_args.Pass()),
676 event_url(event_url), 687 event_url(event_url),
677 restrict_to_profile(restrict_to_profile), 688 restrict_to_profile(restrict_to_profile),
678 cross_incognito_args(NULL), 689 cross_incognito_args(NULL),
679 user_gesture(user_gesture), 690 user_gesture(user_gesture),
680 info(info) {} 691 info(info) {}
681 692
682 Event::~Event() {} 693 Event::~Event() {}
683 694
684 } // namespace extensions 695 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698