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 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); |