Chromium Code Reviews| 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 |