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/root_window.h"
10 #include "ui/aura/test/event_generator.h"
11 #include "ui/aura/test/test_window_delegate.h"
12 #include "ui/aura/test/test_windows.h"
13 #include "ui/aura/window.h"
14
15 namespace ash {
16 namespace internal {
17
18 class OverviewGestureHandlerTest : public test::AshTestBase {
19 public:
OverviewGestureHandlerTest()20 OverviewGestureHandlerTest() {}
~OverviewGestureHandlerTest()21 virtual ~OverviewGestureHandlerTest() {}
22
CreateWindow(const gfx::Rect & bounds)23 aura::Window* CreateWindow(const gfx::Rect& bounds) {
24 return CreateTestWindowInShellWithDelegate(&delegate_, -1, bounds);
25 }
26
IsSelecting()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.
TEST_F(OverviewGestureHandlerTest,VerticalSwipes)40 TEST_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 aura::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.
TEST_F(OverviewGestureHandlerTest,HorizontalSwipes)67 TEST_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 aura::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.
TEST_F(OverviewGestureHandlerTest,SwipeUpDownWithoutReleasing)84 TEST_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 aura::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.
TEST_F(OverviewGestureHandlerTest,GestureSwipe)144 TEST_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 aura::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
TEST_F(OverviewGestureHandlerTest,GestureSwipeTopOfWindow)161 TEST_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 aura::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 internal
174 } // namespace ash
175