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

Unified Diff: extensions/renderer/event_emitter.cc

Issue 2722463006: [Extensions Bindings] Notify of event unregistration on invalidation (Closed)
Patch Set: Rebase Created 3 years, 9 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
« no previous file with comments | « extensions/renderer/event_emitter.h ('k') | extensions/renderer/native_extension_bindings_system.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/renderer/event_emitter.cc
diff --git a/extensions/renderer/event_emitter.cc b/extensions/renderer/event_emitter.cc
index 96eab80b41dbe84b29b28b8d0c17eed8d1de25c7..82523e96aeef7458c56031d0531294bf8e8991e5 100644
--- a/extensions/renderer/event_emitter.cc
+++ b/extensions/renderer/event_emitter.cc
@@ -52,7 +52,19 @@ void EventEmitter::Fire(v8::Local<v8::Context> context,
}
}
+void EventEmitter::Invalidate() {
+ valid_ = false;
+ listeners_.clear();
+}
+
void EventEmitter::AddListener(gin::Arguments* arguments) {
+ // If script from another context maintains a reference to this object, it's
+ // possible that functions can be called after this object's owning context
+ // is torn down and released by blink. We don't support this behavior, but
+ // we need to make sure nothing crashes, so early out of methods.
+ if (!valid_)
+ return;
+
v8::Local<v8::Function> listener;
// TODO(devlin): For some reason, we don't throw an error when someone calls
// add/removeListener with no argument. We probably should. For now, keep
@@ -78,6 +90,10 @@ void EventEmitter::AddListener(gin::Arguments* arguments) {
}
void EventEmitter::RemoveListener(gin::Arguments* arguments) {
+ // See comment in AddListener().
+ if (!valid_)
+ return;
+
v8::Local<v8::Function> listener;
// See comment in AddListener().
if (!arguments->GetNext(&listener))
@@ -107,6 +123,9 @@ bool EventEmitter::HasListeners() {
}
void EventEmitter::Dispatch(gin::Arguments* arguments) {
+ if (!valid_)
+ return;
+
if (listeners_.empty())
return;
v8::HandleScope handle_scope(arguments->isolate());
« no previous file with comments | « extensions/renderer/event_emitter.h ('k') | extensions/renderer/native_extension_bindings_system.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698