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 3694c7968fe6c78e9840593a7210d5a710739db2..b43859d131f1091b1807c2da5a094a418abccb88 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 |
@@ -743,6 +743,16 @@ class RenderWidgetHostViewAuraTest : public testing::Test { |
"", features::kRafAlignedTouchInputEvents.name); |
} |
+ void EnableWheelScrollLatching() { |
+ feature_list_.InitFromCommandLine( |
+ features::kTouchpadAndWheelScrollLatching.name, ""); |
+ } |
+ |
+ void DisableWheelScrollLatching() { |
+ feature_list_.InitFromCommandLine( |
+ "", features::kTouchpadAndWheelScrollLatching.name); |
+ } |
+ |
void SetFeatureList(bool raf_aligned_touch, bool wheel_scroll_latching) { |
if (raf_aligned_touch && wheel_scroll_latching) { |
feature_list_.InitWithFeatures( |
@@ -847,6 +857,17 @@ class RenderWidgetHostViewAuraRafAlignedTouchDisabledTest |
} |
}; |
+class RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest |
+ : public RenderWidgetHostViewAuraTest { |
+ public: |
+ void SetUp() override { |
+ EnableWheelScrollLatching(); |
+ ui::GestureConfiguration::GetInstance()->set_scroll_debounce_interval_in_ms( |
+ 0); |
+ RenderWidgetHostViewAuraTest::SetUp(); |
+ } |
+}; |
+ |
void InstallDelegatedFrameHostClient( |
RenderWidgetHostViewAura* render_widget_host_view, |
std::unique_ptr<DelegatedFrameHostClient> delegated_frame_host_client) { |
@@ -940,6 +961,31 @@ class RenderWidgetHostViewAuraOverscrollTest |
0, 0, dX, dY, modifiers, precise)); |
} |
+ void SimulateWheelEventWithPhase(float dX, |
+ float dY, |
+ int modifiers, |
+ bool precise, |
+ WebMouseWheelEvent::Phase phase) { |
+ WebMouseWheelEvent wheel_event = SyntheticWebMouseWheelEventBuilder::Build( |
+ 0, 0, dX, dY, modifiers, precise); |
+ wheel_event.phase = phase; |
+ widget_host_->ForwardWheelEvent(wheel_event); |
+ } |
+ |
+ void SimulateWheelEventPossiblyIncludingPhase( |
+ bool ignore_phase, |
+ float dX, |
+ float dY, |
+ int modifiers, |
+ bool precise, |
+ WebMouseWheelEvent::Phase phase) { |
+ if (ignore_phase) { |
+ SimulateWheelEvent(dX, dY, modifiers, precise); |
+ } else { |
+ SimulateWheelEventWithPhase(dX, dY, modifiers, precise, phase); |
+ } |
+ } |
+ |
void SimulateWheelEventWithLatencyInfo(float dX, |
float dY, |
int modifiers, |
@@ -1077,13 +1123,6 @@ class RenderWidgetHostViewAuraOverscrollTest |
EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
return; |
} |
- // Let the ScrollEnd timer in mouseWheelEventQueue fire. This will cause |
- // the mouseWheelEventQueue to send a GestureScrollEnd event. |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), |
- base::TimeDelta::FromMilliseconds( |
- kDefaultWheelScrollLatchingTransactionMs)); |
- base::RunLoop().Run(); |
} |
EXPECT_EQ(1U, sink_->message_count()); |
@@ -1726,6 +1765,199 @@ TEST_F(RenderWidgetHostViewAuraRafAlignedTouchEnabledTest, TouchEventState) { |
EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); |
} |
+TEST_F(RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest, |
+ TimerBasedWheelEventPhaseInfo) { |
+ view_->InitAsChild(nullptr); |
+ view_->Show(); |
+ sink_->ClearMessages(); |
+ |
+ ui::MouseWheelEvent event(gfx::Vector2d(0, 5), gfx::Point(2, 2), |
+ gfx::Point(2, 2), ui::EventTimeForNow(), 0, 0); |
+ view_->OnMouseEvent(&event); |
+ const WebInputEvent* input_event = |
+ GetInputEventFromMessage(*sink_->GetMessageAt(0)); |
+ const WebMouseWheelEvent* wheel_event = |
+ static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); |
+ SendInputEventACK(blink::WebInputEvent::kMouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(1)); |
+ const WebGestureEvent* gesture_event = |
+ static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureScrollBegin, gesture_event->GetType()); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(2)); |
+ gesture_event = static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureScrollUpdate, gesture_event->GetType()); |
+ EXPECT_EQ(0U, gesture_event->data.scroll_update.delta_x); |
+ EXPECT_EQ(5U, gesture_event->data.scroll_update.delta_y); |
+ SendInputEventACK(WebInputEvent::kGestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_CONSUMED); |
+ sink_->ClearMessages(); |
+ |
+ // Send a ui::ScrollEvent instead of ui::MouseWheel event, the timer based |
+ // phase info doesn't diffrentiate between the two types of events. |
+ ui::ScrollEvent scroll1(ui::ET_SCROLL, gfx::Point(2, 2), |
+ ui::EventTimeForNow(), 0, 0, 2, 0, 2, 2); |
+ view_->OnScrollEvent(&scroll1); |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(0)); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(WebMouseWheelEvent::kPhaseChanged, wheel_event->phase); |
+ SendInputEventACK(blink::WebInputEvent::kMouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(1)); |
+ gesture_event = static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureScrollUpdate, gesture_event->GetType()); |
+ EXPECT_EQ(0U, gesture_event->data.scroll_update.delta_x); |
+ EXPECT_EQ(2U, gesture_event->data.scroll_update.delta_y); |
+ SendInputEventACK(WebInputEvent::kGestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_CONSUMED); |
+ sink_->ClearMessages(); |
+ |
+ // Let the RenderWidgetHostViewEventHandler::mouse_wheel_phase_timer_ fire. A |
+ // synthetic wheel event with zero deltas and kPhaseEnded will be sent. |
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
+ FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), |
+ base::TimeDelta::FromMilliseconds( |
+ kDefaultMouseWheelLatchingTransactionMs)); |
+ base::RunLoop().Run(); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(0)); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(WebMouseWheelEvent::kPhaseEnded, wheel_event->phase); |
+ EXPECT_EQ(0U, wheel_event->delta_x); |
+ EXPECT_EQ(0U, wheel_event->delta_y); |
+ SendInputEventACK(blink::WebInputEvent::kMouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(1)); |
+ gesture_event = static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureScrollEnd, gesture_event->GetType()); |
+ sink_->ClearMessages(); |
+} |
+ |
+// Tests that a gesture fling start with touchpad source stops the |
+// RenderWidgetHostViewEventHandler::mouse_wheel_phase_timer_ and no synthetic |
+// wheel event will be sent. |
+TEST_F(RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest, |
+ TouchpadFlingStartStopsWheelPhaseTimer) { |
+ ui::ScrollEvent scroll0(ui::ET_SCROLL, gfx::Point(2, 2), |
+ ui::EventTimeForNow(), 0, 0, 5, 0, 5, 2); |
+ view_->OnScrollEvent(&scroll0); |
+ const WebInputEvent* input_event = |
+ GetInputEventFromMessage(*sink_->GetMessageAt(0)); |
+ const WebMouseWheelEvent* wheel_event = |
+ static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); |
+ SendInputEventACK(blink::WebInputEvent::kMouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(1)); |
+ const WebGestureEvent* gesture_event = |
+ static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureScrollBegin, gesture_event->GetType()); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(2)); |
+ gesture_event = static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureScrollUpdate, gesture_event->GetType()); |
+ EXPECT_EQ(0U, gesture_event->data.scroll_update.delta_x); |
+ EXPECT_EQ(5U, gesture_event->data.scroll_update.delta_y); |
+ SendInputEventACK(WebInputEvent::kGestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_CONSUMED); |
+ sink_->ClearMessages(); |
+ |
+ ui::ScrollEvent fling_start(ui::ET_SCROLL_FLING_START, gfx::Point(2, 2), |
+ ui::EventTimeForNow(), 0, 0, 10, 0, 10, 2); |
+ view_->OnScrollEvent(&fling_start); |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(0)); |
+ gesture_event = static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureFlingStart, gesture_event->GetType()); |
+ SendInputEventACK(WebInputEvent::kGestureFlingStart, |
+ INPUT_EVENT_ACK_STATE_CONSUMED); |
+ sink_->ClearMessages(); |
+ |
+ // Let the RenderWidgetHostViewEventHandler::mouse_wheel_phase_timer_ fire. No |
+ // synthetic wheel event will be sent since the timer has stopped. |
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
+ FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), |
+ base::TimeDelta::FromMilliseconds( |
+ kDefaultMouseWheelLatchingTransactionMs)); |
+ base::RunLoop().Run(); |
+ |
+ EXPECT_EQ(0U, sink_->message_count()); |
+ |
+ // Handling the next ui::ET_SCROLL event will send a fling cancellation and a |
+ // mouse wheel with kPhaseBegan. |
+ ui::ScrollEvent scroll1(ui::ET_SCROLL, gfx::Point(2, 2), |
+ ui::EventTimeForNow(), 0, 0, 15, 0, 15, 2); |
+ view_->OnScrollEvent(&scroll1); |
+ EXPECT_EQ(2U, sink_->message_count()); |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(0)); |
+ gesture_event = static_cast<const WebGestureEvent*>(input_event); |
+ |
+ EXPECT_EQ(WebInputEvent::kGestureFlingCancel, gesture_event->GetType()); |
+ SendInputEventACK(WebInputEvent::kGestureFlingCancel, |
+ INPUT_EVENT_ACK_STATE_CONSUMED); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(1)); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); |
+ sink_->ClearMessages(); |
+} |
+ |
+TEST_F(RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest, |
+ GSBWithTouchSourceStopsWheelScrollSequence) { |
+ ui::ScrollEvent scroll0(ui::ET_SCROLL, gfx::Point(2, 2), |
+ ui::EventTimeForNow(), 0, 0, 5, 0, 5, 2); |
+ view_->OnScrollEvent(&scroll0); |
+ const WebInputEvent* input_event = |
+ GetInputEventFromMessage(*sink_->GetMessageAt(0)); |
+ const WebMouseWheelEvent* wheel_event = |
+ static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); |
+ SendInputEventACK(blink::WebInputEvent::kMouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(1)); |
+ const WebGestureEvent* gesture_event = |
+ static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureScrollBegin, gesture_event->GetType()); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(2)); |
+ gesture_event = static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureScrollUpdate, gesture_event->GetType()); |
+ EXPECT_EQ(0U, gesture_event->data.scroll_update.delta_x); |
+ EXPECT_EQ(5U, gesture_event->data.scroll_update.delta_y); |
+ SendInputEventACK(WebInputEvent::kGestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_CONSUMED); |
+ sink_->ClearMessages(); |
+ |
+ ui::GestureEventDetails event_details(ui::ET_GESTURE_SCROLL_BEGIN); |
+ event_details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHSCREEN); |
+ ui::GestureEvent scroll_begin(2, 2, 0, ui::EventTimeForNow(), event_details); |
+ view_->OnGestureEvent(&scroll_begin); |
+ EXPECT_EQ(3U, sink_->message_count()); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(0)); |
+ wheel_event = static_cast<const WebMouseWheelEvent*>(input_event); |
+ EXPECT_EQ(WebMouseWheelEvent::kPhaseEnded, wheel_event->phase); |
+ EXPECT_EQ(0U, wheel_event->delta_x); |
+ EXPECT_EQ(0U, wheel_event->delta_y); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(1)); |
+ gesture_event = static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureScrollEnd, gesture_event->GetType()); |
+ EXPECT_EQ(blink::kWebGestureDeviceTouchpad, gesture_event->source_device); |
+ |
+ input_event = GetInputEventFromMessage(*sink_->GetMessageAt(2)); |
+ gesture_event = static_cast<const WebGestureEvent*>(input_event); |
+ EXPECT_EQ(WebInputEvent::kGestureScrollBegin, gesture_event->GetType()); |
+ EXPECT_EQ(blink::kWebGestureDeviceTouchscreen, gesture_event->source_device); |
+ sink_->ClearMessages(); |
+} |
+ |
// Checks that touch-event state is maintained correctly for multiple touch |
// points. |
TEST_F(RenderWidgetHostViewAuraTest, MultiTouchPointsStates) { |
@@ -3528,8 +3760,12 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelNotPreciseScrollEvent() { |
SetUpOverscrollEnvironment(); |
// Simulate wheel events. |
- SimulateWheelEvent(-5, 0, 0, false); // sent directly |
- SimulateWheelEvent(-60, 1, 0, false); // enqueued |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -5, 0, 0, false, |
+ WebMouseWheelEvent::kPhaseBegan); // sent directly |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -60, 1, 0, false, |
+ WebMouseWheelEvent::kPhaseChanged); // enqueued |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
@@ -3550,6 +3786,13 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelNotPreciseScrollEvent() { |
SendInputEventACK(WebInputEvent::kGestureScrollUpdate, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ if (wheel_scroll_latching_enabled_) { |
+ SimulateWheelEventWithPhase(0, 0, 0, false, |
+ WebMouseWheelEvent::kPhaseEnded); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::kMouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ } |
ExpectGestureScrollEndForWheelScrolling(true); |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
@@ -3567,12 +3810,24 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollEventOverscrolls() { |
SetUpOverscrollEnvironment(); |
// 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 |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -5, 0, 0, true, |
+ WebMouseWheelEvent::kPhaseBegan); // sent directly |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -1, 1, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // enqueued |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -10, -3, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -15, -1, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -30, -3, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -20, 6, 1, true, |
+ WebMouseWheelEvent::kPhaseChanged); // enqueued, different modifiers |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
@@ -3639,12 +3894,25 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
SetUpOverscrollEnvironment(); |
// 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 |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -5, 0, 0, true, |
+ WebMouseWheelEvent::kPhaseBegan); // sent directly |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -1, -1, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // enqueued |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -10, -3, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -15, -1, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -30, -3, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -20, 6, 1, true, |
+ WebMouseWheelEvent::kPhaseChanged); // enqueued, different modifiers |
+ |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
@@ -3679,6 +3947,13 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
SendInputEventACK(WebInputEvent::kGestureScrollUpdate, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ if (wheel_scroll_latching_enabled_) { |
+ SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::kMouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ } |
+ |
ExpectGestureScrollEndForWheelScrolling(true); |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
} |
@@ -3697,7 +3972,9 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { |
// 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); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, 10, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseBegan); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3711,7 +3988,9 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
// Scroll some more so as to not overscroll. |
- SimulateWheelEvent(10, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, 10, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3725,7 +4004,9 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
// Scroll some more to initiate an overscroll. |
- SimulateWheelEvent(40, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, 40, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3742,7 +4023,9 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { |
EXPECT_EQ(0.f, overscroll_delegate()->delta_y()); |
// Scroll in the reverse direction enough to abort the overscroll. |
- SimulateWheelEvent(-20, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, -20, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3756,7 +4039,10 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
// Continue to scroll in the reverse direction. |
- SimulateWheelEvent(-20, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, -20, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
+ |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3771,7 +4057,9 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { |
// Continue to scroll in the reverse direction enough to initiate overscroll |
// in that direction. |
- SimulateWheelEvent(-55, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, -55, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3779,6 +4067,12 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { |
SendInputEventACK(WebInputEvent::kGestureScrollUpdate, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ if (wheel_scroll_latching_enabled_) { |
+ SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::kMouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ } |
ExpectGestureScrollEndForWheelScrolling(true); |
EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); |
@@ -3800,7 +4094,9 @@ void RenderWidgetHostViewAuraOverscrollTest::ScrollEventsOverscrollWithFling() { |
// 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); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, 10, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseBegan); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3814,7 +4110,9 @@ void RenderWidgetHostViewAuraOverscrollTest::ScrollEventsOverscrollWithFling() { |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
// Scroll some more so as to not overscroll. |
- SimulateWheelEvent(20, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, 20, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
EXPECT_EQ(1U, sink_->message_count()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3825,7 +4123,9 @@ void RenderWidgetHostViewAuraOverscrollTest::ScrollEventsOverscrollWithFling() { |
sink_->ClearMessages(); |
// Scroll some more to initiate an overscroll. |
- SimulateWheelEvent(30, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, 30, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3851,13 +4151,8 @@ void RenderWidgetHostViewAuraOverscrollTest::ScrollEventsOverscrollWithFling() { |
SimulateGestureFlingStartEvent(0.f, 0.1f, blink::kWebGestureDeviceTouchpad); |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
- if (!wheel_scroll_latching_enabled_) { |
- // ScrollBegin and FlingStart will be queued events. |
- EXPECT_EQ(2U, sink_->message_count()); |
- } else { |
- // ScrollEnd, ScrollBegin, and FlingStart will be queued events. |
- EXPECT_EQ(3U, sink_->message_count()); |
- } |
+ // ScrollBegin and FlingStart will be queued events. |
+ EXPECT_EQ(2U, sink_->message_count()); |
} |
TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
ScrollEventsOverscrollWithFling) { |
@@ -3876,7 +4171,9 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
// 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); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, 10, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseBegan); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3890,7 +4187,9 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
// Scroll some more so as to not overscroll. |
- SimulateWheelEvent(20, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, 20, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3904,7 +4203,9 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); |
// Scroll some more to initiate an overscroll. |
- SimulateWheelEvent(30, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, 30, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -3930,13 +4231,8 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
SimulateGestureFlingStartEvent(10.f, 0.f, blink::kWebGestureDeviceTouchpad); |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
- if (!wheel_scroll_latching_enabled_) { |
// ScrollBegin and FlingStart will be queued events. |
EXPECT_EQ(2U, sink_->message_count()); |
- } else { |
- // ScrollEnd, ScrollBegin, and FlingStart will be queued events. |
- EXPECT_EQ(3U, sink_->message_count()); |
- } |
} |
TEST_F(RenderWidgetHostViewAuraOverscrollTest, |
ScrollEventsOverscrollWithZeroFling) { |
@@ -4397,7 +4693,9 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
SetUpOverscrollEnvironment(); |
// Send wheel event and receive ack as not consumed. |
- SimulateWheelEvent(125, -5, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, 125, |
+ -5, 0, true, |
+ WebMouseWheelEvent::kPhaseBegan); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -4414,7 +4712,9 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
// controller will not consume the event, because it is not triggering |
// gesture-nav. |
- SimulateWheelEvent(-260, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, |
+ -260, 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -4429,7 +4729,9 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); |
EXPECT_EQ(OVERSCROLL_WEST, overscroll_delegate()->current_mode()); |
- SimulateWheelEvent(-20, 0, 0, true); |
+ SimulateWheelEventPossiblyIncludingPhase(!wheel_scroll_latching_enabled_, -20, |
+ 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
SendInputEventACK(WebInputEvent::kMouseWheel, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
@@ -4458,11 +4760,22 @@ TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, |
void RenderWidgetHostViewAuraOverscrollTest::OverscrollMouseMoveCompletion() { |
SetUpOverscrollEnvironment(); |
- 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 |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, 5, 0, 0, true, |
+ WebMouseWheelEvent::kPhaseBegan); // sent directly |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -1, 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // enqueued |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -10, -3, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -15, -1, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -30, -3, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
@@ -4556,10 +4869,18 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
OverscrollStateResetsAfterScroll() { |
SetUpOverscrollEnvironment(); |
- SimulateWheelEvent(0, 5, 0, true); // sent directly |
- SimulateWheelEvent(0, 30, 0, true); // enqueued |
- SimulateWheelEvent(0, 40, 0, true); // coalesced into previous event |
- SimulateWheelEvent(0, 10, 0, true); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, 0, 5, 0, true, |
+ WebMouseWheelEvent::kPhaseBegan); // sent directly |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, 0, 30, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // enqueued |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, 0, 40, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, 0, 10, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
@@ -4580,6 +4901,13 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
SendInputEventACK(WebInputEvent::kGestureScrollUpdate, |
INPUT_EVENT_ACK_STATE_CONSUMED); |
+ |
+ if (wheel_scroll_latching_enabled_) { |
+ SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::kMouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ } |
ExpectGestureScrollEndForWheelScrolling(true); |
EXPECT_TRUE(ScrollStateIsContentScrolling()); |
@@ -4601,9 +4929,16 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
// ScrollBegin, and ScrollEnd will be queued events. |
EXPECT_EQ(2U, GetSentMessageCountAndResetSink()); |
- SimulateWheelEvent(-5, 0, 0, true); // sent directly |
- SimulateWheelEvent(-60, 0, 0, true); // enqueued |
- SimulateWheelEvent(-100, 0, 0, true); // coalesced into previous event |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -5, 0, 0, true, |
+ WebMouseWheelEvent::kPhaseBegan); // sent directly |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -60, 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // enqueued |
+ SimulateWheelEventPossiblyIncludingPhase( |
+ !wheel_scroll_latching_enabled_, -100, 0, 0, true, |
+ WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event |
+ |
EXPECT_TRUE(ScrollStateIsUnknown()); |
EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
@@ -4624,6 +4959,14 @@ void RenderWidgetHostViewAuraOverscrollTest:: |
SendInputEventACK(WebInputEvent::kGestureScrollUpdate, |
INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ |
+ if (wheel_scroll_latching_enabled_) { |
+ SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); |
+ EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); |
+ SendInputEventACK(WebInputEvent::kMouseWheel, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ } |
+ |
ExpectGestureScrollEndForWheelScrolling(true); |
EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); |
EXPECT_TRUE(ScrollStateIsOverscrolling()); |