Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: third_party/WebKit/Source/core/events/EventTarget.cpp

Issue 2007733003: Add UMA metric for tracking root level listeners for blocking touch. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2743
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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, &registeredListener, now - event- >platformTimeStamp()); 586 reportBlockedEvent(context, event, &registeredListener, 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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/events/EventTarget.h ('k') | third_party/WebKit/Source/core/events/NodeEventContext.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698