Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(913)

Unified Diff: extensions/renderer/api_event_handler.cc

Issue 2722463006: [Extensions Bindings] Notify of event unregistration on invalidation (Closed)
Patch Set: . Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698