OLD | NEW |
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 <tuple> |
7 #include <vector> | 8 #include <vector> |
8 | 9 |
9 #include "base/macros.h" | 10 #include "base/macros.h" |
10 #include "base/test/histogram_tester.h" | 11 #include "base/test/histogram_tester.h" |
11 #include "content/common/input/synthetic_web_input_event_builders.h" | 12 #include "content/common/input/synthetic_web_input_event_builders.h" |
12 #include "content/common/input/web_input_event_traits.h" | 13 #include "content/common/input/web_input_event_traits.h" |
13 #include "content/common/input_messages.h" | 14 #include "content/common/input_messages.h" |
14 #include "content/public/test/mock_render_thread.h" | 15 #include "content/public/test/mock_render_thread.h" |
15 #include "content/test/fake_compositor_dependencies.h" | 16 #include "content/test/fake_compositor_dependencies.h" |
16 #include "content/test/mock_render_process.h" | 17 #include "content/test/mock_render_process.h" |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 | 161 |
161 widget()->SendInputEvent(touch); | 162 widget()->SendInputEvent(touch); |
162 ASSERT_EQ(1u, widget()->sink()->message_count()); | 163 ASSERT_EQ(1u, widget()->sink()->message_count()); |
163 | 164 |
164 // Since there's currently no touch-event handling region, the response should | 165 // Since there's currently no touch-event handling region, the response should |
165 // be 'no consumer exists'. | 166 // be 'no consumer exists'. |
166 const IPC::Message* message = widget()->sink()->GetMessageAt(0); | 167 const IPC::Message* message = widget()->sink()->GetMessageAt(0); |
167 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); | 168 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); |
168 InputHostMsg_HandleInputEvent_ACK::Param params; | 169 InputHostMsg_HandleInputEvent_ACK::Param params; |
169 InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); | 170 InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); |
170 InputEventAckState ack_state = base::get<0>(params).state; | 171 InputEventAckState ack_state = std::get<0>(params).state; |
171 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, ack_state); | 172 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, ack_state); |
172 widget()->sink()->ClearMessages(); | 173 widget()->sink()->ClearMessages(); |
173 | 174 |
174 std::vector<gfx::Rect> rects; | 175 std::vector<gfx::Rect> rects; |
175 rects.push_back(gfx::Rect(0, 0, 20, 20)); | 176 rects.push_back(gfx::Rect(0, 0, 20, 20)); |
176 rects.push_back(gfx::Rect(25, 0, 10, 10)); | 177 rects.push_back(gfx::Rect(25, 0, 10, 10)); |
177 widget()->SetTouchRegion(rects); | 178 widget()->SetTouchRegion(rects); |
178 | 179 |
179 EXPECT_CALL(*widget()->mock_webwidget(), handleInputEvent(_)) | 180 EXPECT_CALL(*widget()->mock_webwidget(), handleInputEvent(_)) |
180 .WillRepeatedly( | 181 .WillRepeatedly( |
181 ::testing::Return(blink::WebInputEventResult::NotHandled)); | 182 ::testing::Return(blink::WebInputEventResult::NotHandled)); |
182 | 183 |
183 widget()->SendInputEvent(touch); | 184 widget()->SendInputEvent(touch); |
184 ASSERT_EQ(1u, widget()->sink()->message_count()); | 185 ASSERT_EQ(1u, widget()->sink()->message_count()); |
185 message = widget()->sink()->GetMessageAt(0); | 186 message = widget()->sink()->GetMessageAt(0); |
186 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); | 187 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); |
187 InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); | 188 InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); |
188 ack_state = base::get<0>(params).state; | 189 ack_state = std::get<0>(params).state; |
189 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_state); | 190 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_state); |
190 widget()->sink()->ClearMessages(); | 191 widget()->sink()->ClearMessages(); |
191 } | 192 } |
192 | 193 |
193 TEST_F(RenderWidgetUnittest, TouchHitTestMultiplePoints) { | 194 TEST_F(RenderWidgetUnittest, TouchHitTestMultiplePoints) { |
194 std::vector<gfx::Rect> rects; | 195 std::vector<gfx::Rect> rects; |
195 rects.push_back(gfx::Rect(0, 0, 20, 20)); | 196 rects.push_back(gfx::Rect(0, 0, 20, 20)); |
196 rects.push_back(gfx::Rect(25, 0, 10, 10)); | 197 rects.push_back(gfx::Rect(25, 0, 10, 10)); |
197 widget()->SetTouchRegion(rects); | 198 widget()->SetTouchRegion(rects); |
198 | 199 |
199 SyntheticWebTouchEvent touch; | 200 SyntheticWebTouchEvent touch; |
200 touch.PressPoint(25, 25); | 201 touch.PressPoint(25, 25); |
201 | 202 |
202 EXPECT_CALL(*widget()->mock_webwidget(), handleInputEvent(_)) | 203 EXPECT_CALL(*widget()->mock_webwidget(), handleInputEvent(_)) |
203 .WillRepeatedly( | 204 .WillRepeatedly( |
204 ::testing::Return(blink::WebInputEventResult::NotHandled)); | 205 ::testing::Return(blink::WebInputEventResult::NotHandled)); |
205 | 206 |
206 widget()->SendInputEvent(touch); | 207 widget()->SendInputEvent(touch); |
207 ASSERT_EQ(1u, widget()->sink()->message_count()); | 208 ASSERT_EQ(1u, widget()->sink()->message_count()); |
208 | 209 |
209 // Since there's currently no touch-event handling region, the response should | 210 // Since there's currently no touch-event handling region, the response should |
210 // be 'no consumer exists'. | 211 // be 'no consumer exists'. |
211 const IPC::Message* message = widget()->sink()->GetMessageAt(0); | 212 const IPC::Message* message = widget()->sink()->GetMessageAt(0); |
212 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); | 213 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); |
213 InputHostMsg_HandleInputEvent_ACK::Param params; | 214 InputHostMsg_HandleInputEvent_ACK::Param params; |
214 InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); | 215 InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); |
215 InputEventAckState ack_state = base::get<0>(params).state; | 216 InputEventAckState ack_state = std::get<0>(params).state; |
216 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, ack_state); | 217 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, ack_state); |
217 widget()->sink()->ClearMessages(); | 218 widget()->sink()->ClearMessages(); |
218 | 219 |
219 // Press a second touch point. This time, on a touch-handling region. | 220 // Press a second touch point. This time, on a touch-handling region. |
220 touch.PressPoint(10, 10); | 221 touch.PressPoint(10, 10); |
221 widget()->SendInputEvent(touch); | 222 widget()->SendInputEvent(touch); |
222 ASSERT_EQ(1u, widget()->sink()->message_count()); | 223 ASSERT_EQ(1u, widget()->sink()->message_count()); |
223 message = widget()->sink()->GetMessageAt(0); | 224 message = widget()->sink()->GetMessageAt(0); |
224 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); | 225 EXPECT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); |
225 InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); | 226 InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); |
226 ack_state = base::get<0>(params).state; | 227 ack_state = std::get<0>(params).state; |
227 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_state); | 228 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_state); |
228 widget()->sink()->ClearMessages(); | 229 widget()->sink()->ClearMessages(); |
229 } | 230 } |
230 | 231 |
231 TEST_F(RenderWidgetUnittest, EventOverscroll) { | 232 TEST_F(RenderWidgetUnittest, EventOverscroll) { |
232 widget()->set_always_overscroll(true); | 233 widget()->set_always_overscroll(true); |
233 | 234 |
234 EXPECT_CALL(*widget()->mock_webwidget(), handleInputEvent(_)) | 235 EXPECT_CALL(*widget()->mock_webwidget(), handleInputEvent(_)) |
235 .WillRepeatedly( | 236 .WillRepeatedly( |
236 ::testing::Return(blink::WebInputEventResult::NotHandled)); | 237 ::testing::Return(blink::WebInputEventResult::NotHandled)); |
237 | 238 |
238 blink::WebGestureEvent scroll; | 239 blink::WebGestureEvent scroll; |
239 scroll.type = blink::WebInputEvent::GestureScrollUpdate; | 240 scroll.type = blink::WebInputEvent::GestureScrollUpdate; |
240 scroll.x = -10; | 241 scroll.x = -10; |
241 scroll.data.scrollUpdate.deltaY = 10; | 242 scroll.data.scrollUpdate.deltaY = 10; |
242 widget()->SendInputEvent(scroll); | 243 widget()->SendInputEvent(scroll); |
243 | 244 |
244 // Overscroll notifications received while handling an input event should | 245 // Overscroll notifications received while handling an input event should |
245 // be bundled with the event ack IPC. | 246 // be bundled with the event ack IPC. |
246 ASSERT_EQ(1u, widget()->sink()->message_count()); | 247 ASSERT_EQ(1u, widget()->sink()->message_count()); |
247 const IPC::Message* message = widget()->sink()->GetMessageAt(0); | 248 const IPC::Message* message = widget()->sink()->GetMessageAt(0); |
248 ASSERT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); | 249 ASSERT_EQ(InputHostMsg_HandleInputEvent_ACK::ID, message->type()); |
249 InputHostMsg_HandleInputEvent_ACK::Param params; | 250 InputHostMsg_HandleInputEvent_ACK::Param params; |
250 InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); | 251 InputHostMsg_HandleInputEvent_ACK::Read(message, ¶ms); |
251 const InputEventAck& ack = base::get<0>(params); | 252 const InputEventAck& ack = std::get<0>(params); |
252 ASSERT_EQ(ack.type, scroll.type); | 253 ASSERT_EQ(ack.type, scroll.type); |
253 ASSERT_TRUE(ack.overscroll); | 254 ASSERT_TRUE(ack.overscroll); |
254 EXPECT_EQ(gfx::Vector2dF(0, 10), ack.overscroll->accumulated_overscroll); | 255 EXPECT_EQ(gfx::Vector2dF(0, 10), ack.overscroll->accumulated_overscroll); |
255 EXPECT_EQ(gfx::Vector2dF(0, 10), ack.overscroll->latest_overscroll_delta); | 256 EXPECT_EQ(gfx::Vector2dF(0, 10), ack.overscroll->latest_overscroll_delta); |
256 EXPECT_EQ(gfx::Vector2dF(), ack.overscroll->current_fling_velocity); | 257 EXPECT_EQ(gfx::Vector2dF(), ack.overscroll->current_fling_velocity); |
257 EXPECT_EQ(gfx::PointF(-10, 0), ack.overscroll->causal_event_viewport_point); | 258 EXPECT_EQ(gfx::PointF(-10, 0), ack.overscroll->causal_event_viewport_point); |
258 widget()->sink()->ClearMessages(); | 259 widget()->sink()->ClearMessages(); |
259 } | 260 } |
260 | 261 |
261 TEST_F(RenderWidgetUnittest, FlingOverscroll) { | 262 TEST_F(RenderWidgetUnittest, FlingOverscroll) { |
262 // Overscroll notifications received outside of handling an input event should | 263 // Overscroll notifications received outside of handling an input event should |
263 // be sent as a separate IPC. | 264 // be sent as a separate IPC. |
264 widget()->didOverscroll(blink::WebFloatSize(10, 5), blink::WebFloatSize(5, 5), | 265 widget()->didOverscroll(blink::WebFloatSize(10, 5), blink::WebFloatSize(5, 5), |
265 blink::WebFloatPoint(1, 1), | 266 blink::WebFloatPoint(1, 1), |
266 blink::WebFloatSize(10, 5)); | 267 blink::WebFloatSize(10, 5)); |
267 ASSERT_EQ(1u, widget()->sink()->message_count()); | 268 ASSERT_EQ(1u, widget()->sink()->message_count()); |
268 const IPC::Message* message = widget()->sink()->GetMessageAt(0); | 269 const IPC::Message* message = widget()->sink()->GetMessageAt(0); |
269 ASSERT_EQ(InputHostMsg_DidOverscroll::ID, message->type()); | 270 ASSERT_EQ(InputHostMsg_DidOverscroll::ID, message->type()); |
270 InputHostMsg_DidOverscroll::Param params; | 271 InputHostMsg_DidOverscroll::Param params; |
271 InputHostMsg_DidOverscroll::Read(message, ¶ms); | 272 InputHostMsg_DidOverscroll::Read(message, ¶ms); |
272 const DidOverscrollParams& overscroll = base::get<0>(params); | 273 const DidOverscrollParams& overscroll = std::get<0>(params); |
273 EXPECT_EQ(gfx::Vector2dF(10, 5), overscroll.latest_overscroll_delta); | 274 EXPECT_EQ(gfx::Vector2dF(10, 5), overscroll.latest_overscroll_delta); |
274 EXPECT_EQ(gfx::Vector2dF(5, 5), overscroll.accumulated_overscroll); | 275 EXPECT_EQ(gfx::Vector2dF(5, 5), overscroll.accumulated_overscroll); |
275 EXPECT_EQ(gfx::PointF(1, 1), overscroll.causal_event_viewport_point); | 276 EXPECT_EQ(gfx::PointF(1, 1), overscroll.causal_event_viewport_point); |
276 EXPECT_EQ(gfx::Vector2dF(-10, -5), overscroll.current_fling_velocity); | 277 EXPECT_EQ(gfx::Vector2dF(-10, -5), overscroll.current_fling_velocity); |
277 widget()->sink()->ClearMessages(); | 278 widget()->sink()->ClearMessages(); |
278 } | 279 } |
279 | 280 |
280 TEST_F(RenderWidgetUnittest, RenderWidgetInputEventUmaMetrics) { | 281 TEST_F(RenderWidgetUnittest, RenderWidgetInputEventUmaMetrics) { |
281 SyntheticWebTouchEvent touch; | 282 SyntheticWebTouchEvent touch; |
282 touch.PressPoint(10, 10); | 283 touch.PressPoint(10, 10); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 histogram_tester().ExpectTotalCount( | 342 histogram_tester().ExpectTotalCount( |
342 "Event.Touch.TouchStartLatencyDuringFling", 1); | 343 "Event.Touch.TouchStartLatencyDuringFling", 1); |
343 | 344 |
344 touch.dispatchedDuringFling = false; | 345 touch.dispatchedDuringFling = false; |
345 widget()->SendInputEvent(touch); | 346 widget()->SendInputEvent(touch); |
346 histogram_tester().ExpectTotalCount( | 347 histogram_tester().ExpectTotalCount( |
347 "Event.Touch.TouchStartLatencyOutsideFling", 1); | 348 "Event.Touch.TouchStartLatencyOutsideFling", 1); |
348 } | 349 } |
349 | 350 |
350 } // namespace content | 351 } // namespace content |
OLD | NEW |