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

Unified Diff: third_party/WebKit/Source/core/input/EventHandler.cpp

Issue 2010133003: Add ScrollManager class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
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 22ff85faa4c717d09a7939f22de3bf7824bf75e5..bad5b0dc36e3628c3abf728963fe111b80484d2d 100644
--- a/third_party/WebKit/Source/core/input/EventHandler.cpp
+++ b/third_party/WebKit/Source/core/input/EventHandler.cpp
@@ -56,7 +56,6 @@
#include "core/frame/FrameView.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/Settings.h"
-#include "core/frame/TopControls.h"
#include "core/frame/UseCounter.h"
#include "core/frame/VisualViewport.h"
#include "core/html/HTMLDialogElement.h"
@@ -83,8 +82,6 @@
#include "core/page/Page.h"
#include "core/page/SpatialNavigation.h"
#include "core/page/TouchAdjustment.h"
-#include "core/page/scrolling/OverscrollController.h"
-#include "core/page/scrolling/RootScroller.h"
#include "core/page/scrolling/ScrollState.h"
#include "core/paint/PaintLayer.h"
#include "core/style/ComputedStyle.h"
@@ -143,47 +140,6 @@ bool shouldRefetchEventTarget(const MouseEventWithHitTestResults& mev)
return targetNode->isShadowRoot() && isHTMLInputElement(toShadowRoot(targetNode)->host());
}
-// TODO(bokan): This method can go away once all scrolls happen through the
-// scroll customization path.
-void computeScrollChainForSingleNode(Node& node, std::deque<int>& scrollChain)
-{
- scrollChain.clear();
-
- ASSERT(node.layoutObject());
- Element* element = toElement(&node);
-
- scrollChain.push_front(DOMNodeIds::idForNode(element));
-}
-
-void recomputeScrollChain(const LocalFrame& frame, const Node& startNode,
- std::deque<int>& scrollChain)
-{
- scrollChain.clear();
-
- ASSERT(startNode.layoutObject());
- LayoutBox* curBox = startNode.layoutObject()->enclosingBox();
-
- // Scrolling propagates along the containing block chain.
- while (curBox && !curBox->isLayoutView()) {
- Node* curNode = curBox->node();
- // FIXME: this should reject more elements, as part of crbug.com/410974.
- if (curNode && curNode->isElementNode()) {
- Element* curElement = toElement(curNode);
- if (curElement == frame.document()->scrollingElement())
- break;
- scrollChain.push_front(DOMNodeIds::idForNode(curElement));
- }
- curBox = curBox->containingBlock();
- }
- // TODO(tdresser): this should sometimes be excluded, as part of crbug.com/410974.
- // We need to ensure that the scrollingElement is always part of
- // the scroll chain. In quirks mode, when the scrollingElement is
- // the body, some elements may use the documentElement as their
- // containingBlock, so we ensure the scrollingElement is added
- // here.
- scrollChain.push_front(DOMNodeIds::idForNode(frame.document()->scrollingElement()));
-}
-
} // namespace
using namespace HTMLNames;
@@ -249,19 +205,16 @@ EventHandler::EventHandler(LocalFrame* frame)
, m_mouseDownMayStartAutoscroll(false)
, m_fakeMouseMoveEventTimer(this, &EventHandler::fakeMouseMoveEventTimerFired)
, m_svgPan(false)
- , m_resizeScrollableArea(nullptr)
, m_eventHandlerWillResetCapturingMouseEventsNode(0)
, m_clickCount(0)
, m_shouldOnlyFireDragOverEvent(false)
, m_mousePositionIsUnknown(true)
, m_mouseDownTimestamp(0)
, m_pointerEventManager(frame)
- , m_scrollGestureHandlingNode(nullptr)
- , m_lastGestureScrollOverWidget(false)
+ , m_scrollManager(frame)
, m_longTapShouldInvokeContextMenu(false)
, m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired)
, m_lastShowPressTimestamp(0)
- , m_deltaConsumedForScrollSequence(false)
{
}
@@ -274,7 +227,6 @@ DEFINE_TRACE(EventHandler)
{
visitor->trace(m_frame);
visitor->trace(m_mousePressNode);
- visitor->trace(m_resizeScrollableArea);
visitor->trace(m_capturingMouseEventsNode);
visitor->trace(m_nodeUnderMouse);
visitor->trace(m_lastMouseMoveEventSubframe);
@@ -282,12 +234,10 @@ DEFINE_TRACE(EventHandler)
visitor->trace(m_clickNode);
visitor->trace(m_dragTarget);
visitor->trace(m_frameSetBeingResized);
- visitor->trace(m_scrollbarHandlingScrollGesture);
- visitor->trace(m_scrollGestureHandlingNode);
- visitor->trace(m_previousGestureScrolledNode);
visitor->trace(m_lastDeferredTapElement);
visitor->trace(m_selectionController);
visitor->trace(m_pointerEventManager);
+ visitor->trace(m_scrollManager);
}
DragState& EventHandler::dragState()
@@ -302,7 +252,6 @@ void EventHandler::clear()
m_cursorUpdateTimer.stop();
m_fakeMouseMoveEventTimer.stop();
m_activeIntervalTimer.stop();
- m_resizeScrollableArea = nullptr;
m_nodeUnderMouse = nullptr;
m_lastMouseMoveEventSubframe = nullptr;
m_lastScrollbarUnderMouse = nullptr;
@@ -319,10 +268,8 @@ void EventHandler::clear()
m_mousePressed = false;
m_capturesDragging = false;
m_capturingMouseEventsNode = nullptr;
- clearGestureScrollState();
- m_lastGestureScrollOverWidget = false;
- m_scrollbarHandlingScrollGesture = nullptr;
m_pointerEventManager.clear();
+ m_scrollManager.clear();
m_mouseDownMayStartDrag = false;
m_lastShowPressTimestamp = 0;
m_lastDeferredTapElement = nullptr;
@@ -333,7 +280,6 @@ void EventHandler::clear()
m_mouseDownTimestamp = 0;
m_longTapShouldInvokeContextMenu = false;
m_dragStartPos = LayoutPoint();
- m_offsetFromResizeCorner = LayoutSize();
m_mouseDown = PlatformMouseEvent();
}
@@ -483,8 +429,8 @@ WebInputEventResult EventHandler::handleMouseDraggedEvent(const MouseEventWithHi
m_mouseDownMayStartDrag = false;
- if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) {
- if (AutoscrollController* controller = autoscrollController()) {
+ if (m_mouseDownMayStartAutoscroll && !m_scrollManager.panScrollInProgress()) {
+ if (AutoscrollController* controller = m_scrollManager.autoscrollController()) {
controller->startAutoscrollForSelection(layoutObject);
m_mouseDownMayStartAutoscroll = false;
}
@@ -501,9 +447,9 @@ void EventHandler::updateSelectionForMouseDrag()
WebInputEventResult EventHandler::handleMouseReleaseEvent(const MouseEventWithHitTestResults& event)
{
- AutoscrollController* controller = autoscrollController();
+ AutoscrollController* controller = m_scrollManager.autoscrollController();
if (controller && controller->autoscrollInProgress())
- stopAutoscroll();
+ m_scrollManager.stopAutoscroll();
// Used to prevent mouseMoveEvent from initiating a drag before
// the mouse is pressed again.
@@ -521,7 +467,7 @@ void EventHandler::startPanScrolling(LayoutObject* layoutObject)
{
if (!layoutObject->isBox())
return;
- AutoscrollController* controller = autoscrollController();
+ AutoscrollController* controller = m_scrollManager.autoscrollController();
if (!controller)
return;
controller->startPanScrolling(toLayoutBox(layoutObject), lastKnownMousePosition());
@@ -530,18 +476,6 @@ void EventHandler::startPanScrolling(LayoutObject* layoutObject)
#endif // OS(WIN)
-AutoscrollController* EventHandler::autoscrollController() const
-{
- if (Page* page = m_frame->page())
- return &page->autoscrollController();
- return nullptr;
-}
-
-bool EventHandler::panScrollInProgress() const
-{
- return autoscrollController() && autoscrollController()->panScrollInProgress();
-}
-
HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTestRequest::HitTestRequestType hitType, const LayoutSize& padding)
{
TRACE_EVENT0("blink", "EventHandler::hitTestResultAtPoint");
@@ -584,186 +518,14 @@ HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTe
void EventHandler::stopAutoscroll()
{
- if (AutoscrollController* controller = autoscrollController())
- controller->stopAutoscroll();
-}
-
-ScrollResult EventHandler::scrollBox(LayoutBox* box,
- ScrollGranularity granularity, const FloatSize& delta,
- const FloatPoint& position, const FloatSize& velocity,
- bool* wasRootScroller)
-{
- ASSERT(box);
- Node* node = box->node();
-
- // If there's no ApplyScroll callback on the element, scroll as usuall in
- // the non-scroll-customization case.
- if (!node || !node->isElementNode() || !toElement(node)->getApplyScroll()) {
- *wasRootScroller = false;
- return box->scroll(granularity, delta);
- }
-
- // Viewport actions should only happen when scrolling an element in the
- // main frame.
- ASSERT(m_frame->isMainFrame());
-
- // If there is an ApplyScroll callback, its because we placed one on the
- // root scroller to control top controls and overscroll. Invoke a scroll
- // using parts of the scroll customization framework on just this element.
- computeScrollChainForSingleNode(*node, m_currentScrollChain);
-
- OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData());
- scrollStateData->delta_x = delta.width();
- scrollStateData->delta_y = delta.height();
- scrollStateData->position_x = position.x();
- scrollStateData->position_y = position.y();
- // TODO(bokan): delta_granularity is meant to be the number of pixels per
- // unit of delta but we can't determine that until we get to the area we'll
- // scroll. This is a hack, we stuff the enum into the double value for
- // now.
- scrollStateData->delta_granularity = static_cast<double>(granularity);
- scrollStateData->velocity_x = velocity.width();
- scrollStateData->velocity_y = velocity.height();
- scrollStateData->should_propagate = false;
- scrollStateData->is_in_inertial_phase = false;
- scrollStateData->from_user_input = true;
- scrollStateData->delta_consumed_for_scroll_sequence = false;
- ScrollState* scrollState =
- ScrollState::create(std::move(scrollStateData));
-
- customizedScroll(*node, *scrollState);
-
- ScrollResult result(
- scrollState->deltaX() != delta.width(),
- scrollState->deltaY() != delta.height(),
- scrollState->deltaX(),
- scrollState->deltaY());
-
- *wasRootScroller = true;
- m_currentScrollChain.clear();
-
- return result;
-}
-
-ScrollResult EventHandler::physicalScroll(ScrollGranularity granularity,
- const FloatSize& delta, const FloatPoint& position,
- const FloatSize& velocity, Node* startNode, Node** stopNode, bool* consumed)
-{
- if (consumed)
- *consumed = false;
- if (delta.isZero())
- return ScrollResult();
-
- Node* node = startNode;
- ASSERT(node && node->layoutObject());
-
- m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
-
- ScrollResult result;
-
- LayoutBox* curBox = node->layoutObject()->enclosingBox();
- while (curBox) {
- // If we're at the stopNode, we should try to scroll it but we shouldn't
- // chain past it.
- bool shouldStopChaining =
- stopNode && *stopNode && curBox->node() == *stopNode;
- bool wasRootScroller = false;
-
- result = scrollBox(
- curBox,
- granularity,
- delta,
- position,
- velocity,
- &wasRootScroller);
-
- if (result.didScroll() && stopNode)
- *stopNode = curBox->node();
-
- if (result.didScroll() || shouldStopChaining) {
- setFrameWasScrolledByUser();
- if (consumed)
- *consumed = true;
- return result;
- } else if (wasRootScroller) {
- // Don't try to chain past the root scroller, even if there's
- // eligible ancestors.
- break;
- }
-
- curBox = curBox->containingBlock();
- }
-
- return result;
-}
-
-bool EventHandler::logicalScroll(ScrollDirection direction, ScrollGranularity granularity, Node* startNode)
-{
- Node* node = startNode;
-
- if (!node)
- node = m_frame->document()->focusedElement();
-
- if (!node)
- node = m_mousePressNode.get();
-
- if ((!node || !node->layoutObject()) && m_frame->view() && !m_frame->view()->layoutViewItem().isNull())
- node = m_frame->view()->layoutViewItem().node();
-
- if (!node)
- return false;
-
- m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
-
- LayoutBox* curBox = node->layoutObject()->enclosingBox();
- while (curBox) {
- ScrollDirectionPhysical physicalDirection = toPhysicalDirection(
- direction, curBox->isHorizontalWritingMode(), curBox->style()->isFlippedBlocksWritingMode());
-
- ScrollResult result = curBox->scroll(granularity, toScrollDelta(physicalDirection, 1));
-
- if (result.didScroll()) {
- setFrameWasScrolledByUser();
- return true;
- }
-
- curBox = curBox->containingBlock();
- }
-
- return false;
-}
-
-void EventHandler::customizedScroll(const Node& startNode, ScrollState& scrollState)
-{
- if (scrollState.fullyConsumed())
- return;
-
- if (scrollState.deltaX() || scrollState.deltaY())
- m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
-
- if (m_currentScrollChain.empty())
- recomputeScrollChain(*m_frame, startNode, m_currentScrollChain);
- scrollState.setScrollChain(m_currentScrollChain);
-
- scrollState.distributeToScrollChainDescendant();
+ m_scrollManager.stopAutoscroll();
}
// TODO(bokan): This should be merged with logicalScroll assuming
// defaultSpaceEventHandler's chaining scroll can be done crossing frames.
bool EventHandler::bubblingScroll(ScrollDirection direction, ScrollGranularity granularity, Node* startingNode)
{
- // The layout needs to be up to date to determine if we can scroll. We may be
- // here because of an onLoad event, in which case the final layout hasn't been performed yet.
- m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
- // FIXME: enable scroll customization in this case. See crbug.com/410974.
- if (logicalScroll(direction, granularity, startingNode))
- return true;
-
- Frame* parentFrame = m_frame->tree().parent();
- if (!parentFrame || !parentFrame->isLocalFrame())
- return false;
- // FIXME: Broken for OOPI.
- return toLocalFrame(parentFrame)->eventHandler().bubblingScroll(direction, granularity, m_frame->deprecatedLocalOwner());
+ return m_scrollManager.bubblingScroll(direction, granularity, startingNode, m_mousePressNode);
}
IntPoint EventHandler::lastKnownMousePosition() const
@@ -858,13 +620,13 @@ void EventHandler::updateCursor()
OptionalCursor EventHandler::selectCursor(const HitTestResult& result)
{
- if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode())
+ if (m_scrollManager.inResizeMode())
return NoCursorChange;
Page* page = m_frame->page();
if (!page)
return NoCursorChange;
- if (panScrollInProgress())
+ if (m_scrollManager.panScrollInProgress())
return NoCursorChange;
Node* node = result.innerPossiblyPseudoNode();
@@ -1097,8 +859,8 @@ WebInputEventResult EventHandler::handleMousePressEvent(const PlatformMouseEvent
#if OS(WIN)
// We store whether pan scrolling is in progress before calling stopAutoscroll()
// because it will set m_autoscrollType to NoAutoscroll on return.
- bool isPanScrollInProgress = panScrollInProgress();
- stopAutoscroll();
+ bool isPanScrollInProgress = m_scrollManager.panScrollInProgress();
+ m_scrollManager.stopAutoscroll();
if (isPanScrollInProgress) {
// We invalidate the click when exiting pan scrolling so that we don't inadvertently navigate
// away from the current page (e.g. the click was on a hyperlink). See <rdar://problem/6095023>.
@@ -1119,9 +881,7 @@ WebInputEventResult EventHandler::handleMousePressEvent(const PlatformMouseEvent
PaintLayer* layer = mev.innerNode()->layoutObject() ? mev.innerNode()->layoutObject()->enclosingLayer() : nullptr;
IntPoint p = view->rootFrameToContents(mouseEvent.position());
if (layer && layer->getScrollableArea() && layer->getScrollableArea()->isPointInResizeControl(p, ResizerForPointer)) {
- m_resizeScrollableArea = layer->getScrollableArea();
- m_resizeScrollableArea->setInResizeMode(true);
- m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offsetFromResizeCorner(p));
+ m_scrollManager.setResizeScrollableArea(layer, p);
return WebInputEventResult::HandledSystem;
}
}
@@ -1292,8 +1052,8 @@ WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMous
Scrollbar* scrollbar = nullptr;
- if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
- m_resizeScrollableArea->resize(mev.event(), m_offsetFromResizeCorner);
+ if (m_scrollManager.inResizeMode()) {
+ m_scrollManager.resize(mev.event());
} else {
if (!scrollbar)
scrollbar = mev.scrollbar();
@@ -1461,10 +1221,7 @@ WebInputEventResult EventHandler::handleMouseReleaseEvent(const PlatformMouseEve
}
}
- if (m_resizeScrollableArea) {
- m_resizeScrollableArea->setInResizeMode(false);
- m_resizeScrollableArea = nullptr;
- }
+ m_scrollManager.clearResizeScrollableArea(false);
if (eventResult == WebInputEventResult::NotHandled)
eventResult = handleMouseReleaseEvent(mev);
@@ -1559,7 +1316,7 @@ WebInputEventResult EventHandler::updateDragAndDrop(const PlatformMouseEvent& ev
if (newTarget && newTarget->isTextNode())
newTarget = FlatTreeTraversal::parent(*newTarget);
- if (AutoscrollController* controller = autoscrollController())
+ if (AutoscrollController* controller = m_scrollManager.autoscrollController())
controller->updateDragAndDrop(newTarget, event.position(), event.timestamp());
if (m_dragTarget != newTarget) {
@@ -1647,7 +1404,7 @@ WebInputEventResult EventHandler::performDragAndDrop(const PlatformMouseEvent& e
void EventHandler::clearDragState()
{
- stopAutoscroll();
+ m_scrollManager.stopAutoscroll();
m_dragTarget = nullptr;
m_capturingMouseEventsNode = nullptr;
m_shouldOnlyFireDragOverEvent = false;
@@ -1889,7 +1646,7 @@ WebInputEventResult EventHandler::handleWheelEvent(const PlatformWheelEvent& eve
if (subframe) {
WebInputEventResult result = subframe->eventHandler().handleWheelEvent(event);
if (result != WebInputEventResult::NotHandled) {
- setFrameWasScrolledByUser();
+ m_scrollManager.setFrameWasScrolledByUser();
return result;
}
// TODO(dtapuska): Remove this once wheel gesture scroll has
@@ -1957,7 +1714,7 @@ void EventHandler::defaultWheelEventHandler(Node* startNode, WheelEvent* wheelEv
// FIXME: enable scroll customization in this case. See crbug.com/410974.
bool consumed = false;
- physicalScroll(
+ m_scrollManager.physicalScroll(
granularity,
delta,
FloatPoint(),
@@ -2035,17 +1792,10 @@ WebInputEventResult EventHandler::handleGestureEventInFrame(const GestureEventWi
ASSERT(!targetedEvent.event().isScrollEvent());
Node* eventTarget = targetedEvent.hitTestResult().innerNode();
- Scrollbar* scrollbar = targetedEvent.hitTestResult().scrollbar();
const PlatformGestureEvent& gestureEvent = targetedEvent.event();
- if (scrollbar) {
- bool shouldUpdateCapture = false;
- if (scrollbar->gestureEvent(gestureEvent, &shouldUpdateCapture)) {
- if (shouldUpdateCapture)
- m_scrollbarHandlingScrollGesture = scrollbar;
- return WebInputEventResult::HandledSuppressed;
- }
- }
+ if (m_scrollManager.canHandleGestureEvent(targetedEvent))
+ return WebInputEventResult::HandledSuppressed;
if (eventTarget) {
GestureEvent* gestureDomEvent = GestureEvent::create(eventTarget->document().domWindow(), gestureEvent);
@@ -2087,74 +1837,7 @@ WebInputEventResult EventHandler::handleGestureScrollEvent(const PlatformGesture
{
TRACE_EVENT0("input", "EventHandler::handleGestureScrollEvent");
- Node* eventTarget = nullptr;
- Scrollbar* scrollbar = nullptr;
- if (gestureEvent.type() != PlatformEvent::GestureScrollBegin) {
- scrollbar = m_scrollbarHandlingScrollGesture.get();
- eventTarget = m_scrollGestureHandlingNode.get();
- }
-
- if (!eventTarget) {
- Document* document = m_frame->document();
- if (document->layoutViewItem().isNull())
- return WebInputEventResult::NotHandled;
-
- FrameView* view = m_frame->view();
- LayoutPoint viewPoint = view->rootFrameToContents(gestureEvent.position());
- HitTestRequest request(HitTestRequest::ReadOnly);
- HitTestResult result(request, viewPoint);
- document->layoutViewItem().hitTest(result);
-
- eventTarget = result.innerNode();
-
- m_lastGestureScrollOverWidget = result.isOverWidget();
- m_scrollGestureHandlingNode = eventTarget;
- m_previousGestureScrolledNode = nullptr;
-
- if (!scrollbar)
- scrollbar = result.scrollbar();
- }
-
- if (scrollbar) {
- bool shouldUpdateCapture = false;
- if (scrollbar->gestureEvent(gestureEvent, &shouldUpdateCapture)) {
- if (shouldUpdateCapture)
- m_scrollbarHandlingScrollGesture = scrollbar;
- return WebInputEventResult::HandledSuppressed;
- }
- m_scrollbarHandlingScrollGesture = nullptr;
- }
-
- if (eventTarget) {
- if (handleScrollGestureOnResizer(eventTarget, gestureEvent))
- return WebInputEventResult::HandledSuppressed;
-
- GestureEvent* gestureDomEvent = GestureEvent::create(eventTarget->document().domWindow(), gestureEvent);
- if (gestureDomEvent) {
- DispatchEventResult gestureDomEventResult = eventTarget->dispatchEvent(gestureDomEvent);
- if (gestureDomEventResult != DispatchEventResult::NotCanceled) {
- ASSERT(gestureDomEventResult != DispatchEventResult::CanceledByEventHandler);
- return toWebInputEventResult(gestureDomEventResult);
- }
- }
- }
-
- switch (gestureEvent.type()) {
- case PlatformEvent::GestureScrollBegin:
- return handleGestureScrollBegin(gestureEvent);
- case PlatformEvent::GestureScrollUpdate:
- return handleGestureScrollUpdate(gestureEvent);
- case PlatformEvent::GestureScrollEnd:
- return handleGestureScrollEnd(gestureEvent);
- case PlatformEvent::GestureFlingStart:
- case PlatformEvent::GesturePinchBegin:
- case PlatformEvent::GesturePinchEnd:
- case PlatformEvent::GesturePinchUpdate:
- return WebInputEventResult::NotHandled;
- default:
- ASSERT_NOT_REACHED();
- return WebInputEventResult::NotHandled;
- }
+ return m_scrollManager.handleGestureScrollEvent(gestureEvent);
}
WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTestResults& targetedEvent)
@@ -2317,235 +2000,14 @@ WebInputEventResult EventHandler::handleGestureLongTap(const GestureEventWithHit
return WebInputEventResult::NotHandled;
}
-bool EventHandler::handleScrollGestureOnResizer(Node* eventTarget, const PlatformGestureEvent& gestureEvent)
-{
- if (gestureEvent.type() == PlatformEvent::GestureScrollBegin) {
- PaintLayer* layer = eventTarget->layoutObject() ? eventTarget->layoutObject()->enclosingLayer() : nullptr;
- IntPoint p = m_frame->view()->rootFrameToContents(gestureEvent.position());
- if (layer && layer->getScrollableArea() && layer->getScrollableArea()->isPointInResizeControl(p, ResizerForTouch)) {
- m_resizeScrollableArea = layer->getScrollableArea();
- m_resizeScrollableArea->setInResizeMode(true);
- m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offsetFromResizeCorner(p));
- return true;
- }
- } else if (gestureEvent.type() == PlatformEvent::GestureScrollUpdate) {
- if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
- m_resizeScrollableArea->resize(gestureEvent, m_offsetFromResizeCorner);
- return true;
- }
- } else if (gestureEvent.type() == PlatformEvent::GestureScrollEnd) {
- if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
- m_resizeScrollableArea->setInResizeMode(false);
- m_resizeScrollableArea = nullptr;
- return false;
- }
- }
-
- return false;
-}
-
-WebInputEventResult EventHandler::passScrollGestureEventToWidget(const PlatformGestureEvent& gestureEvent, LayoutObject* layoutObject)
-{
- ASSERT(gestureEvent.isScrollEvent());
-
- if (!m_lastGestureScrollOverWidget || !layoutObject || !layoutObject->isLayoutPart())
- return WebInputEventResult::NotHandled;
-
- Widget* widget = toLayoutPart(layoutObject)->widget();
-
- if (!widget || !widget->isFrameView())
- return WebInputEventResult::NotHandled;
-
- return toFrameView(widget)->frame().eventHandler().handleGestureScrollEvent(gestureEvent);
-}
-
WebInputEventResult EventHandler::handleGestureScrollEnd(const PlatformGestureEvent& gestureEvent)
mustaq 2016/05/31 16:04:11 There seems to be many "op-op" wrappers to a corre
Navid Zolghadr 2016/05/31 16:11:16 I thought that too. But I wanted to have that sort
bokan 2016/05/31 19:39:13 I think it's fine to make EventHandler the "interf
mustaq 2016/05/31 20:20:10 +1 on deferring the visibility of the sub-units, b
Navid Zolghadr 2016/06/01 17:36:43 Done.
{
- Node* node = m_scrollGestureHandlingNode;
-
- if (node) {
- passScrollGestureEventToWidget(gestureEvent, node->layoutObject());
- if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
- OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData());
- scrollStateData->is_ending = true;
- scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase() == ScrollInertialPhaseMomentum;
- scrollStateData->from_user_input = true;
- scrollStateData->is_direct_manipulation = true;
- scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedForScrollSequence;
- ScrollState* scrollState = ScrollState::create(std::move(scrollStateData));
- customizedScroll(*node, *scrollState);
- }
- }
-
- clearGestureScrollState();
- return WebInputEventResult::NotHandled;
-}
-
-WebInputEventResult EventHandler::handleGestureScrollBegin(const PlatformGestureEvent& gestureEvent)
-{
- Document* document = m_frame->document();
- if (document->layoutViewItem().isNull())
- return WebInputEventResult::NotHandled;
-
- FrameView* view = m_frame->view();
- if (!view)
- return WebInputEventResult::NotHandled;
-
- // If there's no layoutObject on the node, send the event to the nearest ancestor with a layoutObject.
- // Needed for <option> and <optgroup> elements so we can touch scroll <select>s
- while (m_scrollGestureHandlingNode && !m_scrollGestureHandlingNode->layoutObject())
- m_scrollGestureHandlingNode = m_scrollGestureHandlingNode->parentOrShadowHostNode();
-
- if (!m_scrollGestureHandlingNode) {
- if (RuntimeEnabledFeatures::scrollCustomizationEnabled())
- m_scrollGestureHandlingNode = m_frame->document()->documentElement();
- else
- return WebInputEventResult::NotHandled;
- }
- ASSERT(m_scrollGestureHandlingNode);
-
- passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->layoutObject());
- if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
- m_currentScrollChain.clear();
- OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData());
- scrollStateData->position_x = gestureEvent.position().x();
- scrollStateData->position_y = gestureEvent.position().y();
- scrollStateData->is_beginning = true;
- scrollStateData->from_user_input = true;
- scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedForScrollSequence;
- ScrollState* scrollState = ScrollState::create(std::move(scrollStateData));
- customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState);
- } else {
- if (m_frame->isMainFrame())
- m_frame->host()->topControls().scrollBegin();
- }
- return WebInputEventResult::HandledSystem;
-}
-
-bool EventHandler::isRootScroller(const Node& node) const
-{
- // The root scroller is the one Element on the page designated to perform
- // "viewport actions" like top controls movement and overscroll glow.
- if (!frameHost() || !frameHost()->rootScroller())
- return false;
-
- return frameHost()->rootScroller()->get() == &node;
-}
-
-WebInputEventResult EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gestureEvent)
-{
- ASSERT(gestureEvent.type() == PlatformEvent::GestureScrollUpdate);
-
- // Negate the deltas since the gesture event stores finger movement and
- // scrolling occurs in the direction opposite the finger's movement
- // direction. e.g. Finger moving up has negative event delta but causes the
- // page to scroll down causing positive scroll delta.
- FloatSize delta(-gestureEvent.deltaX(), -gestureEvent.deltaY());
- FloatSize velocity(-gestureEvent.velocityX(), -gestureEvent.velocityY());
- if (delta.isZero())
- return WebInputEventResult::NotHandled;
-
- ScrollGranularity granularity = gestureEvent.deltaUnits();
- Node* node = m_scrollGestureHandlingNode.get();
-
- // Scroll customization is only available for touch.
- bool handleScrollCustomization = RuntimeEnabledFeatures::scrollCustomizationEnabled() && gestureEvent.source() == PlatformGestureSourceTouchscreen;
- if (node) {
- LayoutObject* layoutObject = node->layoutObject();
- if (!layoutObject)
- return WebInputEventResult::NotHandled;
-
- // Try to send the event to the correct view.
- WebInputEventResult result = passScrollGestureEventToWidget(gestureEvent, layoutObject);
- if (result != WebInputEventResult::NotHandled) {
- if (gestureEvent.preventPropagation()
- && !RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
- // This is an optimization which doesn't apply with
- // scroll customization enabled.
- m_previousGestureScrolledNode = m_scrollGestureHandlingNode;
- }
- // FIXME: we should allow simultaneous scrolling of nested
- // iframes along perpendicular axes. See crbug.com/466991.
- m_deltaConsumedForScrollSequence = true;
- return result;
- }
-
- if (handleScrollCustomization) {
- OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData());
- scrollStateData->delta_x = delta.width();
- scrollStateData->delta_y = delta.height();
- scrollStateData->delta_granularity = ScrollByPrecisePixel;
- scrollStateData->velocity_x = velocity.width();
- scrollStateData->velocity_y = velocity.height();
- scrollStateData->should_propagate = !gestureEvent.preventPropagation();
- scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase() == ScrollInertialPhaseMomentum;
- scrollStateData->from_user_input = true;
- scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedForScrollSequence;
- ScrollState* scrollState = ScrollState::create(std::move(scrollStateData));
- if (m_previousGestureScrolledNode) {
- // The ScrollState needs to know what the current
- // native scrolling element is, so that for an
- // inertial scroll that shouldn't propagate, only the
- // currently scrolling element responds.
- ASSERT(m_previousGestureScrolledNode->isElementNode());
- scrollState->setCurrentNativeScrollingElement(toElement(m_previousGestureScrolledNode.get()));
- }
- customizedScroll(*node, *scrollState);
- m_previousGestureScrolledNode = scrollState->currentNativeScrollingElement();
- m_deltaConsumedForScrollSequence = scrollState->deltaConsumedForScrollSequence();
- if (scrollState->deltaX() != delta.width()
- || scrollState->deltaY() != delta.height()) {
- setFrameWasScrolledByUser();
- return WebInputEventResult::HandledSystem;
- }
- } else {
- Node* stopNode = nullptr;
- if (gestureEvent.preventPropagation())
- stopNode = m_previousGestureScrolledNode.get();
-
- bool consumed = false;
- ScrollResult result = physicalScroll(
- granularity,
- delta,
- FloatPoint(gestureEvent.position()),
- velocity,
- node,
- &stopNode,
- &consumed);
-
- if (gestureEvent.preventPropagation())
- m_previousGestureScrolledNode = stopNode;
-
- if ((!stopNode || !isRootScroller(*stopNode)) && frameHost()) {
- frameHost()->overscrollController().resetAccumulated(
- result.didScrollX, result.didScrollY);
- }
-
- if (consumed)
- return WebInputEventResult::HandledSystem;
- }
- }
-
- return WebInputEventResult::NotHandled;
-}
-
-void EventHandler::clearGestureScrollState()
-{
- m_scrollGestureHandlingNode = nullptr;
- m_previousGestureScrolledNode = nullptr;
- m_deltaConsumedForScrollSequence = false;
- m_currentScrollChain.clear();
-
- if (FrameHost* host = frameHost()) {
- bool resetX = true;
- bool resetY = true;
- host->overscrollController().resetAccumulated(resetX, resetY);
- }
+ return m_scrollManager.handleGestureScrollEnd(gestureEvent);
}
bool EventHandler::isScrollbarHandlingGestures() const
{
- return m_scrollbarHandlingScrollGesture.get();
+ return m_scrollManager.isScrollbarHandlingGestures();
}
bool EventHandler::shouldApplyTouchAdjustment(const PlatformGestureEvent& event) const
@@ -3084,8 +2546,7 @@ void EventHandler::setResizingFrameSet(HTMLFrameSetElement* frameSet)
void EventHandler::resizeScrollableAreaDestroyed()
{
- ASSERT(m_resizeScrollableArea);
- m_resizeScrollableArea = nullptr;
+ m_scrollManager.clearResizeScrollableArea(true);
}
void EventHandler::hoverTimerFired(Timer<EventHandler>*)
@@ -3155,10 +2616,10 @@ WebInputEventResult EventHandler::keyEvent(const PlatformKeyboardEvent& initialK
capsLockStateMayHaveChanged();
#if OS(WIN)
- if (panScrollInProgress()) {
+ if (m_scrollManager.panScrollInProgress()) {
// If a key is pressed while the panScroll is in progress then we want to stop
if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent.type() == PlatformEvent::RawKeyDown)
- stopAutoscroll();
+ m_scrollManager.stopAutoscroll();
// If we were in panscroll mode, we swallow the key event
return WebInputEventResult::HandledSuppressed;
@@ -3485,7 +2946,7 @@ void EventHandler::defaultSpaceEventHandler(KeyboardEvent* event)
ScrollDirection direction = event->shiftKey() ? ScrollBlockDirectionBackward : ScrollBlockDirectionForward;
// FIXME: enable scroll customization in this case. See crbug.com/410974.
- if (logicalScroll(direction, ScrollByPage)) {
+ if (m_scrollManager.logicalScroll(direction, ScrollByPage, nullptr, m_mousePressNode)) {
event->setDefaultHandled();
return;
}
@@ -3581,12 +3042,6 @@ void EventHandler::capsLockStateMayHaveChanged()
}
}
-void EventHandler::setFrameWasScrolledByUser()
-{
- if (DocumentLoader* documentLoader = m_frame->loader().documentLoader())
- documentLoader->initialScrollState().wasScrolledByUser = true;
-}
-
bool EventHandler::passMousePressEventToScrollbar(MouseEventWithHitTestResults& mev)
{
Scrollbar* scrollbar = mev.scrollbar();
@@ -3594,7 +3049,7 @@ bool EventHandler::passMousePressEventToScrollbar(MouseEventWithHitTestResults&
if (!scrollbar || !scrollbar->enabled())
return false;
- setFrameWasScrolledByUser();
+ m_scrollManager.setFrameWasScrolledByUser();
scrollbar->mouseDown(mev.event());
return true;
}

Powered by Google App Engine
This is Rietveld 408576698