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