void EventDispatcher::wheelEvent(uint64_t pageID, const WebWheelEvent& wheelEvent, bool canGoBack, bool canGoForward) { #if ENABLE(THREADED_SCROLLING) MutexLocker locker(m_scrollingTreesMutex); if (ScrollingTree* scrollingTree = m_scrollingTrees.get(pageID)) { PlatformWheelEvent platformWheelEvent = platform(wheelEvent); // FIXME: It's pretty horrible that we're updating the back/forward state here. // WebCore should always know the current state and know when it changes so the // scrolling tree can be notified. // We only need to do this at the beginning of the gesture. if (platformWheelEvent.phase() == PlatformWheelEventPhaseBegan) ScrollingThread::dispatch(bind(&ScrollingTree::updateBackForwardState, scrollingTree, canGoBack, canGoForward)); ScrollingTree::EventResult result = scrollingTree->tryToHandleWheelEvent(platformWheelEvent); if (result == ScrollingTree::DidHandleEvent || result == ScrollingTree::DidNotHandleEvent) { sendDidReceiveEvent(pageID, wheelEvent, result == ScrollingTree::DidHandleEvent); return; } } #else UNUSED_PARAM(canGoBack); UNUSED_PARAM(canGoForward); #endif RunLoop::main()->dispatch(bind(&EventDispatcher::dispatchWheelEvent, this, pageID, wheelEvent)); }
void EventDispatcher::wheelEvent(uint64_t pageID, const WebWheelEvent& wheelEvent, bool canRubberBandAtLeft, bool canRubberBandAtRight, bool canRubberBandAtTop, bool canRubberBandAtBottom) { PlatformWheelEvent platformWheelEvent = platform(wheelEvent); #if PLATFORM(COCOA) switch (wheelEvent.phase()) { case PlatformWheelEventPhaseBegan: m_recentWheelEventDeltaTracker->beginTrackingDeltas(); break; case PlatformWheelEventPhaseEnded: m_recentWheelEventDeltaTracker->endTrackingDeltas(); break; default: break; } if (m_recentWheelEventDeltaTracker->isTrackingDeltas()) { m_recentWheelEventDeltaTracker->recordWheelEventDelta(platformWheelEvent); DominantScrollGestureDirection dominantDirection = DominantScrollGestureDirection::None; dominantDirection = m_recentWheelEventDeltaTracker->dominantScrollGestureDirection(); // Workaround for scrolling issues <rdar://problem/14758615>. if (dominantDirection == DominantScrollGestureDirection::Vertical && platformWheelEvent.deltaX()) platformWheelEvent = platformWheelEvent.copyIgnoringHorizontalDelta(); else if (dominantDirection == DominantScrollGestureDirection::Horizontal && platformWheelEvent.deltaY()) platformWheelEvent = platformWheelEvent.copyIgnoringVerticalDelta(); } #endif #if ENABLE(ASYNC_SCROLLING) MutexLocker locker(m_scrollingTreesMutex); if (ThreadedScrollingTree* scrollingTree = m_scrollingTrees.get(pageID)) { // FIXME: It's pretty horrible that we're updating the back/forward state here. // WebCore should always know the current state and know when it changes so the // scrolling tree can be notified. // We only need to do this at the beginning of the gesture. if (platformWheelEvent.phase() == PlatformWheelEventPhaseBegan) ScrollingThread::dispatch(bind(&ThreadedScrollingTree::setCanRubberBandState, scrollingTree, canRubberBandAtLeft, canRubberBandAtRight, canRubberBandAtTop, canRubberBandAtBottom)); ScrollingTree::EventResult result = scrollingTree->tryToHandleWheelEvent(platformWheelEvent); if (result == ScrollingTree::DidHandleEvent || result == ScrollingTree::DidNotHandleEvent) { sendDidReceiveEvent(pageID, wheelEvent, result == ScrollingTree::DidHandleEvent); return; } } #else UNUSED_PARAM(canRubberBandAtLeft); UNUSED_PARAM(canRubberBandAtRight); UNUSED_PARAM(canRubberBandAtTop); UNUSED_PARAM(canRubberBandAtBottom); #endif RunLoop::main().dispatch(bind(&EventDispatcher::dispatchWheelEvent, this, pageID, wheelEvent)); }