Commit 022b777b authored by Danton Vu's avatar Danton Vu Committed by Commit Bot

overview: Stop window items from absorbing new scrolling logic.

The items eat the events aimed for the controller than shifts the grid
left and right, we need to change so window drags on begin on
long presses.

Test: manual, added tests
Bug: 991346
Change-Id: I387fa0a4acff17e4b9673f1d042cf8ae8d4b1eec
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1749710
Commit-Queue: Danton Vu <dantonvu@google.com>
Reviewed-by: default avatarSammie Quon <sammiequon@chromium.org>
Cr-Commit-Position: refs/heads/master@{#686501}
parent 31feb8c8
......@@ -304,6 +304,10 @@ class ASH_EXPORT OverviewGrid : public aura::WindowObserver,
views::Widget* drop_target_widget() { return drop_target_widget_.get(); }
OverviewGridPreEventHandler* grid_pre_event_handler() {
return grid_pre_event_handler_.get();
}
private:
class TargetWindowObserver;
friend class OverviewSessionTest;
......
......@@ -28,11 +28,11 @@ class OverviewGridPreEventHandler : public ui::EventHandler {
explicit OverviewGridPreEventHandler(OverviewGrid* grid);
~OverviewGridPreEventHandler() override;
private:
// ui::EventHandler:
void OnMouseEvent(ui::MouseEvent* event) override;
void OnGestureEvent(ui::GestureEvent* event) override;
private:
void HandleClickOrTap(ui::Event* event);
// Cached value of the OverviewGrid that handles a series of gesture scroll
......
......@@ -21,6 +21,7 @@
#include "ash/wm/overview/overview_constants.h"
#include "ash/wm/overview/overview_controller.h"
#include "ash/wm/overview/overview_grid.h"
#include "ash/wm/overview/overview_grid_pre_event_handler.h"
#include "ash/wm/overview/overview_highlight_controller.h"
#include "ash/wm/overview/overview_utils.h"
#include "ash/wm/overview/overview_window_drag_controller.h"
......@@ -812,6 +813,10 @@ void OverviewItem::HandleMouseEvent(const ui::MouseEvent& event) {
}
void OverviewItem::HandleGestureEvent(ui::GestureEvent* event) {
if (ShouldUseTabletModeGridLayout()) {
HandleGestureEventForTabletModeLayout(event);
return;
}
const gfx::PointF location = event->details().bounding_box_f().CenterPoint();
switch (event->type()) {
case ui::ET_GESTURE_TAP_DOWN:
......@@ -841,6 +846,41 @@ void OverviewItem::HandleGestureEvent(ui::GestureEvent* event) {
}
}
void OverviewItem::HandleGestureEventForTabletModeLayout(
ui::GestureEvent* event) {
const gfx::PointF location = event->details().bounding_box_f().CenterPoint();
switch (event->type()) {
case ui::ET_GESTURE_SCROLL_UPDATE:
if (IsDragItem())
HandleDragEvent(location);
else
overview_grid()->grid_pre_event_handler()->OnGestureEvent(event);
break;
case ui::ET_SCROLL_FLING_START:
HandleFlingStartEvent(location, event->details().velocity_x(),
event->details().velocity_y());
break;
case ui::ET_GESTURE_SCROLL_END:
if (IsDragItem())
HandleReleaseEvent(location);
else
overview_grid()->grid_pre_event_handler()->OnGestureEvent(event);
break;
case ui::ET_GESTURE_LONG_PRESS:
HandlePressEvent(location, /*from_touch_gesture=*/true);
break;
case ui::ET_GESTURE_TAP:
overview_session_->SelectWindow(this);
break;
case ui::ET_GESTURE_END:
HandleGestureEndEvent();
break;
default:
overview_grid()->grid_pre_event_handler()->OnGestureEvent(event);
break;
}
}
bool OverviewItem::ShouldIgnoreGestureEvents() {
return IsSlidingOutOverviewFromShelf();
}
......
......@@ -185,6 +185,9 @@ class ASH_EXPORT OverviewItem : public CaptionContainerView::EventDelegate,
OverviewAnimationType GetExitOverviewAnimationType();
OverviewAnimationType GetExitTransformAnimationType();
// If kNewOverviewLayout is on, use this function for handling events.
void HandleGestureEventForTabletModeLayout(ui::GestureEvent* event);
// CaptionContainerView::EventDelegate:
void HandleMouseEvent(const ui::MouseEvent& event) override;
void HandleGestureEvent(ui::GestureEvent* event) override;
......
......@@ -2821,11 +2821,25 @@ class OverviewSessionNewLayoutTest : public OverviewSessionTest {
EnterTabletMode();
}
SplitViewController* split_view_controller() {
return Shell::Get()->split_view_controller();
}
void GenerateScrollSequence(const gfx::Point& start, const gfx::Point& end) {
GetEventGenerator()->GestureScrollSequence(
start, end, base::TimeDelta::FromMilliseconds(10), 10);
}
protected:
void DispatchLongPress(OverviewItem* item) {
ui::TouchEvent long_press(
ui::ET_GESTURE_LONG_PRESS,
gfx::ToRoundedPoint(item->target_bounds().CenterPoint()),
base::TimeTicks::Now(),
ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH));
GetEventGenerator()->Dispatch(&long_press);
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
......@@ -2986,10 +3000,9 @@ TEST_F(OverviewSessionNewLayoutTest, StackingOrderSplitviewWindow) {
// Snap |window1| to the left and exit overview. |window2| should have higher
// z-order now, since it is the MRU window.
auto* split_view_controller = Shell::Get()->split_view_controller();
split_view_controller->SnapWindow(window1.get(), SplitViewController::LEFT);
split_view_controller()->SnapWindow(window1.get(), SplitViewController::LEFT);
ToggleOverview();
ASSERT_EQ(SplitViewState::kBothSnapped, split_view_controller->state());
ASSERT_EQ(SplitViewState::kBothSnapped, split_view_controller()->state());
ASSERT_GT(IndexOf(window2.get(), window2->parent()),
IndexOf(window1.get(), window1->parent()));
......@@ -3006,6 +3019,103 @@ TEST_F(OverviewSessionNewLayoutTest, StackingOrderSplitviewWindow) {
IndexOf(window1.get(), window1->parent()));
}
// Test that scrolling occurs if started on top of a window using the window's
// center-point as a start.
TEST_F(OverviewSessionNewLayoutTest, CheckScrollingOnWindowItems) {
std::vector<std::unique_ptr<aura::Window>> windows(8);
for (int i = 7; i >= 0; --i)
windows[i] = CreateTestWindow();
ToggleOverview();
ASSERT_TRUE(InOverviewSession());
OverviewItem* leftmost_window =
GetOverviewItemInGridWithWindow(0, windows[0].get());
const gfx::Point topleft_window_center =
gfx::ToRoundedPoint(leftmost_window->target_bounds().CenterPoint());
const gfx::RectF left_bounds = leftmost_window->target_bounds();
GenerateScrollSequence(topleft_window_center, gfx::Point(-500, 50));
EXPECT_LT(leftmost_window->target_bounds(), left_bounds);
}
// Test that tapping a window in overview closes overview mode.
TEST_F(OverviewSessionNewLayoutTest, CheckWindowActivateOnTap) {
base::UserActionTester user_action_tester;
std::vector<std::unique_ptr<aura::Window>> windows(8);
for (int i = 7; i >= 0; --i)
windows[i] = CreateTestWindow();
wm::ActivateWindow(windows[1].get());
ToggleOverview();
ASSERT_TRUE(InOverviewSession());
// Tap on |windows|1|| to exit overview.
GetEventGenerator()->GestureTapAt(
GetTransformedTargetBounds(windows[1].get()).CenterPoint());
EXPECT_EQ(
0, user_action_tester.GetActionCount(kActiveWindowChangedFromOverview));
// |windows|1|| remains active. Click on it to exit overview.
ASSERT_EQ(windows[1].get(), window_util::GetFocusedWindow());
ToggleOverview();
ClickWindow(windows[1].get());
EXPECT_EQ(
0, user_action_tester.GetActionCount(kActiveWindowChangedFromOverview));
}
// Tests that windows snap through long press and drag to left or right side of
// the screen.
TEST_F(OverviewSessionNewLayoutTest, DragOverviewWindowToSnap) {
const gfx::Rect bounds(400, 400);
std::unique_ptr<aura::Window> window1(CreateTestWindow(bounds));
std::unique_ptr<aura::Window> window2(CreateTestWindow(bounds));
std::unique_ptr<aura::Window> window3(CreateTestWindow(bounds));
ToggleOverview();
ASSERT_TRUE(overview_controller()->InOverviewSession());
ASSERT_FALSE(split_view_controller()->InSplitViewMode());
// Dispatches a long press event at the |overview_item1|'s current location to
// start dragging in SplitView. Drags |overview_item1| to the left border of
// the screen. SplitView should trigger and upon completing drag,
// |overview_item1| should snap to the left.
OverviewItem* overview_item1 =
GetOverviewItemInGridWithWindow(0, window1.get());
const gfx::PointF snap_left_location =
gfx::PointF(GetGridBounds().left_center());
DispatchLongPress(overview_item1);
overview_session()->Drag(
overview_item1,
gfx::PointF(overview_item1->target_bounds().left_center()));
overview_session()->CompleteDrag(overview_item1, snap_left_location);
ASSERT_TRUE(split_view_controller()->InSplitViewMode());
EXPECT_EQ(split_view_controller()->state(), SplitViewState::kLeftSnapped);
EXPECT_EQ(split_view_controller()->left_window(), window1.get());
// Dispatches a long press event at the |overview_item2|'s current location to
// start dragging in SplitView. Drags |overview_item2| to the right border of
// the screen. Upon completing drag, |overview_item2| should snap to the
// right.
OverviewItem* overview_item2 =
GetOverviewItemInGridWithWindow(0, window2.get());
const gfx::PointF snap_right_location =
gfx::PointF(GetGridBounds().right_center());
DispatchLongPress(overview_item2);
overview_session()->Drag(
overview_item2,
gfx::PointF(overview_item2->target_bounds().right_center()));
overview_session()->CompleteDrag(overview_item2, snap_right_location);
EXPECT_FALSE(InOverviewSession());
EXPECT_TRUE(split_view_controller()->InSplitViewMode());
EXPECT_EQ(split_view_controller()->state(), SplitViewState::kBothSnapped);
EXPECT_EQ(split_view_controller()->right_window(), window2.get());
}
// Test the split view and overview functionalities in tablet mode.
class SplitViewOverviewSessionTest : public OverviewSessionTest {
public:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment