1 // Copyright (c) 2013 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 "chrome/browser/ui/browser.h" 6 #include "chrome/browser/ui/panels/base_panel_browser_test.h" 7 #include "chrome/browser/ui/panels/detached_panel_collection.h" 8 #include "chrome/browser/ui/panels/docked_panel_collection.h" 9 #include "chrome/browser/ui/panels/native_panel.h" 10 #include "chrome/browser/ui/panels/panel.h" 11 #include "chrome/browser/ui/panels/panel_manager.h" 12 #include "chrome/browser/ui/panels/stacked_panel_collection.h" 13 #include "chrome/browser/web_applications/web_app.h" 14 #include "chrome/test/base/testing_profile.h" 15 #include "content/public/test/test_utils.h" 16 17 class StackedPanelBrowserTest : public BasePanelBrowserTest { 18 }; 19 20 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, CheckStackedPanelProperties) { 21 PanelManager* panel_manager = PanelManager::GetInstance(); 22 23 // Create 2 stacked panels. 24 StackedPanelCollection* stack = panel_manager->CreateStack(); 25 gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150); 26 Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack); 27 gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100); 28 Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack); 29 gfx::Rect panel3_initial_bounds = gfx::Rect(0, 0, 120, 110); 30 Panel* panel3 = CreateStackedPanel("3", panel3_initial_bounds, stack); 31 32 scoped_ptr<NativePanelTesting> panel1_testing( 33 CreateNativePanelTesting(panel1)); 34 scoped_ptr<NativePanelTesting> panel2_testing( 35 CreateNativePanelTesting(panel2)); 36 scoped_ptr<NativePanelTesting> panel3_testing( 37 CreateNativePanelTesting(panel3)); 38 39 // Check that all 3 panels are in a stack. 40 ASSERT_EQ(0, panel_manager->docked_collection()->num_panels()); 41 ASSERT_EQ(0, panel_manager->detached_collection()->num_panels()); 42 ASSERT_EQ(1, panel_manager->num_stacks()); 43 ASSERT_EQ(3, stack->num_panels()); 44 EXPECT_EQ(stack, panel1->stack()); 45 EXPECT_EQ(stack, panel2->stack()); 46 EXPECT_EQ(stack, panel3->stack()); 47 48 // Check buttons. 49 EXPECT_TRUE(panel1_testing->IsButtonVisible(panel::CLOSE_BUTTON)); 50 EXPECT_TRUE(panel2_testing->IsButtonVisible(panel::CLOSE_BUTTON)); 51 EXPECT_TRUE(panel3_testing->IsButtonVisible(panel::CLOSE_BUTTON)); 52 53 if (PanelManager::CanUseSystemMinimize()) 54 EXPECT_TRUE(panel1_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 55 else 56 EXPECT_FALSE(panel1_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 57 EXPECT_FALSE(panel2_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 58 EXPECT_FALSE(panel3_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 59 60 EXPECT_FALSE(panel1_testing->IsButtonVisible(panel::RESTORE_BUTTON)); 61 EXPECT_FALSE(panel2_testing->IsButtonVisible(panel::RESTORE_BUTTON)); 62 EXPECT_FALSE(panel3_testing->IsButtonVisible(panel::RESTORE_BUTTON)); 63 64 // Check bounds. 65 gfx::Rect panel1_expected_bounds(panel1_initial_bounds); 66 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 67 gfx::Rect panel2_expected_bounds(panel1_expected_bounds.x(), 68 panel1_expected_bounds.bottom(), 69 panel1_expected_bounds.width(), 70 panel2_initial_bounds.height()); 71 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 72 gfx::Rect panel3_expected_bounds(panel2_expected_bounds.x(), 73 panel2_expected_bounds.bottom(), 74 panel2_expected_bounds.width(), 75 panel3_initial_bounds.height()); 76 EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds()); 77 78 // Check other properties. 79 EXPECT_FALSE(panel1->IsAlwaysOnTop()); 80 EXPECT_FALSE(panel2->IsAlwaysOnTop()); 81 EXPECT_FALSE(panel3->IsAlwaysOnTop()); 82 83 EXPECT_FALSE(panel1->IsMinimized()); 84 EXPECT_FALSE(panel2->IsMinimized()); 85 EXPECT_FALSE(panel3->IsMinimized()); 86 87 EXPECT_EQ(panel::RESIZABLE_LEFT | panel::RESIZABLE_RIGHT | 88 panel::RESIZABLE_TOP | panel::RESIZABLE_TOP_LEFT | 89 panel::RESIZABLE_TOP_RIGHT | panel::RESIZABLE_BOTTOM, 90 panel1->CanResizeByMouse()); 91 EXPECT_EQ(panel::RESIZABLE_LEFT | panel::RESIZABLE_RIGHT | 92 panel::RESIZABLE_BOTTOM, 93 panel2->CanResizeByMouse()); 94 EXPECT_EQ(panel::RESIZABLE_LEFT | panel::RESIZABLE_RIGHT | 95 panel::RESIZABLE_BOTTOM | panel::RESIZABLE_BOTTOM_LEFT | 96 panel::RESIZABLE_BOTTOM_RIGHT, 97 panel3->CanResizeByMouse()); 98 99 EXPECT_EQ(panel::TOP_ROUNDED, panel1_testing->GetWindowCornerStyle()); 100 EXPECT_EQ(panel::NOT_ROUNDED, panel2_testing->GetWindowCornerStyle()); 101 EXPECT_EQ(panel::BOTTOM_ROUNDED, panel3_testing->GetWindowCornerStyle()); 102 103 Panel::AttentionMode expected_attention_mode = 104 static_cast<Panel::AttentionMode>(Panel::USE_PANEL_ATTENTION | 105 Panel::USE_SYSTEM_ATTENTION); 106 EXPECT_EQ(expected_attention_mode, panel1->attention_mode()); 107 EXPECT_EQ(expected_attention_mode, panel2->attention_mode()); 108 EXPECT_EQ(expected_attention_mode, panel3->attention_mode()); 109 110 panel_manager->CloseAll(); 111 } 112 113 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 114 CheckMinimizedStackedPanelProperties) { 115 PanelManager* panel_manager = PanelManager::GetInstance(); 116 117 // Create 2 stacked panels. 118 StackedPanelCollection* stack = panel_manager->CreateStack(); 119 gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150); 120 Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack); 121 gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100); 122 Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack); 123 gfx::Rect panel3_initial_bounds = gfx::Rect(0, 0, 120, 110); 124 Panel* panel3 = CreateStackedPanel("3", panel3_initial_bounds, stack); 125 126 scoped_ptr<NativePanelTesting> panel1_testing( 127 CreateNativePanelTesting(panel1)); 128 scoped_ptr<NativePanelTesting> panel2_testing( 129 CreateNativePanelTesting(panel2)); 130 scoped_ptr<NativePanelTesting> panel3_testing( 131 CreateNativePanelTesting(panel3)); 132 133 // Minimize these 2 panels. 134 panel1->Minimize(); 135 WaitForBoundsAnimationFinished(panel1); 136 panel2->Minimize(); 137 WaitForBoundsAnimationFinished(panel2); 138 panel3->Minimize(); 139 WaitForBoundsAnimationFinished(panel3); 140 141 // Check that all 2 panels are in a stack. 142 ASSERT_EQ(0, panel_manager->docked_collection()->num_panels()); 143 ASSERT_EQ(0, panel_manager->detached_collection()->num_panels()); 144 ASSERT_EQ(1, panel_manager->num_stacks()); 145 ASSERT_EQ(3, stack->num_panels()); 146 EXPECT_EQ(stack, panel1->stack()); 147 EXPECT_EQ(stack, panel2->stack()); 148 EXPECT_EQ(stack, panel3->stack()); 149 150 // Check buttons. 151 EXPECT_TRUE(panel1_testing->IsButtonVisible(panel::CLOSE_BUTTON)); 152 EXPECT_TRUE(panel2_testing->IsButtonVisible(panel::CLOSE_BUTTON)); 153 EXPECT_TRUE(panel3_testing->IsButtonVisible(panel::CLOSE_BUTTON)); 154 155 if (PanelManager::CanUseSystemMinimize()) 156 EXPECT_TRUE(panel1_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 157 else 158 EXPECT_FALSE(panel1_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 159 EXPECT_FALSE(panel2_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 160 EXPECT_FALSE(panel3_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 161 162 EXPECT_FALSE(panel1_testing->IsButtonVisible(panel::RESTORE_BUTTON)); 163 EXPECT_FALSE(panel2_testing->IsButtonVisible(panel::RESTORE_BUTTON)); 164 EXPECT_FALSE(panel3_testing->IsButtonVisible(panel::RESTORE_BUTTON)); 165 166 // Check bounds. 167 gfx::Rect panel1_expected_bounds(panel1_initial_bounds); 168 panel1_expected_bounds.set_height(panel1->TitleOnlyHeight()); 169 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 170 gfx::Rect panel2_expected_bounds(panel1_expected_bounds.x(), 171 panel1_expected_bounds.bottom(), 172 panel1_expected_bounds.width(), 173 panel2->TitleOnlyHeight()); 174 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 175 gfx::Rect panel3_expected_bounds(panel2_expected_bounds.x(), 176 panel2_expected_bounds.bottom(), 177 panel2_expected_bounds.width(), 178 panel3->TitleOnlyHeight()); 179 EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds()); 180 181 // Check other properties. 182 EXPECT_FALSE(panel1->IsAlwaysOnTop()); 183 EXPECT_FALSE(panel2->IsAlwaysOnTop()); 184 EXPECT_FALSE(panel3->IsAlwaysOnTop()); 185 186 EXPECT_TRUE(panel1->IsMinimized()); 187 EXPECT_TRUE(panel2->IsMinimized()); 188 EXPECT_TRUE(panel3->IsMinimized()); 189 190 EXPECT_EQ(panel::RESIZABLE_LEFT | panel::RESIZABLE_RIGHT, 191 panel1->CanResizeByMouse()); 192 EXPECT_EQ(panel::RESIZABLE_LEFT | panel::RESIZABLE_RIGHT, 193 panel2->CanResizeByMouse()); 194 EXPECT_EQ(panel::RESIZABLE_LEFT | panel::RESIZABLE_RIGHT, 195 panel3->CanResizeByMouse()); 196 197 EXPECT_EQ(panel::TOP_ROUNDED, panel1_testing->GetWindowCornerStyle()); 198 EXPECT_EQ(panel::NOT_ROUNDED, panel2_testing->GetWindowCornerStyle()); 199 EXPECT_EQ(panel::BOTTOM_ROUNDED, panel3_testing->GetWindowCornerStyle()); 200 201 Panel::AttentionMode expected_attention_mode = 202 static_cast<Panel::AttentionMode>(Panel::USE_PANEL_ATTENTION | 203 Panel::USE_SYSTEM_ATTENTION); 204 EXPECT_EQ(expected_attention_mode, panel1->attention_mode()); 205 EXPECT_EQ(expected_attention_mode, panel2->attention_mode()); 206 EXPECT_EQ(expected_attention_mode, panel3->attention_mode()); 207 208 panel_manager->CloseAll(); 209 } 210 211 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, ClickTitlebar) { 212 PanelManager* panel_manager = PanelManager::GetInstance(); 213 214 // Create 2 stacked panels. 215 StackedPanelCollection* stack = panel_manager->CreateStack(); 216 gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150); 217 Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack); 218 gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100); 219 Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack); 220 ASSERT_EQ(1, panel_manager->num_stacks()); 221 222 scoped_ptr<NativePanelTesting> panel1_testing( 223 CreateNativePanelTesting(panel1)); 224 scoped_ptr<NativePanelTesting> panel2_testing( 225 CreateNativePanelTesting(panel2)); 226 227 gfx::Point panel1_origin = panel2->GetBounds().origin(); 228 gfx::Point panel2_origin = panel2->GetBounds().origin(); 229 230 EXPECT_FALSE(panel1->IsMinimized()); 231 EXPECT_FALSE(panel2->IsMinimized()); 232 233 gfx::Rect panel1_expected_bounds(panel1_initial_bounds); 234 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 235 gfx::Rect panel2_expected_bounds(panel1_expected_bounds.x(), 236 panel1_expected_bounds.bottom(), 237 panel1_expected_bounds.width(), 238 panel2_initial_bounds.height()); 239 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 240 241 // Clicking on P2's titlebar to collapse it. 242 panel2_testing->PressLeftMouseButtonTitlebar(panel2_origin); 243 panel2_testing->ReleaseMouseButtonTitlebar(); 244 WaitForBoundsAnimationFinished(panel2); 245 EXPECT_FALSE(panel1->IsMinimized()); 246 EXPECT_TRUE(panel2->IsMinimized()); 247 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 248 panel2_expected_bounds.set_height(panel2->TitleOnlyHeight()); 249 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 250 251 // Clicking on P2's titlebar to expand it. 252 panel2_testing->PressLeftMouseButtonTitlebar(panel2_origin); 253 panel2_testing->ReleaseMouseButtonTitlebar(); 254 WaitForBoundsAnimationFinished(panel2); 255 EXPECT_FALSE(panel1->IsMinimized()); 256 EXPECT_FALSE(panel2->IsMinimized()); 257 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 258 panel2_expected_bounds.set_height(panel2_initial_bounds.height()); 259 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 260 261 // Clicking on P2's titlebar with APPLY_TO_ALL modifier to collapse all 262 // panels. 263 panel2_testing->PressLeftMouseButtonTitlebar(panel2_origin, 264 panel::APPLY_TO_ALL); 265 panel2_testing->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL); 266 WaitForBoundsAnimationFinished(panel1); 267 WaitForBoundsAnimationFinished(panel2); 268 EXPECT_TRUE(panel1->IsMinimized()); 269 EXPECT_TRUE(panel2->IsMinimized()); 270 panel1_expected_bounds.set_height(panel1->TitleOnlyHeight()); 271 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 272 panel2_expected_bounds.set_y(panel1_expected_bounds.bottom()); 273 panel2_expected_bounds.set_height(panel2->TitleOnlyHeight()); 274 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 275 276 // Clicking on P1's titlebar with APPLY_TO_ALL modifier to expand all 277 // panels. 278 panel1_testing->PressLeftMouseButtonTitlebar(panel1_origin, 279 panel::APPLY_TO_ALL); 280 panel1_testing->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL); 281 WaitForBoundsAnimationFinished(panel1); 282 WaitForBoundsAnimationFinished(panel2); 283 EXPECT_FALSE(panel1->IsMinimized()); 284 EXPECT_FALSE(panel2->IsMinimized()); 285 panel1_expected_bounds.set_height(panel1_initial_bounds.height()); 286 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 287 panel2_expected_bounds.set_y(panel1_expected_bounds.bottom()); 288 panel2_expected_bounds.set_height(panel2_initial_bounds.height()); 289 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 290 291 panel_manager->CloseAll(); 292 } 293 294 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, CallMinimizeAndRestoreApi) { 295 PanelManager* panel_manager = PanelManager::GetInstance(); 296 297 // Create 2 stacked panels. 298 StackedPanelCollection* stack = panel_manager->CreateStack(); 299 gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150); 300 Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack); 301 gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100); 302 Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack); 303 ASSERT_EQ(1, panel_manager->num_stacks()); 304 305 EXPECT_FALSE(panel1->IsMinimized()); 306 EXPECT_FALSE(panel2->IsMinimized()); 307 308 gfx::Rect panel1_expected_bounds(panel1_initial_bounds); 309 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 310 gfx::Rect panel2_expected_bounds(panel1_expected_bounds.x(), 311 panel1_expected_bounds.bottom(), 312 panel1_expected_bounds.width(), 313 panel2_initial_bounds.height()); 314 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 315 316 // Collapsing P1 by calling its Minimize API. 317 panel1->Minimize(); 318 WaitForBoundsAnimationFinished(panel1); 319 EXPECT_TRUE(panel1->IsMinimized()); 320 EXPECT_FALSE(panel2->IsMinimized()); 321 panel1_expected_bounds.set_height(panel1->TitleOnlyHeight()); 322 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 323 panel2_expected_bounds.set_y(panel1_expected_bounds.bottom()); 324 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 325 326 // Expanding P1 by calling its Restore API. 327 panel1->Restore(); 328 WaitForBoundsAnimationFinished(panel1); 329 EXPECT_FALSE(panel1->IsMinimized()); 330 EXPECT_FALSE(panel2->IsMinimized()); 331 panel1_expected_bounds.set_height(panel1_initial_bounds.height()); 332 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 333 panel2_expected_bounds.set_y(panel1_expected_bounds.bottom()); 334 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 335 336 panel_manager->CloseAll(); 337 } 338 339 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, ExpandToFitWithinScreen) { 340 PanelManager* panel_manager = PanelManager::GetInstance(); 341 gfx::Rect work_area = 342 panel_manager->display_settings_provider()->GetPrimaryWorkArea(); 343 344 // Create 4 stacked panels. P4 is the active panel. 345 StackedPanelCollection* stack = panel_manager->CreateStack(); 346 Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 90, 200, 150), stack); 347 Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack); 348 Panel* panel3 = CreateStackedPanel("3", gfx::Rect(0, 0, 150, 120), stack); 349 Panel* panel4 = CreateStackedPanel("4", gfx::Rect(0, 0, 150, 100), stack); 350 ASSERT_EQ(4, stack->num_panels()); 351 ASSERT_FALSE(panel1->IsMinimized()); 352 ASSERT_FALSE(panel2->IsMinimized()); 353 ASSERT_FALSE(panel3->IsMinimized()); 354 ASSERT_FALSE(panel4->IsMinimized()); 355 EXPECT_LE(panel4->GetBounds().bottom(), work_area.bottom()); 356 int old_stack_top_position = panel1->GetBounds().y(); 357 358 // Collapse P2. 359 panel2->Minimize(); 360 WaitForBoundsAnimationFinished(panel2); 361 ASSERT_FALSE(panel1->IsMinimized()); 362 ASSERT_TRUE(panel2->IsMinimized()); 363 ASSERT_FALSE(panel3->IsMinimized()); 364 ASSERT_FALSE(panel4->IsMinimized()); 365 366 // Grow P2's restored height. 367 gfx::Size panel2_full_size = panel2->full_size(); 368 panel2_full_size.set_height(panel2_full_size.height() + 30); 369 panel2->set_full_size(panel2_full_size); 370 371 // Expand P2. Expect that the least recently active panel P1 is minimized in 372 // order to make space for P2. 373 panel2->Restore(); 374 WaitForBoundsAnimationFinished(panel2); 375 WaitForBoundsAnimationFinished(panel3); 376 WaitForBoundsAnimationFinished(panel4); 377 ASSERT_TRUE(panel1->IsMinimized()); 378 ASSERT_FALSE(panel2->IsMinimized()); 379 ASSERT_FALSE(panel3->IsMinimized()); 380 ASSERT_FALSE(panel4->IsMinimized()); 381 EXPECT_EQ(old_stack_top_position, panel1->GetBounds().y()); 382 EXPECT_LE(panel4->GetBounds().bottom(), work_area.bottom()); 383 EXPECT_EQ(panel2->GetBounds().height(), panel2_full_size.height()); 384 385 // Grow P1's restored height. 386 gfx::Size panel1_full_size = panel1->full_size(); 387 panel1_full_size.set_height(panel1_full_size.height() + 180); 388 panel1->set_full_size(panel1_full_size); 389 390 // Expand P1. Expect that both P2 and P3 are collapsed and the stack moves 391 // up in order to make space for P1. 392 panel1->Restore(); 393 WaitForBoundsAnimationFinished(panel1); 394 WaitForBoundsAnimationFinished(panel2); 395 WaitForBoundsAnimationFinished(panel3); 396 WaitForBoundsAnimationFinished(panel4); 397 ASSERT_FALSE(panel1->IsMinimized()); 398 ASSERT_TRUE(panel2->IsMinimized()); 399 ASSERT_TRUE(panel3->IsMinimized()); 400 ASSERT_FALSE(panel4->IsMinimized()); 401 EXPECT_LT(panel1->GetBounds().y(), old_stack_top_position); 402 EXPECT_GE(panel1->GetBounds().y(), work_area.y()); 403 EXPECT_LE(panel4->GetBounds().bottom(), work_area.bottom()); 404 EXPECT_EQ(panel1->GetBounds().height(), panel1_full_size.height()); 405 old_stack_top_position = panel1->GetBounds().y(); 406 407 // Expand P3. Expect that P1 get collapsed in order to make space for P3. 408 panel3->Restore(); 409 WaitForBoundsAnimationFinished(panel1); 410 WaitForBoundsAnimationFinished(panel2); 411 WaitForBoundsAnimationFinished(panel3); 412 WaitForBoundsAnimationFinished(panel4); 413 ASSERT_TRUE(panel1->IsMinimized()); 414 ASSERT_TRUE(panel2->IsMinimized()); 415 ASSERT_FALSE(panel3->IsMinimized()); 416 ASSERT_FALSE(panel4->IsMinimized()); 417 EXPECT_EQ(old_stack_top_position, panel1->GetBounds().y()); 418 EXPECT_LE(panel4->GetBounds().bottom(), work_area.bottom()); 419 420 // Grow P2's restored height by a very large value such that the stack with 421 // P2 in full height will not fit within the screen. 422 panel2_full_size = panel2->full_size(); 423 panel2_full_size.set_height(panel2_full_size.height() + 500); 424 panel2->set_full_size(panel2_full_size); 425 426 // Expand P2. Expect: 427 // 1) Both P1 and P3 are collapsed 428 // 2) The stack moves up to the top of the screen 429 // 3) P2's restored height is reduced 430 panel2->Restore(); 431 WaitForBoundsAnimationFinished(panel1); 432 WaitForBoundsAnimationFinished(panel2); 433 WaitForBoundsAnimationFinished(panel3); 434 WaitForBoundsAnimationFinished(panel4); 435 EXPECT_TRUE(panel1->IsMinimized()); 436 EXPECT_FALSE(panel2->IsMinimized()); 437 EXPECT_TRUE(panel3->IsMinimized()); 438 EXPECT_FALSE(panel4->IsMinimized()); 439 EXPECT_EQ(panel1->GetBounds().y(), work_area.y()); 440 EXPECT_EQ(panel4->GetBounds().bottom(), work_area.bottom()); 441 EXPECT_LT(panel2->GetBounds().height(), panel2_full_size.height()); 442 443 panel_manager->CloseAll(); 444 } 445 446 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, ExpandAllToFitWithinScreen) { 447 PanelManager* panel_manager = PanelManager::GetInstance(); 448 gfx::Rect work_area = 449 panel_manager->display_settings_provider()->GetPrimaryWorkArea(); 450 451 // Create 3 stacked panels. 452 StackedPanelCollection* stack = panel_manager->CreateStack(); 453 Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 150, 200, 200), stack); 454 Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack); 455 Panel* panel3 = CreateStackedPanel("3", gfx::Rect(0, 0, 150, 120), stack); 456 ASSERT_EQ(3, stack->num_panels()); 457 458 scoped_ptr<NativePanelTesting> panel2_testing( 459 CreateNativePanelTesting(panel2)); 460 461 // Collapse all panels by clicking on P2's titlebar with APPLY_TO_ALL 462 // modifier. 463 panel2_testing->PressLeftMouseButtonTitlebar(panel2->GetBounds().origin(), 464 panel::APPLY_TO_ALL); 465 panel2_testing->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL); 466 WaitForBoundsAnimationFinished(panel1); 467 WaitForBoundsAnimationFinished(panel2); 468 WaitForBoundsAnimationFinished(panel3); 469 ASSERT_TRUE(panel1->IsMinimized()); 470 ASSERT_TRUE(panel2->IsMinimized()); 471 ASSERT_TRUE(panel3->IsMinimized()); 472 473 // Grow P2's restored height by a very large value. 474 gfx::Size panel2_full_size = panel2->full_size(); 475 panel2_full_size.set_height(panel2_full_size.height() + 500); 476 panel2->set_full_size(panel2_full_size); 477 478 // Expand all panels by clicking on P2's titlebar with APPLY_TO_ALL 479 // modifier again. Expect only P2 is expanded due to no available space for 480 // P1 and P3. 481 panel2_testing->PressLeftMouseButtonTitlebar(panel2->GetBounds().origin(), 482 panel::APPLY_TO_ALL); 483 panel2_testing->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL); 484 WaitForBoundsAnimationFinished(panel1); 485 WaitForBoundsAnimationFinished(panel2); 486 WaitForBoundsAnimationFinished(panel3); 487 EXPECT_TRUE(panel1->IsMinimized()); 488 EXPECT_FALSE(panel2->IsMinimized()); 489 EXPECT_TRUE(panel3->IsMinimized()); 490 EXPECT_EQ(panel1->GetBounds().y(), work_area.y()); 491 EXPECT_EQ(panel3->GetBounds().bottom(), work_area.bottom()); 492 493 panel_manager->CloseAll(); 494 } 495 496 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, MinimizeButtonVisibility) { 497 PanelManager* panel_manager = PanelManager::GetInstance(); 498 499 // Create 3 stacked panels. 500 StackedPanelCollection* stack = panel_manager->CreateStack(); 501 gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150); 502 Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack); 503 gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100); 504 Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack); 505 gfx::Rect panel3_initial_bounds = gfx::Rect(0, 0, 250, 120); 506 Panel* panel3 = CreateStackedPanel("3", panel3_initial_bounds, stack); 507 ASSERT_EQ(1, panel_manager->num_stacks()); 508 ASSERT_EQ(3, stack->num_panels()); 509 510 scoped_ptr<NativePanelTesting> panel1_testing( 511 CreateNativePanelTesting(panel1)); 512 scoped_ptr<NativePanelTesting> panel2_testing( 513 CreateNativePanelTesting(panel2)); 514 scoped_ptr<NativePanelTesting> panel3_testing( 515 CreateNativePanelTesting(panel3)); 516 517 // Only P1 shows minimize button. 518 if (PanelManager::CanUseSystemMinimize()) 519 EXPECT_TRUE(panel1_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 520 else 521 EXPECT_FALSE(panel1_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 522 EXPECT_FALSE(panel2_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 523 EXPECT_FALSE(panel3_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 524 525 // Drag P2 away to unstack from P1. 526 // Expect only P2, top panel of the stack consisting P2 and P3, shows minimize 527 // button. 528 gfx::Point mouse_location(panel2->GetBounds().origin()); 529 panel2_testing->PressLeftMouseButtonTitlebar(mouse_location); 530 gfx::Vector2d drag_delta_to_unstack(120, 50); 531 panel2_testing->DragTitlebar(mouse_location + drag_delta_to_unstack); 532 panel2_testing->FinishDragTitlebar(); 533 ASSERT_EQ(1, panel_manager->detached_collection()->num_panels()); 534 ASSERT_EQ(1, panel_manager->num_stacks()); 535 ASSERT_EQ(2, stack->num_panels()); 536 537 if (PanelManager::CanUseSystemMinimize()) { 538 EXPECT_TRUE(panel1_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 539 EXPECT_TRUE(panel2_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 540 } else { 541 EXPECT_FALSE(panel1_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 542 EXPECT_FALSE(panel2_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 543 } 544 EXPECT_FALSE(panel3_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 545 546 // Drag P1 to stack to the top edge of P2. 547 // Expect only P1, top panel of the stack consisting P1, P2 and P3, shows 548 // minimize button. 549 gfx::Rect bounds1 = panel1->GetBounds(); 550 gfx::Rect bounds2 = panel2->GetBounds(); 551 mouse_location = bounds1.origin(); 552 panel1_testing->PressLeftMouseButtonTitlebar(mouse_location); 553 gfx::Vector2d drag_delta_to_stack(bounds2.x() - bounds1.x(), 554 bounds2.y() - bounds1.bottom()); 555 panel1_testing->DragTitlebar(mouse_location + drag_delta_to_stack); 556 panel1_testing->FinishDragTitlebar(); 557 ASSERT_EQ(0, panel_manager->detached_collection()->num_panels()); 558 ASSERT_EQ(1, panel_manager->num_stacks()); 559 ASSERT_EQ(3, stack->num_panels()); 560 561 if (PanelManager::CanUseSystemMinimize()) 562 EXPECT_TRUE(panel1_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 563 else 564 EXPECT_FALSE(panel1_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 565 EXPECT_FALSE(panel2_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 566 EXPECT_FALSE(panel3_testing->IsButtonVisible(panel::MINIMIZE_BUTTON)); 567 568 panel_manager->CloseAll(); 569 } 570 571 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, DISABLED_ClickMinimizeButton) { 572 PanelManager* panel_manager = PanelManager::GetInstance(); 573 574 // Create 2 stacked panels. 575 StackedPanelCollection* stack = panel_manager->CreateStack(); 576 gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150); 577 Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack); 578 gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100); 579 Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack); 580 ASSERT_EQ(1, panel_manager->num_stacks()); 581 582 scoped_ptr<NativePanelTesting> panel1_testing( 583 CreateNativePanelTesting(panel1)); 584 585 EXPECT_FALSE(panel1->IsMinimized()); 586 EXPECT_FALSE(panel2->IsMinimized()); 587 588 // Collapsing P1 by calling its Minimize API. 589 panel1->OnMinimizeButtonClicked(panel::NO_MODIFIER); 590 EXPECT_FALSE(panel1->IsMinimized()); 591 EXPECT_FALSE(panel2->IsMinimized()); 592 EXPECT_TRUE(panel1_testing->VerifySystemMinimizeState()); 593 594 panel_manager->CloseAll(); 595 } 596 597 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, UngroupMinimizedPanels) { 598 PanelManager* panel_manager = PanelManager::GetInstance(); 599 600 // Create 3 stacked panels. 601 StackedPanelCollection* stack = panel_manager->CreateStack(); 602 gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150); 603 Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack); 604 gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100); 605 Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack); 606 gfx::Rect panel3_initial_bounds = gfx::Rect(0, 0, 250, 120); 607 Panel* panel3 = CreateStackedPanel("3", panel3_initial_bounds, stack); 608 ASSERT_EQ(1, panel_manager->num_stacks()); 609 ASSERT_EQ(3, stack->num_panels()); 610 611 scoped_ptr<NativePanelTesting> panel2_testing( 612 CreateNativePanelTesting(panel2)); 613 scoped_ptr<NativePanelTesting> panel3_testing( 614 CreateNativePanelTesting(panel3)); 615 616 // Minimize these 3 panels. 617 panel1->Minimize(); 618 WaitForBoundsAnimationFinished(panel1); 619 panel2->Minimize(); 620 WaitForBoundsAnimationFinished(panel3); 621 panel3->Minimize(); 622 WaitForBoundsAnimationFinished(panel3); 623 624 EXPECT_TRUE(panel1->IsMinimized()); 625 EXPECT_TRUE(panel2->IsMinimized()); 626 EXPECT_TRUE(panel3->IsMinimized()); 627 628 gfx::Rect panel1_expected_bounds(panel1_initial_bounds); 629 panel1_expected_bounds.set_height(panel1->TitleOnlyHeight()); 630 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 631 gfx::Rect panel2_expected_bounds(panel1_expected_bounds.x(), 632 panel1_expected_bounds.bottom(), 633 panel1_expected_bounds.width(), 634 panel2->TitleOnlyHeight()); 635 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 636 gfx::Rect panel3_expected_bounds(panel2_expected_bounds.x(), 637 panel2_expected_bounds.bottom(), 638 panel2_expected_bounds.width(), 639 panel3->TitleOnlyHeight()); 640 EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds()); 641 642 // Drag P2 away to unstack from P1. 643 // Expect P2 and P3 are still stacked and minimized while P1 becomes detached 644 // and expanded. The minimize button of P2 should become visible now. 645 gfx::Point mouse_location(panel2->GetBounds().origin()); 646 panel2_testing->PressLeftMouseButtonTitlebar(mouse_location); 647 gfx::Vector2d drag_delta(120, 50); 648 panel2_testing->DragTitlebar(mouse_location + drag_delta); 649 panel2_testing->FinishDragTitlebar(); 650 WaitForBoundsAnimationFinished(panel1); 651 ASSERT_EQ(1, panel_manager->detached_collection()->num_panels()); 652 ASSERT_EQ(1, panel_manager->num_stacks()); 653 ASSERT_EQ(2, stack->num_panels()); 654 655 EXPECT_FALSE(panel1->IsMinimized()); 656 EXPECT_TRUE(panel2->IsMinimized()); 657 EXPECT_TRUE(panel3->IsMinimized()); 658 659 panel1_expected_bounds.set_height(panel1_initial_bounds.height()); 660 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 661 panel2_expected_bounds.Offset(drag_delta); 662 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 663 panel3_expected_bounds.Offset(drag_delta); 664 EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds()); 665 666 // Drag P3 away to unstack from P2. 667 // Expect both panels become detached and expanded. 668 mouse_location = panel3->GetBounds().origin(); 669 panel3_testing->PressLeftMouseButtonTitlebar(mouse_location); 670 panel3_testing->DragTitlebar(mouse_location + drag_delta); 671 panel3_testing->FinishDragTitlebar(); 672 WaitForBoundsAnimationFinished(panel2); 673 WaitForBoundsAnimationFinished(panel3); 674 ASSERT_EQ(3, panel_manager->detached_collection()->num_panels()); 675 ASSERT_EQ(0, panel_manager->num_stacks()); 676 677 EXPECT_FALSE(panel1->IsMinimized()); 678 EXPECT_FALSE(panel2->IsMinimized()); 679 EXPECT_FALSE(panel3->IsMinimized()); 680 681 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 682 panel2_expected_bounds.set_height(panel2_initial_bounds.height()); 683 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 684 panel3_expected_bounds.Offset(drag_delta); 685 panel3_expected_bounds.set_height(panel3_initial_bounds.height()); 686 EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds()); 687 688 panel_manager->CloseAll(); 689 } 690 691 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 692 AddNewPanelToStackWithMostPanels) { 693 PanelManager* panel_manager = PanelManager::GetInstance(); 694 695 // Create one stack with 2 panels. 696 StackedPanelCollection* stack1 = panel_manager->CreateStack(); 697 CreateStackedPanel("1", gfx::Rect(200, 50, 200, 150), stack1); 698 CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack1); 699 ASSERT_EQ(2, panel_manager->num_panels()); 700 ASSERT_EQ(1, panel_manager->num_stacks()); 701 ASSERT_EQ(2, stack1->num_panels()); 702 703 // Create another stack with 3 panels. 704 StackedPanelCollection* stack2 = panel_manager->CreateStack(); 705 CreateStackedPanel("3", gfx::Rect(100, 50, 200, 150), stack2); 706 CreateStackedPanel("4", gfx::Rect(0, 0, 150, 100), stack2); 707 CreateStackedPanel("5", gfx::Rect(0, 0, 250, 120), stack2); 708 ASSERT_EQ(5, panel_manager->num_panels()); 709 ASSERT_EQ(2, panel_manager->num_stacks()); 710 ASSERT_EQ(3, stack2->num_panels()); 711 712 // Create new panel. Expect that it will append to stack2 since it has most 713 // panels. 714 CreatePanelParams params("N", gfx::Rect(50, 50, 150, 100), SHOW_AS_ACTIVE); 715 params.create_mode = PanelManager::CREATE_AS_DETACHED; 716 Panel* new_panel = CreatePanelWithParams(params); 717 EXPECT_EQ(6, panel_manager->num_panels()); 718 EXPECT_EQ(2, panel_manager->num_stacks()); 719 EXPECT_EQ(2, stack1->num_panels()); 720 EXPECT_EQ(4, stack2->num_panels()); 721 EXPECT_TRUE(stack2->HasPanel(new_panel)); 722 EXPECT_TRUE(new_panel == stack2->bottom_panel()); 723 724 panel_manager->CloseAll(); 725 } 726 727 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 728 AddNewPanelToRightMostStack) { 729 PanelManager* panel_manager = PanelManager::GetInstance(); 730 731 // Create one stack with 2 panels. 732 StackedPanelCollection* stack1 = panel_manager->CreateStack(); 733 CreateStackedPanel("1", gfx::Rect(100, 50, 200, 150), stack1); 734 CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack1); 735 ASSERT_EQ(2, panel_manager->num_panels()); 736 ASSERT_EQ(1, panel_manager->num_stacks()); 737 ASSERT_EQ(2, stack1->num_panels()); 738 739 // Create another stack with 2 panels. 740 StackedPanelCollection* stack2 = panel_manager->CreateStack(); 741 CreateStackedPanel("3", gfx::Rect(200, 50, 200, 150), stack2); 742 CreateStackedPanel("4", gfx::Rect(0, 0, 150, 100), stack2); 743 ASSERT_EQ(4, panel_manager->num_panels()); 744 ASSERT_EQ(2, panel_manager->num_stacks()); 745 ASSERT_EQ(2, stack2->num_panels()); 746 747 // Create new panel. Both stack1 and stack2 have same number of panels. Since 748 // stack2 is right-most, new panel will be added to it. 749 CreatePanelParams params("N", gfx::Rect(50, 50, 150, 100), SHOW_AS_ACTIVE); 750 params.create_mode = PanelManager::CREATE_AS_DETACHED; 751 Panel* new_panel = CreatePanelWithParams(params); 752 EXPECT_EQ(5, panel_manager->num_panels()); 753 EXPECT_EQ(2, panel_manager->num_stacks()); 754 EXPECT_EQ(2, stack1->num_panels()); 755 EXPECT_EQ(3, stack2->num_panels()); 756 EXPECT_TRUE(stack2->HasPanel(new_panel)); 757 EXPECT_TRUE(new_panel == stack2->bottom_panel()); 758 759 panel_manager->CloseAll(); 760 } 761 762 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 763 AddNewPanelToTopMostStack) { 764 PanelManager* panel_manager = PanelManager::GetInstance(); 765 766 // Create one stack with 2 panels. 767 StackedPanelCollection* stack1 = panel_manager->CreateStack(); 768 CreateStackedPanel("1", gfx::Rect(100, 90, 200, 150), stack1); 769 CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack1); 770 ASSERT_EQ(2, panel_manager->num_panels()); 771 ASSERT_EQ(1, panel_manager->num_stacks()); 772 ASSERT_EQ(2, stack1->num_panels()); 773 774 // Create another stack with 2 panels. 775 StackedPanelCollection* stack2 = panel_manager->CreateStack(); 776 CreateStackedPanel("3", gfx::Rect(100, 50, 200, 150), stack2); 777 CreateStackedPanel("4", gfx::Rect(0, 0, 150, 100), stack2); 778 ASSERT_EQ(4, panel_manager->num_panels()); 779 ASSERT_EQ(2, panel_manager->num_stacks()); 780 ASSERT_EQ(2, stack2->num_panels()); 781 782 // Create new panel. Both stack1 and stack2 have same number of panels and 783 // same right position. Since stack2 is top-most, new panel will be added to 784 // it. 785 CreatePanelParams params("N", gfx::Rect(50, 50, 150, 100), SHOW_AS_ACTIVE); 786 params.create_mode = PanelManager::CREATE_AS_DETACHED; 787 Panel* new_panel = CreatePanelWithParams(params); 788 EXPECT_EQ(5, panel_manager->num_panels()); 789 EXPECT_EQ(2, panel_manager->num_stacks()); 790 EXPECT_EQ(2, stack1->num_panels()); 791 EXPECT_EQ(3, stack2->num_panels()); 792 EXPECT_TRUE(stack2->HasPanel(new_panel)); 793 EXPECT_TRUE(new_panel == stack2->bottom_panel()); 794 795 panel_manager->CloseAll(); 796 } 797 798 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 799 AddNewPanelToGroupWithRightMostDetachedPanel) { 800 PanelManager* panel_manager = PanelManager::GetInstance(); 801 802 // Create 2 detached panels. 803 CreateDetachedPanel("1", gfx::Rect(200, 50, 250, 150)); 804 Panel* panel2 = CreateDetachedPanel("2", gfx::Rect(250, 100, 150, 100)); 805 ASSERT_EQ(2, panel_manager->num_panels()); 806 ASSERT_EQ(0, panel_manager->num_stacks()); 807 ASSERT_EQ(2, panel_manager->detached_collection()->num_panels()); 808 809 // Create new panel. Expect that new panel will stack to the bottom of panel2 810 // since it is right-most. 811 CreatePanelParams params("N", gfx::Rect(50, 50, 150, 100), SHOW_AS_ACTIVE); 812 params.create_mode = PanelManager::CREATE_AS_DETACHED; 813 Panel* new_panel = CreatePanelWithParams(params); 814 EXPECT_EQ(3, panel_manager->num_panels()); 815 EXPECT_EQ(1, panel_manager->detached_collection()->num_panels()); 816 ASSERT_EQ(1, panel_manager->num_stacks()); 817 StackedPanelCollection* stack = panel_manager->stacks().front(); 818 EXPECT_EQ(2, stack->num_panels()); 819 EXPECT_TRUE(panel2 == stack->top_panel()); 820 EXPECT_TRUE(new_panel == stack->bottom_panel()); 821 822 panel_manager->CloseAll(); 823 } 824 825 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 826 AddNewPanelToGroupWitTopMostDetachedPanel) { 827 PanelManager* panel_manager = PanelManager::GetInstance(); 828 829 // Create 2 detached panels. 830 CreateDetachedPanel("1", gfx::Rect(200, 100, 100, 150)); 831 Panel* panel2 = CreateDetachedPanel("2", gfx::Rect(200, 50, 100, 100)); 832 ASSERT_EQ(2, panel_manager->num_panels()); 833 ASSERT_EQ(0, panel_manager->num_stacks()); 834 ASSERT_EQ(2, panel_manager->detached_collection()->num_panels()); 835 836 // Create new panel. Expect that new panel will stack to the bottom of panel2 837 // since it is top-most. 838 CreatePanelParams params("N", gfx::Rect(50, 50, 150, 100), SHOW_AS_ACTIVE); 839 params.create_mode = PanelManager::CREATE_AS_DETACHED; 840 Panel* new_panel = CreatePanelWithParams(params); 841 EXPECT_EQ(3, panel_manager->num_panels()); 842 EXPECT_EQ(1, panel_manager->detached_collection()->num_panels()); 843 ASSERT_EQ(1, panel_manager->num_stacks()); 844 StackedPanelCollection* stack = panel_manager->stacks().front(); 845 EXPECT_EQ(2, stack->num_panels()); 846 EXPECT_TRUE(panel2 == stack->top_panel()); 847 EXPECT_TRUE(new_panel == stack->bottom_panel()); 848 849 panel_manager->CloseAll(); 850 } 851 852 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 853 AddNewPanelToStackWithCollapseToFit) { 854 PanelManager* panel_manager = PanelManager::GetInstance(); 855 856 // Create one stack with 4 panels. 857 // The panels from most recent active to least recent active are: 858 // P4 P3 P2 P1 859 StackedPanelCollection* stack = panel_manager->CreateStack(); 860 Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 50, 200, 140), stack); 861 Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 150), stack); 862 Panel* panel3 = CreateStackedPanel("3", gfx::Rect(0, 0, 180, 120), stack); 863 Panel* panel4 = CreateStackedPanel("4", gfx::Rect(0, 0, 170, 110), stack); 864 ASSERT_EQ(4, panel_manager->num_panels()); 865 ASSERT_EQ(1, panel_manager->num_stacks()); 866 ASSERT_EQ(4, stack->num_panels()); 867 EXPECT_FALSE(panel1->IsMinimized()); 868 EXPECT_FALSE(panel2->IsMinimized()); 869 EXPECT_FALSE(panel3->IsMinimized()); 870 EXPECT_FALSE(panel4->IsMinimized()); 871 872 // Create a panel. Expect the least recent active panel P1 gets minimized such 873 // that there is enough space for new panel to append to the stack. 874 // The panels from most recent active to least recent active are: 875 // PM P4 P3 P2 P1* 876 CreatePanelParams params1("M", gfx::Rect(50, 50, 300, 110), SHOW_AS_ACTIVE); 877 params1.create_mode = PanelManager::CREATE_AS_DETACHED; 878 Panel* new_panel1 = CreatePanelWithParams(params1); 879 EXPECT_EQ(5, panel_manager->num_panels()); 880 EXPECT_EQ(1, panel_manager->num_stacks()); 881 EXPECT_EQ(5, stack->num_panels()); 882 EXPECT_TRUE(new_panel1 == stack->bottom_panel()); 883 EXPECT_TRUE(panel1->IsMinimized()); 884 EXPECT_FALSE(panel2->IsMinimized()); 885 EXPECT_FALSE(panel3->IsMinimized()); 886 EXPECT_FALSE(panel4->IsMinimized()); 887 EXPECT_FALSE(new_panel1->IsMinimized()); 888 889 // Create another panel. Expect P2 and P3 are minimized such that there is 890 // enough space for new panel to append to the stack. 891 CreatePanelParams params2("N", gfx::Rect(50, 50, 300, 180), SHOW_AS_ACTIVE); 892 params2.create_mode = PanelManager::CREATE_AS_DETACHED; 893 Panel* new_panel2 = CreatePanelWithParams(params2); 894 EXPECT_EQ(6, panel_manager->num_panels()); 895 EXPECT_EQ(1, panel_manager->num_stacks()); 896 EXPECT_EQ(6, stack->num_panels()); 897 EXPECT_TRUE(new_panel2 == stack->bottom_panel()); 898 EXPECT_TRUE(panel1->IsMinimized()); 899 EXPECT_TRUE(panel2->IsMinimized()); 900 EXPECT_TRUE(panel3->IsMinimized()); 901 EXPECT_FALSE(panel4->IsMinimized()); 902 EXPECT_FALSE(new_panel1->IsMinimized()); 903 EXPECT_FALSE(new_panel2->IsMinimized()); 904 905 panel_manager->CloseAll(); 906 } 907 908 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 909 AddNewPanelToGroupWithDetachedPanelWithCollapseToFit) { 910 PanelManager* panel_manager = PanelManager::GetInstance(); 911 912 // Create 2 detached panels. 913 // Since P2 is active, it will not get collapsed when the new panel to stack 914 // with needs the space. 915 Panel* panel1 = 916 CreateInactiveDetachedPanel("1", gfx::Rect(100, 310, 200, 200)); 917 Panel* panel2 = CreateDetachedPanel("2", gfx::Rect(300, 300, 150, 200)); 918 ASSERT_EQ(2, panel_manager->num_panels()); 919 ASSERT_EQ(0, panel_manager->num_stacks()); 920 ASSERT_EQ(2, panel_manager->detached_collection()->num_panels()); 921 922 // Create new panel. Expect panel1 is minimized such that there is enough 923 // space for new panel to append to panel1. 924 CreatePanelParams params("N", gfx::Rect(50, 50, 300, 220), SHOW_AS_ACTIVE); 925 params.create_mode = PanelManager::CREATE_AS_DETACHED; 926 Panel* new_panel = CreatePanelWithParams(params); 927 EXPECT_EQ(3, panel_manager->num_panels()); 928 EXPECT_EQ(1, panel_manager->detached_collection()->num_panels()); 929 ASSERT_EQ(1, panel_manager->num_stacks()); 930 StackedPanelCollection* stack = panel_manager->stacks().front(); 931 EXPECT_EQ(2, stack->num_panels()); 932 EXPECT_TRUE(panel1 == stack->top_panel()); 933 EXPECT_TRUE(new_panel == stack->bottom_panel()); 934 EXPECT_TRUE(panel1->IsMinimized()); 935 EXPECT_FALSE(panel2->IsMinimized()); 936 EXPECT_FALSE(new_panel->IsMinimized()); 937 938 panel_manager->CloseAll(); 939 } 940 941 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 942 AddNewPanelAsDetachedDueToNoPanelToGroupWith) { 943 PanelManager* panel_manager = PanelManager::GetInstance(); 944 945 // Create one stack with 2 panels. 946 StackedPanelCollection* stack = panel_manager->CreateStack(); 947 CreateStackedPanel("1", gfx::Rect(100, 350, 200, 100), stack); 948 CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack); 949 ASSERT_EQ(2, panel_manager->num_panels()); 950 ASSERT_EQ(1, panel_manager->num_stacks()); 951 ASSERT_EQ(2, stack->num_panels()); 952 953 // Create 2 detached panels. 954 CreateDetachedPanel("3", gfx::Rect(300, 450, 200, 100)); 955 CreateDetachedPanel("4", gfx::Rect(250, 150, 150, 200)); 956 ASSERT_EQ(4, panel_manager->num_panels()); 957 ASSERT_EQ(2, panel_manager->detached_collection()->num_panels()); 958 ASSERT_EQ(1, panel_manager->num_stacks()); 959 960 // Create new panel. Expect that new panel has to be created as detached due 961 // to that there is not enough space from any stack or detached panel. 962 CreatePanelParams params("N", gfx::Rect(50, 50, 300, 300), SHOW_AS_ACTIVE); 963 params.create_mode = PanelManager::CREATE_AS_DETACHED; 964 Panel* new_panel = CreatePanelWithParams(params); 965 EXPECT_EQ(5, panel_manager->num_panels()); 966 EXPECT_EQ(3, panel_manager->detached_collection()->num_panels()); 967 EXPECT_EQ(1, panel_manager->num_stacks()); 968 EXPECT_EQ(2, stack->num_panels()); 969 EXPECT_TRUE(panel_manager->detached_collection()->HasPanel(new_panel)); 970 971 panel_manager->CloseAll(); 972 } 973 974 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 975 AddNewPanelFromDifferentExtension) { 976 PanelManager* panel_manager = PanelManager::GetInstance(); 977 978 // Create 2 test extensions. 979 base::DictionaryValue empty_value; 980 scoped_refptr<extensions::Extension> extension1 = 981 CreateExtension(FILE_PATH_LITERAL("TestExtension1"), 982 extensions::Manifest::INTERNAL, empty_value); 983 std::string extension1_app_name = 984 web_app::GenerateApplicationNameFromExtensionId(extension1->id()); 985 scoped_refptr<extensions::Extension> extension2 = 986 CreateExtension(FILE_PATH_LITERAL("TestExtension2"), 987 extensions::Manifest::INTERNAL, empty_value); 988 std::string extension2_app_name = 989 web_app::GenerateApplicationNameFromExtensionId(extension2->id()); 990 991 // Create 2 panels from extension1. Expect that these 2 panels stack together. 992 CreatePanelParams params1( 993 extension1_app_name, gfx::Rect(50, 50, 100, 100), SHOW_AS_ACTIVE); 994 params1.create_mode = PanelManager::CREATE_AS_DETACHED; 995 Panel* panel1 = CreatePanelWithParams(params1); 996 CreatePanelParams params2( 997 extension1_app_name, gfx::Rect(100, 100, 200, 100), SHOW_AS_ACTIVE); 998 params2.create_mode = PanelManager::CREATE_AS_DETACHED; 999 Panel* panel2 = CreatePanelWithParams(params2); 1000 EXPECT_EQ(2, panel_manager->num_panels()); 1001 EXPECT_EQ(1, panel_manager->num_stacks()); 1002 StackedPanelCollection* stack1 = panel_manager->stacks().back(); 1003 EXPECT_TRUE(stack1->HasPanel(panel1)); 1004 EXPECT_TRUE(stack1->HasPanel(panel2)); 1005 1006 // Create 2 panels from extension2. Expect that these 2 panels form a separate 1007 // stack. 1008 CreatePanelParams params3( 1009 extension2_app_name, gfx::Rect(350, 350, 100, 100), SHOW_AS_ACTIVE); 1010 params3.create_mode = PanelManager::CREATE_AS_DETACHED; 1011 Panel* panel3 = CreatePanelWithParams(params3); 1012 CreatePanelParams params4( 1013 extension2_app_name, gfx::Rect(100, 100, 200, 100), SHOW_AS_ACTIVE); 1014 params4.create_mode = PanelManager::CREATE_AS_DETACHED; 1015 Panel* panel4 = CreatePanelWithParams(params4); 1016 EXPECT_EQ(4, panel_manager->num_panels()); 1017 EXPECT_EQ(2, panel_manager->num_stacks()); 1018 StackedPanelCollection* stack2 = panel_manager->stacks().back(); 1019 EXPECT_TRUE(stack2->HasPanel(panel3)); 1020 EXPECT_TRUE(stack2->HasPanel(panel4)); 1021 1022 // Create one more panel from extension1. Expect that new panel should join 1023 // with the stack of panel1 and panel2. 1024 CreatePanelParams params5( 1025 extension1_app_name, gfx::Rect(0, 0, 100, 100), SHOW_AS_ACTIVE); 1026 params5.create_mode = PanelManager::CREATE_AS_DETACHED; 1027 Panel* panel5 = CreatePanelWithParams(params5); 1028 EXPECT_EQ(5, panel_manager->num_panels()); 1029 EXPECT_EQ(2, panel_manager->num_stacks()); 1030 EXPECT_TRUE(stack1->HasPanel(panel5)); 1031 1032 // Create one more panel from extension2. Expect that new panel should join 1033 // with the stack of panel3 and panel4. 1034 CreatePanelParams params6( 1035 extension2_app_name, gfx::Rect(0, 0, 100, 100), SHOW_AS_ACTIVE); 1036 params6.create_mode = PanelManager::CREATE_AS_DETACHED; 1037 Panel* panel6 = CreatePanelWithParams(params6); 1038 EXPECT_EQ(6, panel_manager->num_panels()); 1039 EXPECT_EQ(2, panel_manager->num_stacks()); 1040 EXPECT_TRUE(stack2->HasPanel(panel6)); 1041 1042 panel_manager->CloseAll(); 1043 } 1044 1045 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 1046 AddNewPanelFromDifferentProfile) { 1047 PanelManager* panel_manager = PanelManager::GetInstance(); 1048 1049 // Create a new profile. 1050 Profile* profile1 = browser()->profile(); 1051 scoped_ptr<TestingProfile> profile2(new TestingProfile()); 1052 1053 // Create 2 panels from profile1. Expect that these 2 panels stack together. 1054 CreatePanelParams params1( 1055 "1", gfx::Rect(50, 50, 100, 100), SHOW_AS_ACTIVE); 1056 params1.create_mode = PanelManager::CREATE_AS_DETACHED; 1057 params1.profile = profile1; 1058 Panel* panel1 = CreatePanelWithParams(params1); 1059 CreatePanelParams params2( 1060 "2", gfx::Rect(100, 100, 200, 100), SHOW_AS_ACTIVE); 1061 params2.create_mode = PanelManager::CREATE_AS_DETACHED; 1062 params2.profile = profile1; 1063 Panel* panel2 = CreatePanelWithParams(params2); 1064 EXPECT_EQ(2, panel_manager->num_panels()); 1065 EXPECT_EQ(1, panel_manager->num_stacks()); 1066 StackedPanelCollection* stack1 = panel_manager->stacks().back(); 1067 EXPECT_TRUE(stack1->HasPanel(panel1)); 1068 EXPECT_TRUE(stack1->HasPanel(panel2)); 1069 1070 // Create 2 panels from profile2. Expect that these 2 panels form a separate 1071 // stack. 1072 CreatePanelParams params3( 1073 "3", gfx::Rect(350, 350, 100, 100), SHOW_AS_ACTIVE); 1074 params3.create_mode = PanelManager::CREATE_AS_DETACHED; 1075 params3.profile = profile2.get(); 1076 Panel* panel3 = CreatePanelWithParams(params3); 1077 CreatePanelParams params4( 1078 "4", gfx::Rect(100, 100, 200, 100), SHOW_AS_ACTIVE); 1079 params4.create_mode = PanelManager::CREATE_AS_DETACHED; 1080 params4.profile = profile2.get(); 1081 Panel* panel4 = CreatePanelWithParams(params4); 1082 EXPECT_EQ(4, panel_manager->num_panels()); 1083 EXPECT_EQ(2, panel_manager->num_stacks()); 1084 StackedPanelCollection* stack2 = panel_manager->stacks().back(); 1085 EXPECT_TRUE(stack2->HasPanel(panel3)); 1086 EXPECT_TRUE(stack2->HasPanel(panel4)); 1087 1088 // Create one more panel from profile1. Expect that new panel should join 1089 // with the stack of panel1 and panel2. 1090 CreatePanelParams params5( 1091 "5", gfx::Rect(0, 0, 100, 100), SHOW_AS_ACTIVE); 1092 params5.create_mode = PanelManager::CREATE_AS_DETACHED; 1093 params5.profile = profile1; 1094 Panel* panel5 = CreatePanelWithParams(params5); 1095 EXPECT_EQ(5, panel_manager->num_panels()); 1096 EXPECT_EQ(2, panel_manager->num_stacks()); 1097 EXPECT_TRUE(stack1->HasPanel(panel5)); 1098 1099 // Create one more panel from profile2. Expect that new panel should join 1100 // with the stack of panel3 and panel4. 1101 CreatePanelParams params6( 1102 "6", gfx::Rect(0, 0, 100, 100), SHOW_AS_ACTIVE); 1103 params6.create_mode = PanelManager::CREATE_AS_DETACHED; 1104 params6.profile = profile2.get(); 1105 Panel* panel6 = CreatePanelWithParams(params6); 1106 EXPECT_EQ(6, panel_manager->num_panels()); 1107 EXPECT_EQ(2, panel_manager->num_stacks()); 1108 EXPECT_TRUE(stack2->HasPanel(panel6)); 1109 1110 // Wait until all panels created from profile2 get fully closed since profile2 1111 // is going out of scope at the exit of this function. 1112 CloseWindowAndWait(panel3); 1113 CloseWindowAndWait(panel4); 1114 CloseWindowAndWait(panel6); 1115 1116 panel_manager->CloseAll(); 1117 } 1118 1119 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 1120 AddNewPanelNotWithSystemMinimizedDetachedPanel) { 1121 PanelManager* panel_manager = PanelManager::GetInstance(); 1122 1123 // Create 1 detached panel. 1124 Panel* panel1 = CreateDetachedPanel("1", gfx::Rect(200, 50, 250, 150)); 1125 EXPECT_EQ(1, panel_manager->num_panels()); 1126 EXPECT_EQ(0, panel_manager->num_stacks()); 1127 EXPECT_EQ(1, panel_manager->detached_collection()->num_panels()); 1128 EXPECT_EQ(PanelCollection::DETACHED, panel1->collection()->type()); 1129 1130 // Minimize the detached panel by system. 1131 panel1->OnMinimizeButtonClicked(panel::NO_MODIFIER); 1132 1133 // Create new panel. Expect that new panel will open as a separate detached 1134 // panel, instead of being grouped with the system-minimized detached panel. 1135 CreatePanelParams params("N", gfx::Rect(50, 50, 150, 100), SHOW_AS_ACTIVE); 1136 params.create_mode = PanelManager::CREATE_AS_DETACHED; 1137 Panel* new_panel = CreatePanelWithParams(params); 1138 EXPECT_EQ(2, panel_manager->num_panels()); 1139 EXPECT_EQ(2, panel_manager->detached_collection()->num_panels()); 1140 EXPECT_EQ(0, panel_manager->num_stacks()); 1141 EXPECT_EQ(PanelCollection::DETACHED, panel1->collection()->type()); 1142 EXPECT_EQ(PanelCollection::DETACHED, new_panel->collection()->type()); 1143 1144 panel_manager->CloseAll(); 1145 } 1146 1147 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 1148 AddNewPanelNotWithSystemMinimizedStack) { 1149 PanelManager* panel_manager = PanelManager::GetInstance(); 1150 1151 // Create one stack with 2 panels. 1152 StackedPanelCollection* stack = panel_manager->CreateStack(); 1153 Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 90, 200, 150), stack); 1154 Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack); 1155 EXPECT_EQ(2, panel_manager->num_panels()); 1156 EXPECT_EQ(0, panel_manager->detached_collection()->num_panels()); 1157 EXPECT_EQ(1, panel_manager->num_stacks()); 1158 EXPECT_EQ(2, stack->num_panels()); 1159 EXPECT_EQ(PanelCollection::STACKED, panel1->collection()->type()); 1160 EXPECT_EQ(PanelCollection::STACKED, panel2->collection()->type()); 1161 1162 // Minimize the stack by system. 1163 stack->OnMinimizeButtonClicked(panel1, panel::NO_MODIFIER); 1164 1165 // Create new panel. Expect that new panel will open as a separate detached 1166 // panel, instead of appending to the system-minimized stack. 1167 CreatePanelParams params("N", gfx::Rect(50, 50, 150, 100), SHOW_AS_ACTIVE); 1168 params.create_mode = PanelManager::CREATE_AS_DETACHED; 1169 Panel* new_panel = CreatePanelWithParams(params); 1170 EXPECT_EQ(3, panel_manager->num_panels()); 1171 EXPECT_EQ(1, panel_manager->detached_collection()->num_panels()); 1172 EXPECT_EQ(1, panel_manager->num_stacks()); 1173 EXPECT_EQ(2, stack->num_panels()); 1174 EXPECT_EQ(PanelCollection::STACKED, panel1->collection()->type()); 1175 EXPECT_EQ(PanelCollection::STACKED, panel2->collection()->type()); 1176 EXPECT_EQ(PanelCollection::DETACHED, new_panel->collection()->type()); 1177 1178 panel_manager->CloseAll(); 1179 } 1180 1181 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, ClosePanels) { 1182 PanelManager* panel_manager = PanelManager::GetInstance(); 1183 1184 // Create 3 stacked panels. 1185 StackedPanelCollection* stack = panel_manager->CreateStack(); 1186 gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150); 1187 Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack); 1188 gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100); 1189 Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack); 1190 gfx::Rect panel3_initial_bounds = gfx::Rect(0, 0, 250, 120); 1191 Panel* panel3 = CreateStackedPanel("3", panel3_initial_bounds, stack); 1192 ASSERT_EQ(3, panel_manager->num_panels()); 1193 ASSERT_EQ(1, panel_manager->num_stacks()); 1194 ASSERT_EQ(3, stack->num_panels()); 1195 1196 gfx::Rect panel1_expected_bounds(panel1_initial_bounds); 1197 EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds()); 1198 gfx::Rect panel2_expected_bounds(panel1_expected_bounds.x(), 1199 panel1_expected_bounds.bottom(), 1200 panel1_expected_bounds.width(), 1201 panel2_initial_bounds.height()); 1202 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 1203 gfx::Rect panel3_expected_bounds(panel2_expected_bounds.x(), 1204 panel2_expected_bounds.bottom(), 1205 panel2_expected_bounds.width(), 1206 panel3_initial_bounds.height()); 1207 EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds()); 1208 1209 // Close P1. Expect that P2 and P3 should move up. 1210 CloseWindowAndWait(panel1); 1211 WaitForBoundsAnimationFinished(panel2); 1212 WaitForBoundsAnimationFinished(panel3); 1213 ASSERT_EQ(2, panel_manager->num_panels()); 1214 ASSERT_EQ(1, panel_manager->num_stacks()); 1215 ASSERT_EQ(2, stack->num_panels()); 1216 EXPECT_EQ(PanelCollection::STACKED, panel2->collection()->type()); 1217 EXPECT_EQ(PanelCollection::STACKED, panel3->collection()->type()); 1218 1219 panel2_expected_bounds.set_y(panel1_expected_bounds.y()); 1220 EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds()); 1221 panel3_expected_bounds.set_y(panel2_expected_bounds.bottom()); 1222 EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds()); 1223 1224 // Close P2. Expect that P3 should become detached and move up. 1225 CloseWindowAndWait(panel2); 1226 WaitForBoundsAnimationFinished(panel3); 1227 ASSERT_EQ(1, panel_manager->num_panels()); 1228 ASSERT_EQ(0, panel_manager->num_stacks()); 1229 EXPECT_EQ(PanelCollection::DETACHED, panel3->collection()->type()); 1230 1231 panel3_expected_bounds.set_y(panel2_expected_bounds.y()); 1232 EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds()); 1233 1234 panel_manager->CloseAll(); 1235 } 1236 1237 // Skip the test since active state might not be fully supported for some window 1238 // managers. 1239 #if defined(OS_MACOSX) 1240 #define MAYBE_FocusNextPanelOnPanelClose DISABLED_FocusNextPanelOnPanelClose 1241 #else 1242 #define MAYBE_FocusNextPanelOnPanelClose FocusNextPanelOnPanelClose 1243 #endif 1244 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 1245 MAYBE_FocusNextPanelOnPanelClose) { 1246 PanelManager* panel_manager = PanelManager::GetInstance(); 1247 1248 // Create 3 stacked panels. 1249 StackedPanelCollection* stack = panel_manager->CreateStack(); 1250 Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 50, 200, 200), stack); 1251 Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack); 1252 Panel* panel3 = CreateStackedPanel("3", gfx::Rect(0, 0, 150, 120), stack); 1253 ASSERT_EQ(3, stack->num_panels()); 1254 ASSERT_FALSE(panel1->IsActive()); 1255 ASSERT_FALSE(panel2->IsActive()); 1256 ASSERT_TRUE(panel3->IsActive()); 1257 1258 // Close P3. Expect P2 should become active. 1259 CloseWindowAndWait(panel3); 1260 EXPECT_FALSE(panel1->IsActive()); 1261 EXPECT_TRUE(panel2->IsActive()); 1262 1263 // Close P2. Expect P1 should become active. 1264 CloseWindowAndWait(panel2); 1265 EXPECT_TRUE(panel1->IsActive()); 1266 1267 panel_manager->CloseAll(); 1268 } 1269 1270 // Skip the test since active state might not be fully supported for some window 1271 // managers. 1272 #if defined(OS_MACOSX) 1273 #define MAYBE_FocusNextUnminimizedPanelOnPanelClose \ 1274 DISABLED_FocusNextUnminimizedPanelOnPanelClose 1275 #else 1276 #define MAYBE_FocusNextUnminimizedPanelOnPanelClose \ 1277 FocusNextUnminimizedPanelOnPanelClose 1278 #endif 1279 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 1280 MAYBE_FocusNextUnminimizedPanelOnPanelClose) { 1281 PanelManager* panel_manager = PanelManager::GetInstance(); 1282 1283 // Create 3 stacked panels. 1284 StackedPanelCollection* stack = panel_manager->CreateStack(); 1285 Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 50, 200, 200), stack); 1286 Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack); 1287 Panel* panel3 = CreateStackedPanel("3", gfx::Rect(0, 0, 150, 120), stack); 1288 ASSERT_EQ(3, stack->num_panels()); 1289 ASSERT_FALSE(panel1->IsActive()); 1290 ASSERT_FALSE(panel2->IsActive()); 1291 ASSERT_TRUE(panel3->IsActive()); 1292 1293 // Minimize P2. 1294 panel2->Minimize(); 1295 WaitForBoundsAnimationFinished(panel2); 1296 1297 // Close P3. Expect P1, not P2, should become active. 1298 CloseWindowAndWait(panel3); 1299 EXPECT_TRUE(panel1->IsActive()); 1300 EXPECT_FALSE(panel2->IsActive()); 1301 1302 panel_manager->CloseAll(); 1303 } 1304 1305 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 1306 ExpandCollapsedTopPanelOnBottomPanelClose) { 1307 PanelManager* panel_manager = PanelManager::GetInstance(); 1308 1309 // Create 2 stacked panels. 1310 StackedPanelCollection* stack = panel_manager->CreateStack(); 1311 gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150); 1312 Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack); 1313 gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100); 1314 Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack); 1315 ASSERT_EQ(2, panel_manager->num_panels()); 1316 ASSERT_EQ(1, panel_manager->num_stacks()); 1317 ASSERT_EQ(2, stack->num_panels()); 1318 1319 // Collapse top panel. 1320 int original_panel1_height = panel1->GetBounds().height(); 1321 panel1->Minimize(); 1322 WaitForBoundsAnimationFinished(panel2); 1323 EXPECT_TRUE(panel1->IsMinimized()); 1324 EXPECT_FALSE(panel2->IsMinimized()); 1325 1326 // Close bottom panel. Expect that top panel should become detached and 1327 // expanded. 1328 CloseWindowAndWait(panel2); 1329 WaitForBoundsAnimationFinished(panel1); 1330 EXPECT_EQ(1, panel_manager->num_panels()); 1331 EXPECT_EQ(0, panel_manager->num_stacks()); 1332 EXPECT_EQ(PanelCollection::DETACHED, panel1->collection()->type()); 1333 EXPECT_FALSE(panel1->IsMinimized()); 1334 EXPECT_EQ(Panel::EXPANDED, panel1->expansion_state()); 1335 EXPECT_EQ(original_panel1_height, panel1->GetBounds().height()); 1336 1337 panel_manager->CloseAll(); 1338 } 1339 1340 // The activation waiting logic does not work well on MacOSX. Disabled for now. 1341 #if defined(OS_MACOSX) 1342 #define MAYBE_FocusCollapsedStackedPanel DISABLED_FocusCollapsedStackedPanel 1343 #else 1344 #define MAYBE_FocusCollapsedStackedPanel FocusCollapsedStackedPanel 1345 #endif 1346 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 1347 MAYBE_FocusCollapsedStackedPanel) { 1348 PanelManager* panel_manager = PanelManager::GetInstance(); 1349 1350 // Create 2 stacked panels. 1351 StackedPanelCollection* stack = panel_manager->CreateStack(); 1352 gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150); 1353 CreateStackedPanel("1", panel1_initial_bounds, stack); 1354 gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100); 1355 Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack); 1356 ASSERT_EQ(2, panel_manager->num_panels()); 1357 ASSERT_EQ(1, panel_manager->num_stacks()); 1358 ASSERT_EQ(2, stack->num_panels()); 1359 1360 // Collapse a panel. 1361 panel2->Minimize(); 1362 WaitForBoundsAnimationFinished(panel2); 1363 EXPECT_TRUE(panel2->IsMinimized()); 1364 EXPECT_FALSE(panel2->IsActive()); 1365 1366 // Focus the panel. Expect the panel is expanded. 1367 panel2->Activate(); 1368 WaitForPanelActiveState(panel2, SHOW_AS_ACTIVE); 1369 EXPECT_FALSE(panel2->IsMinimized()); 1370 1371 panel_manager->CloseAll(); 1372 } 1373 1374 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 1375 UpdateStackedPanelsOnPrimaryDisplayChange) { 1376 PanelManager* panel_manager = PanelManager::GetInstance(); 1377 1378 // Create one stack with 5 panels. 1379 StackedPanelCollection* stack = panel_manager->CreateStack(); 1380 Panel* panel1 = CreateStackedPanel("1", gfx::Rect(50, 50, 700, 100), stack); 1381 Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 100, 100), stack); 1382 Panel* panel3 = CreateStackedPanel("3", gfx::Rect(0, 0, 100, 100), stack); 1383 Panel* panel4 = CreateStackedPanel("4", gfx::Rect(0, 0, 100, 100), stack); 1384 Panel* panel5 = CreateStackedPanel("5", gfx::Rect(0, 0, 100, 100), stack); 1385 ASSERT_EQ(5, panel_manager->num_panels()); 1386 ASSERT_EQ(1, panel_manager->num_stacks()); 1387 ASSERT_EQ(5, stack->num_panels()); 1388 1389 // Make the primary display smaller. 1390 // Expect that all panels except P5 should be collapsed and their bounds 1391 // should be updated. 1392 int new_primary_area_width = 500; 1393 gfx::Rect primary_display_area(0, 0, new_primary_area_width, 300); 1394 gfx::Rect primary_work_area(0, 0, new_primary_area_width, 280); 1395 mock_display_settings_provider()->SetPrimaryDisplay( 1396 primary_display_area, primary_work_area); 1397 WaitForBoundsAnimationFinished(panel1); 1398 WaitForBoundsAnimationFinished(panel2); 1399 WaitForBoundsAnimationFinished(panel3); 1400 WaitForBoundsAnimationFinished(panel4); 1401 WaitForBoundsAnimationFinished(panel5); 1402 1403 EXPECT_TRUE(panel1->IsMinimized()); 1404 EXPECT_TRUE(panel2->IsMinimized()); 1405 EXPECT_TRUE(panel3->IsMinimized()); 1406 EXPECT_TRUE(panel4->IsMinimized()); 1407 EXPECT_FALSE(panel5->IsMinimized()); 1408 1409 gfx::Rect bounds1 = panel1->GetBounds(); 1410 EXPECT_EQ(primary_work_area.x(), bounds1.x()); 1411 EXPECT_LE(bounds1.x(), primary_work_area.right()); 1412 EXPECT_LE(primary_work_area.y(), bounds1.y()); 1413 EXPECT_EQ(new_primary_area_width, bounds1.width()); 1414 1415 gfx::Rect bounds2 = panel2->GetBounds(); 1416 EXPECT_EQ(bounds1.x(), bounds2.x()); 1417 EXPECT_EQ(bounds1.width(), bounds2.width()); 1418 EXPECT_EQ(bounds1.bottom(), bounds2.y()); 1419 1420 gfx::Rect bounds3 = panel3->GetBounds(); 1421 EXPECT_EQ(bounds2.x(), bounds3.x()); 1422 EXPECT_EQ(bounds2.width(), bounds3.width()); 1423 EXPECT_EQ(bounds2.bottom(), bounds3.y()); 1424 1425 gfx::Rect bounds4 = panel4->GetBounds(); 1426 EXPECT_EQ(bounds3.x(), bounds4.x()); 1427 EXPECT_EQ(bounds3.width(), bounds4.width()); 1428 EXPECT_EQ(bounds3.bottom(), bounds4.y()); 1429 1430 gfx::Rect bounds5 = panel5->GetBounds(); 1431 EXPECT_EQ(bounds4.x(), bounds5.x()); 1432 EXPECT_EQ(bounds4.width(), bounds5.width()); 1433 EXPECT_EQ(bounds4.bottom(), bounds5.y()); 1434 EXPECT_LE(bounds5.bottom(), primary_work_area.bottom()); 1435 1436 panel_manager->CloseAll(); 1437 } 1438 1439 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, 1440 KeepShowingStackedPanelCreatedBeforeFullScreenMode) { 1441 PanelManager* panel_manager = PanelManager::GetInstance(); 1442 1443 // Create 2 stacked panels. 1444 StackedPanelCollection* stack = panel_manager->CreateStack(); 1445 Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 50, 200, 150), stack); 1446 Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack); 1447 scoped_ptr<NativePanelTesting> panel1_testing( 1448 CreateNativePanelTesting(panel1)); 1449 scoped_ptr<NativePanelTesting> panel2_testing( 1450 CreateNativePanelTesting(panel2)); 1451 1452 // Panels should be visible at first. 1453 EXPECT_TRUE(panel1_testing->IsWindowVisible()); 1454 EXPECT_TRUE(panel2_testing->IsWindowVisible()); 1455 1456 // Panels' visibility should not be affected when entering full-screen mode. 1457 mock_display_settings_provider()->EnableFullScreenMode(true); 1458 EXPECT_TRUE(panel1_testing->IsWindowVisible()); 1459 EXPECT_TRUE(panel2_testing->IsWindowVisible()); 1460 1461 // Panels' visibility should not be affected when leaving full-screen mode. 1462 mock_display_settings_provider()->EnableFullScreenMode(false); 1463 EXPECT_TRUE(panel1_testing->IsWindowVisible()); 1464 EXPECT_TRUE(panel2_testing->IsWindowVisible()); 1465 1466 panel_manager->CloseAll(); 1467 } 1468