Chromium Code Reviews| Index: third_party/WebKit/Source/core/input/EventHandler.cpp |
| diff --git a/third_party/WebKit/Source/core/input/EventHandler.cpp b/third_party/WebKit/Source/core/input/EventHandler.cpp |
| index 4a88d4598398c243cde77a02e86ba1b3fd74ad95..b0c9ea64c9db8b630a0daae408577930fd729869 100644 |
| --- a/third_party/WebKit/Source/core/input/EventHandler.cpp |
| +++ b/third_party/WebKit/Source/core/input/EventHandler.cpp |
| @@ -87,6 +87,7 @@ |
| #include "core/paint/PaintLayer.h" |
| #include "core/style/ComputedStyle.h" |
| #include "core/svg/SVGDocumentExtensions.h" |
| +#include "platform/Histogram.h" |
| #include "platform/PlatformGestureEvent.h" |
| #include "platform/PlatformKeyboardEvent.h" |
| #include "platform/PlatformTouchEvent.h" |
| @@ -208,6 +209,53 @@ void recomputeScrollChain(const LocalFrame& frame, const Node& startNode, |
| scrollChain.push_front(DOMNodeIds::idForNode(frame.document()->scrollingElement())); |
| } |
|
tdresser
2016/04/19 20:49:58
Could we factor all this logic out into a separate
dtapuska
2016/04/21 01:18:49
I think this is all going to change when Navid lan
|
| +// These offsets change indicies into the ListenerHistogram |
| +// enumeration. The addition of a series of offsets then |
| +// produces the resulting ListenerHistogram value. |
| +const size_t kTouchTargetHistogramRootScrollerOffset = 4; |
| +const size_t kTouchTargetHistogramScrollableDocumentOffset = 2; |
| +const size_t kTouchTargetHistogramHandledOffset = 1; |
| + |
| +enum TouchTargetAndDispatchResultTypeHistogram { |
|
tdresser
2016/04/19 20:49:58
I don't think we need "Histogram" in the type here
dtapuska
2016/04/21 01:18:49
Done.
|
| + NonRootScrollerNonScrollableNotHandled, // Non-root-scroller, non-scrollable document, not handled. |
| + NonRootScrollerNonScrollableHandled, // Non-root-scroller, non-scrollable document, handled application. |
| + NonRootScrollerScrollableDocumentNotHandled, // Non-root-scroller, scrollable document, not handled. |
| + NonRootScrollerScrollableDocumentHandled, // Non-root-scroller, scrollable document, handled application. |
| + RootScrollerNonScrollableNotHandled, // Root-scroller, non-scrollable document, not handled. |
| + RootScrollerNonScrollableHandled, // Root-scroller, non-scrollable document, handled. |
| + RootScrollerScrollableDocumentNotHandled, // Root-scroller, scrollable document, not handled. |
| + RootScrollerScrollableDocumentHandled, // Root-scroller, scrollable document, handled. |
| + ListenerHistogramMax, |
| +}; |
| + |
| +TouchTargetAndDispatchResultTypeHistogram toTouchTargetHistogramValue(EventTarget* eventTarget, DispatchEventResult dispatchResult) |
| +{ |
| + int result = 0; |
| + Document* document = nullptr; |
| + |
| + if (const LocalDOMWindow* domWindow = eventTarget->toDOMWindow()) { |
| + // Treat the window as a root scroller as well. |
| + document = domWindow->document(); |
| + result += kTouchTargetHistogramRootScrollerOffset; |
| + } else if (Node* node = eventTarget->toNode()) { |
| + // Report if the target node is the document or body. |
| + if (node->isDocumentNode() || static_cast<Node*>(node->document().documentElement()) == node || static_cast<Node*>(node->document().body()) == node) { |
| + result += kTouchTargetHistogramRootScrollerOffset; |
| + } |
| + document = &node->document(); |
| + } |
| + |
| + if (document) { |
| + FrameView* view = document->view(); |
| + if (view && view->isScrollable()) |
| + result += kTouchTargetHistogramScrollableDocumentOffset; |
| + } |
| + |
| + if (dispatchResult != DispatchEventResult::NotCanceled) |
| + result += kTouchTargetHistogramHandledOffset; |
| + return static_cast<TouchTargetAndDispatchResultTypeHistogram>(result); |
| +} |
| + |
| } // namespace |
| using namespace HTMLNames; |
| @@ -292,6 +340,7 @@ EventHandler::EventHandler(LocalFrame* frame) |
| , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) |
| , m_lastShowPressTimestamp(0) |
| , m_deltaConsumedForScrollSequence(false) |
| + , m_waitingForFirstTouchMove(false) |
| { |
| } |
| @@ -3778,6 +3827,15 @@ public: |
| WebInputEventResult EventHandler::dispatchTouchEvents(const PlatformTouchEvent& event, |
| HeapVector<TouchInfo>& touchInfos, bool freshTouchEvents, bool allTouchReleased) |
| { |
| + bool touchStartOrFirstTouchMove = false; |
| + if (event.type() == PlatformEvent::TouchStart) { |
| + m_waitingForFirstTouchMove = true; |
| + touchStartOrFirstTouchMove = true; |
| + } else if (event.type() == PlatformEvent::TouchMove) { |
| + touchStartOrFirstTouchMove = m_waitingForFirstTouchMove; |
| + m_waitingForFirstTouchMove = false; |
| + } |
| + |
| // Build up the lists to use for the 'touches', 'targetTouches' and |
| // 'changedTouches' attributes in the JS event. See |
| // http://www.w3.org/TR/touch-events/#touchevent-interface for how these |
| @@ -3864,7 +3922,15 @@ WebInputEventResult EventHandler::dispatchTouchEvents(const PlatformTouchEvent& |
| eventName, touchEventTarget->toNode()->document().domWindow(), |
| event.getModifiers(), event.cancelable(), event.causesScrollingIfUncanceled(), event.timestamp()); |
| - eventResult = mergeEventResult(eventResult, toWebInputEventResult(touchEventTarget->dispatchEvent(touchEvent))); |
| + DispatchEventResult domDispatchResult = touchEventTarget->dispatchEvent(touchEvent); |
| + |
| + // Only report for top level documents with a single touch on |
| + // touch-start or the first touch-move. |
| + if (touchStartOrFirstTouchMove && touchInfos.size() == 1 && event.cancelable() && !m_frame->document()->ownerElement()) { |
| + DEFINE_STATIC_LOCAL(EnumerationHistogram, rootDocumentListenerHistogram, ("Event.Touch.TargetAndDispatchResult", ListenerHistogramMax)); |
| + rootDocumentListenerHistogram.count(toTouchTargetHistogramValue(eventTarget, domDispatchResult)); |
| + } |
| + eventResult = mergeEventResult(eventResult, toWebInputEventResult(domDispatchResult)); |
| } |
| } |