| Index: Source/WebKit/chromium/src/WebInputEventConversion.cpp
 | 
| ===================================================================
 | 
| --- Source/WebKit/chromium/src/WebInputEventConversion.cpp	(revision 143772)
 | 
| +++ Source/WebKit/chromium/src/WebInputEventConversion.cpp	(working copy)
 | 
| @@ -54,16 +54,29 @@
 | 
|  
 | 
|  static const double millisPerSecond = 1000.0;
 | 
|  
 | 
| +static float widgetScaleFactor(const Widget* widget)
 | 
| +{
 | 
| +    if (!widget)
 | 
| +        return 1;
 | 
| +
 | 
| +    ScrollView* rootView = widget->root();
 | 
| +    if (!rootView)
 | 
| +        return 1;
 | 
| +
 | 
| +    return rootView->visibleContentScaleFactor();
 | 
| +}
 | 
| +
 | 
|  // MakePlatformMouseEvent -----------------------------------------------------
 | 
|  
 | 
|  PlatformMouseEventBuilder::PlatformMouseEventBuilder(Widget* widget, const WebMouseEvent& e)
 | 
|  {
 | 
| +    float scale = widgetScaleFactor(widget);
 | 
|      // 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->convertFromContainingWindow(IntPoint(e.x, e.y));
 | 
| +    m_position = widget->convertFromContainingWindow(IntPoint(e.x / scale, e.y / scale));
 | 
|      m_globalPosition = IntPoint(e.globalX, e.globalY);
 | 
|  #if ENABLE(POINTER_LOCK)
 | 
| -    m_movementDelta = IntPoint(e.movementX, e.movementY);
 | 
| +    m_movementDelta = IntPoint(e.movementX / scale, e.movementY / scale);
 | 
|  #endif
 | 
|      m_button = static_cast<MouseButton>(e.button);
 | 
|  
 | 
| @@ -104,7 +117,8 @@
 | 
|  
 | 
|  PlatformWheelEventBuilder::PlatformWheelEventBuilder(Widget* widget, const WebMouseWheelEvent& e)
 | 
|  {
 | 
| -    m_position = widget->convertFromContainingWindow(IntPoint(e.x, e.y));
 | 
| +    float scale = widgetScaleFactor(widget);
 | 
| +    m_position = widget->convertFromContainingWindow(IntPoint(e.x / scale, e.y / scale));
 | 
|      m_globalPosition = IntPoint(e.globalX, e.globalY);
 | 
|      m_deltaX = e.deltaX;
 | 
|      m_deltaY = e.deltaY;
 | 
| @@ -141,6 +155,7 @@
 | 
|  #if ENABLE(GESTURE_EVENTS)
 | 
|  PlatformGestureEventBuilder::PlatformGestureEventBuilder(Widget* widget, const WebGestureEvent& e)
 | 
|  {
 | 
| +    float scale = widgetScaleFactor(widget);
 | 
|      switch (e.type) {
 | 
|      case WebInputEvent::GestureScrollBegin:
 | 
|          m_type = PlatformEvent::GestureScrollBegin;
 | 
| @@ -150,23 +165,23 @@
 | 
|          break;
 | 
|      case WebInputEvent::GestureScrollUpdate:
 | 
|          m_type = PlatformEvent::GestureScrollUpdate;
 | 
| -        m_deltaX = e.data.scrollUpdate.deltaX;
 | 
| -        m_deltaY = e.data.scrollUpdate.deltaY;
 | 
| +        m_deltaX = e.data.scrollUpdate.deltaX / scale;
 | 
| +        m_deltaY = e.data.scrollUpdate.deltaY / scale;
 | 
|          break;
 | 
|      case WebInputEvent::GestureScrollUpdateWithoutPropagation:
 | 
|          m_type = PlatformEvent::GestureScrollUpdateWithoutPropagation;
 | 
| -        m_deltaX = e.data.scrollUpdate.deltaX;
 | 
| -        m_deltaY = e.data.scrollUpdate.deltaY;
 | 
| +        m_deltaX = e.data.scrollUpdate.deltaX / scale;
 | 
| +        m_deltaY = e.data.scrollUpdate.deltaY / scale;
 | 
|          break;
 | 
|      case WebInputEvent::GestureTap:
 | 
|          m_type = PlatformEvent::GestureTap;
 | 
| -        m_area = IntSize(e.data.tap.width, e.data.tap.height);
 | 
| +        m_area = expandedIntSize(FloatSize(e.data.tap.width / scale, e.data.tap.height / scale));
 | 
|          // FIXME: PlatformGestureEvent deltaX is overloaded - wkb.ug/93123
 | 
|          m_deltaX = static_cast<int>(e.data.tap.tapCount);
 | 
|          break;
 | 
|      case WebInputEvent::GestureTapDown:
 | 
|          m_type = PlatformEvent::GestureTapDown;
 | 
| -        m_area = IntSize(e.data.tapDown.width, e.data.tapDown.height);
 | 
| +        m_area = expandedIntSize(FloatSize(e.data.tapDown.width / scale, e.data.tapDown.height / scale));
 | 
|          break;
 | 
|      case WebInputEvent::GestureTapCancel:
 | 
|          m_type = PlatformEvent::GestureTapDownCancel;
 | 
| @@ -176,15 +191,15 @@
 | 
|          break;
 | 
|      case WebInputEvent::GestureTwoFingerTap:
 | 
|          m_type = PlatformEvent::GestureTwoFingerTap;
 | 
| -        m_area = IntSize(e.data.twoFingerTap.firstFingerWidth, e.data.twoFingerTap.firstFingerHeight);
 | 
| +        m_area = expandedIntSize(FloatSize(e.data.twoFingerTap.firstFingerWidth / scale, e.data.twoFingerTap.firstFingerHeight / scale));
 | 
|          break;
 | 
|      case WebInputEvent::GestureLongPress:
 | 
|          m_type = PlatformEvent::GestureLongPress;
 | 
| -        m_area = IntSize(e.data.longPress.width, e.data.longPress.height);
 | 
| +        m_area = expandedIntSize(FloatSize(e.data.longPress.width / scale, e.data.longPress.height / scale));
 | 
|          break;
 | 
|      case WebInputEvent::GestureLongTap:
 | 
|          m_type = PlatformEvent::GestureLongTap;
 | 
| -        m_area = IntSize(e.data.longPress.width, e.data.longPress.height);
 | 
| +        m_area = expandedIntSize(FloatSize(e.data.longPress.width / scale, e.data.longPress.height / scale));
 | 
|          break;
 | 
|      case WebInputEvent::GesturePinchBegin:
 | 
|          m_type = PlatformEvent::GesturePinchBegin;
 | 
| @@ -200,7 +215,7 @@
 | 
|      default:
 | 
|          ASSERT_NOT_REACHED();
 | 
|      }
 | 
| -    m_position = widget->convertFromContainingWindow(IntPoint(e.x, e.y));
 | 
| +    m_position = widget->convertFromContainingWindow(IntPoint(e.x / scale, e.y / scale));
 | 
|      m_globalPosition = IntPoint(e.globalX, e.globalY);
 | 
|      m_timestamp = e.timeStampSeconds;
 | 
|  
 | 
| @@ -362,12 +377,13 @@
 | 
|  
 | 
|  PlatformTouchPointBuilder::PlatformTouchPointBuilder(Widget* widget, const WebTouchPoint& point)
 | 
|  {
 | 
| +    float scale = widgetScaleFactor(widget);
 | 
|      m_id = point.id;
 | 
|      m_state = toPlatformTouchPointState(point.state);
 | 
| -    m_pos = widget->convertFromContainingWindow(point.position);
 | 
| +    m_pos = widget->convertFromContainingWindow(IntPoint(point.position.x / scale, point.position.y / scale));
 | 
|      m_screenPos = point.screenPosition;
 | 
| -    m_radiusY = point.radiusY;
 | 
| -    m_radiusX = point.radiusX;
 | 
| +    m_radiusY = point.radiusY / scale;
 | 
| +    m_radiusX = point.radiusX / scale;
 | 
|      m_rotationAngle = point.rotationAngle;
 | 
|      m_force = point.force;
 | 
|  }
 | 
| @@ -414,18 +430,19 @@
 | 
|  
 | 
|  static void updateWebMouseEventFromWebCoreMouseEvent(const MouseRelatedEvent& event, const Widget& widget, const WebCore::RenderObject& renderObject, WebMouseEvent& webEvent)
 | 
|  {
 | 
| +    float scale = widgetScaleFactor(&widget);
 | 
|      webEvent.timeStampSeconds = event.timeStamp() / millisPerSecond;
 | 
|      webEvent.modifiers = getWebInputModifiers(event);
 | 
|  
 | 
| -    ScrollView* view = widget.parent();
 | 
| +    ScrollView* view = widget.root();
 | 
|      IntPoint windowPoint = view->contentsToWindow(IntPoint(event.absoluteLocation().x(), event.absoluteLocation().y()));
 | 
|      webEvent.globalX = event.screenX();
 | 
|      webEvent.globalY = event.screenY();
 | 
| -    webEvent.windowX = windowPoint.x();
 | 
| -    webEvent.windowY = windowPoint.y();
 | 
| +    webEvent.windowX = windowPoint.x() * scale;
 | 
| +    webEvent.windowY = windowPoint.y() * scale;
 | 
|      IntPoint localPoint = convertAbsoluteLocationForRenderObject(event.absoluteLocation(), renderObject);
 | 
| -    webEvent.x = localPoint.x();
 | 
| -    webEvent.y = localPoint.y();
 | 
| +    webEvent.x = localPoint.x() * scale;
 | 
| +    webEvent.y = localPoint.y() * scale;
 | 
|  }
 | 
|  
 | 
|  WebMouseEventBuilder::WebMouseEventBuilder(const Widget* widget, const WebCore::RenderObject* renderObject, const MouseEvent& event)
 | 
| @@ -472,14 +489,16 @@
 | 
|          }
 | 
|      }
 | 
|  #if ENABLE(POINTER_LOCK)
 | 
| -    movementX = event.webkitMovementX();
 | 
| -    movementY = event.webkitMovementY();
 | 
| +    float scale = widgetScaleFactor(widget);
 | 
| +    movementX = event.webkitMovementX() * scale;
 | 
| +    movementY = event.webkitMovementY() * scale;
 | 
|  #endif
 | 
|      clickCount = event.detail();
 | 
|  }
 | 
