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.
4
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"
14
15 class DockedPanelBrowserTest : public BasePanelBrowserTest {
16 public:
SetUpOnMainThread()17 virtual void SetUpOnMainThread() OVERRIDE {
18 BasePanelBrowserTest::SetUpOnMainThread();
19
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);
26 }
27 };
28
29 // http://crbug.com/143247
30 #if !defined(OS_WIN)
31 #define MAYBE_SqueezePanelsInDock DISABLED_SqueezePanelsInDock
32 #else
33 #define MAYBE_SqueezePanelsInDock SqueezePanelsInDock
34 #endif
IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest,MAYBE_SqueezePanelsInDock)35 IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest, MAYBE_SqueezePanelsInDock) {
36 PanelManager* panel_manager = PanelManager::GetInstance();
37 DockedPanelCollection* docked_collection = panel_manager->docked_collection();
38
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());
44
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());
49
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));
55
56 // Wait for active states to settle.
57 PanelCollectionSqueezeObserver panel7_settled(docked_collection, panel7);
58 panel7_settled.Wait();
59
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());
63
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());
71
72 // Activate a different panel.
73 ActivatePanel(panel2);
74 WaitForPanelActiveState(panel2, SHOW_AS_ACTIVE);
75
76 // Wait for active states to settle.
77 PanelCollectionSqueezeObserver panel2_settled(docked_collection, panel2);
78 panel2_settled.Wait();
79
80 // The active panel should be at full width.
81 EXPECT_EQ(panel2->GetBounds().width(), panel2->GetRestoredBounds().width());
82
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());
90
91 panel_manager->CloseAll();
92 }
93
IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest,SqueezeAndThenSomeMore)94 IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest, SqueezeAndThenSomeMore) {
95 PanelManager* panel_manager = PanelManager::GetInstance();
96 DockedPanelCollection* docked_collection = panel_manager->docked_collection();
97
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));
105
106 // Wait for active states to settle.
107 PanelCollectionSqueezeObserver panel6_settled(docked_collection, panel6);
108 panel6_settled.Wait();
109
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();
116
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());
123
124 Panel* panel7 = CreateDockedPanel("7", gfx::Rect(0, 0, 200, 100));
125
126 // Wait for active states to settle.
127 PanelCollectionSqueezeObserver panel7_settled(docked_collection, panel7);
128 panel7_settled.Wait();
129
130 // The active panel should be at full width.
131 EXPECT_EQ(panel7->GetBounds().width(), panel7->GetRestoredBounds().width());
132
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);
139
140 panel_manager->CloseAll();
141 }
142
IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest,MinimizeSqueezedActive)143 IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest, MinimizeSqueezedActive) {
144 PanelManager* panel_manager = PanelManager::GetInstance();
145 DockedPanelCollection* docked_collection = panel_manager->docked_collection();
146
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));
155
156 // Wait for active states to settle.
157 PanelCollectionSqueezeObserver panel7_settled(docked_collection, panel7);
158 panel7_settled.Wait();
159
160 // The active panel should be at full width.
161 EXPECT_EQ(panel7->GetBounds().width(), panel7->GetRestoredBounds().width());
162
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());
170
171 // Record the width of an inactive panel and minimize it.
172 int width_of_panel3_squeezed = panel3->GetBounds().width();
173 panel3->Minimize();
174
175 // Check that this panel is still at the same width.
176 EXPECT_EQ(width_of_panel3_squeezed, panel3->GetBounds().width());
177
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());
182 panel7->Minimize();
183
184 // Wait for active states to settle.
185 WaitForPanelActiveState(panel7, SHOW_AS_INACTIVE);
186
187 // Wait for the scheduled layout to run.
188 signal.Wait();
189
190 // The minimized panel should now be at reduced width.
191 EXPECT_LT(panel7->GetBounds().width(), panel7->GetRestoredBounds().width());
192
193 panel_manager->CloseAll();
194 }
195
IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest,CloseSqueezedPanels)196 IN_PROC_BROWSER_TEST_F(DockedPanelBrowserTest, CloseSqueezedPanels) {
197 PanelManager* panel_manager = PanelManager::GetInstance();
198 DockedPanelCollection* docked_collection = panel_manager->docked_collection();
199
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));
208
209 // Wait for active states to settle.
210 PanelCollectionSqueezeObserver panel7_settled(docked_collection, panel7);
211 panel7_settled.Wait();
212
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();
221
222 // The active panel should be at full width.
223 EXPECT_EQ(panel_7_orig_width, panel7->GetRestoredBounds().width());
224
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());
232
233 // Close one panel.
234 content::WindowedNotificationObserver signal(
235 chrome::NOTIFICATION_PANEL_COLLECTION_UPDATED,
236 content::NotificationService::AllSources());
237 CloseWindowAndWait(panel2);
238 signal.Wait();
239
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);
246
247 // The active panel should have stayed at full width.
248 EXPECT_EQ(panel7->GetBounds().width(), panel_7_orig_width);
249
250 // Close several panels.
251 CloseWindowAndWait(panel3);
252 CloseWindowAndWait(panel5);
253
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);
259 signal2.Wait();
260
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());
265
266 panel_manager->CloseAll();
267 }
268