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.
4
5#include "ash/system/overview/overview_button_tray.h"
6
7#include "ash/display/display_manager.h"
8#include "ash/root_window_controller.h"
9#include "ash/shelf/shelf_types.h"
10#include "ash/shelf/shelf_widget.h"
11#include "ash/shell.h"
12#include "ash/system/status_area_widget.h"
13#include "ash/system/user/login_status.h"
14#include "ash/test/ash_test_base.h"
15#include "ash/test/status_area_widget_test_helper.h"
16#include "ash/wm/maximize_mode/maximize_mode_controller.h"
17#include "ash/wm/overview/window_selector_controller.h"
18#include "base/time/time.h"
19#include "ui/events/event.h"
20#include "ui/events/event_constants.h"
21#include "ui/events/gestures/gesture_types.h"
22#include "ui/views/controls/image_view.h"
23
24namespace ash {
25
26namespace {
27
28OverviewButtonTray* GetTray() {
29  return StatusAreaWidgetTestHelper::GetStatusAreaWidget()->
30      overview_button_tray();
31}
32
33OverviewButtonTray* GetSecondaryTray() {
34  return StatusAreaWidgetTestHelper::GetSecondaryStatusAreaWidget()->
35      overview_button_tray();
36}
37
38}  // namespace
39
40class OverviewButtonTrayTest : public test::AshTestBase {
41 public:
42  OverviewButtonTrayTest() {}
43  virtual ~OverviewButtonTrayTest() {}
44
45 protected:
46  views::ImageView* GetImageView(OverviewButtonTray* tray) {
47    return tray->icon_;
48  }
49
50 private:
51  DISALLOW_COPY_AND_ASSIGN(OverviewButtonTrayTest);
52};
53
54// Ensures that creation doesn't cause any crashes and adds the image icon.
55TEST_F(OverviewButtonTrayTest, BasicConstruction) {
56  EXPECT_TRUE(GetImageView(GetTray()) != NULL);
57}
58
59// Test that maximize mode toggle changes visibility.
60// OverviewButtonTray should only be visible when MaximizeMode is enabled.
61// By default the system should not have MaximizeMode enabled.
62TEST_F(OverviewButtonTrayTest, MaximizeModeObserverOnMaximizeModeToggled) {
63  ASSERT_FALSE(GetTray()->visible());
64  Shell::GetInstance()->maximize_mode_controller()->
65      EnableMaximizeModeWindowManager(true);
66  EXPECT_TRUE(GetTray()->visible());
67
68  Shell::GetInstance()->maximize_mode_controller()->
69      EnableMaximizeModeWindowManager(false);
70  EXPECT_FALSE(GetTray()->visible());
71}
72
73// Tests that activating this control brings up window selection mode.
74TEST_F(OverviewButtonTrayTest, PerformAction) {
75  ASSERT_FALSE(Shell::GetInstance()->window_selector_controller()->
76      IsSelecting());
77
78  // Overview Mode only works when there is a window
79  scoped_ptr<aura::Window> window(
80      CreateTestWindowInShellWithBounds(gfx::Rect(5, 5, 20, 20)));
81  ui::GestureEvent tap(
82      0, 0, 0, base::TimeDelta(), ui::GestureEventDetails(ui::ET_GESTURE_TAP));
83  GetTray()->PerformAction(tap);
84  EXPECT_TRUE(Shell::GetInstance()->window_selector_controller()->
85      IsSelecting());
86}
87
88// Tests that a second OverviewButtonTray has been created, and only shows
89// when MaximizeMode has been enabled,  when we are using multiple displays.
90// By default the DisplayManger is in extended mode.
91TEST_F(OverviewButtonTrayTest, DisplaysOnBothDisplays) {
92  if (!SupportsMultipleDisplays())
93    return;
94
95  UpdateDisplay("400x400,200x200");
96  EXPECT_FALSE(GetTray()->visible());
97  EXPECT_FALSE(GetSecondaryTray()->visible());
98  Shell::GetInstance()->maximize_mode_controller()->
99      EnableMaximizeModeWindowManager(true);
100  EXPECT_TRUE(GetTray()->visible());
101  EXPECT_TRUE(GetSecondaryTray()->visible());
102  Shell::GetInstance()->maximize_mode_controller()->
103      EnableMaximizeModeWindowManager(false);
104}
105
106// Tests if Maximize Mode is enabled before a secondary display is attached
107// that the second OverviewButtonTray should be created in a visible state.
108TEST_F(OverviewButtonTrayTest, SecondaryTrayCreatedVisible) {
109  if (!SupportsMultipleDisplays())
110    return;
111
112  Shell::GetInstance()->maximize_mode_controller()->
113      EnableMaximizeModeWindowManager(true);
114  UpdateDisplay("400x400,200x200");
115  EXPECT_TRUE(GetSecondaryTray()->visible());
116  Shell::GetInstance()->maximize_mode_controller()->
117      EnableMaximizeModeWindowManager(false);
118}
119
120// Tests that the tray loses visibility when a user logs out, and that it
121// regains visibility when a user logs back in.
122TEST_F(OverviewButtonTrayTest, VisibilityChangesForLoginStatus) {
123  Shell::GetInstance()->maximize_mode_controller()->
124      EnableMaximizeModeWindowManager(true);
125  SetUserLoggedIn(false);
126  Shell::GetInstance()->UpdateAfterLoginStatusChange(user::LOGGED_IN_NONE);
127  EXPECT_FALSE(GetTray()->visible());
128  SetUserLoggedIn(true);
129  SetSessionStarted(true);
130  Shell::GetInstance()->UpdateAfterLoginStatusChange(user::LOGGED_IN_USER);
131  EXPECT_TRUE(GetTray()->visible());
132  Shell::GetInstance()->maximize_mode_controller()->
133      EnableMaximizeModeWindowManager(false);
134}
135
136}  // namespace ash
137