|  
 | 
|  WebMouseEventBuilder::WebMouseEventBuilder(const Widget* widget, const WebCore::RenderObject* renderObject, const TouchEvent& event)
 | 
|  {
 | 
| +    float scale = widgetScaleFactor(widget);
 | 
|      if (!event.touches())
 | 
|          return;
 | 
|      if (event.touches()->length() != 1) {
 | 
| @@ -507,8 +526,8 @@
 | 
|      clickCount = (type == MouseDown || type == MouseUp);
 | 
|  
 | 
|      IntPoint localPoint = convertAbsoluteLocationForRenderObject(touch->absoluteLocation(), *renderObject);
 | 
| -    x = localPoint.x();
 | 
| -    y = localPoint.y();
 | 
| +    x = localPoint.x() * scale;
 | 
| +    y = localPoint.y() * scale;
 | 
|  }
 | 
|  
 | 
|  WebMouseWheelEventBuilder::WebMouseWheelEventBuilder(const Widget* widget, const WebCore::RenderObject* renderObject, const WheelEvent& event)
 | 
| @@ -562,8 +581,9 @@
 | 
|  
 | 
|  #if ENABLE(TOUCH_EVENTS)
 | 
|  
 | 
| -static void addTouchPoints(const AtomicString& touchType, TouchList* touches, WebTouchPoint* touchPoints, unsigned* touchPointsLength, const WebCore::RenderObject* renderObject)
 | 
| +static void addTouchPoints(const Widget* widget, const AtomicString& touchType, TouchList* touches, WebTouchPoint* touchPoints, unsigned* touchPointsLength, const WebCore::RenderObject* renderObject)
 | 
|  {
 | 
| +    float scale = widgetScaleFactor(widget);
 | 
|      unsigned numberOfTouches = std::min(touches->length(), static_cast<unsigned>(WebTouchEvent::touchesLengthCap));
 | 
|      for (unsigned i = 0; i < numberOfTouches; ++i) {
 | 
|          const Touch* touch = touches->item(i);
 | 
| @@ -572,8 +592,10 @@
 | 
|          point.id = touch->identifier();
 | 
|          point.screenPosition = WebPoint(touch->screenX(), touch->screenY());
 | 
|          point.position = convertAbsoluteLocationForRenderObject(touch->absoluteLocation(), *renderObject);
 | 
| -        point.radiusX = touch->webkitRadiusX();
 | 
| -        point.radiusY = touch->webkitRadiusY();
 | 
| +        point.position.x *= scale;
 | 
| +        point.position.y *= scale;
 | 
| +        point.radiusX = touch->webkitRadiusX() * scale;
 | 
| +        point.radiusY = touch->webkitRadiusY() * scale;
 | 
|          point.rotationAngle = touch->webkitRotationAngle();
 | 
|          point.force = touch->webkitForce();
 | 
|          point.state = toWebTouchPointState(touchType);
 | 
| @@ -602,9 +624,9 @@
 | 
|      modifiers = getWebInputModifiers(event);
 | 
|      timeStampSeconds = event.timeStamp() / millisPerSecond;
 | 
|  
 | 
| -    addTouchPoints(event.type(), event.touches(), touches, &touchesLength, renderObject);
 | 
| -    addTouchPoints(event.type(), event.changedTouches(), changedTouches, &changedTouchesLength, renderObject);
 | 
| -    addTouchPoints(event.type(), event.targetTouches(), targetTouches, &targetTouchesLength, renderObject);
 | 
| +    addTouchPoints(widget, event.type(), event.touches(), touches, &touchesLength, renderObject);
 | 
| +    addTouchPoints(widget, event.type(), event.changedTouches(), changedTouches, &changedTouchesLength, renderObject);
 | 
| +    addTouchPoints(widget, event.type(), event.targetTouches(), targetTouches, &targetTouchesLength, renderObject);
 | 
|  }
 | 
|  
 | 
|  #endif // ENABLE(TOUCH_EVENTS)
 | 
| @@ -612,6 +634,7 @@
 | 
|  #if ENABLE(GESTURE_EVENTS)
 | 
|  WebGestureEventBuilder::WebGestureEventBuilder(const Widget* widget, const WebCore::RenderObject* renderObject, const GestureEvent& event)
 | 
|  {
 | 
| +    float scale = widgetScaleFactor(widget);
 | 
|      if (event.type() == eventNames().gesturetapEvent)
 | 
|          type = GestureTap;
 | 
|      else if (event.type() == eventNames().gesturetapdownEvent)
 | 
| @@ -622,8 +645,8 @@
 | 
|          type = GestureScrollEnd;
 | 
|      else if (event.type() == eventNames().gesturescrollupdateEvent) {
 | 
|          type = GestureScrollUpdate;
 | 
| -        data.scrollUpdate.deltaX = event.deltaX();
 | 
| -        data.scrollUpdate.deltaY = event.deltaY();
 | 
| +        data.scrollUpdate.deltaX = event.deltaX() * scale;
 | 
| +        data.scrollUpdate.deltaY = event.deltaY() * scale;
 | 
|      }
 | 
|  
 | 
|      timeStampSeconds = event.timeStamp() / millisPerSecond;
 | 
| @@ -632,8 +655,8 @@
 | 
|      globalX = event.screenX();
 | 
|      globalY = event.screenY();
 | 
|      IntPoint localPoint = convertAbsoluteLocationForRenderObject(event.absoluteLocation(), *renderObject);
 | 
| -    x = localPoint.x();
 | 
| -    y = localPoint.y();
 | 
| +    x = localPoint.x() * scale;
 | 
| +    y = localPoint.y() * scale;
 | 
|  }
 | 
|  #endif // ENABLE(GESTURE_EVENTS)
 | 
|  
 | 
| 
 |