- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / panels / stacked_panel_browsertest.cc
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   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 // Skip the test since system-minimize might not be supported for some window
1120 // managers on Linux.
1121 #if defined(TOOLKIT_GTK)
1122 #define MAYBE_AddNewPanelNotWithSystemMinimizedDetachedPanel \
1123     DISABLED_AddNewPanelNotWithSystemMinimizedDetachedPanel
1124 #else
1125 #define MAYBE_AddNewPanelNotWithSystemMinimizedDetachedPanel \
1126     AddNewPanelNotWithSystemMinimizedDetachedPanel
1127 #endif
1128 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest,
1129                        MAYBE_AddNewPanelNotWithSystemMinimizedDetachedPanel) {
1130   PanelManager* panel_manager = PanelManager::GetInstance();
1131
1132   // Create 1 detached panel.
1133   Panel* panel1 = CreateDetachedPanel("1", gfx::Rect(200, 50, 250, 150));
1134   EXPECT_EQ(1, panel_manager->num_panels());
1135   EXPECT_EQ(0, panel_manager->num_stacks());
1136   EXPECT_EQ(1, panel_manager->detached_collection()->num_panels());
1137   EXPECT_EQ(PanelCollection::DETACHED, panel1->collection()->type());
1138
1139   // Minimize the detached panel by system.
1140   panel1->OnMinimizeButtonClicked(panel::NO_MODIFIER);
1141
1142   // Create new panel. Expect that new panel will open as a separate detached
1143   // panel, instead of being grouped with the system-minimized detached panel.
1144   CreatePanelParams params("N", gfx::Rect(50, 50, 150, 100), SHOW_AS_ACTIVE);
1145   params.create_mode = PanelManager::CREATE_AS_DETACHED;
1146   Panel* new_panel = CreatePanelWithParams(params);
1147   EXPECT_EQ(2, panel_manager->num_panels());
1148   EXPECT_EQ(2, panel_manager->detached_collection()->num_panels());
1149   EXPECT_EQ(0, panel_manager->num_stacks());
1150   EXPECT_EQ(PanelCollection::DETACHED, panel1->collection()->type());
1151   EXPECT_EQ(PanelCollection::DETACHED, new_panel->collection()->type());
1152
1153   panel_manager->CloseAll();
1154 }
1155
1156 // Skip the test since system-minimize might not be supported for some window
1157 // managers on Linux.
1158 #if defined(TOOLKIT_GTK)
1159 #define MAYBE_AddNewPanelNotWithSystemMinimizedStack \
1160     DISABLED_AddNewPanelNotWithSystemMinimizedStack
1161 #else
1162 #define MAYBE_AddNewPanelNotWithSystemMinimizedStack \
1163     AddNewPanelNotWithSystemMinimizedStack
1164 #endif
1165 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest,
1166                        MAYBE_AddNewPanelNotWithSystemMinimizedStack) {
1167   PanelManager* panel_manager = PanelManager::GetInstance();
1168
1169   // Create one stack with 2 panels.
1170   StackedPanelCollection* stack = panel_manager->CreateStack();
1171   Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 90, 200, 150), stack);
1172   Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack);
1173   EXPECT_EQ(2, panel_manager->num_panels());
1174   EXPECT_EQ(0, panel_manager->detached_collection()->num_panels());
1175   EXPECT_EQ(1, panel_manager->num_stacks());
1176   EXPECT_EQ(2, stack->num_panels());
1177   EXPECT_EQ(PanelCollection::STACKED, panel1->collection()->type());
1178   EXPECT_EQ(PanelCollection::STACKED, panel2->collection()->type());
1179
1180   // Minimize the stack by system.
1181   stack->OnMinimizeButtonClicked(panel1, panel::NO_MODIFIER);
1182
1183   // Create new panel. Expect that new panel will open as a separate detached
1184   // panel, instead of appending to the system-minimized stack.
1185   CreatePanelParams params("N", gfx::Rect(50, 50, 150, 100), SHOW_AS_ACTIVE);
1186   params.create_mode = PanelManager::CREATE_AS_DETACHED;
1187   Panel* new_panel = CreatePanelWithParams(params);
1188   EXPECT_EQ(3, panel_manager->num_panels());
1189   EXPECT_EQ(1, panel_manager->detached_collection()->num_panels());
1190   EXPECT_EQ(1, panel_manager->num_stacks());
1191   EXPECT_EQ(2, stack->num_panels());
1192   EXPECT_EQ(PanelCollection::STACKED, panel1->collection()->type());
1193   EXPECT_EQ(PanelCollection::STACKED, panel2->collection()->type());
1194   EXPECT_EQ(PanelCollection::DETACHED, new_panel->collection()->type());
1195
1196   panel_manager->CloseAll();
1197 }
1198
1199 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest, ClosePanels) {
1200   PanelManager* panel_manager = PanelManager::GetInstance();
1201
1202   // Create 3 stacked panels.
1203   StackedPanelCollection* stack = panel_manager->CreateStack();
1204   gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150);
1205   Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack);
1206   gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100);
1207   Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack);
1208   gfx::Rect panel3_initial_bounds = gfx::Rect(0, 0, 250, 120);
1209   Panel* panel3 = CreateStackedPanel("3", panel3_initial_bounds, stack);
1210   ASSERT_EQ(3, panel_manager->num_panels());
1211   ASSERT_EQ(1, panel_manager->num_stacks());
1212   ASSERT_EQ(3, stack->num_panels());
1213
1214   gfx::Rect panel1_expected_bounds(panel1_initial_bounds);
1215   EXPECT_EQ(panel1_expected_bounds, panel1->GetBounds());
1216   gfx::Rect panel2_expected_bounds(panel1_expected_bounds.x(),
1217                                    panel1_expected_bounds.bottom(),
1218                                    panel1_expected_bounds.width(),
1219                                    panel2_initial_bounds.height());
1220   EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds());
1221   gfx::Rect panel3_expected_bounds(panel2_expected_bounds.x(),
1222                                    panel2_expected_bounds.bottom(),
1223                                    panel2_expected_bounds.width(),
1224                                    panel3_initial_bounds.height());
1225   EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds());
1226
1227   // Close P1. Expect that P2 and P3 should move up.
1228   CloseWindowAndWait(panel1);
1229   WaitForBoundsAnimationFinished(panel2);
1230   WaitForBoundsAnimationFinished(panel3);
1231   ASSERT_EQ(2, panel_manager->num_panels());
1232   ASSERT_EQ(1, panel_manager->num_stacks());
1233   ASSERT_EQ(2, stack->num_panels());
1234   EXPECT_EQ(PanelCollection::STACKED, panel2->collection()->type());
1235   EXPECT_EQ(PanelCollection::STACKED, panel3->collection()->type());
1236
1237   panel2_expected_bounds.set_y(panel1_expected_bounds.y());
1238   EXPECT_EQ(panel2_expected_bounds, panel2->GetBounds());
1239   panel3_expected_bounds.set_y(panel2_expected_bounds.bottom());
1240   EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds());
1241
1242   // Close P2. Expect that P3 should become detached and move up.
1243   CloseWindowAndWait(panel2);
1244   WaitForBoundsAnimationFinished(panel3);
1245   ASSERT_EQ(1, panel_manager->num_panels());
1246   ASSERT_EQ(0, panel_manager->num_stacks());
1247   EXPECT_EQ(PanelCollection::DETACHED, panel3->collection()->type());
1248
1249   panel3_expected_bounds.set_y(panel2_expected_bounds.y());
1250   EXPECT_EQ(panel3_expected_bounds, panel3->GetBounds());
1251
1252   panel_manager->CloseAll();
1253 }
1254
1255 // Skip the test since active state might not be fully supported for some window
1256 // managers.
1257 #if defined(TOOLKIT_GTK) || defined(OS_MACOSX)
1258 #define MAYBE_FocusNextPanelOnPanelClose DISABLED_FocusNextPanelOnPanelClose
1259 #else
1260 #define MAYBE_FocusNextPanelOnPanelClose FocusNextPanelOnPanelClose
1261 #endif
1262 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest,
1263                        MAYBE_FocusNextPanelOnPanelClose) {
1264   PanelManager* panel_manager = PanelManager::GetInstance();
1265
1266   // Create 3 stacked panels.
1267   StackedPanelCollection* stack = panel_manager->CreateStack();
1268   Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 50, 200, 200), stack);
1269   Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack);
1270   Panel* panel3 = CreateStackedPanel("3", gfx::Rect(0, 0, 150, 120), stack);
1271   ASSERT_EQ(3, stack->num_panels());
1272   ASSERT_FALSE(panel1->IsActive());
1273   ASSERT_FALSE(panel2->IsActive());
1274   ASSERT_TRUE(panel3->IsActive());
1275
1276   // Close P3. Expect P2 should become active.
1277   CloseWindowAndWait(panel3);
1278   EXPECT_FALSE(panel1->IsActive());
1279   EXPECT_TRUE(panel2->IsActive());
1280
1281   // Close P2. Expect P1 should become active.
1282   CloseWindowAndWait(panel2);
1283   EXPECT_TRUE(panel1->IsActive());
1284
1285   panel_manager->CloseAll();
1286 }
1287
1288 // Skip the test since active state might not be fully supported for some window
1289 // managers.
1290 #if defined(TOOLKIT_GTK) || defined(OS_MACOSX)
1291 #define MAYBE_FocusNextUnminimizedPanelOnPanelClose \
1292     DISABLED_FocusNextUnminimizedPanelOnPanelClose
1293 #else
1294 #define MAYBE_FocusNextUnminimizedPanelOnPanelClose \
1295     FocusNextUnminimizedPanelOnPanelClose
1296 #endif
1297 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest,
1298                        MAYBE_FocusNextUnminimizedPanelOnPanelClose) {
1299   PanelManager* panel_manager = PanelManager::GetInstance();
1300
1301   // Create 3 stacked panels.
1302   StackedPanelCollection* stack = panel_manager->CreateStack();
1303   Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 50, 200, 200), stack);
1304   Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack);
1305   Panel* panel3 = CreateStackedPanel("3", gfx::Rect(0, 0, 150, 120), stack);
1306   ASSERT_EQ(3, stack->num_panels());
1307   ASSERT_FALSE(panel1->IsActive());
1308   ASSERT_FALSE(panel2->IsActive());
1309   ASSERT_TRUE(panel3->IsActive());
1310
1311   // Minimize P2.
1312   panel2->Minimize();
1313   WaitForBoundsAnimationFinished(panel2);
1314
1315   // Close P3. Expect P1, not P2, should become active.
1316   CloseWindowAndWait(panel3);
1317   EXPECT_TRUE(panel1->IsActive());
1318   EXPECT_FALSE(panel2->IsActive());
1319
1320   panel_manager->CloseAll();
1321 }
1322
1323 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest,
1324                        ExpandCollapsedTopPanelOnBottomPanelClose) {
1325   PanelManager* panel_manager = PanelManager::GetInstance();
1326
1327   // Create 2 stacked panels.
1328   StackedPanelCollection* stack = panel_manager->CreateStack();
1329   gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150);
1330   Panel* panel1 = CreateStackedPanel("1", panel1_initial_bounds, stack);
1331   gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100);
1332   Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack);
1333   ASSERT_EQ(2, panel_manager->num_panels());
1334   ASSERT_EQ(1, panel_manager->num_stacks());
1335   ASSERT_EQ(2, stack->num_panels());
1336
1337   // Collapse top panel.
1338   int original_panel1_height = panel1->GetBounds().height();
1339   panel1->Minimize();
1340   WaitForBoundsAnimationFinished(panel2);
1341   EXPECT_TRUE(panel1->IsMinimized());
1342   EXPECT_FALSE(panel2->IsMinimized());
1343
1344   // Close bottom panel. Expect that top panel should become detached and
1345   // expanded.
1346   CloseWindowAndWait(panel2);
1347   WaitForBoundsAnimationFinished(panel1);
1348   EXPECT_EQ(1, panel_manager->num_panels());
1349   EXPECT_EQ(0, panel_manager->num_stacks());
1350   EXPECT_EQ(PanelCollection::DETACHED, panel1->collection()->type());
1351   EXPECT_FALSE(panel1->IsMinimized());
1352   EXPECT_EQ(Panel::EXPANDED, panel1->expansion_state());
1353   EXPECT_EQ(original_panel1_height, panel1->GetBounds().height());
1354
1355   panel_manager->CloseAll();
1356 }
1357
1358 // The activation waiting logic does not work well on MacOSX. Disabled for now.
1359 #if defined(OS_MACOSX)
1360 #define MAYBE_FocusCollapsedStackedPanel DISABLED_FocusCollapsedStackedPanel
1361 #else
1362 #define MAYBE_FocusCollapsedStackedPanel FocusCollapsedStackedPanel
1363 #endif
1364 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest,
1365                        MAYBE_FocusCollapsedStackedPanel) {
1366   PanelManager* panel_manager = PanelManager::GetInstance();
1367
1368   // Create 2 stacked panels.
1369   StackedPanelCollection* stack = panel_manager->CreateStack();
1370   gfx::Rect panel1_initial_bounds = gfx::Rect(100, 50, 200, 150);
1371   CreateStackedPanel("1", panel1_initial_bounds, stack);
1372   gfx::Rect panel2_initial_bounds = gfx::Rect(0, 0, 150, 100);
1373   Panel* panel2 = CreateStackedPanel("2", panel2_initial_bounds, stack);
1374   ASSERT_EQ(2, panel_manager->num_panels());
1375   ASSERT_EQ(1, panel_manager->num_stacks());
1376   ASSERT_EQ(2, stack->num_panels());
1377
1378   // Collapse a panel.
1379   panel2->Minimize();
1380   WaitForBoundsAnimationFinished(panel2);
1381   EXPECT_TRUE(panel2->IsMinimized());
1382   EXPECT_FALSE(panel2->IsActive());
1383
1384   // Focus the panel. Expect the panel is expanded.
1385   panel2->Activate();
1386   WaitForPanelActiveState(panel2, SHOW_AS_ACTIVE);
1387   EXPECT_FALSE(panel2->IsMinimized());
1388
1389   panel_manager->CloseAll();
1390 }
1391
1392 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest,
1393                        UpdateStackedPanelsOnPrimaryDisplayChange) {
1394   PanelManager* panel_manager = PanelManager::GetInstance();
1395
1396   // Create one stack with 5 panels.
1397   StackedPanelCollection* stack = panel_manager->CreateStack();
1398   Panel* panel1 = CreateStackedPanel("1", gfx::Rect(50, 50, 700, 100), stack);
1399   Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 100, 100), stack);
1400   Panel* panel3 = CreateStackedPanel("3", gfx::Rect(0, 0, 100, 100), stack);
1401   Panel* panel4 = CreateStackedPanel("4", gfx::Rect(0, 0, 100, 100), stack);
1402   Panel* panel5 = CreateStackedPanel("5", gfx::Rect(0, 0, 100, 100), stack);
1403   ASSERT_EQ(5, panel_manager->num_panels());
1404   ASSERT_EQ(1, panel_manager->num_stacks());
1405   ASSERT_EQ(5, stack->num_panels());
1406
1407   // Make the primary display smaller.
1408   // Expect that all panels except P5 should be collapsed and their bounds
1409   // should be updated.
1410   int new_primary_area_width = 500;
1411   gfx::Rect primary_display_area(0, 0, new_primary_area_width, 300);
1412   gfx::Rect primary_work_area(0, 0, new_primary_area_width, 280);
1413   mock_display_settings_provider()->SetPrimaryDisplay(
1414       primary_display_area, primary_work_area);
1415   WaitForBoundsAnimationFinished(panel1);
1416   WaitForBoundsAnimationFinished(panel2);
1417   WaitForBoundsAnimationFinished(panel3);
1418   WaitForBoundsAnimationFinished(panel4);
1419   WaitForBoundsAnimationFinished(panel5);
1420
1421   EXPECT_TRUE(panel1->IsMinimized());
1422   EXPECT_TRUE(panel2->IsMinimized());
1423   EXPECT_TRUE(panel3->IsMinimized());
1424   EXPECT_TRUE(panel4->IsMinimized());
1425   EXPECT_FALSE(panel5->IsMinimized());
1426
1427   gfx::Rect bounds1 = panel1->GetBounds();
1428   EXPECT_EQ(primary_work_area.x(), bounds1.x());
1429   EXPECT_LE(bounds1.x(), primary_work_area.right());
1430   EXPECT_LE(primary_work_area.y(), bounds1.y());
1431   EXPECT_EQ(new_primary_area_width, bounds1.width());
1432
1433   gfx::Rect bounds2 = panel2->GetBounds();
1434   EXPECT_EQ(bounds1.x(), bounds2.x());
1435   EXPECT_EQ(bounds1.width(), bounds2.width());
1436   EXPECT_EQ(bounds1.bottom(), bounds2.y());
1437
1438   gfx::Rect bounds3 = panel3->GetBounds();
1439   EXPECT_EQ(bounds2.x(), bounds3.x());
1440   EXPECT_EQ(bounds2.width(), bounds3.width());
1441   EXPECT_EQ(bounds2.bottom(), bounds3.y());
1442
1443   gfx::Rect bounds4 = panel4->GetBounds();
1444   EXPECT_EQ(bounds3.x(), bounds4.x());
1445   EXPECT_EQ(bounds3.width(), bounds4.width());
1446   EXPECT_EQ(bounds3.bottom(), bounds4.y());
1447
1448   gfx::Rect bounds5 = panel5->GetBounds();
1449   EXPECT_EQ(bounds4.x(), bounds5.x());
1450   EXPECT_EQ(bounds4.width(), bounds5.width());
1451   EXPECT_EQ(bounds4.bottom(), bounds5.y());
1452   EXPECT_LE(bounds5.bottom(), primary_work_area.bottom());
1453
1454   panel_manager->CloseAll();
1455 }
1456
1457 IN_PROC_BROWSER_TEST_F(StackedPanelBrowserTest,
1458                        KeepShowingStackedPanelCreatedBeforeFullScreenMode) {
1459   PanelManager* panel_manager = PanelManager::GetInstance();
1460
1461   // Create 2 stacked panels.
1462   StackedPanelCollection* stack = panel_manager->CreateStack();
1463   Panel* panel1 = CreateStackedPanel("1", gfx::Rect(100, 50, 200, 150), stack);
1464   Panel* panel2 = CreateStackedPanel("2", gfx::Rect(0, 0, 150, 100), stack);
1465   scoped_ptr<NativePanelTesting> panel1_testing(
1466       CreateNativePanelTesting(panel1));
1467   scoped_ptr<NativePanelTesting> panel2_testing(
1468       CreateNativePanelTesting(panel2));
1469
1470   // Panels should be visible at first.
1471   EXPECT_TRUE(panel1_testing->IsWindowVisible());
1472   EXPECT_TRUE(panel2_testing->IsWindowVisible());
1473
1474  // Panels' visibility should not be affected when entering full-screen mode.
1475   mock_display_settings_provider()->EnableFullScreenMode(true);
1476   EXPECT_TRUE(panel1_testing->IsWindowVisible());
1477   EXPECT_TRUE(panel2_testing->IsWindowVisible());
1478
1479   // Panels' visibility should not be affected when leaving full-screen mode.
1480   mock_display_settings_provider()->EnableFullScreenMode(false);
1481   EXPECT_TRUE(panel1_testing->IsWindowVisible());
1482   EXPECT_TRUE(panel2_testing->IsWindowVisible());
1483
1484   panel_manager->CloseAll();
1485 }