| Index: content/browser/renderer_host/input/immediate_input_router_unittest.cc
 | 
| diff --git a/content/browser/renderer_host/input/immediate_input_router_unittest.cc b/content/browser/renderer_host/input/immediate_input_router_unittest.cc
 | 
| index 8a74565d7f499dcce0854b948f9b98edf19f01ea..b8d6981102172a86b4c4f83025b062465d1b292d 100644
 | 
| --- a/content/browser/renderer_host/input/immediate_input_router_unittest.cc
 | 
| +++ b/content/browser/renderer_host/input/immediate_input_router_unittest.cc
 | 
| @@ -141,8 +141,8 @@ class ImmediateInputRouterTest : public InputRouterTest {
 | 
|      input_router()->enable_no_touch_to_renderer_while_scrolling_ = true;
 | 
|    }
 | 
|  
 | 
| -  bool no_touch_move_to_renderer() {
 | 
| -    return input_router()->touch_event_queue()->no_touch_move_to_renderer();
 | 
| +  bool no_touch_to_renderer() {
 | 
| +    return input_router()->touch_event_queue()->no_touch_to_renderer();
 | 
|    }
 | 
|  
 | 
|    bool TouchEventQueueEmpty() const {
 | 
| @@ -1314,8 +1314,8 @@ TEST_F(ImmediateInputRouterTest, UnhandledWheelEvent) {
 | 
|    EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5);
 | 
|  }
 | 
|  
 | 
| -// Tests that no touch move events are sent to renderer during scrolling.
 | 
| -TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) {
 | 
| +// Tests that no touch events are sent to renderer during scrolling.
 | 
| +TEST_F(ImmediateInputRouterTest, NoTouchWhileScroll) {
 | 
|    EnableNoTouchToRendererWhileScrolling();
 | 
|    set_debounce_interval_time_ms(0);
 | 
|    input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
 | 
| @@ -1328,22 +1328,64 @@ TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) {
 | 
|    process_->sink().ClearMessages();
 | 
|    SendInputEventACK(WebInputEvent::TouchStart,
 | 
|                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 | 
| +  ack_handler_->ExpectAckCalled(1);
 | 
|  
 | 
|    // Touch move will trigger scroll.
 | 
|    MoveTouchPoint(0, 20, 5);
 | 
|    SendTouchEvent();
 | 
|    EXPECT_EQ(1U, process_->sink().message_count());
 | 
|    process_->sink().ClearMessages();
 | 
| +
 | 
| +  // A second touch press.
 | 
| +  PressTouchPoint(20, 20);
 | 
| +  SendTouchEvent();
 | 
| +  // This TouchStart is queued.
 | 
| +  EXPECT_EQ(0U, process_->sink().message_count());
 | 
| +  process_->sink().ClearMessages();
 | 
| +
 | 
| +  WebGestureEvent followup_scroll;
 | 
| +  followup_scroll.type = WebInputEvent::GestureScrollBegin;
 | 
| +  ack_handler_->set_followup_touch_event(make_scoped_ptr(
 | 
| +      new GestureEventWithLatencyInfo(followup_scroll, ui::LatencyInfo())));
 | 
| +
 | 
|    SendInputEventACK(WebInputEvent::TouchMove,
 | 
|                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 | 
| +  ack_handler_->ExpectAckCalled(1);
 | 
| +  // GestureScroll inserts touch cancel into the queue before the touch start.
 | 
| +  // ScrollBegin is sent first, then the TouchCancel.
 | 
| +  EXPECT_EQ(2U, process_->sink().message_count());
 | 
| +  const WebInputEvent* input_event =
 | 
| +      GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
 | 
| +  EXPECT_EQ(WebInputEvent::GestureScrollBegin, input_event->type);
 | 
| +  input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(1));
 | 
| +  EXPECT_EQ(WebInputEvent::TouchCancel, input_event->type);
 | 
| +  EXPECT_TRUE(no_touch_to_renderer());
 | 
| +  process_->sink().ClearMessages();
 | 
|  
 | 
| -  SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
 | 
| -                       WebGestureEvent::Touchscreen);
 | 
| -  EXPECT_EQ(1U, process_->sink().message_count());
 | 
| -  EXPECT_TRUE(no_touch_move_to_renderer());
 | 
| +  // Clear the followup events since now the touch events are directly
 | 
| +  // sent to client, instead of being sent to renderer and waiting for
 | 
| +  // ack. So we should use SimulateGestureScrollUpdateEvent() instead of
 | 
| +  // followup gesture events.
 | 
| +  ack_handler_->set_followup_touch_event(make_scoped_ptr(
 | 
| +      static_cast<GestureEventWithLatencyInfo*>(NULL)));
 | 
| +
 | 
| +  // Ack the TouchCancel will result in the next TouchStart to be dispatched
 | 
| +  // to client.
 | 
| +  SendInputEventACK(WebInputEvent::TouchCancel,
 | 
| +                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 | 
| +  // The touch cancel does not reach client, only the touch start.
 | 
| +  ack_handler_->ExpectAckCalled(1);
 | 
| +  EXPECT_EQ(WebInputEvent::TouchStart,
 | 
| +            ack_handler_->acked_touch_event().event.type);
 | 
| +  // No touch to renderer.
 | 
| +  EXPECT_EQ(0U, process_->sink().message_count());
 | 
|    process_->sink().ClearMessages();
 | 
| +
 | 
|    SendInputEventACK(WebInputEvent::GestureScrollBegin,
 | 
|                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 | 
| +  ack_handler_->ExpectAckCalled(1);
 | 
| +  EXPECT_EQ(0U, process_->sink().message_count());
 | 
| +  process_->sink().ClearMessages();
 | 
|  
 | 
|    // Touch move should not be sent to renderer.
 | 
|    MoveTouchPoint(0, 30, 5);
 | 
| @@ -1353,30 +1395,21 @@ TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) {
 | 
|  
 | 
|    // Touch moves become ScrollUpdate.
 | 
|    SimulateGestureScrollUpdateEvent(20, 4, 0);
 | 
| -  EXPECT_TRUE(no_touch_move_to_renderer());
 | 
|    process_->sink().ClearMessages();
 | 
|    SendInputEventACK(WebInputEvent::GestureScrollUpdate,
 | 
|                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 | 
|  
 | 
| -  // Touch move should not be sent to renderer.
 | 
| -  MoveTouchPoint(0, 65, 10);
 | 
| -  SendTouchEvent();
 | 
| -  EXPECT_EQ(0U, process_->sink().message_count());
 | 
| -  process_->sink().ClearMessages();
 | 
| -
 | 
| -  // Touch end should still be sent to renderer.
 | 
| +  // Touch end should not be sent to renderer.
 | 
|    ReleaseTouchPoint(0);
 | 
|    SendTouchEvent();
 | 
| -  EXPECT_EQ(1U, process_->sink().message_count());
 | 
| +  EXPECT_EQ(0U, process_->sink().message_count());
 | 
|    process_->sink().ClearMessages();
 | 
| -  SendInputEventACK(WebInputEvent::TouchEnd,
 | 
| -                    INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 | 
|  
 | 
|    // On GestureScrollEnd, resume sending touch moves to renderer.
 | 
|    SimulateGestureEvent(WebKit::WebInputEvent::GestureScrollEnd,
 | 
|                         WebGestureEvent::Touchscreen);
 | 
|    EXPECT_EQ(1U, process_->sink().message_count());
 | 
| -  EXPECT_FALSE(no_touch_move_to_renderer());
 | 
| +  EXPECT_FALSE(no_touch_to_renderer());
 | 
|    process_->sink().ClearMessages();
 | 
|    SendInputEventACK(WebInputEvent::GestureScrollEnd,
 | 
|                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 | 
| 
 |