| Index: extensions/renderer/api_event_handler.cc
|
| diff --git a/extensions/renderer/api_event_handler.cc b/extensions/renderer/api_event_handler.cc
|
| index 2391607e67ab5955be1ae634c9df4379cd6c6252..6b28d734c78ccc244f97e3f34ff198a9e2b378a1 100644
|
| --- a/extensions/renderer/api_event_handler.cc
|
| +++ b/extensions/renderer/api_event_handler.cc
|
| @@ -38,7 +38,7 @@ struct APIEventPerContextData : public base::SupportsUserData::Data {
|
| gin::Converter<EventEmitter*>::FromV8(
|
| isolate, pair.second.Get(isolate), &emitter);
|
| CHECK(emitter);
|
| - emitter->listeners()->clear();
|
| + emitter->Invalidate();
|
| }
|
| }
|
|
|
| @@ -127,6 +127,29 @@ void APIEventHandler::FireEventInContext(const std::string& event_name,
|
| emitter->Fire(context, &v8_args);
|
| }
|
|
|
| +void APIEventHandler::InvalidateContext(v8::Local<v8::Context> context) {
|
| + gin::PerContextData* per_context_data = gin::PerContextData::From(context);
|
| + DCHECK(per_context_data);
|
| + APIEventPerContextData* data = static_cast<APIEventPerContextData*>(
|
| + per_context_data->GetUserData(kExtensionAPIEventPerContextKey));
|
| + if (!data)
|
| + return;
|
| +
|
| + v8::Isolate* isolate = context->GetIsolate();
|
| + v8::HandleScope scope(isolate);
|
| + for (const auto& pair : data->event_data) {
|
| + EventEmitter* emitter = nullptr;
|
| + gin::Converter<EventEmitter*>::FromV8(isolate, pair.second.Get(isolate),
|
| + &emitter);
|
| + CHECK(emitter);
|
| + emitter->Invalidate();
|
| + listeners_changed_.Run(
|
| + pair.first, binding::EventListenersChanged::NO_LISTENERS, context);
|
| + }
|
| +
|
| + data->event_data.clear();
|
| +}
|
| +
|
| size_t APIEventHandler::GetNumEventListenersForTesting(
|
| const std::string& event_name,
|
| v8::Local<v8::Context> context) {
|
|
|