1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/message_loop/message_loop.h"
6 #include "chrome/browser/chrome_notification_types.h"
7 #include "chrome/browser/ui/panels/base_panel_browser_test.h"
8 #include "chrome/browser/ui/panels/docked_panel_collection.h"
9 #include "chrome/browser/ui/panels/panel.h"
10 #include "chrome/browser/ui/panels/panel_manager.h"
11 #include "chrome/browser/ui/panels/test_panel_collection_squeeze_observer.h"
12 #include "content/public/browser/notification_service.h"
13 #include "content/public/test/test_utils.h"
15 class DockedPanelBrowserTest
: public BasePanelBrowserTest
{
17 virtual void SetUpOnMainThread() OVERRIDE
{
18 BasePanelBrowserTest::SetUpOnMainThread();
20 // All the tests here assume using mocked 800x600 display area for the
21 // primary monitor. Do the check now.
22 gfx::Rect primary_display_area
= PanelManager::GetInstance()->
23 display_settings_provider()->GetPrimaryDisplayArea();
24 DCHECK(primary_display_area
.width() == 800);
25 DCHECK(primary_display_area
.height() == 600);
29 // http://crbug.com/143247
31 #define MAYBE_SqueezePanelsInDock DISABLED_SqueezePanelsInDock
33 #define MAYBE_SqueezePanelsInDock SqueezePanelsInDock
35 IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest
, MAYBE_SqueezePanelsInDock
) {
36 PanelManager
* panel_manager
= PanelManager::GetInstance();
37 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
39 // Create some docked panels.
40 Panel
* panel1
= CreateInactiveDockedPanel("1", gfx::Rect(0, 0, 200, 100));
41 Panel
* panel2
= CreateInactiveDockedPanel("2", gfx::Rect(0, 0, 200, 100));
42 Panel
* panel3
= CreateInactiveDockedPanel("3", gfx::Rect(0, 0, 200, 100));
43 ASSERT_EQ(3, docked_collection
->num_panels());
45 // Check that nothing has been squeezed so far.
46 EXPECT_EQ(panel1
->GetBounds().width(), panel1
->GetRestoredBounds().width());
47 EXPECT_EQ(panel2
->GetBounds().width(), panel2
->GetRestoredBounds().width());
48 EXPECT_EQ(panel3
->GetBounds().width(), panel3
->GetRestoredBounds().width());
50 // Create more panels so they start getting squeezed.
51 Panel
* panel4
= CreateInactiveDockedPanel("4", gfx::Rect(0, 0, 200, 100));
52 Panel
* panel5
= CreateInactiveDockedPanel("5", gfx::Rect(0, 0, 200, 100));
53 Panel
* panel6
= CreateInactiveDockedPanel("6", gfx::Rect(0, 0, 200, 100));
54 Panel
* panel7
= CreateDockedPanel("7", gfx::Rect(0, 0, 200, 100));
56 // Wait for active states to settle.
57 PanelCollectionSqueezeObserver
panel7_settled(docked_collection
, panel7
);
58 panel7_settled
.Wait();
60 // The active panel should be at full width.
61 EXPECT_EQ(panel7
->GetBounds().width(), panel7
->GetRestoredBounds().width());
62 EXPECT_GT(panel7
->GetBounds().x(), docked_collection
->work_area().x());
64 // The rest of them should be at reduced width.
65 EXPECT_LT(panel1
->GetBounds().width(), panel1
->GetRestoredBounds().width());
66 EXPECT_LT(panel2
->GetBounds().width(), panel2
->GetRestoredBounds().width());
67 EXPECT_LT(panel3
->GetBounds().width(), panel3
->GetRestoredBounds().width());
68 EXPECT_LT(panel4
->GetBounds().width(), panel4
->GetRestoredBounds().width());
69 EXPECT_LT(panel5
->GetBounds().width(), panel5
->GetRestoredBounds().width());
70 EXPECT_LT(panel6
->GetBounds().width(), panel6
->GetRestoredBounds().width());
72 // Activate a different panel.
73 ActivatePanel(panel2
);
74 WaitForPanelActiveState(panel2
, SHOW_AS_ACTIVE
);
76 // Wait for active states to settle.
77 PanelCollectionSqueezeObserver
panel2_settled(docked_collection
, panel2
);
78 panel2_settled
.Wait();
80 // The active panel should be at full width.
81 EXPECT_EQ(panel2
->GetBounds().width(), panel2
->GetRestoredBounds().width());
83 // The rest of them should be at reduced width.
84 EXPECT_LT(panel1
->GetBounds().width(), panel1
->GetRestoredBounds().width());
85 EXPECT_LT(panel3
->GetBounds().width(), panel3
->GetRestoredBounds().width());
86 EXPECT_LT(panel4
->GetBounds().width(), panel4
->GetRestoredBounds().width());
87 EXPECT_LT(panel5
->GetBounds().width(), panel5
->GetRestoredBounds().width());
88 EXPECT_LT(panel6
->GetBounds().width(), panel6
->GetRestoredBounds().width());
89 EXPECT_LT(panel7
->GetBounds().width(), panel7
->GetRestoredBounds().width());
91 panel_manager
->CloseAll();
94 IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest
, SqueezeAndThenSomeMore
) {
95 PanelManager
* panel_manager
= PanelManager::GetInstance();
96 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
98 // Create enough docked panels to get into squeezing.
99 Panel
* panel1
= CreateInactiveDockedPanel("1", gfx::Rect(0, 0, 200, 100));
100 Panel
* panel2
= CreateInactiveDockedPanel("2", gfx::Rect(0, 0, 200, 100));
101 Panel
* panel3
= CreateInactiveDockedPanel("3", gfx::Rect(0, 0, 200, 100));
102 Panel
* panel4
= CreateInactiveDockedPanel("4", gfx::Rect(0, 0, 200, 100));
103 Panel
* panel5
= CreateInactiveDockedPanel("5", gfx::Rect(0, 0, 200, 100));
104 Panel
* panel6
= CreateInactiveDockedPanel("6", gfx::Rect(0, 0, 200, 100));
106 // Wait for active states to settle.
107 PanelCollectionSqueezeObserver
panel6_settled(docked_collection
, panel6
);
108 panel6_settled
.Wait();
110 // Record current widths of some panels.
111 int panel_1_width_less_squeezed
= panel1
->GetBounds().width();
112 int panel_2_width_less_squeezed
= panel2
->GetBounds().width();
113 int panel_3_width_less_squeezed
= panel3
->GetBounds().width();
114 int panel_4_width_less_squeezed
= panel4
->GetBounds().width();
115 int panel_5_width_less_squeezed
= panel5
->GetBounds().width();
117 // These widths should be reduced.
118 EXPECT_LT(panel_1_width_less_squeezed
, panel1
->GetRestoredBounds().width());
119 EXPECT_LT(panel_2_width_less_squeezed
, panel2
->GetRestoredBounds().width());
120 EXPECT_LT(panel_3_width_less_squeezed
, panel3
->GetRestoredBounds().width());
121 EXPECT_LT(panel_4_width_less_squeezed
, panel4
->GetRestoredBounds().width());
122 EXPECT_LT(panel_5_width_less_squeezed
, panel5
->GetRestoredBounds().width());
124 Panel
* panel7
= CreateDockedPanel("7", gfx::Rect(0, 0, 200, 100));
126 // Wait for active states to settle.
127 PanelCollectionSqueezeObserver
panel7_settled(docked_collection
, panel7
);
128 panel7_settled
.Wait();
130 // The active panel should be at full width.
131 EXPECT_EQ(panel7
->GetBounds().width(), panel7
->GetRestoredBounds().width());
133 // The panels should shrink in width.
134 EXPECT_LT(panel1
->GetBounds().width(), panel_1_width_less_squeezed
);
135 EXPECT_LT(panel2
->GetBounds().width(), panel_2_width_less_squeezed
);
136 EXPECT_LT(panel3
->GetBounds().width(), panel_3_width_less_squeezed
);
137 EXPECT_LT(panel4
->GetBounds().width(), panel_4_width_less_squeezed
);
138 EXPECT_LT(panel5
->GetBounds().width(), panel_5_width_less_squeezed
);
140 panel_manager
->CloseAll();
143 IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest
, MinimizeSqueezedActive
) {
144 PanelManager
* panel_manager
= PanelManager::GetInstance();
145 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
147 // Create enough docked panels to get into squeezing.
148 Panel
* panel1
= CreateInactiveDockedPanel("1", gfx::Rect(0, 0, 200, 100));
149 Panel
* panel2
= CreateInactiveDockedPanel("2", gfx::Rect(0, 0, 200, 100));
150 Panel
* panel3
= CreateInactiveDockedPanel("3", gfx::Rect(0, 0, 200, 100));
151 Panel
* panel4
= CreateInactiveDockedPanel("4", gfx::Rect(0, 0, 200, 100));
152 Panel
* panel5
= CreateInactiveDockedPanel("5", gfx::Rect(0, 0, 200, 100));
153 Panel
* panel6
= CreateInactiveDockedPanel("6", gfx::Rect(0, 0, 200, 100));
154 Panel
* panel7
= CreateDockedPanel("7", gfx::Rect(0, 0, 200, 100));
156 // Wait for active states to settle.
157 PanelCollectionSqueezeObserver
panel7_settled(docked_collection
, panel7
);
158 panel7_settled
.Wait();
160 // The active panel should be at full width.
161 EXPECT_EQ(panel7
->GetBounds().width(), panel7
->GetRestoredBounds().width());
163 // The rest of them should be at reduced width.
164 EXPECT_LT(panel1
->GetBounds().width(), panel1
->GetRestoredBounds().width());
165 EXPECT_LT(panel2
->GetBounds().width(), panel2
->GetRestoredBounds().width());
166 EXPECT_LT(panel3
->GetBounds().width(), panel3
->GetRestoredBounds().width());
167 EXPECT_LT(panel4
->GetBounds().width(), panel4
->GetRestoredBounds().width());
168 EXPECT_LT(panel5
->GetBounds().width(), panel5
->GetRestoredBounds().width());
169 EXPECT_LT(panel6
->GetBounds().width(), panel6
->GetRestoredBounds().width());
171 // Record the width of an inactive panel and minimize it.
172 int width_of_panel3_squeezed
= panel3
->GetBounds().width();
175 // Check that this panel is still at the same width.
176 EXPECT_EQ(width_of_panel3_squeezed
, panel3
->GetBounds().width());
178 // Minimize the active panel. It should become inactive and shrink in width.
179 content::WindowedNotificationObserver
signal(
180 chrome::NOTIFICATION_PANEL_COLLECTION_UPDATED
,
181 content::NotificationService::AllSources());
184 // Wait for active states to settle.
185 WaitForPanelActiveState(panel7
, SHOW_AS_INACTIVE
);
187 // Wait for the scheduled layout to run.
190 // The minimized panel should now be at reduced width.
191 EXPECT_LT(panel7
->GetBounds().width(), panel7
->GetRestoredBounds().width());
193 panel_manager
->CloseAll();
196 IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest
, CloseSqueezedPanels
) {
197 PanelManager
* panel_manager
= PanelManager::GetInstance();
198 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
200 // Create enough docked panels to get into squeezing.
201 Panel
* panel1
= CreateInactiveDockedPanel("1", gfx::Rect(0, 0, 200, 100));
202 Panel
* panel2
= CreateInactiveDockedPanel("2", gfx::Rect(0, 0, 200, 100));
203 Panel
* panel3
= CreateInactiveDockedPanel("3", gfx::Rect(0, 0, 200, 100));
204 Panel
* panel4
= CreateInactiveDockedPanel("4", gfx::Rect(0, 0, 200, 100));
205 Panel
* panel5
= CreateInactiveDockedPanel("5", gfx::Rect(0, 0, 200, 100));
206 Panel
* panel6
= CreateInactiveDockedPanel("6", gfx::Rect(0, 0, 200, 100));
207 Panel
* panel7
= CreateDockedPanel("7", gfx::Rect(0, 0, 200, 100));
209 // Wait for active states to settle.
210 PanelCollectionSqueezeObserver
panel7_settled(docked_collection
, panel7
);
211 panel7_settled
.Wait();
213 // Record current widths of some panels.
214 int panel_1_orig_width
= panel1
->GetBounds().width();
215 int panel_2_orig_width
= panel2
->GetBounds().width();
216 int panel_3_orig_width
= panel3
->GetBounds().width();
217 int panel_4_orig_width
= panel4
->GetBounds().width();
218 int panel_5_orig_width
= panel5
->GetBounds().width();
219 int panel_6_orig_width
= panel6
->GetBounds().width();
220 int panel_7_orig_width
= panel7
->GetBounds().width();
222 // The active panel should be at full width.
223 EXPECT_EQ(panel_7_orig_width
, panel7
->GetRestoredBounds().width());
225 // The rest of them should be at reduced width.
226 EXPECT_LT(panel_1_orig_width
, panel1
->GetRestoredBounds().width());
227 EXPECT_LT(panel_2_orig_width
, panel2
->GetRestoredBounds().width());
228 EXPECT_LT(panel_3_orig_width
, panel3
->GetRestoredBounds().width());
229 EXPECT_LT(panel_4_orig_width
, panel4
->GetRestoredBounds().width());
230 EXPECT_LT(panel_5_orig_width
, panel5
->GetRestoredBounds().width());
231 EXPECT_LT(panel_6_orig_width
, panel6
->GetRestoredBounds().width());
234 content::WindowedNotificationObserver
signal(
235 chrome::NOTIFICATION_PANEL_COLLECTION_UPDATED
,
236 content::NotificationService::AllSources());
237 CloseWindowAndWait(panel2
);
240 // The widths of the remaining panels should have increased.
241 EXPECT_GT(panel1
->GetBounds().width(), panel_1_orig_width
);
242 EXPECT_GT(panel3
->GetBounds().width(), panel_3_orig_width
);
243 EXPECT_GT(panel4
->GetBounds().width(), panel_4_orig_width
);
244 EXPECT_GT(panel5
->GetBounds().width(), panel_5_orig_width
);
245 EXPECT_GT(panel6
->GetBounds().width(), panel_6_orig_width
);
247 // The active panel should have stayed at full width.
248 EXPECT_EQ(panel7
->GetBounds().width(), panel_7_orig_width
);
250 // Close several panels.
251 CloseWindowAndWait(panel3
);
252 CloseWindowAndWait(panel5
);
254 // Wait for collection update after last close.
255 content::WindowedNotificationObserver
signal2(
256 chrome::NOTIFICATION_PANEL_COLLECTION_UPDATED
,
257 content::NotificationService::AllSources());
258 CloseWindowAndWait(panel7
);
261 // We should not have squeezing any more; all panels should be at full width.
262 EXPECT_EQ(panel1
->GetBounds().width(), panel1
->GetRestoredBounds().width());
263 EXPECT_EQ(panel4
->GetBounds().width(), panel4
->GetRestoredBounds().width());
264 EXPECT_EQ(panel6
->GetBounds().width(), panel6
->GetRestoredBounds().width());
266 panel_manager
->CloseAll();