Index: content/renderer/render_widget_unittest.cc |
diff --git a/content/renderer/render_widget_unittest.cc b/content/renderer/render_widget_unittest.cc |
index d9b919aef2fa5532a2daf037a1830be76ba5d7ca..508ebc181b21d5c933cd3b6d08053955f34d2bbf 100644 |
--- a/content/renderer/render_widget_unittest.cc |
+++ b/content/renderer/render_widget_unittest.cc |
@@ -29,14 +29,15 @@ class RenderWidgetUnittest : public testing::Test { |
DISALLOW_COPY_AND_ASSIGN(RenderWidgetUnittest); |
}; |
-class TouchableRenderWidget : public RenderWidget { |
+class InteractiveRenderWidget : public RenderWidget { |
public: |
- TouchableRenderWidget() |
+ InteractiveRenderWidget() |
: RenderWidget(blink::WebPopupTypeNone, |
blink::WebScreenInfo(), |
false, |
false, |
- false) {} |
+ false), |
+ always_overscroll_(false) {} |
void SetTouchRegion(const std::vector<gfx::Rect>& rects) { |
rects_ = rects; |
@@ -46,10 +47,14 @@ class TouchableRenderWidget : public RenderWidget { |
OnHandleInputEvent(&event, ui::LatencyInfo(), false); |
} |
+ void set_always_overscroll(bool overscroll) { |
+ always_overscroll_ = overscroll; |
+ } |
+ |
IPC::TestSink* sink() { return &sink_; } |
protected: |
- ~TouchableRenderWidget() override {} |
+ ~InteractiveRenderWidget() override {} |
// Overridden from RenderWidget: |
bool HasTouchEventHandlersAt(const gfx::Point& point) const override { |
@@ -61,6 +66,22 @@ class TouchableRenderWidget : public RenderWidget { |
return false; |
} |
+ bool WillHandleGestureEvent(const blink::WebGestureEvent& event) override { |
+ if (always_overscroll_ && |
+ event.type == blink::WebInputEvent::GestureScrollUpdate) { |
+ didOverscroll(blink::WebFloatSize(event.data.scrollUpdate.deltaX, |
+ event.data.scrollUpdate.deltaY), |
+ blink::WebFloatSize(event.data.scrollUpdate.deltaX, |
+ event.data.scrollUpdate.deltaY), |
+ blink::WebFloatPoint(event.x, event.y), |
+ blink::WebFloatSize(event.data.scrollUpdate.velocityX, |
+ event.data.scrollUpdate.velocityY)); |
+ return true; |
+ } |
+ |
+ return false; |
+ } |
+ |
bool Send(IPC::Message* msg) override { |
sink_.OnMessageReceived(*msg); |
delete msg; |
@@ -70,12 +91,13 @@ class TouchableRenderWidget : public RenderWidget { |
private: |
std::vector<gfx::Rect> rects_; |
IPC::TestSink sink_; |
+ bool always_overscroll_; |
- DISALLOW_COPY_AND_ASSIGN(TouchableRenderWidget); |
+ DISALLOW_COPY_AND_ASSIGN(InteractiveRenderWidget); |
}; |
TEST_F(RenderWidgetUnittest, TouchHitTestSinglePoint) { |
- scoped_refptr<TouchableRenderWidget> widget = new TouchableRenderWidget(); |
+ scoped_refptr<InteractiveRenderWidget> widget = new InteractiveRenderWidget(); |
SyntheticWebTouchEvent touch; |
touch.PressPoint(10, 10); |
@@ -109,7 +131,7 @@ TEST_F(RenderWidgetUnittest, TouchHitTestSinglePoint) { |
} |
TEST_F(RenderWidgetUnittest, TouchHitTestMultiplePoints) { |
- scoped_refptr<TouchableRenderWidget> widget = new TouchableRenderWidget(); |
+ scoped_refptr<InteractiveRenderWidget> widget = new InteractiveRenderWidget(); |
std::vector<gfx::Rect> rects; |
rects.push_back(gfx::Rect(0, 0, 20, 20)); |
rects.push_back(gfx::Rect(25, 0, 10, 10)); |
@@ -143,4 +165,51 @@ TEST_F(RenderWidgetUnittest, TouchHitTestMultiplePoints) { |
widget->sink()->ClearMessages(); |
} |
+TEST_F(RenderWidgetUnittest, EventOverscroll) { |
+ scoped_refptr<InteractiveRenderWidget> widget = new InteractiveRenderWidget(); |
+ widget->set_always_overscroll(true); |
+ |
+ blink::WebGestureEvent scroll; |
+ scroll.type = blink::WebInputEvent::GestureScrollUpdate; |
+ scroll.x = -10; |
+ scroll.data.scrollUpdate.deltaY = 10; |
+ widget->SendInputEvent(scroll); |
+ |
+ // Overscroll notifications received while handling an input event should |
+ // be bundled with the event ack IPC. |
+ ASSERT_EQ(1u, widget->sink()->message_count()); |
+ const IPC::Message* message = widget->sink()->GetMessageAt(0); |
+ ASSERT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); |
+ InputHostMsg_HandleInputEvent_ACK::Param params; |
+ InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); |
+ const InputEventAck& ack = base::get<0>(params); |
+ ASSERT_EQ(ack.type, scroll.type); |
+ ASSERT_TRUE(ack.overscroll); |
+ EXPECT_EQ(gfx::Vector2dF(0, 10), ack.overscroll->accumulated_overscroll); |
+ EXPECT_EQ(gfx::Vector2dF(0, 10), ack.overscroll->latest_overscroll_delta); |
+ EXPECT_EQ(gfx::Vector2dF(), ack.overscroll->current_fling_velocity); |
+ EXPECT_EQ(gfx::PointF(-10, 0), ack.overscroll->causal_event_viewport_point); |
+ widget->sink()->ClearMessages(); |
+} |
+ |
+TEST_F(RenderWidgetUnittest, FlingOverscroll) { |
+ scoped_refptr<InteractiveRenderWidget> widget = new InteractiveRenderWidget(); |
+ |
+ // Overscroll notifications received outside of handling an input event should |
+ // be sent as a separate IPC. |
+ widget->didOverscroll(blink::WebFloatSize(10, 5), blink::WebFloatSize(5, 5), |
+ blink::WebFloatPoint(1, 1), blink::WebFloatSize(10, 5)); |
+ ASSERT_EQ(1u, widget->sink()->message_count()); |
+ const IPC::Message* message = widget->sink()->GetMessageAt(0); |
+ ASSERT_EQ(InputHostMsg_DidOverscroll::ID, message->type()); |
+ InputHostMsg_DidOverscroll::Param params; |
+ InputHostMsg_DidOverscroll::Read(message, ¶ms); |
+ const DidOverscrollParams& overscroll = base::get<0>(params); |
+ EXPECT_EQ(gfx::Vector2dF(10, 5), overscroll.latest_overscroll_delta); |
+ EXPECT_EQ(gfx::Vector2dF(5, 5), overscroll.accumulated_overscroll); |
+ EXPECT_EQ(gfx::PointF(1, 1), overscroll.causal_event_viewport_point); |
+ EXPECT_EQ(gfx::Vector2dF(-10, -5), overscroll.current_fling_velocity); |
+ widget->sink()->ClearMessages(); |
+} |
+ |
} // namespace content |