summaryrefslogtreecommitdiffstats
path: root/ash/wm/overview/window_selector_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ash/wm/overview/window_selector_unittest.cc')
-rw-r--r--ash/wm/overview/window_selector_unittest.cc300
1 files changed, 266 insertions, 34 deletions
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc
index fef9b75..a663b5c 100644
--- a/ash/wm/overview/window_selector_unittest.cc
+++ b/ash/wm/overview/window_selector_unittest.cc
@@ -3,8 +3,11 @@
// found in the LICENSE file.
#include <algorithm>
+#include <map>
+#include <vector>
#include "ash/accessibility_delegate.h"
+#include "ash/ash_switches.h"
#include "ash/drag_drop/drag_drop_controller.h"
#include "ash/root_window_controller.h"
#include "ash/screen_util.h"
@@ -28,6 +31,7 @@
#include "ash/wm/window_util.h"
#include "ash/wm/wm_event.h"
#include "base/basictypes.h"
+#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_vector.h"
#include "base/run_loop.h"
@@ -68,8 +72,22 @@ void CancelDrag(DragDropController* controller, bool* canceled) {
}
}
+// A short drag distance that will not cause an overview item to close.
+const int kShortDragDistance = 10;
+
+// A far drag distance that will cause an overview item to close.
+const int kFarDragDistance = 200;
+
+// A slow fling velocity that should not cause selctor items to close.
+const int kSlowFlingVelocity = 2000;
+
+// A fast fling velocity that should cause selector items to close.
+const int kFastFlingVelocity = 5000;
+
} // namespace
+// TODO(bruthig): Move all non-simple method definitions out of class
+// declaration.
class WindowSelectorTest : public test::AshTestBase {
public:
WindowSelectorTest() {}
@@ -99,24 +117,28 @@ class WindowSelectorTest : public test::AshTestBase {
return window;
}
- aura::Window* CreatePanelWindow(const gfx::Rect& bounds) {
- aura::Window* window = CreateTestWindowInShellWithDelegateAndType(
- nullptr, ui::wm::WINDOW_TYPE_PANEL, 0, bounds);
- test::TestShelfDelegate::instance()->AddShelfItem(window);
- shelf_view_test()->RunMessageLoopUntilAnimationsDone();
- return window;
- }
-
- views::Widget* CreatePanelWindowWidget(const gfx::Rect& bounds) {
- views::Widget* widget = new views::Widget;
+ // Creates a Widget containing a Window with the given |bounds|. This should
+ // be used when the test requires a Widget. For example any test that will
+ // cause a window to be closed via
+ // views::Widget::GetWidgetForNativeView(window)->Close().
+ scoped_ptr<views::Widget> CreateWindowWidget(const gfx::Rect& bounds) {
+ scoped_ptr<views::Widget> widget(new views::Widget);
views::Widget::InitParams params;
params.bounds = bounds;
- params.type = views::Widget::InitParams::TYPE_PANEL;
+ params.type = views::Widget::InitParams::TYPE_WINDOW;
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget->Init(params);
widget->Show();
ParentWindowInPrimaryRootWindow(widget->GetNativeWindow());
- return widget;
+ return widget.Pass();
+ }
+
+ aura::Window* CreatePanelWindow(const gfx::Rect& bounds) {
+ aura::Window* window = CreateTestWindowInShellWithDelegateAndType(
+ nullptr, ui::wm::WINDOW_TYPE_PANEL, 0, bounds);
+ test::TestShelfDelegate::instance()->AddShelfItem(window);
+ shelf_view_test()->RunMessageLoopUntilAnimationsDone();
+ return window;
}
bool WindowsOverlapping(aura::Window* window1, aura::Window* window2) {
@@ -256,6 +278,24 @@ class WindowSelectorTest : public test::AshTestBase {
DISALLOW_COPY_AND_ASSIGN(WindowSelectorTest);
};
+class WindowSelectorSwipeToCloseDisabledTest : public WindowSelectorTest {
+ public:
+ WindowSelectorSwipeToCloseDisabledTest() {}
+ ~WindowSelectorSwipeToCloseDisabledTest() override {}
+
+ // WindowSelectorTest:
+ void SetUp() override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(WindowSelectorSwipeToCloseDisabledTest);
+};
+
+void WindowSelectorSwipeToCloseDisabledTest::SetUp() {
+ base::CommandLine::ForCurrentProcess()->AppendSwitch(
+ switches::kAshDisableSwipeToCloseInOverviewMode);
+ WindowSelectorTest::SetUp();
+}
+
// Tests that an a11y alert is sent on entering overview mode.
TEST_F(WindowSelectorTest, A11yAlertOnOverviewMode) {
gfx::Rect bounds(0, 0, 400, 400);
@@ -325,15 +365,6 @@ TEST_F(WindowSelectorTest, BasicGesture) {
TEST_F(WindowSelectorTest, NoCrashWithDesktopTap) {
scoped_ptr<aura::Window> window(CreateWindow(gfx::Rect(200, 300, 250, 450)));
- // We need a widget for the close button to work, a bare window will crash.
- scoped_ptr<views::Widget> widget(new views::Widget);
- views::Widget::InitParams params;
- params.bounds = gfx::Rect(0, 0, 400, 400);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.parent = window->parent();
- widget->Init(params);
- widget->Show();
-
ToggleOverview();
gfx::Rect bounds =
@@ -428,22 +459,15 @@ TEST_F(WindowSelectorTest, WindowDoesNotReceiveEvents) {
// Tests that clicking on the close button effectively closes the window.
TEST_F(WindowSelectorTest, CloseButton) {
- scoped_ptr<aura::Window> window1(CreateWindow(gfx::Rect(200, 300, 250, 450)));
+ scoped_ptr<views::Widget> widget =
+ CreateWindowWidget(gfx::Rect(0, 0, 400, 400));
- // We need a widget for the close button to work, a bare window will crash.
- scoped_ptr<views::Widget> widget(new views::Widget);
- views::Widget::InitParams params;
- params.bounds = gfx::Rect(0, 0, 400, 400);
- params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
- params.parent = window1->parent();
- widget->Init(params);
- widget->Show();
ToggleOverview();
- aura::Window* window2 = widget->GetNativeWindow();
- gfx::RectF bounds = GetTransformedBoundsInRootWindow(window2);
+ aura::Window* window = widget->GetNativeWindow();
+ gfx::RectF bounds = GetTransformedBoundsInRootWindow(window);
gfx::Point point(bounds.top_right().x() - 1, bounds.top_right().y() - 1);
- ui::test::EventGenerator event_generator(window2->GetRootWindow(), point);
+ ui::test::EventGenerator event_generator(window->GetRootWindow(), point);
EXPECT_FALSE(widget->IsClosed());
event_generator.ClickLeftButton();
@@ -461,7 +485,10 @@ TEST_F(WindowSelectorTest, CloseButtonOnMultipleDisplay) {
scoped_ptr<aura::Window> window1(CreateWindow(gfx::Rect(650, 300, 250, 450)));
- // We need a widget for the close button to work, a bare window will crash.
+ // We need a widget for the close button to work because windows are closed
+ // via the widget. We also use the widget to determine if the window has been
+ // closed or not. We explicity create the widget so that the window can be
+ // parented to a non-primary root window.
scoped_ptr<views::Widget> widget(new views::Widget);
views::Widget::InitParams params;
params.bounds = gfx::Rect(650, 0, 400, 400);
@@ -1246,4 +1273,209 @@ TEST_F(WindowSelectorTest, CancelOverviewOnTap) {
EXPECT_FALSE(IsSelecting());
}
+// Verify swipe to close doesn't work when swipe to close is disabled.
+TEST_F(WindowSelectorSwipeToCloseDisabledTest, WindowTapDragFarDistance) {
+ scoped_ptr<views::Widget> widget =
+ CreateWindowWidget(gfx::Rect(0, 0, 400, 400));
+
+ ToggleOverview();
+ ASSERT_TRUE(IsSelecting());
+
+ aura::Window* window = widget->GetNativeWindow();
+ gfx::Rect bounds = ToNearestRect(GetTransformedBoundsInRootWindow(window));
+ ui::test::EventGenerator event_generator(window->GetRootWindow());
+
+ ASSERT_FALSE(widget->IsClosed());
+
+ gfx::Point start(bounds.CenterPoint());
+ gfx::Point end(start.x() - kFarDragDistance, start.y());
+ event_generator.GestureScrollSequence(
+ start, end, base::TimeDelta::FromMilliseconds(10), 5);
+
+ EXPECT_FALSE(widget->IsClosed());
+
+ RunAllPendingInMessageLoop();
+ EXPECT_TRUE(IsSelecting());
+}
+
+// Verify the window moves and fades as it is dragged.
+TEST_F(WindowSelectorTest, VerifyWindowBehaviourDuringTapDrag) {
+ scoped_ptr<aura::Window> window(CreateWindow(gfx::Rect(0, 0, 400, 400)));
+
+ ToggleOverview();
+
+ gfx::Rect bounds = ToNearestRect(GetTransformedBoundsInRootWindow(
+ window.get()));
+ ui::test::EventGenerator event_generator(window->GetRootWindow());
+
+ const gfx::Point drag_start_point(bounds.CenterPoint());
+ const gfx::Point drag_left_point(drag_start_point.x() - kFarDragDistance,
+ drag_start_point.y());
+ const gfx::Point drag_right_point(drag_start_point.x() + kFarDragDistance,
+ drag_start_point.y());
+
+ const int drag_left_delta_x = drag_start_point.x() - drag_left_point.x();
+ const int drag_right_delta_x = drag_start_point.x() - drag_right_point.x();
+
+ const gfx::Rect original_bounds = window->GetBoundsInScreen();
+
+ ASSERT_EQ(1.0f, window->layer()->opacity());
+
+ event_generator.set_current_location(drag_start_point);
+ event_generator.PressTouch();
+
+ EXPECT_EQ(1.0f, window->layer()->opacity());
+
+ event_generator.MoveTouch(drag_left_point);
+
+ EXPECT_EQ(original_bounds.x() - drag_left_delta_x,
+ window->GetBoundsInScreen().x());
+ EXPECT_EQ(original_bounds.y(), window->GetBoundsInScreen().y());
+
+ EXPECT_LT(window->layer()->opacity(), 0.5f);
+
+ event_generator.MoveTouch(drag_start_point);
+
+ EXPECT_EQ(original_bounds.x(), window->GetBoundsInScreen().x());
+ EXPECT_EQ(original_bounds.y(), window->GetBoundsInScreen().y());
+ EXPECT_EQ(1.0f, window->layer()->opacity());
+
+ event_generator.MoveTouch(drag_right_point);
+
+ EXPECT_EQ(original_bounds.x() - drag_right_delta_x,
+ window->GetBoundsInScreen().x());
+ EXPECT_EQ(original_bounds.y(), window->GetBoundsInScreen().y());
+
+ EXPECT_LT(window->layer()->opacity(), 0.5f);
+}
+
+// Test dragging a window a short distance.
+TEST_F(WindowSelectorTest, WindowTapDragShortDistance) {
+ scoped_ptr<views::Widget> widget =
+ CreateWindowWidget(gfx::Rect(0, 0, 400, 400));
+
+ ToggleOverview();
+
+ aura::Window* window = widget->GetNativeWindow();
+ gfx::Rect bounds = ToNearestRect(GetTransformedBoundsInRootWindow(window));
+ ui::test::EventGenerator event_generator(window->GetRootWindow());
+
+ ASSERT_FALSE(widget->IsClosed());
+
+ gfx::Point start(bounds.CenterPoint());
+ gfx::Point end(start.x() - kShortDragDistance, start.y());
+ event_generator.GestureScrollSequence(
+ start, end, base::TimeDelta::FromMilliseconds(10), 5);
+
+ EXPECT_FALSE(widget->IsClosed());
+
+ RunAllPendingInMessageLoop();
+ EXPECT_TRUE(IsSelecting());
+}
+
+// Test dragging a window a far distance.
+TEST_F(WindowSelectorTest, WindowTapDragFarDistance) {
+ scoped_ptr<views::Widget> widget =
+ CreateWindowWidget(gfx::Rect(0, 0, 400, 400));
+
+ ToggleOverview();
+ ASSERT_TRUE(IsSelecting());
+
+ aura::Window* window = widget->GetNativeWindow();
+ gfx::Rect bounds = ToNearestRect(GetTransformedBoundsInRootWindow(window));
+ ui::test::EventGenerator event_generator(window->GetRootWindow());
+
+ ASSERT_FALSE(widget->IsClosed());
+
+ gfx::Point start(bounds.CenterPoint());
+ gfx::Point end(start.x() - kFarDragDistance, start.y());
+ event_generator.GestureScrollSequence(
+ start, end, base::TimeDelta::FromMilliseconds(10), 5);
+
+ EXPECT_TRUE(widget->IsClosed());
+
+ RunAllPendingInMessageLoop();
+ EXPECT_FALSE(IsSelecting());
+}
+
+// Test a slow velocity fling.
+TEST_F(WindowSelectorTest, SlowVelocityFling) {
+ scoped_ptr<views::Widget> widget =
+ CreateWindowWidget(gfx::Rect(0, 0, 400, 400));
+
+ ToggleOverview();
+
+ aura::Window* window = widget->GetNativeWindow();
+ gfx::RectF bounds = GetTransformedBoundsInRootWindow(window);
+ ui::test::EventGenerator event_generator(window->GetRootWindow());
+
+ ASSERT_FALSE(widget->IsClosed());
+
+ gfx::Point start(bounds.CenterPoint().x(), bounds.CenterPoint().y());
+ gfx::Point end(start.x() - kShortDragDistance, start.y());
+ const base::TimeDelta kScrollDuration =
+ event_generator.CalculateScrollDurationForFlingVelocity(
+ start, end, kSlowFlingVelocity, 10);
+ event_generator.GestureScrollSequence(start, end, kScrollDuration, 10);
+
+ EXPECT_FALSE(widget->IsClosed());
+
+ RunAllPendingInMessageLoop();
+ EXPECT_TRUE(IsSelecting());
+}
+
+// Test a fast velocity fling.
+TEST_F(WindowSelectorTest, FastVelocityFling) {
+ scoped_ptr<views::Widget> widget =
+ CreateWindowWidget(gfx::Rect(0, 0, 400, 400));
+
+ ToggleOverview();
+ ASSERT_TRUE(IsSelecting());
+
+ aura::Window* window = widget->GetNativeWindow();
+ gfx::RectF bounds = GetTransformedBoundsInRootWindow(window);
+ ui::test::EventGenerator event_generator(window->GetRootWindow());
+
+ ASSERT_FALSE(widget->IsClosed());
+
+ gfx::Point start(bounds.CenterPoint().x(), bounds.CenterPoint().y());
+ gfx::Point end(start.x() - kShortDragDistance, start.y());
+ const base::TimeDelta kScrollDuration =
+ event_generator.CalculateScrollDurationForFlingVelocity(
+ start, end, kFastFlingVelocity, 10);
+ event_generator.GestureScrollSequence(start, end, kScrollDuration, 10);
+
+ EXPECT_TRUE(widget->IsClosed());
+
+ RunAllPendingInMessageLoop();
+ EXPECT_FALSE(IsSelecting());
+}
+
+// Test a fast velocity fling.
+TEST_F(WindowSelectorTest, SlowVelocityFlingAtAFarDistance) {
+ scoped_ptr<views::Widget> widget =
+ CreateWindowWidget(gfx::Rect(0, 0, 400, 400));
+
+ ToggleOverview();
+ ASSERT_TRUE(IsSelecting());
+
+ aura::Window* window = widget->GetNativeWindow();
+ gfx::RectF bounds = GetTransformedBoundsInRootWindow(window);
+ ui::test::EventGenerator event_generator(window->GetRootWindow());
+
+ ASSERT_FALSE(widget->IsClosed());
+
+ gfx::Point start(bounds.CenterPoint().x(), bounds.CenterPoint().y());
+ gfx::Point end(start.x() - kFarDragDistance, start.y());
+ const base::TimeDelta kScrollDuration =
+ event_generator.CalculateScrollDurationForFlingVelocity(
+ start, end, kSlowFlingVelocity, 10);
+ event_generator.GestureScrollSequence(start, end, kScrollDuration, 10);
+
+ EXPECT_TRUE(widget->IsClosed());
+
+ RunAllPendingInMessageLoop();
+ EXPECT_FALSE(IsSelecting());
+}
+
} // namespace ash