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)); }
static inline void setXButtonEventFieldsByWebWheelEvent(XEvent& xEvent, const WebWheelEvent& webEvent, const WebCore::IntPoint& pluginLocation) { XButtonEvent& xButton = xEvent.xbutton; setCommonMouseEventFields(xButton, webEvent, pluginLocation); xButton.type = ButtonPress; FloatSize ticks = webEvent.wheelTicks(); if (ticks.height()) { if (ticks.height() > 0) xButton.button = 4; // up else xButton.button = 5; // down } else { if (ticks.width() > 0) xButton.button = 6; // left else xButton.button = 7; // right } }
WebKit2PlatformWheelEvent(const WebWheelEvent& webEvent) { // PlatformEvent m_type = PlatformEvent::Wheel; m_modifiers = 0; if (webEvent.shiftKey()) m_modifiers |= ShiftKey; if (webEvent.controlKey()) m_modifiers |= CtrlKey; if (webEvent.altKey()) m_modifiers |= AltKey; if (webEvent.metaKey()) m_modifiers |= MetaKey; m_timestamp = webEvent.timestamp(); // PlatformWheelEvent m_position = webEvent.position(); m_globalPosition = webEvent.globalPosition(); m_deltaX = webEvent.delta().width(); m_deltaY = webEvent.delta().height(); m_wheelTicksX = webEvent.wheelTicks().width(); m_wheelTicksY = webEvent.wheelTicks().height(); m_granularity = (webEvent.granularity() == WebWheelEvent::ScrollByPageWheelEvent) ? WebCore::ScrollByPageWheelEvent : WebCore::ScrollByPixelWheelEvent; m_directionInvertedFromDevice = webEvent.directionInvertedFromDevice(); #if PLATFORM(COCOA) m_phase = static_cast<WebCore::PlatformWheelEventPhase>(webEvent.phase()); m_momentumPhase = static_cast<WebCore::PlatformWheelEventPhase>(webEvent.momentumPhase()); m_hasPreciseScrollingDeltas = webEvent.hasPreciseScrollingDeltas(); m_scrollCount = webEvent.scrollCount(); m_unacceleratedScrollingDeltaX = webEvent.unacceleratedScrollingDelta().width(); m_unacceleratedScrollingDeltaY = webEvent.unacceleratedScrollingDelta().height(); #endif }
void WebPage::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder& arguments) { if (messageID.is<CoreIPC::MessageClassDrawingArea>()) { ASSERT(m_drawingArea); m_drawingArea->didReceiveMessage(connection, messageID, arguments); return; } switch (messageID.get<WebPageMessage::Kind>()) { case WebPageMessage::SetActive: { bool active; if (!arguments.decode(active)) return; setActive(active); break; } case WebPageMessage::SetFocused: { bool focused; if (!arguments.decode(focused)) return; setFocused(focused); break; } case WebPageMessage::MouseEvent: { WebMouseEvent event; if (!arguments.decode(event)) return; connection->send(WebPageProxyMessage::DidReceiveEvent, m_pageID, CoreIPC::In((uint32_t)event.type())); PlatformMouseEvent platformEvent = platform(event); mouseEvent(platformEvent); break; } case WebPageMessage::WheelEvent: { WebWheelEvent event; if (!arguments.decode(event)) return; connection->send(WebPageProxyMessage::DidReceiveEvent, m_pageID, CoreIPC::In((uint32_t)event.type())); PlatformWheelEvent platformEvent = platform(event); wheelEvent(platformEvent); break; } case WebPageMessage::KeyEvent: { WebKeyboardEvent event; if (!arguments.decode(event)) return; connection->send(WebPageProxyMessage::DidReceiveEvent, m_pageID, CoreIPC::In((uint32_t)event.type())); PlatformKeyboardEvent platformEvent = platform(event); keyEvent(platformEvent); break; } case WebPageMessage::LoadURL: { String url; if (!arguments.decode(url)) return; loadURL(url); break; } case WebPageMessage::StopLoading: stopLoading(); break; case WebPageMessage::Reload: bool reloadFromOrigin; if (!arguments.decode(CoreIPC::Out(reloadFromOrigin))) return; reload(reloadFromOrigin); break; case WebPageMessage::GoForward: goForward(); break; case WebPageMessage::GoBack: goBack(); break; case WebPageMessage::DidReceivePolicyDecision: { uint64_t frameID; uint64_t listenerID; uint32_t policyAction; if (!arguments.decode(CoreIPC::Out(frameID, listenerID, policyAction))) return; didReceivePolicyDecision(webFrame(frameID), listenerID, (WebCore::PolicyAction)policyAction); break; } case WebPageMessage::RunJavaScriptInMainFrame: { String script; uint64_t callbackID; if (!arguments.decode(CoreIPC::Out(script, callbackID))) return; runJavaScriptInMainFrame(script, callbackID); break; } case WebPageMessage::GetRenderTreeExternalRepresentation: { uint64_t callbackID; if (!arguments.decode(callbackID)) return; getRenderTreeExternalRepresentation(callbackID); break; } case WebPageMessage::Close: { close(); break; } case WebPageMessage::TryClose: { tryClose(); break; } default: ASSERT_NOT_REACHED(); break; } }
WebKit2PlatformWheelEvent(const WebWheelEvent& webEvent) { m_position = WebCore::IntPoint(webEvent.positionX(), webEvent.positionY()); m_globalPosition = WebCore::IntPoint(webEvent.globalPositionX(), webEvent.globalPositionY()); m_deltaX = webEvent.deltaX(); m_deltaY = webEvent.deltaY(); m_wheelTicksX = webEvent.wheelTicksX(); m_wheelTicksY = webEvent.wheelTicksY(); m_granularity = (webEvent.granularity() == WebWheelEvent::ScrollByPageWheelEvent) ? WebCore::ScrollByPageWheelEvent : WebCore::ScrollByPixelWheelEvent; m_shiftKey = webEvent.shiftKey(); m_ctrlKey = webEvent.controlKey(); m_altKey = webEvent.altKey(); m_metaKey = webEvent.metaKey(); }