OLD | NEW |
---|---|
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 "extensions/browser/event_router.h" | 5 #include "extensions/browser/event_router.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
65 BrowserContext* context = static_cast<BrowserContext*>(browser_context_id); | 65 BrowserContext* context = static_cast<BrowserContext*>(browser_context_id); |
66 activity_monitor::OnApiEventDispatched(context, extension_id, event_name, | 66 activity_monitor::OnApiEventDispatched(context, extension_id, event_name, |
67 args); | 67 args); |
68 } | 68 } |
69 | 69 |
70 // A global identifier used to distinguish extension events. | 70 // A global identifier used to distinguish extension events. |
71 base::StaticAtomicSequenceNumber g_extension_event_id; | 71 base::StaticAtomicSequenceNumber g_extension_event_id; |
72 | 72 |
73 } // namespace | 73 } // namespace |
74 | 74 |
75 const char EventRouter::kRegisteredEvents[] = "events"; | 75 const char EventRouter::kRegisteredLazyEvents[] = "events"; |
76 const char EventRouter::kRegisteredServiceWorkerEvents[] = | |
77 "serviceworkerevents"; | |
76 | 78 |
77 // static | 79 // static |
78 void EventRouter::DispatchExtensionMessage(IPC::Sender* ipc_sender, | 80 void EventRouter::DispatchExtensionMessage(IPC::Sender* ipc_sender, |
81 int worker_thread_id, | |
79 void* browser_context_id, | 82 void* browser_context_id, |
80 const std::string& extension_id, | 83 const std::string& extension_id, |
81 int event_id, | 84 int event_id, |
82 const std::string& event_name, | 85 const std::string& event_name, |
83 ListValue* event_args, | 86 ListValue* event_args, |
84 UserGestureState user_gesture, | 87 UserGestureState user_gesture, |
85 const EventFilteringInfo& info) { | 88 const EventFilteringInfo& info) { |
86 NotifyEventDispatched(browser_context_id, extension_id, event_name, | 89 NotifyEventDispatched(browser_context_id, extension_id, event_name, |
87 *event_args); | 90 *event_args); |
88 | 91 |
89 ExtensionMsg_DispatchEvent_Params params; | 92 ExtensionMsg_DispatchEvent_Params params; |
93 params.worker_thread_id = worker_thread_id; | |
90 params.extension_id = extension_id; | 94 params.extension_id = extension_id; |
91 params.event_name = event_name; | 95 params.event_name = event_name; |
92 params.event_id = event_id; | 96 params.event_id = event_id; |
93 params.is_user_gesture = user_gesture == USER_GESTURE_ENABLED; | 97 params.is_user_gesture = user_gesture == USER_GESTURE_ENABLED; |
94 params.filtering_info.Swap(info.AsValue().get()); | 98 params.filtering_info.Swap(info.AsValue().get()); |
95 | 99 |
96 ipc_sender->Send(new ExtensionMsg_DispatchEvent(params, *event_args)); | 100 ipc_sender->Send(new ExtensionMsg_DispatchEvent(params, *event_args)); |
97 } | 101 } |
98 | 102 |
99 // static | 103 // static |
(...skipping 25 matching lines...) Expand all Loading... | |
125 } else { | 129 } else { |
126 // This is called from WebRequest API. | 130 // This is called from WebRequest API. |
127 // TODO(lazyboy): Skip this entirely: http://crbug.com/488747. | 131 // TODO(lazyboy): Skip this entirely: http://crbug.com/488747. |
128 BrowserThread::PostTask( | 132 BrowserThread::PostTask( |
129 BrowserThread::UI, FROM_HERE, | 133 BrowserThread::UI, FROM_HERE, |
130 base::Bind(&EventRouter::DoDispatchEventToSenderBookkeepingOnUI, | 134 base::Bind(&EventRouter::DoDispatchEventToSenderBookkeepingOnUI, |
131 browser_context_id, extension_id, event_id, histogram_value, | 135 browser_context_id, extension_id, event_id, histogram_value, |
132 event_name)); | 136 event_name)); |
133 } | 137 } |
134 | 138 |
135 DispatchExtensionMessage(ipc_sender, browser_context_id, extension_id, | 139 DispatchExtensionMessage(ipc_sender, |
140 // TODO(lazyboy): |kNonWorkerThreadId| means these | |
141 // will not work for extension SW. | |
142 kNonWorkerThreadId, browser_context_id, extension_id, | |
136 event_id, event_name, event_args.get(), user_gesture, | 143 event_id, event_name, event_args.get(), user_gesture, |
137 info); | 144 info); |
138 } | 145 } |
139 | 146 |
140 EventRouter::EventRouter(BrowserContext* browser_context, | 147 EventRouter::EventRouter(BrowserContext* browser_context, |
141 ExtensionPrefs* extension_prefs) | 148 ExtensionPrefs* extension_prefs) |
142 : browser_context_(browser_context), | 149 : browser_context_(browser_context), |
143 extension_prefs_(extension_prefs), | 150 extension_prefs_(extension_prefs), |
144 extension_registry_observer_(this), | 151 extension_registry_observer_(this), |
145 listeners_(this) { | 152 listeners_(this) { |
146 registrar_.Add(this, | 153 registrar_.Add(this, |
147 extensions::NOTIFICATION_EXTENSION_ENABLED, | 154 extensions::NOTIFICATION_EXTENSION_ENABLED, |
148 content::Source<BrowserContext>(browser_context_)); | 155 content::Source<BrowserContext>(browser_context_)); |
149 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); | 156 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); |
150 } | 157 } |
151 | 158 |
152 EventRouter::~EventRouter() { | 159 EventRouter::~EventRouter() { |
153 for (auto* process : observed_process_set_) | 160 for (auto* process : observed_process_set_) |
154 process->RemoveObserver(this); | 161 process->RemoveObserver(this); |
155 } | 162 } |
156 | 163 |
157 void EventRouter::AddEventListener(const std::string& event_name, | 164 void EventRouter::AddEventListener(const std::string& event_name, |
158 content::RenderProcessHost* process, | 165 content::RenderProcessHost* process, |
159 const std::string& extension_id) { | 166 const std::string& extension_id) { |
160 listeners_.AddListener(EventListener::ForExtension( | 167 listeners_.AddListener( |
161 event_name, extension_id, process, std::unique_ptr<DictionaryValue>())); | 168 EventListener::ForExtension(event_name, extension_id, process, nullptr)); |
169 } | |
170 | |
171 void EventRouter::AddServiceWorkerEventListener( | |
172 const std::string& event_name, | |
173 content::RenderProcessHost* process, | |
174 const ExtensionId& extension_id, | |
175 int worker_thread_id) { | |
176 listeners_.AddListener(EventListener::ForExtensionServiceWorker( | |
177 event_name, extension_id, process, worker_thread_id, nullptr)); | |
162 } | 178 } |
163 | 179 |
164 void EventRouter::RemoveEventListener(const std::string& event_name, | 180 void EventRouter::RemoveEventListener(const std::string& event_name, |
165 content::RenderProcessHost* process, | 181 content::RenderProcessHost* process, |
166 const std::string& extension_id) { | 182 const std::string& extension_id) { |
167 std::unique_ptr<EventListener> listener = EventListener::ForExtension( | 183 std::unique_ptr<EventListener> listener = |
168 event_name, extension_id, process, std::unique_ptr<DictionaryValue>()); | 184 EventListener::ForExtension(event_name, extension_id, process, nullptr); |
185 listeners_.RemoveListener(listener.get()); | |
186 } | |
187 | |
188 void EventRouter::RemoveServiceWorkerEventListener( | |
189 const std::string& event_name, | |
190 content::RenderProcessHost* process, | |
191 const ExtensionId& extension_id, | |
192 int worker_thread_id) { | |
193 std::unique_ptr<EventListener> listener = | |
194 EventListener::ForExtensionServiceWorker( | |
195 event_name, extension_id, process, worker_thread_id, nullptr); | |
169 listeners_.RemoveListener(listener.get()); | 196 listeners_.RemoveListener(listener.get()); |
170 } | 197 } |
171 | 198 |
172 void EventRouter::AddEventListenerForURL(const std::string& event_name, | 199 void EventRouter::AddEventListenerForURL(const std::string& event_name, |
173 content::RenderProcessHost* process, | 200 content::RenderProcessHost* process, |
174 const GURL& listener_url) { | 201 const GURL& listener_url) { |
175 listeners_.AddListener(EventListener::ForURL( | 202 listeners_.AddListener( |
176 event_name, listener_url, process, std::unique_ptr<DictionaryValue>())); | 203 EventListener::ForURL(event_name, listener_url, process, nullptr)); |
177 } | 204 } |
178 | 205 |
179 void EventRouter::RemoveEventListenerForURL(const std::string& event_name, | 206 void EventRouter::RemoveEventListenerForURL(const std::string& event_name, |
180 content::RenderProcessHost* process, | 207 content::RenderProcessHost* process, |
181 const GURL& listener_url) { | 208 const GURL& listener_url) { |
182 std::unique_ptr<EventListener> listener = EventListener::ForURL( | 209 std::unique_ptr<EventListener> listener = |
183 event_name, listener_url, process, std::unique_ptr<DictionaryValue>()); | 210 EventListener::ForURL(event_name, listener_url, process, nullptr); |
184 listeners_.RemoveListener(listener.get()); | 211 listeners_.RemoveListener(listener.get()); |
185 } | 212 } |
186 | 213 |
187 void EventRouter::RegisterObserver(Observer* observer, | 214 void EventRouter::RegisterObserver(Observer* observer, |
188 const std::string& event_name) { | 215 const std::string& event_name) { |
189 // Observing sub-event names like "foo.onBar/123" is not allowed. | 216 // Observing sub-event names like "foo.onBar/123" is not allowed. |
190 DCHECK(event_name.find('/') == std::string::npos); | 217 DCHECK(event_name.find('/') == std::string::npos); |
191 observers_[event_name] = observer; | 218 observers_[event_name] = observer; |
192 } | 219 } |
193 | 220 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
236 observed_process_set_.erase(host); | 263 observed_process_set_.erase(host); |
237 host->RemoveObserver(this); | 264 host->RemoveObserver(this); |
238 } | 265 } |
239 | 266 |
240 void EventRouter::RenderProcessHostDestroyed(content::RenderProcessHost* host) { | 267 void EventRouter::RenderProcessHostDestroyed(content::RenderProcessHost* host) { |
241 listeners_.RemoveListenersForProcess(host); | 268 listeners_.RemoveListenersForProcess(host); |
242 observed_process_set_.erase(host); | 269 observed_process_set_.erase(host); |
243 host->RemoveObserver(this); | 270 host->RemoveObserver(this); |
244 } | 271 } |
245 | 272 |
246 void EventRouter::AddLazyEventListener(const std::string& event_name, | 273 void EventRouter::AddLazyEventListenerImpl(const std::string& event_name, |
Devlin
2017/06/01 04:54:49
Where possible, definition order should match decl
lazyboy
2017/06/01 23:33:29
I've intentionally kept it this way, otherwise the
lazyboy
2017/06/02 17:58:59
Moved this after OnExtensionUnloaded to match .h i
| |
247 const std::string& extension_id) { | 274 const ExtensionId& extension_id, |
248 bool is_new = listeners_.AddListener(EventListener::ForExtension( | 275 int worker_thread_id) { |
249 event_name, extension_id, NULL, std::unique_ptr<DictionaryValue>())); | 276 bool is_for_service_worker = worker_thread_id != kNonWorkerThreadId; |
277 bool is_new = listeners_.AddListener( | |
278 is_for_service_worker | |
279 ? EventListener::ForExtensionServiceWorker( | |
280 event_name, extension_id, nullptr, worker_thread_id, nullptr) | |
281 : EventListener::ForExtension(event_name, extension_id, nullptr, | |
282 nullptr)); | |
250 | 283 |
251 if (is_new) { | 284 if (is_new) { |
252 std::set<std::string> events = GetRegisteredEvents(extension_id); | 285 RegisteredEventType type = is_for_service_worker |
286 ? RegisteredEventType::kServiceWorker | |
287 : RegisteredEventType::kLazy; | |
288 std::set<std::string> events = GetRegisteredEvents(extension_id, type); | |
253 bool prefs_is_new = events.insert(event_name).second; | 289 bool prefs_is_new = events.insert(event_name).second; |
254 if (prefs_is_new) | 290 if (prefs_is_new) |
255 SetRegisteredEvents(extension_id, events); | 291 SetRegisteredEvents(extension_id, events, type); |
256 } | 292 } |
257 } | 293 } |
258 | 294 |
259 void EventRouter::RemoveLazyEventListener(const std::string& event_name, | 295 void EventRouter::RemoveLazyEventListenerImpl(const std::string& event_name, |
260 const std::string& extension_id) { | 296 const ExtensionId& extension_id, |
261 std::unique_ptr<EventListener> listener = EventListener::ForExtension( | 297 int worker_thread_id) { |
262 event_name, extension_id, NULL, std::unique_ptr<DictionaryValue>()); | 298 bool is_for_service_worker = worker_thread_id != kNonWorkerThreadId; |
299 std::unique_ptr<EventListener> listener = | |
300 is_for_service_worker | |
301 ? EventListener::ForExtensionServiceWorker( | |
302 event_name, extension_id, nullptr, worker_thread_id, nullptr) | |
303 : EventListener::ForExtension(event_name, extension_id, nullptr, | |
304 nullptr); | |
263 bool did_exist = listeners_.RemoveListener(listener.get()); | 305 bool did_exist = listeners_.RemoveListener(listener.get()); |
264 | 306 |
265 if (did_exist) { | 307 if (did_exist) { |
266 std::set<std::string> events = GetRegisteredEvents(extension_id); | 308 RegisteredEventType type = is_for_service_worker |
309 ? RegisteredEventType::kServiceWorker | |
310 : RegisteredEventType::kLazy; | |
311 std::set<std::string> events = GetRegisteredEvents(extension_id, type); | |
267 bool prefs_did_exist = events.erase(event_name) > 0; | 312 bool prefs_did_exist = events.erase(event_name) > 0; |
268 DCHECK(prefs_did_exist); | 313 DCHECK(prefs_did_exist); |
269 SetRegisteredEvents(extension_id, events); | 314 SetRegisteredEvents(extension_id, events, type); |
270 } | 315 } |
271 } | 316 } |
272 | 317 |
318 void EventRouter::AddLazyEventListener(const std::string& event_name, | |
319 const ExtensionId& extension_id) { | |
320 AddLazyEventListenerImpl(event_name, extension_id, kNonWorkerThreadId); | |
321 } | |
322 | |
323 void EventRouter::RemoveLazyEventListener(const std::string& event_name, | |
324 const ExtensionId& extension_id) { | |
325 RemoveLazyEventListenerImpl(event_name, extension_id, kNonWorkerThreadId); | |
326 } | |
327 | |
328 void EventRouter::AddLazyServiceWorkerEventListener( | |
329 const std::string& event_name, | |
330 const ExtensionId& extension_id, | |
331 int worker_thread_id) { | |
332 AddLazyEventListenerImpl(event_name, extension_id, worker_thread_id); | |
333 } | |
334 | |
335 void EventRouter::RemoveLazyServiceWorkerEventListener( | |
336 const std::string& event_name, | |
337 const ExtensionId& extension_id, | |
338 int worker_thread_id) { | |
339 RemoveLazyEventListenerImpl(event_name, extension_id, worker_thread_id); | |
340 } | |
341 | |
342 // TODO(lazyboy): Support filters for extension SW events. | |
273 void EventRouter::AddFilteredEventListener(const std::string& event_name, | 343 void EventRouter::AddFilteredEventListener(const std::string& event_name, |
274 content::RenderProcessHost* process, | 344 content::RenderProcessHost* process, |
275 const std::string& extension_id, | 345 const std::string& extension_id, |
276 const base::DictionaryValue& filter, | 346 const base::DictionaryValue& filter, |
277 bool add_lazy_listener) { | 347 bool add_lazy_listener) { |
278 listeners_.AddListener(EventListener::ForExtension( | 348 listeners_.AddListener(EventListener::ForExtension( |
279 event_name, extension_id, process, | 349 event_name, extension_id, process, |
280 std::unique_ptr<DictionaryValue>(filter.DeepCopy()))); | 350 std::unique_ptr<DictionaryValue>(filter.DeepCopy()))); |
281 | 351 |
282 if (!add_lazy_listener) | 352 if (!add_lazy_listener) |
283 return; | 353 return; |
284 | 354 |
285 bool added = listeners_.AddListener(EventListener::ForExtension( | 355 bool added = listeners_.AddListener(EventListener::ForExtension( |
286 event_name, extension_id, nullptr, | 356 event_name, extension_id, nullptr, |
287 std::unique_ptr<DictionaryValue>(filter.DeepCopy()))); | 357 std::unique_ptr<DictionaryValue>(filter.DeepCopy()))); |
288 if (added) | 358 if (added) |
289 AddFilterToEvent(event_name, extension_id, &filter); | 359 AddFilterToEvent(event_name, extension_id, &filter); |
290 } | 360 } |
291 | 361 |
362 // TODO(lazyboy): Support filters for extension SW events. | |
292 void EventRouter::RemoveFilteredEventListener( | 363 void EventRouter::RemoveFilteredEventListener( |
293 const std::string& event_name, | 364 const std::string& event_name, |
294 content::RenderProcessHost* process, | 365 content::RenderProcessHost* process, |
295 const std::string& extension_id, | 366 const std::string& extension_id, |
296 const base::DictionaryValue& filter, | 367 const base::DictionaryValue& filter, |
297 bool remove_lazy_listener) { | 368 bool remove_lazy_listener) { |
298 std::unique_ptr<EventListener> listener = EventListener::ForExtension( | 369 std::unique_ptr<EventListener> listener = EventListener::ForExtension( |
299 event_name, extension_id, process, | 370 event_name, extension_id, process, |
300 std::unique_ptr<DictionaryValue>(filter.DeepCopy())); | 371 std::unique_ptr<DictionaryValue>(filter.DeepCopy())); |
301 | 372 |
(...skipping 12 matching lines...) Expand all Loading... | |
314 return listeners_.HasListenerForEvent(event_name); | 385 return listeners_.HasListenerForEvent(event_name); |
315 } | 386 } |
316 | 387 |
317 bool EventRouter::ExtensionHasEventListener( | 388 bool EventRouter::ExtensionHasEventListener( |
318 const std::string& extension_id, | 389 const std::string& extension_id, |
319 const std::string& event_name) const { | 390 const std::string& event_name) const { |
320 return listeners_.HasListenerForExtension(extension_id, event_name); | 391 return listeners_.HasListenerForExtension(extension_id, event_name); |
321 } | 392 } |
322 | 393 |
323 std::set<std::string> EventRouter::GetRegisteredEvents( | 394 std::set<std::string> EventRouter::GetRegisteredEvents( |
324 const std::string& extension_id) const { | 395 const std::string& extension_id, |
396 RegisteredEventType type) const { | |
325 std::set<std::string> events; | 397 std::set<std::string> events; |
326 const ListValue* events_value = NULL; | 398 const ListValue* events_value = NULL; |
327 | 399 |
328 if (!extension_prefs_ || | 400 const char* pref_key = type == RegisteredEventType::kLazy |
329 !extension_prefs_->ReadPrefAsList( | 401 ? kRegisteredLazyEvents |
330 extension_id, kRegisteredEvents, &events_value)) { | 402 : kRegisteredServiceWorkerEvents; |
403 if (!extension_prefs_ || !extension_prefs_->ReadPrefAsList( | |
404 extension_id, pref_key, &events_value)) { | |
331 return events; | 405 return events; |
332 } | 406 } |
333 | 407 |
334 for (size_t i = 0; i < events_value->GetSize(); ++i) { | 408 for (size_t i = 0; i < events_value->GetSize(); ++i) { |
335 std::string event; | 409 std::string event; |
336 if (events_value->GetString(i, &event)) | 410 if (events_value->GetString(i, &event)) |
337 events.insert(event); | 411 events.insert(event); |
338 } | 412 } |
339 return events; | 413 return events; |
340 } | 414 } |
341 | 415 |
416 void EventRouter::ClearRegisteredEventsForTest( | |
417 const ExtensionId& extension_id) { | |
418 SetRegisteredEvents(extension_id, std::set<std::string>(), | |
419 RegisteredEventType::kLazy); | |
420 SetRegisteredEvents(extension_id, std::set<std::string>(), | |
421 RegisteredEventType::kServiceWorker); | |
422 } | |
423 | |
342 void EventRouter::RemoveFilterFromEvent(const std::string& event_name, | 424 void EventRouter::RemoveFilterFromEvent(const std::string& event_name, |
343 const std::string& extension_id, | 425 const std::string& extension_id, |
344 const DictionaryValue* filter) { | 426 const DictionaryValue* filter) { |
345 ExtensionPrefs::ScopedDictionaryUpdate update( | 427 ExtensionPrefs::ScopedDictionaryUpdate update( |
346 extension_prefs_, extension_id, kFilteredEvents); | 428 extension_prefs_, extension_id, kFilteredEvents); |
347 DictionaryValue* filtered_events = update.Get(); | 429 DictionaryValue* filtered_events = update.Get(); |
348 ListValue* filter_list = NULL; | 430 ListValue* filter_list = NULL; |
349 if (!filtered_events || | 431 if (!filtered_events || |
350 !filtered_events->GetListWithoutPathExpansion(event_name, &filter_list)) { | 432 !filtered_events->GetListWithoutPathExpansion(event_name, &filter_list)) { |
351 return; | 433 return; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
390 if (!has_listener) | 472 if (!has_listener) |
391 RemoveLazyEventListener(event_name, extension_id); | 473 RemoveLazyEventListener(event_name, extension_id); |
392 } | 474 } |
393 | 475 |
394 void EventRouter::DispatchEventImpl(const std::string& restrict_to_extension_id, | 476 void EventRouter::DispatchEventImpl(const std::string& restrict_to_extension_id, |
395 const linked_ptr<Event>& event) { | 477 const linked_ptr<Event>& event) { |
396 // We don't expect to get events from a completely different browser context. | 478 // We don't expect to get events from a completely different browser context. |
397 DCHECK(!event->restrict_to_browser_context || | 479 DCHECK(!event->restrict_to_browser_context || |
398 ExtensionsBrowserClient::Get()->IsSameContext( | 480 ExtensionsBrowserClient::Get()->IsSameContext( |
399 browser_context_, event->restrict_to_browser_context)); | 481 browser_context_, event->restrict_to_browser_context)); |
400 | |
401 std::set<const EventListener*> listeners( | 482 std::set<const EventListener*> listeners( |
402 listeners_.GetEventListeners(*event)); | 483 listeners_.GetEventListeners(*event)); |
403 | 484 |
404 std::set<EventDispatchIdentifier> already_dispatched; | 485 std::set<EventDispatchIdentifier> already_dispatched; |
405 | 486 |
406 // We dispatch events for lazy background pages first because attempting to do | 487 // We dispatch events for lazy background pages first because attempting to do |
407 // so will cause those that are being suspended to cancel that suspension. | 488 // so will cause those that are being suspended to cancel that suspension. |
408 // As canceling a suspension entails sending an event to the affected | 489 // As canceling a suspension entails sending an event to the affected |
409 // background page, and as that event needs to be delivered before we dispatch | 490 // background page, and as that event needs to be delivered before we dispatch |
410 // the event we are dispatching here, we dispatch to the lazy listeners here | 491 // the event we are dispatching here, we dispatch to the lazy listeners here |
411 // first. | 492 // first. |
412 for (const EventListener* listener : listeners) { | 493 for (const EventListener* listener : listeners) { |
413 if (restrict_to_extension_id.empty() || | 494 if (restrict_to_extension_id.empty() || |
414 restrict_to_extension_id == listener->extension_id()) { | 495 restrict_to_extension_id == listener->extension_id()) { |
415 if (listener->IsLazy()) { | 496 // TODO(lazyboy): Support lazy listeners for extension SW events. |
497 if (listener->IsLazy() && !listener->IsForServiceWorker()) { | |
416 DispatchLazyEvent(listener->extension_id(), event, &already_dispatched, | 498 DispatchLazyEvent(listener->extension_id(), event, &already_dispatched, |
417 listener->filter()); | 499 listener->filter()); |
418 } | 500 } |
419 } | 501 } |
420 } | 502 } |
421 | 503 |
422 for (const EventListener* listener : listeners) { | 504 for (const EventListener* listener : listeners) { |
423 if (restrict_to_extension_id.empty() || | 505 if (restrict_to_extension_id.empty() || |
424 restrict_to_extension_id == listener->extension_id()) { | 506 restrict_to_extension_id == listener->extension_id()) { |
425 if (listener->process()) { | 507 if (listener->process()) { |
426 EventDispatchIdentifier dispatch_id(listener->GetBrowserContext(), | 508 EventDispatchIdentifier dispatch_id(listener->GetBrowserContext(), |
427 listener->extension_id()); | 509 listener->extension_id(), |
510 listener->worker_thread_id()); | |
428 if (!base::ContainsKey(already_dispatched, dispatch_id)) { | 511 if (!base::ContainsKey(already_dispatched, dispatch_id)) { |
429 DispatchEventToProcess(listener->extension_id(), | 512 DispatchEventToProcess(listener->extension_id(), |
430 listener->listener_url(), listener->process(), | 513 listener->listener_url(), listener->process(), |
431 event, listener->filter(), | 514 listener->worker_thread_id(), event, |
432 false /* did_enqueue */); | 515 listener->filter(), false /* did_enqueue */); |
433 } | 516 } |
434 } | 517 } |
435 } | 518 } |
436 } | 519 } |
437 } | 520 } |
438 | 521 |
439 void EventRouter::DispatchLazyEvent( | 522 void EventRouter::DispatchLazyEvent( |
440 const std::string& extension_id, | 523 const std::string& extension_id, |
441 const linked_ptr<Event>& event, | 524 const linked_ptr<Event>& event, |
442 std::set<EventDispatchIdentifier>* already_dispatched, | 525 std::set<EventDispatchIdentifier>* already_dispatched, |
443 const base::DictionaryValue* listener_filter) { | 526 const base::DictionaryValue* listener_filter) { |
444 // Check both the original and the incognito browser context to see if we | 527 // Check both the original and the incognito browser context to see if we |
445 // should load a lazy bg page to handle the event. The latter case | 528 // should load a lazy bg page to handle the event. The latter case |
446 // occurs in the case of split-mode extensions. | 529 // occurs in the case of split-mode extensions. |
447 const Extension* extension = | 530 const Extension* extension = |
448 ExtensionRegistry::Get(browser_context_)->enabled_extensions().GetByID( | 531 ExtensionRegistry::Get(browser_context_)->enabled_extensions().GetByID( |
449 extension_id); | 532 extension_id); |
450 if (!extension) | 533 if (!extension) |
451 return; | 534 return; |
452 | 535 |
453 if (MaybeLoadLazyBackgroundPageToDispatchEvent(browser_context_, extension, | 536 if (MaybeLoadLazyBackgroundPageToDispatchEvent(browser_context_, extension, |
454 event, listener_filter)) { | 537 event, listener_filter)) { |
455 already_dispatched->insert(std::make_pair(browser_context_, extension_id)); | 538 already_dispatched->insert( |
539 std::make_tuple(browser_context_, extension_id, kNonWorkerThreadId)); | |
456 } | 540 } |
457 | 541 |
458 ExtensionsBrowserClient* browser_client = ExtensionsBrowserClient::Get(); | 542 ExtensionsBrowserClient* browser_client = ExtensionsBrowserClient::Get(); |
459 if (browser_client->HasOffTheRecordContext(browser_context_) && | 543 if (browser_client->HasOffTheRecordContext(browser_context_) && |
460 IncognitoInfo::IsSplitMode(extension)) { | 544 IncognitoInfo::IsSplitMode(extension)) { |
461 BrowserContext* incognito_context = | 545 BrowserContext* incognito_context = |
462 browser_client->GetOffTheRecordContext(browser_context_); | 546 browser_client->GetOffTheRecordContext(browser_context_); |
463 if (MaybeLoadLazyBackgroundPageToDispatchEvent(incognito_context, extension, | 547 if (MaybeLoadLazyBackgroundPageToDispatchEvent(incognito_context, extension, |
464 event, listener_filter)) { | 548 event, listener_filter)) { |
465 already_dispatched->insert( | 549 already_dispatched->insert( |
466 std::make_pair(incognito_context, extension_id)); | 550 std::make_tuple(incognito_context, extension_id, kNonWorkerThreadId)); |
467 } | 551 } |
468 } | 552 } |
469 } | 553 } |
470 | 554 |
471 void EventRouter::DispatchEventToProcess( | 555 void EventRouter::DispatchEventToProcess( |
472 const std::string& extension_id, | 556 const std::string& extension_id, |
473 const GURL& listener_url, | 557 const GURL& listener_url, |
474 content::RenderProcessHost* process, | 558 content::RenderProcessHost* process, |
559 int worker_thread_id, | |
475 const linked_ptr<Event>& event, | 560 const linked_ptr<Event>& event, |
476 const base::DictionaryValue* listener_filter, | 561 const base::DictionaryValue* listener_filter, |
477 bool did_enqueue) { | 562 bool did_enqueue) { |
478 BrowserContext* listener_context = process->GetBrowserContext(); | 563 BrowserContext* listener_context = process->GetBrowserContext(); |
479 ProcessMap* process_map = ProcessMap::Get(listener_context); | 564 ProcessMap* process_map = ProcessMap::Get(listener_context); |
480 | 565 |
481 // NOTE: |extension| being NULL does not necessarily imply that this event | 566 // NOTE: |extension| being NULL does not necessarily imply that this event |
482 // shouldn't be dispatched. Events can be dispatched to WebUI and webviews as | 567 // shouldn't be dispatched. Events can be dispatched to WebUI and webviews as |
483 // well. It all depends on what GetMostLikelyContextType returns. | 568 // well. It all depends on what GetMostLikelyContextType returns. |
484 const Extension* extension = | 569 const Extension* extension = |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
532 return; | 617 return; |
533 } | 618 } |
534 | 619 |
535 if (!event->will_dispatch_callback.is_null() && | 620 if (!event->will_dispatch_callback.is_null() && |
536 !event->will_dispatch_callback.Run(listener_context, extension, | 621 !event->will_dispatch_callback.Run(listener_context, extension, |
537 event.get(), listener_filter)) { | 622 event.get(), listener_filter)) { |
538 return; | 623 return; |
539 } | 624 } |
540 | 625 |
541 int event_id = g_extension_event_id.GetNext(); | 626 int event_id = g_extension_event_id.GetNext(); |
542 DispatchExtensionMessage(process, listener_context, extension_id, event_id, | 627 DispatchExtensionMessage(process, worker_thread_id, listener_context, |
543 event->event_name, event->event_args.get(), | 628 extension_id, event_id, event->event_name, |
544 event->user_gesture, event->filter_info); | 629 event->event_args.get(), event->user_gesture, |
630 event->filter_info); | |
545 | 631 |
546 if (extension) { | 632 if (extension) { |
547 ReportEvent(event->histogram_value, extension, did_enqueue); | 633 ReportEvent(event->histogram_value, extension, did_enqueue); |
548 IncrementInFlightEvents(listener_context, extension, event_id, | 634 IncrementInFlightEvents(listener_context, extension, event_id, |
549 event->event_name); | 635 event->event_name); |
550 } | 636 } |
551 } | 637 } |
552 | 638 |
553 bool EventRouter::CanDispatchEventToBrowserContext( | 639 bool EventRouter::CanDispatchEventToBrowserContext( |
554 BrowserContext* context, | 640 BrowserContext* context, |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
705 } | 791 } |
706 } | 792 } |
707 } | 793 } |
708 | 794 |
709 void EventRouter::DispatchPendingEvent(const linked_ptr<Event>& event, | 795 void EventRouter::DispatchPendingEvent(const linked_ptr<Event>& event, |
710 ExtensionHost* host) { | 796 ExtensionHost* host) { |
711 if (!host) | 797 if (!host) |
712 return; | 798 return; |
713 | 799 |
714 if (listeners_.HasProcessListener(host->render_process_host(), | 800 if (listeners_.HasProcessListener(host->render_process_host(), |
801 kNonWorkerThreadId, | |
715 host->extension()->id())) { | 802 host->extension()->id())) { |
716 DispatchEventToProcess(host->extension()->id(), host->GetURL(), | 803 DispatchEventToProcess(host->extension()->id(), host->GetURL(), |
717 host->render_process_host(), event, nullptr, | 804 host->render_process_host(), kNonWorkerThreadId, |
718 true /* did_enqueue */); | 805 event, nullptr, true /* did_enqueue */); |
719 } | 806 } |
720 } | 807 } |
721 | 808 |
722 void EventRouter::SetRegisteredEvents(const std::string& extension_id, | 809 void EventRouter::SetRegisteredEvents(const std::string& extension_id, |
723 const std::set<std::string>& events) { | 810 const std::set<std::string>& events, |
811 RegisteredEventType type) { | |
724 auto events_value = base::MakeUnique<base::ListValue>(); | 812 auto events_value = base::MakeUnique<base::ListValue>(); |
725 for (std::set<std::string>::const_iterator iter = events.begin(); | 813 for (std::set<std::string>::const_iterator iter = events.begin(); |
726 iter != events.end(); ++iter) { | 814 iter != events.end(); ++iter) { |
727 events_value->AppendString(*iter); | 815 events_value->AppendString(*iter); |
728 } | 816 } |
729 extension_prefs_->UpdateExtensionPref(extension_id, kRegisteredEvents, | 817 const char* pref_key = type == RegisteredEventType::kLazy |
818 ? kRegisteredLazyEvents | |
819 : kRegisteredServiceWorkerEvents; | |
820 extension_prefs_->UpdateExtensionPref(extension_id, pref_key, | |
730 std::move(events_value)); | 821 std::move(events_value)); |
731 } | 822 } |
732 | 823 |
733 void EventRouter::AddFilterToEvent(const std::string& event_name, | 824 void EventRouter::AddFilterToEvent(const std::string& event_name, |
734 const std::string& extension_id, | 825 const std::string& extension_id, |
735 const DictionaryValue* filter) { | 826 const DictionaryValue* filter) { |
736 ExtensionPrefs::ScopedDictionaryUpdate update(extension_prefs_, extension_id, | 827 ExtensionPrefs::ScopedDictionaryUpdate update(extension_prefs_, extension_id, |
737 kFilteredEvents); | 828 kFilteredEvents); |
738 DictionaryValue* filtered_events = update.Get(); | 829 DictionaryValue* filtered_events = update.Get(); |
739 if (!filtered_events) | 830 if (!filtered_events) |
(...skipping 20 matching lines...) Expand all Loading... | |
760 LazyBackgroundTaskQueue* queue = | 851 LazyBackgroundTaskQueue* queue = |
761 LazyBackgroundTaskQueue::Get(browser_context_); | 852 LazyBackgroundTaskQueue::Get(browser_context_); |
762 queue->AddPendingTask(browser_context_, extension->id(), | 853 queue->AddPendingTask(browser_context_, extension->id(), |
763 base::Bind(&DoNothing)); | 854 base::Bind(&DoNothing)); |
764 } | 855 } |
765 } | 856 } |
766 | 857 |
767 void EventRouter::OnExtensionLoaded(content::BrowserContext* browser_context, | 858 void EventRouter::OnExtensionLoaded(content::BrowserContext* browser_context, |
768 const Extension* extension) { | 859 const Extension* extension) { |
769 // Add all registered lazy listeners to our cache. | 860 // Add all registered lazy listeners to our cache. |
861 // TODO(lazyboy): Load extension SW lazy events. | |
770 std::set<std::string> registered_events = | 862 std::set<std::string> registered_events = |
771 GetRegisteredEvents(extension->id()); | 863 GetRegisteredEvents(extension->id(), RegisteredEventType::kLazy); |
772 listeners_.LoadUnfilteredLazyListeners(extension->id(), registered_events); | 864 listeners_.LoadUnfilteredLazyListeners(extension->id(), registered_events); |
865 // TODO(lazyboy): Load extension SW filtered events when they are available. | |
773 const DictionaryValue* filtered_events = GetFilteredEvents(extension->id()); | 866 const DictionaryValue* filtered_events = GetFilteredEvents(extension->id()); |
774 if (filtered_events) | 867 if (filtered_events) |
775 listeners_.LoadFilteredLazyListeners(extension->id(), *filtered_events); | 868 listeners_.LoadFilteredLazyListeners(extension->id(), *filtered_events); |
776 } | 869 } |
777 | 870 |
778 void EventRouter::OnExtensionUnloaded(content::BrowserContext* browser_context, | 871 void EventRouter::OnExtensionUnloaded(content::BrowserContext* browser_context, |
779 const Extension* extension, | 872 const Extension* extension, |
780 UnloadedExtensionReason reason) { | 873 UnloadedExtensionReason reason) { |
781 // Remove all registered listeners from our cache. | 874 // Remove all registered listeners from our cache. |
782 listeners_.RemoveListenersForExtension(extension->id()); | 875 listeners_.RemoveListenersForExtension(extension->id()); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
837 const std::string& extension_id, | 930 const std::string& extension_id, |
838 const GURL& listener_url, | 931 const GURL& listener_url, |
839 content::BrowserContext* browser_context) | 932 content::BrowserContext* browser_context) |
840 : event_name(event_name), | 933 : event_name(event_name), |
841 extension_id(extension_id), | 934 extension_id(extension_id), |
842 listener_url(listener_url), | 935 listener_url(listener_url), |
843 browser_context(browser_context) { | 936 browser_context(browser_context) { |
844 } | 937 } |
845 | 938 |
846 } // namespace extensions | 939 } // namespace extensions |
OLD | NEW |