content: Populate WebPointerProperties with stylus details from ui::MouseEvent

ui::MouseEvent now holds values needed for implementing stylus support with
Pointer Events. This change populates the WebPointerProperties values with the
details from the MouseEvent's PointerDetails.

TEST=content_tests:TestMakeWebMouse[Wheel]Event
BUG=516706

Review URL: https://codereview.chromium.org/1266643002

Cr-Commit-Position: refs/heads/master@{#348375}
diff --git a/content/browser/renderer_host/web_input_event_aura.cc b/content/browser/renderer_host/web_input_event_aura.cc
index bbad8c77..fe4dfb7 100644
--- a/content/browser/renderer_host/web_input_event_aura.cc
+++ b/content/browser/renderer_host/web_input_event_aura.cc
@@ -48,6 +48,22 @@
   return static_cast<blink::WebInputEvent::Modifiers>(0);
 }
 
+blink::WebPointerProperties::PointerType EventPointerTypeToWebPointerType(
+    ui::EventPointerType pointer_type) {
+  switch (pointer_type) {
+    case ui::EventPointerType::POINTER_TYPE_UNKNOWN:
+      return blink::WebPointerProperties::PointerType::PointerTypeUnknown;
+    case ui::EventPointerType::POINTER_TYPE_MOUSE:
+      return blink::WebPointerProperties::PointerType::PointerTypeMouse;
+    case ui::EventPointerType::POINTER_TYPE_PEN:
+      return blink::WebPointerProperties::PointerType::PointerTypePen;
+    case ui::EventPointerType::POINTER_TYPE_TOUCH:
+      return blink::WebPointerProperties::PointerType::PointerTypeTouch;
+  }
+  NOTREACHED() << "Unexpected EventPointerType";
+  return blink::WebPointerProperties::PointerType::PointerTypeUnknown;
+}
+
 }  // namespace
 
 #if defined(OS_WIN)
@@ -379,6 +395,12 @@
       break;
   }
 
+  webkit_event.tiltX = roundf(event.pointer_details().tilt_x());
+  webkit_event.tiltY = roundf(event.pointer_details().tilt_y());
+  webkit_event.force = event.pointer_details().force();
+  webkit_event.pointerType =
+      EventPointerTypeToWebPointerType(event.pointer_details().pointer_type());
+
   return webkit_event;
 }
 
@@ -402,6 +424,12 @@
   webkit_event.wheelTicksX = webkit_event.deltaX / kPixelsPerTick;
   webkit_event.wheelTicksY = webkit_event.deltaY / kPixelsPerTick;
 
+  webkit_event.tiltX = roundf(event.pointer_details().tilt_x());
+  webkit_event.tiltY = roundf(event.pointer_details().tilt_y());
+  webkit_event.force = event.pointer_details().force();
+  webkit_event.pointerType =
+      EventPointerTypeToWebPointerType(event.pointer_details().pointer_type());
+
   return webkit_event;
 }
 
diff --git a/content/browser/renderer_host/web_input_event_aura_unittest.cc b/content/browser/renderer_host/web_input_event_aura_unittest.cc
index 12e178d..6fcb3f0 100644
--- a/content/browser/renderer_host/web_input_event_aura_unittest.cc
+++ b/content/browser/renderer_host/web_input_event_aura_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/basictypes.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/blink/blink_event_util.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/keycodes/dom/dom_code.h"
@@ -246,4 +247,270 @@
 #endif
 }
 
