| Index: Source/core/page/EventHandler.cpp
|
| diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp
|
| index fc8bd5cc5ebfae20dc2734db25ab32dff0425a14..ade9a87f375836e3c82dc7cc935699bd24ca3092 100644
|
| --- a/Source/core/page/EventHandler.cpp
|
| +++ b/Source/core/page/EventHandler.cpp
|
| @@ -233,6 +233,8 @@ EventHandler::EventHandler(LocalFrame* frame)
|
| , m_eventHandlerWillResetCapturingMouseEventsNode(0)
|
| , m_clickCount(0)
|
| , m_shouldOnlyFireDragOverEvent(false)
|
| + , m_unusedDelta(FloatSize())
|
| + , m_accumulatedRootOverscroll(FloatSize())
|
| , m_mousePositionIsUnknown(true)
|
| , m_mouseDownTimestamp(0)
|
| , m_widgetIsLatched(false)
|
| @@ -924,10 +926,10 @@ void EventHandler::stopAutoscroll()
|
| controller->stopAutoscroll();
|
| }
|
|
|
| -bool EventHandler::scroll(ScrollDirection direction, ScrollGranularity granularity, Node* startNode, Node** stopNode, float delta, IntPoint absolutePoint)
|
| +ScrollResultOneDimensional EventHandler::scroll(ScrollDirection direction, ScrollGranularity granularity, Node* startNode, Node** stopNode, float delta, IntPoint absolutePoint)
|
| {
|
| if (!delta)
|
| - return false;
|
| + return ScrollResultOneDimensional(false);
|
|
|
| Node* node = startNode;
|
|
|
| @@ -938,7 +940,7 @@ bool EventHandler::scroll(ScrollDirection direction, ScrollGranularity granulari
|
| node = m_mousePressNode.get();
|
|
|
| if (!node || !node->layoutObject())
|
| - return false;
|
| + return ScrollResultOneDimensional(false, delta);
|
|
|
| LayoutBox* curBox = node->layoutObject()->enclosingBox();
|
| while (curBox && !curBox->isLayoutView()) {
|
| @@ -947,20 +949,21 @@ bool EventHandler::scroll(ScrollDirection direction, ScrollGranularity granulari
|
|
|
| // If we're at the stopNode, we should try to scroll it but we shouldn't bubble past it
|
| bool shouldStopBubbling = stopNode && *stopNode && curBox->node() == *stopNode;
|
| - bool didScroll = curBox->scroll(physicalDirection, granularity, delta);
|
| + ScrollResultOneDimensional result = curBox->scroll(physicalDirection, granularity, delta);
|
|
|
| - if (didScroll && stopNode)
|
| + if (result.didScroll && stopNode)
|
| *stopNode = curBox->node();
|
|
|
| - if (didScroll || shouldStopBubbling) {
|
| + if (result.didScroll || shouldStopBubbling) {
|
| setFrameWasScrolledByUser();
|
| - return true;
|
| + result.didScroll = true;
|
| + return result;
|
| }
|
|
|
| curBox = curBox->containingBlock();
|
| }
|
|
|
| - return false;
|
| + return ScrollResultOneDimensional(false, delta);
|
| }
|
|
|
| void EventHandler::customizedScroll(const Node& startNode, ScrollState& scrollState)
|
| @@ -980,11 +983,11 @@ bool EventHandler::bubblingScroll(ScrollDirection direction, ScrollGranularity g
|
| // here because of an onLoad event, in which case the final layout hasn't been performed yet.
|
| m_frame->document()->updateLayoutIgnorePendingStylesheets();
|
| // FIXME: enable scroll customization in this case. See crbug.com/410974.
|
| - if (scroll(direction, granularity, startingNode))
|
| + if (scroll(direction, granularity, startingNode).didScroll)
|
| return true;
|
| LocalFrame* frame = m_frame;
|
| FrameView* view = frame->view();
|
| - if (view && view->scroll(direction, granularity)) {
|
| + if (view && view->scroll(direction, granularity).didScroll) {
|
| setFrameWasScrolledByUser();
|
| return true;
|
| }
|
| @@ -2200,11 +2203,11 @@ void EventHandler::defaultWheelEventHandler(Node* startNode, WheelEvent* wheelEv
|
|
|
| // FIXME: enable scroll customization in this case. See crbug.com/410974.
|
| if (wheelEvent->railsMode() != Event::RailsModeVertical
|
| - && scroll(ScrollRight, granularity, startNode, &stopNode, wheelEvent->deltaX(), absolutePosition))
|
| + && scroll(ScrollRight, granularity, startNode, &stopNode, wheelEvent->deltaX(), absolutePosition).didScroll)
|
| wheelEvent->setDefaultHandled();
|
|
|
| if (wheelEvent->railsMode() != Event::RailsModeHorizontal
|
| - && scroll(ScrollDown, granularity, startNode, &stopNode, wheelEvent->deltaY(), absolutePosition))
|
| + && scroll(ScrollDown, granularity, startNode, &stopNode, wheelEvent->deltaY(), absolutePosition).didScroll)
|
| wheelEvent->setDefaultHandled();
|
|
|
| if (!m_latchedWheelEventNode)
|
| @@ -2705,14 +2708,27 @@ bool EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gesture
|
|
|
| // First try to scroll the closest scrollable LayoutBox ancestor of |node|.
|
| ScrollGranularity granularity = ScrollByPrecisePixel;
|
| - bool horizontalScroll = scroll(ScrollLeft, granularity, node, &stopNode, delta.width());
|
| + m_unusedDelta = FloatSize();
|
| + ScrollResultOneDimensional result = scroll(ScrollLeft, granularity, node, &stopNode, delta.width());
|
| + bool horizontalScroll = result.didScroll;
|
| if (!gestureEvent.preventPropagation())
|
| stopNode = nullptr;
|
| - bool verticalScroll = scroll(ScrollUp, granularity, node, &stopNode, delta.height());
|
| + result = scroll(ScrollUp, granularity, node, &stopNode, delta.height());
|
| + bool verticalScroll = result.didScroll;
|
| scrolled = horizontalScroll || verticalScroll;
|
|
|
| if (gestureEvent.preventPropagation())
|
| m_previousGestureScrolledNode = stopNode;
|
| +
|
| + if (horizontalScroll) {
|
| + m_accumulatedRootOverscroll.setWidth(0);
|
| + m_unusedDelta.setWidth(0);
|
| + }
|
| +
|
| + if (verticalScroll) {
|
| + m_accumulatedRootOverscroll.setHeight(0);
|
| + m_unusedDelta.setHeight(0);
|
| + }
|
| }
|
| if (scrolled) {
|
| setFrameWasScrolledByUser();
|
| @@ -2724,7 +2740,17 @@ bool EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gesture
|
| return false;
|
|
|
| // Try to scroll the frame view.
|
| - if (m_frame->applyScrollDelta(delta, false)) {
|
| + ScrollResult resultScrollDelta = m_frame->applyScrollDelta(delta, false);
|
| + m_unusedDelta.setWidth(resultScrollDelta.unusedScrollDeltaX);
|
| + m_unusedDelta.setHeight(resultScrollDelta.unusedScrollDeltaY);
|
| + if (m_frame->isMainFrame() && m_unusedDelta != FloatSize()) {
|
| + m_accumulatedRootOverscroll += m_unusedDelta;
|
| + FloatPoint position = FloatPoint(gestureEvent.position().x(), gestureEvent.position().y());
|
| + FloatSize velocity = FloatSize(gestureEvent.velocityX(), gestureEvent.velocityY());
|
| + m_frame->chromeClient().didOverscroll(m_unusedDelta, m_accumulatedRootOverscroll, position, velocity);
|
| + }
|
| +
|
| + if (resultScrollDelta.didScroll) {
|
| setFrameWasScrolledByUser();
|
| return true;
|
| }
|
| @@ -2738,6 +2764,8 @@ void EventHandler::clearGestureScrollNodes()
|
| m_previousGestureScrolledNode = nullptr;
|
| m_deltaConsumedForScrollSequence = false;
|
| m_currentScrollChain.clear();
|
| + m_accumulatedRootOverscroll = FloatSize();
|
| + m_unusedDelta = FloatSize();
|
| }
|
|
|
| bool EventHandler::isScrollbarHandlingGestures() const
|
| @@ -3639,7 +3667,7 @@ void EventHandler::defaultSpaceEventHandler(KeyboardEvent* event)
|
|
|
| ScrollDirection direction = event->shiftKey() ? ScrollBlockDirectionBackward : ScrollBlockDirectionForward;
|
| // FIXME: enable scroll customization in this case. See crbug.com/410974.
|
| - if (scroll(direction, ScrollByPage)) {
|
| + if (scroll(direction, ScrollByPage).didScroll) {
|
| event->setDefaultHandled();
|
| return;
|
| }
|
| @@ -3648,7 +3676,7 @@ void EventHandler::defaultSpaceEventHandler(KeyboardEvent* event)
|
| if (!view)
|
| return;
|
|
|
| - if (view->scroll(direction, ScrollByPage))
|
| + if (view->scroll(direction, ScrollByPage).didScroll)
|
| event->setDefaultHandled();
|
| }
|
|
|
|
|