Index: extensions/renderer/event_emitter.cc |
diff --git a/extensions/renderer/event_emitter.cc b/extensions/renderer/event_emitter.cc |
index 8a8d908bbefbb02feca4755633d22f222658f4e1..441517446b08b858682958799fec991e074f9500 100644 |
--- a/extensions/renderer/event_emitter.cc |
+++ b/extensions/renderer/event_emitter.cc |
@@ -34,10 +34,15 @@ gin::ObjectTemplateBuilder EventEmitter::GetObjectTemplateBuilder( |
void EventEmitter::Fire(v8::Local<v8::Context> context, |
std::vector<v8::Local<v8::Value>>* args) { |
- for (const auto& listener : listeners_) { |
- run_js_.Run(listener.Get(context->GetIsolate()), context, args->size(), |
- args->data()); |
- } |
+ // We create a local copy of listeners_ since the array can be modified during |
+ // handling. |
+ std::vector<v8::Local<v8::Function>> listeners; |
+ listeners.reserve(listeners_.size()); |
+ for (const auto& listener : listeners_) |
+ listeners.push_back(listener.Get(context->GetIsolate())); |
+ |
+ for (const auto& listener : listeners) |
+ run_js_.Run(listener, context, args->size(), args->data()); |
} |
void EventEmitter::AddListener(gin::Arguments* arguments) { |