| Index: extensions/renderer/bindings/api_event_listeners.cc
|
| diff --git a/extensions/renderer/bindings/api_event_listeners.cc b/extensions/renderer/bindings/api_event_listeners.cc
|
| index 140d8ddb4f1ec669868eeda20f9fc3b5a0bd3316..06a90609e89ef4a5a58d96bb9248954d08beca54 100644
|
| --- a/extensions/renderer/bindings/api_event_listeners.cc
|
| +++ b/extensions/renderer/bindings/api_event_listeners.cc
|
| @@ -79,8 +79,11 @@ bool ValidateFilter(v8::Local<v8::Context> context,
|
|
|
| UnfilteredEventListeners::UnfilteredEventListeners(
|
| const ListenersUpdated& listeners_updated,
|
| - int max_listeners)
|
| - : listeners_updated_(listeners_updated), max_listeners_(max_listeners) {
|
| + int max_listeners,
|
| + bool supports_lazy_listeners)
|
| + : listeners_updated_(listeners_updated),
|
| + max_listeners_(max_listeners),
|
| + supports_lazy_listeners_(supports_lazy_listeners) {
|
| DCHECK(max_listeners_ == binding::kNoListenerMax || max_listeners_ > 0);
|
| }
|
| UnfilteredEventListeners::~UnfilteredEventListeners() = default;
|
| @@ -106,7 +109,7 @@ bool UnfilteredEventListeners::AddListener(v8::Local<v8::Function> listener,
|
| v8::Global<v8::Function>(context->GetIsolate(), listener));
|
| if (listeners_.size() == 1) {
|
| listeners_updated_.Run(binding::EventListenersChanged::HAS_LISTENERS,
|
| - nullptr, true, context);
|
| + nullptr, supports_lazy_listeners_, context);
|
| }
|
|
|
| return true;
|
| @@ -121,7 +124,7 @@ void UnfilteredEventListeners::RemoveListener(v8::Local<v8::Function> listener,
|
| listeners_.erase(iter);
|
| if (listeners_.empty()) {
|
| listeners_updated_.Run(binding::EventListenersChanged::NO_LISTENERS,
|
| - nullptr, true, context);
|
| + nullptr, supports_lazy_listeners_, context);
|
| }
|
| }
|
|
|
| @@ -147,8 +150,11 @@ std::vector<v8::Local<v8::Function>> UnfilteredEventListeners::GetListeners(
|
| void UnfilteredEventListeners::Invalidate(v8::Local<v8::Context> context) {
|
| if (!listeners_.empty()) {
|
| listeners_.clear();
|
| + // We don't want to update stored lazy listeners in this case, since the
|
| + // extension didn't unregister interest in the event.
|
| + bool update_lazy_listeners = false;
|
| listeners_updated_.Run(binding::EventListenersChanged::NO_LISTENERS,
|
| - nullptr, false, context);
|
| + nullptr, update_lazy_listeners, context);
|
| }
|
| }
|
|
|
| @@ -169,10 +175,12 @@ FilteredEventListeners::FilteredEventListeners(
|
| const ListenersUpdated& listeners_updated,
|
| const std::string& event_name,
|
| int max_listeners,
|
| + bool supports_lazy_listeners,
|
| EventFilter* event_filter)
|
| : listeners_updated_(listeners_updated),
|
| event_name_(event_name),
|
| max_listeners_(max_listeners),
|
| + supports_lazy_listeners_(supports_lazy_listeners),
|
| event_filter_(event_filter) {}
|
| FilteredEventListeners::~FilteredEventListeners() = default;
|
|
|
| @@ -208,7 +216,7 @@ bool FilteredEventListeners::AddListener(v8::Local<v8::Function> listener,
|
| {v8::Global<v8::Function>(context->GetIsolate(), listener), filter_id});
|
| if (value_counter_.Add(*matcher->value())) {
|
| listeners_updated_.Run(binding::EventListenersChanged::HAS_LISTENERS,
|
| - matcher->value(), true, context);
|
| + matcher->value(), supports_lazy_listeners_, context);
|
| }
|
|
|
| return true;
|
| @@ -264,7 +272,8 @@ void FilteredEventListeners::InvalidateListener(
|
| DCHECK(matcher);
|
| if (value_counter_.Remove(*matcher->value())) {
|
| listeners_updated_.Run(binding::EventListenersChanged::NO_LISTENERS,
|
| - matcher->value(), was_manual, context);
|
| + matcher->value(),
|
| + was_manual && supports_lazy_listeners_, context);
|
| }
|
|
|
| event_filter_->RemoveEventMatcher(listener.filter_id);
|
|
|