OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/wm/workspace/workspace_layout_manager.h" | 5 #include "ash/wm/workspace/workspace_layout_manager.h" |
6 | 6 |
7 #include "ash/shell.h" | 7 #include "ash/shell.h" |
8 #include "ash/test/ash_test_base.h" | 8 #include "ash/test/ash_test_base.h" |
9 #include "ash/wm/property_util.h" | 9 #include "ash/wm/property_util.h" |
10 #include "ash/wm/shelf_layout_manager.h" | 10 #include "ash/wm/shelf_layout_manager.h" |
11 #include "ash/wm/window_util.h" | 11 #include "ash/wm/window_util.h" |
| 12 #include "base/string_number_conversions.h" |
12 #include "ui/aura/root_window.h" | 13 #include "ui/aura/root_window.h" |
13 #include "ui/aura/test/test_windows.h" | 14 #include "ui/aura/test/test_windows.h" |
14 #include "ui/aura/window.h" | 15 #include "ui/aura/window.h" |
15 #include "ui/gfx/insets.h" | 16 #include "ui/gfx/insets.h" |
16 | 17 |
17 namespace ash { | 18 namespace ash { |
18 | 19 |
19 namespace { | 20 namespace { |
20 | 21 |
21 class WorkspaceLayoutManager2Test : public test::AshTestBase { | 22 class WorkspaceLayoutManager2Test : public test::AshTestBase { |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 // If the window is out of the workspace, it would be moved on screen. | 128 // If the window is out of the workspace, it would be moved on screen. |
128 gfx::Rect root_window_bounds = | 129 gfx::Rect root_window_bounds = |
129 ash::Shell::GetInstance()->GetPrimaryRootWindow()->bounds(); | 130 ash::Shell::GetInstance()->GetPrimaryRootWindow()->bounds(); |
130 window_bounds.Offset(root_window_bounds.width(), root_window_bounds.height()); | 131 window_bounds.Offset(root_window_bounds.width(), root_window_bounds.height()); |
131 ASSERT_FALSE(window_bounds.Intersects(root_window_bounds)); | 132 ASSERT_FALSE(window_bounds.Intersects(root_window_bounds)); |
132 scoped_ptr<aura::Window> out_window(CreateTestWindow(window_bounds)); | 133 scoped_ptr<aura::Window> out_window(CreateTestWindow(window_bounds)); |
133 EXPECT_EQ(window_bounds.size(), out_window->bounds().size()); | 134 EXPECT_EQ(window_bounds.size(), out_window->bounds().size()); |
134 EXPECT_TRUE(out_window->bounds().Intersects(root_window_bounds)); | 135 EXPECT_TRUE(out_window->bounds().Intersects(root_window_bounds)); |
135 } | 136 } |
136 | 137 |
| 138 // Test the basic auto placement of one and or two window. |
| 139 TEST_F(WorkspaceLayoutManager2Test, BasicAutoPlacing) { |
| 140 // Test 1: In case there is no manageable window, no window should shift. |
| 141 |
| 142 scoped_ptr<aura::Window> window1( |
| 143 aura::test::CreateTestWindowWithId(0, NULL)); |
| 144 window1->SetBounds(gfx::Rect(16, 32, 640, 320)); |
| 145 gfx::Rect desktop_area = window1->parent()->bounds(); |
| 146 |
| 147 scoped_ptr<aura::Window> window2( |
| 148 aura::test::CreateTestWindowWithId(1, NULL)); |
| 149 // Note: we need to perform an activation change to trigger the update. |
| 150 // As such we initially hide the window and then showing it again. |
| 151 window2->Hide(); |
| 152 window2->SetBounds(gfx::Rect(32, 48, 256, 512)); |
| 153 window2->Show(); |
| 154 |
| 155 // Check the initial position of the windows is unchanged. |
| 156 EXPECT_EQ("16,32 640x320", window1->bounds().ToString()); |
| 157 EXPECT_EQ("32,48 256x512", window2->bounds().ToString()); |
| 158 |
| 159 // Remove the second window and make sure that the first window |
| 160 // does NOT get centered. |
| 161 window2.reset(); |
| 162 EXPECT_EQ("16,32 640x320", window1->bounds().ToString()); |
| 163 |
| 164 // Test 2: Set up two managed windows and check their auto positioning. |
| 165 ash::wm::SetWindowPositionManaged(window1.get(), true); |
| 166 scoped_ptr<aura::Window> window3( |
| 167 aura::test::CreateTestWindowWithId(2, NULL)); |
| 168 ash::wm::SetWindowPositionManaged(window3.get(), true); |
| 169 // Note: we need to perform an activation change to trigger the update. |
| 170 // As such we initially hide the window and then showing it again. |
| 171 window3->Hide(); |
| 172 window3->SetBounds(gfx::Rect(32, 48, 256, 512)); |
| 173 window3->Show(); |
| 174 // |window1| should be flush right and |window3| flush left. |
| 175 EXPECT_EQ(base::IntToString( |
| 176 desktop_area.width() - window1->bounds().width()) + |
| 177 ",32 640x320", window1->bounds().ToString()); |
| 178 EXPECT_EQ("0,48 256x512", window3->bounds().ToString()); |
| 179 |
| 180 // After removing |window3|, |window1| should be centered again. |
| 181 window3.reset(); |
| 182 EXPECT_EQ( |
| 183 base::IntToString( |
| 184 (desktop_area.width() - window1->bounds().width()) / 2) + |
| 185 ",32 640x320", window1->bounds().ToString()); |
| 186 |
| 187 // Test 3: Set up a manageable and a non manageable window and check |
| 188 // positioning. |
| 189 scoped_ptr<aura::Window> window4( |
| 190 aura::test::CreateTestWindowWithId(3, NULL)); |
| 191 // Note: we need to perform an activation change to trigger the update. |
| 192 // As such we initially hide the window and then showing it again. |
| 193 window1->Hide(); |
| 194 window1->SetBounds(gfx::Rect(16, 32, 640, 320)); |
| 195 window4->SetBounds(gfx::Rect(32, 48, 256, 512)); |
| 196 window1->Show(); |
| 197 // |window1| should be centered and |window4| untouched. |
| 198 EXPECT_EQ( |
| 199 base::IntToString( |
| 200 (desktop_area.width() - window1->bounds().width()) / 2) + |
| 201 ",32 640x320", window1->bounds().ToString()); |
| 202 EXPECT_EQ("32,48 256x512", window4->bounds().ToString()); |
| 203 |
| 204 // Test 4: Once a window gets moved by a user it does not get repositioned. |
| 205 ash::wm::SetUserHasChangedWindowPositionOrSize(window1.get(), true); |
| 206 window1->SetBounds(gfx::Rect(52, 32, 640, 320)); |
| 207 // Note: we need to perform an activation change to trigger the update. |
| 208 // As such we initially hide the window and then showing it again. |
| 209 window4->Hide(); |
| 210 window4->Show(); |
| 211 EXPECT_EQ("52,32 640x320", window1->bounds().ToString()); |
| 212 EXPECT_EQ("32,48 256x512", window4->bounds().ToString()); |
| 213 |
| 214 // Test5: A single manageable window should get centered. |
| 215 window4.reset(); |
| 216 ash::wm::SetUserHasChangedWindowPositionOrSize(window1.get(), false); |
| 217 window1->Hide(); |
| 218 window1->Show(); |
| 219 // |window1| should be centered. |
| 220 EXPECT_EQ( |
| 221 base::IntToString( |
| 222 (desktop_area.width() - window1->bounds().width()) / 2) + |
| 223 ",32 640x320", window1->bounds().ToString()); |
| 224 } |
| 225 |
| 226 // Test that a window from normal to minimize will repos the remaining. |
| 227 TEST_F(WorkspaceLayoutManager2Test, ToMinimizeRepositionsRemaining) { |
| 228 scoped_ptr<aura::Window> window1( |
| 229 aura::test::CreateTestWindowWithId(0, NULL)); |
| 230 ash::wm::SetWindowPositionManaged(window1.get(), true); |
| 231 window1->SetBounds(gfx::Rect(16, 32, 640, 320)); |
| 232 gfx::Rect desktop_area = window1->parent()->bounds(); |
| 233 |
| 234 scoped_ptr<aura::Window> window2( |
| 235 aura::test::CreateTestWindowWithId(1, NULL)); |
| 236 ash::wm::SetWindowPositionManaged(window2.get(), true); |
| 237 window2->SetBounds(gfx::Rect(32, 48, 256, 512)); |
| 238 |
| 239 ash::wm::MinimizeWindow(window1.get()); |
| 240 |
| 241 // |window2| should be centered now. |
| 242 EXPECT_TRUE(window2->IsVisible()); |
| 243 EXPECT_TRUE(ash::wm::IsWindowNormal(window2.get())); |
| 244 EXPECT_EQ(base::IntToString( |
| 245 (desktop_area.width() - window2->bounds().width()) / 2) + |
| 246 ",48 256x512", window2->bounds().ToString()); |
| 247 |
| 248 ash::wm::RestoreWindow(window1.get()); |
| 249 // |window1| should be flush right and |window3| flush left. |
| 250 EXPECT_EQ(base::IntToString( |
| 251 desktop_area.width() - window1->bounds().width()) + |
| 252 ",32 640x320", window1->bounds().ToString()); |
| 253 EXPECT_EQ("0,48 256x512", window2->bounds().ToString()); |
| 254 } |
| 255 |
| 256 // Test that minimizing an initially maximized window will repos the remaining. |
| 257 TEST_F(WorkspaceLayoutManager2Test, MaxToMinRepositionsRemaining) { |
| 258 scoped_ptr<aura::Window> window1( |
| 259 aura::test::CreateTestWindowWithId(0, NULL)); |
| 260 ash::wm::SetWindowPositionManaged(window1.get(), true); |
| 261 gfx::Rect desktop_area = window1->parent()->bounds(); |
| 262 |
| 263 scoped_ptr<aura::Window> window2( |
| 264 aura::test::CreateTestWindowWithId(1, NULL)); |
| 265 ash::wm::SetWindowPositionManaged(window2.get(), true); |
| 266 window2->SetBounds(gfx::Rect(32, 48, 256, 512)); |
| 267 |
| 268 ash::wm::MaximizeWindow(window1.get()); |
| 269 ash::wm::MinimizeWindow(window1.get()); |
| 270 |
| 271 // |window2| should be centered now. |
| 272 EXPECT_TRUE(window2->IsVisible()); |
| 273 EXPECT_TRUE(ash::wm::IsWindowNormal(window2.get())); |
| 274 EXPECT_EQ(base::IntToString( |
| 275 (desktop_area.width() - window2->bounds().width()) / 2) + |
| 276 ",48 256x512", window2->bounds().ToString()); |
| 277 } |
| 278 |
| 279 // Test that nomral, maximize, minimizing will repos the remaining. |
| 280 TEST_F(WorkspaceLayoutManager2Test, NormToMaxToMinRepositionsRemaining) { |
| 281 scoped_ptr<aura::Window> window1( |
| 282 aura::test::CreateTestWindowWithId(0, NULL)); |
| 283 window1->SetBounds(gfx::Rect(16, 32, 640, 320)); |
| 284 ash::wm::SetWindowPositionManaged(window1.get(), true); |
| 285 gfx::Rect desktop_area = window1->parent()->bounds(); |
| 286 |
| 287 scoped_ptr<aura::Window> window2( |
| 288 aura::test::CreateTestWindowWithId(1, NULL)); |
| 289 ash::wm::SetWindowPositionManaged(window2.get(), true); |
| 290 window2->SetBounds(gfx::Rect(32, 48, 256, 512)); |
| 291 |
| 292 window1->Hide(); |
| 293 window1->Show(); |
| 294 |
| 295 // |window1| should be flush right and |window3| flush left. |
| 296 EXPECT_EQ(base::IntToString( |
| 297 desktop_area.width() - window1->bounds().width()) + |
| 298 ",32 640x320", window1->bounds().ToString()); |
| 299 EXPECT_EQ("0,48 256x512", window2->bounds().ToString()); |
| 300 |
| 301 ash::wm::MaximizeWindow(window1.get()); |
| 302 ash::wm::MinimizeWindow(window1.get()); |
| 303 |
| 304 // |window2| should be centered now. |
| 305 EXPECT_TRUE(window2->IsVisible()); |
| 306 EXPECT_TRUE(ash::wm::IsWindowNormal(window2.get())); |
| 307 EXPECT_EQ(base::IntToString( |
| 308 (desktop_area.width() - window2->bounds().width()) / 2) + |
| 309 ",48 256x512", window2->bounds().ToString()); |
| 310 } |
| 311 |
| 312 // Test that nomral, maximize, normal will repos the remaining. |
| 313 TEST_F(WorkspaceLayoutManager2Test, NormToMaxToNormRepositionsRemaining) { |
| 314 scoped_ptr<aura::Window> window1( |
| 315 aura::test::CreateTestWindowWithId(0, NULL)); |
| 316 window1->SetBounds(gfx::Rect(16, 32, 640, 320)); |
| 317 ash::wm::SetWindowPositionManaged(window1.get(), true); |
| 318 gfx::Rect desktop_area = window1->parent()->bounds(); |
| 319 |
| 320 scoped_ptr<aura::Window> window2( |
| 321 aura::test::CreateTestWindowWithId(1, NULL)); |
| 322 ash::wm::SetWindowPositionManaged(window2.get(), true); |
| 323 window2->SetBounds(gfx::Rect(32, 48, 256, 512)); |
| 324 |
| 325 window1->Hide(); |
| 326 window1->Show(); |
| 327 |
| 328 // |window1| should be flush right and |window3| flush left. |
| 329 EXPECT_EQ(base::IntToString( |
| 330 desktop_area.width() - window1->bounds().width()) + |
| 331 ",32 640x320", window1->bounds().ToString()); |
| 332 EXPECT_EQ("0,48 256x512", window2->bounds().ToString()); |
| 333 |
| 334 ash::wm::MaximizeWindow(window1.get()); |
| 335 ash::wm::RestoreWindow(window1.get()); |
| 336 |
| 337 // |window1| should be flush right and |window2| flush left. |
| 338 EXPECT_EQ(base::IntToString( |
| 339 desktop_area.width() - window1->bounds().width()) + |
| 340 ",32 640x320", window1->bounds().ToString()); |
| 341 EXPECT_EQ("0,48 256x512", window2->bounds().ToString()); |
| 342 } |
| 343 |
| 344 |
137 } // namespace | 345 } // namespace |
138 | |
139 } // namespace ash | 346 } // namespace ash |
OLD | NEW |