Index: third_party/WebKit/Source/core/events/EventTarget.cpp |
diff --git a/third_party/WebKit/Source/core/events/EventTarget.cpp b/third_party/WebKit/Source/core/events/EventTarget.cpp |
index b6196b5a5759518ddaad490125bcb550e619f540..b0952d7340ee7f20224a75e22fc08a569147fbc5 100644 |
--- a/third_party/WebKit/Source/core/events/EventTarget.cpp |
+++ b/third_party/WebKit/Source/core/events/EventTarget.cpp |
@@ -608,7 +608,7 @@ bool EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList |
bool firedListener = false; |
while (i < size) { |
- RegisteredEventListener& registeredListener = entry[i]; |
+ RegisteredEventListener registeredListener = entry[i]; |
// Move the iterator past this event listener. This must match |
// the handling of the FiringEventIterator::iterator in |
@@ -620,6 +620,12 @@ bool EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList |
if (event->eventPhase() == Event::kBubblingPhase && registeredListener.capture()) |
continue; |
+ EventListener* listener = registeredListener.listener(); |
+ // The listener will retained by Member<EventListener> in the registeredListener |
+ // in case the listener is removed from the listener vector below. |
+ if (registeredListener.once()) |
+ removeEventListener(event->type(), listener, registeredListener.capture()); |
tkent
2016/08/19 02:21:15
Is it safe to remove a listener while iterating ov
Anton Obzhirov
2016/08/19 10:41:39
No, it is not, thanks for pointing out. I need to
|
+ |
// If stopImmediatePropagation has been called, we just break out immediately, without |
// handling any more events on this target. |
if (event->immediatePropagationStopped()) |
@@ -630,8 +636,6 @@ bool EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList |
InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, this, event); |
- EventListener* listener = registeredListener.listener(); |
- |
// To match Mozilla, the AT_TARGET phase fires both capturing and bubbling |
// event listeners, even though that violates some versions of the DOM spec. |
listener->handleEvent(context, event); |