Index: content/browser/renderer_host/input/input_router_impl_unittest.cc |
diff --git a/content/browser/renderer_host/input/input_router_impl_unittest.cc b/content/browser/renderer_host/input/input_router_impl_unittest.cc |
index de00b479265e0b283cdd2dbce79dffdccd3256d8..e72e69107de412ef472f83a9924cec33fda0084b 100644 |
--- a/content/browser/renderer_host/input/input_router_impl_unittest.cc |
+++ b/content/browser/renderer_host/input/input_router_impl_unittest.cc |
@@ -2,6 +2,8 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <math.h> |
+ |
#include "base/basictypes.h" |
#include "base/command_line.h" |
#include "base/memory/scoped_ptr.h" |
@@ -129,6 +131,11 @@ bool EventListIsSubset(const ScopedVector<ui::TouchEvent>& subset, |
} |
#endif // defined(USE_AURA) |
+// Expected function used for converting pinch scales to deltaY values. |
+float PinchScaleToWheelDelta(float scale) { |
+ return 100.0 * log(scale); |
+} |
+ |
} // namespace |
class InputRouterImplTest : public testing::Test { |
@@ -206,15 +213,14 @@ class InputRouterImplTest : public testing::Test { |
SyntheticWebGestureEventBuilder::BuildScrollUpdate(dX, dY, modifiers)); |
} |
- void SimulateGesturePinchUpdateEvent(float scale, |
- float anchorX, |
- float anchorY, |
- int modifiers) { |
- SimulateGestureEvent( |
- SyntheticWebGestureEventBuilder::BuildPinchUpdate(scale, |
- anchorX, |
- anchorY, |
- modifiers)); |
+ void SimulateGesturePinchUpdateEvent( |
+ float scale, |
+ float anchorX, |
+ float anchorY, |
+ int modifiers, |
+ WebGestureEvent::SourceDevice sourceDevice) { |
+ SimulateGestureEvent(SyntheticWebGestureEventBuilder::BuildPinchUpdate( |
+ scale, anchorX, anchorY, modifiers, sourceDevice)); |
} |
void SimulateGestureFlingStartEvent( |
@@ -509,10 +515,21 @@ TEST_F(InputRouterImplTest, CoalescesWheelEvents) { |
SimulateWheelEvent(0, -10, 0, false); // enqueued |
SimulateWheelEvent(8, -6, 0, false); // coalesced into previous event |
SimulateWheelEvent(9, -7, 1, false); // enqueued, different modifiers |
+ SimulateWheelEvent(0, -10, 0, false); // enqueued, different modifiers |
+ // Explicitly verify that PhaseEnd isn't coalesced to avoid bugs like |
+ // https://crbug.com/154740. |
+ SimulateWheelEventWithPhase(WebMouseWheelEvent::PhaseEnded); // enqueued |
// Check that only the first event was sent. |
EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
InputMsg_HandleInputEvent::ID)); |
+ const WebInputEvent* input_event = |
+ GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ const WebMouseWheelEvent* wheel_event = |
+ static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(0, wheel_event->deltaX); |
+ EXPECT_EQ(-5, wheel_event->deltaY); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
// Check that the ACK sends the second message immediately. |
@@ -525,61 +542,60 @@ TEST_F(InputRouterImplTest, CoalescesWheelEvents) { |
EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
InputMsg_HandleInputEvent::ID)); |
+ input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(8, wheel_event->deltaX); |
+ EXPECT_EQ(-10 + -6, wheel_event->deltaY); // coalesced |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
- // One more time. |
+ // Ack the second event (which had the third coalesced into it). |
SendInputEventACK(WebInputEvent::MouseWheel, |
INPUT_EVENT_ACK_STATE_CONSUMED); |
base::MessageLoop::current()->RunUntilIdle(); |
EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
InputMsg_HandleInputEvent::ID)); |
+ input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(9, wheel_event->deltaX); |
+ EXPECT_EQ(-7, wheel_event->deltaY); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
- // After the final ack, the queue should be empty. |
+ // Ack the fourth event. |
SendInputEventACK(WebInputEvent::MouseWheel, |
INPUT_EVENT_ACK_STATE_CONSUMED); |
base::MessageLoop::current()->RunUntilIdle(); |
EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
- EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
-} |
- |
-TEST_F(InputRouterImplTest, |
- CoalescesWheelEventsQueuedPhaseEndIsNotDropped) { |
- // Send an initial gesture begin and ACK it. |
- SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
- WebGestureEvent::Touchpad); |
+ EXPECT_TRUE( |
+ process_->sink().GetUniqueMessageMatching(InputMsg_HandleInputEvent::ID)); |
+ input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(0, wheel_event->deltaX); |
+ EXPECT_EQ(-10, wheel_event->deltaY); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
- SendInputEventACK(WebInputEvent::GestureScrollBegin, |
- INPUT_EVENT_ACK_STATE_CONSUMED); |
- base::MessageLoop::current()->RunUntilIdle(); |
- // Send a wheel event, should get sent directly. |
- SimulateWheelEvent(0, -5, 0, false); |
+ // Ack the fifth event. |
+ SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ base::MessageLoop::current()->RunUntilIdle(); |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_TRUE( |
+ process_->sink().GetUniqueMessageMatching(InputMsg_HandleInputEvent::ID)); |
+ input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(0, wheel_event->deltaX); |
+ EXPECT_EQ(0, wheel_event->deltaY); |
+ EXPECT_EQ(WebMouseWheelEvent::PhaseEnded, wheel_event->phase); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
- // Send a wheel phase end event before an ACK is received for the previous |
- // wheel event, which should get queued. |
- SimulateWheelEventWithPhase(WebMouseWheelEvent::PhaseEnded); |
+ // After the final ack, the queue should be empty. |
+ SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ base::MessageLoop::current()->RunUntilIdle(); |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
- |
- // A gesture event should now result in the queued phase ended event being |
- // transmitted before it. |
- SimulateGestureEvent(WebInputEvent::GestureScrollEnd, |
- WebGestureEvent::Touchpad); |
- |
- // Verify the events that were sent. |
- const WebInputEvent* input_event = |
- GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
- ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
- const WebMouseWheelEvent* wheel_event = |
- static_cast<const WebMouseWheelEvent*>(input_event); |
- ASSERT_EQ(WebMouseWheelEvent::PhaseEnded, wheel_event->phase); |
- |
- input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(1)); |
- EXPECT_EQ(WebInputEvent::GestureScrollEnd, input_event->type); |
- |
- ASSERT_EQ(2U, GetSentMessageCountAndResetSink()); |
} |
// Tests that touch-events are queued properly. |
@@ -1381,22 +1397,210 @@ TEST_F(InputRouterImplTest, InputFlush) { |
} |
// Test that GesturePinchUpdate is handled specially for trackpad |
-TEST_F(InputRouterImplTest, TrackpadPinchUpdate) { |
- // For now Trackpad PinchUpdate events are just immediately ACKed |
- // as unconsumed without going to the renderer. |
- // TODO(rbyers): Update for wheel event behavior - crbug.com/289887. |
+TEST_F(InputRouterImplTest, TouchpadPinchUpdate) { |
+ // GesturePinchUpdate for trackpad sends synthetic wheel events. |
// Note that the Touchscreen case is verified as NOT doing this as |
// part of the ShowPressIsInOrder test. |
- SimulateGestureEvent(WebInputEvent::GesturePinchUpdate, |
- WebGestureEvent::Touchpad); |
- ASSERT_EQ(0U, GetSentMessageCountAndResetSink()); |
+ |
+ SimulateGesturePinchUpdateEvent(1.5f, 20, 25, 0, WebGestureEvent::Touchpad); |
+ |
+ // Verify we actually sent a special wheel event to the renderer. |
+ const WebInputEvent* input_event = |
+ GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ const WebMouseWheelEvent* wheel_event = |
+ static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(20, wheel_event->x); |
+ EXPECT_EQ(25, wheel_event->y); |
+ EXPECT_EQ(20, wheel_event->globalX); |
+ EXPECT_EQ(25, wheel_event->globalY); |
+ EXPECT_EQ(20, wheel_event->windowX); |
+ EXPECT_EQ(25, wheel_event->windowY); |
+ EXPECT_EQ(PinchScaleToWheelDelta(1.5), wheel_event->deltaY); |
+ EXPECT_EQ(0, wheel_event->deltaX); |
+ EXPECT_EQ(1, wheel_event->hasPreciseScrollingDeltas); |
+ EXPECT_EQ(1, wheel_event->wheelTicksY); |
+ EXPECT_EQ(0, wheel_event->wheelTicksX); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Indicate that the wheel event was unhandled. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ |
+ // Check that the correct unhandled pinch event was received. |
EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ ASSERT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); |
EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state()); |
+ EXPECT_EQ(1.5f, ack_handler_->acked_gesture_event().data.pinchUpdate.scale); |
EXPECT_EQ(0, client_->in_flight_event_count()); |
+ |
+ // Second a second pinch event. |
+ SimulateGesturePinchUpdateEvent(0.3f, 20, 25, 0, WebGestureEvent::Touchpad); |
+ input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(0.3f), wheel_event->deltaY); |
+ EXPECT_EQ(1, wheel_event->hasPreciseScrollingDeltas); |
+ EXPECT_EQ(-1, wheel_event->wheelTicksY); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Indicate that the wheel event was handled this time. |
+ SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ |
+ // Check that the correct HANDLED pinch event was received. |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); |
+ EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, ack_handler_->ack_state()); |
+ EXPECT_FLOAT_EQ(0.3f, |
+ ack_handler_->acked_gesture_event().data.pinchUpdate.scale); |
+} |
+ |
+// Test that touchpad pinch events are coalesced property, with their synthetic |
+// wheel events getting the right ACKs. |
+TEST_F(InputRouterImplTest, TouchpadPinchCoalescing) { |
+ // Send the first pinch. |
+ SimulateGesturePinchUpdateEvent(1.5f, 20, 25, 0, WebGestureEvent::Touchpad); |
+ |
+ // Verify we sent the wheel event to the renderer. |
+ const WebInputEvent* input_event = |
+ GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ const WebMouseWheelEvent* wheel_event = |
+ static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(PinchScaleToWheelDelta(1.5f), wheel_event->deltaY); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_EQ(1, client_->in_flight_event_count()); |
+ |
+ // Send a second pinch, this should be queued in the GestureEventQueue. |
+ SimulateGesturePinchUpdateEvent(1.6f, 20, 25, 0, WebGestureEvent::Touchpad); |
+ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
+ EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); |
+ |
+ // Send a third pinch, this should be coalesced into the second in the |
+ // GestureEventQueue. |
+ SimulateGesturePinchUpdateEvent(1.7f, 20, 25, 0, WebGestureEvent::Touchpad); |
+ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
+ EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); |
+ |
+ // Indicate that the first wheel event was unhandled and verify the ACK. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); |
+ EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, ack_handler_->ack_state()); |
+ EXPECT_EQ(1.5f, ack_handler_->acked_gesture_event().data.pinchUpdate.scale); |
+ |
+ // Verify a second wheel event was sent representing the 2nd and 3rd pinch |
+ // events. |
+ EXPECT_EQ(1, client_->in_flight_event_count()); |
+ input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.6f * 1.7f), |
+ PinchScaleToWheelDelta(1.6f) + PinchScaleToWheelDelta(1.7f)); |
+ EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.6f * 1.7f), wheel_event->deltaY); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ EXPECT_EQ(0U, ack_handler_->GetAndResetAckCount()); |
+ |
+ // Indicate that the second wheel event was handled and verify the ACK. |
+ SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); |
+ EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, ack_handler_->ack_state()); |
+ EXPECT_FLOAT_EQ(1.6f * 1.7f, |
+ ack_handler_->acked_gesture_event().data.pinchUpdate.scale); |
} |
-// Test proper handling of trackpad Gesture{Pinch,Scroll}Update sequences. |
-TEST_F(InputRouterImplTest, TrackpadPinchAndScrollUpdate) { |
+// Test interleaving pinch and wheel events. |
+TEST_F(InputRouterImplTest, TouchpadPinchAndWheel) { |
+ // Simulate queued wheel and pinch events events. |
+ // Note that in practice interleaving pinch and wheel events should be rare |
+ // (eg. requires the use of a mouse and trackpad at the same time). |
+ |
+ // Use the control modifier to match the synthetic wheel events so that |
+ // they're elligble for coalescing. |
+ int mod = WebInputEvent::ControlKey; |
+ |
+ // Event 1: sent directly. |
+ SimulateWheelEvent(0, -5, mod, true); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Event 2: enqueued in InputRouter. |
+ SimulateWheelEvent(0, -10, mod, true); |
+ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
+ |
+ // Event 3: enqueued in InputRouter, not coalesced into #2. |
+ SimulateGesturePinchUpdateEvent(1.5f, 20, 25, 0, WebGestureEvent::Touchpad); |
+ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
+ |
+ // Event 4: enqueued in GestureEventQueue. |
+ SimulateGesturePinchUpdateEvent(1.2f, 20, 25, 0, WebGestureEvent::Touchpad); |
+ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
+ |
+ // Event 5: coalesced into wheel event for #3. |
+ SimulateWheelEvent(2, 0, mod, true); |
+ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
+ |
+ // Send ack for #1. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_EQ(WebInputEvent::MouseWheel, ack_handler_->ack_event_type()); |
+ |
+ // Verify we sent #2. |
+ ASSERT_EQ(1U, process_->sink().message_count()); |
+ const WebInputEvent* input_event = |
+ GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ const WebMouseWheelEvent* wheel_event = |
+ static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(0, wheel_event->deltaX); |
+ EXPECT_EQ(-10, wheel_event->deltaY); |
+ EXPECT_EQ(mod, wheel_event->modifiers); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Send ack for #2. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_EQ(WebInputEvent::MouseWheel, ack_handler_->ack_event_type()); |
+ |
+ // Verify we sent #3 (with #5 coalesced in). |
+ ASSERT_EQ(1U, process_->sink().message_count()); |
+ input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(2, wheel_event->deltaX); |
+ EXPECT_EQ(PinchScaleToWheelDelta(1.5f), wheel_event->deltaY); |
+ EXPECT_EQ(mod, wheel_event->modifiers); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Send ack for #3. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); |
+ |
+ // Verify we sent #4. |
+ ASSERT_EQ(1U, process_->sink().message_count()); |
+ input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(0)); |
+ ASSERT_EQ(WebInputEvent::MouseWheel, input_event->type); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(0, wheel_event->deltaX); |
+ EXPECT_FLOAT_EQ(PinchScaleToWheelDelta(1.2f), wheel_event->deltaY); |
+ EXPECT_EQ(mod, wheel_event->modifiers); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Send ack for #4. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_EQ(WebInputEvent::GesturePinchUpdate, ack_handler_->ack_event_type()); |
+} |
+ |
+// Test proper handling of touchpad Gesture{Pinch,Scroll}Update sequences. |
+TEST_F(InputRouterImplTest, TouchpadPinchAndScrollUpdate) { |
// The first scroll should be sent immediately. |
SimulateGestureEvent(WebInputEvent::GestureScrollUpdate, |
WebGestureEvent::Touchpad); |
@@ -1426,20 +1630,24 @@ TEST_F(InputRouterImplTest, TrackpadPinchAndScrollUpdate) { |
EXPECT_EQ(1, client_->in_flight_event_count()); |
// Ack'ing the first scroll should trigger both the coalesced scroll and the |
- // coalesced pinch events. However, the GesturePinchUpdate should be ack'ed |
- // immediately without going to the renderer. |
- // TODO(rbyers): Update for wheel event behavior - crbug.com/289887. |
+ // coalesced pinch events (which is sent to the renderer as a wheel event). |
SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
INPUT_EVENT_ACK_STATE_CONSUMED); |
- EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
- EXPECT_EQ(2U, ack_handler_->GetAndResetAckCount()); |
- EXPECT_EQ(1, client_->in_flight_event_count()); |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); |
+ EXPECT_EQ(2, client_->in_flight_event_count()); |
// Ack the second scroll. |
SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
INPUT_EVENT_ACK_STATE_CONSUMED); |
EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
+ EXPECT_EQ(1, client_->in_flight_event_count()); |
+ |
+ // Ack the wheel event. |
+ SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
+ EXPECT_EQ(1U, ack_handler_->GetAndResetAckCount()); |
EXPECT_EQ(0, client_->in_flight_event_count()); |
} |