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

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: 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 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 const std::string& extension_id, 111 const std::string& extension_id,
114 const std::string& event_name, 112 const std::string& event_name,
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)
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_));
137 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, 133 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
138 content::Source<Profile>(profile_)); 134 content::Source<Profile>(profile_));
139 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, 135 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED,
140 content::Source<Profile>(profile_)); 136 content::Source<Profile>(profile_));
141
142 // NULL in unit_tests.
143 if (extension_prefs) {
144 // Check if registered events are up-to-date. We need to do this before
145 // reading the registered events, because it deletes them if they're out of
146 // date.
147 dispatch_chrome_updated_event_ =
148 !extension_prefs->CheckRegisteredEventsUpToDate();
149 }
150 } 137 }
151 138
152 EventRouter::~EventRouter() {} 139 EventRouter::~EventRouter() {}
153 140
141 void EventRouter::InitWithPrefs(ExtensionPrefs* extension_prefs) {
142 // Check if registered events are up-to-date. We need to do this before
143 // reading the registered events, because it deletes them if they're out of
144 // date.
145 dispatch_chrome_updated_event_ =
146 !extension_prefs->CheckRegisteredEventsUpToDate();
147 }
148
154 void EventRouter::AddEventListener(const std::string& event_name, 149 void EventRouter::AddEventListener(const std::string& event_name,
155 content::RenderProcessHost* process, 150 content::RenderProcessHost* process,
156 const std::string& extension_id) { 151 const std::string& extension_id) {
157 listeners_.AddListener(scoped_ptr<EventListener>(new EventListener( 152 listeners_.AddListener(scoped_ptr<EventListener>(new EventListener(
158 event_name, extension_id, process, scoped_ptr<DictionaryValue>()))); 153 event_name, extension_id, process, scoped_ptr<DictionaryValue>())));
159 } 154 }
160 155
161 void EventRouter::RemoveEventListener(const std::string& event_name, 156 void EventRouter::RemoveEventListener(const std::string& event_name,
162 content::RenderProcessHost* process, 157 content::RenderProcessHost* process,
163 const std::string& extension_id) { 158 const std::string& extension_id) {
164 EventListener listener(event_name, extension_id, process, 159 EventListener listener(event_name, extension_id, process,
165 scoped_ptr<DictionaryValue>()); 160 scoped_ptr<DictionaryValue>());
166 listeners_.RemoveListener(&listener); 161 listeners_.RemoveListener(&listener);
167 } 162 }
168 163
164 void EventRouter::RegisterObserver(Observer* observer,
165 const std::string& event_name) {
166 observers_[event_name] = observer;
167 }
168
169 void EventRouter::UnregisterObserver(Observer* observer) {
170 std::vector<ObserverMap::iterator> iters_to_remove;
171 for (ObserverMap::iterator iter = observers_.begin();
172 iter != observers_.end(); ++iter) {
173 if (iter->second == observer)
174 iters_to_remove.push_back(iter);
175 }
176 for (size_t i = 0; i < iters_to_remove.size(); ++i)
177 observers_.erase(iters_to_remove[i]);
178 }
179
169 void EventRouter::OnListenerAdded(const EventListener* listener) { 180 void EventRouter::OnListenerAdded(const EventListener* listener) {
170 // We don't care about lazy events being added. 181 // We don't care about lazy events being added.
171 if (!listener->process) 182 if (!listener->process)
172 return; 183 return;
173 184
174 if (extension_devtools_manager_.get()) 185 const std::string& event_name = listener->event_name;
175 extension_devtools_manager_->AddEventListener(listener->event_name, 186 ObserverMap::iterator observer = observers_.find(event_name);
176 listener->process->GetID()); 187 if (observer != observers_.end())
188 observer->second->OnListenerAdded(event_name);
177 189
178 // We lazily tell the TaskManager to start updating when listeners to the 190 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.
179 // processes.onUpdated or processes.onUpdatedWithMemory events arrive. 191 ExtensionSystem::Get(profile_)->devtools_manager();
180 const std::string& event_name = listener->event_name; 192 if (extension_devtools_manager)
181 if (event_name.compare( 193 extension_devtools_manager->AddEventListener(event_name,
182 extensions::processes_api_constants::kOnUpdated) == 0 || 194 listener->process->GetID());
183 event_name.compare(
184 extensions::processes_api_constants::kOnUpdatedWithMemory) == 0)
185 extensions::ProcessesEventRouter::GetInstance()->ListenerAdded();
186 195
187 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name)) 196 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name))
188 SystemInfoEventRouter::GetInstance()->AddEventListener(event_name); 197 SystemInfoEventRouter::GetInstance()->AddEventListener(event_name);
189 } 198 }
190 199
191 void EventRouter::OnListenerRemoved(const EventListener* listener) { 200 void EventRouter::OnListenerRemoved(const EventListener* listener) {
192 // We don't care about lazy events being removed. 201 // We don't care about lazy events being removed.
193 if (!listener->process) 202 if (!listener->process)
194 return; 203 return;
195 204
196 const std::string& event_name = listener->event_name; 205 const std::string& event_name = listener->event_name;
197 if (extension_devtools_manager_.get()) 206 ObserverMap::iterator observer = observers_.find(event_name);
198 extension_devtools_manager_->RemoveEventListener( 207 if (observer != observers_.end())
208 observer->second->OnListenerRemoved(event_name);
209
210 ExtensionDevToolsManager* extension_devtools_manager =
211 ExtensionSystem::Get(profile_)->devtools_manager();
212 if (extension_devtools_manager)
213 extension_devtools_manager->RemoveEventListener(
199 event_name, listener->process->GetID()); 214 event_name, listener->process->GetID());
200 215
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( 216 BrowserThread::PostTask(
211 BrowserThread::IO, FROM_HERE, 217 BrowserThread::IO, FROM_HERE,
212 base::Bind(&NotifyEventListenerRemovedOnIOThread, 218 base::Bind(&NotifyEventListenerRemovedOnIOThread,
213 profile_, listener->extension_id, listener->event_name)); 219 profile_, listener->extension_id, event_name));
214 220
215 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name)) 221 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name))
216 SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name); 222 SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name);
217 } 223 }
218 224
219 void EventRouter::AddLazyEventListener(const std::string& event_name, 225 void EventRouter::AddLazyEventListener(const std::string& event_name,
220 const std::string& extension_id) { 226 const std::string& extension_id) {
221 scoped_ptr<EventListener> listener(new EventListener( 227 scoped_ptr<EventListener> listener(new EventListener(
222 event_name, extension_id, NULL, scoped_ptr<DictionaryValue>())); 228 event_name, extension_id, NULL, scoped_ptr<DictionaryValue>()));
223 bool is_new = listeners_.AddListener(listener.Pass()); 229 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()), 681 event_args(event_args.Pass()),
676 event_url(event_url), 682 event_url(event_url),
677 restrict_to_profile(restrict_to_profile), 683 restrict_to_profile(restrict_to_profile),
678 cross_incognito_args(NULL), 684 cross_incognito_args(NULL),
679 user_gesture(user_gesture), 685 user_gesture(user_gesture),
680 info(info) {} 686 info(info) {}
681 687
682 Event::~Event() {} 688 Event::~Event() {}
683 689
684 } // namespace extensions 690 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698