blob: b9842e53976585901952e1bfd2aec5369cd1da2e [file] [log] [blame]
[email protected]df1c9862012-02-27 10:37:311// Copyright (c) 2012 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/focus_cycler.h"
6
dchenga94547472016-04-08 08:41:117#include <memory>
8
[email protected]16059276d2012-10-22 18:59:509#include "ash/root_window_controller.h"
[email protected]864b58552013-12-19 04:19:3810#include "ash/shelf/shelf.h"
[email protected]478c6c32013-03-09 02:50:5811#include "ash/shelf/shelf_widget.h"
[email protected]df1c9862012-02-27 10:37:3112#include "ash/shell.h"
[email protected]864b58552013-12-19 04:19:3813#include "ash/shell_factory.h"
[email protected]df1c9862012-02-27 10:37:3114#include "ash/shell_window_ids.h"
[email protected]6d6546e2012-05-30 23:12:0215#include "ash/system/status_area_widget.h"
16#include "ash/system/status_area_widget_delegate.h"
[email protected]860f5942012-04-24 16:11:3917#include "ash/system/tray/system_tray.h"
[email protected]df1c9862012-02-27 10:37:3118#include "ash/test/ash_test_base.h"
[email protected]864b58552013-12-19 04:19:3819#include "ash/wm/window_util.h"
[email protected]df1c9862012-02-27 10:37:3120#include "ui/aura/test/test_windows.h"
21#include "ui/aura/window.h"
[email protected]fcc51c952014-02-21 21:31:2622#include "ui/aura/window_event_dispatcher.h"
[email protected]73c9fd02014-07-28 01:48:5223#include "ui/events/test/event_generator.h"
[email protected]242aa4f2013-04-30 01:04:0824#include "ui/views/accessible_pane_view.h"
[email protected]df1c9862012-02-27 10:37:3125#include "ui/views/controls/button/menu_button.h"
26#include "ui/views/widget/widget.h"
27
28namespace ash {
29namespace test {
30
[email protected]df1c9862012-02-27 10:37:3131using aura::Window;
[email protected]df1c9862012-02-27 10:37:3132
[email protected]8676f0472012-03-29 20:30:1233namespace {
34
[email protected]093b8d642014-04-03 20:59:2835StatusAreaWidgetDelegate* GetStatusAreaWidgetDelegate(views::Widget* widget) {
36 return static_cast<StatusAreaWidgetDelegate*>(widget->GetContentsView());
[email protected]8676f0472012-03-29 20:30:1237}
38
[email protected]242aa4f2013-04-30 01:04:0839class PanedWidgetDelegate : public views::WidgetDelegate {
40 public:
41 PanedWidgetDelegate(views::Widget* widget) : widget_(widget) {}
42
43 void SetAccessiblePanes(const std::vector<views::View*>& panes) {
44 accessible_panes_ = panes;
45 }
46
47 // views::WidgetDelegate.
dcheng222b9c72015-01-16 00:48:0148 void GetAccessiblePanes(std::vector<views::View*>* panes) override {
[email protected]8020c932013-05-07 06:24:2749 std::copy(accessible_panes_.begin(),
50 accessible_panes_.end(),
[email protected]242aa4f2013-04-30 01:04:0851 std::back_inserter(*panes));
52 }
dcheng222b9c72015-01-16 00:48:0153 views::Widget* GetWidget() override { return widget_; };
54 const views::Widget* GetWidget() const override { return widget_; }
[email protected]242aa4f2013-04-30 01:04:0855
56 private:
57 views::Widget* widget_;
58 std::vector<views::View*> accessible_panes_;
59};
60
[email protected]8676f0472012-03-29 20:30:1261} // namespace
62
[email protected]eb5a0ab2012-10-20 00:50:2563class FocusCyclerTest : public AshTestBase {
64 public:
65 FocusCyclerTest() {}
[email protected]df1c9862012-02-27 10:37:3166
dcheng222b9c72015-01-16 00:48:0167 void SetUp() override {
[email protected]eb5a0ab2012-10-20 00:50:2568 AshTestBase::SetUp();
[email protected]df1c9862012-02-27 10:37:3169
[email protected]eb5a0ab2012-10-20 00:50:2570 focus_cycler_.reset(new FocusCycler());
71
[email protected]864b58552013-12-19 04:19:3872 ASSERT_TRUE(Shelf::ForPrimaryDisplay());
[email protected]eb5a0ab2012-10-20 00:50:2573 }
74
dcheng222b9c72015-01-16 00:48:0175 void TearDown() override {
[email protected]7f7f65c2013-04-17 16:47:1376 if (tray_) {
[email protected]eb5a0ab2012-10-20 00:50:2577 GetStatusAreaWidgetDelegate(tray_->GetWidget())->
78 SetFocusCyclerForTesting(NULL);
79 tray_.reset();
80 }
81
[email protected]478c6c32013-03-09 02:50:5882 shelf_widget()->SetFocusCycler(NULL);
[email protected]eb5a0ab2012-10-20 00:50:2583
84 focus_cycler_.reset();
85
86 AshTestBase::TearDown();
87 }
88
89 protected:
90 // Creates the system tray, returning true on success.
91 bool CreateTray() {
[email protected]7f7f65c2013-04-17 16:47:1392 if (tray_)
[email protected]eb5a0ab2012-10-20 00:50:2593 return false;
[email protected]093b8d642014-04-03 20:59:2894 aura::Window* parent =
95 Shell::GetPrimaryRootWindowController()->GetContainer(
96 ash::kShellWindowId_StatusContainer);
[email protected]16059276d2012-10-22 18:59:5097
mswa7e8a5f2016-03-01 04:15:0698 StatusAreaWidget* widget = new StatusAreaWidget(parent, shelf_widget());
[email protected]51ed5992012-11-07 10:14:3999 widget->CreateTrayViews();
[email protected]eb5a0ab2012-10-20 00:50:25100 widget->Show();
101 tray_.reset(widget->system_tray());
102 if (!tray_->GetWidget())
103 return false;
104 focus_cycler_->AddWidget(tray()->GetWidget());
105 GetStatusAreaWidgetDelegate(tray_->GetWidget())->SetFocusCyclerForTesting(
106 focus_cycler());
107 return true;
108 }
109
110 FocusCycler* focus_cycler() { return focus_cycler_.get(); }
111
112 SystemTray* tray() { return tray_.get(); }
113
[email protected]478c6c32013-03-09 02:50:58114 ShelfWidget* shelf_widget() {
[email protected]864b58552013-12-19 04:19:38115 return Shelf::ForPrimaryDisplay()->shelf_widget();
[email protected]eb5a0ab2012-10-20 00:50:25116 }
117
[email protected]478c6c32013-03-09 02:50:58118 void InstallFocusCycleOnShelf() {
119 // Add the shelf.
120 shelf_widget()->SetFocusCycler(focus_cycler());
[email protected]eb5a0ab2012-10-20 00:50:25121 }
122
123 private:
dchenga94547472016-04-08 08:41:11124 std::unique_ptr<FocusCycler> focus_cycler_;
125 std::unique_ptr<SystemTray> tray_;
[email protected]eb5a0ab2012-10-20 00:50:25126
127 DISALLOW_COPY_AND_ASSIGN(FocusCyclerTest);
128};
129
130TEST_F(FocusCyclerTest, CycleFocusBrowserOnly) {
[email protected]df1c9862012-02-27 10:37:31131 // Create a single test window.
dchenga94547472016-04-08 08:41:11132 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
[email protected]f3c7b252012-02-27 12:17:54133 wm::ActivateWindow(window0.get());
134 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
[email protected]df1c9862012-02-27 10:37:31135
136 // Cycle the window
[email protected]eb5a0ab2012-10-20 00:50:25137 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
[email protected]f3c7b252012-02-27 12:17:54138 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
[email protected]df1c9862012-02-27 10:37:31139}
140
[email protected]eb5a0ab2012-10-20 00:50:25141TEST_F(FocusCyclerTest, CycleFocusForward) {
142 ASSERT_TRUE(CreateTray());
[email protected]df1c9862012-02-27 10:37:31143
[email protected]478c6c32013-03-09 02:50:58144 InstallFocusCycleOnShelf();
[email protected]df1c9862012-02-27 10:37:31145
146 // Create a single test window.
dchenga94547472016-04-08 08:41:11147 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
[email protected]f3c7b252012-02-27 12:17:54148 wm::ActivateWindow(window0.get());
149 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
[email protected]df1c9862012-02-27 10:37:31150
[email protected]478c6c32013-03-09 02:50:58151 // Cycle focus to the status area.
[email protected]eb5a0ab2012-10-20 00:50:25152 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
153 EXPECT_TRUE(tray()->GetWidget()->IsActive());
[email protected]df1c9862012-02-27 10:37:31154
[email protected]478c6c32013-03-09 02:50:58155 // Cycle focus to the shelf.
[email protected]eb5a0ab2012-10-20 00:50:25156 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
[email protected]478c6c32013-03-09 02:50:58157 EXPECT_TRUE(shelf_widget()->IsActive());
[email protected]df1c9862012-02-27 10:37:31158
[email protected]478c6c32013-03-09 02:50:58159 // Cycle focus to the browser.
[email protected]eb5a0ab2012-10-20 00:50:25160 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
[email protected]f3c7b252012-02-27 12:17:54161 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
[email protected]df1c9862012-02-27 10:37:31162}
163
[email protected]eb5a0ab2012-10-20 00:50:25164TEST_F(FocusCyclerTest, CycleFocusBackward) {
165 ASSERT_TRUE(CreateTray());
[email protected]df1c9862012-02-27 10:37:31166
[email protected]478c6c32013-03-09 02:50:58167 InstallFocusCycleOnShelf();
[email protected]df1c9862012-02-27 10:37:31168
169 // Create a single test window.
dchenga94547472016-04-08 08:41:11170 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
[email protected]f3c7b252012-02-27 12:17:54171 wm::ActivateWindow(window0.get());
172 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
[email protected]df1c9862012-02-27 10:37:31173
[email protected]478c6c32013-03-09 02:50:58174 // Cycle focus to the shelf.
[email protected]eb5a0ab2012-10-20 00:50:25175 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
[email protected]478c6c32013-03-09 02:50:58176 EXPECT_TRUE(shelf_widget()->IsActive());
[email protected]df1c9862012-02-27 10:37:31177
[email protected]478c6c32013-03-09 02:50:58178 // Cycle focus to the status area.
[email protected]eb5a0ab2012-10-20 00:50:25179 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
180 EXPECT_TRUE(tray()->GetWidget()->IsActive());
[email protected]df1c9862012-02-27 10:37:31181
[email protected]478c6c32013-03-09 02:50:58182 // Cycle focus to the browser.
[email protected]eb5a0ab2012-10-20 00:50:25183 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
[email protected]f3c7b252012-02-27 12:17:54184 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
[email protected]df1c9862012-02-27 10:37:31185}
186
[email protected]eb5a0ab2012-10-20 00:50:25187TEST_F(FocusCyclerTest, CycleFocusForwardBackward) {
188 ASSERT_TRUE(CreateTray());
[email protected]ce711ac2012-06-14 07:05:41189
[email protected]478c6c32013-03-09 02:50:58190 InstallFocusCycleOnShelf();
[email protected]ce711ac2012-06-14 07:05:41191
192 // Create a single test window.
dchenga94547472016-04-08 08:41:11193 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
[email protected]ce711ac2012-06-14 07:05:41194 wm::ActivateWindow(window0.get());
195 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
196
[email protected]478c6c32013-03-09 02:50:58197 // Cycle focus to the shelf.
[email protected]eb5a0ab2012-10-20 00:50:25198 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
[email protected]478c6c32013-03-09 02:50:58199 EXPECT_TRUE(shelf_widget()->IsActive());
[email protected]ce711ac2012-06-14 07:05:41200
[email protected]478c6c32013-03-09 02:50:58201 // Cycle focus to the status area.
[email protected]eb5a0ab2012-10-20 00:50:25202 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
203 EXPECT_TRUE(tray()->GetWidget()->IsActive());
[email protected]ce711ac2012-06-14 07:05:41204
[email protected]478c6c32013-03-09 02:50:58205 // Cycle focus to the browser.
[email protected]eb5a0ab2012-10-20 00:50:25206 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
[email protected]ce711ac2012-06-14 07:05:41207 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
208
[email protected]478c6c32013-03-09 02:50:58209 // Cycle focus to the status area.
[email protected]eb5a0ab2012-10-20 00:50:25210 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
211 EXPECT_TRUE(tray()->GetWidget()->IsActive());
[email protected]ce711ac2012-06-14 07:05:41212
[email protected]478c6c32013-03-09 02:50:58213 // Cycle focus to the shelf.
[email protected]eb5a0ab2012-10-20 00:50:25214 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
[email protected]478c6c32013-03-09 02:50:58215 EXPECT_TRUE(shelf_widget()->IsActive());
[email protected]ce711ac2012-06-14 07:05:41216
[email protected]478c6c32013-03-09 02:50:58217 // Cycle focus to the browser.
[email protected]eb5a0ab2012-10-20 00:50:25218 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
[email protected]ce711ac2012-06-14 07:05:41219 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
220}
221
[email protected]eb5a0ab2012-10-20 00:50:25222TEST_F(FocusCyclerTest, CycleFocusNoBrowser) {
223 ASSERT_TRUE(CreateTray());
[email protected]ce711ac2012-06-14 07:05:41224
[email protected]478c6c32013-03-09 02:50:58225 InstallFocusCycleOnShelf();
[email protected]ce711ac2012-06-14 07:05:41226
[email protected]478c6c32013-03-09 02:50:58227 // Add the shelf and focus it.
228 focus_cycler()->FocusWidget(shelf_widget());
[email protected]ce711ac2012-06-14 07:05:41229
[email protected]478c6c32013-03-09 02:50:58230 // Cycle focus to the status area.
[email protected]eb5a0ab2012-10-20 00:50:25231 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
232 EXPECT_TRUE(tray()->GetWidget()->IsActive());
[email protected]ce711ac2012-06-14 07:05:41233
[email protected]478c6c32013-03-09 02:50:58234 // Cycle focus to the shelf.
[email protected]eb5a0ab2012-10-20 00:50:25235 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
[email protected]478c6c32013-03-09 02:50:58236 EXPECT_TRUE(shelf_widget()->IsActive());
[email protected]ce711ac2012-06-14 07:05:41237
[email protected]478c6c32013-03-09 02:50:58238 // Cycle focus to the status area.
[email protected]eb5a0ab2012-10-20 00:50:25239 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
240 EXPECT_TRUE(tray()->GetWidget()->IsActive());
[email protected]ce711ac2012-06-14 07:05:41241
[email protected]478c6c32013-03-09 02:50:58242 // Cycle focus to the shelf.
[email protected]eb5a0ab2012-10-20 00:50:25243 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
[email protected]478c6c32013-03-09 02:50:58244 EXPECT_TRUE(shelf_widget()->IsActive());
[email protected]ce711ac2012-06-14 07:05:41245
[email protected]478c6c32013-03-09 02:50:58246 // Cycle focus to the status area.
[email protected]eb5a0ab2012-10-20 00:50:25247 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
248 EXPECT_TRUE(tray()->GetWidget()->IsActive());
[email protected]ce711ac2012-06-14 07:05:41249}
250
[email protected]fba1eb22014-03-12 21:12:50251// Tests that focus cycles from the active browser to the status area and back.
[email protected]478c6c32013-03-09 02:50:58252TEST_F(FocusCyclerTest, Shelf_CycleFocusForward) {
[email protected]eb5a0ab2012-10-20 00:50:25253 ASSERT_TRUE(CreateTray());
[email protected]478c6c32013-03-09 02:50:58254 InstallFocusCycleOnShelf();
255 shelf_widget()->Hide();
[email protected]057dc5752012-03-06 23:59:31256
[email protected]fba1eb22014-03-12 21:12:50257 // Create two test windows.
dchenga94547472016-04-08 08:41:11258 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
259 std::unique_ptr<Window> window1(CreateTestWindowInShellWithId(1));
[email protected]fba1eb22014-03-12 21:12:50260 wm::ActivateWindow(window1.get());
[email protected]057dc5752012-03-06 23:59:31261 wm::ActivateWindow(window0.get());
262 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
263
[email protected]478c6c32013-03-09 02:50:58264 // Cycle focus to the status area.
[email protected]eb5a0ab2012-10-20 00:50:25265 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
266 EXPECT_TRUE(tray()->GetWidget()->IsActive());
[email protected]057dc5752012-03-06 23:59:31267
[email protected]478c6c32013-03-09 02:50:58268 // Cycle focus to the browser.
[email protected]eb5a0ab2012-10-20 00:50:25269 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
[email protected]057dc5752012-03-06 23:59:31270 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
[email protected]fba1eb22014-03-12 21:12:50271
272 // Cycle focus to the status area.
273 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
274 EXPECT_TRUE(tray()->GetWidget()->IsActive());
[email protected]057dc5752012-03-06 23:59:31275}
276
[email protected]478c6c32013-03-09 02:50:58277TEST_F(FocusCyclerTest, Shelf_CycleFocusBackwardInvisible) {
[email protected]eb5a0ab2012-10-20 00:50:25278 ASSERT_TRUE(CreateTray());
[email protected]478c6c32013-03-09 02:50:58279 InstallFocusCycleOnShelf();
280 shelf_widget()->Hide();
[email protected]057dc5752012-03-06 23:59:31281
282 // Create a single test window.
dchenga94547472016-04-08 08:41:11283 std::unique_ptr<Window> window0(CreateTestWindowInShellWithId(0));
[email protected]057dc5752012-03-06 23:59:31284 wm::ActivateWindow(window0.get());
285 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
286
[email protected]478c6c32013-03-09 02:50:58287 // Cycle focus to the status area.
[email protected]eb5a0ab2012-10-20 00:50:25288 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
289 EXPECT_TRUE(tray()->GetWidget()->IsActive());
[email protected]057dc5752012-03-06 23:59:31290
[email protected]478c6c32013-03-09 02:50:58291 // Cycle focus to the browser.
[email protected]eb5a0ab2012-10-20 00:50:25292 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
[email protected]057dc5752012-03-06 23:59:31293 EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
294}
295
[email protected]242aa4f2013-04-30 01:04:08296TEST_F(FocusCyclerTest, CycleFocusThroughWindowWithPanes) {
297 ASSERT_TRUE(CreateTray());
298
299 InstallFocusCycleOnShelf();
300
dchenga94547472016-04-08 08:41:11301 std::unique_ptr<PanedWidgetDelegate> test_widget_delegate;
302 std::unique_ptr<views::Widget> browser_widget(new views::Widget);
[email protected]464a0012013-11-12 18:22:44303 test_widget_delegate.reset(new PanedWidgetDelegate(browser_widget.get()));
[email protected]242aa4f2013-04-30 01:04:08304 views::Widget::InitParams widget_params(
305 views::Widget::InitParams::TYPE_WINDOW);
306 widget_params.context = CurrentContext();
[email protected]464a0012013-11-12 18:22:44307 widget_params.delegate = test_widget_delegate.get();
[email protected]242aa4f2013-04-30 01:04:08308 widget_params.ownership =
309 views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
310 browser_widget->Init(widget_params);
311 browser_widget->Show();
312
313 aura::Window* browser_window = browser_widget->GetNativeView();
314
315 views::View* root_view = browser_widget->GetRootView();
316
317 views::AccessiblePaneView* pane1 = new views::AccessiblePaneView();
318 root_view->AddChildView(pane1);
319
320 views::View* view1 = new views::View;
karandeepbe7ad02a2016-04-27 23:57:22321 view1->SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
[email protected]242aa4f2013-04-30 01:04:08322 pane1->AddChildView(view1);
323
324 views::View* view2 = new views::View;
karandeepbe7ad02a2016-04-27 23:57:22325 view2->SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
[email protected]242aa4f2013-04-30 01:04:08326 pane1->AddChildView(view2);
327
328 views::AccessiblePaneView* pane2 = new views::AccessiblePaneView();
329 root_view->AddChildView(pane2);
330
331 views::View* view3 = new views::View;
karandeepbe7ad02a2016-04-27 23:57:22332 view3->SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
[email protected]242aa4f2013-04-30 01:04:08333 pane2->AddChildView(view3);
334
335 views::View* view4 = new views::View;
karandeepbe7ad02a2016-04-27 23:57:22336 view4->SetFocusBehavior(views::View::FocusBehavior::ALWAYS);
[email protected]242aa4f2013-04-30 01:04:08337 pane2->AddChildView(view4);
338
339 std::vector<views::View*> panes;
340 panes.push_back(pane1);
341 panes.push_back(pane2);
342
343 test_widget_delegate->SetAccessiblePanes(panes);
344
345 views::FocusManager* focus_manager = browser_widget->GetFocusManager();
346
347 // Cycle focus to the status area.
348 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
349 EXPECT_TRUE(tray()->GetWidget()->IsActive());
350
351 // Cycle focus to the shelf.
352 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
353 EXPECT_TRUE(shelf_widget()->IsActive());
354
355 // Cycle focus to the first pane in the browser.
356 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
357 EXPECT_TRUE(wm::IsActiveWindow(browser_window));
358 EXPECT_EQ(focus_manager->GetFocusedView(), view1);
359
360 // Cycle focus to the second pane in the browser.
361 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
362 EXPECT_TRUE(wm::IsActiveWindow(browser_window));
363 EXPECT_EQ(focus_manager->GetFocusedView(), view3);
364
365 // Cycle focus back to the status area.
366 focus_cycler()->RotateFocus(FocusCycler::FORWARD);
367 EXPECT_TRUE(tray()->GetWidget()->IsActive());
368
369 // Reverse direction - back to the second pane in the browser.
370 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
371 EXPECT_TRUE(wm::IsActiveWindow(browser_window));
372 EXPECT_EQ(focus_manager->GetFocusedView(), view3);
373
374 // Back to the first pane in the browser.
375 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
376 EXPECT_TRUE(wm::IsActiveWindow(browser_window));
377 EXPECT_EQ(focus_manager->GetFocusedView(), view1);
378
379 // Back to the shelf.
380 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
381 EXPECT_TRUE(shelf_widget()->IsActive());
382
383 // Back to the status area.
384 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
385 EXPECT_TRUE(tray()->GetWidget()->IsActive());
386
387 // Pressing "Escape" while on the status area should
388 // deactivate it, and activate the browser window.
[email protected]bf9cdb362013-10-25 19:22:45389 aura::Window* root = Shell::GetPrimaryRootWindow();
[email protected]73c9fd02014-07-28 01:48:52390 ui::test::EventGenerator event_generator(root, root);
[email protected]242aa4f2013-04-30 01:04:08391 event_generator.PressKey(ui::VKEY_ESCAPE, 0);
392 EXPECT_TRUE(wm::IsActiveWindow(browser_window));
393 EXPECT_EQ(focus_manager->GetFocusedView(), view1);
394
395 // Similarly, pressing "Escape" while on the shelf.
396 // should do the same thing.
397 focus_cycler()->RotateFocus(FocusCycler::BACKWARD);
398 EXPECT_TRUE(shelf_widget()->IsActive());
399 event_generator.PressKey(ui::VKEY_ESCAPE, 0);
400 EXPECT_TRUE(wm::IsActiveWindow(browser_window));
401 EXPECT_EQ(focus_manager->GetFocusedView(), view1);
402}
403
xdai063763f2015-09-29 00:09:07404// Test that when the shelf widget & status area widget are removed, they should
405// also be removed from focus cycler.
406TEST_F(FocusCyclerTest, RemoveWidgetOnDisplayRemoved) {
407 // Two displays are added, so two shelf widgets and two status area widgets
408 // are added to focus cycler.
409 UpdateDisplay("800x800, 500x500");
410 // Remove one display. Its shelf widget and status area widget should also be
411 // removed from focus cycler.
412 UpdateDisplay("800x800");
413
414 // Create a single test window.
dchenga94547472016-04-08 08:41:11415 std::unique_ptr<Window> window(CreateTestWindowInShellWithId(0));
xdai063763f2015-09-29 00:09:07416 wm::ActivateWindow(window.get());
417 EXPECT_TRUE(wm::IsActiveWindow(window.get()));
418
419 // Cycle focus to the status area.
420 Shell::GetInstance()->focus_cycler()->RotateFocus(FocusCycler::FORWARD);
421 EXPECT_FALSE(wm::IsActiveWindow(window.get()));
422
423 // Cycle focus to the shelf.
424 Shell::GetInstance()->focus_cycler()->RotateFocus(FocusCycler::FORWARD);
425
426 // Cycle focus should go back to the browser.
427 Shell::GetInstance()->focus_cycler()->RotateFocus(FocusCycler::FORWARD);
428 EXPECT_TRUE(wm::IsActiveWindow(window.get()));
429}
430
[email protected]df1c9862012-02-27 10:37:31431} // namespace test
432} // namespace ash