void ScrollAnimator::handleWheelEvent(PlatformWheelEvent& e) { Scrollbar* horizontalScrollbar = m_scrollableArea->horizontalScrollbar(); Scrollbar* verticalScrollbar = m_scrollableArea->verticalScrollbar(); // Accept the event if we have a scrollbar in that direction and can still // scroll any further. float deltaX = horizontalScrollbar ? e.deltaX() : 0; float deltaY = verticalScrollbar ? e.deltaY() : 0; IntSize maxForwardScrollDelta = m_scrollableArea->maximumScrollPosition() - m_scrollableArea->scrollPosition(); IntSize maxBackwardScrollDelta = m_scrollableArea->scrollPosition() - m_scrollableArea->minimumScrollPosition(); if ((deltaX < 0 && maxForwardScrollDelta.width() > 0) || (deltaX > 0 && maxBackwardScrollDelta.width() > 0) || (deltaY < 0 && maxForwardScrollDelta.height() > 0) || (deltaY > 0 && maxBackwardScrollDelta.height() > 0)) { e.accept(); if (e.granularity() == ScrollByPageWheelEvent) { ASSERT(!e.deltaX()); bool negative = deltaY < 0; deltaY = max(max(static_cast<float>(m_scrollableArea->visibleHeight()) * Scrollbar::minFractionToStepWhenPaging(), static_cast<float>(m_scrollableArea->visibleHeight() - Scrollbar::maxOverlapBetweenPages())), 1.0f); if (negative) deltaY = -deltaY; } if (deltaY) scroll(VerticalScrollbar, ScrollByPixel, verticalScrollbar->pixelStep(), -deltaY); if (deltaX) scroll(HorizontalScrollbar, ScrollByPixel, horizontalScrollbar->pixelStep(), -deltaX); } }
bool ScrollAnimator::handleWheelEvent(const PlatformWheelEvent& e) { #if ENABLE(CSS_SCROLL_SNAP) && PLATFORM(MAC) if (!m_scrollController.processWheelEventForScrollSnap(e)) return false; #endif #if PLATFORM(COCOA) // Events in the PlatformWheelEventPhaseMayBegin phase have no deltas, and therefore never passes through the scroll handling logic below. // This causes us to return with an 'unhandled' return state, even though this event was successfully processed. // // We receive at least one PlatformWheelEventPhaseMayBegin when starting main-thread scrolling (see FrameView::wheelEvent), which can // fool the scrolling thread into attempting to handle the scroll, unless we treat the event as handled here. if (e.phase() == PlatformWheelEventPhaseMayBegin) return true; #endif Scrollbar* horizontalScrollbar = m_scrollableArea.horizontalScrollbar(); Scrollbar* verticalScrollbar = m_scrollableArea.verticalScrollbar(); // Accept the event if we have a scrollbar in that direction and can still // scroll any further. float deltaX = horizontalScrollbar ? e.deltaX() : 0; float deltaY = verticalScrollbar ? e.deltaY() : 0; bool handled = false; ScrollGranularity granularity = ScrollByPixel; IntSize maxForwardScrollDelta = m_scrollableArea.maximumScrollPosition() - m_scrollableArea.scrollPosition(); IntSize maxBackwardScrollDelta = m_scrollableArea.scrollPosition() - m_scrollableArea.minimumScrollPosition(); if ((deltaX < 0 && maxForwardScrollDelta.width() > 0) || (deltaX > 0 && maxBackwardScrollDelta.width() > 0) || (deltaY < 0 && maxForwardScrollDelta.height() > 0) || (deltaY > 0 && maxBackwardScrollDelta.height() > 0)) { handled = true; if (deltaY) { if (e.granularity() == ScrollByPageWheelEvent) { bool negative = deltaY < 0; deltaY = Scrollbar::pageStepDelta(m_scrollableArea.visibleHeight()); if (negative) deltaY = -deltaY; } scroll(VerticalScrollbar, granularity, verticalScrollbar->pixelStep(), -deltaY); } if (deltaX) { if (e.granularity() == ScrollByPageWheelEvent) { bool negative = deltaX < 0; deltaX = Scrollbar::pageStepDelta(m_scrollableArea.visibleWidth()); if (negative) deltaX = -deltaX; } scroll(HorizontalScrollbar, granularity, horizontalScrollbar->pixelStep(), -deltaX); } } return handled; }
bool ScrollAnimator::handleWheelEvent(const PlatformWheelEvent& e) { Scrollbar* horizontalScrollbar = m_scrollableArea->horizontalScrollbar(); Scrollbar* verticalScrollbar = m_scrollableArea->verticalScrollbar(); // Accept the event if we have a scrollbar in that direction and can still // scroll any further. float deltaX = horizontalScrollbar ? e.deltaX() : 0; float deltaY = verticalScrollbar ? e.deltaY() : 0; bool handled = false; #if PLATFORM(CHROMIUM) && !OS(DARWIN) ScrollGranularity granularity = e.hasPreciseScrollingDeltas() ? ScrollByPrecisePixel : ScrollByPixel; #else ScrollGranularity granularity = ScrollByPixel; #endif IntSize maxForwardScrollDelta = m_scrollableArea->maximumScrollPosition() - m_scrollableArea->scrollPosition(); IntSize maxBackwardScrollDelta = m_scrollableArea->scrollPosition() - m_scrollableArea->minimumScrollPosition(); if ((deltaX < 0 && maxForwardScrollDelta.width() > 0) || (deltaX > 0 && maxBackwardScrollDelta.width() > 0) || (deltaY < 0 && maxForwardScrollDelta.height() > 0) || (deltaY > 0 && maxBackwardScrollDelta.height() > 0)) { handled = true; if (deltaY) { if (e.granularity() == ScrollByPageWheelEvent) { bool negative = deltaY < 0; deltaY = max(max(static_cast<float>(m_scrollableArea->visibleHeight()) * Scrollbar::minFractionToStepWhenPaging(), static_cast<float>(m_scrollableArea->visibleHeight() - Scrollbar::maxOverlapBetweenPages())), 1.0f); if (negative) deltaY = -deltaY; } scroll(VerticalScrollbar, granularity, verticalScrollbar->pixelStep(), -deltaY); } if (deltaX) { if (e.granularity() == ScrollByPageWheelEvent) { bool negative = deltaX < 0; deltaX = max(max(static_cast<float>(m_scrollableArea->visibleWidth()) * Scrollbar::minFractionToStepWhenPaging(), static_cast<float>(m_scrollableArea->visibleWidth() - Scrollbar::maxOverlapBetweenPages())), 1.0f); if (negative) deltaX = -deltaX; } scroll(HorizontalScrollbar, granularity, horizontalScrollbar->pixelStep(), -deltaX); } } return handled; }
bool ScrollableArea::scroll(ScrollDirection direction, ScrollGranularity granularity, float multiplier) { ScrollbarOrientation orientation; Scrollbar* scrollbar; if (direction == ScrollUp || direction == ScrollDown) { orientation = VerticalScrollbar; scrollbar = verticalScrollbar(); } else { orientation = HorizontalScrollbar; scrollbar = horizontalScrollbar(); } if (!scrollbar) return false; float step = 0; switch (granularity) { case ScrollByLine: step = scrollbar->lineStep(); break; case ScrollByPage: step = scrollbar->pageStep(); break; case ScrollByDocument: step = scrollbar->totalSize(); break; case ScrollByPixel: case ScrollByPrecisePixel: step = scrollbar->pixelStep(); break; case ScrollByPixelVelocity: break; } if (granularity != ScrollByPixelVelocity && (direction == ScrollUp || direction == ScrollLeft)) multiplier = -multiplier; return scrollAnimator()->scroll(orientation, granularity, step, multiplier); }