diff options
Diffstat (limited to 'content/browser/renderer_host')
5 files changed, 125 insertions, 168 deletions
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 81fc359..000bcc7 100644 --- a/content/browser/renderer_host/input/web_input_event_util.cc +++ b/content/browser/renderer_host/input/web_input_event_util.cc @@ -14,6 +14,7 @@ #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/gfx/geometry/safe_integer_conversions.h" using blink::WebGestureEvent; using blink::WebInputEvent; @@ -279,71 +280,82 @@ blink::WebTouchEvent CreateWebTouchEventFromMotionEvent( return result; } -WebGestureEvent CreateWebGestureEventFromGestureEventData( - const ui::GestureEventData& data) { +WebGestureEvent CreateWebGestureEvent(const ui::GestureEventDetails& details, + base::TimeDelta timestamp, + const gfx::PointF& location, + const gfx::PointF& raw_location, + int flags) { WebGestureEvent gesture; - gesture.modifiers = EventFlagsToWebEventModifiers(data.flags); - gesture.x = data.x; - gesture.y = data.y; - gesture.globalX = data.raw_x; - gesture.globalY = data.raw_y; - gesture.timeStampSeconds = (data.time - base::TimeTicks()).InSecondsF(); + 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 (data.type()) { + switch (details.type()) { case ui::ET_GESTURE_SHOW_PRESS: gesture.type = WebInputEvent::GestureShowPress; - gesture.data.showPress.width = data.details.bounding_box_f().width(); - gesture.data.showPress.height = data.details.bounding_box_f().height(); + 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, data.details.tap_count()); - gesture.data.tap.tapCount = data.details.tap_count(); - gesture.data.tap.width = data.details.bounding_box_f().width(); - gesture.data.tap.height = data.details.bounding_box_f().height(); + 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_EQ(1, data.details.tap_count()); - gesture.data.tap.tapCount = data.details.tap_count(); - gesture.data.tap.width = data.details.bounding_box_f().width(); - gesture.data.tap.height = data.details.bounding_box_f().height(); + 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, data.details.tap_count()); - gesture.data.tap.tapCount = data.details.tap_count(); - gesture.data.tap.width = data.details.bounding_box_f().width(); - gesture.data.tap.height = data.details.bounding_box_f().height(); + 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 = data.details.bounding_box_f().width(); - gesture.data.longPress.height = data.details.bounding_box_f().height(); + 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 = data.details.bounding_box_f().width(); - gesture.data.longPress.height = data.details.bounding_box_f().height(); + 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 = data.details.scroll_x_hint(); - gesture.data.scrollBegin.deltaYHint = data.details.scroll_y_hint(); + 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 = data.details.scroll_x(); - gesture.data.scrollUpdate.deltaY = data.details.scroll_y(); + 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 = data.details.velocity_x(); - gesture.data.flingStart.velocityY = data.details.velocity_y(); + 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; @@ -353,7 +365,7 @@ WebGestureEvent CreateWebGestureEventFromGestureEventData( break; case ui::ET_GESTURE_PINCH_UPDATE: gesture.type = WebInputEvent::GesturePinchUpdate; - gesture.data.pinchUpdate.scale = data.details.scale(); + gesture.data.pinchUpdate.scale = details.scale(); break; case ui::ET_GESTURE_PINCH_END: gesture.type = WebInputEvent::GesturePinchEnd; @@ -363,22 +375,32 @@ WebGestureEvent CreateWebGestureEventFromGestureEventData( break; case ui::ET_GESTURE_TAP_DOWN: gesture.type = WebInputEvent::GestureTapDown; - gesture.data.tapDown.width = data.details.bounding_box_f().width(); - gesture.data.tapDown.height = data.details.bounding_box_f().height(); + 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: - NOTREACHED() << "ET_GESTURE_BEGIN and ET_GESTURE_END are only produced " - << "in Aura, and should never end up here."; + 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."; - break; + 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; 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 1cadd7d..fb25037 100644 --- a/content/browser/renderer_host/input/web_input_event_util.h +++ b/content/browser/renderer_host/input/web_input_event_util.h @@ -5,12 +5,14 @@ #ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_WEB_INPUT_EVENT_UTIL_H_ #define CONTENT_BROWSER_RENDERER_HOST_INPUT_WEB_INPUT_EVENT_UTIL_H_ +#include "base/time/time.h" #include "content/common/content_export.h" #include "third_party/WebKit/public/web/WebInputEvent.h" #include "ui/events/keycodes/keyboard_codes.h" namespace ui { struct GestureEventData; +struct GestureEventDetails; class MotionEvent; } @@ -22,15 +24,19 @@ CONTENT_EXPORT void UpdateWindowsKeyCodeAndKeyIdentifier( blink::WebKeyboardEvent* event, ui::KeyboardCode windows_key_code); -// Creates a WebTouchEvent from |event|, scaling all size components from -// |event| by |scale|. CONTENT_EXPORT blink::WebTouchEvent CreateWebTouchEventFromMotionEvent( const ui::MotionEvent& event); -// Creates a WebGestureEvent from |event|, scaling all size components from -// |event| by |scale|. -CONTENT_EXPORT blink::WebGestureEvent CreateWebGestureEventFromGestureEventData( - const ui::GestureEventData& data); +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); 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 1d29a07..6d50575 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 @@ -13,7 +13,10 @@ #include "content/common/input/web_input_event_traits.h" #include "testing/gtest/include/gtest/gtest.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" +#include "ui/events/gesture_event_details.h" +#include "ui/gfx/geometry/safe_integer_conversions.h" using blink::WebInputEvent; using blink::WebTouchEvent; @@ -58,4 +61,46 @@ TEST(WebInputEventUtilTest, MotionEventConversion) { WebInputEventTraits::ToString(actual_event)); } +TEST(WebInputEventUtilTest, ScrollUpdateConversion) { + int motion_event_id = 0; + MotionEvent::ToolType tool_type = MotionEvent::TOOL_TYPE_UNKNOWN; + base::TimeTicks timestamp = base::TimeTicks::Now(); + gfx::Vector2dF delta(-5.f, 10.f); + gfx::PointF pos(1.f, 2.f); + gfx::PointF raw_pos(11.f, 12.f); + size_t touch_points = 1; + gfx::RectF rect(pos, gfx::SizeF()); + int flags = 0; + ui::GestureEventDetails details(ui::ET_GESTURE_SCROLL_UPDATE, + delta.x(), + delta.y()); + details.mark_previous_scroll_update_in_sequence_prevented(); + ui::GestureEventData event(details, + motion_event_id, + tool_type, + timestamp, + pos.x(), + pos.y(), + raw_pos.x(), + raw_pos.y(), + touch_points, + rect, + flags); + + blink::WebGestureEvent web_event = + CreateWebGestureEventFromGestureEventData(event); + EXPECT_EQ(WebInputEvent::GestureScrollUpdate, web_event.type); + EXPECT_EQ(0, web_event.modifiers); + EXPECT_EQ((timestamp - base::TimeTicks()).InSecondsF(), + web_event.timeStampSeconds); + EXPECT_EQ(gfx::ToFlooredInt(pos.x()), web_event.x); + EXPECT_EQ(gfx::ToFlooredInt(pos.y()), web_event.y); + EXPECT_EQ(gfx::ToFlooredInt(raw_pos.x()), web_event.globalX); + EXPECT_EQ(gfx::ToFlooredInt(raw_pos.y()), web_event.globalY); + EXPECT_EQ(blink::WebGestureDeviceTouchscreen, web_event.sourceDevice); + EXPECT_EQ(delta.x(), web_event.data.scrollUpdate.deltaX); + EXPECT_EQ(delta.y(), web_event.data.scrollUpdate.deltaY); + EXPECT_TRUE(web_event.data.scrollUpdate.previousUpdateInSequencePrevented); +} + } // namespace content diff --git a/content/browser/renderer_host/ui_events_helper.cc b/content/browser/renderer_host/ui_events_helper.cc index b514425..fc6509b 100644 --- a/content/browser/renderer_host/ui_events_helper.cc +++ b/content/browser/renderer_host/ui_events_helper.cc @@ -12,31 +12,6 @@ namespace { -int WebModifiersToUIFlags(int modifiers) { - int flags = ui::EF_NONE; - - if (modifiers & blink::WebInputEvent::ShiftKey) - flags |= ui::EF_SHIFT_DOWN; - if (modifiers & blink::WebInputEvent::ControlKey) - flags |= ui::EF_CONTROL_DOWN; - if (modifiers & blink::WebInputEvent::AltKey) - flags |= ui::EF_ALT_DOWN; - if (modifiers & blink::WebInputEvent::MetaKey) - flags |= ui::EF_COMMAND_DOWN; - - if (modifiers & blink::WebInputEvent::LeftButtonDown) - flags |= ui::EF_LEFT_MOUSE_BUTTON; - if (modifiers & blink::WebInputEvent::RightButtonDown) - flags |= ui::EF_RIGHT_MOUSE_BUTTON; - if (modifiers & blink::WebInputEvent::MiddleButtonDown) - flags |= ui::EF_MIDDLE_MOUSE_BUTTON; - - if (modifiers & blink::WebInputEvent::CapsLockOn) - flags |= ui::EF_CAPS_LOCK_DOWN; - - return flags; -} - ui::EventType WebTouchPointStateToEventType( blink::WebTouchPoint::State state) { switch (state) { @@ -117,7 +92,7 @@ bool MakeUITouchEventsFromWebTouchEvents( return false; } - int flags = WebModifiersToUIFlags(touch.modifiers); + int flags = WebEventModifiersToEventFlags(touch.modifiers); base::TimeDelta timestamp = base::TimeDelta::FromMicroseconds( static_cast<int64>(touch.timeStampSeconds * 1000000)); for (unsigned i = 0; i < touch.touchesLength; ++i) { @@ -147,100 +122,11 @@ bool MakeUITouchEventsFromWebTouchEvents( blink::WebGestureEvent MakeWebGestureEventFromUIEvent( const ui::GestureEvent& event) { - blink::WebGestureEvent gesture_event; - - switch (event.type()) { - case ui::ET_GESTURE_TAP: - gesture_event.type = blink::WebInputEvent::GestureTap; - gesture_event.data.tap.tapCount = event.details().tap_count(); - gesture_event.data.tap.width = event.details().bounding_box().width(); - gesture_event.data.tap.height = event.details().bounding_box().height(); - break; - case ui::ET_GESTURE_TAP_DOWN: - gesture_event.type = blink::WebInputEvent::GestureTapDown; - gesture_event.data.tapDown.width = - event.details().bounding_box().width(); - gesture_event.data.tapDown.height = - event.details().bounding_box().height(); - break; - case ui::ET_GESTURE_SHOW_PRESS: - gesture_event.type = blink::WebInputEvent::GestureShowPress; - gesture_event.data.showPress.width = - event.details().bounding_box().width(); - gesture_event.data.showPress.height = - event.details().bounding_box().height(); - break; - case ui::ET_GESTURE_TAP_CANCEL: - gesture_event.type = blink::WebInputEvent::GestureTapCancel; - break; - case ui::ET_GESTURE_SCROLL_BEGIN: - gesture_event.type = blink::WebInputEvent::GestureScrollBegin; - gesture_event.data.scrollBegin.deltaXHint = - event.details().scroll_x_hint(); - gesture_event.data.scrollBegin.deltaYHint = - event.details().scroll_y_hint(); - break; - case ui::ET_GESTURE_SCROLL_UPDATE: - gesture_event.type = blink::WebInputEvent::GestureScrollUpdate; - gesture_event.data.scrollUpdate.deltaX = event.details().scroll_x(); - gesture_event.data.scrollUpdate.deltaY = event.details().scroll_y(); - break; - case ui::ET_GESTURE_SCROLL_END: - gesture_event.type = blink::WebInputEvent::GestureScrollEnd; - break; - case ui::ET_GESTURE_PINCH_BEGIN: - gesture_event.type = blink::WebInputEvent::GesturePinchBegin; - break; - case ui::ET_GESTURE_PINCH_UPDATE: - gesture_event.type = blink::WebInputEvent::GesturePinchUpdate; - gesture_event.data.pinchUpdate.scale = event.details().scale(); - break; - case ui::ET_GESTURE_PINCH_END: - gesture_event.type = blink::WebInputEvent::GesturePinchEnd; - break; - case ui::ET_SCROLL_FLING_START: - gesture_event.type = blink::WebInputEvent::GestureFlingStart; - gesture_event.data.flingStart.velocityX = event.details().velocity_x(); - gesture_event.data.flingStart.velocityY = event.details().velocity_y(); - break; - case ui::ET_SCROLL_FLING_CANCEL: - gesture_event.type = blink::WebInputEvent::GestureFlingCancel; - break; - case ui::ET_GESTURE_LONG_PRESS: - gesture_event.type = blink::WebInputEvent::GestureLongPress; - gesture_event.data.longPress.width = - event.details().bounding_box().width(); - gesture_event.data.longPress.height = - event.details().bounding_box().height(); - break; - case ui::ET_GESTURE_LONG_TAP: - gesture_event.type = blink::WebInputEvent::GestureLongTap; - gesture_event.data.longPress.width = - event.details().bounding_box().width(); - gesture_event.data.longPress.height = - event.details().bounding_box().height(); - break; - case ui::ET_GESTURE_TWO_FINGER_TAP: - gesture_event.type = blink::WebInputEvent::GestureTwoFingerTap; - gesture_event.data.twoFingerTap.firstFingerWidth = - event.details().first_finger_width(); - gesture_event.data.twoFingerTap.firstFingerHeight = - event.details().first_finger_height(); - break; - case ui::ET_GESTURE_BEGIN: - case ui::ET_GESTURE_END: - case ui::ET_GESTURE_SWIPE: - gesture_event.type = blink::WebInputEvent::Undefined; - break; - default: - NOTREACHED() << "Unknown gesture type: " << event.type(); - } - - gesture_event.sourceDevice = blink::WebGestureDeviceTouchscreen; - gesture_event.modifiers = EventFlagsToWebEventModifiers(event.flags()); - gesture_event.timeStampSeconds = event.time_stamp().InSecondsF(); - - return gesture_event; + return CreateWebGestureEvent(event.details(), + event.time_stamp(), + event.location_f(), + event.root_location_f(), + event.flags()); } blink::WebTouchPoint* UpdateWebTouchEventFromUIEvent( diff --git a/content/browser/renderer_host/ui_events_helper.h b/content/browser/renderer_host/ui_events_helper.h index 883ba48..f2dac18 100644 --- a/content/browser/renderer_host/ui_events_helper.h +++ b/content/browser/renderer_host/ui_events_helper.h @@ -48,8 +48,6 @@ CONTENT_EXPORT bool MakeUITouchEventsFromWebTouchEvents( blink::WebGestureEvent MakeWebGestureEventFromUIEvent( const ui::GestureEvent& event); -int EventFlagsToWebEventModifiers(int flags); - // Updates the WebTouchEvent based on the TouchEvent. It returns the updated // WebTouchPoint contained in the WebTouchEvent, or NULL if no point was // updated. |