Index: extensions/renderer/event_bindings.cc |
diff --git a/extensions/renderer/event_bindings.cc b/extensions/renderer/event_bindings.cc |
index 7a5dee4d37519bed3120976e178c18147c22ec44..297f3b685cb5fa5efa508d9445253a4ca652ffb7 100644 |
--- a/extensions/renderer/event_bindings.cc |
+++ b/extensions/renderer/event_bindings.cc |
@@ -229,12 +229,14 @@ void EventBindings::DispatchEventInContext( |
void EventBindings::AttachEventHandler( |
const v8::FunctionCallbackInfo<v8::Value>& args) { |
- CHECK_EQ(1, args.Length()); |
+ CHECK_EQ(2, args.Length()); |
CHECK(args[0]->IsString()); |
- AttachEvent(*v8::String::Utf8Value(args[0])); |
+ CHECK(args[1]->IsBoolean()); |
+ AttachEvent(*v8::String::Utf8Value(args[0]), args[1]->BooleanValue()); |
} |
-void EventBindings::AttachEvent(const std::string& event_name) { |
+void EventBindings::AttachEvent(const std::string& event_name, |
+ bool supports_lazy_events) { |
if (!context()->HasAccessOrThrowError(event_name)) |
return; |
@@ -266,7 +268,7 @@ void EventBindings::AttachEvent(const std::string& event_name) { |
bool is_lazy_context = |
ExtensionFrameHelper::IsContextForEventPage(context()) || |
context()->context_type() == Feature::SERVICE_WORKER_CONTEXT; |
- if (is_lazy_context) { |
+ if (is_lazy_context && supports_lazy_events) { |
if (is_service_worker_context) { |
sender->Send(new ExtensionHostMsg_AddLazyServiceWorkerListener( |
extension_id, event_name, context()->service_worker_scope())); |
@@ -279,13 +281,18 @@ void EventBindings::AttachEvent(const std::string& event_name) { |
void EventBindings::DetachEventHandler( |
const v8::FunctionCallbackInfo<v8::Value>& args) { |
- CHECK_EQ(2, args.Length()); |
+ CHECK_EQ(3, args.Length()); |
CHECK(args[0]->IsString()); |
CHECK(args[1]->IsBoolean()); |
- DetachEvent(*v8::String::Utf8Value(args[0]), args[1]->BooleanValue()); |
+ CHECK(args[2]->IsBoolean()); |
+ bool was_manual = args[1]->BooleanValue(); |
+ bool supports_lazy_listeners = args[2]->BooleanValue(); |
+ DetachEvent(*v8::String::Utf8Value(args[0]), |
+ was_manual && supports_lazy_listeners); |
} |
-void EventBindings::DetachEvent(const std::string& event_name, bool is_manual) { |
+void EventBindings::DetachEvent(const std::string& event_name, |
+ bool remove_lazy_listener) { |
// See comment in AttachEvent(). |
attached_event_names_.erase(event_name); |
@@ -306,7 +313,7 @@ void EventBindings::DetachEvent(const std::string& event_name, bool is_manual) { |
// 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 (remove_lazy_listener) { |
bool is_lazy_context = |
ExtensionFrameHelper::IsContextForEventPage(context()) || |
context()->context_type() == Feature::SERVICE_WORKER_CONTEXT; |
@@ -329,9 +336,10 @@ void EventBindings::DetachEvent(const std::string& event_name, bool is_manual) { |
// dispatchEvent(). |
void EventBindings::AttachFilteredEvent( |
const v8::FunctionCallbackInfo<v8::Value>& args) { |
- CHECK_EQ(2, args.Length()); |
+ CHECK_EQ(3, args.Length()); |
CHECK(args[0]->IsString()); |
CHECK(args[1]->IsObject()); |
+ CHECK(args[2]->IsBoolean()); |
std::string event_name = *v8::String::Utf8Value(args[0]); |
if (!context()->HasAccessOrThrowError(event_name)) |
@@ -349,6 +357,8 @@ void EventBindings::AttachFilteredEvent( |
filter = base::DictionaryValue::From(std::move(filter_value)); |
} |
+ bool supports_lazy_events = args[2]->BooleanValue(); |
+ |
int id = g_event_filter.Get().AddEventMatcher( |
event_name, |
base::MakeUnique<EventMatcher>( |
@@ -365,7 +375,8 @@ void EventBindings::AttachFilteredEvent( |
base::DictionaryValue* filter_weak = matcher->value(); |
std::string extension_id = context()->GetExtensionID(); |
if (AddFilter(event_name, extension_id, *filter_weak)) { |
- bool lazy = ExtensionFrameHelper::IsContextForEventPage(context()); |
+ bool lazy = supports_lazy_events && |
+ ExtensionFrameHelper::IsContextForEventPage(context()); |
content::RenderThread::Get()->Send(new ExtensionHostMsg_AddFilteredListener( |
extension_id, event_name, *filter_weak, lazy)); |
} |
@@ -375,13 +386,18 @@ void EventBindings::AttachFilteredEvent( |
void EventBindings::DetachFilteredEventHandler( |
const v8::FunctionCallbackInfo<v8::Value>& args) { |
- CHECK_EQ(2, args.Length()); |
+ CHECK_EQ(3, args.Length()); |
CHECK(args[0]->IsInt32()); |
CHECK(args[1]->IsBoolean()); |
- DetachFilteredEvent(args[0]->Int32Value(), args[1]->BooleanValue()); |
+ CHECK(args[2]->IsBoolean()); |
+ bool was_manual = args[1]->BooleanValue(); |
+ bool supports_lazy_events = args[2]->BooleanValue(); |
+ DetachFilteredEvent(args[0]->Int32Value(), |
+ was_manual && supports_lazy_events); |
} |
-void EventBindings::DetachFilteredEvent(int matcher_id, bool is_manual) { |
+void EventBindings::DetachFilteredEvent(int matcher_id, |
+ bool remove_lazy_event) { |
EventFilter& event_filter = g_event_filter.Get(); |
EventMatcher* event_matcher = event_filter.GetEventMatcher(matcher_id); |
@@ -390,8 +406,8 @@ void EventBindings::DetachFilteredEvent(int matcher_id, bool is_manual) { |
// Only send IPCs the last time a filter gets removed. |
std::string extension_id = context()->GetExtensionID(); |
if (RemoveFilter(event_name, extension_id, event_matcher->value())) { |
- bool remove_lazy = |
- is_manual && ExtensionFrameHelper::IsContextForEventPage(context()); |
+ bool remove_lazy = remove_lazy_event && |
+ ExtensionFrameHelper::IsContextForEventPage(context()); |
content::RenderThread::Get()->Send( |
new ExtensionHostMsg_RemoveFilteredListener( |
extension_id, event_name, *event_matcher->value(), remove_lazy)); |