1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ash/root_window_controller.h"
6#include "ash/shell.h"
7#include "ash/test/ash_test_base.h"
8#include "ash/wm/overview/window_selector_controller.h"
9#include "ui/aura/test/test_window_delegate.h"
10#include "ui/aura/test/test_windows.h"
11#include "ui/aura/window.h"
12#include "ui/aura/window_event_dispatcher.h"
13#include "ui/events/test/event_generator.h"
14#include "ui/views/widget/widget.h"
15
16namespace ash {
17
18class OverviewGestureHandlerTest : public test::AshTestBase {
19 public:
20  OverviewGestureHandlerTest() {}
21  virtual ~OverviewGestureHandlerTest() {}
22
23  aura::Window* CreateWindow(const gfx::Rect& bounds) {
24    return CreateTestWindowInShellWithDelegate(&delegate_, -1, bounds);
25  }
26
27  bool IsSelecting() {
28    return ash::Shell::GetInstance()->window_selector_controller()->
29        IsSelecting();
30  }
31
32 private:
33  aura::test::TestWindowDelegate delegate_;
34
35  DISALLOW_COPY_AND_ASSIGN(OverviewGestureHandlerTest);
36};
37
38// Tests a swipe up with three fingers to enter and a swipe down to exit
39// overview.
40TEST_F(OverviewGestureHandlerTest, VerticalSwipes) {
41  gfx::Rect bounds(0, 0, 400, 400);
42  aura::Window* root_window = Shell::GetPrimaryRootWindow();
43  scoped_ptr<aura::Window> window1(CreateWindow(bounds));
44  scoped_ptr<aura::Window> window2(CreateWindow(bounds));
45  ui::test::EventGenerator generator(root_window, root_window);
46  generator.ScrollSequence(gfx::Point(), base::TimeDelta::FromMilliseconds(5),
47      0, -500, 100, 3);
48  EXPECT_TRUE(IsSelecting());
49
50  // Swiping up again does nothing.
51  generator.ScrollSequence(gfx::Point(), base::TimeDelta::FromMilliseconds(5),
52      0, -500, 100, 3);
53  EXPECT_TRUE(IsSelecting());
54
55  // Swiping down exits.
56  generator.ScrollSequence(gfx::Point(), base::TimeDelta::FromMilliseconds(5),
57      0, 500, 100, 3);
58  EXPECT_FALSE(IsSelecting());
59
60  // Swiping down again does nothing.
61  generator.ScrollSequence(gfx::Point(), base::TimeDelta::FromMilliseconds(5),
62      0, 500, 100, 3);
63  EXPECT_FALSE(IsSelecting());
64}
65
66// Tests that a mostly horizontal swipe does not trigger overview.
67TEST_F(OverviewGestureHandlerTest, HorizontalSwipes) {
68  gfx::Rect bounds(0, 0, 400, 400);
69  aura::Window* root_window = Shell::GetPrimaryRootWindow();
70  scoped_ptr<aura::Window> window1(CreateWindow(bounds));
71  scoped_ptr<aura::Window> window2(CreateWindow(bounds));
72  ui::test::EventGenerator generator(root_window, root_window);
73  generator.ScrollSequence(gfx::Point(), base::TimeDelta::FromMilliseconds(5),
74      600, -500, 100, 3);
75  EXPECT_FALSE(IsSelecting());
76
77  generator.ScrollSequence(gfx::Point(), base::TimeDelta::FromMilliseconds(5),
78      -600, -500, 100, 3);
79  EXPECT_FALSE(IsSelecting());
80}
81
82// Tests a swipe up with three fingers without releasing followed by a swipe
83// down by a lesser amount which should still be enough to exit.
84TEST_F(OverviewGestureHandlerTest, SwipeUpDownWithoutReleasing) {
85  gfx::Rect bounds(0, 0, 400, 400);
86  aura::Window* root_window = Shell::GetPrimaryRootWindow();
87  scoped_ptr<aura::Window> window1(CreateWindow(bounds));
88  scoped_ptr<aura::Window> window2(CreateWindow(bounds));
89  ui::test::EventGenerator generator(root_window, root_window);
90  base::TimeDelta timestamp = base::TimeDelta::FromInternalValue(
91      base::TimeTicks::Now().ToInternalValue());
92  gfx::Point start;
93  int num_fingers = 3;
94  base::TimeDelta step_delay(base::TimeDelta::FromMilliseconds(5));
95  ui::ScrollEvent fling_cancel(ui::ET_SCROLL_FLING_CANCEL,
96                               start,
97                               timestamp,
98                               0,
99                               0, 0,
100                               0, 0,
101                               num_fingers);
102  generator.Dispatch(&fling_cancel);
103
104  // Scroll up by 1000px.
105  for (int i = 0; i < 100; ++i) {
106    timestamp += step_delay;
107    ui::ScrollEvent move(ui::ET_SCROLL,
108                         start,
109                         timestamp,
110                         0,
111                         0, -10,
112                         0, -10,
113                         num_fingers);
114    generator.Dispatch(&move);
115  }
116
117  EXPECT_TRUE(IsSelecting());
118
119  // Without releasing scroll back down by 600px.
120  for (int i = 0; i < 60; ++i) {
121    timestamp += step_delay;
122    ui::ScrollEvent move(ui::ET_SCROLL,
123                         start,
124                         timestamp,
125                         0,
126                         0, 10,
127                         0, 10,
128                         num_fingers);
129    generator.Dispatch(&move);
130  }
131
132  EXPECT_FALSE(IsSelecting());
133  ui::ScrollEvent fling_start(ui::ET_SCROLL_FLING_START,
134                              start,
135                              timestamp,
136                              0,
137                              0, 10,
138                              0, 10,
139                              num_fingers);
140  generator.Dispatch(&fling_start);
141}
142
143// Tests a swipe down from the top of the screen to enter and exit overview.
144TEST_F(OverviewGestureHandlerTest, GestureSwipe) {
145  gfx::Rect bounds(0, 0, 400, 400);
146  aura::Window* root_window = Shell::GetPrimaryRootWindow();
147  scoped_ptr<aura::Window> window1(CreateWindow(bounds));
148  scoped_ptr<aura::Window> window2(CreateWindow(bounds));
149  ui::test::EventGenerator generator(root_window, root_window);
150  gfx::Point start_points[3];
151  start_points[0] = start_points[1] = start_points[2] = gfx::Point();
152  generator.GestureMultiFingerScroll(3, start_points, 5, 10, 0, 100);
153  EXPECT_TRUE(IsSelecting());
154
155  generator.GestureMultiFingerScroll(3, start_points, 5, 10, 0, 100);
156  EXPECT_FALSE(IsSelecting());
157}
158
159// Tests that a swipe down from the top of a window doesn't enter overview.
160// http://crbug.com/313859
161TEST_F(OverviewGestureHandlerTest, GestureSwipeTopOfWindow) {
162  gfx::Rect bounds(100, 100, 400, 400);
163  aura::Window* root_window = Shell::GetPrimaryRootWindow();
164  scoped_ptr<aura::Window> window1(CreateWindow(bounds));
165  scoped_ptr<aura::Window> window2(CreateWindow(bounds));
166  ui::test::EventGenerator generator(root_window, window2.get());
167  gfx::Point start_points[3];
168  start_points[0] = start_points[1] = start_points[2] = gfx::Point(105, 105);
169  generator.GestureMultiFingerScroll(3, start_points, 5, 10, 0, 100);
170  EXPECT_FALSE(IsSelecting());
171}
172
173}  // namespace ash
174