Chromium Code Reviews| 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(); |