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: 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. 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. 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. 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. 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 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