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

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..639d5a0828ab76687b5fbb87c07b180af69e42d5 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,33 @@ 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;
if (IncrementEventListenerCount(context(), event_name) == 1) {
- content::RenderThread::Get()->Send(new ExtensionHostMsg_AddListener(
- extension_id, context()->url(), event_name));
+ if (is_service_worker_context) {
Devlin 2017/06/01 04:54:50 This is a bit painful. Can we add an IPCSender* a
lazyboy 2017/06/01 23:33:29 I've reworked the code a bit to remove duplicate I
+ WorkerThreadDispatcher::Get()->GetRequestSender()->SendIPC(
+ new ExtensionHostMsg_AddListener(extension_id, context()->url(),
+ event_name, worker_thread_id));
+ } else {
+ content::RenderThread::Get()->Send(new ExtensionHostMsg_AddListener(
+ extension_id, context()->url(), event_name, kNonWorkerThreadId));
+ }
}
// 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));
+ content::RenderThread::Get()->Send(new ExtensionHostMsg_AddLazyListener(
+ extension_id, event_name, worker_thread_id));
+ } else if (is_service_worker_context) {
+ // context()->url() example:
+ // chrome-extension://admhefkdknjikemecnclbacmoefgfbdm/sw.js
+ WorkerThreadDispatcher::Get()->GetRequestSender()->SendIPC(
+ new ExtensionHostMsg_AddLazyListener(extension_id, event_name,
+ worker_thread_id));
}
}
@@ -227,20 +245,36 @@ 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;
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));
+ if (is_service_worker_context) {
+ WorkerThreadDispatcher::Get()->GetRequestSender()->SendIPC(
+ new ExtensionHostMsg_RemoveListener(extension_id, context()->url(),
+ event_name, worker_thread_id));
+ } else {
+ content::RenderThread::Get()->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) {
+ if (is_service_worker_context) {
+ WorkerThreadDispatcher::Get()->GetRequestSender()->SendIPC(
+ new ExtensionHostMsg_RemoveLazyListener(extension_id, event_name,
+ worker_thread_id));
+ } else if (ExtensionFrameHelper::IsContextForEventPage(context())) {
+ content::RenderThread::Get()->Send(
+ new ExtensionHostMsg_RemoveLazyListener(extension_id, event_name,
+ worker_thread_id));
+ }
}
}

Powered by Google App Engine
This is Rietveld 408576698