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 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. | |
|
tdresser
2016/05/18 13:23:10
Can you file and link a bug for this?
dtapuska
2016/05/18 15:24:04
Done.
| |
| 496 Editor::countEvent(getExecutionContext(), event); | 505 Editor::countEvent(getExecutionContext(), event); |
| 497 countLegacyEvents(legacyTypeName, listenersVector, legacyListenersVector); | 506 countLegacyEvents(legacyTypeName, listenersVector, legacyListenersVector); |
| 498 return dispatchEventResult(*event); | 507 return dispatchEventResult(*event); |
| 499 } | 508 } |
| 500 | 509 |
| 501 void EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList enerVector& entry) | 510 bool EventTarget::fireEventListeners(Event* event, EventTargetData* d, EventList enerVector& entry) |
| 502 { | 511 { |
| 503 // Fire all listeners registered for this event. Don't fire listeners remove d | 512 // 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 | 513 // 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 | 514 // 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 | 515 // index |size|, so iterating up to (but not including) |size| naturally exc ludes |
| 507 // new event listeners. | 516 // new event listeners. |
| 508 | 517 |
| 509 if (event->type() == EventTypeNames::beforeunload) { | 518 if (event->type() == EventTypeNames::beforeunload) { |
| 510 if (LocalDOMWindow* executingWindow = this->executingWindow()) { | 519 if (LocalDOMWindow* executingWindow = this->executingWindow()) { |
| 511 if (executingWindow->top()) | 520 if (executingWindow->top()) |
| 512 UseCounter::count(executingWindow->document(), UseCounter::SubFr ameBeforeUnloadFired); | 521 UseCounter::count(executingWindow->document(), UseCounter::SubFr ameBeforeUnloadFired); |
| 513 UseCounter::count(executingWindow->document(), UseCounter::DocumentB eforeUnloadFired); | 522 UseCounter::count(executingWindow->document(), UseCounter::DocumentB eforeUnloadFired); |
| 514 } | 523 } |
| 515 } else if (event->type() == EventTypeNames::unload) { | 524 } else if (event->type() == EventTypeNames::unload) { |
| 516 if (LocalDOMWindow* executingWindow = this->executingWindow()) | 525 if (LocalDOMWindow* executingWindow = this->executingWindow()) |
| 517 UseCounter::count(executingWindow->document(), UseCounter::DocumentU nloadFired); | 526 UseCounter::count(executingWindow->document(), UseCounter::DocumentU nloadFired); |
| 518 } else if (event->type() == EventTypeNames::DOMFocusIn || event->type() == E ventTypeNames::DOMFocusOut) { | 527 } else if (event->type() == EventTypeNames::DOMFocusIn || event->type() == E ventTypeNames::DOMFocusOut) { |
| 519 if (LocalDOMWindow* executingWindow = this->executingWindow()) | 528 if (LocalDOMWindow* executingWindow = this->executingWindow()) |
| 520 UseCounter::count(executingWindow->document(), UseCounter::DOMFocusI nOutEvent); | 529 UseCounter::count(executingWindow->document(), UseCounter::DOMFocusI nOutEvent); |
| 521 } else if (event->type() == EventTypeNames::focusin || event->type() == Even tTypeNames::focusout) { | 530 } else if (event->type() == EventTypeNames::focusin || event->type() == Even tTypeNames::focusout) { |
| 522 if (LocalDOMWindow* executingWindow = this->executingWindow()) | 531 if (LocalDOMWindow* executingWindow = this->executingWindow()) |
| 523 UseCounter::count(executingWindow->document(), UseCounter::FocusInOu tEvent); | 532 UseCounter::count(executingWindow->document(), UseCounter::FocusInOu tEvent); |
| 524 } else if (event->type() == EventTypeNames::textInput) { | 533 } else if (event->type() == EventTypeNames::textInput) { |
| 525 if (LocalDOMWindow* executingWindow = this->executingWindow()) | 534 if (LocalDOMWindow* executingWindow = this->executingWindow()) |
| 526 UseCounter::count(executingWindow->document(), UseCounter::TextInput Fired); | 535 UseCounter::count(executingWindow->document(), UseCounter::TextInput Fired); |
| 527 } | 536 } |
| 528 | 537 |
| 529 ExecutionContext* context = getExecutionContext(); | 538 ExecutionContext* context = getExecutionContext(); |
| 530 if (!context) | 539 if (!context) |
| 531 return; | 540 return false; |
| 532 | 541 |
| 533 size_t i = 0; | 542 size_t i = 0; |
| 534 size_t size = entry.size(); | 543 size_t size = entry.size(); |
| 535 if (!d->firingEventIterators) | 544 if (!d->firingEventIterators) |
| 536 d->firingEventIterators = adoptPtr(new FiringEventIteratorVector); | 545 d->firingEventIterators = adoptPtr(new FiringEventIteratorVector); |
| 537 d->firingEventIterators->append(FiringEventIterator(event->type(), i, size)) ; | 546 d->firingEventIterators->append(FiringEventIterator(event->type(), i, size)) ; |
| 538 | 547 |
| 539 double blockedEventThreshold = blockedEventsWarningThreshold(context, event) ; | 548 double blockedEventThreshold = blockedEventsWarningThreshold(context, event) ; |
| 540 double now = 0.0; | 549 double now = 0.0; |
| 541 bool shouldReportBlockedEvent = false; | 550 bool shouldReportBlockedEvent = false; |
| 542 if (blockedEventThreshold) { | 551 if (blockedEventThreshold) { |
| 543 now = WTF::monotonicallyIncreasingTime(); | 552 now = WTF::monotonicallyIncreasingTime(); |
| 544 shouldReportBlockedEvent = now - event->platformTimeStamp() > blockedEve ntThreshold; | 553 shouldReportBlockedEvent = now - event->platformTimeStamp() > blockedEve ntThreshold; |
| 545 } | 554 } |
| 555 bool firedListener = false; | |
| 546 | 556 |
| 547 while (i < size) { | 557 while (i < size) { |
| 548 RegisteredEventListener& registeredListener = entry[i]; | 558 RegisteredEventListener& registeredListener = entry[i]; |
| 549 | 559 |
| 550 // Move the iterator past this event listener. This must match | 560 // Move the iterator past this event listener. This must match |
| 551 // the handling of the FiringEventIterator::iterator in | 561 // the handling of the FiringEventIterator::iterator in |
| 552 // EventTarget::removeEventListener. | 562 // EventTarget::removeEventListener. |
| 553 ++i; | 563 ++i; |
| 554 | 564 |
| 555 if (event->eventPhase() == Event::CAPTURING_PHASE && !registeredListener .capture()) | 565 if (event->eventPhase() == Event::CAPTURING_PHASE && !registeredListener .capture()) |
| 556 continue; | 566 continue; |
| 557 if (event->eventPhase() == Event::BUBBLING_PHASE && registeredListener.c apture()) | 567 if (event->eventPhase() == Event::BUBBLING_PHASE && registeredListener.c apture()) |
| 558 continue; | 568 continue; |
| 559 | 569 |
| 560 // If stopImmediatePropagation has been called, we just break out immedi ately, without | 570 // If stopImmediatePropagation has been called, we just break out immedi ately, without |
| 561 // handling any more events on this target. | 571 // handling any more events on this target. |
| 562 if (event->immediatePropagationStopped()) | 572 if (event->immediatePropagationStopped()) |
| 563 break; | 573 break; |
| 564 | 574 |
| 565 event->setHandlingPassive(registeredListener.passive()); | 575 event->setHandlingPassive(registeredListener.passive()); |
| 566 | 576 |
| 567 InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, thi s, event); | 577 InspectorInstrumentation::NativeBreakpoint nativeBreakpoint(context, thi s, event); |
| 568 | 578 |
| 569 // To match Mozilla, the AT_TARGET phase fires both capturing and bubbli ng | 579 // 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. | 580 // event listeners, even though that violates some versions of the DOM s pec. |
| 571 registeredListener.listener()->handleEvent(context, event); | 581 registeredListener.listener()->handleEvent(context, event); |
| 582 firedListener = true; | |
| 572 | 583 |
| 573 if (shouldReportBlockedEvent && !registeredListener.passive() && !regist eredListener.blockedEventWarningEmitted() && !event->defaultPrevented()) | 584 if (shouldReportBlockedEvent && !registeredListener.passive() && !regist eredListener.blockedEventWarningEmitted() && !event->defaultPrevented()) |
| 574 reportBlockedEvent(context, event, ®isteredListener, now - event- >platformTimeStamp()); | 585 reportBlockedEvent(context, event, ®isteredListener, now - event- >platformTimeStamp()); |
| 575 | 586 |
| 576 event->setHandlingPassive(false); | 587 event->setHandlingPassive(false); |
| 577 | 588 |
| 578 RELEASE_ASSERT(i <= size); | 589 RELEASE_ASSERT(i <= size); |
| 579 } | 590 } |
| 580 d->firingEventIterators->removeLast(); | 591 d->firingEventIterators->removeLast(); |
| 592 return firedListener; | |
| 581 } | 593 } |
| 582 | 594 |
| 583 DispatchEventResult EventTarget::dispatchEventResult(const Event& event) | 595 DispatchEventResult EventTarget::dispatchEventResult(const Event& event) |
| 584 { | 596 { |
| 585 if (event.defaultPrevented()) | 597 if (event.defaultPrevented()) |
| 586 return DispatchEventResult::CanceledByEventHandler; | 598 return DispatchEventResult::CanceledByEventHandler; |
| 587 if (event.defaultHandled()) | 599 if (event.defaultHandled()) |
| 588 return DispatchEventResult::CanceledByDefaultEventHandler; | 600 return DispatchEventResult::CanceledByDefaultEventHandler; |
| 589 return DispatchEventResult::NotCanceled; | 601 return DispatchEventResult::NotCanceled; |
| 590 } | 602 } |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 614 // they have one less listener to invoke. | 626 // they have one less listener to invoke. |
| 615 if (d->firingEventIterators) { | 627 if (d->firingEventIterators) { |
| 616 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { | 628 for (size_t i = 0; i < d->firingEventIterators->size(); ++i) { |
| 617 d->firingEventIterators->at(i).iterator = 0; | 629 d->firingEventIterators->at(i).iterator = 0; |
| 618 d->firingEventIterators->at(i).end = 0; | 630 d->firingEventIterators->at(i).end = 0; |
| 619 } | 631 } |
| 620 } | 632 } |
| 621 } | 633 } |
| 622 | 634 |
| 623 } // namespace blink | 635 } // namespace blink |
| OLD | NEW |