diff options
Diffstat (limited to 'chromium/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc')
-rw-r--r-- | chromium/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc | 1239 |
1 files changed, 449 insertions, 790 deletions
diff --git a/chromium/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/chromium/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc index b84c96372ca..9aac9b4c740 100644 --- a/chromium/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc +++ b/chromium/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc @@ -213,8 +213,7 @@ class TestWindowObserver : public aura::WindowObserver { class FakeWindowEventDispatcher : public aura::WindowEventDispatcher { public: FakeWindowEventDispatcher(aura::WindowTreeHost* host) - : WindowEventDispatcher(host), - processed_touch_event_count_(0) {} + : WindowEventDispatcher(host, true), processed_touch_event_count_(0) {} void ProcessedTouchEvent( uint32_t unique_event_id, @@ -385,6 +384,20 @@ class MockRenderWidgetHostImpl : public RenderWidgetHostImpl { lastWheelOrTouchEventLatencyInfo = ui::LatencyInfo(ui_latency); } + void ForwardGestureEventWithLatencyInfo( + const blink::WebGestureEvent& gesture_event, + const ui::LatencyInfo& ui_latency) override { + RenderWidgetHostImpl::ForwardGestureEventWithLatencyInfo(gesture_event, + ui_latency); + last_forwarded_gesture_event_ = gesture_event; + } + + base::Optional<WebGestureEvent> GetAndResetLastForwardedGestureEvent() { + base::Optional<WebGestureEvent> ret; + last_forwarded_gesture_event_.swap(ret); + return ret; + } + static MockRenderWidgetHostImpl* Create(RenderWidgetHostDelegate* delegate, RenderProcessHost* process, int32_t routing_id) { @@ -429,8 +442,9 @@ class MockRenderWidgetHostImpl : public RenderWidgetHostImpl { new_content_rendering_timeout_fired_ = true; } - bool new_content_rendering_timeout_fired_; + bool new_content_rendering_timeout_fired_ = false; std::unique_ptr<MockWidgetImpl> widget_impl_; + base::Optional<WebGestureEvent> last_forwarded_gesture_event_; }; class TestScopedKeyboardHook : public aura::ScopedKeyboardHook { @@ -472,19 +486,14 @@ void TestScopedKeyboardHook::LockSpecificKey(ui::DomCode dom_code) { locked_key_ = dom_code; } -enum WheelScrollingMode { - kWheelScrollingModeNone, - kWheelScrollLatching, - kAsyncWheelEvents, -}; - class RenderWidgetHostViewAuraTest : public testing::Test { public: - RenderWidgetHostViewAuraTest( - WheelScrollingMode wheel_scrolling_mode = kWheelScrollingModeNone) - : wheel_scrolling_mode_(wheel_scrolling_mode), - widget_host_uses_shutdown_to_destroy_(false), - is_guest_view_hack_(false) {} + RenderWidgetHostViewAuraTest() + : widget_host_uses_shutdown_to_destroy_(false), + is_guest_view_hack_(false) { + ui::GestureConfiguration::GetInstance()->set_scroll_debounce_interval_in_ms( + 0); + } static void InstallDelegatedFrameHostClient( RenderWidgetHostViewAura* view, @@ -610,34 +619,10 @@ class RenderWidgetHostViewAuraTest : public testing::Test { const ui::MotionEventAura& pointer_state() { return view_->pointer_state(); } void SetFeatureList() { - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - feature_list_.InitWithFeatures({features::kTouchpadAndWheelScrollLatching, - features::kAsyncWheelEvents}, - {}); - } else if (wheel_scrolling_mode_ == kWheelScrollLatching) { - feature_list_.InitWithFeatures( - {features::kTouchpadAndWheelScrollLatching}, - {features::kAsyncWheelEvents}); - } else if (wheel_scrolling_mode_ == kWheelScrollingModeNone) { - feature_list_.InitWithFeatures({}, - {features::kTouchpadAndWheelScrollLatching, - features::kAsyncWheelEvents}); - } - vsync_feature_list_.InitAndEnableFeature( features::kVsyncAlignedInputEvents); } - void TimerBasedWheelEventPhaseInfo(); - void TimerBasedLatchingBreaksWithMouseMove(); - void TimerBasedLatchingBreaksWithModifiersChange(); - void TimerBasedLatchingBreaksWithDirectionChange(); - void TimerBasedLatchingBreaksWithAutoscrollStart(); - void TouchpadFlingStartResetsWheelPhaseState(); - void GSBWithTouchSourceStopsWheelScrollSequence(); - - WheelScrollingMode wheel_scrolling_mode_; - protected: BrowserContext* browser_context() { return browser_context_.get(); } @@ -722,32 +707,6 @@ class RenderWidgetHostViewAuraSurfaceSynchronizationTest base::test::ScopedFeatureList surface_synchronization_feature_list_; }; -class RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest - : public RenderWidgetHostViewAuraTest { - public: - RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest() - : RenderWidgetHostViewAuraTest(kWheelScrollLatching) {} - void SetUp() override { - SetFeatureList(); - ui::GestureConfiguration::GetInstance()->set_scroll_debounce_interval_in_ms( - 0); - RenderWidgetHostViewAuraTest::SetUpEnvironment(); - } -}; - -class RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest - : public RenderWidgetHostViewAuraTest { - public: - RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest() - : RenderWidgetHostViewAuraTest(kAsyncWheelEvents) {} - void SetUp() override { - SetFeatureList(); - ui::GestureConfiguration::GetInstance()->set_scroll_debounce_interval_in_ms( - 0); - RenderWidgetHostViewAuraTest::SetUpEnvironment(); - } -}; - void InstallDelegatedFrameHostClient( RenderWidgetHostViewAura* render_widget_host_view, std::unique_ptr<DelegatedFrameHostClient> delegated_frame_host_client) { @@ -795,11 +754,7 @@ class RenderWidgetHostViewGuestAuraTest : public RenderWidgetHostViewAuraTest { class RenderWidgetHostViewAuraOverscrollTest : public RenderWidgetHostViewAuraTest { public: - RenderWidgetHostViewAuraOverscrollTest( - WheelScrollingMode wheel_scrolling_mode = kWheelScrollLatching) - : RenderWidgetHostViewAuraTest(wheel_scrolling_mode), - wheel_scroll_latching_enabled_(wheel_scrolling_mode != - kWheelScrollingModeNone) {} + RenderWidgetHostViewAuraOverscrollTest() : RenderWidgetHostViewAuraTest() {} // We explicitly invoke SetUp to allow gesture debounce customization. void SetUp() override {} @@ -823,16 +778,14 @@ class RenderWidgetHostViewAuraOverscrollTest void SendScrollBeginAckIfNeeded( MockWidgetInputHandler::MessageVector& messages, InputEventAckState ack_result) { - if (wheel_scroll_latching_enabled_) { - for (size_t i = 0; i < messages.size(); ++i) { - MockWidgetInputHandler::DispatchedEventMessage* event = - messages[i]->ToEvent(); - // GSB events are blocking, send the ack. - if (event && event->Event()->web_event->GetType() == - WebInputEvent::kGestureScrollBegin) { - event->CallCallback(ack_result); - return; - } + for (size_t i = 0; i < messages.size(); ++i) { + MockWidgetInputHandler::DispatchedEventMessage* event = + messages[i]->ToEvent(); + // GSB events are blocking, send the ack. + if (event && event->Event()->web_event->GetType() == + WebInputEvent::kGestureScrollBegin) { + event->CallCallback(ack_result); + return; } } } @@ -887,17 +840,11 @@ class RenderWidgetHostViewAuraOverscrollTest base::RunLoop().RunUntilIdle(); } - void SimulateWheelEvent(float dX, float dY, int modifiers, bool precise) { - widget_host_->ForwardWheelEvent(SyntheticWebMouseWheelEventBuilder::Build( - 0, 0, dX, dY, modifiers, precise)); - base::RunLoop().RunUntilIdle(); - } - - void SimulateWheelEventWithPhase(float dX, - float dY, - int modifiers, - bool precise, - WebMouseWheelEvent::Phase phase) { + void SimulateWheelEvent(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; @@ -905,30 +852,6 @@ class RenderWidgetHostViewAuraOverscrollTest base::RunLoop().RunUntilIdle(); } - void SimulateWheelEventPossiblyIncludingPhase( - float dX, - float dY, - int modifiers, - bool precise, - WebMouseWheelEvent::Phase phase) { - if (wheel_scroll_latching_enabled_) - SimulateWheelEventWithPhase(dX, dY, modifiers, precise, phase); - else - SimulateWheelEvent(dX, dY, modifiers, precise); - } - - void SimulateWheelEventWithLatencyInfo(float dX, - float dY, - int modifiers, - bool precise, - const ui::LatencyInfo& ui_latency) { - widget_host_->ForwardWheelEventWithLatencyInfo( - SyntheticWebMouseWheelEventBuilder::Build(0, 0, dX, dY, modifiers, - precise), - ui_latency); - base::RunLoop().RunUntilIdle(); - } - void SimulateMouseMove(int x, int y, int modifiers) { SimulateMouseEvent(WebInputEvent::kMouseMove, x, y, modifiers, false); } @@ -946,12 +869,6 @@ class RenderWidgetHostViewAuraOverscrollTest base::RunLoop().RunUntilIdle(); } - void SimulateWheelEventWithPhase(WebMouseWheelEvent::Phase phase) { - widget_host_->ForwardWheelEvent( - SyntheticWebMouseWheelEventBuilder::Build(phase)); - base::RunLoop().RunUntilIdle(); - } - // Inject provided synthetic WebGestureEvent instance. void SimulateGestureEventCore(const WebGestureEvent& gesture_event) { widget_host_->ForwardGestureEvent(gesture_event); @@ -1059,15 +976,26 @@ class RenderWidgetHostViewAuraOverscrollTest touch_event_.ReleasePoint(index); } + void PressAndSetTouchActionAuto() { + PressTouchPoint(0, 1); + SendTouchEvent(); + widget_host_->input_router()->OnSetTouchAction(cc::kTouchActionAuto); + MockWidgetInputHandler::MessageVector events = + GetAndResetDispatchedMessages(); + EXPECT_EQ("TouchStart", GetMessageNames(events)); + } + + void ReleaseAndResetDispatchedMessages() { + ReleaseTouchPoint(0); + SendTouchEvent(); + MockWidgetInputHandler::MessageVector events = + GetAndResetDispatchedMessages(); + } + MockWidgetInputHandler::MessageVector ExpectGestureScrollEndForWheelScrolling( bool is_last) { MockWidgetInputHandler::MessageVector events = GetAndResetDispatchedMessages(); - if (!wheel_scroll_latching_enabled_) { - // Already handled in |ExpectGestureScrollEventsAfterMouseWheelACK()|. - EXPECT_EQ(0U, events.size()); - return events; - } if (is_last) { // Scroll latching will have one GestureScrollEnd at the end. EXPECT_EQ("GestureScrollEnd", GetMessageNames(events)); @@ -1085,8 +1013,6 @@ class RenderWidgetHostViewAuraOverscrollTest MockWidgetInputHandler::MessageVector events = GetAndResetDispatchedMessages(); std::string expected_events; - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - EXPECT_TRUE(wheel_scroll_latching_enabled_); // If the ack for the first sent event is not consumed, // MouseWheelEventQueue(MWEQ) sends the rest of the wheel events in the // current scrolling sequence as non-blocking events. Since MWEQ @@ -1100,30 +1026,6 @@ class RenderWidgetHostViewAuraOverscrollTest expected_events += "GestureScrollBegin GestureScrollUpdate "; for (size_t i = 0; i < enqueued_wheel_event_count; ++i) expected_events += "MouseWheel GestureScrollUpdate "; - } else if (wheel_scrolling_mode_ == kWheelScrollLatching) { - EXPECT_TRUE(wheel_scroll_latching_enabled_); - // Since the MWEQ must wait for ack of the sent event before sending the - // next queued event, when wheel events are blocking only one queued - // event will be sent regardless of the number of the queued wheel - // events. - // Expecting a GSU or GSB+GSU for ACKing the previous MouseWheel, plus an - // additional MouseWheel if the queue is not empty. GSE will be delayed by - // scroll latching. - if (is_first_ack) - expected_events += "GestureScrollBegin "; - expected_events += "GestureScrollUpdate "; - if (enqueued_wheel_event_count != 0) - expected_events += "MouseWheel"; - } else { - // The MWEQ must wait for ack of the sent event before sending the - // next queued event. - // Expecting a GSB+GSU+GSE for ACKing the previous MouseWheel, plus an - // additional MouseWheel if the queue is not empty. - expected_events += - "GestureScrollBegin GestureScrollUpdate GestureScrollEnd "; - if (enqueued_wheel_event_count != 0) - expected_events += "MouseWheel"; - } EXPECT_EQ(base::TrimWhitespaceASCII(expected_events, base::TRIM_TRAILING), GetMessageNames(events)); @@ -1157,60 +1059,16 @@ class RenderWidgetHostViewAuraOverscrollTest return events; } - void ExpectGestureScrollEventsAfterMouseWheelAckWhenOverscrolling() { - MockWidgetInputHandler::MessageVector events = - GetAndResetDispatchedMessages(); - // Wheel event ack either: - // - does not generate a gesture scroll update (async wheel event); or - // - generates a gesture scroll update that is consumed by the overscroll - // controller to prevent content scroll (non-async wheel event). - if (wheel_scroll_latching_enabled_) { - EXPECT_EQ(0U, events.size()); - } else { - // Wheel event ack generates a gesture scroll begin, a gesture scroll - // update, and a gesture scroll end; of which the gesture scroll update is - // consumed by the overscroll controller to prevent content scroll. - EXPECT_EQ("GestureScrollBegin GestureScrollEnd", GetMessageNames(events)); - } - } - - void WheelNotPreciseScrollEvent(); - void WheelScrollOverscrollToggle(); - void OverscrollMouseMoveCompletion(); - void WheelScrollEventOverscrolls(); - void WheelScrollConsumedDoNotOverscroll(); - void ScrollEventsOverscrollWithFling(); - void OverscrollDirectionChangeMouseWheel(); - void OverscrollStateResetsAfterScroll(); - void ScrollDeltasResetOnEnd(); - void ScrollEventsOverscrollWithZeroFling(); - SyntheticWebTouchEvent touch_event_; std::unique_ptr<TestOverscrollDelegate> overscroll_delegate_; - bool wheel_scroll_latching_enabled_; - private: base::test::ScopedFeatureList scoped_feature_list_; DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraOverscrollTest); }; -class RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest - : public RenderWidgetHostViewAuraOverscrollTest { - public: - RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest() - : RenderWidgetHostViewAuraOverscrollTest(kWheelScrollingModeNone) {} -}; - -class RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest - : public RenderWidgetHostViewAuraOverscrollTest { - public: - RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest() - : RenderWidgetHostViewAuraOverscrollTest(kAsyncWheelEvents) {} -}; - class RenderWidgetHostViewAuraShutdownTest : public RenderWidgetHostViewAuraTest { public: @@ -2001,11 +1859,7 @@ TEST_F(RenderWidgetHostViewAuraTest, } } -void RenderWidgetHostViewAuraTest::TimerBasedWheelEventPhaseInfo() { - // The test is valid only when wheel scroll latching is enabled. - if (wheel_scrolling_mode_ == kWheelScrollingModeNone) - return; - +TEST_F(RenderWidgetHostViewAuraTest, TimerBasedWheelEventPhaseInfo) { view_->InitAsChild(nullptr); view_->Show(); sink_->ClearMessages(); @@ -2049,16 +1903,9 @@ void RenderWidgetHostViewAuraTest::TimerBasedWheelEventPhaseInfo() { events[0]->ToEvent()->Event()->web_event.get()); base::TimeTicks wheel_event_timestamp = wheel_event->TimeStamp(); EXPECT_EQ(WebMouseWheelEvent::kPhaseChanged, wheel_event->phase); - if (wheel_scrolling_mode_ == kWheelScrollLatching) { - events[0]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); - events = GetAndResetDispatchedMessages(); - gesture_event = static_cast<const WebGestureEvent*>( - events[0]->ToEvent()->Event()->web_event.get()); - } else { // wheel_scrolling_mode_ == kAsyncWheelEvents. + gesture_event = static_cast<const WebGestureEvent*>( events[1]->ToEvent()->Event()->web_event.get()); - } - 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); @@ -2085,23 +1932,11 @@ void RenderWidgetHostViewAuraTest::TimerBasedWheelEventPhaseInfo() { EXPECT_EQ(WebInputEvent::kGestureScrollEnd, gesture_event->GetType()); EXPECT_TRUE(gesture_event->data.scroll_end.synthetic); } -TEST_F(RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest, - TimerBasedWheelEventPhaseInfo) { - TimerBasedWheelEventPhaseInfo(); -} -TEST_F(RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest, - TimerBasedWheelEventPhaseInfo) { - TimerBasedWheelEventPhaseInfo(); -} // Tests that latching breaks when the difference between location of the first // wheel event in the sequence and the location of the current wheel event is // larger than some maximum threshold. -void RenderWidgetHostViewAuraTest::TimerBasedLatchingBreaksWithMouseMove() { - // The test is valid only when wheel scroll latching is enabled. - if (wheel_scrolling_mode_ == kWheelScrollingModeNone) - return; - +TEST_F(RenderWidgetHostViewAuraTest, TimerBasedLatchingBreaksWithMouseMove) { // Set the mouse_wheel_phase_handler_ timer timeout to a large value to make // sure that the timer is still running when the wheel event with different // location is sent. @@ -2137,16 +1972,11 @@ void RenderWidgetHostViewAuraTest::TimerBasedLatchingBreaksWithMouseMove() { view_->OnMouseEvent(&event2); base::RunLoop().RunUntilIdle(); events = GetAndResetDispatchedMessages(); - if (wheel_scrolling_mode_ == kWheelScrollLatching) - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - else - EXPECT_EQ("MouseWheel GestureScrollUpdate", GetMessageNames(events)); + EXPECT_EQ("MouseWheel GestureScrollUpdate", GetMessageNames(events)); wheel_event = static_cast<const WebMouseWheelEvent*>( events[0]->ToEvent()->Event()->web_event.get()); EXPECT_EQ(WebMouseWheelEvent::kPhaseChanged, wheel_event->phase); - if (wheel_scrolling_mode_ == kWheelScrollLatching) - events[0]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); events = GetAndResetDispatchedMessages(); // Send the third wheel event with a location outside of the slop region. The @@ -2167,23 +1997,11 @@ void RenderWidgetHostViewAuraTest::TimerBasedLatchingBreaksWithMouseMove() { events[2]->ToEvent()->Event()->web_event.get()); EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); } -TEST_F(RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest, - TimerBasedLatchingBreaksWithMouseMove) { - TimerBasedLatchingBreaksWithMouseMove(); -} -TEST_F(RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest, - TimerBasedLatchingBreaksWithMouseMove) { - TimerBasedLatchingBreaksWithMouseMove(); -} // Tests that latching breaks when the current wheel event has different // modifiers. -void RenderWidgetHostViewAuraTest:: - TimerBasedLatchingBreaksWithModifiersChange() { - // The test is valid only when wheel scroll latching is enabled. - if (wheel_scrolling_mode_ == kWheelScrollingModeNone) - return; - +TEST_F(RenderWidgetHostViewAuraTest, + TimerBasedLatchingBreaksWithModifiersChange) { // Set the mouse_wheel_phase_handler_ timer timeout to a large value to make // sure that the timer is still running when the wheel event with different // modifiers is sent. @@ -2216,16 +2034,11 @@ void RenderWidgetHostViewAuraTest:: view_->OnMouseEvent(&event2); base::RunLoop().RunUntilIdle(); events = GetAndResetDispatchedMessages(); - if (wheel_scrolling_mode_ == kWheelScrollLatching) - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - else - EXPECT_EQ("MouseWheel GestureScrollUpdate", GetMessageNames(events)); + EXPECT_EQ("MouseWheel GestureScrollUpdate", GetMessageNames(events)); wheel_event = static_cast<const WebMouseWheelEvent*>( events[0]->ToEvent()->Event()->web_event.get()); EXPECT_EQ(WebMouseWheelEvent::kPhaseChanged, wheel_event->phase); - if (wheel_scrolling_mode_ == kWheelScrollLatching) - events[0]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); events = GetAndResetDispatchedMessages(); // Send the third wheel event with a ctrl key down. The third wheel event will @@ -2245,24 +2058,12 @@ void RenderWidgetHostViewAuraTest:: events[2]->ToEvent()->Event()->web_event.get()); EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); } -TEST_F(RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest, - TimerBasedLatchingBreaksWithModifiersChange) { - TimerBasedLatchingBreaksWithModifiersChange(); -} -TEST_F(RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest, - TimerBasedLatchingBreaksWithModifiersChange) { - TimerBasedLatchingBreaksWithModifiersChange(); -} // Tests that latching breaks when the new wheel event goes a different // direction from previous wheel events and the previous GSU events are not // consumed. -void RenderWidgetHostViewAuraTest:: - TimerBasedLatchingBreaksWithDirectionChange() { - // The test is valid only when wheel scroll latching is enabled. - if (wheel_scrolling_mode_ == kWheelScrollingModeNone) - return; - +TEST_F(RenderWidgetHostViewAuraTest, + TimerBasedLatchingBreaksWithDirectionChange) { // Set the mouse_wheel_phase_handler_ timer timeout to a large value to make // sure that the timer is still running when the wheel event with different // modifiers is sent. @@ -2312,21 +2113,9 @@ void RenderWidgetHostViewAuraTest:: events[2]->ToEvent()->Event()->web_event.get()); EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); } -TEST_F(RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest, - TimerBasedLatchingBreaksWithDirectionChange) { - TimerBasedLatchingBreaksWithDirectionChange(); -} -TEST_F(RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest, - TimerBasedLatchingBreaksWithDirectionChange) { - TimerBasedLatchingBreaksWithDirectionChange(); -} - -void RenderWidgetHostViewAuraTest:: - TimerBasedLatchingBreaksWithAutoscrollStart() { - // The test is valid only when wheel scroll latching is enabled. - if (wheel_scrolling_mode_ == kWheelScrollingModeNone) - return; +TEST_F(RenderWidgetHostViewAuraTest, + TimerBasedLatchingBreaksWithAutoscrollStart) { // Set the mouse_wheel_phase_handler_ timer timeout to a large value to make // sure that the timer is still running when the Autoscroll starts. view_->event_handler()->set_mouse_wheel_wheel_phase_handler_timeout( @@ -2349,7 +2138,7 @@ void RenderWidgetHostViewAuraTest:: events[0]->ToEvent()->Event()->web_event.get()); EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); events[0]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); - EXPECT_TRUE(view_->GetMouseWheelPhaseHandler()->HasPendingWheelEndEvent()); + EXPECT_TRUE(GetMouseWheelPhaseHandler()->HasPendingWheelEndEvent()); events = GetAndResetDispatchedMessages(); // Autoscroll start breaks wheel scroll latching sequence by sending the @@ -2357,7 +2146,7 @@ void RenderWidgetHostViewAuraTest:: // immediately and a GSE will be sent. The next wheel event will start a new // scrolling sequence. view_->OnAutoscrollStart(); - EXPECT_FALSE(view_->GetMouseWheelPhaseHandler()->HasPendingWheelEndEvent()); + EXPECT_FALSE(GetMouseWheelPhaseHandler()->HasPendingWheelEndEvent()); ui::MouseWheelEvent event2(gfx::Vector2d(0, 5), gfx::Point(2, 2), gfx::Point(2, 2), ui::EventTimeForNow(), 0, 0); view_->OnMouseEvent(&event2); @@ -2373,18 +2162,10 @@ void RenderWidgetHostViewAuraTest:: events[2]->ToEvent()->Event()->web_event.get()); EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); } -TEST_F(RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest, - TimerBasedLatchingBreaksWithAutoscrollStart) { - TimerBasedLatchingBreaksWithAutoscrollStart(); -} // Tests that a gesture fling start with touchpad source resets wheel phase // state. -void RenderWidgetHostViewAuraTest::TouchpadFlingStartResetsWheelPhaseState() { - // The test is valid only when wheel scroll latching is enabled. - if (wheel_scrolling_mode_ == kWheelScrollingModeNone) - return; - +TEST_F(RenderWidgetHostViewAuraTest, TouchpadFlingStartResetsWheelPhaseState) { // Set the mouse_wheel_phase_handler_ timer timeout to a large value to make // sure that the timer is still running when the touchpad fling start is sent. view_->event_handler()->set_mouse_wheel_wheel_phase_handler_timeout( @@ -2436,26 +2217,14 @@ void RenderWidgetHostViewAuraTest::TouchpadFlingStartResetsWheelPhaseState() { view_->OnScrollEvent(&scroll1); base::RunLoop().RunUntilIdle(); events = GetAndResetDispatchedMessages(); - if (wheel_scrolling_mode_ == kWheelScrollLatching) - EXPECT_EQ(1U, events.size()); - else - EXPECT_EQ(2U, events.size()); + EXPECT_EQ(2U, events.size()); wheel_event = static_cast<const WebMouseWheelEvent*>( events[0]->ToEvent()->Event()->web_event.get()); EXPECT_EQ(WebMouseWheelEvent::kPhaseChanged, wheel_event->phase); - if (wheel_scrolling_mode_ == kWheelScrollLatching) { - events[0]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("GestureScrollUpdate", GetMessageNames(events)); - gesture_event = static_cast<const WebGestureEvent*>( - events[0]->ToEvent()->Event()->web_event.get()); - events[0]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_CONSUMED); - } else { // wheel_scrolling_mode_ == kAsyncWheelEvents - EXPECT_EQ("MouseWheel GestureScrollUpdate", GetMessageNames(events)); - gesture_event = static_cast<const WebGestureEvent*>( - events[1]->ToEvent()->Event()->web_event.get()); - events[1]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_CONSUMED); - } + EXPECT_EQ("MouseWheel GestureScrollUpdate", GetMessageNames(events)); + gesture_event = static_cast<const WebGestureEvent*>( + events[1]->ToEvent()->Event()->web_event.get()); + events[1]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_EQ(WebInputEvent::kGestureScrollUpdate, gesture_event->GetType()); EXPECT_EQ(0U, gesture_event->data.scroll_update.delta_x); EXPECT_EQ(15U, gesture_event->data.scroll_update.delta_y); @@ -2488,21 +2257,64 @@ void RenderWidgetHostViewAuraTest::TouchpadFlingStartResetsWheelPhaseState() { events[2]->ToEvent()->Event()->web_event.get()); EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); } -TEST_F(RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest, - TouchpadFlingStartResetsWheelPhaseState) { - TouchpadFlingStartResetsWheelPhaseState(); -} -TEST_F(RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest, - TouchpadFlingStartResetsWheelPhaseState) { - TouchpadFlingStartResetsWheelPhaseState(); + +// Tests that the touchpad scroll state in mouse wheel phase handler gets reset +// when a mouse wheel event from an external mouse arrives. +TEST_F(RenderWidgetHostViewAuraTest, MouseWheelScrollingAfterGFCWithoutGFS) { + // Set the mouse_wheel_phase_handler_ timer timeout to a large value to make + // sure that the timer is still running when we are checking for the pending + // wheel end event after sending ui::MouseWheelEvent. + view_->event_handler()->set_mouse_wheel_wheel_phase_handler_timeout( + TestTimeouts::action_max_timeout()); + + view_->InitAsChild(nullptr); + view_->Show(); + sink_->ClearMessages(); + + // When the user puts their fingers down a GFC is received. This will change + // the touchpad scroll state in mouse wheel phase handler to may_begin. + EXPECT_EQ( + content::TOUCHPAD_SCROLL_STATE_UNKNOWN, + GetMouseWheelPhaseHandler()->touchpad_scroll_phase_state_for_test()); + ui::ScrollEvent fling_cancel(ui::ET_SCROLL_FLING_CANCEL, gfx::Point(2, 2), + ui::EventTimeForNow(), 0, 0, 0, 0, 0, 2); + view_->OnScrollEvent(&fling_cancel); + GetAndResetDispatchedMessages(); + EXPECT_EQ( + content::TOUCHPAD_SCROLL_MAY_BEGIN, + GetMouseWheelPhaseHandler()->touchpad_scroll_phase_state_for_test()); + EXPECT_FALSE(GetMouseWheelPhaseHandler()->HasPendingWheelEndEvent()); + + // The user lifts their fingers without doing any touchpad scroll + // (ui::ScrollEevent), the touchpad scroll state must still be may_begin since + // without touchpad scrolling no GFS is recieved to reset the state. + EXPECT_EQ( + content::TOUCHPAD_SCROLL_MAY_BEGIN, + GetMouseWheelPhaseHandler()->touchpad_scroll_phase_state_for_test()); + + // The user starts scrolling by external mouse device. + ui::MouseWheelEvent wheel(gfx::Vector2d(0, 5), gfx::Point(2, 2), + gfx::Point(2, 2), ui::EventTimeForNow(), 0, 0); + view_->OnMouseEvent(&wheel); + base::RunLoop().RunUntilIdle(); + MockWidgetInputHandler::MessageVector events = + GetAndResetDispatchedMessages(); + const WebMouseWheelEvent* wheel_event = + static_cast<const WebMouseWheelEvent*>( + events[0]->ToEvent()->Event()->web_event.get()); + EXPECT_EQ("MouseWheel", GetMessageNames(events)); + EXPECT_EQ(WebMouseWheelEvent::kPhaseBegan, wheel_event->phase); + + // After arrival of the mouse wheel event, the touchpad scroll state must get + // reset and the timer based wheel scroll latching must be active. + EXPECT_EQ( + content::TOUCHPAD_SCROLL_STATE_UNKNOWN, + GetMouseWheelPhaseHandler()->touchpad_scroll_phase_state_for_test()); + EXPECT_TRUE(GetMouseWheelPhaseHandler()->HasPendingWheelEndEvent()); } -TEST_F(RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest, +TEST_F(RenderWidgetHostViewAuraTest, ScrollingWithExternalMouseBreaksTouchpadScrollLatching) { - // The test is valid only when wheel scroll latching is enabled. - if (wheel_scrolling_mode_ == kWheelScrollingModeNone) - return; - // Set the mouse_wheel_phase_handler_ timer timeout to a large value to make // sure that the timer is still running when we are checking for the pending // wheel end event after sending ui::MouseWheelEvent. @@ -2572,12 +2384,8 @@ TEST_F(RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest, EXPECT_TRUE(GetMouseWheelPhaseHandler()->HasPendingWheelEndEvent()); } -void RenderWidgetHostViewAuraTest:: - GSBWithTouchSourceStopsWheelScrollSequence() { - // The test is valid only when wheel scroll latching is enabled. - if (wheel_scrolling_mode_ == kWheelScrollingModeNone) - return; - +TEST_F(RenderWidgetHostViewAuraTest, + GSBWithTouchSourceStopsWheelScrollSequence) { // Set the mouse_wheel_phase_handler_ timer timeout to a large value to make // sure that the timer is still running when the GSB event with touch source // is sent. @@ -2609,6 +2417,16 @@ void RenderWidgetHostViewAuraTest:: EXPECT_EQ(5U, gesture_event->data.scroll_update.delta_y); events[1]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_CONSUMED); + ui::GestureEventDetails gesture_tap_down_details(ui::ET_GESTURE_TAP_DOWN); + gesture_tap_down_details.set_is_source_touch_event_set_non_blocking(true); + gesture_tap_down_details.set_device_type( + ui::GestureDeviceType::DEVICE_TOUCHSCREEN); + ui::GestureEvent gesture_tap_down(2, 2, 0, ui::EventTimeForNow(), + gesture_tap_down_details); + view_->OnGestureEvent(&gesture_tap_down); + base::RunLoop().RunUntilIdle(); + events = GetAndResetDispatchedMessages(); + 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); @@ -2637,14 +2455,41 @@ void RenderWidgetHostViewAuraTest:: EXPECT_EQ(blink::kWebGestureDeviceTouchscreen, gesture_event->SourceDevice()); } -TEST_F(RenderWidgetHostViewAuraWheelScrollLatchingEnabledTest, - GSBWithTouchSourceStopsWheelScrollSequence) { - GSBWithTouchSourceStopsWheelScrollSequence(); -} +TEST_F(RenderWidgetHostViewAuraTest, + SyntheticFlingCancelAtTouchpadScrollBegin) { + ui::ScrollEvent scroll_event(ui::ET_SCROLL, gfx::Point(2, 2), + ui::EventTimeForNow(), 0, 0, 5, 0, 5, 2); -TEST_F(RenderWidgetHostViewAuraAsyncWheelEventsEnabledTest, - GSBWithTouchSourceStopsWheelScrollSequence) { - GSBWithTouchSourceStopsWheelScrollSequence(); + // Send the beginning scroll event. This should generate a synthetic fling + // cancel to cancel any ongoing flings before the start of this scroll. + view_->OnScrollEvent(&scroll_event); + base::RunLoop().RunUntilIdle(); + base::Optional<WebGestureEvent> last_gesture = + widget_host_->GetAndResetLastForwardedGestureEvent(); + ASSERT_TRUE(last_gesture); + EXPECT_EQ(WebInputEvent::kGestureFlingCancel, last_gesture->GetType()); + + // Consume the wheel to prevent gesture scrolls from interfering with the + // rest of the test. + MockWidgetInputHandler::MessageVector dispatched_events = + GetAndResetDispatchedMessages(); + EXPECT_EQ("MouseWheel", GetMessageNames(dispatched_events)); + dispatched_events[0]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_CONSUMED); + dispatched_events = GetAndResetDispatchedMessages(); + EXPECT_EQ(0U, dispatched_events.size()); + + // Send a scroll update. A synthetic fling cancel has already been sent for + // this sequence, so we should not generate another. + view_->OnScrollEvent(&scroll_event); + base::RunLoop().RunUntilIdle(); + last_gesture = widget_host_->GetAndResetLastForwardedGestureEvent(); + EXPECT_FALSE(last_gesture); + + dispatched_events = GetAndResetDispatchedMessages(); + EXPECT_EQ("MouseWheel", GetMessageNames(dispatched_events)); + dispatched_events[0]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_CONSUMED); + dispatched_events = GetAndResetDispatchedMessages(); + EXPECT_EQ(0U, dispatched_events.size()); } // Checks that touch-event state is maintained correctly for multiple touch @@ -2659,6 +2504,8 @@ TEST_F(RenderWidgetHostViewAuraTest, MultiTouchPointsStates) { ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, 0)); view_->OnTouchEvent(&press0); + view_->GetFocusedWidget()->input_router()->OnSetTouchAction( + cc::kTouchActionAuto); base::RunLoop().RunUntilIdle(); MockWidgetInputHandler::MessageVector events = @@ -3188,7 +3035,7 @@ viz::CompositorFrame MakeDelegatedFrame(float scale_factor, // This test verifies that returned resources do not require a pending ack. TEST_F(RenderWidgetHostViewAuraTest, ReturnedResources) { // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) + if (!features::IsAshInBrowserProcess()) return; gfx::Size view_size(100, 100); @@ -3219,9 +3066,12 @@ TEST_F(RenderWidgetHostViewAuraTest, ReturnedResources) { // This test verifies that when the CompositorFrameSink changes, the old // resources are not returned. TEST_F(RenderWidgetHostViewAuraTest, TwoOutputSurfaces) { - // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) + // TODO(jonross): Delete this test once Viz launches as it will be obsolete. + // https://crbug.com/844469 + if (base::FeatureList::IsEnabled(features::kVizDisplayCompositor) || + !features::IsAshInBrowserProcess()) { return; + } viz::FakeSurfaceObserver manager_observer; ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); @@ -3361,7 +3211,7 @@ TEST_F(RenderWidgetHostViewAuraTest, ZeroSizeStillGetsLocalSurfaceId) { TEST_F(RenderWidgetHostViewAuraTest, BackgroundColorMatchesCompositorFrame) { // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) + if (!features::IsAshInBrowserProcess()) return; gfx::Size frame_size(100, 100); @@ -3377,7 +3227,7 @@ TEST_F(RenderWidgetHostViewAuraTest, BackgroundColorMatchesCompositorFrame) { cc::RenderFrameMetadata metadata; metadata.root_background_color = SK_ColorRED; view_->SetRenderFrameMetadata(metadata); - view_->OnRenderFrameMetadataChanged(); + view_->OnRenderFrameMetadataChangedAfterActivation(); ui::Layer* parent_layer = view_->GetNativeView()->layer(); EXPECT_EQ(gfx::Rect(0, 0, 100, 100), parent_layer->bounds()); @@ -3398,7 +3248,7 @@ TEST_F(RenderWidgetHostViewAuraTest, BackgroundColorOrder) { cc::RenderFrameMetadata metadata; metadata.root_background_color = SK_ColorWHITE; view_->SetRenderFrameMetadata(metadata); - view_->OnRenderFrameMetadataChanged(); + view_->OnRenderFrameMetadataChangedAfterActivation(); ASSERT_TRUE(view_->GetBackgroundColor()); EXPECT_EQ(static_cast<unsigned>(SK_ColorWHITE), *view_->GetBackgroundColor()); @@ -3523,9 +3373,12 @@ TEST_F(RenderWidgetHostViewAuraTest, DISABLED_Resize) { } TEST_F(RenderWidgetHostViewAuraTest, OutputSurfaceIdChange) { - // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) + // TODO(jonross): Delete this test once Viz launches as it will be obsolete. + // https://crbug.com/844469 + if (base::FeatureList::IsEnabled(features::kVizDisplayCompositor) || + !features::IsAshInBrowserProcess()) { return; + } gfx::Rect view_rect(100, 100); gfx::Size frame_size = view_rect.size(); @@ -3583,10 +3436,6 @@ TEST_F(RenderWidgetHostViewAuraTest, OutputSurfaceIdChange) { // then the fallback is dropped. TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, DropFallbackWhenHidden) { - // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) - return; - view_->InitAsChild(nullptr); aura::client::ParentWindowWithContext( view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), @@ -3601,21 +3450,16 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, EXPECT_FALSE(view_->HasPrimarySurface()); // Submitting a CompositorFrame should not update the fallback SurfaceId - view_->SubmitCompositorFrame( - kArbitraryLocalSurfaceId, - MakeDelegatedFrame(1.f, gfx::Size(400, 400), gfx::Rect(400, 400)), - base::nullopt); + viz::SurfaceId surface_id(view_->GetFrameSinkId(), kArbitraryLocalSurfaceId); + view_->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id, 1.f, gfx::Size(400, 400))); EXPECT_FALSE(view_->HasPrimarySurface()); EXPECT_FALSE(view_->HasFallbackSurface()); } // This test verifies that the primary SurfaceId is populated on resize and -// the fallback SurfaceId is populated on SubmitCompositorFrame. +// the fallback SurfaceId is populated in OnFirstSurfaceActivation. TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, SurfaceChanges) { - // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) - return; - view_->InitAsChild(nullptr); aura::client::ParentWindowWithContext( view_->GetNativeView(), parent_view_->GetNativeView()->GetRootWindow(), @@ -3637,12 +3481,14 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, SurfaceChanges) { EXPECT_EQ(gfx::Size(400, 400), view_->delegated_frame_host_->CurrentFrameSizeInDipForTesting()); + // Fallback SurfaceId should be updated in OnFirstSurfaceActivation. // Submitting a CompositorFrame should update the fallback SurfaceId - view_->SubmitCompositorFrame( - kArbitraryLocalSurfaceId, - MakeDelegatedFrame(1.f, gfx::Size(400, 400), gfx::Rect(400, 400)), - base::nullopt); + viz::SurfaceId surface_id(view_->GetFrameSinkId(), + view_->GetLocalSurfaceId()); + view_->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id, 1.f, gfx::Size(400, 400))); EXPECT_EQ(gfx::Size(400, 400), view_->window_->layer()->size()); + EXPECT_EQ(surface_id, *view_->window_->layer()->GetFallbackSurfaceId()); } // This test verifies that the primary SurfaceId is updated on device scale @@ -3650,7 +3496,7 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, SurfaceChanges) { TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, DeviceScaleFactorChanges) { // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) + if (!features::IsAshInBrowserProcess()) return; view_->InitAsChild(nullptr); @@ -3677,9 +3523,12 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, // the current surface) does not crash, TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, CompositorFrameSinkChange) { - // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) + // TODO(jonross): Delete this test once Viz launches as it will be obsolete. + // https://crbug.com/844469 + if (base::FeatureList::IsEnabled(features::kVizDisplayCompositor) || + !features::IsAshInBrowserProcess()) { return; + } gfx::Rect view_rect(100, 100); gfx::Size frame_size = view_rect.size(); @@ -3711,10 +3560,6 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, // RenderWidgetHostViewAuraTest.DiscardDelegatedFrame. TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, DiscardDelegatedFrames) { - // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) - return; - view_->InitAsChild(nullptr); size_t max_renderer_frames = @@ -3755,9 +3600,10 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, views[i]->Show(); ASSERT_TRUE(views[i]->HasPrimarySurface()); ASSERT_FALSE(views[i]->HasFallbackSurface()); - views[i]->SubmitCompositorFrame( - views[i]->GetLocalSurfaceId(), - MakeDelegatedFrame(1.f, frame_size, view_rect), base::nullopt); + viz::SurfaceId surface_id(views[i]->GetFrameSinkId(), + views[i]->GetLocalSurfaceId()); + views[i]->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id, 1.f, frame_size)); ASSERT_TRUE(views[i]->HasPrimarySurface()); EXPECT_TRUE(views[i]->HasFallbackSurface()); views[i]->Hide(); @@ -3775,9 +3621,10 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, EXPECT_TRUE(views[1]->HasFallbackSurface()); // Swap a frame on it, it should evict the next LRU [1]. - views[0]->SubmitCompositorFrame( - views[0]->GetLocalSurfaceId(), - MakeDelegatedFrame(1.f, frame_size, view_rect), base::nullopt); + viz::SurfaceId surface_id0(views[0]->GetFrameSinkId(), + views[0]->GetLocalSurfaceId()); + views[0]->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id0, 1.f, frame_size)); EXPECT_TRUE(views[0]->HasFallbackSurface()); EXPECT_FALSE(views[1]->HasFallbackSurface()); views[0]->Hide(); @@ -3785,9 +3632,10 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, // LRU renderer is [1], which is still hidden. Showing it and submitting a // CompositorFrame to it should evict the next LRU [2]. views[1]->Show(); - views[1]->SubmitCompositorFrame( - views[1]->GetLocalSurfaceId(), - MakeDelegatedFrame(1.f, frame_size, view_rect), base::nullopt); + viz::SurfaceId surface_id1(views[1]->GetFrameSinkId(), + views[1]->GetLocalSurfaceId()); + views[1]->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id1, 1.f, frame_size)); EXPECT_TRUE(views[0]->HasFallbackSurface()); EXPECT_TRUE(views[1]->HasFallbackSurface()); EXPECT_FALSE(views[2]->HasFallbackSurface()); @@ -3800,25 +3648,24 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, views[i]->Show(); // The renderers who don't have a frame should be waiting. The ones that // have a frame should not. - views[i]->SubmitCompositorFrame( - views[i]->GetLocalSurfaceId(), - MakeDelegatedFrame(1.f, frame_size, view_rect), base::nullopt); + viz::SurfaceId surface_id(views[i]->GetFrameSinkId(), + views[i]->GetLocalSurfaceId()); + views[i]->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id, 1.f, frame_size)); EXPECT_TRUE(views[i]->HasFallbackSurface()); } EXPECT_FALSE(views[0]->HasFallbackSurface()); // Swap a frame on [0], it should be evicted immediately. - views[0]->SubmitCompositorFrame( - views[0]->GetLocalSurfaceId(), - MakeDelegatedFrame(1.f, frame_size, view_rect), base::nullopt); + views[0]->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id0, 1.f, frame_size)); EXPECT_FALSE(views[0]->HasFallbackSurface()); // Make [0] visible, and swap a frame on it. Nothing should be evicted // although we're above the limit. views[0]->Show(); - views[0]->SubmitCompositorFrame( - views[0]->GetLocalSurfaceId(), - MakeDelegatedFrame(1.f, frame_size, view_rect), base::nullopt); + views[0]->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id0, 1.f, frame_size)); for (size_t i = 0; i < renderer_count; ++i) EXPECT_TRUE(views[i]->HasFallbackSurface()) << i; @@ -3839,9 +3686,8 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, EXPECT_FALSE(views[1]->HasFallbackSurface()); // Show it, it should block until we give it a frame. views[1]->Show(); - views[1]->SubmitCompositorFrame( - views[1]->GetLocalSurfaceId(), - MakeDelegatedFrame(1.f, size2, gfx::Rect(size2)), base::nullopt); + views[1]->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id1, 1.f, frame_size)); for (size_t i = 0; i < renderer_count; ++i) { views[i]->Destroy(); @@ -3850,10 +3696,6 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, } TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFramesWithLocking) { - // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) - return; - view_->InitAsChild(nullptr); size_t max_renderer_frames = @@ -3889,10 +3731,10 @@ TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFramesWithLocking) { // occur because all frames are visible. for (size_t i = 0; i < renderer_count; ++i) { views[i]->Show(); - views[i]->SubmitCompositorFrame( - i ? parent_local_surface_id_allocator_.GenerateId() - : kArbitraryLocalSurfaceId, - MakeDelegatedFrame(1.f, frame_size, view_rect), base::nullopt); + viz::SurfaceId surface_id(views[i]->GetFrameSinkId(), + views[i]->GetLocalSurfaceId()); + views[i]->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id, 1.f, frame_size)); EXPECT_TRUE(views[i]->HasFallbackSurface()); } @@ -3902,9 +3744,10 @@ TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFramesWithLocking) { // If we lock [0] before hiding it, then [0] should not be evicted. views[0]->Show(); - views[0]->SubmitCompositorFrame( - kArbitraryLocalSurfaceId, MakeDelegatedFrame(1.f, frame_size, view_rect), - base::nullopt); + viz::SurfaceId surface_id(views[0]->GetFrameSinkId(), + views[0]->GetLocalSurfaceId()); + views[0]->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id, 1.f, frame_size)); EXPECT_TRUE(views[0]->HasFallbackSurface()); views[0]->GetDelegatedFrameHost()->LockResources(); views[0]->Hide(); @@ -3923,10 +3766,6 @@ TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFramesWithLocking) { // Test that changing the memory pressure should delete saved frames. This test // only applies to ChromeOS. TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFramesWithMemoryPressure) { - // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) - return; - view_->InitAsChild(nullptr); // The test logic below relies on having max_renderer_frames > 2. By default, @@ -3967,9 +3806,10 @@ TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFramesWithMemoryPressure) { // occur because all frames are visible. for (size_t i = 0; i < renderer_count; ++i) { views[i]->Show(); - views[i]->SubmitCompositorFrame( - kArbitraryLocalSurfaceId, - MakeDelegatedFrame(1.f, frame_size, view_rect), base::nullopt); + viz::SurfaceId surface_id(views[i]->GetFrameSinkId(), + kArbitraryLocalSurfaceId); + views[i]->delegated_frame_host_->OnFirstSurfaceActivation( + viz::SurfaceInfo(surface_id, 1.f, frame_size)); EXPECT_TRUE(views[i]->HasFallbackSurface()); } @@ -4027,9 +3867,12 @@ TEST_F(RenderWidgetHostViewAuraTest, SourceEventTypeExistsInLatencyInfo) { // SwapCompositorFrame and OnDidNotProduceFrame IPCs through DelegatedFrameHost // and its CompositorFrameSinkSupport. TEST_F(RenderWidgetHostViewAuraTest, ForwardsBeginFrameAcks) { - // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) + // TODO(jonross): Delete this test once Viz launches as it will be obsolete. + // https://crbug.com/844469 + if (base::FeatureList::IsEnabled(features::kVizDisplayCompositor) || + !features::IsAshInBrowserProcess()) { return; + } gfx::Rect view_rect(100, 100); gfx::Size frame_size = view_rect.size(); @@ -4124,15 +3967,15 @@ TEST_F(RenderWidgetHostViewAuraTest, TouchEventPositionsArentRounded) { } // Tests that non-precise mouse-wheel events do not initiate overscroll. -void RenderWidgetHostViewAuraOverscrollTest::WheelNotPreciseScrollEvent() { +TEST_F(RenderWidgetHostViewAuraOverscrollTest, WheelNotPreciseScrollEvent) { SetUpOverscrollEnvironment(); // Simulate wheel event. Does not cross start threshold. - SimulateWheelEventPossiblyIncludingPhase( - -5, 0, 0, false, WebMouseWheelEvent::kPhaseBegan); // sent directly + SimulateWheelEvent(-5, 0, 0, false, + WebMouseWheelEvent::kPhaseBegan); // sent directly // Simulate wheel event. Crosses start threshold. - SimulateWheelEventPossiblyIncludingPhase( - -70, 1, 0, false, WebMouseWheelEvent::kPhaseChanged); // enqueued + SimulateWheelEvent(-70, 1, 0, false, + WebMouseWheelEvent::kPhaseChanged); // enqueued EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); MockWidgetInputHandler::MessageVector events = @@ -4148,64 +3991,36 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelNotPreciseScrollEvent() { EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - ExpectGestureScrollEndForWheelScrolling(false); - SendNotConsumedAcks(events); - events = ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - } - SendScrollUpdateAck(events, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel GestureScrollEnd", GetMessageNames(events)); - } else if (wheel_scroll_latching_enabled_) { - SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - SendNotConsumedAcks(events); - ExpectGestureScrollEndForWheelScrolling(true); - } else { - ExpectGestureScrollEndForWheelScrolling(true); - } + SimulateWheelEvent(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); + events = GetAndResetDispatchedMessages(); + EXPECT_EQ("MouseWheel GestureScrollEnd", GetMessageNames(events)); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); } -TEST_F(RenderWidgetHostViewAuraOverscrollTest, WheelNotPreciseScrollEvent) { - WheelNotPreciseScrollEvent(); -} -TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, - WheelNotPreciseScrollEvent) { - WheelNotPreciseScrollEvent(); -} -TEST_F(RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest, - WheelNotPreciseScrollEvent) { - WheelNotPreciseScrollEvent(); -} - // Tests that precise mouse-wheel events initiate overscroll and a mouse move // will cancel it. -void RenderWidgetHostViewAuraOverscrollTest::WheelScrollEventOverscrolls() { +TEST_F(RenderWidgetHostViewAuraOverscrollTest, WheelScrollEventOverscrolls) { SetUpOverscrollEnvironment(); // Simulate wheel events. Do not cross start threshold. - SimulateWheelEventPossiblyIncludingPhase( - -5, 0, 0, true, WebMouseWheelEvent::kPhaseBegan); // sent directly - SimulateWheelEventPossiblyIncludingPhase( - -10, 1, 0, true, WebMouseWheelEvent::kPhaseChanged); // enqueued - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent(-5, 0, 0, true, + WebMouseWheelEvent::kPhaseBegan); // sent directly + SimulateWheelEvent(-10, 1, 0, true, + WebMouseWheelEvent::kPhaseChanged); // enqueued + SimulateWheelEvent( -10, -3, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent( -15, -1, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event // Simulate wheel events. Cross start threshold. - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent( -30, -3, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent( -20, 6, 1, true, WebMouseWheelEvent::kPhaseChanged); // enqueued, different modifiers EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); @@ -4222,22 +4037,9 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollEventOverscrolls() { EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - ExpectGestureScrollEndForWheelScrolling(false); - // 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 ScrollUpdate event will be sent to the - // renderer. - SendNotConsumedAcks(events); - events = ExpectGestureScrollEventsAfterMouseWheelACK(false, 1); - } SendScrollUpdateAck(events, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); ExpectGestureScrollEndForWheelScrolling(false); SendNotConsumedAcks(events); - ExpectGestureScrollEventsAfterMouseWheelAckWhenOverscrolling(); EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); EXPECT_EQ(OverscrollSource::TOUCHPAD, overscroll_source()); @@ -4256,40 +4058,29 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollEventOverscrolls() { events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseMove", GetMessageNames(events)); } -TEST_F(RenderWidgetHostViewAuraOverscrollTest, WheelScrollEventOverscrolls) { - WheelScrollEventOverscrolls(); -} -TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, - WheelScrollEventOverscrolls) { - WheelScrollEventOverscrolls(); -} -TEST_F(RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest, - WheelScrollEventOverscrolls) { - WheelScrollEventOverscrolls(); -} // Tests that if some scroll events are consumed towards the start, then // subsequent scrolls do not overscroll. -void RenderWidgetHostViewAuraOverscrollTest:: - WheelScrollConsumedDoNotOverscroll() { +TEST_F(RenderWidgetHostViewAuraOverscrollTest, + WheelScrollConsumedDoNotOverscroll) { SetUpOverscrollEnvironment(); // Simulate wheel events. Do not cross start threshold. - SimulateWheelEventPossiblyIncludingPhase( - -5, 0, 0, true, WebMouseWheelEvent::kPhaseBegan); // sent directly - SimulateWheelEventPossiblyIncludingPhase( - -10, -1, 0, true, WebMouseWheelEvent::kPhaseChanged); // enqueued - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent(-5, 0, 0, true, + WebMouseWheelEvent::kPhaseBegan); // sent directly + SimulateWheelEvent(-10, -1, 0, true, + WebMouseWheelEvent::kPhaseChanged); // enqueued + SimulateWheelEvent( -10, -3, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent( -15, -1, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event // Simulate wheel events. Cross start threshold. - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent( -30, -3, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent( -20, 6, 1, true, WebMouseWheelEvent::kPhaseChanged); // enqueued, different modifiers @@ -4308,68 +4099,24 @@ void RenderWidgetHostViewAuraOverscrollTest:: EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - SendScrollUpdateAck(events, INPUT_EVENT_ACK_STATE_CONSUMED); - ExpectGestureScrollEndForWheelScrolling(false); - // 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. - SendNotConsumedAcks(events); - events = ExpectGestureScrollEventsAfterMouseWheelACK(false, 1); - } - EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); - EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); - - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { // The GSU events are coalesced. This is the ack for the coalesced event. // Since it is the first GSU, the ack should be consumed. SendScrollUpdateAck(events, INPUT_EVENT_ACK_STATE_CONSUMED); - } else { - SendScrollUpdateAck(events, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); - events = ExpectGestureScrollEndForWheelScrolling(false); - SendNotConsumedAcks(events); - events = ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - SendNotConsumedAcks(events); - } - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); + SimulateWheelEvent(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseWheel GestureScrollEnd", GetMessageNames(events)); - } else if (wheel_scroll_latching_enabled_) { - SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - SendNotConsumedAcks(events); - events = ExpectGestureScrollEndForWheelScrolling(true); - } else { - events = ExpectGestureScrollEndForWheelScrolling(true); - } EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); } -TEST_F(RenderWidgetHostViewAuraOverscrollTest, - WheelScrollConsumedDoNotOverscroll) { - WheelScrollConsumedDoNotOverscroll(); -} -TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, - WheelScrollConsumedDoNotOverscroll) { - WheelScrollConsumedDoNotOverscroll(); -} -TEST_F(RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest, - WheelScrollConsumedDoNotOverscroll) { - WheelScrollConsumedDoNotOverscroll(); -} // Tests that wheel-scrolling correctly turns overscroll on and off. -void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { +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. - SimulateWheelEventPossiblyIncludingPhase(10, 0, 0, true, - WebMouseWheelEvent::kPhaseBegan); + SimulateWheelEvent(10, 0, 0, true, WebMouseWheelEvent::kPhaseBegan); MockWidgetInputHandler::MessageVector events = GetAndResetDispatchedMessages(); @@ -4387,16 +4134,8 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); // Scroll some more so as to not overscroll. - SimulateWheelEventPossiblyIncludingPhase(10, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - events = ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); - } else { - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - SendNotConsumedAcks(events); - events = ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - } + SimulateWheelEvent(10, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); + events = ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); SendScrollUpdateAck(events, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); ExpectGestureScrollEndForWheelScrolling(false); @@ -4405,16 +4144,9 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); // Scroll some more to initiate an overscroll. - SimulateWheelEventPossiblyIncludingPhase(50, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - events = ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); - } else { - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - SendNotConsumedAcks(events); - events = ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - } + SimulateWheelEvent(50, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); + + events = ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); SendScrollUpdateAck(events, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); ExpectGestureScrollEndForWheelScrolling(false); @@ -4427,29 +4159,18 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { EXPECT_EQ(0.f, overscroll_delegate()->delta_y()); // Scroll in the reverse direction enough to abort the overscroll. - SimulateWheelEventPossiblyIncludingPhase(-20, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); + SimulateWheelEvent(-20, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseWheel", GetMessageNames(events)); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - SendNotConsumedAcks(events); - ExpectGestureScrollEventsAfterMouseWheelAckWhenOverscrolling(); - } EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); // Continue to scroll in the reverse direction. - SimulateWheelEventPossiblyIncludingPhase(-20, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); + SimulateWheelEvent(-20, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseWheel", GetMessageNames(events)); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - SendNotConsumedAcks(events); - ExpectGestureScrollEventsAfterMouseWheelAckWhenOverscrolling(); - } - EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); @@ -4457,27 +4178,13 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { // Continue to scroll in the reverse direction enough to initiate overscroll // in that direction. However, overscroll should not be initiated as the // overscroll mode is locked to east mode. - SimulateWheelEventPossiblyIncludingPhase(-65, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); + SimulateWheelEvent(-65, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseWheel", GetMessageNames(events)); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - SendNotConsumedAcks(events); - ExpectGestureScrollEventsAfterMouseWheelAckWhenOverscrolling(); - } - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel GestureScrollEnd", GetMessageNames(events)); - } else if (wheel_scroll_latching_enabled_) { - SimulateWheelEventWithPhase(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - SendNotConsumedAcks(events); - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("GestureScrollEnd", GetMessageNames(events)); - } + SimulateWheelEvent(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); + events = GetAndResetDispatchedMessages(); + EXPECT_EQ("MouseWheel GestureScrollEnd", GetMessageNames(events)); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); @@ -4486,26 +4193,15 @@ void RenderWidgetHostViewAuraOverscrollTest::WheelScrollOverscrollToggle() { EXPECT_EQ(0.f, overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, overscroll_delegate()->delta_y()); } -TEST_F(RenderWidgetHostViewAuraOverscrollTest, WheelScrollOverscrollToggle) { - WheelScrollOverscrollToggle(); -} -TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, - WheelScrollOverscrollToggle) { - WheelScrollOverscrollToggle(); -} -TEST_F(RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest, - WheelScrollOverscrollToggle) { - WheelScrollOverscrollToggle(); -} // Tests that a small fling after overscroll is initiated aborts the overscroll. -void RenderWidgetHostViewAuraOverscrollTest::ScrollEventsOverscrollWithFling() { +TEST_F(RenderWidgetHostViewAuraOverscrollTest, + ScrollEventsOverscrollWithFling) { 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. - SimulateWheelEventPossiblyIncludingPhase(10, 0, 0, true, - WebMouseWheelEvent::kPhaseBegan); + SimulateWheelEvent(10, 0, 0, true, WebMouseWheelEvent::kPhaseBegan); MockWidgetInputHandler::MessageVector events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseWheel", GetMessageNames(events)); @@ -4521,32 +4217,18 @@ void RenderWidgetHostViewAuraOverscrollTest::ScrollEventsOverscrollWithFling() { EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); // Scroll some more so as to not overscroll. - SimulateWheelEventPossiblyIncludingPhase(20, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); - } else { - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - SendNotConsumedAcks(events); - events = ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - } + SimulateWheelEvent(20, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); + ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); + SendNotConsumedAcks(events); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); // Scroll some more to initiate an overscroll. - SimulateWheelEventPossiblyIncludingPhase(40, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); - } else { - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - SendNotConsumedAcks(events); - events = ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - } + SimulateWheelEvent(40, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); + ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); + SendNotConsumedAcks(events); ExpectGestureScrollEndForWheelScrolling(false); @@ -4579,29 +4261,16 @@ void RenderWidgetHostViewAuraOverscrollTest::ScrollEventsOverscrollWithFling() { } EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); } -TEST_F(RenderWidgetHostViewAuraOverscrollTest, - ScrollEventsOverscrollWithFling) { - ScrollEventsOverscrollWithFling(); -} -TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, - ScrollEventsOverscrollWithFling) { - ScrollEventsOverscrollWithFling(); -} -TEST_F(RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest, - ScrollEventsOverscrollWithFling) { - ScrollEventsOverscrollWithFling(); -} // Same as ScrollEventsOverscrollWithFling, but with zero velocity. Checks that // the zero-velocity fling does not reach the renderer. -void RenderWidgetHostViewAuraOverscrollTest:: - ScrollEventsOverscrollWithZeroFling() { +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. - SimulateWheelEventPossiblyIncludingPhase(10, 0, 0, true, - WebMouseWheelEvent::kPhaseBegan); + SimulateWheelEvent(10, 0, 0, true, WebMouseWheelEvent::kPhaseBegan); MockWidgetInputHandler::MessageVector events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseWheel", GetMessageNames(events)); @@ -4617,16 +4286,8 @@ void RenderWidgetHostViewAuraOverscrollTest:: EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); // Scroll some more so as to not overscroll. - SimulateWheelEventPossiblyIncludingPhase(20, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); - } else { - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - SendNotConsumedAcks(events); - ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - } + SimulateWheelEvent(20, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); + ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); ExpectGestureScrollEndForWheelScrolling(false); @@ -4635,16 +4296,8 @@ void RenderWidgetHostViewAuraOverscrollTest:: EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); // Scroll some more to initiate an overscroll. - SimulateWheelEventPossiblyIncludingPhase(40, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); - } else { - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - SendNotConsumedAcks(events); - ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - } + SimulateWheelEvent(40, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); + ExpectGestureScrollUpdateAfterNonBlockingMouseWheelACK(false); SendNotConsumedAcks(events); ExpectGestureScrollEndForWheelScrolling(false); @@ -4678,18 +4331,6 @@ void RenderWidgetHostViewAuraOverscrollTest:: EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); } -TEST_F(RenderWidgetHostViewAuraOverscrollTest, - ScrollEventsOverscrollWithZeroFling) { - ScrollEventsOverscrollWithZeroFling(); -} -TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, - ScrollEventsOverscrollWithZeroFling) { - ScrollEventsOverscrollWithZeroFling(); -} -TEST_F(RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest, - ScrollEventsOverscrollWithZeroFling) { - ScrollEventsOverscrollWithZeroFling(); -} // Tests that a fling in the opposite direction of the overscroll cancels the // overscroll instead of completing it. @@ -4705,6 +4346,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, SetUpOverscrollEnvironment(); { + PressAndSetTouchActionAuto(); // Start and end a gesture in the same direction without processing the // gesture events in the renderer. This should initiate and complete an // overscroll. @@ -4727,9 +4369,11 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, EXPECT_EQ("GestureScrollEnd", GetMessageNames(events)); EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->completed_mode()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); + ReleaseAndResetDispatchedMessages(); } { + PressAndSetTouchActionAuto(); // Start over, except instead of ending the gesture with ScrollEnd, end it // with a FlingStart, with velocity in the reverse direction. This should // initiate an overscroll, the overscroll mode should get reset after the @@ -4762,6 +4406,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, base::TimeTicks::Now() + base::TimeDelta::FromMilliseconds(17); widget_host_->ProgressFlingIfNeeded(progress_time); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); + ReleaseAndResetDispatchedMessages(); } } @@ -4771,6 +4416,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, TEST_F(RenderWidgetHostViewAuraOverscrollTest, GestureScrollOverscrolls) { SetUpOverscrollEnvironment(); + PressAndSetTouchActionAuto(); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); MockWidgetInputHandler::MessageVector events = @@ -4819,6 +4465,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, GestureScrollOverscrolls) { EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); + ReleaseAndResetDispatchedMessages(); } // Tests that when a cap is set for overscroll delta, extra overscroll delta is @@ -4826,6 +4473,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, GestureScrollOverscrolls) { TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollDeltaCap) { SetUpOverscrollEnvironment(); + PressAndSetTouchActionAuto(); // Set overscroll cap and start scrolling. overscroll_delegate()->set_delta_cap(50); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, @@ -4884,6 +4532,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollDeltaCap) { EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); + ReleaseAndResetDispatchedMessages(); } // Tests that if the page is scrolled because of a scroll-gesture, then that @@ -4891,6 +4540,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollDeltaCap) { TEST_F(RenderWidgetHostViewAuraOverscrollTest, GestureScrollConsumed) { SetUpOverscrollEnvironment(); + PressAndSetTouchActionAuto(); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); SimulateGestureScrollUpdateEvent(10, 0, 0); @@ -4916,6 +4566,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, GestureScrollConsumed) { SendNotConsumedAcks(events); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); + ReleaseAndResetDispatchedMessages(); } // Tests that the overscroll controller plays nice with touch-scrolls and the @@ -4924,6 +4575,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, GestureScrollDebounceOverscrolls) { SetUpOverscrollEnvironmentWithDebounce(100); + PressAndSetTouchActionAuto(); // Start scrolling. Receive ACK as it being processed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); @@ -4944,7 +4596,9 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, MockWidgetInputHandler::MessageVector second_scroll_update_events = GetAndResetDispatchedMessages(); EXPECT_EQ(0U, second_scroll_update_events.size()); + ReleaseAndResetDispatchedMessages(); + PressAndSetTouchActionAuto(); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); second_scroll_update_events = GetAndResetDispatchedMessages(); @@ -4993,6 +4647,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, EXPECT_EQ(65.f, overscroll_delta_x()); EXPECT_EQ(15.f, overscroll_delegate()->delta_x()); EXPECT_EQ(0.f, overscroll_delegate()->delta_y()); + ReleaseAndResetDispatchedMessages(); } // Tests that the gesture debounce timer plays nice with the overscroll @@ -5001,6 +4656,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, GestureScrollDebounceTimerOverscroll) { SetUpOverscrollEnvironmentWithDebounce(10); + PressAndSetTouchActionAuto(); // Start scrolling. Receive ACK as it being processed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); @@ -5018,6 +4674,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, SimulateGestureEvent(WebInputEvent::kGestureScrollEnd, blink::kWebGestureDeviceTouchscreen); EXPECT_EQ(0U, GetAndResetDispatchedMessages().size()); + ReleaseAndResetDispatchedMessages(); // Receive ACK for the scroll-update event. SendNotConsumedAcks(events); @@ -5052,6 +4709,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollWithTouchEvents) { // The test sends an intermingled sequence of touch and gesture events. PressTouchPoint(0, 1); SendTouchEvent(); + widget_host_->input_router()->OnSetTouchAction(cc::kTouchActionAuto); MockWidgetInputHandler::MessageVector events = GetAndResetDispatchedMessages(); EXPECT_EQ("TouchStart", GetMessageNames(events)); @@ -5172,6 +4830,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, SetUpOverscrollEnvironmentWithDebounce(10); widget_host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); + PressAndSetTouchActionAuto(); // Start scrolling. Receive ACK as it being processed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); @@ -5215,7 +4874,9 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->completed_mode()); events = GetAndResetDispatchedMessages(); EXPECT_EQ("GestureScrollEnd", GetMessageNames(events)); + ReleaseAndResetDispatchedMessages(); + PressAndSetTouchActionAuto(); // Start scrolling. Receive ACK as it being processed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); @@ -5256,6 +4917,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->completed_mode()); events = GetAndResetDispatchedMessages(); EXPECT_EQ("GestureScrollEnd", GetMessageNames(events)); + ReleaseAndResetDispatchedMessages(); } // Tests that after touchscreen overscroll is initiated, scrolling in the @@ -5265,6 +4927,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollDirectionChange) { SetUpOverscrollEnvironmentWithDebounce(100); + PressAndSetTouchActionAuto(); // Start scrolling. Receive ACK as it being processed. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); @@ -5300,12 +4963,14 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollDirectionChange) { EXPECT_EQ(0U, events.size()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); + ReleaseAndResetDispatchedMessages(); } TEST_F(RenderWidgetHostViewAuraOverscrollTest, CompleteOverscrollOnGestureScrollEndAck) { SetUpOverscrollEnvironment(); + PressAndSetTouchActionAuto(); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); MockWidgetInputHandler::MessageVector events = @@ -5332,12 +4997,14 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->completed_mode()); + ReleaseAndResetDispatchedMessages(); } TEST_F(RenderWidgetHostViewAuraOverscrollTest, InterleavedScrollUpdateAckAndScrollEnd) { SetUpOverscrollEnvironment(); + PressAndSetTouchActionAuto(); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); SimulateGestureScrollUpdateEvent(30, -5, 0); @@ -5368,19 +5035,19 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, EXPECT_EQ(2U, overscroll_delegate()->historical_modes().size()); EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->historical_modes().at(0)); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->historical_modes().at(1)); + ReleaseAndResetDispatchedMessages(); } // Tests that after touchpad overscroll is initiated, scrolling in the opposite // direction ends the overscroll in the original direction without initiating // overscroll in the opposite direction. The scroll-update events should still // be consumed to prevent content scroll. -void RenderWidgetHostViewAuraOverscrollTest:: - OverscrollDirectionChangeMouseWheel() { +TEST_F(RenderWidgetHostViewAuraOverscrollTest, + OverscrollDirectionChangeMouseWheel) { SetUpOverscrollEnvironment(); // Send wheel event and receive ack as not consumed. - SimulateWheelEventPossiblyIncludingPhase(125, -5, 0, true, - WebMouseWheelEvent::kPhaseBegan); + SimulateWheelEvent(125, -5, 0, true, WebMouseWheelEvent::kPhaseBegan); MockWidgetInputHandler::MessageVector events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseWheel", GetMessageNames(events)); @@ -5400,15 +5067,10 @@ void RenderWidgetHostViewAuraOverscrollTest:: // Send another wheel event, but in the reverse direction. Although the // overscroll controller is not triggering overscroll, it will consume the // ScrollUpdate event to prevent content scroll. - SimulateWheelEventPossiblyIncludingPhase(-260, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); + SimulateWheelEvent(-260, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseWheel", GetMessageNames(events)); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - SendNotConsumedAcks(events); - ExpectGestureScrollEventsAfterMouseWheelAckWhenOverscrolling(); - } EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); @@ -5419,48 +5081,31 @@ void RenderWidgetHostViewAuraOverscrollTest:: EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); - SimulateWheelEventPossiblyIncludingPhase(-20, 0, 0, true, - WebMouseWheelEvent::kPhaseChanged); + SimulateWheelEvent(-20, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseWheel", GetMessageNames(events)); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - SendNotConsumedAcks(events); - ExpectGestureScrollEventsAfterMouseWheelAckWhenOverscrolling(); - } EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); } -TEST_F(RenderWidgetHostViewAuraOverscrollTest, - OverscrollDirectionChangeMouseWheel) { - OverscrollDirectionChangeMouseWheel(); -} -TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, - OverscrollDirectionChangeMouseWheel) { - OverscrollDirectionChangeMouseWheel(); -} -TEST_F(RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest, - OverscrollDirectionChangeMouseWheel) { - OverscrollDirectionChangeMouseWheel(); -} // Tests that mouse-move completes overscoll if it has passed activation // threshold and aborts it otherwise. -void RenderWidgetHostViewAuraOverscrollTest::OverscrollMouseMoveCompletion() { +TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollMouseMoveCompletion) { SetUpOverscrollEnvironment(); - SimulateWheelEventPossiblyIncludingPhase( - -5, 0, 0, true, WebMouseWheelEvent::kPhaseBegan); // sent directly - SimulateWheelEventPossiblyIncludingPhase( - -10, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); // enqueued - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent(-5, 0, 0, true, + WebMouseWheelEvent::kPhaseBegan); // sent directly + SimulateWheelEvent(-10, 0, 0, true, + WebMouseWheelEvent::kPhaseChanged); // enqueued + SimulateWheelEvent( -10, -3, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent( -15, -1, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent( -30, -3, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event @@ -5479,14 +5124,6 @@ void RenderWidgetHostViewAuraOverscrollTest::OverscrollMouseMoveCompletion() { EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - ExpectGestureScrollEndForWheelScrolling(false); - SendNotConsumedAcks(events); - // Receive ACK for the second (coalesced) event as not processed. This will - // start an overcroll gesture. - ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - } - SendNotConsumedAcks(events); ExpectGestureScrollEndForWheelScrolling(false); @@ -5514,6 +5151,7 @@ void RenderWidgetHostViewAuraOverscrollTest::OverscrollMouseMoveCompletion() { SendNotConsumedAcks(events); // Now try with gestures. + PressAndSetTouchActionAuto(); SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, blink::kWebGestureDeviceTouchscreen); SendScrollBeginAckIfNeeded(INPUT_EVENT_ACK_STATE_CONSUMED); @@ -5542,38 +5180,28 @@ void RenderWidgetHostViewAuraOverscrollTest::OverscrollMouseMoveCompletion() { events = GetAndResetDispatchedMessages(); EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); EXPECT_EQ("GestureScrollEnd", GetMessageNames(events)); + ReleaseAndResetDispatchedMessages(); // Move mouse some more. The mouse-move events should reach the renderer. SimulateMouseMove(5, 10, 0); events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseMove", GetMessageNames(events)); } -TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollMouseMoveCompletion) { - OverscrollMouseMoveCompletion(); -} -TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, - OverscrollMouseMoveCompletion) { - OverscrollMouseMoveCompletion(); -} -TEST_F(RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest, - OverscrollMouseMoveCompletion) { - OverscrollMouseMoveCompletion(); -} // Tests that if a page scrolled, then the overscroll controller's states are // reset after the end of the scroll. -void RenderWidgetHostViewAuraOverscrollTest:: - OverscrollStateResetsAfterScroll() { +TEST_F(RenderWidgetHostViewAuraOverscrollTest, + OverscrollStateResetsAfterScroll) { SetUpOverscrollEnvironment(); - SimulateWheelEventPossiblyIncludingPhase( - 0, 5, 0, true, WebMouseWheelEvent::kPhaseBegan); // sent directly - SimulateWheelEventPossiblyIncludingPhase( - 0, 30, 0, true, WebMouseWheelEvent::kPhaseChanged); // enqueued - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent(0, 5, 0, true, + WebMouseWheelEvent::kPhaseBegan); // sent directly + SimulateWheelEvent(0, 30, 0, true, + WebMouseWheelEvent::kPhaseChanged); // enqueued + SimulateWheelEvent( 0, 40, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent( 0, 10, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); @@ -5589,13 +5217,6 @@ void RenderWidgetHostViewAuraOverscrollTest:: SendScrollUpdateAck(events, INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_TRUE(ScrollStateIsContentConsuming()); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - ExpectGestureScrollEndForWheelScrolling(false); - // The second wheel event is not consumed. - SendNotConsumedAcks(events); - - events = ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - } SendScrollUpdateAck(events, INPUT_EVENT_ACK_STATE_CONSUMED); EXPECT_TRUE(ScrollStateIsContentConsuming()); @@ -5619,11 +5240,11 @@ void RenderWidgetHostViewAuraOverscrollTest:: // consumed and have triggered a fling animation (as tracked by the router). EXPECT_FALSE(parent_host_->input_router()->HasPendingEvents()); - SimulateWheelEventPossiblyIncludingPhase( - -5, 0, 0, true, WebMouseWheelEvent::kPhaseBegan); // sent directly - SimulateWheelEventPossiblyIncludingPhase( - -60, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); // enqueued - SimulateWheelEventPossiblyIncludingPhase( + SimulateWheelEvent(-5, 0, 0, true, + WebMouseWheelEvent::kPhaseBegan); // sent directly + SimulateWheelEvent(-60, 0, 0, true, + WebMouseWheelEvent::kPhaseChanged); // enqueued + SimulateWheelEvent( -100, 0, 0, true, WebMouseWheelEvent::kPhaseChanged); // coalesced into previous event @@ -5639,12 +5260,6 @@ void RenderWidgetHostViewAuraOverscrollTest:: EXPECT_TRUE(ScrollStateIsUnknown()); - if (wheel_scrolling_mode_ != kAsyncWheelEvents) { - events = ExpectGestureScrollEndForWheelScrolling(false); - SendNotConsumedAcks(events); - events = ExpectGestureScrollEventsAfterMouseWheelACK(false, 0); - } - SendNotConsumedAcks(events); EXPECT_EQ(OVERSCROLL_WEST, overscroll_mode()); @@ -5674,24 +5289,13 @@ void RenderWidgetHostViewAuraOverscrollTest:: events = GetAndResetDispatchedMessages(); EXPECT_EQ(0u, events.size()); } -TEST_F(RenderWidgetHostViewAuraOverscrollTest, - OverscrollStateResetsAfterScroll) { - OverscrollStateResetsAfterScroll(); -} -TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, - OverscrollStateResetsAfterScroll) { - OverscrollStateResetsAfterScroll(); -} -TEST_F(RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest, - OverscrollStateResetsAfterScroll) { - OverscrollStateResetsAfterScroll(); -} // Tests that overscroll is reset when window loses focus. It should not affect // subsequent overscrolls. TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollResetsOnBlur) { SetUpOverscrollEnvironment(); + PressAndSetTouchActionAuto(); // Start an overscroll with gesture scroll. In the middle of the scroll, blur // the host. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, @@ -5719,7 +5323,9 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollResetsOnBlur) { blink::kWebGestureDeviceTouchscreen); events = GetAndResetDispatchedMessages(); EXPECT_EQ("SetFocus GestureScrollEnd", GetMessageNames(events)); + ReleaseAndResetDispatchedMessages(); + PressAndSetTouchActionAuto(); // Start a scroll gesture again. This should correctly start the overscroll // after the threshold. SimulateGestureEvent(WebInputEvent::kGestureScrollBegin, @@ -5742,6 +5348,7 @@ TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollResetsOnBlur) { EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); EXPECT_EQ(OVERSCROLL_EAST, overscroll_delegate()->completed_mode()); EXPECT_EQ("GestureScrollEnd", GetMessageNames(events)); + ReleaseAndResetDispatchedMessages(); } #if defined(OS_CHROMEOS) @@ -5900,13 +5507,20 @@ TEST_F(RenderWidgetHostViewAuraTest, SetCanScrollForWebMouseWheelEvent) { base::RunLoop().RunUntilIdle(); events = GetAndResetDispatchedMessages(); + // Since the modifiers has changed a wheel end event will be sent before + // dispatching the wheel event. + EXPECT_EQ(2u, events.size()); wheel_event = static_cast<const WebMouseWheelEvent*>( events[0]->ToEvent()->Event()->web_event.get()); + EXPECT_EQ(WebMouseWheelEvent::kPhaseEnded, wheel_event->phase); + // Check if scroll is caused when no modifier is applied to the // mouse wheel event. + wheel_event = static_cast<const WebMouseWheelEvent*>( + events[1]->ToEvent()->Event()->web_event.get()); EXPECT_TRUE(WebInputEventTraits::CanCauseScroll(*wheel_event)); - events[0]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_CONSUMED); + events[1]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_CONSUMED); // Simulates the scroll event with ctrl modifier applied. ui::ScrollEvent scroll(ui::ET_SCROLL, gfx::Point(2, 2), ui::EventTimeForNow(), @@ -5915,10 +5529,16 @@ TEST_F(RenderWidgetHostViewAuraTest, SetCanScrollForWebMouseWheelEvent) { base::RunLoop().RunUntilIdle(); events = GetAndResetDispatchedMessages(); + // Since the modifiers has changed a wheel end event will be sent before + // dispatching the wheel event. + EXPECT_EQ(2u, events.size()); wheel_event = static_cast<const WebMouseWheelEvent*>( events[0]->ToEvent()->Event()->web_event.get()); + EXPECT_EQ(WebMouseWheelEvent::kPhaseEnded, wheel_event->phase); // Check if scroll is caused when ctrl-touchpad-scroll is generated // from scroll event. + wheel_event = static_cast<const WebMouseWheelEvent*>( + events[1]->ToEvent()->Event()->web_event.get()); EXPECT_TRUE(WebInputEventTraits::CanCauseScroll(*wheel_event)); } @@ -5955,11 +5575,13 @@ TEST_F(RenderWidgetHostViewAuraTest, CorrectNumberOfAcksAreDispatched) { // 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. -void RenderWidgetHostViewAuraOverscrollTest::ScrollDeltasResetOnEnd() { +TEST_F(RenderWidgetHostViewAuraOverscrollTest, ScrollDeltasResetOnEnd) { SetUpOverscrollEnvironment(); + + PressAndSetTouchActionAuto(); // Wheel event scroll ending with mouse move. - SimulateWheelEventPossiblyIncludingPhase( - -30, -10, 0, true, WebMouseWheelEvent::kPhaseBegan); // sent directly + SimulateWheelEvent(-30, -10, 0, true, + WebMouseWheelEvent::kPhaseBegan); // sent directly MockWidgetInputHandler::MessageVector events = GetAndResetDispatchedMessages(); EXPECT_EQ("MouseWheel", GetMessageNames(events)); @@ -5977,8 +5599,7 @@ void RenderWidgetHostViewAuraOverscrollTest::ScrollDeltasResetOnEnd() { // A wheel event with phase ended is sent before a GSB with touchscreen // device. - SimulateWheelEventPossiblyIncludingPhase(0, 0, 0, true, - WebMouseWheelEvent::kPhaseEnded); + SimulateWheelEvent(0, 0, 0, true, WebMouseWheelEvent::kPhaseEnded); events = GetAndResetDispatchedMessages(); SendNotConsumedAcks(events); @@ -5999,11 +5620,11 @@ void RenderWidgetHostViewAuraOverscrollTest::ScrollDeltasResetOnEnd() { EXPECT_EQ(0.f, overscroll_delta_y()); events = GetAndResetDispatchedMessages(); SendNotConsumedAcks(events); + ReleaseAndResetDispatchedMessages(); // Wheel event scroll ending with a fling. This is the first wheel event after // touchscreen scrolling ends so it will have phase = kPhaseBegan. - SimulateWheelEventPossiblyIncludingPhase(5, 0, 0, true, - WebMouseWheelEvent::kPhaseBegan); + SimulateWheelEvent(5, 0, 0, true, WebMouseWheelEvent::kPhaseBegan); // ACK the MouseWheel event events = GetAndResetDispatchedMessages(); SendNotConsumedAcks(events); @@ -6012,17 +5633,10 @@ void RenderWidgetHostViewAuraOverscrollTest::ScrollDeltasResetOnEnd() { SendScrollBeginAckIfNeeded(events, INPUT_EVENT_ACK_STATE_CONSUMED); SendScrollUpdateAck(events, INPUT_EVENT_ACK_STATE_NOT_CONSUMED); - SimulateWheelEventPossiblyIncludingPhase(10, -5, 0, true, - WebMouseWheelEvent::kPhaseChanged); - if (wheel_scrolling_mode_ == kAsyncWheelEvents) { - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel GestureScrollUpdate", GetMessageNames(events)); - } else { - events = GetAndResetDispatchedMessages(); - EXPECT_EQ("MouseWheel", GetMessageNames(events)); - SendNotConsumedAcks(events); - events = GetAndResetDispatchedMessages(); - } + SimulateWheelEvent(10, -5, 0, true, WebMouseWheelEvent::kPhaseChanged); + events = GetAndResetDispatchedMessages(); + EXPECT_EQ("MouseWheel GestureScrollUpdate", GetMessageNames(events)); + SendNotConsumedAcks(events); EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); EXPECT_EQ(OverscrollSource::NONE, overscroll_source()); @@ -6041,17 +5655,6 @@ void RenderWidgetHostViewAuraOverscrollTest::ScrollDeltasResetOnEnd() { progress_time += base::TimeDelta::FromMilliseconds(17); } } -TEST_F(RenderWidgetHostViewAuraOverscrollTest, ScrollDeltasResetOnEnd) { - ScrollDeltasResetOnEnd(); -} -TEST_F(RenderWidgetHostViewAuraOverscrollWithoutWheelScrollLatchingTest, - ScrollDeltasResetOnEnd) { - ScrollDeltasResetOnEnd(); -} -TEST_F(RenderWidgetHostViewAuraOverScrollAsyncWheelEventsEnabledTest, - ScrollDeltasResetOnEnd) { - ScrollDeltasResetOnEnd(); -} TEST_F(RenderWidgetHostViewAuraTest, ForwardMouseEvent) { aura::Window* root = parent_view_->GetNativeView()->GetRootWindow(); @@ -6096,6 +5699,50 @@ TEST_F(RenderWidgetHostViewAuraTest, ForwardMouseEvent) { view_ = nullptr; } +// Test that we elide touchpad pinch gesture steams consisting of only begin +// and end events. +TEST_F(RenderWidgetHostViewAuraTest, ElideEmptyTouchpadPinchSequence) { + ui::GestureEventDetails begin_details(ui::ET_GESTURE_PINCH_BEGIN); + begin_details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHPAD); + ui::GestureEvent begin_event(0, 0, 0, ui::EventTimeForNow(), begin_details); + + ui::GestureEventDetails update_details(ui::ET_GESTURE_PINCH_UPDATE); + update_details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHPAD); + update_details.set_scale(1.23); + ui::GestureEvent update_event(0, 0, 0, ui::EventTimeForNow(), update_details); + + ui::GestureEventDetails end_details(ui::ET_GESTURE_PINCH_END); + end_details.set_device_type(ui::GestureDeviceType::DEVICE_TOUCHPAD); + ui::GestureEvent end_event(0, 0, 0, ui::EventTimeForNow(), end_details); + + view_->OnGestureEvent(&begin_event); + base::RunLoop().RunUntilIdle(); + MockWidgetInputHandler::MessageVector events = + GetAndResetDispatchedMessages(); + // Since we don't know if we'll have GesturePinchUpdates at this point, the + // GesturePinchBegin should not be sent yet. + EXPECT_EQ(0U, events.size()); + + view_->OnGestureEvent(&update_event); + base::RunLoop().RunUntilIdle(); + events = GetAndResetDispatchedMessages(); + EXPECT_EQ("MouseWheel", GetMessageNames(events)); + + // If the page consumes the update, then no GesturePinchUpdate is sent and + // we continue to postpone sending the GesturePinchBegin. + events[0]->ToEvent()->CallCallback(INPUT_EVENT_ACK_STATE_CONSUMED); + events = GetAndResetDispatchedMessages(); + EXPECT_EQ(0U, events.size()); + + view_->OnGestureEvent(&end_event); + base::RunLoop().RunUntilIdle(); + events = GetAndResetDispatchedMessages(); + // Since we have not sent any GesturePinchUpdates by the time we get to the + // end of the pinch, the GesturePinchBegin and GesturePinchEnd events should + // be elided. + EXPECT_EQ(0U, events.size()); +} + TEST_F(RenderWidgetHostViewAuraTest, GestureTapFromStylusHasPointerType) { view_->InitAsFullscreen(parent_view_); view_->Show(); @@ -6108,6 +5755,7 @@ TEST_F(RenderWidgetHostViewAuraTest, GestureTapFromStylusHasPointerType) { // Simulate touch press and release to generate a GestureTap. generator.EnterPenPointerMode(); generator.PressTouch(); + widget_host_->input_router()->OnSetTouchAction(cc::kTouchActionAuto); generator.ReleaseTouch(); base::RunLoop().RunUntilIdle(); MockWidgetInputHandler::MessageVector events = @@ -6130,9 +5778,12 @@ TEST_F(RenderWidgetHostViewAuraTest, GestureTapFromStylusHasPointerType) { // SubmitCompositorFrame becomes the active hit test region in the // viz::HitTestManager. TEST_F(RenderWidgetHostViewAuraTest, HitTestRegionListSubmitted) { - // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) + // TODO(jonross): Delete this test once Viz launches as it will be obsolete. + // https://crbug.com/844469 + if (base::FeatureList::IsEnabled(features::kVizDisplayCompositor) || + !features::IsAshInBrowserProcess()) { return; + } gfx::Rect view_rect(0, 0, 100, 100); gfx::Size frame_size = view_rect.size(); @@ -6172,7 +5823,7 @@ TEST_F(RenderWidgetHostViewAuraTest, HitTestRegionListSubmitted) { TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, NewContentRenderingTimeout) { // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) + if (!features::IsAshInBrowserProcess()) return; constexpr base::TimeDelta kTimeout = base::TimeDelta::FromMicroseconds(10); @@ -6187,8 +5838,8 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, viz::LocalSurfaceId id0 = view_->GetLocalSurfaceId(); EXPECT_TRUE(id0.is_valid()); - // No new LocalSurfaceId should be allocated for the first navigation but the - // timer should fire. + // No new LocalSurfaceId should be allocated for the first navigation and the + // timer should not fire. widget_host_->DidNavigate(1); viz::LocalSurfaceId id1 = view_->GetLocalSurfaceId(); EXPECT_EQ(id0, id1); @@ -6198,7 +5849,15 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, FROM_HERE, run_loop.QuitClosure(), 2 * kTimeout); run_loop.Run(); } - EXPECT_TRUE(widget_host_->new_content_rendering_timeout_fired()); + if (base::FeatureList::IsEnabled(features::kEnableSurfaceSynchronization)) { + // When using surface sync, the timer should not fire, because the surface + // id did not change. + EXPECT_FALSE(widget_host_->new_content_rendering_timeout_fired()); + } else { + // When not using surface sync, the timer will fire because the source id + // changed. + EXPECT_TRUE(widget_host_->new_content_rendering_timeout_fired()); + } widget_host_->reset_new_content_rendering_timeout_fired(); // Start the timer. Verify that a new LocalSurfaceId is allocated. @@ -6242,7 +5901,7 @@ TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, TEST_F(RenderWidgetHostViewAuraSurfaceSynchronizationTest, AllocateLocalSurfaceIdOnEviction) { // TODO: fix for mash. - if (base::FeatureList::IsEnabled(features::kMash)) + if (!features::IsAshInBrowserProcess()) return; view_->InitAsChild(nullptr); |