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