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

Side by Side Diff: content/browser/renderer_host/input/immediate_input_router_unittest.cc

Issue 23856016: Send touch cancel to renderer when scrolling starts (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebase Created 7 years, 2 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
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 "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/memory/scoped_ptr.h" 6 #include "base/memory/scoped_ptr.h"
7 #include "base/strings/utf_string_conversions.h" 7 #include "base/strings/utf_string_conversions.h"
8 #include "content/browser/renderer_host/input/gesture_event_filter.h" 8 #include "content/browser/renderer_host/input/gesture_event_filter.h"
9 #include "content/browser/renderer_host/input/immediate_input_router.h" 9 #include "content/browser/renderer_host/input/immediate_input_router.h"
10 #include "content/browser/renderer_host/input/input_router_client.h" 10 #include "content/browser/renderer_host/input/input_router_client.h"
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 } 134 }
135 135
136 void set_maximum_tap_gap_time_ms(int delay_ms) { 136 void set_maximum_tap_gap_time_ms(int delay_ms) {
137 input_router()->gesture_event_filter()->maximum_tap_gap_time_ms_ = delay_ms; 137 input_router()->gesture_event_filter()->maximum_tap_gap_time_ms_ = delay_ms;
138 } 138 }
139 139
140 void EnableNoTouchToRendererWhileScrolling() { 140 void EnableNoTouchToRendererWhileScrolling() {
141 input_router()->enable_no_touch_to_renderer_while_scrolling_ = true; 141 input_router()->enable_no_touch_to_renderer_while_scrolling_ = true;
142 } 142 }
143 143
144 bool no_touch_move_to_renderer() { 144 bool no_touch_to_renderer() {
145 return input_router()->touch_event_queue()->no_touch_move_to_renderer(); 145 return input_router()->touch_event_queue()->no_touch_to_renderer();
146 } 146 }
147 147
148 bool TouchEventQueueEmpty() const { 148 bool TouchEventQueueEmpty() const {
149 return input_router()->touch_event_queue()->empty(); 149 return input_router()->touch_event_queue()->empty();
150 } 150 }
151 151
152 unsigned GestureEventLastQueueEventSize() { 152 unsigned GestureEventLastQueueEventSize() {
153 return gesture_event_filter()->coalesced_gesture_events_.size(); 153 return gesture_event_filter()->coalesced_gesture_events_.size();
154 } 154 }
155 155
(...skipping 1151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1307 // Check that the second event was sent. 1307 // Check that the second event was sent.
1308 EXPECT_EQ(1U, process_->sink().message_count()); 1308 EXPECT_EQ(1U, process_->sink().message_count());
1309 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 1309 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
1310 InputMsg_HandleInputEvent::ID)); 1310 InputMsg_HandleInputEvent::ID));
1311 process_->sink().ClearMessages(); 1311 process_->sink().ClearMessages();
1312 1312
1313 // Check that the correct unhandled wheel event was received. 1313 // Check that the correct unhandled wheel event was received.
1314 EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5); 1314 EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5);
1315 } 1315 }
1316 1316
1317 // Tests that no touch move events are sent to renderer during scrolling. 1317 // Tests that no touch events are sent to renderer during scrolling.
1318 TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) { 1318 TEST_F(ImmediateInputRouterTest, NoTouchWhileScroll) {
1319 EnableNoTouchToRendererWhileScrolling(); 1319 EnableNoTouchToRendererWhileScrolling();
1320 set_debounce_interval_time_ms(0); 1320 set_debounce_interval_time_ms(0);
1321 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); 1321 input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
1322 process_->sink().ClearMessages(); 1322 process_->sink().ClearMessages();
1323 1323
1324 // First touch press. 1324 // First touch press.
1325 PressTouchPoint(0, 1); 1325 PressTouchPoint(0, 1);
1326 SendTouchEvent(); 1326 SendTouchEvent();
1327 EXPECT_EQ(1U, process_->sink().message_count()); 1327 EXPECT_EQ(1U, process_->sink().message_count());
1328 process_->sink().ClearMessages(); 1328 process_->sink().ClearMessages();
1329 SendInputEventACK(WebInputEvent::TouchStart, 1329 SendInputEventACK(WebInputEvent::TouchStart,
1330 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1330 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1331 ack_handler_->ExpectAckCalled(1);
1331 1332
1332 // Touch move will trigger scroll. 1333 // Touch move will trigger scroll.
1333 MoveTouchPoint(0, 20, 5); 1334 MoveTouchPoint(0, 20, 5);
1334 SendTouchEvent(); 1335 SendTouchEvent();
1335 EXPECT_EQ(1U, process_->sink().message_count()); 1336 EXPECT_EQ(1U, process_->sink().message_count());
1336 process_->sink().ClearMessages(); 1337 process_->sink().ClearMessages();
1338
1339 // A second touch press.
1340 PressTouchPoint(20, 20);
1341 SendTouchEvent();
1342 // This TouchStart is queued.
1343 EXPECT_EQ(0U, process_->sink().message_count());
1344 process_->sink().ClearMessages();
1345
1346 WebGestureEvent followup_scroll;
1347 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1348 ack_handler_->set_followup_touch_event(make_scoped_ptr(
1349 new GestureEventWithLatencyInfo(followup_scroll, ui::LatencyInfo())));
1350
1337 SendInputEventACK(WebInputEvent::TouchMove, 1351 SendInputEventACK(WebInputEvent::TouchMove,
1338 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1352 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1353 ack_handler_->ExpectAckCalled(1);
1354 // GestureScroll inserts touch cancel into the queue before the touch start.
1355 // ScrollBegin is sent first, then the TouchCancel.
1356 EXPECT_EQ(2U, process_->sink().message_count());
1357 const WebInputEvent* input_event =
1358 GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
1359 EXPECT_EQ(WebInputEvent::GestureScrollBegin, input_event->type);
1360 input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(1));
1361 EXPECT_EQ(WebInputEvent::TouchCancel, input_event->type);
1362 EXPECT_TRUE(no_touch_to_renderer());
1363 process_->sink().ClearMessages();
1339 1364
1340 SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 1365 // Clear the followup events since now the touch events are directly
1341 WebGestureEvent::Touchscreen); 1366 // sent to client, instead of being sent to renderer and waiting for
1342 EXPECT_EQ(1U, process_->sink().message_count()); 1367 // ack. So we should use SimulateGestureScrollUpdateEvent() instead of
1343 EXPECT_TRUE(no_touch_move_to_renderer()); 1368 // followup gesture events.
1369 ack_handler_->set_followup_touch_event(make_scoped_ptr(
1370 static_cast<GestureEventWithLatencyInfo*>(NULL)));
1371
1372 // Ack the TouchCancel will result in the next TouchStart to be dispatched
1373 // to client.
1374 SendInputEventACK(WebInputEvent::TouchCancel,
1375 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1376 // The touch cancel does not reach client, only the touch start.
1377 ack_handler_->ExpectAckCalled(1);
1378 EXPECT_EQ(WebInputEvent::TouchStart,
1379 ack_handler_->acked_touch_event().event.type);
1380 // No touch to renderer.
1381 EXPECT_EQ(0U, process_->sink().message_count());
1344 process_->sink().ClearMessages(); 1382 process_->sink().ClearMessages();
1383
1345 SendInputEventACK(WebInputEvent::GestureScrollBegin, 1384 SendInputEventACK(WebInputEvent::GestureScrollBegin,
1346 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1385 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1386 ack_handler_->ExpectAckCalled(1);
1387 EXPECT_EQ(0U, process_->sink().message_count());
1388 process_->sink().ClearMessages();
1347 1389
1348 // Touch move should not be sent to renderer. 1390 // Touch move should not be sent to renderer.
1349 MoveTouchPoint(0, 30, 5); 1391 MoveTouchPoint(0, 30, 5);
1350 SendTouchEvent(); 1392 SendTouchEvent();
1351 EXPECT_EQ(0U, process_->sink().message_count()); 1393 EXPECT_EQ(0U, process_->sink().message_count());
1352 process_->sink().ClearMessages(); 1394 process_->sink().ClearMessages();
1353 1395
1354 // Touch moves become ScrollUpdate. 1396 // Touch moves become ScrollUpdate.
1355 SimulateGestureScrollUpdateEvent(20, 4, 0); 1397 SimulateGestureScrollUpdateEvent(20, 4, 0);
1356 EXPECT_TRUE(no_touch_move_to_renderer());
1357 process_->sink().ClearMessages(); 1398 process_->sink().ClearMessages();
1358 SendInputEventACK(WebInputEvent::GestureScrollUpdate, 1399 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
1359 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1400 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1360 1401
1361 // Touch move should not be sent to renderer. 1402 // Touch end should not be sent to renderer.
1362 MoveTouchPoint(0, 65, 10); 1403 ReleaseTouchPoint(0);
1363 SendTouchEvent(); 1404 SendTouchEvent();
1364 EXPECT_EQ(0U, process_->sink().message_count()); 1405 EXPECT_EQ(0U, process_->sink().message_count());
1365 process_->sink().ClearMessages(); 1406 process_->sink().ClearMessages();
1366 1407
1367 // Touch end should still be sent to renderer.
1368 ReleaseTouchPoint(0);
1369 SendTouchEvent();
1370 EXPECT_EQ(1U, process_->sink().message_count());
1371 process_->sink().ClearMessages();
1372 SendInputEventACK(WebInputEvent::TouchEnd,
1373 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1374
1375 // On GestureScrollEnd, resume sending touch moves to renderer. 1408 // On GestureScrollEnd, resume sending touch moves to renderer.
1376 SimulateGestureEvent(WebKit::WebInputEvent::GestureScrollEnd, 1409 SimulateGestureEvent(WebKit::WebInputEvent::GestureScrollEnd,
1377 WebGestureEvent::Touchscreen); 1410 WebGestureEvent::Touchscreen);
1378 EXPECT_EQ(1U, process_->sink().message_count()); 1411 EXPECT_EQ(1U, process_->sink().message_count());
1379 EXPECT_FALSE(no_touch_move_to_renderer()); 1412 EXPECT_FALSE(no_touch_to_renderer());
1380 process_->sink().ClearMessages(); 1413 process_->sink().ClearMessages();
1381 SendInputEventACK(WebInputEvent::GestureScrollEnd, 1414 SendInputEventACK(WebInputEvent::GestureScrollEnd,
1382 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1415 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1383 1416
1384 // Now touch events should come through to renderer. 1417 // Now touch events should come through to renderer.
1385 PressTouchPoint(80, 10); 1418 PressTouchPoint(80, 10);
1386 SendTouchEvent(); 1419 SendTouchEvent();
1387 EXPECT_EQ(1U, process_->sink().message_count()); 1420 EXPECT_EQ(1U, process_->sink().message_count());
1388 process_->sink().ClearMessages(); 1421 process_->sink().ClearMessages();
1389 SendInputEventACK(WebInputEvent::TouchStart, 1422 SendInputEventACK(WebInputEvent::TouchStart,
1390 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1423 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1391 1424
1392 MoveTouchPoint(0, 80, 20); 1425 MoveTouchPoint(0, 80, 20);
1393 SendTouchEvent(); 1426 SendTouchEvent();
1394 EXPECT_EQ(1U, process_->sink().message_count()); 1427 EXPECT_EQ(1U, process_->sink().message_count());
1395 process_->sink().ClearMessages(); 1428 process_->sink().ClearMessages();
1396 SendInputEventACK(WebInputEvent::TouchMove, 1429 SendInputEventACK(WebInputEvent::TouchMove,
1397 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1430 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1398 1431
1399 ReleaseTouchPoint(0); 1432 ReleaseTouchPoint(0);
1400 SendTouchEvent(); 1433 SendTouchEvent();
1401 EXPECT_EQ(1U, process_->sink().message_count()); 1434 EXPECT_EQ(1U, process_->sink().message_count());
1402 process_->sink().ClearMessages(); 1435 process_->sink().ClearMessages();
1403 SendInputEventACK(WebInputEvent::TouchEnd, 1436 SendInputEventACK(WebInputEvent::TouchEnd,
1404 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 1437 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1405 } 1438 }
1406 } // namespace content 1439 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/input/immediate_input_router.cc ('k') | content/browser/renderer_host/input/touch_event_queue.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698