| 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());
|
|
|