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

Side by Side Diff: extensions/browser/event_router.cc

Issue 2886923002: [extension SW]: Support event listener registration and event dispatching. (Closed)
Patch Set: address comments Created 3 years, 6 months 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
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 "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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698