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

Unified Diff: extensions/renderer/event_bindings.cc

Issue 2886923002: [extension SW]: Support event listener registration and event dispatching. (Closed)
Patch Set: address comments Created 3 years, 7 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 side-by-side diff with in-line comments
Download patch
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));
+ }
}
}

Powered by Google App Engine
This is Rietveld 408576698