Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: content/renderer/render_widget_unittest.cc

Issue 1209043002: Bundle main thread overscroll data with event ack messages (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/renderer/render_widget.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/render_widget.h" 5 #include "content/renderer/render_widget.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "content/common/input/synthetic_web_input_event_builders.h" 9 #include "content/common/input/synthetic_web_input_event_builders.h"
10 #include "content/common/input_messages.h" 10 #include "content/common/input_messages.h"
(...skipping 11 matching lines...) Expand all
22 RenderWidgetUnittest() {} 22 RenderWidgetUnittest() {}
23 ~RenderWidgetUnittest() override {} 23 ~RenderWidgetUnittest() override {}
24 24
25 private: 25 private:
26 MockRenderProcess render_process_; 26 MockRenderProcess render_process_;
27 MockRenderThread render_thread_; 27 MockRenderThread render_thread_;
28 28
29 DISALLOW_COPY_AND_ASSIGN(RenderWidgetUnittest); 29 DISALLOW_COPY_AND_ASSIGN(RenderWidgetUnittest);
30 }; 30 };
31 31
32 class TouchableRenderWidget : public RenderWidget { 32 class InteractiveRenderWidget : public RenderWidget {
33 public: 33 public:
34 TouchableRenderWidget() 34 InteractiveRenderWidget()
35 : RenderWidget(blink::WebPopupTypeNone, 35 : RenderWidget(blink::WebPopupTypeNone,
36 blink::WebScreenInfo(), 36 blink::WebScreenInfo(),
37 false, 37 false,
38 false, 38 false,
39 false) {} 39 false),
40 always_overscroll_(false) {}
40 41
41 void SetTouchRegion(const std::vector<gfx::Rect>& rects) { 42 void SetTouchRegion(const std::vector<gfx::Rect>& rects) {
42 rects_ = rects; 43 rects_ = rects;
43 } 44 }
44 45
45 void SendInputEvent(const blink::WebInputEvent& event) { 46 void SendInputEvent(const blink::WebInputEvent& event) {
46 OnHandleInputEvent(&event, ui::LatencyInfo(), false); 47 OnHandleInputEvent(&event, ui::LatencyInfo(), false);
47 } 48 }
48 49
50 void set_always_overscroll(bool overscroll) {
51 always_overscroll_ = overscroll;
52 }
53
49 IPC::TestSink* sink() { return &sink_; } 54 IPC::TestSink* sink() { return &sink_; }
50 55
51 protected: 56 protected:
52 ~TouchableRenderWidget() override {} 57 ~InteractiveRenderWidget() override {}
53 58
54 // Overridden from RenderWidget: 59 // Overridden from RenderWidget:
55 bool HasTouchEventHandlersAt(const gfx::Point& point) const override { 60 bool HasTouchEventHandlersAt(const gfx::Point& point) const override {
56 for (std::vector<gfx::Rect>::const_iterator iter = rects_.begin(); 61 for (std::vector<gfx::Rect>::const_iterator iter = rects_.begin();
57 iter != rects_.end(); ++iter) { 62 iter != rects_.end(); ++iter) {
58 if ((*iter).Contains(point)) 63 if ((*iter).Contains(point))
59 return true; 64 return true;
60 } 65 }
61 return false; 66 return false;
62 } 67 }
63 68
69 bool WillHandleGestureEvent(const blink::WebGestureEvent& event) override {
70 if (always_overscroll_ &&
71 event.type == blink::WebInputEvent::GestureScrollUpdate) {
72 didOverscroll(blink::WebFloatSize(event.data.scrollUpdate.deltaX,
73 event.data.scrollUpdate.deltaY),
74 blink::WebFloatSize(event.data.scrollUpdate.deltaX,
75 event.data.scrollUpdate.deltaY),
76 blink::WebFloatPoint(event.x, event.y),
77 blink::WebFloatSize(event.data.scrollUpdate.velocityX,
78 event.data.scrollUpdate.velocityY));
79 return true;
80 }
81
82 return false;
83 }
84
64 bool Send(IPC::Message* msg) override { 85 bool Send(IPC::Message* msg) override {
65 sink_.OnMessageReceived(*msg); 86 sink_.OnMessageReceived(*msg);
66 delete msg; 87 delete msg;
67 return true; 88 return true;
68 } 89 }
69 90
70 private: 91 private:
71 std::vector<gfx::Rect> rects_; 92 std::vector<gfx::Rect> rects_;
72 IPC::TestSink sink_; 93 IPC::TestSink sink_;
94 bool always_overscroll_;
73 95
74 DISALLOW_COPY_AND_ASSIGN(TouchableRenderWidget); 96 DISALLOW_COPY_AND_ASSIGN(InteractiveRenderWidget);
75 }; 97 };
76 98
77 TEST_F(RenderWidgetUnittest, TouchHitTestSinglePoint) { 99 TEST_F(RenderWidgetUnittest, TouchHitTestSinglePoint) {
78 scoped_refptr<TouchableRenderWidget> widget = new TouchableRenderWidget(); 100 scoped_refptr<InteractiveRenderWidget> widget = new InteractiveRenderWidget();
79 101
80 SyntheticWebTouchEvent touch; 102 SyntheticWebTouchEvent touch;
81 touch.PressPoint(10, 10); 103 touch.PressPoint(10, 10);
82 104
83 widget->SendInputEvent(touch); 105 widget->SendInputEvent(touch);
84 ASSERT_EQ(1u, widget->sink()->message_count()); 106 ASSERT_EQ(1u, widget->sink()->message_count());
85 107
86 // Since there's currently no touch-event handling region, the response should 108 // Since there's currently no touch-event handling region, the response should
87 // be 'no consumer exists'. 109 // be 'no consumer exists'.
88 const IPC::Message* message = widget->sink()->GetMessageAt(0); 110 const IPC::Message* message = widget->sink()->GetMessageAt(0);
(...skipping 13 matching lines...) Expand all
102 ASSERT_EQ(1u, widget->sink()->message_count()); 124 ASSERT_EQ(1u, widget->sink()->message_count());
103 message = widget->sink()->GetMessageAt(0); 125 message = widget->sink()->GetMessageAt(0);
104 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); 126 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type());
105 InputHostMsg_HandleInputEvent_ACK::Read(message, &params); 127 InputHostMsg_HandleInputEvent_ACK::Read(message, &params);
106 ack_state = base::get<0>(params).state; 128 ack_state = base::get<0>(params).state;
107 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_state); 129 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_state);
108 widget->sink()->ClearMessages(); 130 widget->sink()->ClearMessages();
109 } 131 }
110 132
111 TEST_F(RenderWidgetUnittest, TouchHitTestMultiplePoints) { 133 TEST_F(RenderWidgetUnittest, TouchHitTestMultiplePoints) {
112 scoped_refptr<TouchableRenderWidget> widget = new TouchableRenderWidget(); 134 scoped_refptr<InteractiveRenderWidget> widget = new InteractiveRenderWidget();
113 std::vector<gfx::Rect> rects; 135 std::vector<gfx::Rect> rects;
114 rects.push_back(gfx::Rect(0, 0, 20, 20)); 136 rects.push_back(gfx::Rect(0, 0, 20, 20));
115 rects.push_back(gfx::Rect(25, 0, 10, 10)); 137 rects.push_back(gfx::Rect(25, 0, 10, 10));
116 widget->SetTouchRegion(rects); 138 widget->SetTouchRegion(rects);
117 139
118 SyntheticWebTouchEvent touch; 140 SyntheticWebTouchEvent touch;
119 touch.PressPoint(25, 25); 141 touch.PressPoint(25, 25);
120 142
121 widget->SendInputEvent(touch); 143 widget->SendInputEvent(touch);
122 ASSERT_EQ(1u, widget->sink()->message_count()); 144 ASSERT_EQ(1u, widget->sink()->message_count());
(...skipping 13 matching lines...) Expand all
136 widget->SendInputEvent(touch); 158 widget->SendInputEvent(touch);
137 ASSERT_EQ(1u, widget->sink()->message_count()); 159 ASSERT_EQ(1u, widget->sink()->message_count());
138 message = widget->sink()->GetMessageAt(0); 160 message = widget->sink()->GetMessageAt(0);
139 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); 161 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type());
140 InputHostMsg_HandleInputEvent_ACK::Read(message, &params); 162 InputHostMsg_HandleInputEvent_ACK::Read(message, &params);
141 ack_state = base::get<0>(params).state; 163 ack_state = base::get<0>(params).state;
142 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_state); 164 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_state);
143 widget->sink()->ClearMessages(); 165 widget->sink()->ClearMessages();
144 } 166 }
145 167
168 TEST_F(RenderWidgetUnittest, EventOverscroll) {
169 scoped_refptr<InteractiveRenderWidget> widget = new InteractiveRenderWidget();
170 widget->set_always_overscroll(true);
171
172 blink::WebGestureEvent scroll;
173 scroll.type = blink::WebInputEvent::GestureScrollUpdate;
174 scroll.x = -10;
175 scroll.data.scrollUpdate.deltaY = 10;
176 widget->SendInputEvent(scroll);
177
178 // Overscroll notifications received while handling an input event should
179 // be bundled with the event ack IPC.
180 ASSERT_EQ(1u, widget->sink()->message_count());
181 const IPC::Message* message = widget->sink()->GetMessageAt(0);
182 ASSERT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type());
183 InputHostMsg_HandleInputEvent_ACK::Param params;
184 InputHostMsg_HandleInputEvent_ACK::Read(message, &params);
185 const InputEventAck& ack = base::get<0>(params);
186 ASSERT_EQ(ack.type, scroll.type);
187 ASSERT_TRUE(ack.overscroll);
188 EXPECT_EQ(gfx::Vector2dF(0, 10), ack.overscroll->accumulated_overscroll);
189 EXPECT_EQ(gfx::Vector2dF(0, 10), ack.overscroll->latest_overscroll_delta);
190 EXPECT_EQ(gfx::Vector2dF(), ack.overscroll->current_fling_velocity);
191 EXPECT_EQ(gfx::PointF(-10, 0), ack.overscroll->causal_event_viewport_point);
192 widget->sink()->ClearMessages();
193 }
194
195 TEST_F(RenderWidgetUnittest, FlingOverscroll) {
196 scoped_refptr<InteractiveRenderWidget> widget = new InteractiveRenderWidget();
197
198 // Overscroll notifications received outside of handling an input event should
199 // be sent as a separate IPC.
200 widget->didOverscroll(blink::WebFloatSize(10, 5), blink::WebFloatSize(5, 5),
201 blink::WebFloatPoint(1, 1), blink::WebFloatSize(10, 5));
202 ASSERT_EQ(1u, widget->sink()->message_count());
203 const IPC::Message* message = widget->sink()->GetMessageAt(0);
204 ASSERT_EQ(InputHostMsg_DidOverscroll::ID, message->type());
205 InputHostMsg_DidOverscroll::Param params;
206 InputHostMsg_DidOverscroll::Read(message, &params);
207 const DidOverscrollParams& overscroll = base::get<0>(params);
208 EXPECT_EQ(gfx::Vector2dF(10, 5), overscroll.latest_overscroll_delta);
209 EXPECT_EQ(gfx::Vector2dF(5, 5), overscroll.accumulated_overscroll);
210 EXPECT_EQ(gfx::PointF(1, 1), overscroll.causal_event_viewport_point);
211 EXPECT_EQ(gfx::Vector2dF(-10, -5), overscroll.current_fling_velocity);
212 widget->sink()->ClearMessages();
213 }
214
146 } // namespace content 215 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_widget.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698