| 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 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 if (!d) | 477 if (!d) |
| 478 return DispatchEventResult::NotCanceled; | 478 return DispatchEventResult::NotCanceled; |
| 479 | 479 |
| 480 EventListenerVector* legacyListenersVector = nullptr; | 480 EventListenerVector* legacyListenersVector = nullptr; |
| 481 AtomicString legacyTypeName = legacyType(event); | 481 AtomicString legacyTypeName = legacyType(event); |
| 482 if (!legacyTypeName.isEmpty()) | 482 if (!legacyTypeName.isEmpty()) |
| 483 legacyListenersVector = d->eventListenerMap.find(legacyTypeName); | 483 legacyListenersVector = d->eventListenerMap.find(legacyTypeName); |
| 484 | 484 |
| 485 EventListenerVector* listenersVector = d->eventListenerMap.find(event->type(
)); | 485 EventListenerVector* listenersVector = d->eventListenerMap.find(event->type(
)); |
| 486 | 486 |
| 487 bool firedEventListeners = false; |
| 487 if (listenersVector) { | 488 if (listenersVector) { |
| 488 fireEventListeners(event, d, *listenersVector); | 489 firedEventListeners = fireEventListeners(event, d, *listenersVector); |
| 489 } else if (legacyListenersVector) { | 490 } else if (legacyListenersVector) { |
| 490 AtomicString unprefixedTypeName = event->type(); | 491 AtomicString unprefixedTypeName = event->type(); |
| 491 event->setType(legacyTypeName); | 492 event->setType(legacyTypeName); |
| 492 fireEventListeners(event, d, *legacyListenersVector); | 493 firedEventListeners = fireEventListeners(event, d, *legacyListenersVecto
r); |
| 493 event->setType(unprefixedTypeName); | 494 event->setType(unprefixedTypeName); |
| 494 } | 495 } |
| 495 | 496 |
| 497 // Only invoke the callback if event listeners were fired for this phase. |
| 498 if (firedEventListeners) |
| 499 event->doneDispatchingEventAtCurrentTarget(); |
| 500 |
| 501 // TODO(dtapuska): Should we really do counting here for these events |
| 502 // if we really didn't fire a listener? For example having a bubbling |
| 503 // listener on an event that doesn't bubble likely records a UMA |
| 504 // metric where it probably shouldn't because it was never fired. |
| 505 // See https://crbug.com/612829 |
| 496 Editor::countEvent(getExecutionContext(), event); | 506 Editor::countEvent(getExecutionContext(), event); |
| 497 countLegacyEvents(legacyTypeName, listenersVector, legacyListenersVector); | 507 countLegacyEvents(legacyTypeName, listenersVector, legacyListenersVector); |
| 498 return dispatchEventResult(*event); | 508 return dispatchEventResult(*event); |
| 499 } | 509 } |
| 500 | 510 |
| 501 void EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList
enerVector& entry) | 511 bool EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList
enerVector& entry) |
| 502 { | 512 { |
| 503 // Fire all listeners registered for this event. Don't fire listeners remove
d | 513 // Fire all listeners registered for this event. Don't fire listeners remove
d |
| 504 // during event dispatch. Also, don't fire event listeners added during even
t | 514 // during event dispatch. Also, don't fire event listeners added during even
t |
| 505 // dispatch. Conveniently, all new event listeners will be added after or at | 515 // dispatch. Conveniently, all new event listeners will be added after or at |
| 506 // index |size|, so iterating up to (but not including) |size| naturally exc
ludes | 516 // index |size|, so iterating up to (but not including) |size| naturally exc
ludes |
| 507 // new event listeners. | 517 // new event listeners. |
| 508 | 518 |
| 509 if (event->type() == EventTypeNames::beforeunload) { | 519 if (event->type() == EventTypeNames::beforeunload) { |
| 510 if (LocalDOMWindow* executingWindow = this->executingWindow()) { | 520 if (LocalDOMWindow* executingWindow = this->executingWindow()) { |
| 511 if (executingWindow->top()) | 521 if (executingWindow->top()) |
| 512 UseCounter::count(executingWindow->document(), UseCounter::SubFr
ameBeforeUnloadFired); | 522 UseCounter::count(executingWindow->document(), UseCounter::SubFr
ameBeforeUnloadFired); |
| 513 UseCounter::count(executingWindow->document(), UseCounter::DocumentB
eforeUnloadFired); | 523 UseCounter::count(executingWindow->document(), UseCounter::DocumentB
eforeUnloadFired); |
| 514 } | 524 } |
| 515 } else if (event->type() == EventTypeNames::unload) { | 525 } else if (event->type() == EventTypeNames::unload) { |
| 516 if (LocalDOMWindow* executingWindow = this->executingWindow()) | 526 if (LocalDOMWindow* executingWindow = this->executingWindow()) |
| 517 UseCounter::count(executingWindow->document(), UseCounter::DocumentU
nloadFired); | 527 UseCounter::count(executingWindow->document(), UseCounter::DocumentU
nloadFired); |
| 518 } else if (event->type() == EventTypeNames::DOMFocusIn || event->type() == E
ventTypeNames::DOMFocusOut) { | 528 } else if (event->type() == EventTypeNames::DOMFocusIn || event->type() == E
ventTypeNames::DOMFocusOut) { |
| 519 if (LocalDOMWindow* executingWindow = this->executingWindow()) | 529 if (LocalDOMWindow* executingWindow = this->executingWindow()) |
| 520 UseCounter::count(executingWindow->document(), UseCounter::DOMFocusI
nOutEvent); | 530 UseCounter::count(executingWindow->document(), UseCounter::DOMFocusI
nOutEvent); |
| 521 } else if (event->type() == EventTypeNames::focusin || event->type() == Even
tTypeNames::focusout) { | 531 } else if (event->type() == EventTypeNames::focusin || event->type() == Even
tTypeNames::focusout) { |
| 522 if (LocalDOMWindow* executingWindow = this->executingWindow()) | 532 if (LocalDOMWindow* executingWindow = this->executingWindow()) |
| 523 UseCounter::count(executingWindow->document(), UseCounter::FocusInOu
tEvent); | 533 UseCounter::count(executingWindow->document(), UseCounter::FocusInOu
tEvent); |
| 524 } else if (event->type() == EventTypeNames::textInput) { | 534 } else if (event->type() == EventTypeNames::textInput) { |
| 525 if (LocalDOMWindow* executingWindow = this->executingWindow()) | 535 if (LocalDOMWindow* executingWindow = this->executingWindow()) |
| 526 UseCounter::count(executingWindow->document(), UseCounter::TextInput
Fired); | 536 UseCounter::count(executingWindow->document(), UseCounter::TextInput
Fired); |
| 527 } | 537 } |
| 528 | 538 |
| 529 ExecutionContext* context = getExecutionContext(); | 539 ExecutionContext* context = getExecutionContext(); |
| 530 if (!context) | 540 if (!context) |
| 531 return; | 541 return false; |
| 532 | 542 |
| 533 size_t i = 0; | 543 size_t i = 0; |
| 534 size_t size = entry.size(); | 544 size_t size = entry.size(); |
| 535 if (!d->firingEventIterators) | 545 if (!d->firingEventIterators) |
| 536 d->firingEventIterators = adoptPtr(new FiringEventIteratorVector); | 546 d->firingEventIterators = adoptPtr(new FiringEventIteratorVector); |
| 537 d->firingEventIterators->append(FiringEventIterator(event->type(), i, size))
; | 547 d->firingEventIterators->append(FiringEventIterator(event->type(), i, size))
; |
| 538 | 548 |
| 539 double blockedEventThreshold = blockedEventsWarningThreshold(context, event)
; | 549 double blockedEventThreshold = blockedEventsWarningThreshold(context, event)
; |
| 540 double now = 0.0; | 550 double now = 0.0; |
| 541 bool shouldReportBlockedEvent = false; | 551 bool shouldReportBlockedEvent = false; |
| 542 if (blockedEventThreshold) { | 552 if (blockedEventThreshold) { |
| 543 now = WTF::monotonicallyIncreasingTime(); | 553 now = WTF::monotonicallyIncreasingTime(); |
| 544 shouldReportBlockedEvent = now - event->platformTimeStamp() > blockedEve
ntThreshold; | 554 shouldReportBlockedEvent = now - event->platformTimeStamp() > blockedEve
ntThreshold; |
| 545 } | 555 } |
| 556 bool firedListener = false; |
| 546 | 557 |
| 547 while (i < size) { | 558 while (i < size) { |
| 548 RegisteredEventListener& registeredListener = entry[i]; | 559 RegisteredEventListener& registeredListener = entry[i]; |
| 549 | 560 |
| 550 // Move the iterator past this event listener. This must match | 561 // Move the iterator past this event listener. This must match |
| 551 // the handling of the FiringEventIterator::iterator in | 562 // the handling of the FiringEventIterator::iterator in |
| 552 // EventTarget::removeEventListener. | 563 // EventTarget::removeEventListener. |
| 553 ++i; | 564 ++i; |
| 554 | 565 |
| 555 if (event->eventPhase() == Event::CAPTURING_PHASE && !registeredListener
.capture()) | 566 if (event->eventPhase() == Event::CAPTURING_PHASE && !registeredListener
.capture()) |
| 556 continue; | 567 continue; |
| 557 if (event->eventPhase() == Event::BUBBLING_PHASE && registeredListener.c
apture()) | 568 if (event->eventPhase() == Event::BUBBLING_PHASE && registeredListener.c
apture()) |
| 558 continue; | 569 continue; |
| 559 | 570 |
| 560 // If stopImmediatePropagation has been called, we just break out immedi
ately, without | 571 // If stopImmediatePropagation has been called, we just break out immedi
ately, without |
| 561 // handling any more events on this target. | 572 // handling any more events on this target. |
| 562 if (event->immediatePropagationStopped()) | 573 if (event->immediatePropagationStopped()) |
| 563 break; | 574 break; |
| 564 | 575 |
| 565 event->setHandlingPassive(registeredListener.passive()); | 576 event->setHandlingPassive(registeredListener.passive()); |
| 566 | 577 |
| 567 InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, thi
s, event); | 578 InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, thi
s, event); |
| 568 | 579 |
| 569 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli
ng | 580 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli
ng |
| 570 // event listeners, even though that violates some versions of the DOM s
pec. | 581 // event listeners, even though that violates some versions of the DOM s
pec. |
| 571 registeredListener.listener()->handleEvent(context, event); | 582 registeredListener.listener()->handleEvent(context, event); |
| 583 firedListener = true; |
| 572 | 584 |
| 573 if (shouldReportBlockedEvent && !registeredListener.passive() && !regist
eredListener.blockedEventWarningEmitted() && !event->defaultPrevented()) | 585 if (shouldReportBlockedEvent && !registeredListener.passive() && !regist
eredListener.blockedEventWarningEmitted() && !event->defaultPrevented()) |
| 574 reportBlockedEvent(context, event, ®isteredListener, now - event-
>platformTimeStamp()); | 586 reportBlockedEvent(context, event, ®isteredListener, now - event-
>platformTimeStamp()); |
| 575 | 587 |
| 576 event->setHandlingPassive(false); | 588 event->setHandlingPassive(false); |
| 577 | 589 |
| 578 RELEASE_ASSERT(i <= size); | 590 RELEASE_ASSERT(i <= size); |
| 579 } | 591 } |
| 580 d->firingEventIterators->removeLast(); | 592 d->firingEventIterators->removeLast(); |
| 593 return firedListener; |
| 581 } | 594 } |
| 582 | 595 |
| 583 DispatchEventResult EventTarget::dispatchEventResult(const Event& event) | 596 DispatchEventResult EventTarget::dispatchEventResult(const Event& event) |
| 584 { | 597 { |
| 585 if (event.defaultPrevented()) | 598 if (event.defaultPrevented()) |
| 586 return DispatchEventResult::CanceledByEventHandler; | 599 return DispatchEventResult::CanceledByEventHandler; |
| 587 if (event.defaultHandled()) | 600 if (event.defaultHandled()) |
| 588 return DispatchEventResult::CanceledByDefaultEventHandler; | 601 return DispatchEventResult::CanceledByDefaultEventHandler; |
| 589 return DispatchEventResult::NotCanceled; | 602 return DispatchEventResult::NotCanceled; |
| 590 } | 603 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 614 // they have one less listener to invoke. | 627 // they have one less listener to invoke. |
| 615 if (d->firingEventIterators) { | 628 if (d->firingEventIterators) { |
| 616 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { | 629 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { |
| 617 d->firingEventIterators->at(i).iterator = 0; | 630 d->firingEventIterators->at(i).iterator = 0; |
| 618 d->firingEventIterators->at(i).end = 0; | 631 d->firingEventIterators->at(i).end = 0; |
| 619 } | 632 } |
| 620 } | 633 } |
| 621 } | 634 } |
| 622 | 635 |
| 623 } // namespace blink | 636 } // namespace blink |
| OLD | NEW |