• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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