| Index: Source/core/page/EventHandler.cpp
|
| diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp
|
| index dd3c5aee907340e0eb1b561e52fb6f57dfe5547c..dd2725de76e6fc6749908bd2c9e90031fe2ac2b9 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(FloatPoint())
|
| + , m_accumulatedRootOverScroll(FloatPoint())
|
| , m_mousePositionIsUnknown(true)
|
| , m_mouseDownTimestamp(0)
|
| , m_widgetIsLatched(false)
|
| @@ -926,10 +928,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;
|
|
|
| @@ -940,30 +942,31 @@ bool EventHandler::scroll(ScrollDirection direction, ScrollGranularity granulari
|
| node = m_mousePressNode.get();
|
|
|
| if (!node || !node->layoutObject())
|
| - return false;
|
| + return ScrollResultOneDimensional(false);
|
|
|
| bool rootLayerScrolls = m_frame->settings() && m_frame->settings()->rootLayerScrolls();
|
| LayoutBox* curBox = node->layoutObject()->enclosingBox();
|
| + ScrollResultOneDimensional result(false);
|
| while (curBox && (rootLayerScrolls || !curBox->isLayoutView())) {
|
| ScrollDirection physicalDirection = toPhysicalDirection(
|
| direction, curBox->isHorizontalWritingMode(), curBox->style()->isFlippedBlocksWritingMode());
|
|
|
| // 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);
|
| + 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;
|
| + return result;
|
| }
|
|
|
| curBox = curBox->containingBlock();
|
| }
|
|
|
| - return false;
|
| + return result;
|
| }
|
|
|
| void EventHandler::customizedScroll(const Node& startNode, ScrollState& scrollState)
|
| @@ -983,7 +986,7 @@ 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();
|
| @@ -996,6 +999,16 @@ bool EventHandler::bubblingScroll(ScrollDirection direction, ScrollGranularity g
|
| return toLocalFrame(parentFrame)->eventHandler().bubblingScroll(direction, granularity, m_frame->deprecatedLocalOwner());
|
| }
|
|
|
| +FloatPoint EventHandler::unusedDelta() const
|
| +{
|
| + return m_unusedDelta;
|
| +}
|
| +
|
| +FloatPoint EventHandler::accumulatedRootOverScroll() const
|
| +{
|
| + return m_accumulatedRootOverScroll;
|
| +}
|
| +
|
| IntPoint EventHandler::lastKnownMousePosition() const
|
| {
|
| return m_lastKnownMousePosition;
|
| @@ -2204,11 +2217,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)
|
| @@ -2709,14 +2722,24 @@ 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 = FloatPoint();
|
| + ScrollResultOneDimensional result = scroll(ScrollLeft, granularity, node, &stopNode, delta.width());
|
| + bool horizontalScroll = result.didScroll;
|
| + if (m_frame->isMainFrame())
|
| + m_unusedDelta.setX(result.unusedScrollDelta);
|
| 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;
|
| + if (m_frame->isMainFrame())
|
| + m_unusedDelta.setY(result.unusedScrollDelta);
|
| scrolled = horizontalScroll || verticalScroll;
|
|
|
| if (gestureEvent.preventPropagation())
|
| m_previousGestureScrolledNode = stopNode;
|
| +
|
| + if (m_frame->isMainFrame())
|
| + m_accumulatedRootOverScroll += m_unusedDelta;
|
| }
|
| if (scrolled) {
|
| setFrameWasScrolledByUser();
|
| @@ -2742,6 +2765,7 @@ void EventHandler::clearGestureScrollNodes()
|
| m_previousGestureScrolledNode = nullptr;
|
| m_deltaConsumedForScrollSequence = false;
|
| m_currentScrollChain.clear();
|
| + m_accumulatedRootOverScroll = FloatPoint();
|
| }
|
|
|
| bool EventHandler::isScrollbarHandlingGestures() const
|
| @@ -3625,7 +3649,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;
|
| }
|
|
|