• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
24 namespace ash {
25 
26 namespace {
27 
GetTray()28 OverviewButtonTray* GetTray() {
29   return StatusAreaWidgetTestHelper::GetStatusAreaWidget()->
30       overview_button_tray();
31 }
32 
GetSecondaryTray()33 OverviewButtonTray* GetSecondaryTray() {
34   return StatusAreaWidgetTestHelper::GetSecondaryStatusAreaWidget()->
35       overview_button_tray();
36 }
37 
38 }  // namespace
39 
40 class OverviewButtonTrayTest : public test::AshTestBase {
41  public:
OverviewButtonTrayTest()42   OverviewButtonTrayTest() {}
~OverviewButtonTrayTest()43   virtual ~OverviewButtonTrayTest() {}
44 
45  protected:
GetImageView(OverviewButtonTray * tray)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.
TEST_F(OverviewButtonTrayTest,BasicConstruction)55 TEST_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.
TEST_F(OverviewButtonTrayTest,MaximizeModeObserverOnMaximizeModeToggled)62 TEST_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.
TEST_F(OverviewButtonTrayTest,PerformAction)74 TEST_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.
TEST_F(OverviewButtonTrayTest,DisplaysOnBothDisplays)91 TEST_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.
TEST_F(OverviewButtonTrayTest,SecondaryTrayCreatedVisible)108 TEST_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.
TEST_F(OverviewButtonTrayTest,VisibilityChangesForLoginStatus)122 TEST_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