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 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
608 | 608 |
609 // Move the iterator past this event listener. This must match | 609 // Move the iterator past this event listener. This must match |
610 // the handling of the FiringEventIterator::iterator in | 610 // the handling of the FiringEventIterator::iterator in |
611 // EventTarget::removeEventListener. | 611 // EventTarget::removeEventListener. |
612 ++i; | 612 ++i; |
613 | 613 |
614 if (event->eventPhase() == Event::kCapturingPhase && !registeredListener .capture()) | 614 if (event->eventPhase() == Event::kCapturingPhase && !registeredListener .capture()) |
615 continue; | 615 continue; |
616 if (event->eventPhase() == Event::kBubblingPhase && registeredListener.c apture()) | 616 if (event->eventPhase() == Event::kBubblingPhase && registeredListener.c apture()) |
617 continue; | 617 continue; |
618 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
| |
619 continue; | |
618 | 620 |
619 // If stopImmediatePropagation has been called, we just break out immedi ately, without | 621 // If stopImmediatePropagation has been called, we just break out immedi ately, without |
620 // handling any more events on this target. | 622 // handling any more events on this target. |
621 if (event->immediatePropagationStopped()) | 623 if (event->immediatePropagationStopped()) |
622 break; | 624 break; |
623 | 625 |
624 event->setHandlingPassive(registeredListener.passive()); | 626 event->setHandlingPassive(registeredListener.passive()); |
625 bool passiveForced = registeredListener.passiveForcedForDocumentTarget() ; | 627 bool passiveForced = registeredListener.passiveForcedForDocumentTarget() ; |
626 | 628 |
629 // Mark listener for removal before executing the listener, in case the listener tries to | |
630 // dispatch an event that would cause it to get executed again. | |
631 if (registeredListener.once()) | |
632 registeredListener.setOnceBeingRemoved(); | |
633 | |
627 InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, thi s, event); | 634 InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, thi s, event); |
628 | 635 |
629 EventListener* listener = registeredListener.listener(); | 636 EventListener* listener = registeredListener.listener(); |
630 | 637 |
631 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli ng | 638 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli ng |
632 // event listeners, even though that violates some versions of the DOM s pec. | 639 // event listeners, even though that violates some versions of the DOM s pec. |
633 listener->handleEvent(context, event); | 640 listener->handleEvent(context, event); |
634 firedListener = true; | 641 firedListener = true; |
635 | 642 |
636 // If we're about to report this event listener as blocking, make sure i t wasn't | 643 // If we're about to report this event listener as blocking, make sure i t wasn't |
637 // removed while handling the event. | 644 // removed while handling the event. |
638 if (shouldReportBlockedEvent && i > 0 && entry[i - 1].listener() == list ener | 645 if (shouldReportBlockedEvent && i > 0 && entry[i - 1].listener() == list ener |
639 && !entry[i - 1].passive() && !entry[i - 1].blockedEventWarningEmitt ed() && !event->defaultPrevented()) { | 646 && !entry[i - 1].passive() && !entry[i - 1].blockedEventWarningEmitt ed() && !event->defaultPrevented()) { |
640 reportBlockedEvent(context, event, &entry[i - 1], now - event->platf ormTimeStamp()); | 647 reportBlockedEvent(context, event, &entry[i - 1], now - event->platf ormTimeStamp()); |
641 } | 648 } |
642 | 649 |
643 if (passiveForced) { | 650 if (passiveForced) { |
644 DEFINE_STATIC_LOCAL(EnumerationHistogram, passiveForcedHistogram, (" Event.PassiveForcedEventDispatchCancelled", PassiveForcedListenerResultTypeMax)) ; | 651 DEFINE_STATIC_LOCAL(EnumerationHistogram, passiveForcedHistogram, (" Event.PassiveForcedEventDispatchCancelled", PassiveForcedListenerResultTypeMax)) ; |
645 PassiveForcedListenerResultType breakageType = PreventDefaultNotCall ed; | 652 PassiveForcedListenerResultType breakageType = PreventDefaultNotCall ed; |
646 if (event->preventDefaultCalledDuringPassive()) | 653 if (event->preventDefaultCalledDuringPassive()) |
647 breakageType = DocumentLevelTouchPreventDefaultCalled; | 654 breakageType = DocumentLevelTouchPreventDefaultCalled; |
648 | 655 |
649 passiveForcedHistogram.count(breakageType); | 656 passiveForcedHistogram.count(breakageType); |
650 } | 657 } |
651 | 658 |
652 event->setHandlingPassive(false); | 659 event->setHandlingPassive(false); |
653 | 660 if (registeredListener.once()) |
661 removeEventListener(event->type(), listener, registeredListener.capt ure()); | |
654 RELEASE_ASSERT(i <= size); | 662 RELEASE_ASSERT(i <= size); |
655 } | 663 } |
656 d->firingEventIterators->removeLast(); | 664 d->firingEventIterators->removeLast(); |
657 return firedListener; | 665 return firedListener; |
658 } | 666 } |
659 | 667 |
660 DispatchEventResult EventTarget::dispatchEventResult(const Event& event) | 668 DispatchEventResult EventTarget::dispatchEventResult(const Event& event) |
661 { | 669 { |
662 if (event.defaultPrevented()) | 670 if (event.defaultPrevented()) |
663 return DispatchEventResult::CanceledByEventHandler; | 671 return DispatchEventResult::CanceledByEventHandler; |
(...skipping 27 matching lines...) Expand all Loading... | |
691 // they have one less listener to invoke. | 699 // they have one less listener to invoke. |
692 if (d->firingEventIterators) { | 700 if (d->firingEventIterators) { |
693 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { | 701 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { |
694 d->firingEventIterators->at(i).iterator = 0; | 702 d->firingEventIterators->at(i).iterator = 0; |
695 d->firingEventIterators->at(i).end = 0; | 703 d->firingEventIterators->at(i).end = 0; |
696 } | 704 } |
697 } | 705 } |
698 } | 706 } |
699 | 707 |
700 } // namespace blink | 708 } // namespace blink |
OLD | NEW |