Chromium Code Reviews| Index: extensions/renderer/event_bindings.cc |
| diff --git a/extensions/renderer/event_bindings.cc b/extensions/renderer/event_bindings.cc |
| index 5e8d41ac33cb30772b39e0ae6163d92f6985ede5..da5eec650882742566d7cbf9d9e427d2f689a652 100644 |
| --- a/extensions/renderer/event_bindings.cc |
| +++ b/extensions/renderer/event_bindings.cc |
| @@ -18,12 +18,15 @@ |
| #include "content/public/renderer/render_frame.h" |
| #include "content/public/renderer/render_thread.h" |
| #include "content/public/renderer/render_view.h" |
| +#include "extensions/common/constants.h" |
| #include "extensions/common/event_filter.h" |
| #include "extensions/common/extension.h" |
| #include "extensions/common/extension_messages.h" |
| #include "extensions/common/value_counter.h" |
| #include "extensions/renderer/extension_frame_helper.h" |
| #include "extensions/renderer/script_context.h" |
| +#include "extensions/renderer/service_worker_request_sender.h" |
| +#include "extensions/renderer/worker_thread_dispatcher.h" |
| #include "url/gurl.h" |
| namespace extensions { |
| @@ -200,18 +203,32 @@ void EventBindings::AttachEvent(const std::string& event_name) { |
| // chrome/test/data/extensions/api_test/events/background.js. |
| attached_event_names_.insert(event_name); |
| + const int worker_thread_id = content::WorkerThread::GetCurrentId(); |
| const std::string& extension_id = context()->GetExtensionID(); |
| + const bool is_service_worker_context = |
| + context()->context_type() == Feature::SERVICE_WORKER_CONTEXT; |
| + DCHECK_EQ(is_service_worker_context, worker_thread_id != kNonWorkerThreadId); |
| + IPC::Sender* sender = |
|
Devlin
2017/06/02 14:53:08
Maybe make a method GetIPCSender() that does this?
lazyboy
2017/06/02 17:58:59
Done.
|
| + is_service_worker_context |
| + ? static_cast<IPC::Sender*>(WorkerThreadDispatcher::Get()) |
| + : static_cast<IPC::Sender*>(content::RenderThread::Get()); |
| if (IncrementEventListenerCount(context(), event_name) == 1) { |
| - content::RenderThread::Get()->Send(new ExtensionHostMsg_AddListener( |
| - extension_id, context()->url(), event_name)); |
| + sender->Send(new ExtensionHostMsg_AddListener( |
| + extension_id, context()->url(), event_name, worker_thread_id)); |
| } |
| // This is called the first time the page has added a listener. Since |
| // the background page is the only lazy page, we know this is the first |
| // time this listener has been registered. |
| - if (ExtensionFrameHelper::IsContextForEventPage(context())) { |
| - content::RenderThread::Get()->Send( |
| - new ExtensionHostMsg_AddLazyListener(extension_id, event_name)); |
| + sender->Send(new ExtensionHostMsg_AddListener(extension_id, context()->url(), |
| + event_name, worker_thread_id)); |
| + |
| + bool is_lazy_context = |
| + ExtensionFrameHelper::IsContextForEventPage(context()) || |
| + is_service_worker_context; |
| + if (is_lazy_context) { |
| + sender->Send(new ExtensionHostMsg_AddLazyListener(extension_id, event_name, |
| + worker_thread_id)); |
| } |
| } |
| @@ -227,20 +244,34 @@ void EventBindings::DetachEvent(const std::string& event_name, bool is_manual) { |
| // See comment in AttachEvent(). |
| attached_event_names_.erase(event_name); |
| + int worker_thread_id = content::WorkerThread::GetCurrentId(); |
| + const bool is_service_worker_context = |
| + context()->context_type() == Feature::SERVICE_WORKER_CONTEXT; |
| + DCHECK_EQ(is_service_worker_context, worker_thread_id != kNonWorkerThreadId); |
| + |
| + IPC::Sender* sender = |
| + is_service_worker_context |
| + ? static_cast<IPC::Sender*>(WorkerThreadDispatcher::Get()) |
| + : static_cast<IPC::Sender*>(content::RenderThread::Get()); |
| const std::string& extension_id = context()->GetExtensionID(); |
| if (DecrementEventListenerCount(context(), event_name) == 0) { |
| - content::RenderThread::Get()->Send(new ExtensionHostMsg_RemoveListener( |
| - extension_id, context()->url(), event_name)); |
| + sender->Send(new ExtensionHostMsg_RemoveListener( |
| + extension_id, context()->url(), event_name, worker_thread_id)); |
| } |
| // DetachEvent is called when the last listener for the context is |
| - // removed. If the context is the background page, and it removes the |
| - // last listener manually, then we assume that it is no longer interested |
| - // in being awakened for this event. |
| - if (is_manual && ExtensionFrameHelper::IsContextForEventPage(context())) { |
| - content::RenderThread::Get()->Send( |
| - new ExtensionHostMsg_RemoveLazyListener(extension_id, event_name)); |
| + // removed. If the context is the background page or service worker, and it |
| + // removes the last listener manually, then we assume that it is no longer |
| + // interested in being awakened for this event. |
| + if (is_manual) { |
| + bool is_lazy_context = |
| + ExtensionFrameHelper::IsContextForEventPage(context()) || |
| + is_service_worker_context; |
| + if (is_lazy_context) { |
| + sender->Send(new ExtensionHostMsg_RemoveLazyListener( |
| + extension_id, event_name, worker_thread_id)); |
| + } |
| } |
| } |