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/wm/split_view_controller.h"
7 #include "athena/screen/public/screen_manager.h"
8 #include "athena/test/athena_test_base.h"
9 #include "athena/wm/public/window_list_provider.h"
10 #include "athena/wm/test/window_manager_impl_test_api.h"
11 #include "base/memory/scoped_vector.h"
12 #include "ui/aura/test/test_window_delegate.h"
13 #include "ui/aura/window.h"
14 #include "ui/gfx/display.h"
15 #include "ui/gfx/screen.h"
16 #include "ui/wm/core/window_util.h"
20 class SplitViewControllerTest : public test::AthenaTestBase {
22 SplitViewControllerTest() {}
23 virtual ~SplitViewControllerTest() {}
25 // test::AthenaTestBase:
26 virtual void SetUp() OVERRIDE {
27 test::AthenaTestBase::SetUp();
28 api_.reset(new test::WindowManagerImplTestApi);
31 virtual void TearDown() OVERRIDE {
33 test::AthenaTestBase::TearDown();
36 // Returns the topmost window in z-order.
37 const aura::Window* GetTopmostWindow() const {
38 return *api_->GetWindowListProvider()->GetWindowList().rbegin();
41 // Returns the second topmost window in z-order.
42 const aura::Window* GetSecondTopmostWindow() const {
43 const aura::Window::Windows& list =
44 api_->GetWindowListProvider()->GetWindowList();
45 return *(list.rbegin() + 1);
48 // Returns whether only the split view windows are visible.
49 bool OnlySplitViewWindowsVisible() const {
50 SplitViewController* controller = api_->GetSplitViewController();
51 DCHECK(controller->IsSplitViewModeActive());
52 aura::Window::Windows list =
53 api_->GetWindowListProvider()->GetWindowList();
54 for (aura::Window::Windows::const_iterator it = list.begin();
55 it != list.end(); ++it) {
56 bool in_split_view = (*it == controller->left_window() ||
57 *it == controller->right_window());
58 if (in_split_view != (*it)->IsVisible())
64 bool IsSplitViewAllowed() const {
65 return api_->GetSplitViewController()->CanActivateSplitViewMode();
68 test::WindowManagerImplTestApi* api() {
73 scoped_ptr<test::WindowManagerImplTestApi> api_;
75 DISALLOW_COPY_AND_ASSIGN(SplitViewControllerTest);
78 // Tests that when split mode is activated, the windows on the left and right
79 // are selected correctly.
80 TEST_F(SplitViewControllerTest, SplitModeActivation) {
81 aura::test::TestWindowDelegate delegate;
82 ScopedVector<aura::Window> windows;
83 const int kNumWindows = 6;
84 for (size_t i = 0; i < kNumWindows; ++i) {
85 scoped_ptr<aura::Window> window = CreateTestWindow(NULL, gfx::Rect());
86 windows.push_back(window.release());
90 windows[kNumWindows - 1]->Show();
91 wm::ActivateWindow(windows[kNumWindows - 1]);
93 SplitViewController* controller = api()->GetSplitViewController();
94 ASSERT_FALSE(controller->IsSplitViewModeActive());
96 controller->ActivateSplitMode(NULL, NULL, NULL);
97 ASSERT_TRUE(controller->IsSplitViewModeActive());
98 // The last two windows should be on the left and right, respectively.
99 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window());
100 EXPECT_EQ(windows[kNumWindows - 2], controller->right_window());
101 EXPECT_EQ(windows[kNumWindows - 1], GetTopmostWindow());
102 EXPECT_EQ(windows[kNumWindows - 2], GetSecondTopmostWindow());
103 EXPECT_TRUE(OnlySplitViewWindowsVisible());
105 // Select the window that is currently on the left for the right panel. The
106 // windows should switch.
107 controller->ActivateSplitMode(
108 NULL, windows[kNumWindows - 1], windows[kNumWindows - 1]);
109 EXPECT_EQ(windows[kNumWindows - 2], controller->left_window());
110 EXPECT_EQ(windows[kNumWindows - 1], controller->right_window());
111 EXPECT_EQ(windows[kNumWindows - 1], GetTopmostWindow());
112 EXPECT_EQ(windows[kNumWindows - 2], GetSecondTopmostWindow());
113 EXPECT_TRUE(OnlySplitViewWindowsVisible());
115 controller->ActivateSplitMode(
116 windows[kNumWindows - 1], NULL, windows[kNumWindows - 1]);
117 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window());
118 EXPECT_EQ(windows[kNumWindows - 2], controller->right_window());
119 EXPECT_EQ(windows[kNumWindows - 1], GetTopmostWindow());
120 EXPECT_EQ(windows[kNumWindows - 2], GetSecondTopmostWindow());
121 EXPECT_TRUE(OnlySplitViewWindowsVisible());
123 // Select the same windows, but pass in a different window to activate.
124 controller->ActivateSplitMode(windows[kNumWindows - 1],
125 windows[kNumWindows - 2],
126 windows[kNumWindows - 2]);
127 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window());
128 EXPECT_EQ(windows[kNumWindows - 2], controller->right_window());
129 EXPECT_EQ(windows[kNumWindows - 2], GetTopmostWindow());
130 EXPECT_EQ(windows[kNumWindows - 1], GetSecondTopmostWindow());
131 EXPECT_TRUE(OnlySplitViewWindowsVisible());
133 // Select one of the windows behind the stacks for the right panel. The window
134 // on the left should remain unchanged.
135 controller->ActivateSplitMode(NULL, windows[0], windows[0]);
136 EXPECT_EQ(windows[kNumWindows - 1], controller->left_window());
137 EXPECT_EQ(windows[0], controller->right_window());
138 EXPECT_EQ(windows[0], GetTopmostWindow());
139 EXPECT_EQ(windows[kNumWindows - 1], GetSecondTopmostWindow());
140 EXPECT_TRUE(OnlySplitViewWindowsVisible());
142 controller->ActivateSplitMode(windows[1], NULL, NULL);
143 EXPECT_EQ(windows[1], controller->left_window());
144 EXPECT_EQ(windows[0], controller->right_window());
145 EXPECT_EQ(windows[0], GetTopmostWindow());
146 EXPECT_EQ(windows[1], GetSecondTopmostWindow());
147 EXPECT_TRUE(OnlySplitViewWindowsVisible());
149 controller->ActivateSplitMode(windows[4], windows[5], windows[5]);
150 EXPECT_EQ(windows[4], controller->left_window());
151 EXPECT_EQ(windows[5], controller->right_window());
152 EXPECT_EQ(windows[5], GetTopmostWindow());
153 EXPECT_EQ(windows[4], GetSecondTopmostWindow());
154 EXPECT_TRUE(OnlySplitViewWindowsVisible());
156 controller->ActivateSplitMode(windows[0], NULL, windows[0]);
157 EXPECT_EQ(windows[0], controller->left_window());
158 EXPECT_EQ(windows[5], controller->right_window());
159 EXPECT_EQ(windows[0], GetTopmostWindow());
160 EXPECT_EQ(windows[5], GetSecondTopmostWindow());
161 EXPECT_TRUE(OnlySplitViewWindowsVisible());
164 TEST_F(SplitViewControllerTest, LandscapeOnly) {
165 aura::test::TestWindowDelegate delegate;
166 ScopedVector<aura::Window> windows;
167 const int kNumWindows = 2;
168 for (size_t i = 0; i < kNumWindows; ++i) {
169 scoped_ptr<aura::Window> window = CreateTestWindow(NULL, gfx::Rect());
171 windows.push_back(window.release());
173 windows[kNumWindows - 1]->Show();
174 wm::ActivateWindow(windows[kNumWindows - 1]);
176 ASSERT_EQ(gfx::Display::ROTATE_0,
177 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().rotation());
179 SplitViewController* controller = api()->GetSplitViewController();
180 ASSERT_TRUE(IsSplitViewAllowed());
181 ASSERT_FALSE(controller->IsSplitViewModeActive());
183 controller->ActivateSplitMode(NULL, NULL, NULL);
184 ASSERT_TRUE(controller->IsSplitViewModeActive());
186 // Screen rotation should be locked while in splitview.
187 ScreenManager::Get()->SetRotation(gfx::Display::ROTATE_90);
188 EXPECT_EQ(gfx::Display::ROTATE_0,
189 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().rotation());
191 // Screen is rotated on exiting splitview.
192 controller->DeactivateSplitMode();
193 ASSERT_EQ(gfx::Display::ROTATE_90,
194 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().rotation());
196 // Entering splitview should now be disabled now that the screen is in a
197 // portrait orientation.
198 EXPECT_FALSE(IsSplitViewAllowed());
200 // Rotating back to 0 allows splitview again.
201 ScreenManager::Get()->SetRotation(gfx::Display::ROTATE_0);
202 EXPECT_TRUE(IsSplitViewAllowed());
205 } // namespace athena