| 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));
|
|
|