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 aed825ce918ec8e496f48ca293ac7ab271801bc2..0300e385ebe0124fda10c66b811652bf87603a9a 100644 |
--- a/third_party/WebKit/Source/web/WebInputEventConversion.cpp |
+++ b/third_party/WebKit/Source/web/WebInputEventConversion.cpp |
@@ -85,54 +85,6 @@ FloatPoint frameTranslation(const Widget* widget) { |
overscrollOffset.height()); |
} |
-float scaleDeltaToWindow(const Widget* widget, float delta) { |
- return delta / frameScale(widget); |
-} |
- |
-// This method converts from the renderer's coordinate space into Blink's root |
-// frame coordinate space. It's somewhat unique in that it takes into account |
-// DevTools emulation, which applies a scale and offset in the root layer (see |
-// updateRootLayerTransform in WebViewImpl) as well as the overscroll effect on |
-// OSX. This is in addition to the visual viewport "pinch-zoom" transformation |
-// and is one of the few cases where the visual viewport is not equal to the |
-// renderer's coordinate-space. |
-FloatPoint convertHitPointToRootFrame(const Widget* widget, |
- FloatPoint pointInRendererViewport) { |
- float scale = 1; |
- IntSize offset; |
- IntPoint visualViewport; |
- FloatSize overscrollOffset; |
- if (widget) { |
- FrameView* rootView = toFrameView(widget->root()); |
- if (rootView) { |
- scale = rootView->inputEventsScaleFactor(); |
- offset = rootView->inputEventsOffsetForEmulation(); |
- visualViewport = flooredIntPoint(rootView->page() |
- ->frameHost() |
- .visualViewport() |
- .visibleRect() |
- .location()); |
- overscrollOffset = |
- rootView->page()->frameHost().chromeClient().elasticOverscroll(); |
- } |
- } |
- return FloatPoint((pointInRendererViewport.x() - offset.width()) / scale + |
- visualViewport.x() + overscrollOffset.width(), |
- (pointInRendererViewport.y() - offset.height()) / scale + |
- visualViewport.y() + overscrollOffset.height()); |
-} |
- |
-unsigned toPlatformModifierFrom(WebMouseEvent::Button button) { |
- if (button == WebMouseEvent::Button::NoButton) |
- return 0; |
- |
- unsigned webMouseButtonToPlatformModifier[] = { |
- PlatformEvent::LeftButtonDown, PlatformEvent::MiddleButtonDown, |
- PlatformEvent::RightButtonDown}; |
- |
- return webMouseButtonToPlatformModifier[static_cast<int>(button)]; |
-} |
- |
FloatPoint convertAbsoluteLocationForLayoutObjectFloat( |
const DoublePoint& location, |
const LayoutItem layoutItem) { |
@@ -172,51 +124,39 @@ void updateWebMouseEventFromCoreMouseEvent(const MouseEvent& event, |
webEvent.y = localPoint.y(); |
} |
-} // namespace |
+unsigned toWebInputEventModifierFrom(WebMouseEvent::Button button) { |
+ if (button == WebMouseEvent::Button::NoButton) |
+ return 0; |
-// MakePlatformMouseEvent ----------------------------------------------------- |
- |
-// TODO(mustaq): Add tests for this. |
-PlatformMouseEventBuilder::PlatformMouseEventBuilder(Widget* widget, |
- const WebMouseEvent& e) { |
- // FIXME: Widget is always toplevel, unless it's a popup. We may be able |
- // to get rid of this once we abstract popups into a WebKit API. |
- m_position = widget->convertFromRootFrame( |
- flooredIntPoint(convertHitPointToRootFrame(widget, IntPoint(e.x, e.y)))); |
- m_globalPosition = IntPoint(e.globalX, e.globalY); |
- m_movementDelta = IntPoint(scaleDeltaToWindow(widget, e.movementX), |
- scaleDeltaToWindow(widget, e.movementY)); |
- m_modifiers = e.modifiers(); |
- |
- m_timestamp = TimeTicks::FromSeconds(e.timeStampSeconds()); |
- m_clickCount = e.clickCount; |
- |
- m_pointerProperties = static_cast<WebPointerProperties>(e); |
- |
- switch (e.type()) { |
- case WebInputEvent::MouseMove: |
- case WebInputEvent::MouseEnter: // synthesize a move event |
- case WebInputEvent::MouseLeave: // synthesize a move event |
- m_type = PlatformEvent::MouseMoved; |
- break; |
+ unsigned webMouseButtonToPlatformModifier[] = { |
+ WebInputEvent::LeftButtonDown, WebInputEvent::MiddleButtonDown, |
+ WebInputEvent::RightButtonDown}; |
- case WebInputEvent::MouseDown: |
- m_type = PlatformEvent::MousePressed; |
- break; |
+ return webMouseButtonToPlatformModifier[static_cast<int>(button)]; |
+} |
- case WebInputEvent::MouseUp: |
- m_type = PlatformEvent::MouseReleased; |
+} // namespace |
- // The MouseEvent spec requires that buttons indicates the state |
- // immediately after the event takes place. To ensure consistency |
- // between platforms here, we explicitly clear the button that is |
- // in the process of being released. |
- m_modifiers &= ~toPlatformModifierFrom(e.button); |
- break; |
+WebMouseEvent TransformWebMouseEvent(Widget* widget, |
+ const WebMouseEvent& event) { |
+ WebMouseEvent result = event; |
- default: |
- NOTREACHED(); |
+ // TODO(dtapuska): Remove this translation. In the past blink has |
+ // converted leaves into moves and not known about leaves. It should |
+ // be educated about them. |
+ if (event.type() == WebInputEvent::MouseEnter || |
+ event.type() == WebInputEvent::MouseLeave) { |
+ result.setType(WebInputEvent::MouseMove); |
} |
+ |
+ // TODO(dtapuska): Perhaps the event should be constructed correctly? |
bokan
2017/01/27 16:57:17
Please file bugs for these and put the bug # in th
dtapuska
2017/01/27 21:00:00
Done.
|
+ if (event.type() == WebInputEvent::MouseUp) { |
+ result.setModifiers(event.modifiers() & |
+ ~toWebInputEventModifierFrom(event.button)); |
+ } |
+ result.setFrameScale(frameScale(widget)); |
+ result.setFrameTranslate(frameTranslation(widget)); |
+ return result; |
} |
WebMouseWheelEvent TransformWebMouseWheelEvent( |
@@ -258,6 +198,21 @@ WebTouchEvent TransformWebTouchEvent(Widget* widget, |
WebMouseEventBuilder::WebMouseEventBuilder(const Widget* widget, |
const LayoutItem layoutItem, |
const MouseEvent& event) { |
+ if (event.nativeEvent()) { |
+ // This is the slimplified code path once we OOPIF ships |
bokan
2017/01/27 16:57:17
nit: "we OOPIF" -> "OOPIF"
I think this comment s
dtapuska
2017/01/27 21:00:00
Done.
|
+ // as that will break sending synthetic events to OOPIFs and |
+ // all events should have a native event attached. |
+ *static_cast<WebMouseEvent*>(this) = |
+ event.nativeEvent()->flattenTransform(); |
+ WebFloatPoint absoluteRootFrameLocation = |
+ event.nativeEvent()->positionInRootFrame(); |
+ IntPoint localPoint = roundedIntPoint( |
+ layoutItem.absoluteToLocal(absoluteRootFrameLocation, UseTransforms)); |
+ x = localPoint.x(); |
+ y = localPoint.y(); |
+ return; |
+ } |
+ |
if (event.type() == EventTypeNames::mousemove) |
m_type = WebInputEvent::MouseMove; |
else if (event.type() == EventTypeNames::mouseout) |
@@ -308,8 +263,6 @@ WebMouseEventBuilder::WebMouseEventBuilder(const Widget* widget, |
clickCount = event.detail(); |
pointerType = WebPointerProperties::PointerType::Mouse; |
- if (event.mouseEvent()) |
- pointerType = event.mouseEvent()->pointerProperties().pointerType; |
} |
// Generate a synthetic WebMouseEvent given a TouchEvent (eg. for emulating a |
@@ -396,13 +349,13 @@ WebKeyboardEventBuilder::WebKeyboardEventBuilder(const KeyboardEvent& event) { |
windowsKeyCode = event.keyCode(); |
} |
-Vector<PlatformMouseEvent> createPlatformMouseEventVector( |
+Vector<WebMouseEvent> TransformWebMouseEventVector( |
Widget* widget, |
const std::vector<const WebInputEvent*>& coalescedEvents) { |
- Vector<PlatformMouseEvent> result; |
+ Vector<WebMouseEvent> result; |
for (const auto& event : coalescedEvents) { |
DCHECK(WebInputEvent::isMouseEventType(event->type())); |
- result.push_back(PlatformMouseEventBuilder( |
+ result.push_back(TransformWebMouseEvent( |
widget, static_cast<const WebMouseEvent&>(*event))); |
} |
return result; |