summaryrefslogtreecommitdiffstats
path: root/content/browser/renderer_host
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/renderer_host')
-rw-r--r--content/browser/renderer_host/input/web_input_event_util.cc102
-rw-r--r--content/browser/renderer_host/input/web_input_event_util.h18
-rw-r--r--content/browser/renderer_host/input/web_input_event_util_unittest.cc45
-rw-r--r--content/browser/renderer_host/ui_events_helper.cc126
-rw-r--r--content/browser/renderer_host/ui_events_helper.h2
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.