Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Unified Diff: third_party/WebKit/Source/core/events/EventTarget.cpp

Issue 2245723002: Support "once" event listener option (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698