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 19d5091f15ebdd4558136670d22ba78525c43cb5..2e789148724b812c5069fe593a494e2bfd2655a0 100644 |
--- a/third_party/WebKit/Source/core/events/EventTarget.cpp |
+++ b/third_party/WebKit/Source/core/events/EventTarget.cpp |
@@ -615,6 +615,8 @@ bool EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList |
continue; |
if (event->eventPhase() == Event::kBubblingPhase && registeredListener.capture()) |
continue; |
+ if (registeredListener.onceBeingRemoved()) |
dtapuska
2016/08/12 18:44:02
Is it possible to change the RegisteredListener no
Anton Obzhirov
2016/08/15 22:18:01
Hm, I will need to add new method to EventListener
|
+ continue; |
// If stopImmediatePropagation has been called, we just break out immediately, without |
// handling any more events on this target. |
@@ -624,6 +626,11 @@ bool EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList |
event->setHandlingPassive(registeredListener.passive()); |
bool passiveForced = registeredListener.passiveForcedForDocumentTarget(); |
+ // Mark listener for removal before executing the listener, in case the listener tries to |
+ // dispatch an event that would cause it to get executed again. |
+ if (registeredListener.once()) |
+ registeredListener.setOnceBeingRemoved(); |
+ |
InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, this, event); |
EventListener* listener = registeredListener.listener(); |
@@ -650,7 +657,8 @@ bool EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList |
} |
event->setHandlingPassive(false); |
- |
+ if (registeredListener.once()) |
+ removeEventListener(event->type(), listener, registeredListener.capture()); |
RELEASE_ASSERT(i <= size); |
} |
d->firingEventIterators->removeLast(); |