1 // Copyright 2014 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.
5 #include "athena/home/public/home_card.h"
7 #include "athena/activity/public/activity_factory.h"
8 #include "athena/home/home_card_constants.h"
9 #include "athena/home/home_card_impl.h"
10 #include "athena/test/base/athena_test_base.h"
11 #include "athena/wm/public/window_manager.h"
12 #include "ui/aura/window.h"
13 #include "ui/events/test/event_generator.h"
14 #include "ui/gfx/display.h"
15 #include "ui/gfx/screen.h"
16 #include "ui/views/controls/textfield/textfield.h"
17 #include "ui/views/focus/focus_manager.h"
18 #include "ui/views/widget/widget.h"
19 #include "ui/wm/core/shadow_types.h"
20 #include "ui/wm/core/window_util.h"
24 aura::Window
* GetHomeCardWindow() {
25 return static_cast<HomeCardImpl
*>(HomeCard::Get())->
26 GetHomeCardWindowForTest();
29 // Returns true if the keyboard focus is on the search box.
30 bool IsSearchBoxFocused(aura::Window
* home_card
) {
31 return views::Widget::GetWidgetForNativeWindow(home_card
)->
32 GetContentsView()->GetViewByID(kHomeCardSearchBoxId
)->HasFocus();
35 typedef test::AthenaTestBase HomeCardTest
;
37 TEST_F(HomeCardTest
, BasicTransition
) {
38 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
39 aura::Window
* home_card
= GetHomeCardWindow();
40 const int screen_height
= root_window()->bounds().height();
41 const int work_area_height
= gfx::Screen::GetScreenFor(root_window())->
42 GetDisplayNearestWindow(root_window()).work_area().height();
43 ASSERT_TRUE(home_card
);
45 // In the minimized state, home card should be outside (below) the work area.
46 EXPECT_EQ(screen_height
- kHomeCardMinimizedHeight
,
47 home_card
->GetTargetBounds().y());
48 EXPECT_EQ(work_area_height
, home_card
->GetTargetBounds().y());
49 EXPECT_EQ(wm::ShadowType::SHADOW_TYPE_NONE
, wm::GetShadowType(home_card
));
51 WindowManager::Get()->EnterOverview();
52 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
53 EXPECT_EQ(screen_height
- kHomeCardHeight
, home_card
->GetTargetBounds().y());
54 EXPECT_EQ(wm::ShadowType::SHADOW_TYPE_RECTANGULAR
,
55 wm::GetShadowType(home_card
));
57 WindowManager::Get()->ExitOverview();
58 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
59 EXPECT_EQ(work_area_height
, home_card
->GetTargetBounds().y());
60 EXPECT_EQ(wm::ShadowType::SHADOW_TYPE_NONE
, wm::GetShadowType(home_card
));
63 TEST_F(HomeCardTest
, VirtualKeyboardTransition
) {
64 // Minimized -> Hidden for virtual keyboard.
65 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
66 const gfx::Rect
vk_bounds(0, 0, 100, 100);
67 HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds
);
68 EXPECT_EQ(HomeCard::HIDDEN
, HomeCard::Get()->GetState());
69 HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect());
70 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
72 // bottom -> centered for virtual keyboard.
73 WindowManager::Get()->EnterOverview();
74 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
75 HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds
);
76 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
78 aura::Window
* home_card
= GetHomeCardWindow();
79 EXPECT_EQ(0, home_card
->GetTargetBounds().y());
80 EXPECT_EQ(wm::ShadowType::SHADOW_TYPE_RECTANGULAR
,
81 wm::GetShadowType(home_card
));
83 HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect());
84 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
87 TEST_F(HomeCardTest
, ToggleOverviewWithVirtualKeyboard
) {
88 // Minimized -> Hidden for virtual keyboard.
89 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
90 const gfx::Rect
vk_bounds(0, 0, 100, 100);
91 HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds
);
92 EXPECT_EQ(HomeCard::HIDDEN
, HomeCard::Get()->GetState());
94 // EnterOverview() revives the bottom home card. Home card also gets
95 /// activated which will close the virtual keyboard.
96 WindowManager::Get()->EnterOverview();
97 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
98 aura::Window
* home_card
= GetHomeCardWindow();
99 EXPECT_TRUE(wm::IsActiveWindow(home_card
));
102 // Verify if the home card is correctly minimized after app launch.
103 TEST_F(HomeCardTest
, AppSelection
) {
104 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
106 WindowManager::Get()->EnterOverview();
107 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
109 athena::ActivityFactory::Get()->CreateWebActivity(
110 NULL
, base::string16(), GURL("http://www.google.com/"));
111 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
114 TEST_F(HomeCardTest
, Accelerators
) {
115 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
117 ui::test::EventGenerator
generator(root_window());
119 // CTRL+L toggles centered home card, check that overview mode follows
120 generator
.PressKey(ui::VKEY_L
, ui::EF_CONTROL_DOWN
);
121 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
122 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
123 generator
.PressKey(ui::VKEY_L
, ui::EF_CONTROL_DOWN
);
124 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
125 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive());
127 // ESC key hides centered home card
128 generator
.PressKey(ui::VKEY_L
, ui::EF_CONTROL_DOWN
);
129 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
130 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
131 generator
.PressKey(ui::VKEY_ESCAPE
, ui::EF_NONE
);
132 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
133 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive());
135 // Do nothing with bottom home card with CTRL+L, hide with ESC key
136 WindowManager::Get()->EnterOverview();
137 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
138 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
139 generator
.PressKey(ui::VKEY_L
, ui::EF_CONTROL_DOWN
);
140 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
141 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
142 generator
.PressKey(ui::VKEY_ESCAPE
, ui::EF_NONE
);
143 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
144 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive());
146 // Do nothing if the centered state is a temporary state.
147 WindowManager::Get()->EnterOverview();
148 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
149 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
150 HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect(0, 0, 100, 100));
151 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
152 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
153 generator
.PressKey(ui::VKEY_L
, ui::EF_CONTROL_DOWN
);
154 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
155 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
158 TEST_F(HomeCardTest
, MouseClick
) {
159 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
161 // Mouse click at the bottom of the screen should invokes overview mode and
162 // changes the state to BOTTOM.
163 gfx::Rect
screen_rect(root_window()->bounds());
164 ui::test::EventGenerator
generator(
165 root_window(), gfx::Point(
166 screen_rect
.x() + screen_rect
.width() / 2, screen_rect
.bottom() - 1));
167 generator
.ClickLeftButton();
169 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
170 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
172 // Further clicks are simply ignored.
173 generator
.ClickLeftButton();
174 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
175 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
178 TEST_F(HomeCardTest
, Gestures
) {
179 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
180 ui::test::EventGenerator
generator(root_window());
181 gfx::Rect
screen_rect(root_window()->bounds());
183 const int bottom
= screen_rect
.bottom();
184 const int x
= screen_rect
.x() + 1;
186 generator
.GestureScrollSequence(gfx::Point(x
, bottom
- 1),
187 gfx::Point(x
, bottom
- 70),
188 base::TimeDelta::FromSeconds(1),
190 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
191 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
193 // Too short moves. Nothing has changed.
194 generator
.GestureScrollSequence(gfx::Point(x
, bottom
- 40),
195 gfx::Point(x
, bottom
- 80),
196 base::TimeDelta::FromSeconds(1),
198 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
199 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
201 generator
.GestureScrollSequence(gfx::Point(x
, bottom
- 40),
202 gfx::Point(x
, bottom
- 20),
203 base::TimeDelta::FromSeconds(1),
205 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
206 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
208 // Swipe up to the centered state.
209 generator
.GestureScrollSequence(gfx::Point(x
, bottom
- 40),
210 gfx::Point(x
, bottom
- 300),
211 base::TimeDelta::FromSeconds(1),
213 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
214 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
216 // Swipe up from centered; nothing has to be changed.
217 generator
.GestureScrollSequence(gfx::Point(x
, bottom
- 300),
218 gfx::Point(x
, bottom
- 350),
219 base::TimeDelta::FromSeconds(1),
221 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
222 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
224 // Swipe down slightly; nothing has to be changed.
225 generator
.GestureScrollSequence(gfx::Point(x
, bottom
- 300),
226 gfx::Point(x
, bottom
- 250),
227 base::TimeDelta::FromSeconds(1),
229 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
230 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
232 // Swipe down to the bottom state.
233 generator
.GestureScrollSequence(gfx::Point(x
, 10),
234 gfx::Point(x
, bottom
- 90),
235 base::TimeDelta::FromSeconds(1),
237 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
238 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
240 generator
.GestureScrollSequence(gfx::Point(x
, bottom
- 40),
241 gfx::Point(x
, bottom
- 300),
242 base::TimeDelta::FromSeconds(1),
244 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
245 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
247 // Swipe down to the minimized state.
248 generator
.GestureScrollSequence(gfx::Point(x
, 10),
249 gfx::Point(x
, bottom
- 1),
250 base::TimeDelta::FromSeconds(1),
252 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
253 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive());
256 TEST_F(HomeCardTest
, GesturesToFullDirectly
) {
257 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
258 ui::test::EventGenerator
generator(root_window());
259 gfx::Rect
screen_rect(root_window()->bounds());
261 const int bottom
= screen_rect
.bottom();
262 const int x
= screen_rect
.x() + 1;
264 generator
.GestureScrollSequence(gfx::Point(x
, bottom
- 1),
266 base::TimeDelta::FromSeconds(1),
268 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
269 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
272 TEST_F(HomeCardTest
, KeyboardFocus
) {
273 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED
, HomeCard::Get()->GetState());
274 aura::Window
* home_card
= GetHomeCardWindow();
275 ASSERT_FALSE(IsSearchBoxFocused(home_card
));
277 WindowManager::Get()->EnterOverview();
278 ASSERT_FALSE(IsSearchBoxFocused(home_card
));
280 ui::test::EventGenerator
generator(root_window());
281 gfx::Rect
screen_rect(root_window()->bounds());
283 const int bottom
= screen_rect
.bottom();
284 const int x
= screen_rect
.x() + 1;
286 generator
.GestureScrollSequence(gfx::Point(x
, bottom
- 40),
288 base::TimeDelta::FromSeconds(1),
290 EXPECT_EQ(HomeCard::VISIBLE_CENTERED
, HomeCard::Get()->GetState());
291 EXPECT_TRUE(IsSearchBoxFocused(home_card
));
293 generator
.GestureScrollSequence(gfx::Point(x
, 10),
294 gfx::Point(x
, bottom
- 100),
295 base::TimeDelta::FromSeconds(1),
297 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM
, HomeCard::Get()->GetState());
298 EXPECT_FALSE(IsSearchBoxFocused(home_card
));
301 } // namespace athena