+TEST(WebInputEventAuraTest, TestMakeWebMouseEvent) {
+  {
+    // Left pressed.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_PRESSED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp,
+                              ui::EF_LEFT_MOUSE_BUTTON,
+                              ui::EF_LEFT_MOUSE_BUTTON);
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonLeft, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseDown, webkit_event.type);
+    EXPECT_EQ(aura_event.GetClickCount(), webkit_event.clickCount);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Left released.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_RELEASED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp, 0,
+                              ui::EF_LEFT_MOUSE_BUTTON);
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonLeft, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseUp, webkit_event.type);
+    EXPECT_EQ(aura_event.GetClickCount(), webkit_event.clickCount);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Middle pressed.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_PRESSED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp,
+                              ui::EF_MIDDLE_MOUSE_BUTTON,
+                              ui::EF_MIDDLE_MOUSE_BUTTON);
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonMiddle, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseDown, webkit_event.type);
+    EXPECT_EQ(aura_event.GetClickCount(), webkit_event.clickCount);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Middle released.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_RELEASED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp, 0,
+                              ui::EF_MIDDLE_MOUSE_BUTTON);
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonMiddle, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseUp, webkit_event.type);
+    EXPECT_EQ(aura_event.GetClickCount(), webkit_event.clickCount);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Right pressed.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_PRESSED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp,
+                              ui::EF_RIGHT_MOUSE_BUTTON,
+                              ui::EF_RIGHT_MOUSE_BUTTON);
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonRight, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseDown, webkit_event.type);
+    EXPECT_EQ(aura_event.GetClickCount(), webkit_event.clickCount);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Right released.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_RELEASED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp, 0,
+                              ui::EF_RIGHT_MOUSE_BUTTON);
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonRight, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseUp, webkit_event.type);
+    EXPECT_EQ(aura_event.GetClickCount(), webkit_event.clickCount);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Moved
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_MOVED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp, 0, 0);
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonNone, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseMove, webkit_event.type);
+    EXPECT_EQ(aura_event.GetClickCount(), webkit_event.clickCount);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Moved with left down
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_MOVED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp,
+                              ui::EF_LEFT_MOUSE_BUTTON, 0);
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonLeft, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseMove, webkit_event.type);
+    EXPECT_EQ(aura_event.GetClickCount(), webkit_event.clickCount);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Left with shift pressed.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_PRESSED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp,
+                              ui::EF_LEFT_MOUSE_BUTTON | ui::EF_SHIFT_DOWN,
+                              ui::EF_LEFT_MOUSE_BUTTON);
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonLeft, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseDown, webkit_event.type);
+    EXPECT_EQ(aura_event.GetClickCount(), webkit_event.clickCount);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Default values for PointerDetails.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_PRESSED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp,
+                              ui::EF_LEFT_MOUSE_BUTTON,
+                              ui::EF_LEFT_MOUSE_BUTTON);
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+
+    EXPECT_EQ(blink::WebPointerProperties::PointerType::PointerTypeMouse,
+              webkit_event.pointerType);
+    EXPECT_EQ(0, webkit_event.tiltX);
+    EXPECT_EQ(0, webkit_event.tiltY);
+    EXPECT_FLOAT_EQ(0.0f, webkit_event.force);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Stylus values for PointerDetails.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseEvent aura_event(ui::ET_MOUSE_PRESSED, gfx::PointF(123.0, 321.0),
+                              gfx::PointF(123.0, 321.0), timestamp,
+                              ui::EF_LEFT_MOUSE_BUTTON,
+                              ui::EF_LEFT_MOUSE_BUTTON);
+    aura_event.set_pointer_details(
+        ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_PEN,
+                           /* radius_x */ 0.0f,
+                           /* radius_y */ 0.0f,
+                           /* force */ 0.8f,
+                           /* tilt_x */ 89.5f,
+                           /* tilt_y */ -89.5f));
+    blink::WebMouseEvent webkit_event = MakeWebMouseEvent(aura_event);
+
+    EXPECT_EQ(blink::WebPointerProperties::PointerType::PointerTypePen,
+              webkit_event.pointerType);
+    EXPECT_EQ(90, webkit_event.tiltX);
+    EXPECT_EQ(-90, webkit_event.tiltY);
+    EXPECT_FLOAT_EQ(0.8f, webkit_event.force);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+}
+
+TEST(WebInputEventAuraTest, TestMakeWebMouseWheelEvent) {
+  {
+    // Mouse wheel.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseWheelEvent aura_event(
+        gfx::Vector2d(ui::MouseWheelEvent::kWheelDelta * 2,
+                      -ui::MouseWheelEvent::kWheelDelta * 2),
+        gfx::PointF(123.0, 321.0), gfx::PointF(123.0, 321.0), timestamp, 0, 0);
+    blink::WebMouseWheelEvent webkit_event = MakeWebMouseWheelEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonNone, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseWheel, webkit_event.type);
+    EXPECT_FLOAT_EQ(aura_event.x_offset() / 53.0f, webkit_event.wheelTicksX);
+    EXPECT_FLOAT_EQ(aura_event.y_offset() / 53.0f, webkit_event.wheelTicksY);
+    EXPECT_EQ(blink::WebPointerProperties::PointerType::PointerTypeMouse,
+              webkit_event.pointerType);
+    EXPECT_EQ(0, webkit_event.tiltX);
+    EXPECT_EQ(0, webkit_event.tiltY);
+    EXPECT_FLOAT_EQ(0.0f, webkit_event.force);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+  {
+    // Mouse wheel with shift and no x offset.
+    base::TimeDelta timestamp = ui::EventTimeForNow();
+    ui::MouseWheelEvent aura_event(
+        gfx::Vector2d(0, -ui::MouseWheelEvent::kWheelDelta * 2),
+        gfx::PointF(123.0, 321.0), gfx::PointF(123.0, 321.0), timestamp,
+        ui::EF_SHIFT_DOWN, 0);
+    blink::WebMouseWheelEvent webkit_event = MakeWebMouseWheelEvent(aura_event);
+    EXPECT_EQ(ui::EventFlagsToWebEventModifiers(aura_event.flags()),
+              webkit_event.modifiers);
+    EXPECT_FLOAT_EQ(timestamp.InSecondsF(), webkit_event.timeStampSeconds);
+    EXPECT_EQ(blink::WebMouseEvent::ButtonNone, webkit_event.button);
+    EXPECT_EQ(blink::WebInputEvent::MouseWheel, webkit_event.type);
+    EXPECT_FLOAT_EQ(aura_event.y_offset() / 53.0f, webkit_event.wheelTicksX);
+    EXPECT_FLOAT_EQ(0, webkit_event.wheelTicksY);
+    EXPECT_EQ(blink::WebPointerProperties::PointerType::PointerTypeMouse,
+              webkit_event.pointerType);
+    EXPECT_EQ(0, webkit_event.tiltX);
+    EXPECT_EQ(0, webkit_event.tiltY);
+    EXPECT_FLOAT_EQ(0.0f, webkit_event.force);
+    EXPECT_EQ(123, webkit_event.x);
+    EXPECT_EQ(123, webkit_event.windowX);
+    EXPECT_EQ(321, webkit_event.y);
+    EXPECT_EQ(321, webkit_event.windowY);
+  }
+}
+
 }  // namespace content