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

Unified Diff: extensions/renderer/event_bindings.cc

Issue 2886923002: [extension SW]: Support event listener registration and event dispatching. (Closed)
Patch Set: fix DCHECK 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..631b67e504f0335509e558c2736006380d37aa17 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,26 @@ 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();
+ IPC::Sender* sender = GetIPCSender();
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));
dcheng 2017/06/05 20:23:15 Isn't this identical to line 210?
lazyboy 2017/06/05 21:12:06 Yes! Thanks for catching this, it must have creepe
+
+ bool is_lazy_context =
+ ExtensionFrameHelper::IsContextForEventPage(context()) ||
+ context()->context_type() == Feature::SERVICE_WORKER_CONTEXT;
+ if (is_lazy_context) {
+ sender->Send(new ExtensionHostMsg_AddLazyListener(extension_id, event_name,
+ worker_thread_id));
}
}
@@ -227,20 +238,27 @@ 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();
+ IPC::Sender* sender = GetIPCSender();
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()) ||
+ context()->context_type() == Feature::SERVICE_WORKER_CONTEXT;
+ if (is_lazy_context) {
+ sender->Send(new ExtensionHostMsg_RemoveLazyListener(
+ extension_id, event_name, worker_thread_id));
+ }
}
}
@@ -351,6 +369,16 @@ std::unique_ptr<EventMatcher> EventBindings::ParseEventMatcher(
std::move(filter), context()->GetRenderFrame()->GetRoutingID());
}
+IPC::Sender* EventBindings::GetIPCSender() {
+ const bool is_service_worker_context =
+ context()->context_type() == Feature::SERVICE_WORKER_CONTEXT;
+ DCHECK_EQ(is_service_worker_context,
+ content::WorkerThread::GetCurrentId() != kNonWorkerThreadId);
+ return is_service_worker_context
+ ? static_cast<IPC::Sender*>(WorkerThreadDispatcher::Get())
+ : static_cast<IPC::Sender*>(content::RenderThread::Get());
+}
+
void EventBindings::OnInvalidated() {
// Detach all attached events that weren't attached. Iterate over a copy
// because it will be mutated.

Powered by Google App Engine
This is Rietveld 408576698