Index: third_party/WebKit/Source/web/WebInputEventConversion.cpp |
diff --git a/third_party/WebKit/Source/web/WebInputEventConversion.cpp b/third_party/WebKit/Source/web/WebInputEventConversion.cpp |
index 50e13d1c4d2c161c9ebd50c5dbfb886ac59866ed..e3c51bdfd96438a7ebfd8abcbe873878db48831a 100644 |
--- a/third_party/WebKit/Source/web/WebInputEventConversion.cpp |
+++ b/third_party/WebKit/Source/web/WebInputEventConversion.cpp |
@@ -50,14 +50,43 @@ |
namespace blink { |
namespace { |
-float scaleDeltaToWindow(const Widget* widget, float delta) { |
+float frameScale(const Widget* widget) { |
float scale = 1; |
if (widget) { |
FrameView* rootView = toFrameView(widget->root()); |
if (rootView) |
scale = rootView->inputEventsScaleFactor(); |
} |
- return delta / scale; |
+ return scale; |
+} |
+ |
+FloatPoint frameTranslation(const Widget* widget) { |
+ float scale = 1; |
+ FloatSize offset; |
+ IntPoint visualViewport; |
+ FloatSize overscrollOffset; |
+ if (widget) { |
+ FrameView* rootView = toFrameView(widget->root()); |
+ if (rootView) { |
+ scale = rootView->inputEventsScaleFactor(); |
+ offset = FloatSize(rootView->inputEventsOffsetForEmulation()); |
+ visualViewport = flooredIntPoint(rootView->page() |
+ ->frameHost() |
+ .visualViewport() |
+ .visibleRect() |
+ .location()); |
+ overscrollOffset = |
+ rootView->page()->frameHost().chromeClient().elasticOverscroll(); |
+ } |
+ } |
+ return FloatPoint( |
+ -offset.width() / scale + visualViewport.x() + overscrollOffset.width(), |
+ -offset.height() / scale + visualViewport.y() + |
+ overscrollOffset.height()); |
+} |
+ |
+float scaleDeltaToWindow(const Widget* widget, float delta) { |
+ return delta / frameScale(widget); |
} |
FloatSize scaleSizeToWindow(const Widget* widget, FloatSize size) { |
@@ -134,59 +163,6 @@ unsigned toPlatformModifierFrom(WebMouseEvent::Button button) { |
return webMouseButtonToPlatformModifier[static_cast<int>(button)]; |
} |
-ScrollGranularity toPlatformScrollGranularity( |
- WebGestureEvent::ScrollUnits units) { |
- switch (units) { |
- case WebGestureEvent::ScrollUnits::PrecisePixels: |
- return ScrollGranularity::ScrollByPrecisePixel; |
- case WebGestureEvent::ScrollUnits::Pixels: |
- return ScrollGranularity::ScrollByPixel; |
- case WebGestureEvent::ScrollUnits::Page: |
- return ScrollGranularity::ScrollByPage; |
- default: |
- NOTREACHED(); |
- return ScrollGranularity::ScrollByPrecisePixel; |
- } |
-} |
- |
-ScrollInertialPhase toPlatformScrollInertialPhase( |
- WebGestureEvent::InertialPhaseState state) { |
- static_assert( |
- ScrollInertialPhaseUnknown == static_cast<ScrollInertialPhase>( |
- WebGestureEvent::UnknownMomentumPhase), |
- "Inertial phases not equal"); |
- static_assert( |
- ScrollInertialPhaseNonMomentum == |
- static_cast<ScrollInertialPhase>(WebGestureEvent::NonMomentumPhase), |
- "Inertial phases not equal"); |
- static_assert( |
- ScrollInertialPhaseMomentum == |
- static_cast<ScrollInertialPhase>(WebGestureEvent::MomentumPhase), |
- "Inertial phases not equal"); |
- |
- return static_cast<ScrollInertialPhase>(state); |
-} |
- |
-WebGestureEvent::InertialPhaseState toWebGestureInertialPhaseState( |
- ScrollInertialPhase state) { |
- return static_cast<WebGestureEvent::InertialPhaseState>(state); |
-} |
- |
-WebGestureEvent::ScrollUnits toWebGestureScrollUnits( |
- ScrollGranularity granularity) { |
- switch (granularity) { |
- case ScrollGranularity::ScrollByPrecisePixel: |
- return WebGestureEvent::ScrollUnits::PrecisePixels; |
- case ScrollGranularity::ScrollByPixel: |
- return WebGestureEvent::ScrollUnits::Pixels; |
- case ScrollGranularity::ScrollByPage: |
- return WebGestureEvent::ScrollUnits::Page; |
- default: |
- NOTREACHED(); |
- return WebGestureEvent::ScrollUnits::PrecisePixels; |
- } |
-} |
- |
} // namespace |
// MakePlatformMouseEvent ----------------------------------------------------- |
@@ -266,129 +242,12 @@ PlatformWheelEventBuilder::PlatformWheelEventBuilder( |
// PlatformGestureEventBuilder ----------------------------------------------- |
-PlatformGestureEventBuilder::PlatformGestureEventBuilder( |
- Widget* widget, |
- const WebGestureEvent& e) { |
- switch (e.type) { |
- case WebInputEvent::GestureScrollBegin: |
- m_type = PlatformEvent::GestureScrollBegin; |
- m_data.m_scroll.m_resendingPluginId = e.resendingPluginId; |
- m_data.m_scroll.m_deltaX = e.data.scrollBegin.deltaXHint; |
- m_data.m_scroll.m_deltaY = e.data.scrollBegin.deltaYHint; |
- m_data.m_scroll.m_deltaUnits = |
- toPlatformScrollGranularity(e.data.scrollBegin.deltaHintUnits); |
- m_data.m_scroll.m_inertialPhase = |
- toPlatformScrollInertialPhase(e.data.scrollBegin.inertialPhase); |
- m_data.m_scroll.m_synthetic = e.data.scrollBegin.synthetic; |
- break; |
- case WebInputEvent::GestureScrollEnd: |
- m_type = PlatformEvent::GestureScrollEnd; |
- m_data.m_scroll.m_resendingPluginId = e.resendingPluginId; |
- m_data.m_scroll.m_deltaUnits = |
- toPlatformScrollGranularity(e.data.scrollEnd.deltaUnits); |
- m_data.m_scroll.m_inertialPhase = |
- toPlatformScrollInertialPhase(e.data.scrollEnd.inertialPhase); |
- m_data.m_scroll.m_synthetic = e.data.scrollEnd.synthetic; |
- break; |
- case WebInputEvent::GestureFlingStart: |
- m_type = PlatformEvent::GestureFlingStart; |
- m_data.m_scroll.m_velocityX = e.data.flingStart.velocityX; |
- m_data.m_scroll.m_velocityY = e.data.flingStart.velocityY; |
- break; |
- case WebInputEvent::GestureScrollUpdate: |
- m_type = PlatformEvent::GestureScrollUpdate; |
- m_data.m_scroll.m_resendingPluginId = e.resendingPluginId; |
- m_data.m_scroll.m_deltaX = |
- scaleDeltaToWindow(widget, e.data.scrollUpdate.deltaX); |
- m_data.m_scroll.m_deltaY = |
- scaleDeltaToWindow(widget, e.data.scrollUpdate.deltaY); |
- m_data.m_scroll.m_velocityX = e.data.scrollUpdate.velocityX; |
- m_data.m_scroll.m_velocityY = e.data.scrollUpdate.velocityY; |
- m_data.m_scroll.m_preventPropagation = |
- e.data.scrollUpdate.preventPropagation; |
- m_data.m_scroll.m_inertialPhase = |
- toPlatformScrollInertialPhase(e.data.scrollUpdate.inertialPhase); |
- m_data.m_scroll.m_deltaUnits = |
- toPlatformScrollGranularity(e.data.scrollUpdate.deltaUnits); |
- break; |
- case WebInputEvent::GestureTap: |
- m_type = PlatformEvent::GestureTap; |
- m_area = expandedIntSize(scaleSizeToWindow( |
- widget, FloatSize(e.data.tap.width, e.data.tap.height))); |
- m_data.m_tap.m_tapCount = e.data.tap.tapCount; |
- break; |
- case WebInputEvent::GestureTapUnconfirmed: |
- m_type = PlatformEvent::GestureTapUnconfirmed; |
- m_area = expandedIntSize(scaleSizeToWindow( |
- widget, FloatSize(e.data.tap.width, e.data.tap.height))); |
- break; |
- case WebInputEvent::GestureTapDown: |
- m_type = PlatformEvent::GestureTapDown; |
- m_area = expandedIntSize(scaleSizeToWindow( |
- widget, FloatSize(e.data.tapDown.width, e.data.tapDown.height))); |
- break; |
- case WebInputEvent::GestureShowPress: |
- m_type = PlatformEvent::GestureShowPress; |
- m_area = expandedIntSize(scaleSizeToWindow( |
- widget, FloatSize(e.data.showPress.width, e.data.showPress.height))); |
- break; |
- case WebInputEvent::GestureTapCancel: |
- m_type = PlatformEvent::GestureTapDownCancel; |
- break; |
- case WebInputEvent::GestureDoubleTap: |
- // DoubleTap gesture is now handled as PlatformEvent::GestureTap with |
- // tap_count = 2. So no need to convert to a Platfrom DoubleTap gesture. |
- // But in WebViewImpl::handleGestureEvent all WebGestureEvent are |
- // converted to PlatformGestureEvent, for completeness and not reach the |
- // NOTREACHED() at the end, convert the DoubleTap to a NoType. |
- m_type = PlatformEvent::NoType; |
- break; |
- case WebInputEvent::GestureTwoFingerTap: |
- m_type = PlatformEvent::GestureTwoFingerTap; |
- m_area = expandedIntSize(scaleSizeToWindow( |
- widget, FloatSize(e.data.twoFingerTap.firstFingerWidth, |
- e.data.twoFingerTap.firstFingerHeight))); |
- break; |
- case WebInputEvent::GestureLongPress: |
- m_type = PlatformEvent::GestureLongPress; |
- m_area = expandedIntSize(scaleSizeToWindow( |
- widget, FloatSize(e.data.longPress.width, e.data.longPress.height))); |
- break; |
- case WebInputEvent::GestureLongTap: |
- m_type = PlatformEvent::GestureLongTap; |
- m_area = expandedIntSize(scaleSizeToWindow( |
- widget, FloatSize(e.data.longPress.width, e.data.longPress.height))); |
- break; |
- case WebInputEvent::GesturePinchBegin: |
- m_type = PlatformEvent::GesturePinchBegin; |
- break; |
- case WebInputEvent::GesturePinchEnd: |
- m_type = PlatformEvent::GesturePinchEnd; |
- break; |
- case WebInputEvent::GesturePinchUpdate: |
- m_type = PlatformEvent::GesturePinchUpdate; |
- m_data.m_pinchUpdate.m_scale = e.data.pinchUpdate.scale; |
- break; |
- default: |
- NOTREACHED(); |
- } |
- m_position = widget->convertFromRootFrame(flooredIntPoint( |
- convertHitPointToRootFrame(widget, FloatPoint(e.x, e.y)))); |
- m_globalPosition = IntPoint(e.globalX, e.globalY); |
- m_timestamp = TimeTicks::FromSeconds(e.timeStampSeconds); |
- m_modifiers = e.modifiers; |
- switch (e.sourceDevice) { |
- case WebGestureDeviceTouchpad: |
- m_source = PlatformGestureSourceTouchpad; |
- break; |
- case WebGestureDeviceTouchscreen: |
- m_source = PlatformGestureSourceTouchscreen; |
- break; |
- case WebGestureDeviceUninitialized: |
- NOTREACHED(); |
- } |
- |
- m_uniqueTouchEventId = e.uniqueTouchEventId; |
+WebGestureEvent TransformWebGestureEvent(Widget* widget, |
+ const WebGestureEvent& event) { |
+ WebGestureEvent result = event; |
+ result.setFrameScale(frameScale(widget)); |
+ result.setFrameTranslate(frameTranslation(widget)); |
+ return result; |
} |
inline PlatformEvent::EventType toPlatformTouchEventType( |
@@ -769,70 +628,6 @@ WebTouchEventBuilder::WebTouchEventBuilder(const LayoutItem layoutItem, |
&touchesLength, layoutItem, event.pointerType()); |
} |
-WebGestureEventBuilder::WebGestureEventBuilder(const LayoutItem layoutItem, |
- const GestureEvent& event) { |
- if (event.type() == EventTypeNames::gestureshowpress) { |
- type = GestureShowPress; |
- } else if (event.type() == EventTypeNames::gesturelongpress) { |
- type = GestureLongPress; |
- } else if (event.type() == EventTypeNames::gesturetapdown) { |
- type = GestureTapDown; |
- } else if (event.type() == EventTypeNames::gesturescrollstart) { |
- type = GestureScrollBegin; |
- resendingPluginId = event.resendingPluginId(); |
- data.scrollBegin.deltaXHint = event.deltaX(); |
- data.scrollBegin.deltaYHint = event.deltaY(); |
- data.scrollBegin.deltaHintUnits = |
- toWebGestureScrollUnits(event.deltaUnits()); |
- data.scrollBegin.inertialPhase = |
- toWebGestureInertialPhaseState(event.inertialPhase()); |
- data.scrollBegin.synthetic = event.synthetic(); |
- } else if (event.type() == EventTypeNames::gesturescrollend) { |
- type = GestureScrollEnd; |
- resendingPluginId = event.resendingPluginId(); |
- data.scrollEnd.deltaUnits = toWebGestureScrollUnits(event.deltaUnits()); |
- data.scrollEnd.inertialPhase = |
- toWebGestureInertialPhaseState(event.inertialPhase()); |
- data.scrollEnd.synthetic = event.synthetic(); |
- } else if (event.type() == EventTypeNames::gesturescrollupdate) { |
- type = GestureScrollUpdate; |
- data.scrollUpdate.deltaUnits = toWebGestureScrollUnits(event.deltaUnits()); |
- data.scrollUpdate.deltaX = event.deltaX(); |
- data.scrollUpdate.deltaY = event.deltaY(); |
- data.scrollUpdate.inertialPhase = |
- toWebGestureInertialPhaseState(event.inertialPhase()); |
- resendingPluginId = event.resendingPluginId(); |
- } else if (event.type() == EventTypeNames::gestureflingstart) { |
- type = GestureFlingStart; |
- data.flingStart.velocityX = event.velocityX(); |
- data.flingStart.velocityY = event.velocityY(); |
- } else if (event.type() == EventTypeNames::gesturetap) { |
- type = GestureTap; |
- data.tap.tapCount = 1; |
- } |
- |
- timeStampSeconds = event.platformTimeStamp().InSeconds(); |
- modifiers = event.modifiers(); |
- |
- globalX = event.screenX(); |
- globalY = event.screenY(); |
- IntPoint localPoint = convertAbsoluteLocationForLayoutObjectInt( |
- event.absoluteLocation(), layoutItem); |
- x = localPoint.x(); |
- y = localPoint.y(); |
- |
- switch (event.source()) { |
- case GestureSourceTouchpad: |
- sourceDevice = WebGestureDeviceTouchpad; |
- break; |
- case GestureSourceTouchscreen: |
- sourceDevice = WebGestureDeviceTouchscreen; |
- break; |
- case GestureSourceUninitialized: |
- NOTREACHED(); |
- } |
-} |
- |
Vector<PlatformMouseEvent> createPlatformMouseEventVector( |
Widget* widget, |
const std::vector<const WebInputEvent*>& coalescedEvents) { |