| 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,
|
|
|