Commit c017a760 authored by Avery Musbach's avatar Avery Musbach Committed by Commit Bot

overview: Fix DCHECK failure on item long press in clamshell with 1 desk

When you long press an overview item in clamshell mode with only one
virtual desk, you shall be gracefully prevented from dragging it,
instead of getting a DCHECK failure.

Test: ash_unittests DesksTest.LongPressOverviewItemInClamshellModeWithOnlyOneVirtualDesk
Bug: 1020339
Change-Id: I9fc2a6f587fea8487f11819645e68dcb8bfa5cf9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1894531
Commit-Queue: Avery Musbach <amusbach@chromium.org>
Reviewed-by: default avatarAhmed Fakhry <afakhry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#711742}
parent 60b069c7
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "ash/wm/overview/overview_grid.h" #include "ash/wm/overview/overview_grid.h"
#include "ash/wm/overview/overview_item.h" #include "ash/wm/overview/overview_item.h"
#include "ash/wm/overview/overview_session.h" #include "ash/wm/overview/overview_session.h"
#include "ash/wm/overview/overview_window_drag_controller.h"
#include "ash/wm/splitview/split_view_controller.h" #include "ash/wm/splitview/split_view_controller.h"
#include "ash/wm/splitview/split_view_drag_indicators.h" #include "ash/wm/splitview/split_view_drag_indicators.h"
#include "ash/wm/splitview/split_view_utils.h" #include "ash/wm/splitview/split_view_utils.h"
...@@ -131,10 +132,10 @@ void ClickOnMiniView(const DeskMiniView* desk_mini_view, ...@@ -131,10 +132,10 @@ void ClickOnMiniView(const DeskMiniView* desk_mini_view,
event_generator->ClickLeftButton(); event_generator->ClickLeftButton();
} }
void LongGestureTapOnView(const views::View* view, void LongGestureTap(const gfx::Point& screen_location,
ui::test::EventGenerator* event_generator) { ui::test::EventGenerator* event_generator,
event_generator->set_current_screen_location( bool release_touch = true) {
view->GetBoundsInScreen().CenterPoint()); event_generator->set_current_screen_location(screen_location);
event_generator->PressTouch(); event_generator->PressTouch();
ui::GestureConfiguration* gesture_config = ui::GestureConfiguration* gesture_config =
ui::GestureConfiguration::GetInstance(); ui::GestureConfiguration::GetInstance();
...@@ -145,7 +146,8 @@ void LongGestureTapOnView(const views::View* view, ...@@ -145,7 +146,8 @@ void LongGestureTapOnView(const views::View* view,
FROM_HERE, run_loop.QuitClosure(), FROM_HERE, run_loop.QuitClosure(),
base::TimeDelta::FromMilliseconds(long_press_delay_ms)); base::TimeDelta::FromMilliseconds(long_press_delay_ms));
run_loop.Run(); run_loop.Run();
event_generator->ReleaseTouch(); if (release_touch)
event_generator->ReleaseTouch();
} }
void GestureTapOnView(const views::View* view, void GestureTapOnView(const views::View* view,
...@@ -285,6 +287,25 @@ class DesksTest : public AshTestBase, ...@@ -285,6 +287,25 @@ class DesksTest : public AshTestBase,
DISALLOW_COPY_AND_ASSIGN(DesksTest); DISALLOW_COPY_AND_ASSIGN(DesksTest);
}; };
TEST_F(DesksTest, LongPressOverviewItemInClamshellModeWithOnlyOneVirtualDesk) {
std::unique_ptr<aura::Window> window(CreateTestWindow());
OverviewController* overview_controller = Shell::Get()->overview_controller();
ASSERT_TRUE(overview_controller->StartOverview());
OverviewSession* overview_session = overview_controller->overview_session();
OverviewItem* overview_item =
overview_session->GetOverviewItemForWindow(window.get());
ui::test::EventGenerator* event_generator = GetEventGenerator();
LongGestureTap(
gfx::ToRoundedPoint(overview_item->target_bounds().CenterPoint()),
event_generator, /*release_touch=*/false);
EXPECT_TRUE(overview_item->IsDragItem());
EXPECT_EQ(
OverviewWindowDragController::DragBehavior::kUndefined,
overview_session->window_drag_controller()->current_drag_behavior());
event_generator->ReleaseTouch();
EXPECT_FALSE(overview_item->IsDragItem());
}
TEST_F(DesksTest, DesksCreationAndRemoval) { TEST_F(DesksTest, DesksCreationAndRemoval) {
TestObserver observer; TestObserver observer;
auto* controller = DesksController::Get(); auto* controller = DesksController::Get();
...@@ -1994,11 +2015,13 @@ TEST_F(DesksTest, MiniViewsTouchGestures) { ...@@ -1994,11 +2015,13 @@ TEST_F(DesksTest, MiniViewsTouchGestures) {
// Long gesture tapping on one mini_view shows its close button, and hides // Long gesture tapping on one mini_view shows its close button, and hides
// those of other mini_views. // those of other mini_views.
auto* event_generator = GetEventGenerator(); auto* event_generator = GetEventGenerator();
LongGestureTapOnView(desk_1_mini_view, event_generator); LongGestureTap(desk_1_mini_view->GetBoundsInScreen().CenterPoint(),
event_generator);
EXPECT_TRUE(desk_1_mini_view->close_desk_button()->GetVisible()); EXPECT_TRUE(desk_1_mini_view->close_desk_button()->GetVisible());
EXPECT_FALSE(desk_2_mini_view->close_desk_button()->GetVisible()); EXPECT_FALSE(desk_2_mini_view->close_desk_button()->GetVisible());
EXPECT_FALSE(desk_3_mini_view->close_desk_button()->GetVisible()); EXPECT_FALSE(desk_3_mini_view->close_desk_button()->GetVisible());
LongGestureTapOnView(desk_2_mini_view, event_generator); LongGestureTap(desk_2_mini_view->GetBoundsInScreen().CenterPoint(),
event_generator);
EXPECT_FALSE(desk_1_mini_view->close_desk_button()->GetVisible()); EXPECT_FALSE(desk_1_mini_view->close_desk_button()->GetVisible());
EXPECT_TRUE(desk_2_mini_view->close_desk_button()->GetVisible()); EXPECT_TRUE(desk_2_mini_view->close_desk_button()->GetVisible());
EXPECT_FALSE(desk_3_mini_view->close_desk_button()->GetVisible()); EXPECT_FALSE(desk_3_mini_view->close_desk_button()->GetVisible());
......
...@@ -1368,8 +1368,10 @@ void OverviewItem::HandleLongPressEvent(const gfx::PointF& location_in_screen) { ...@@ -1368,8 +1368,10 @@ void OverviewItem::HandleLongPressEvent(const gfx::PointF& location_in_screen) {
if (!IsDragItem()) if (!IsDragItem())
return; return;
if (ShouldAllowSplitView() || desks_util::ShouldDesksBarBeCreated()) if (ShouldAllowSplitView() || (desks_util::ShouldDesksBarBeCreated() &&
overview_grid_->IsDesksBarViewActive())) {
overview_session_->StartNormalDragMode(location_in_screen); overview_session_->StartNormalDragMode(location_in_screen);
}
} }
void OverviewItem::HandleFlingStartEvent(const gfx::PointF& location_in_screen, void OverviewItem::HandleFlingStartEvent(const gfx::PointF& location_in_screen,
......
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