OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |
6 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 6 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
7 * (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> | 7 * (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> |
8 * | 8 * |
9 * Redistribution and use in source and binary forms, with or without | 9 * Redistribution and use in source and binary forms, with or without |
10 * modification, are permitted provided that the following conditions | 10 * modification, are permitted provided that the following conditions |
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
601 double blockedEventThreshold = blockedEventsWarningThreshold(context, event) ; | 601 double blockedEventThreshold = blockedEventsWarningThreshold(context, event) ; |
602 double now = 0.0; | 602 double now = 0.0; |
603 bool shouldReportBlockedEvent = false; | 603 bool shouldReportBlockedEvent = false; |
604 if (blockedEventThreshold) { | 604 if (blockedEventThreshold) { |
605 now = WTF::monotonicallyIncreasingTime(); | 605 now = WTF::monotonicallyIncreasingTime(); |
606 shouldReportBlockedEvent = now - event->platformTimeStamp() > blockedEve ntThreshold; | 606 shouldReportBlockedEvent = now - event->platformTimeStamp() > blockedEve ntThreshold; |
607 } | 607 } |
608 bool firedListener = false; | 608 bool firedListener = false; |
609 | 609 |
610 while (i < size) { | 610 while (i < size) { |
611 RegisteredEventListener& registeredListener = entry[i]; | 611 RegisteredEventListener registeredListener = entry[i]; |
612 | 612 |
613 // Move the iterator past this event listener. This must match | 613 // Move the iterator past this event listener. This must match |
614 // the handling of the FiringEventIterator::iterator in | 614 // the handling of the FiringEventIterator::iterator in |
615 // EventTarget::removeEventListener. | 615 // EventTarget::removeEventListener. |
616 ++i; | 616 ++i; |
617 | 617 |
618 if (event->eventPhase() == Event::kCapturingPhase && !registeredListener .capture()) | 618 if (event->eventPhase() == Event::kCapturingPhase && !registeredListener .capture()) |
619 continue; | 619 continue; |
620 if (event->eventPhase() == Event::kBubblingPhase && registeredListener.c apture()) | 620 if (event->eventPhase() == Event::kBubblingPhase && registeredListener.c apture()) |
621 continue; | 621 continue; |
622 | 622 |
623 EventListener* listener = registeredListener.listener(); | |
624 // The listener will retained by Member<EventListener> in the registered Listener | |
625 // in case the listener is removed from the listener vector below. | |
626 if (registeredListener.once()) | |
627 removeEventListener(event->type(), listener, registeredListener.capt ure()); | |
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
| |
628 | |
623 // If stopImmediatePropagation has been called, we just break out immedi ately, without | 629 // If stopImmediatePropagation has been called, we just break out immedi ately, without |
624 // handling any more events on this target. | 630 // handling any more events on this target. |
625 if (event->immediatePropagationStopped()) | 631 if (event->immediatePropagationStopped()) |
626 break; | 632 break; |
627 | 633 |
628 event->setHandlingPassive(registeredListener.passive()); | 634 event->setHandlingPassive(registeredListener.passive()); |
629 bool passiveForced = registeredListener.passiveForcedForDocumentTarget() ; | 635 bool passiveForced = registeredListener.passiveForcedForDocumentTarget() ; |
630 | 636 |
631 InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, thi s, event); | 637 InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, thi s, event); |
632 | 638 |
633 EventListener* listener = registeredListener.listener(); | |
634 | |
635 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli ng | 639 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli ng |
636 // event listeners, even though that violates some versions of the DOM s pec. | 640 // event listeners, even though that violates some versions of the DOM s pec. |
637 listener->handleEvent(context, event); | 641 listener->handleEvent(context, event); |
638 firedListener = true; | 642 firedListener = true; |
639 | 643 |
640 // If we're about to report this event listener as blocking, make sure i t wasn't | 644 // If we're about to report this event listener as blocking, make sure i t wasn't |
641 // removed while handling the event. | 645 // removed while handling the event. |
642 if (shouldReportBlockedEvent && i > 0 && entry[i - 1].listener() == list ener | 646 if (shouldReportBlockedEvent && i > 0 && entry[i - 1].listener() == list ener |
643 && !entry[i - 1].passive() && !entry[i - 1].blockedEventWarningEmitt ed() && !event->defaultPrevented()) { | 647 && !entry[i - 1].passive() && !entry[i - 1].blockedEventWarningEmitt ed() && !event->defaultPrevented()) { |
644 reportBlockedEvent(context, event, &entry[i - 1], now - event->platf ormTimeStamp()); | 648 reportBlockedEvent(context, event, &entry[i - 1], now - event->platf ormTimeStamp()); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
695 // they have one less listener to invoke. | 699 // they have one less listener to invoke. |
696 if (d->firingEventIterators) { | 700 if (d->firingEventIterators) { |
697 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { | 701 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { |
698 d->firingEventIterators->at(i).iterator = 0; | 702 d->firingEventIterators->at(i).iterator = 0; |
699 d->firingEventIterators->at(i).end = 0; | 703 d->firingEventIterators->at(i).end = 0; |
700 } | 704 } |
701 } | 705 } |
702 } | 706 } |
703 | 707 |
704 } // namespace blink | 708 } // namespace blink |
OLD | NEW |