summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsky <sky@chromium.org>2015-03-27 08:42:44 -0700
committerCommit bot <commit-bot@chromium.org>2015-03-27 15:43:19 +0000
commit83e08f5e90e017aa7dd9daa60cce84a242e631c8 (patch)
treee6a1e338e97ca0489beccec2a7320c354e9947c9
parent56915573d8e4be522d4bd8aea1bf8ba76a3c8f77 (diff)
downloadchromium_src-83e08f5e90e017aa7dd9daa60cce84a242e631c8.zip
chromium_src-83e08f5e90e017aa7dd9daa60cce84a242e631c8.tar.gz
chromium_src-83e08f5e90e017aa7dd9daa60cce84a242e631c8.tar.bz2
Refactors gesture conversion functions to ui/events/blink
We want to use this from html_viewer, which can't depend on content. BUG=none TEST=none R=jam@chromium.org, sadrul@chromium.org, jochen@chromium.org Review URL: https://codereview.chromium.org/1034713004 Cr-Commit-Position: refs/heads/master@{#322582}
-rw-r--r--content/browser/BUILD.gn1
-rw-r--r--content/browser/renderer_host/input/touch_emulator.cc3
-rw-r--r--content/browser/renderer_host/input/web_input_event_util.cc277
-rw-r--r--content/browser/renderer_host/input/web_input_event_util.h16
-rw-r--r--content/browser/renderer_host/input/web_input_event_util_unittest.cc6
-rw-r--r--content/browser/renderer_host/render_widget_host_view_android.cc5
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura.cc3
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura_unittest.cc3
-rw-r--r--content/browser/renderer_host/ui_events_helper.cc9
-rw-r--r--content/browser/renderer_host/web_input_event_aura.cc11
-rw-r--r--content/content_browser.gypi1
-rw-r--r--content/content_tests.gypi1
-rw-r--r--content/test/BUILD.gn2
-rw-r--r--ui/events/blink/BUILD.gn17
-rw-r--r--ui/events/blink/DEPS3
-rw-r--r--ui/events/blink/blink_event_util.cc303
-rw-r--r--ui/events/blink/blink_event_util.h44
-rw-r--r--ui/events/events.gyp16
18 files changed, 411 insertions, 310 deletions
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 577ed6d..611bd6c 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -116,6 +116,7 @@ source_set("browser") {
"//third_party/mojo/src/mojo/public/cpp/bindings",
"//third_party/mojo/src/mojo/public/interfaces/application",
"//third_party/mojo/src/mojo/public/js",
+ "//ui/events/blink",
"//ui/resources",
"//ui/surface",
"//ui/touch_selection",
diff --git a/content/browser/renderer_host/input/touch_emulator.cc b/content/browser/renderer_host/input/touch_emulator.cc
index ec6057b..ed9134b 100644
--- a/content/browser/renderer_host/input/touch_emulator.cc
+++ b/content/browser/renderer_host/input/touch_emulator.cc
@@ -11,6 +11,7 @@
#include "content/public/common/content_client.h"
#include "content/public/common/content_switches.h"
#include "third_party/WebKit/public/platform/WebCursorInfo.h"
+#include "ui/events/blink/blink_event_util.h"
#include "ui/events/gesture_detection/gesture_provider_config_helper.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/screen.h"
@@ -271,7 +272,7 @@ bool TouchEmulator::HandleTouchEventAck(
void TouchEmulator::OnGestureEvent(const ui::GestureEventData& gesture) {
WebGestureEvent gesture_event =
- CreateWebGestureEventFromGestureEventData(gesture);
+ ui::CreateWebGestureEventFromGestureEventData(gesture);
switch (gesture_event.type) {
case WebInputEvent::Undefined:
diff --git a/content/browser/renderer_host/input/web_input_event_util.cc b/content/browser/renderer_host/input/web_input_event_util.cc
index 150d83e..5de6ed4 100644
--- a/content/browser/renderer_host/input/web_input_event_util.cc
+++ b/content/browser/renderer_host/input/web_input_event_util.cc
@@ -11,6 +11,7 @@
#include "base/strings/string_util.h"
#include "content/common/input/web_touch_event_traits.h"
+#include "ui/events/blink/blink_event_util.h"
#include "ui/events/event_constants.h"
#include "ui/events/gesture_detection/gesture_event_data.h"
#include "ui/events/gesture_detection/motion_event.h"
@@ -140,106 +141,6 @@ const char* GetKeyIdentifier(ui::KeyboardCode key_code) {
};
}
-WebInputEvent::Type ToWebInputEventType(MotionEvent::Action action) {
- switch (action) {
- case MotionEvent::ACTION_DOWN:
- return WebInputEvent::TouchStart;
- case MotionEvent::ACTION_MOVE:
- return WebInputEvent::TouchMove;
- case MotionEvent::ACTION_UP:
- return WebInputEvent::TouchEnd;
- case MotionEvent::ACTION_CANCEL:
- return WebInputEvent::TouchCancel;
- case MotionEvent::ACTION_POINTER_DOWN:
- return WebInputEvent::TouchStart;
- case MotionEvent::ACTION_POINTER_UP:
- return WebInputEvent::TouchEnd;
- }
- NOTREACHED() << "Invalid MotionEvent::Action.";
- return WebInputEvent::Undefined;
-}
-
-// Note that |is_action_pointer| is meaningful only in the context of
-// |ACTION_POINTER_UP| and |ACTION_POINTER_DOWN|; other actions map directly to
-// WebTouchPoint::State.
-WebTouchPoint::State ToWebTouchPointState(const MotionEvent& event,
- size_t pointer_index) {
- switch (event.GetAction()) {
- case MotionEvent::ACTION_DOWN:
- return WebTouchPoint::StatePressed;
- case MotionEvent::ACTION_MOVE:
- return WebTouchPoint::StateMoved;
- case MotionEvent::ACTION_UP:
- return WebTouchPoint::StateReleased;
- case MotionEvent::ACTION_CANCEL:
- return WebTouchPoint::StateCancelled;
- case MotionEvent::ACTION_POINTER_DOWN:
- return static_cast<int>(pointer_index) == event.GetActionIndex()
- ? WebTouchPoint::StatePressed
- : WebTouchPoint::StateStationary;
- case MotionEvent::ACTION_POINTER_UP:
- return static_cast<int>(pointer_index) == event.GetActionIndex()
- ? WebTouchPoint::StateReleased
- : WebTouchPoint::StateStationary;
- }
- NOTREACHED() << "Invalid MotionEvent::Action.";
- return WebTouchPoint::StateUndefined;
-}
-
-WebTouchPoint CreateWebTouchPoint(const MotionEvent& event,
- size_t pointer_index) {
- WebTouchPoint touch;
- touch.id = event.GetPointerId(pointer_index);
- touch.state = ToWebTouchPointState(event, pointer_index);
- touch.position.x = event.GetX(pointer_index);
- touch.position.y = event.GetY(pointer_index);
- touch.screenPosition.x = event.GetRawX(pointer_index);
- touch.screenPosition.y = event.GetRawY(pointer_index);
-
- // A note on touch ellipse specifications:
- //
- // Android MotionEvent provides the major and minor axes of the touch ellipse,
- // as well as the orientation of the major axis clockwise from vertical, in
- // radians. See:
- // http://developer.android.com/reference/android/view/MotionEvent.html
- //
- // The proposed extension to W3C Touch Events specifies the touch ellipse
- // using two radii along x- & y-axes and a positive acute rotation angle in
- // degrees. See:
- // http://dvcs.w3.org/hg/webevents/raw-file/default/touchevents.html
-
- float major_radius = event.GetTouchMajor(pointer_index) / 2.f;
- float minor_radius = event.GetTouchMinor(pointer_index) / 2.f;
-
- DCHECK_LE(minor_radius, major_radius);
- DCHECK_IMPLIES(major_radius, minor_radius);
-
- float orientation_deg = event.GetOrientation(pointer_index) * 180.f / M_PI;
- DCHECK_GE(major_radius, 0);
- DCHECK_GE(minor_radius, 0);
- DCHECK_GE(major_radius, minor_radius);
- // Allow a small bound tolerance to account for floating point conversion.
- DCHECK_GT(orientation_deg, -90.01f);
- DCHECK_LT(orientation_deg, 90.01f);
- if (orientation_deg >= 0) {
- // The case orientation_deg == 0 is handled here on purpose: although the
- // 'else' block is equivalent in this case, we want to pass the 0 value
- // unchanged (and 0 is the default value for many devices that don't
- // report elliptical touches).
- touch.radiusX = minor_radius;
- touch.radiusY = major_radius;
- touch.rotationAngle = orientation_deg;
- } else {
- touch.radiusX = major_radius;
- touch.radiusY = minor_radius;
- touch.rotationAngle = orientation_deg + 90;
- }
-
- touch.force = event.GetPressure(pointer_index);
-
- return touch;
-}
-
} // namespace
namespace content {
@@ -259,182 +160,6 @@ void UpdateWindowsKeyCodeAndKeyIdentifier(blink::WebKeyboardEvent* event,
}
}
-blink::WebTouchEvent CreateWebTouchEventFromMotionEvent(
- const ui::MotionEvent& event,
- bool may_cause_scrolling) {
- static_assert(static_cast<int>(MotionEvent::MAX_TOUCH_POINT_COUNT) ==
- static_cast<int>(blink::WebTouchEvent::touchesLengthCap),
- "inconsistent maximum number of active touch points");
-
- blink::WebTouchEvent result;
-
- WebTouchEventTraits::ResetType(
- ToWebInputEventType(event.GetAction()),
- (event.GetEventTime() - base::TimeTicks()).InSecondsF(),
- &result);
- result.causesScrollingIfUncanceled = may_cause_scrolling;
-
- result.modifiers = EventFlagsToWebEventModifiers(event.GetFlags());
- result.touchesLength =
- std::min(event.GetPointerCount(),
- static_cast<size_t>(WebTouchEvent::touchesLengthCap));
- DCHECK_GT(result.touchesLength, 0U);
-
- for (size_t i = 0; i < result.touchesLength; ++i)
- result.touches[i] = CreateWebTouchPoint(event, i);
-
- return result;
-}
-
-WebGestureEvent CreateWebGestureEvent(const ui::GestureEventDetails& details,
- base::TimeDelta timestamp,
- const gfx::PointF& location,
- const gfx::PointF& raw_location,
- int flags) {
- WebGestureEvent gesture;
- gesture.timeStampSeconds = timestamp.InSecondsF();
- gesture.x = gfx::ToFlooredInt(location.x());
- gesture.y = gfx::ToFlooredInt(location.y());
- gesture.globalX = gfx::ToFlooredInt(raw_location.x());
- gesture.globalY = gfx::ToFlooredInt(raw_location.y());
- gesture.modifiers = EventFlagsToWebEventModifiers(flags);
- gesture.sourceDevice = blink::WebGestureDeviceTouchscreen;
-
- switch (details.type()) {
- case ui::ET_GESTURE_SHOW_PRESS:
- gesture.type = WebInputEvent::GestureShowPress;
- gesture.data.showPress.width = details.bounding_box_f().width();
- gesture.data.showPress.height = details.bounding_box_f().height();
- break;
- case ui::ET_GESTURE_DOUBLE_TAP:
- gesture.type = WebInputEvent::GestureDoubleTap;
- DCHECK_EQ(1, details.tap_count());
- gesture.data.tap.tapCount = details.tap_count();
- gesture.data.tap.width = details.bounding_box_f().width();
- gesture.data.tap.height = details.bounding_box_f().height();
- break;
- case ui::ET_GESTURE_TAP:
- gesture.type = WebInputEvent::GestureTap;
- DCHECK_GE(details.tap_count(), 1);
- gesture.data.tap.tapCount = details.tap_count();
- gesture.data.tap.width = details.bounding_box_f().width();
- gesture.data.tap.height = details.bounding_box_f().height();
- break;
- case ui::ET_GESTURE_TAP_UNCONFIRMED:
- gesture.type = WebInputEvent::GestureTapUnconfirmed;
- DCHECK_EQ(1, details.tap_count());
- gesture.data.tap.tapCount = details.tap_count();
- gesture.data.tap.width = details.bounding_box_f().width();
- gesture.data.tap.height = details.bounding_box_f().height();
- break;
- case ui::ET_GESTURE_LONG_PRESS:
- gesture.type = WebInputEvent::GestureLongPress;
- gesture.data.longPress.width = details.bounding_box_f().width();
- gesture.data.longPress.height = details.bounding_box_f().height();
- break;
- case ui::ET_GESTURE_LONG_TAP:
- gesture.type = WebInputEvent::GestureLongTap;
- gesture.data.longPress.width = details.bounding_box_f().width();
- gesture.data.longPress.height = details.bounding_box_f().height();
- break;
- case ui::ET_GESTURE_TWO_FINGER_TAP:
- gesture.type = blink::WebInputEvent::GestureTwoFingerTap;
- gesture.data.twoFingerTap.firstFingerWidth = details.first_finger_width();
- gesture.data.twoFingerTap.firstFingerHeight =
- details.first_finger_height();
- break;
- case ui::ET_GESTURE_SCROLL_BEGIN:
- gesture.type = WebInputEvent::GestureScrollBegin;
- gesture.data.scrollBegin.deltaXHint = details.scroll_x_hint();
- gesture.data.scrollBegin.deltaYHint = details.scroll_y_hint();
- break;
- case ui::ET_GESTURE_SCROLL_UPDATE:
- gesture.type = WebInputEvent::GestureScrollUpdate;
- gesture.data.scrollUpdate.deltaX = details.scroll_x();
- gesture.data.scrollUpdate.deltaY = details.scroll_y();
- gesture.data.scrollUpdate.previousUpdateInSequencePrevented =
- details.previous_scroll_update_in_sequence_prevented();
- break;
- case ui::ET_GESTURE_SCROLL_END:
- gesture.type = WebInputEvent::GestureScrollEnd;
- break;
- case ui::ET_SCROLL_FLING_START:
- gesture.type = WebInputEvent::GestureFlingStart;
- gesture.data.flingStart.velocityX = details.velocity_x();
- gesture.data.flingStart.velocityY = details.velocity_y();
- break;
- case ui::ET_SCROLL_FLING_CANCEL:
- gesture.type = WebInputEvent::GestureFlingCancel;
- break;
- case ui::ET_GESTURE_PINCH_BEGIN:
- gesture.type = WebInputEvent::GesturePinchBegin;
- break;
- case ui::ET_GESTURE_PINCH_UPDATE:
- gesture.type = WebInputEvent::GesturePinchUpdate;
- gesture.data.pinchUpdate.scale = details.scale();
- break;
- case ui::ET_GESTURE_PINCH_END:
- gesture.type = WebInputEvent::GesturePinchEnd;
- break;
- case ui::ET_GESTURE_TAP_CANCEL:
- gesture.type = WebInputEvent::GestureTapCancel;
- break;
- case ui::ET_GESTURE_TAP_DOWN:
- gesture.type = WebInputEvent::GestureTapDown;
- gesture.data.tapDown.width = details.bounding_box_f().width();
- gesture.data.tapDown.height = details.bounding_box_f().height();
- break;
- case ui::ET_GESTURE_BEGIN:
- case ui::ET_GESTURE_END:
- case ui::ET_GESTURE_SWIPE:
- // The caller is responsible for discarding these gestures appropriately.
- gesture.type = WebInputEvent::Undefined;
- break;
- default:
- NOTREACHED() << "ui::EventType provided wasn't a valid gesture event: "
- << details.type();
- }
-
- return gesture;
-}
-
-WebGestureEvent CreateWebGestureEventFromGestureEventData(
- const ui::GestureEventData& data) {
- return CreateWebGestureEvent(data.details,
- data.time - base::TimeTicks(),
- gfx::PointF(data.x, data.y),
- gfx::PointF(data.raw_x, data.raw_y),
- data.flags);
-}
-
-int EventFlagsToWebEventModifiers(int flags) {
- int modifiers = 0;
-
- if (flags & ui::EF_SHIFT_DOWN)
- modifiers |= blink::WebInputEvent::ShiftKey;
- if (flags & ui::EF_CONTROL_DOWN)
- modifiers |= blink::WebInputEvent::ControlKey;
- if (flags & ui::EF_ALT_DOWN)
- modifiers |= blink::WebInputEvent::AltKey;
- if (flags & ui::EF_COMMAND_DOWN)
- modifiers |= blink::WebInputEvent::MetaKey;
-
- if (flags & ui::EF_LEFT_MOUSE_BUTTON)
- modifiers |= blink::WebInputEvent::LeftButtonDown;
- if (flags & ui::EF_MIDDLE_MOUSE_BUTTON)
- modifiers |= blink::WebInputEvent::MiddleButtonDown;
- if (flags & ui::EF_RIGHT_MOUSE_BUTTON)
- modifiers |= blink::WebInputEvent::RightButtonDown;
- if (flags & ui::EF_CAPS_LOCK_DOWN)
- modifiers |= blink::WebInputEvent::CapsLockOn;
- if (flags & ui::EF_IS_REPEAT)
- modifiers |= blink::WebInputEvent::IsAutoRepeat;
- if (flags & ui::EF_NUMPAD_KEY)
- modifiers |= blink::WebInputEvent::IsKeyPad;
-
- return modifiers;
-}
-
int WebEventModifiersToEventFlags(int modifiers) {
int flags = 0;
diff --git a/content/browser/renderer_host/input/web_input_event_util.h b/content/browser/renderer_host/input/web_input_event_util.h
index a2aaca9..c4b1a8c 100644
--- a/content/browser/renderer_host/input/web_input_event_util.h
+++ b/content/browser/renderer_host/input/web_input_event_util.h
@@ -24,22 +24,6 @@ CONTENT_EXPORT void UpdateWindowsKeyCodeAndKeyIdentifier(
blink::WebKeyboardEvent* event,
ui::KeyboardCode windows_key_code);
-CONTENT_EXPORT blink::WebTouchEvent CreateWebTouchEventFromMotionEvent(
- const ui::MotionEvent& event, bool may_cause_scrolling);
-
-CONTENT_EXPORT blink::WebGestureEvent CreateWebGestureEvent(
- const ui::GestureEventDetails& details,
- base::TimeDelta timestamp,
- const gfx::PointF& location,
- const gfx::PointF& raw_location,
- int flags);
-
-// Convenience wrapper for |CreateWebGestureEvent| using the supplied |data|.
-CONTENT_EXPORT blink::WebGestureEvent
-CreateWebGestureEventFromGestureEventData(const ui::GestureEventData& data);
-
-int EventFlagsToWebEventModifiers(int flags);
-
int WebEventModifiersToEventFlags(int modifiers);
} // namespace content
diff --git a/content/browser/renderer_host/input/web_input_event_util_unittest.cc b/content/browser/renderer_host/input/web_input_event_util_unittest.cc
index 2587863..0ea59b1 100644
--- a/content/browser/renderer_host/input/web_input_event_util_unittest.cc
+++ b/content/browser/renderer_host/input/web_input_event_util_unittest.cc
@@ -12,6 +12,7 @@
#include "content/browser/renderer_host/input/web_input_event_util.h"
#include "content/common/input/web_input_event_traits.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/blink/blink_event_util.h"
#include "ui/events/event_constants.h"
#include "ui/events/gesture_detection/gesture_event_data.h"
#include "ui/events/gesture_detection/motion_event_generic.h"
@@ -56,7 +57,8 @@ TEST(WebInputEventUtilTest, MotionEventConversion) {
expected_pointer.force = pointer.pressure;
expected_event.touches[0] = expected_pointer;
- WebTouchEvent actual_event = CreateWebTouchEventFromMotionEvent(event, false);
+ WebTouchEvent actual_event =
+ ui::CreateWebTouchEventFromMotionEvent(event, false);
EXPECT_EQ(WebInputEventTraits::ToString(expected_event),
WebInputEventTraits::ToString(actual_event));
}
@@ -88,7 +90,7 @@ TEST(WebInputEventUtilTest, ScrollUpdateConversion) {
flags);
blink::WebGestureEvent web_event =
- CreateWebGestureEventFromGestureEventData(event);
+ ui::CreateWebGestureEventFromGestureEventData(event);
EXPECT_EQ(WebInputEvent::GestureScrollUpdate, web_event.type);
EXPECT_EQ(0, web_event.modifiers);
EXPECT_EQ((timestamp - base::TimeTicks()).InSecondsF(),
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index b62b269..76affb9 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -77,6 +77,7 @@
#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/android/window_android.h"
#include "ui/android/window_android_compositor.h"
+#include "ui/events/blink/blink_event_util.h"
#include "ui/events/gesture_detection/gesture_provider_config_helper.h"
#include "ui/events/gesture_detection/motion_event.h"
#include "ui/gfx/android/device_display_info.h"
@@ -818,7 +819,7 @@ bool RenderWidgetHostViewAndroid::OnTouchEvent(
return false;
blink::WebTouchEvent web_event =
- CreateWebTouchEventFromMotionEvent(event, result.did_generate_scroll);
+ ui::CreateWebTouchEventFromMotionEvent(event, result.did_generate_scroll);
host_->ForwardTouchEventWithLatencyInfo(web_event,
CreateLatencyInfo(web_event));
@@ -1878,7 +1879,7 @@ void RenderWidgetHostViewAndroid::RunAckCallbacks(
void RenderWidgetHostViewAndroid::OnGestureEvent(
const ui::GestureEventData& gesture) {
blink::WebGestureEvent web_gesture =
- CreateWebGestureEventFromGestureEventData(gesture);
+ ui::CreateWebGestureEventFromGestureEventData(gesture);
// TODO(jdduke): Remove this workaround after Android fixes UiAutomator to
// stop providing shift meta values to synthetic MotionEvents. This prevents
// unintended shift+click interpretation of all accessibility clicks.
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 55a92d0..839f62a 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -66,6 +66,7 @@
#include "ui/base/ui_base_types.h"
#include "ui/compositor/compositor_vsync_manager.h"
#include "ui/compositor/dip_util.h"
+#include "ui/events/blink/blink_event_util.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
#include "ui/events/gestures/gesture_recognizer.h"
@@ -2103,7 +2104,7 @@ void RenderWidgetHostViewAura::OnTouchEvent(ui::TouchEvent* event) {
return;
}
- blink::WebTouchEvent touch_event = CreateWebTouchEventFromMotionEvent(
+ blink::WebTouchEvent touch_event = ui::CreateWebTouchEventFromMotionEvent(
pointer_state_, event->may_cause_scrolling());
pointer_state_.CleanupRemovedTouchPoints(*event);
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index 02045bd..6f843c4 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -54,6 +54,7 @@
#include "ui/compositor/compositor.h"
#include "ui/compositor/layer_tree_owner.h"
#include "ui/compositor/test/draw_waiter_for_test.h"
+#include "ui/events/blink/blink_event_util.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
#include "ui/events/gesture_detection/gesture_configuration.h"
@@ -299,7 +300,7 @@ class FakeRenderWidgetHostViewAura : public RenderWidgetHostViewAura {
RenderWidgetHostViewAura::OnTouchEvent(event);
if (pointer_state().GetPointerCount() > 0) {
touch_event_.reset(
- new blink::WebTouchEvent(CreateWebTouchEventFromMotionEvent(
+ new blink::WebTouchEvent(ui::CreateWebTouchEventFromMotionEvent(
pointer_state(), event->may_cause_scrolling())));
} else {
// Never create a WebTouchEvent with 0 touch points.
diff --git a/content/browser/renderer_host/ui_events_helper.cc b/content/browser/renderer_host/ui_events_helper.cc
index 9bca63d..7aa038e 100644
--- a/content/browser/renderer_host/ui_events_helper.cc
+++ b/content/browser/renderer_host/ui_events_helper.cc
@@ -7,6 +7,7 @@
#include "content/browser/renderer_host/input/web_input_event_util.h"
#include "content/common/input/web_touch_event_traits.h"
#include "third_party/WebKit/public/web/WebInputEvent.h"
+#include "ui/events/blink/blink_event_util.h"
#include "ui/events/event.h"
#include "ui/events/event_constants.h"
@@ -90,11 +91,9 @@ bool MakeUITouchEventsFromWebTouchEvents(
blink::WebGestureEvent MakeWebGestureEventFromUIEvent(
const ui::GestureEvent& event) {
- return CreateWebGestureEvent(event.details(),
- event.time_stamp(),
- event.location_f(),
- event.root_location_f(),
- event.flags());
+ return ui::CreateWebGestureEvent(event.details(), event.time_stamp(),
+ event.location_f(), event.root_location_f(),
+ event.flags());
}
} // namespace content
diff --git a/content/browser/renderer_host/web_input_event_aura.cc b/content/browser/renderer_host/web_input_event_aura.cc
index 5986a4d..ce015d6 100644
--- a/content/browser/renderer_host/web_input_event_aura.cc
+++ b/content/browser/renderer_host/web_input_event_aura.cc
@@ -8,6 +8,7 @@
#include "content/browser/renderer_host/ui_events_helper.h"
#include "ui/aura/client/screen_position_client.h"
#include "ui/aura/window.h"
+#include "ui/events/blink/blink_event_util.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
#include "ui/events/keycodes/dom4/keycode_converter.h"
@@ -50,7 +51,7 @@ blink::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent(
blink::WebKeyboardEvent webkit_event;
webkit_event.timeStampSeconds = event.time_stamp().InSecondsF();
- webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags());
+ webkit_event.modifiers = ui::EventFlagsToWebEventModifiers(event.flags());
switch (event.type()) {
case ui::ET_KEY_PRESSED:
@@ -85,7 +86,7 @@ blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent(
webkit_event.type = blink::WebInputEvent::MouseWheel;
webkit_event.button = blink::WebMouseEvent::ButtonNone;
- webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags());
+ webkit_event.modifiers = ui::EventFlagsToWebEventModifiers(event.flags());
webkit_event.timeStampSeconds = event.time_stamp().InSecondsF();
webkit_event.hasPreciseScrollingDeltas = true;
@@ -133,7 +134,7 @@ blink::WebGestureEvent MakeWebGestureEventFromAuraEvent(
}
webkit_event.sourceDevice = blink::WebGestureDeviceTouchpad;
- webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags());
+ webkit_event.modifiers = ui::EventFlagsToWebEventModifiers(event.flags());
webkit_event.timeStampSeconds = event.time_stamp().InSecondsF();
return webkit_event;
}
@@ -318,7 +319,7 @@ blink::WebMouseEvent MakeWebMouseEventFromAuraEvent(
const ui::MouseEvent& event) {
blink::WebMouseEvent webkit_event;
- webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags());
+ webkit_event.modifiers = ui::EventFlagsToWebEventModifiers(event.flags());
webkit_event.timeStampSeconds = event.time_stamp().InSecondsF();
webkit_event.button = blink::WebMouseEvent::ButtonNone;
@@ -367,7 +368,7 @@ blink::WebMouseWheelEvent MakeWebMouseWheelEventFromAuraEvent(
webkit_event.type = blink::WebInputEvent::MouseWheel;
webkit_event.button = blink::WebMouseEvent::ButtonNone;
- webkit_event.modifiers = EventFlagsToWebEventModifiers(event.flags());
+ webkit_event.modifiers = ui::EventFlagsToWebEventModifiers(event.flags());
webkit_event.timeStampSeconds = event.time_stamp().InSecondsF();
if ((event.flags() & ui::EF_SHIFT_DOWN) != 0 && event.x_offset() == 0) {
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index acab46b..9e81a04 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -22,6 +22,7 @@
'../ui/accessibility/accessibility.gyp:ax_gen',
'../ui/base/ui_base.gyp:ui_base',
'../ui/base/ime/ui_base_ime.gyp:ui_base_ime',
+ '../ui/events/events.gyp:blink',
'../ui/events/events.gyp:events',
'../ui/events/events.gyp:events_base',
'../ui/events/events.gyp:gesture_detection',
diff --git a/content/content_tests.gypi b/content/content_tests.gypi
index bb327de..818e498 100644
--- a/content/content_tests.gypi
+++ b/content/content_tests.gypi
@@ -998,6 +998,7 @@
'../third_party/re2/re2.gyp:re2',
'../ui/accessibility/accessibility.gyp:accessibility',
'../ui/base/ui_base.gyp:ui_base',
+ '../ui/events/events.gyp:blink',
'../ui/gfx/gfx.gyp:gfx',
'../ui/gfx/gfx.gyp:gfx_geometry',
'../ui/gfx/ipc/gfx_ipc.gyp:gfx_ipc',
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 85f23be..a34cd5c 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -470,7 +470,7 @@ if (!is_mac) { # TODO(GYP) enable on Mac once it links.
"//third_party/re2",
"//ui/accessibility",
"//ui/base",
- "//ui/base",
+ "//ui/events/blink",
"//ui/gfx",
"//ui/gfx/geometry",
"//ui/gfx/ipc",
diff --git a/ui/events/blink/BUILD.gn b/ui/events/blink/BUILD.gn
new file mode 100644
index 0000000..1fa7fef
--- /dev/null
+++ b/ui/events/blink/BUILD.gn
@@ -0,0 +1,17 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("blink") {
+ sources = [
+ "blink_event_util.cc",
+ "blink_event_util.h",
+ ]
+
+ deps = [
+ "//third_party/WebKit/public:blink_headers",
+ "//ui/events",
+ "//ui/events:gesture_detection",
+ "//ui/gfx/geometry",
+ ]
+}
diff --git a/ui/events/blink/DEPS b/ui/events/blink/DEPS
new file mode 100644
index 0000000..c28eb31
--- /dev/null
+++ b/ui/events/blink/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+ "+third_party/WebKit/public/web/WebInputEvent.h",
+]
diff --git a/ui/events/blink/blink_event_util.cc b/ui/events/blink/blink_event_util.cc
new file mode 100644
index 0000000..835a82b
--- /dev/null
+++ b/ui/events/blink/blink_event_util.cc
@@ -0,0 +1,303 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// MSVC++ requires this to be set before any other includes to get M_PI.
+#define _USE_MATH_DEFINES
+
+#include "ui/events/blink/blink_event_util.h"
+
+#include <cmath>
+
+#include "base/time/time.h"
+#include "third_party/WebKit/public/web/WebInputEvent.h"
+#include "ui/events/event_constants.h"
+#include "ui/events/gesture_detection/gesture_event_data.h"
+#include "ui/events/gesture_detection/motion_event.h"
+#include "ui/events/gesture_event_details.h"
+#include "ui/gfx/geometry/safe_integer_conversions.h"
+
+using blink::WebGestureEvent;
+using blink::WebInputEvent;
+using blink::WebTouchEvent;
+using blink::WebTouchPoint;
+
+namespace ui {
+namespace {
+
+WebInputEvent::Type ToWebInputEventType(MotionEvent::Action action) {
+ switch (action) {
+ case MotionEvent::ACTION_DOWN:
+ return WebInputEvent::TouchStart;
+ case MotionEvent::ACTION_MOVE:
+ return WebInputEvent::TouchMove;
+ case MotionEvent::ACTION_UP:
+ return WebInputEvent::TouchEnd;
+ case MotionEvent::ACTION_CANCEL:
+ return WebInputEvent::TouchCancel;
+ case MotionEvent::ACTION_POINTER_DOWN:
+ return WebInputEvent::TouchStart;
+ case MotionEvent::ACTION_POINTER_UP:
+ return WebInputEvent::TouchEnd;
+ }
+ NOTREACHED() << "Invalid MotionEvent::Action.";
+ return WebInputEvent::Undefined;
+}
+
+// Note that |is_action_pointer| is meaningful only in the context of
+// |ACTION_POINTER_UP| and |ACTION_POINTER_DOWN|; other actions map directly to
+// WebTouchPoint::State.
+WebTouchPoint::State ToWebTouchPointState(const MotionEvent& event,
+ size_t pointer_index) {
+ switch (event.GetAction()) {
+ case MotionEvent::ACTION_DOWN:
+ return WebTouchPoint::StatePressed;
+ case MotionEvent::ACTION_MOVE:
+ return WebTouchPoint::StateMoved;
+ case MotionEvent::ACTION_UP:
+ return WebTouchPoint::StateReleased;
+ case MotionEvent::ACTION_CANCEL:
+ return WebTouchPoint::StateCancelled;
+ case MotionEvent::ACTION_POINTER_DOWN:
+ return static_cast<int>(pointer_index) == event.GetActionIndex()
+ ? WebTouchPoint::StatePressed
+ : WebTouchPoint::StateStationary;
+ case MotionEvent::ACTION_POINTER_UP:
+ return static_cast<int>(pointer_index) == event.GetActionIndex()
+ ? WebTouchPoint::StateReleased
+ : WebTouchPoint::StateStationary;
+ }
+ NOTREACHED() << "Invalid MotionEvent::Action.";
+ return WebTouchPoint::StateUndefined;
+}
+
+WebTouchPoint CreateWebTouchPoint(const MotionEvent& event,
+ size_t pointer_index) {
+ WebTouchPoint touch;
+ touch.id = event.GetPointerId(pointer_index);
+ touch.state = ToWebTouchPointState(event, pointer_index);
+ touch.position.x = event.GetX(pointer_index);
+ touch.position.y = event.GetY(pointer_index);
+ touch.screenPosition.x = event.GetRawX(pointer_index);
+ touch.screenPosition.y = event.GetRawY(pointer_index);
+
+ // A note on touch ellipse specifications:
+ //
+ // Android MotionEvent provides the major and minor axes of the touch ellipse,
+ // as well as the orientation of the major axis clockwise from vertical, in
+ // radians. See:
+ // http://developer.android.com/reference/android/view/MotionEvent.html
+ //
+ // The proposed extension to W3C Touch Events specifies the touch ellipse
+ // using two radii along x- & y-axes and a positive acute rotation angle in
+ // degrees. See:
+ // http://dvcs.w3.org/hg/webevents/raw-file/default/touchevents.html
+
+ float major_radius = event.GetTouchMajor(pointer_index) / 2.f;
+ float minor_radius = event.GetTouchMinor(pointer_index) / 2.f;
+
+ DCHECK_LE(minor_radius, major_radius);
+ DCHECK_IMPLIES(major_radius, minor_radius);
+
+ float orientation_deg = event.GetOrientation(pointer_index) * 180.f / M_PI;
+ DCHECK_GE(major_radius, 0);
+ DCHECK_GE(minor_radius, 0);
+ DCHECK_GE(major_radius, minor_radius);
+ // Allow a small bound tolerance to account for floating point conversion.
+ DCHECK_GT(orientation_deg, -90.01f);
+ DCHECK_LT(orientation_deg, 90.01f);
+ if (orientation_deg >= 0) {
+ // The case orientation_deg == 0 is handled here on purpose: although the
+ // 'else' block is equivalent in this case, we want to pass the 0 value
+ // unchanged (and 0 is the default value for many devices that don't
+ // report elliptical touches).
+ touch.radiusX = minor_radius;
+ touch.radiusY = major_radius;
+ touch.rotationAngle = orientation_deg;
+ } else {
+ touch.radiusX = major_radius;
+ touch.radiusY = minor_radius;
+ touch.rotationAngle = orientation_deg + 90;
+ }
+
+ touch.force = event.GetPressure(pointer_index);
+
+ return touch;
+}
+
+} // namespace
+
+blink::WebTouchEvent CreateWebTouchEventFromMotionEvent(
+ const MotionEvent& event,
+ bool may_cause_scrolling) {
+ static_assert(static_cast<int>(MotionEvent::MAX_TOUCH_POINT_COUNT) ==
+ static_cast<int>(blink::WebTouchEvent::touchesLengthCap),
+ "inconsistent maximum number of active touch points");
+
+ blink::WebTouchEvent result;
+
+ result.type = ToWebInputEventType(event.GetAction());
+ result.cancelable = (result.type != WebInputEvent::TouchCancel);
+ result.timeStampSeconds =
+ (event.GetEventTime() - base::TimeTicks()).InSecondsF(),
+ result.causesScrollingIfUncanceled = may_cause_scrolling;
+ result.modifiers = EventFlagsToWebEventModifiers(event.GetFlags());
+ result.touchesLength =
+ std::min(static_cast<unsigned>(event.GetPointerCount()),
+ static_cast<unsigned>(WebTouchEvent::touchesLengthCap));
+ DCHECK_GT(result.touchesLength, 0U);
+
+ for (size_t i = 0; i < result.touchesLength; ++i)
+ result.touches[i] = CreateWebTouchPoint(event, i);
+
+ return result;
+}
+
+int EventFlagsToWebEventModifiers(int flags) {
+ int modifiers = 0;
+
+ if (flags & EF_SHIFT_DOWN)
+ modifiers |= blink::WebInputEvent::ShiftKey;
+ if (flags & EF_CONTROL_DOWN)
+ modifiers |= blink::WebInputEvent::ControlKey;
+ if (flags & EF_ALT_DOWN)
+ modifiers |= blink::WebInputEvent::AltKey;
+ if (flags & EF_COMMAND_DOWN)
+ modifiers |= blink::WebInputEvent::MetaKey;
+
+ if (flags & EF_LEFT_MOUSE_BUTTON)
+ modifiers |= blink::WebInputEvent::LeftButtonDown;
+ if (flags & EF_MIDDLE_MOUSE_BUTTON)
+ modifiers |= blink::WebInputEvent::MiddleButtonDown;
+ if (flags & EF_RIGHT_MOUSE_BUTTON)
+ modifiers |= blink::WebInputEvent::RightButtonDown;
+ if (flags & EF_CAPS_LOCK_DOWN)
+ modifiers |= blink::WebInputEvent::CapsLockOn;
+ if (flags & EF_IS_REPEAT)
+ modifiers |= blink::WebInputEvent::IsAutoRepeat;
+ if (flags & EF_NUMPAD_KEY)
+ modifiers |= blink::WebInputEvent::IsKeyPad;
+
+ return modifiers;
+}
+
+WebGestureEvent CreateWebGestureEvent(const GestureEventDetails& details,
+ base::TimeDelta timestamp,
+ const gfx::PointF& location,
+ const gfx::PointF& raw_location,
+ int flags) {
+ WebGestureEvent gesture;
+ gesture.timeStampSeconds = timestamp.InSecondsF();
+ gesture.x = gfx::ToFlooredInt(location.x());
+ gesture.y = gfx::ToFlooredInt(location.y());
+ gesture.globalX = gfx::ToFlooredInt(raw_location.x());
+ gesture.globalY = gfx::ToFlooredInt(raw_location.y());
+ gesture.modifiers = EventFlagsToWebEventModifiers(flags);
+ gesture.sourceDevice = blink::WebGestureDeviceTouchscreen;
+
+ switch (details.type()) {
+ case ET_GESTURE_SHOW_PRESS:
+ gesture.type = WebInputEvent::GestureShowPress;
+ gesture.data.showPress.width = details.bounding_box_f().width();
+ gesture.data.showPress.height = details.bounding_box_f().height();
+ break;
+ case ET_GESTURE_DOUBLE_TAP:
+ gesture.type = WebInputEvent::GestureDoubleTap;
+ DCHECK_EQ(1, details.tap_count());
+ gesture.data.tap.tapCount = details.tap_count();
+ gesture.data.tap.width = details.bounding_box_f().width();
+ gesture.data.tap.height = details.bounding_box_f().height();
+ break;
+ case ET_GESTURE_TAP:
+ gesture.type = WebInputEvent::GestureTap;
+ DCHECK_GE(details.tap_count(), 1);
+ gesture.data.tap.tapCount = details.tap_count();
+ gesture.data.tap.width = details.bounding_box_f().width();
+ gesture.data.tap.height = details.bounding_box_f().height();
+ break;
+ case ET_GESTURE_TAP_UNCONFIRMED:
+ gesture.type = WebInputEvent::GestureTapUnconfirmed;
+ DCHECK_EQ(1, details.tap_count());
+ gesture.data.tap.tapCount = details.tap_count();
+ gesture.data.tap.width = details.bounding_box_f().width();
+ gesture.data.tap.height = details.bounding_box_f().height();
+ break;
+ case ET_GESTURE_LONG_PRESS:
+ gesture.type = WebInputEvent::GestureLongPress;
+ gesture.data.longPress.width = details.bounding_box_f().width();
+ gesture.data.longPress.height = details.bounding_box_f().height();
+ break;
+ case ET_GESTURE_LONG_TAP:
+ gesture.type = WebInputEvent::GestureLongTap;
+ gesture.data.longPress.width = details.bounding_box_f().width();
+ gesture.data.longPress.height = details.bounding_box_f().height();
+ break;
+ case ET_GESTURE_TWO_FINGER_TAP:
+ gesture.type = blink::WebInputEvent::GestureTwoFingerTap;
+ gesture.data.twoFingerTap.firstFingerWidth = details.first_finger_width();
+ gesture.data.twoFingerTap.firstFingerHeight =
+ details.first_finger_height();
+ break;
+ case ET_GESTURE_SCROLL_BEGIN:
+ gesture.type = WebInputEvent::GestureScrollBegin;
+ gesture.data.scrollBegin.deltaXHint = details.scroll_x_hint();
+ gesture.data.scrollBegin.deltaYHint = details.scroll_y_hint();
+ break;
+ case ET_GESTURE_SCROLL_UPDATE:
+ gesture.type = WebInputEvent::GestureScrollUpdate;
+ gesture.data.scrollUpdate.deltaX = details.scroll_x();
+ gesture.data.scrollUpdate.deltaY = details.scroll_y();
+ gesture.data.scrollUpdate.previousUpdateInSequencePrevented =
+ details.previous_scroll_update_in_sequence_prevented();
+ break;
+ case ET_GESTURE_SCROLL_END:
+ gesture.type = WebInputEvent::GestureScrollEnd;
+ break;
+ case ET_SCROLL_FLING_START:
+ gesture.type = WebInputEvent::GestureFlingStart;
+ gesture.data.flingStart.velocityX = details.velocity_x();
+ gesture.data.flingStart.velocityY = details.velocity_y();
+ break;
+ case ET_SCROLL_FLING_CANCEL:
+ gesture.type = WebInputEvent::GestureFlingCancel;
+ break;
+ case ET_GESTURE_PINCH_BEGIN:
+ gesture.type = WebInputEvent::GesturePinchBegin;
+ break;
+ case ET_GESTURE_PINCH_UPDATE:
+ gesture.type = WebInputEvent::GesturePinchUpdate;
+ gesture.data.pinchUpdate.scale = details.scale();
+ break;
+ case ET_GESTURE_PINCH_END:
+ gesture.type = WebInputEvent::GesturePinchEnd;
+ break;
+ case ET_GESTURE_TAP_CANCEL:
+ gesture.type = WebInputEvent::GestureTapCancel;
+ break;
+ case ET_GESTURE_TAP_DOWN:
+ gesture.type = WebInputEvent::GestureTapDown;
+ gesture.data.tapDown.width = details.bounding_box_f().width();
+ gesture.data.tapDown.height = details.bounding_box_f().height();
+ break;
+ case ET_GESTURE_BEGIN:
+ case ET_GESTURE_END:
+ case ET_GESTURE_SWIPE:
+ // The caller is responsible for discarding these gestures appropriately.
+ gesture.type = WebInputEvent::Undefined;
+ break;
+ default:
+ NOTREACHED() << "EventType provided wasn't a valid gesture event: "
+ << details.type();
+ }
+
+ return gesture;
+}
+
+WebGestureEvent CreateWebGestureEventFromGestureEventData(
+ const GestureEventData& data) {
+ return CreateWebGestureEvent(data.details, data.time - base::TimeTicks(),
+ gfx::PointF(data.x, data.y),
+ gfx::PointF(data.raw_x, data.raw_y), data.flags);
+}
+
+} // namespace ui
diff --git a/ui/events/blink/blink_event_util.h b/ui/events/blink/blink_event_util.h
new file mode 100644
index 0000000..c0f60c9
--- /dev/null
+++ b/ui/events/blink/blink_event_util.h
@@ -0,0 +1,44 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_EVENTS_BLINK_BLINK_EVENT_UTIL_H_
+#define UI_EVENTS_BLINK_BLINK_EVENT_UTIL_H_
+
+namespace base {
+class TimeDelta;
+}
+
+namespace blink {
+class WebGestureEvent;
+class WebTouchEvent;
+}
+
+namespace gfx {
+class PointF;
+}
+
+namespace ui {
+struct GestureEventData;
+struct GestureEventDetails;
+class MotionEvent;
+
+blink::WebTouchEvent CreateWebTouchEventFromMotionEvent(
+ const MotionEvent& event,
+ bool may_cause_scrolling);
+
+blink::WebGestureEvent CreateWebGestureEvent(const GestureEventDetails& details,
+ base::TimeDelta timestamp,
+ const gfx::PointF& location,
+ const gfx::PointF& raw_location,
+ int flags);
+
+// Convenience wrapper for |CreateWebGestureEvent| using the supplied |data|.
+blink::WebGestureEvent CreateWebGestureEventFromGestureEventData(
+ const GestureEventData& data);
+
+int EventFlagsToWebEventModifiers(int flags);
+
+} // namespace content
+
+#endif // UI_EVENTS_BLINK_BLINK_EVENT_UTIL_H_
diff --git a/ui/events/events.gyp b/ui/events/events.gyp
index 6906b45..03b75f2 100644
--- a/ui/events/events.gyp
+++ b/ui/events/events.gyp
@@ -184,6 +184,22 @@
],
},
{
+ # GN version: //ui/events/blink
+ 'target_name': 'blink',
+ 'type': 'static_library',
+ 'dependencies': [
+ '../../third_party/WebKit/public/blink_headers.gyp:blink_headers',
+ '../gfx/gfx.gyp:gfx_geometry',
+ 'events',
+ 'gesture_detection',
+ ],
+ 'sources': [
+ # Note: sources list duplicated in GN build.
+ 'blink/blink_event_util.cc',
+ 'blink/blink_event_util.h',
+ ],
+ },
+ {
# GN version: //ui/events:gesture_detection
'target_name': 'gesture_detection',
'type': '<(component)',