diff options
author | jdduke <jdduke@chromium.org> | 2014-11-18 12:44:35 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-11-18 20:45:45 +0000 |
commit | 019a29ecaa7e23348b65e1c86807554ded255028 (patch) | |
tree | f7faa7e0d0c448d6cc9938aea0d685328445c9bc /content/browser | |
parent | 5779b38e9f3fae82dbbed7219d96cdd19eef1813 (diff) | |
download | chromium_src-019a29ecaa7e23348b65e1c86807554ded255028.zip chromium_src-019a29ecaa7e23348b65e1c86807554ded255028.tar.gz chromium_src-019a29ecaa7e23348b65e1c86807554ded255028.tar.bz2 |
Track whether a scroll sequence has been partially prevented
Listeners and consumers of a gesture event stream may wish to know if
part of the gesture stream has been prevented, i.e., whether the page
has consumed any of the underlying touchmove events. Route this bit
for scroll update events from the TouchDispositionGestureFilter through
to the generated WebGestureEvent types.
This change depends on the Blink patch:
https://codereview.chromium.org/690173002/
BUG=428429
Review URL: https://codereview.chromium.org/712133003
Cr-Commit-Position: refs/heads/master@{#304665}
Diffstat (limited to 'content/browser')
6 files changed, 127 insertions, 171 deletions
diff --git a/content/browser/android/overscroll_controller_android.cc b/content/browser/android/overscroll_controller_android.cc index db35ea4..5dda6d1 100644 --- a/content/browser/android/overscroll_controller_android.cc +++ b/content/browser/android/overscroll_controller_android.cc @@ -127,9 +127,8 @@ void OverscrollControllerAndroid::OnGestureEventAck( if (event.type == blink::WebInputEvent::GestureScrollUpdate) { // The effect should only be allowed if both the causal touch events go // unconsumed and the generated scroll events go unconsumed. - // TODO(jdduke): Prevent activation if the first touchmove was consumed, - // i.e., the first GSU was prevented. - bool consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED; + bool consumed = ack_result == INPUT_EVENT_ACK_STATE_CONSUMED || + event.data.scrollUpdate.previousUpdateInSequencePrevented; refresh_effect_.OnScrollUpdateAck(consumed); } } 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. |