diff options
author | sky <sky@chromium.org> | 2015-03-27 08:42:44 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-27 15:43:19 +0000 |
commit | 83e08f5e90e017aa7dd9daa60cce84a242e631c8 (patch) | |
tree | e6a1e338e97ca0489beccec2a7320c354e9947c9 | |
parent | 56915573d8e4be522d4bd8aea1bf8ba76a3c8f77 (diff) | |
download | chromium_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.gn | 1 | ||||
-rw-r--r-- | content/browser/renderer_host/input/touch_emulator.cc | 3 | ||||
-rw-r--r-- | content/browser/renderer_host/input/web_input_event_util.cc | 277 | ||||
-rw-r--r-- | content/browser/renderer_host/input/web_input_event_util.h | 16 | ||||
-rw-r--r-- | content/browser/renderer_host/input/web_input_event_util_unittest.cc | 6 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_android.cc | 5 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_aura.cc | 3 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_aura_unittest.cc | 3 | ||||
-rw-r--r-- | content/browser/renderer_host/ui_events_helper.cc | 9 | ||||
-rw-r--r-- | content/browser/renderer_host/web_input_event_aura.cc | 11 | ||||
-rw-r--r-- | content/content_browser.gypi | 1 | ||||
-rw-r--r-- | content/content_tests.gypi | 1 | ||||
-rw-r--r-- | content/test/BUILD.gn | 2 | ||||
-rw-r--r-- | ui/events/blink/BUILD.gn | 17 | ||||
-rw-r--r-- | ui/events/blink/DEPS | 3 | ||||
-rw-r--r-- | ui/events/blink/blink_event_util.cc | 303 | ||||
-rw-r--r-- | ui/events/blink/blink_event_util.h | 44 | ||||
-rw-r--r-- | ui/events/events.gyp | 16 |
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)', |