Index: content/browser/renderer_host/render_widget_host_view_aura_unittest.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc |
index d9a833c98f06cfec22d86a8006ff1ec1f992ef75..645811806fa018b40d1c18f75ce8c6b2608c297b 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc |
@@ -44,6 +44,7 @@ |
#include "content/browser/renderer_host/resize_lock.h" |
#include "content/browser/web_contents/web_contents_view_aura.h" |
#include "content/common/host_shared_bitmap_manager.h" |
+#include "content/common/input/input_event_utils.h" |
#include "content/common/input/synthetic_web_input_event_builders.h" |
#include "content/common/input_messages.h" |
#include "content/common/view_messages.h" |
@@ -615,12 +616,27 @@ |
protected: |
void SetUpOverscrollEnvironmentWithDebounce(int debounce_interval_in_ms) { |
- SetUpOverscrollEnvironmentImpl(debounce_interval_in_ms); |
- } |
- |
- void SetUpOverscrollEnvironment() { SetUpOverscrollEnvironmentImpl(0); } |
- |
- void SetUpOverscrollEnvironmentImpl(int debounce_interval_in_ms) { |
+ SetUpOverscrollEnvironmentImpl(debounce_interval_in_ms, false); |
+ } |
+ |
+ void SetUpOverscrollEnvironmentWithWheelGestures() { |
+ SetUpOverscrollEnvironmentImpl(0, true); |
+ } |
+ |
+ void SetUpOverscrollEnvironment() { |
+ SetUpOverscrollEnvironmentImpl(0, false); |
+ } |
+ |
+ void SetUpOverscrollEnvironmentImpl(int debounce_interval_in_ms, |
+ bool enable_wheel_gestures) { |
+ CHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kDisableWheelGestures) && |
+ !base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnableWheelGestures)); |
+ base::CommandLine::ForCurrentProcess()->AppendSwitch( |
+ enable_wheel_gestures ? switches::kEnableWheelGestures |
+ : switches::kDisableWheelGestures); |
+ |
ui::GestureConfiguration::GetInstance()->set_scroll_debounce_interval_in_ms( |
debounce_interval_in_ms); |
@@ -2611,6 +2627,8 @@ |
EXPECT_EQ(kY, pointer_state().GetY(0)); |
} |
+// Tests that scroll ACKs are correctly handled by the overscroll-navigation |
+// controller. |
TEST_F(RenderWidgetHostViewAuraOverscrollTest, WheelScrollEventOverscrolls) { |
SetUpOverscrollEnvironment(); |
@@ -2627,6 +2645,58 @@ |
// Receive ACK the first wheel event as not processed. |
SendInputEventACK(WebInputEvent::MouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Receive ACK for the second (coalesced) event as not processed. This will |
+ // start a back navigation. However, this will also cause the queued next |
+ // event to be sent to the renderer. But since overscroll navigation has |
+ // started, that event will also be included in the overscroll computation |
+ // instead of being sent to the renderer. So the result will be an overscroll |
+ // back navigation, and no event will be sent to the renderer. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_WEST, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(-81.f, overscroll_delta_x()); |
+ EXPECT_EQ(-31.f, overscroll_delegate()->delta_x()); |
+ EXPECT_EQ(0.f, overscroll_delegate()->delta_y()); |
+ EXPECT_EQ(0U, sink_->message_count()); |
+ |
+ // Send a mouse-move event. This should cancel the overscroll navigation. |
+ SimulateMouseMove(5, 10, 0); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, sink_->message_count()); |
+} |
+ |
+// Disabled on MacOS because it doesn't support wheel gestures |
+// just yet. |
+#if defined(OS_MACOSX) |
+#define MAYBE_WheelScrollEventOverscrollsWithWheelGestures \ |
+ DISABLED_WheelScrollEventOverscrollsWithWheelGestures |
+#else |
+#define MAYBE_WheelScrollEventOverscrollsWithWheelGestures \ |
+ WheelScrollEventOverscrollsWithWheelGestures |
+#endif |
+TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
+ MAYBE_WheelScrollEventOverscrollsWithWheelGestures) { |
+ SetUpOverscrollEnvironmentWithWheelGestures(); |
+ |
+ // Simulate wheel events. |
+ SimulateWheelEvent(-5, 0, 0, true); // sent directly |
+ SimulateWheelEvent(-1, 1, 0, true); // enqueued |
+ SimulateWheelEvent(-10, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-15, -1, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-30, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-20, 6, 1, true); // enqueued, different modifiers |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Receive ACK the first wheel event as not processed. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
// ScrollBegin, ScrollUpdate, MouseWheel will be queued events |
EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); |
@@ -2682,6 +2752,79 @@ |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
// Receive ACK the first wheel event as processed. |
+ SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Receive ACK for the second (coalesced) event as not processed. This should |
+ // not initiate overscroll, since the beginning of the scroll has been |
+ // consumed. The queued event with different modifiers should be sent to the |
+ // renderer. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(0U, sink_->message_count()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ |
+ // Indicate the end of the scrolling from the touchpad. |
+ SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
+ blink::WebGestureDeviceTouchscreen); |
+ SimulateGestureFlingStartEvent(-1200.f, 0.f, blink::WebGestureDeviceTouchpad); |
+ EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); |
+ |
+ // Start another scroll. This time, do not consume any scroll events. |
+ SimulateWheelEvent(0, -5, 0, true); // sent directly |
+ SimulateWheelEvent(0, -1, 0, true); // enqueued |
+ SimulateWheelEvent(-10, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-15, -1, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-30, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-20, 6, 1, true); // enqueued, different modifiers |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Receive ACK for the first wheel and the subsequent coalesced event as not |
+ // processed. This should start a back-overscroll. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); |
+} |
+ |
+// Tests that if some scroll events are consumed towards the start, then |
+// subsequent scrolls do not horizontal overscroll. |
+// Disabled on MacOS because it doesn't support wheel gestures |
+// just yet. |
+#if defined(OS_MACOSX) |
+#define MAYBE_WheelScrollConsumedDoNotHorizOverscrollWithWheelGestures \ |
+ DISABLED_WheelScrollConsumedDoNotHorizOverscrollWithWheelGestures |
+#else |
+#define MAYBE_WheelScrollConsumedDoNotHorizOverscrollWithWheelGestures \ |
+ WheelScrollConsumedDoNotHorizOverscrollWithWheelGestures |
+#endif |
+TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
+ MAYBE_WheelScrollConsumedDoNotHorizOverscrollWithWheelGestures) { |
+ SetUpOverscrollEnvironmentWithWheelGestures(); |
+ |
+ // Simulate wheel events. |
+ SimulateWheelEvent(-5, 0, 0, true); // sent directly |
+ SimulateWheelEvent(-1, -1, 0, true); // enqueued |
+ SimulateWheelEvent(-10, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-15, -1, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-30, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-20, 6, 1, true); // enqueued, different modifiers |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Receive ACK the first wheel event as processed. |
SendInputEventACK(WebInputEvent::MouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
// ScrollBegin, ScrollUpdate, MouseWheel will be queued events |
@@ -2718,6 +2861,75 @@ |
// Tests that wheel-scrolling correctly turns overscroll on and off. |
TEST_F(RenderWidgetHostViewAuraOverscrollTest, WheelScrollOverscrollToggle) { |
SetUpOverscrollEnvironment(); |
+ |
+ // Send a wheel event. ACK the event as not processed. This should not |
+ // initiate an overscroll gesture since it doesn't cross the threshold yet. |
+ SimulateWheelEvent(10, 0, 0, true); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Scroll some more so as to not overscroll. |
+ SimulateWheelEvent(10, 0, 0, true); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Scroll some more to initiate an overscroll. |
+ SimulateWheelEvent(40, 0, 0, true); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(60.f, overscroll_delta_x()); |
+ EXPECT_EQ(10.f, overscroll_delegate()->delta_x()); |
+ EXPECT_EQ(0.f, overscroll_delegate()->delta_y()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Scroll in the reverse direction enough to abort the overscroll. |
+ SimulateWheelEvent(-20, 0, 0, true); |
+ EXPECT_EQ(0U, sink_->message_count()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ |
+ // Continue to scroll in the reverse direction. |
+ SimulateWheelEvent(-20, 0, 0, true); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Continue to scroll in the reverse direction enough to initiate overscroll |
+ // in that direction. |
+ SimulateWheelEvent(-55, 0, 0, true); |
+ EXPECT_EQ(1U, sink_->message_count()); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_WEST, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(-75.f, overscroll_delta_x()); |
+ EXPECT_EQ(-25.f, overscroll_delegate()->delta_x()); |
+ EXPECT_EQ(0.f, overscroll_delegate()->delta_y()); |
+} |
+ |
+// Tests that wheel-scrolling correctly turns overscroll on and off. |
+// Disabled on MacOS because it doesn't support wheel gestures |
+// just yet. |
+#if defined(OS_MACOSX) |
+#define MAYBE_WheelScrollOverscrollToggleWithWheelGestures \ |
+ DISABLED_WheelScrollOverscrollToggleWithWheelGestures |
+#else |
+#define MAYBE_WheelScrollOverscrollToggleWithWheelGestures \ |
+ WheelScrollOverscrollToggleWithWheelGestures |
+#endif |
+TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
+ MAYBE_WheelScrollOverscrollToggleWithWheelGestures) { |
+ SetUpOverscrollEnvironmentWithWheelGestures(); |
// Send a wheel event. ACK the event as not processed. This should not |
// initiate an overscroll gesture since it doesn't cross the threshold yet. |
@@ -2801,6 +3013,58 @@ |
// Send a wheel event. ACK the event as not processed. This should not |
// initiate an overscroll gesture since it doesn't cross the threshold yet. |
SimulateWheelEvent(10, 0, 0, true); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Scroll some more so as to not overscroll. |
+ SimulateWheelEvent(20, 0, 0, true); |
+ EXPECT_EQ(1U, sink_->message_count()); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ sink_->ClearMessages(); |
+ |
+ // Scroll some more to initiate an overscroll. |
+ SimulateWheelEvent(30, 0, 0, true); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(60.f, overscroll_delta_x()); |
+ EXPECT_EQ(10.f, overscroll_delegate()->delta_x()); |
+ EXPECT_EQ(0.f, overscroll_delegate()->delta_y()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Send a fling start, but with a small velocity, so that the overscroll is |
+ // aborted. The fling should proceed to the renderer, through the gesture |
+ // event filter. |
+ SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
+ blink::WebGestureDeviceTouchscreen); |
+ SimulateGestureFlingStartEvent(0.f, 0.1f, blink::WebGestureDeviceTouchpad); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(2U, sink_->message_count()); |
+} |
+ |
+// Disabled on MacOS because it doesn't support wheel gestures |
+// just yet. |
+#if defined(OS_MACOSX) |
+#define MAYBE_ScrollEventsOverscrollWithFlingAndWheelGestures \ |
+ DISABLED_ScrollEventsOverscrollWithFlingAndWheelGestures |
+#else |
+#define MAYBE_ScrollEventsOverscrollWithFlingAndWheelGestures \ |
+ ScrollEventsOverscrollWithFlingAndWheelGestures |
+#endif |
+TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
+ MAYBE_ScrollEventsOverscrollWithFlingAndWheelGestures) { |
+ SetUpOverscrollEnvironmentWithWheelGestures(); |
+ |
+ // Send a wheel event. ACK the event as not processed. This should not |
+ // initiate an overscroll gesture since it doesn't cross the threshold yet. |
+ SimulateWheelEvent(10, 0, 0, true); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::MouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -2852,6 +3116,59 @@ |
TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
ScrollEventsOverscrollWithZeroFling) { |
SetUpOverscrollEnvironment(); |
+ |
+ // Send a wheel event. ACK the event as not processed. This should not |
+ // initiate an overscroll gesture since it doesn't cross the threshold yet. |
+ SimulateWheelEvent(10, 0, 0, true); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Scroll some more so as to not overscroll. |
+ SimulateWheelEvent(20, 0, 0, true); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ |
+ // Scroll some more to initiate an overscroll. |
+ SimulateWheelEvent(30, 0, 0, true); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(60.f, overscroll_delta_x()); |
+ EXPECT_EQ(10.f, overscroll_delegate()->delta_x()); |
+ EXPECT_EQ(0.f, overscroll_delegate()->delta_y()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Send a fling start, but with a small velocity, so that the overscroll is |
+ // aborted. The fling should proceed to the renderer, through the gesture |
+ // event filter. |
+ SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
+ blink::WebGestureDeviceTouchscreen); |
+ SimulateGestureFlingStartEvent(10.f, 0.f, blink::WebGestureDeviceTouchpad); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(2U, sink_->message_count()); |
+} |
+ |
+// Same as ScrollEventsOverscrollWithFling, but with zero velocity. Checks that |
+// the zero-velocity fling does not reach the renderer. |
+// Disabled on MacOS because it doesn't support wheel gestures |
+// just yet. |
+#if defined(OS_MACOSX) |
+#define MAYBE_ScrollEventsOverscrollWithZeroFlingAndWheelGestures \ |
+ DISABLED_ScrollEventsOverscrollWithZeroFlingAndWheelGestures |
+#else |
+#define MAYBE_ScrollEventsOverscrollWithZeroFlingAndWheelGestures \ |
+ ScrollEventsOverscrollWithZeroFlingAndWheelGestures |
+#endif |
+TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
+ MAYBE_ScrollEventsOverscrollWithZeroFlingAndWheelGestures) { |
+ SetUpOverscrollEnvironmentWithWheelGestures(); |
// Send a wheel event. ACK the event as not processed. This should not |
// initiate an overscroll gesture since it doesn't cross the threshold yet. |
@@ -3356,6 +3673,42 @@ |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::MouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(0U, sink_->message_count()); |
+ |
+ // Send another wheel event, but in the reverse direction. The overscroll |
+ // controller will not consume the event, because it is not triggering |
+ // gesture-nav. |
+ SimulateWheelEvent(-260, 0, 0, true); |
+ EXPECT_EQ(1U, sink_->message_count()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ |
+ // Since the overscroll mode has been reset, the next wheel event should reach |
+ // the renderer. |
+ SimulateWheelEvent(-20, 0, 0, true); |
+ EXPECT_EQ(1U, sink_->message_count()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+} |
+ |
+// Disabled on MacOS because it doesn't support wheel gestures |
+// just yet. |
+#if defined(OS_MACOSX) |
+#define MAYBE_OverscrollDirectionChangeMouseWheelWithWheelGestures \ |
+ DISABLED_OverscrollDirectionChangeMouseWheelWithWheelGestures |
+#else |
+#define MAYBE_OverscrollDirectionChangeMouseWheelWithWheelGestures \ |
+ OverscrollDirectionChangeMouseWheelWithWheelGestures |
+#endif |
+TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
+ MAYBE_OverscrollDirectionChangeMouseWheelWithWheelGestures) { |
+ SetUpOverscrollEnvironmentWithWheelGestures(); |
+ |
+ // Send wheel event and receive ack as not consumed. |
+ SimulateWheelEvent(125, -5, 0, true); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
// ScrollBegin, ScrollUpdate messages. |
EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); |
@@ -3393,6 +3746,8 @@ |
EXPECT_EQ(OVERSCROLL_WEST, overscroll_delegate()->current_mode()); |
} |
+// Tests that if a mouse-move event completes the overscroll gesture, future |
+// move events do reach the renderer. |
TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollMouseMoveCompletion) { |
SetUpOverscrollEnvironment(); |
@@ -3407,18 +3762,13 @@ |
// Receive ACK the first wheel event as not processed. |
SendInputEventACK(WebInputEvent::MouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
- EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); |
- SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
- EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
- EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
// Receive ACK for the second (coalesced) event as not processed. This will |
// start an overcroll gesture. |
SendInputEventACK(WebInputEvent::MouseWheel, |
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
- EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
- SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); |
EXPECT_EQ(OVERSCROLL_WEST, overscroll_delegate()->current_mode()); |
@@ -3476,6 +3826,101 @@ |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
} |
+// Tests that if a mouse-move event completes the overscroll gesture, future |
+// move events do reach the renderer. |
+// Disabled on MacOS because it doesn't support wheel gestures |
+// just yet. |
+#if defined(OS_MACOSX) |
+#define MAYBE_OverscrollMouseMoveCompletionWheelGestures \ |
+ DISABLED_OverscrollMouseMoveCompletionWheelGestures |
+#else |
+#define MAYBE_OverscrollMouseMoveCompletionWheelGestures \ |
+ OverscrollMouseMoveCompletionWheelGestures |
+#endif |
+TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
+ MAYBE_OverscrollMouseMoveCompletionWheelGestures) { |
+ SetUpOverscrollEnvironmentWithWheelGestures(); |
+ |
+ SimulateWheelEvent(5, 0, 0, true); // sent directly |
+ SimulateWheelEvent(-1, 0, 0, true); // enqueued |
+ SimulateWheelEvent(-10, -3, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-15, -1, 0, true); // coalesced into previous event |
+ SimulateWheelEvent(-30, -3, 0, true); // coalesced into previous event |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Receive ACK the first wheel event as not processed. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ |
+ // Receive ACK for the second (coalesced) event as not processed. This will |
+ // start an overcroll gesture. |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_WEST, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(0U, sink_->message_count()); |
+ |
+ // Send a mouse-move event. This should cancel the overscroll navigation |
+ // (since the amount overscrolled is not above the threshold), and so the |
+ // mouse-move should reach the renderer. |
+ SimulateMouseMove(5, 10, 0); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->completed_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ SendInputEventACK(WebInputEvent::MouseMove, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ |
+ // Moving the mouse more should continue to send the events to the renderer. |
+ SimulateMouseMove(5, 10, 0); |
+ SendInputEventACK(WebInputEvent::MouseMove, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Now try with gestures. |
+ SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
+ blink::WebGestureDeviceTouchscreen); |
+ SimulateGestureScrollUpdateEvent(300, -5, 0); |
+ SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->current_mode()); |
+ sink_->ClearMessages(); |
+ |
+ // Overscroll gesture is in progress. Send a mouse-move now. This should |
+ // complete the gesture (because the amount overscrolled is above the |
+ // threshold). |
+ SimulateMouseMove(5, 10, 0); |
+ EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->completed_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::MouseMove, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ |
+ SimulateGestureEvent(WebInputEvent::GestureScrollEnd, |
+ blink::WebGestureDeviceTouchscreen); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ // Move mouse some more. The mouse-move events should reach the renderer. |
+ SimulateMouseMove(5, 10, 0); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ SendInputEventACK(WebInputEvent::MouseMove, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+} |
+ |
// Tests that if a page scrolled, then the overscroll controller's states are |
// reset after the end of the scroll. |
TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
@@ -3490,18 +3935,12 @@ |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
// The first wheel event is consumed. Dispatches the queued wheel event. |
- SendInputEventACK(WebInputEvent::MouseWheel, |
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
- SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
- INPUT_EVENT_ACK_STATE_CONSUMED); |
+ SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); |
EXPECT_TRUE(ScrollStateIsContentScrolling()); |
- EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
// The second wheel event is consumed. |
- SendInputEventACK(WebInputEvent::MouseWheel, |
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
- SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
- INPUT_EVENT_ACK_STATE_CONSUMED); |
+ SendInputEventACK(WebInputEvent::MouseWheel, INPUT_EVENT_ACK_STATE_CONSUMED); |
EXPECT_TRUE(ScrollStateIsContentScrolling()); |
// Touchpad scroll can end with a zero-velocity fling. But it is not |
@@ -3510,7 +3949,7 @@ |
blink::WebGestureDeviceTouchscreen); |
SimulateGestureFlingStartEvent(0.f, 0.f, blink::WebGestureDeviceTouchpad); |
EXPECT_TRUE(ScrollStateIsUnknown()); |
- EXPECT_EQ(3U, sink_->message_count()); |
+ EXPECT_EQ(1U, sink_->message_count()); |
// Dropped flings should neither propagate *nor* indicate that they were |
// consumed and have triggered a fling animation (as tracked by the router). |
@@ -3523,24 +3962,20 @@ |
SimulateWheelEvent(-60, 0, 0, true); // enqueued |
SimulateWheelEvent(-100, 0, 0, true); // coalesced into previous event |
EXPECT_TRUE(ScrollStateIsUnknown()); |
- EXPECT_EQ(5U, GetSentMessageCountAndResetSink()); |
+ EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); |
// The first wheel scroll did not scroll content. Overscroll should not start |
// yet, since enough hasn't been scrolled. |
SendInputEventACK(WebInputEvent::MouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
- SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
EXPECT_TRUE(ScrollStateIsUnknown()); |
- EXPECT_EQ(3U, GetSentMessageCountAndResetSink()); |
- |
- SendInputEventACK(WebInputEvent::MouseWheel, |
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
- SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); |
EXPECT_TRUE(ScrollStateIsOverscrolling()); |
- EXPECT_EQ(1U, sink_->message_count()); |
+ EXPECT_EQ(0U, sink_->message_count()); |
// The GestureScrollBegin will reset the delegate's mode, so check it here. |
EXPECT_EQ(OVERSCROLL_WEST, overscroll_delegate()->current_mode()); |
@@ -3549,7 +3984,7 @@ |
SimulateGestureFlingStartEvent(0.f, 0.f, blink::WebGestureDeviceTouchpad); |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
EXPECT_TRUE(ScrollStateIsUnknown()); |
- EXPECT_EQ(3U, sink_->message_count()); |
+ EXPECT_EQ(1U, sink_->message_count()); |
EXPECT_FALSE(parent_host_->input_router()->HasPendingEvents()); |
} |
@@ -3734,6 +4169,63 @@ |
// isn't surpassed and the overscroll mode stays OVERSCROLL_NONE. |
TEST_F(RenderWidgetHostViewAuraOverscrollTest, ScrollDeltasResetOnEnd) { |
SetUpOverscrollEnvironment(); |
+ // Wheel event scroll ending with mouse move. |
+ SimulateWheelEvent(-30, -10, 0, true); // sent directly |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(-30.f, overscroll_delta_x()); |
+ EXPECT_EQ(-10.f, overscroll_delta_y()); |
+ SimulateMouseMove(5, 10, 0); |
+ EXPECT_EQ(0.f, overscroll_delta_x()); |
+ EXPECT_EQ(0.f, overscroll_delta_y()); |
+ |
+ // Scroll gesture. |
+ SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
+ blink::WebGestureDeviceTouchscreen); |
+ SimulateGestureScrollUpdateEvent(-30, -5, 0); |
+ SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(-30.f, overscroll_delta_x()); |
+ EXPECT_EQ(-5.f, overscroll_delta_y()); |
+ SimulateGestureEvent(WebInputEvent::GestureScrollEnd, |
+ blink::WebGestureDeviceTouchscreen); |
+ EXPECT_EQ(0.f, overscroll_delta_x()); |
+ EXPECT_EQ(0.f, overscroll_delta_y()); |
+ |
+ // Wheel event scroll ending with a fling. |
+ SimulateWheelEvent(5, 0, 0, true); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ SimulateWheelEvent(10, -5, 0, true); |
+ SendInputEventACK(WebInputEvent::MouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
+ EXPECT_EQ(15.f, overscroll_delta_x()); |
+ EXPECT_EQ(-5.f, overscroll_delta_y()); |
+ SimulateGestureEvent(WebInputEvent::GestureScrollBegin, |
+ blink::WebGestureDeviceTouchscreen); |
+ SimulateGestureFlingStartEvent(0.f, 0.1f, blink::WebGestureDeviceTouchpad); |
+ EXPECT_EQ(0.f, overscroll_delta_x()); |
+ EXPECT_EQ(0.f, overscroll_delta_y()); |
+} |
+ |
+// Tests that the scroll deltas stored within the overscroll controller get |
+// reset at the end of the overscroll gesture even if the overscroll threshold |
+// isn't surpassed and the overscroll mode stays OVERSCROLL_NONE. |
+// Disabled on MacOS because it doesn't support wheel gestures |
+// just yet. |
+#if defined(OS_MACOSX) |
+#define MAYBE_ScrollDeltasResetOnEndWithWheelGestures \ |
+ DISABLED_ScrollDeltasResetOnEndWithWheelGestures |
+#else |
+#define MAYBE_ScrollDeltasResetOnEndWithWheelGestures \ |
+ ScrollDeltasResetOnEndWithWheelGestures |
+#endif |
+TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
+ MAYBE_ScrollDeltasResetOnEndWithWheelGestures) { |
+ SetUpOverscrollEnvironmentWithWheelGestures(); |
// Wheel event scroll ending with mouse move. |
SimulateWheelEvent(-30, -10, 0, true); // sent directly |
SendInputEventACK(WebInputEvent::MouseWheel, |