OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2011 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 <deque> | |
6 #include "chrome/browser/ui/browser.h" | |
7 #include "chrome/browser/ui/panels/base_panel_browser_test.h" | |
8 #include "chrome/browser/ui/panels/native_panel.h" | |
9 #include "chrome/browser/ui/panels/panel.h" | |
10 #include "chrome/browser/ui/panels/panel_manager.h" | |
11 #include "chrome/browser/ui/panels/panel_overflow_strip.h" | |
12 #include "chrome/browser/ui/panels/panel_settings_menu_model.h" | |
13 #include "chrome/browser/ui/panels/panel_strip.h" | |
14 #include "chrome/browser/ui/panels/test_panel_mouse_watcher.h" | |
15 #include "chrome/common/chrome_notification_types.h" | |
16 #include "chrome/test/base/ui_test_utils.h" | |
17 #include "testing/gtest/include/gtest/gtest.h" | |
18 | |
19 namespace { | |
20 | |
21 // We override the default value for testing purpose. | |
22 const int kMaxVisibleOverflowForTesting = 3; | |
23 | |
24 // Encapsulates all the info we need to verify if a panel behaves as expected | |
25 // when we do the overflow testing. | |
26 struct PanelData { | |
27 Panel* panel; | |
28 std::string name; | |
29 Panel::ExpansionState expansion_state; | |
30 bool visible; | |
31 bool active; | |
32 | |
33 PanelData() | |
34 : panel(NULL), | |
35 expansion_state(Panel::EXPANDED), | |
36 visible(false), | |
37 active(false) { | |
38 } | |
39 | |
40 explicit PanelData(Panel* panel) | |
41 : panel(panel), | |
42 name(panel->browser()->app_name()), | |
43 expansion_state(panel->expansion_state()), | |
44 visible(!panel->GetBounds().IsEmpty()), | |
45 active(panel->IsActive()) { | |
46 } | |
47 | |
48 PanelData(Panel* panel, Panel::ExpansionState expansion_state, | |
49 bool visible, bool active) | |
50 : panel(panel), | |
51 name(panel->browser()->app_name()), | |
52 expansion_state(expansion_state), | |
53 visible(visible), | |
54 active(active) { | |
55 } | |
56 | |
57 bool operator==(const PanelData& another) const { | |
58 return panel == another.panel && | |
59 expansion_state == another.expansion_state && | |
60 visible == another.visible && | |
61 active == another.active; | |
62 } | |
63 | |
64 bool operator!=(const PanelData& another) const { | |
65 return !(*this == another); | |
66 } | |
67 }; | |
68 | |
69 // For gtest printing. | |
70 ::std::ostream& operator<<(::std::ostream& os, const PanelData& data); | |
71 ::std::ostream& operator<<(::std::ostream& os, const PanelData& data) { | |
72 return os << "(" << data.name << ", " << data.expansion_state << ", " | |
73 << data.visible << ", " << data.active << ")"; | |
74 } | |
75 | |
76 | |
77 class BasePanelDataList : public std::deque<PanelData> { | |
78 public: | |
79 PanelData* get(Panel* panel) { | |
80 for (BasePanelDataList::iterator iter = begin(); iter != end(); ++iter) { | |
81 if (iter->panel == panel) | |
82 return &(*iter); | |
83 } | |
84 return NULL; | |
85 } | |
86 | |
87 virtual PanelData remove(Panel* panel) { | |
88 PanelData panel_data; | |
89 for (BasePanelDataList::iterator iter = begin(); iter != end(); ++iter) { | |
90 if (iter->panel == panel) { | |
91 panel_data = *iter; | |
92 erase(iter); | |
93 break; | |
94 } | |
95 } | |
96 return panel_data; | |
97 } | |
98 | |
99 protected: | |
100 using std::deque<PanelData>::push_back; | |
101 using std::deque<PanelData>::push_front; | |
102 }; | |
103 | |
104 class NormalPanelDataList : public BasePanelDataList { | |
105 public: | |
106 void push_back(const PanelData& panel_data) { | |
107 BasePanelDataList::push_back(panel_data); | |
108 back().expansion_state = Panel::EXPANDED; | |
109 back().visible = true; | |
110 } | |
111 }; | |
112 | |
113 class OverflowPanelDataList : public BasePanelDataList { | |
114 public: | |
115 void push_back(const PanelData& panel_data) { | |
116 BasePanelDataList::push_back(panel_data); | |
117 back().expansion_state = Panel::IN_OVERFLOW; | |
118 back().visible = size() <= kMaxVisibleOverflowForTesting; | |
119 } | |
120 | |
121 void push_front(const PanelData& panel_data) { | |
122 BasePanelDataList::push_front(panel_data); | |
123 front().expansion_state = Panel::IN_OVERFLOW; | |
124 front().visible = true; | |
125 if (size() > kMaxVisibleOverflowForTesting) | |
126 (*this)[kMaxVisibleOverflowForTesting].visible = false; | |
127 } | |
128 | |
129 virtual PanelData remove(Panel* panel) OVERRIDE { | |
130 PanelData panel_data = BasePanelDataList::remove(panel); | |
131 if (size() >= kMaxVisibleOverflowForTesting) | |
132 (*this)[kMaxVisibleOverflowForTesting - 1].visible = true; | |
133 return panel_data; | |
134 } | |
135 }; | |
136 | |
137 } // namespace | |
138 | |
139 class PanelOverflowBrowserTest : public BasePanelBrowserTest { | |
140 public: | |
141 PanelOverflowBrowserTest() : BasePanelBrowserTest() { | |
142 } | |
143 | |
144 virtual ~PanelOverflowBrowserTest() { | |
145 } | |
146 | |
147 virtual void SetUpOnMainThread() OVERRIDE { | |
148 BasePanelBrowserTest::SetUpOnMainThread(); | |
149 | |
150 PanelManager::GetInstance()->panel_overflow_strip()-> | |
151 set_max_visible_panels(kMaxVisibleOverflowForTesting); | |
152 } | |
153 | |
154 protected: | |
155 static NormalPanelDataList GetAllNormalPanelData() { | |
156 NormalPanelDataList panel_data_list; | |
157 PanelStrip::Panels panels = | |
158 PanelManager::GetInstance()->panel_strip()->panels(); | |
159 for (PanelStrip::Panels::const_iterator iter = panels.begin(); | |
160 iter != panels.end(); ++iter) { | |
161 Panel* panel = *iter; | |
162 panel_data_list.push_back(PanelData(panel)); | |
163 } | |
164 return panel_data_list; | |
165 } | |
166 | |
167 static OverflowPanelDataList GetAllOverflowPanelData() { | |
168 OverflowPanelDataList panel_data_list; | |
169 PanelOverflowStrip::Panels panels = | |
170 PanelManager::GetInstance()->panel_overflow_strip()->panels(); | |
171 for (PanelOverflowStrip::Panels::const_iterator iter = panels.begin(); | |
172 iter != panels.end(); ++iter) { | |
173 Panel* panel = *iter; | |
174 panel_data_list.push_back(PanelData(panel)); | |
175 } | |
176 return panel_data_list; | |
177 } | |
178 | |
179 static void MoveMouseAndWaitForOverflowAnimationEnded( | |
180 const gfx::Point& position) { | |
181 ui_test_utils::WindowedNotificationObserver signal( | |
182 chrome::NOTIFICATION_PANEL_BOUNDS_ANIMATIONS_FINISHED, | |
183 content::Source<PanelOverflowStrip>( | |
184 PanelManager::GetInstance()->panel_overflow_strip())); | |
185 MoveMouse(position); | |
186 signal.Wait(); | |
187 } | |
188 | |
189 static bool IsPanelVisible(Panel* panel) { | |
190 return !panel->GetBounds().IsEmpty(); | |
191 } | |
192 | |
193 std::vector<Panel*> CreateOverflowPanels(int num_normal_panels, | |
194 int num_overflow_panels, | |
195 const int* panel_widths) { | |
196 const int kTestPanelHeight = 200; | |
197 std::vector<Panel*> panels; | |
198 | |
199 // First, create normal panels to fill the panel strip. | |
200 int i = 0; | |
201 for (; i < num_normal_panels; ++i) { | |
202 CreatePanelParams params( | |
203 MakePanelName(i), | |
204 gfx::Rect(0, 0, panel_widths[i], kTestPanelHeight), | |
205 SHOW_AS_INACTIVE); | |
206 Panel* panel = CreatePanelWithParams(params); | |
207 panels.push_back(panel); | |
208 } | |
209 | |
210 // Then, create panels that would be placed in the overflow strip. | |
211 int num_panels = num_normal_panels + num_overflow_panels; | |
212 for (; i < num_panels; ++i) { | |
213 CreatePanelParams params( | |
214 MakePanelName(i), | |
215 gfx::Rect(0, 0, panel_widths[i], kTestPanelHeight), | |
216 SHOW_AS_INACTIVE); | |
217 Panel* panel = CreatePanelWithParams(params); | |
218 WaitForExpansionStateChanged(panel, Panel::IN_OVERFLOW); | |
219 panels.push_back(panel); | |
220 } | |
221 | |
222 return panels; | |
223 } | |
224 }; | |
225 | |
226 // TODO(jianli): remove the guard when overflow support is enabled on other | |
227 // platforms. http://crbug.com/105073 | |
228 #if defined(OS_WIN) | |
229 #define MAYBE_CreateOverflowPanels CreateOverflowPanels | |
230 #define MAYBE_CreateMoreOverflowPanels CreateMoreOverflowPanels | |
231 // http://crbug.com/107230 | |
232 #define MAYBE_CreatePanelOnDelayedOverflow FAILS_CreatePanelOnDelayedOverflow | |
233 #define MAYBE_CloseOverflowPanels CloseOverflowPanels | |
234 #define MAYBE_CloseNormalPanels CloseNormalPanels | |
235 #define MAYBE_ActivateOverflowPanels ActivateOverflowPanels | |
236 #define MAYBE_HoverOverOverflowArea HoverOverOverflowArea | |
237 #else | |
238 #define MAYBE_CreateOverflowPanels DISABLED_CreateOverflowPanels | |
239 #define MAYBE_CreateMoreOverflowPanels DISABLED_CreateMoreOverflowPanels | |
240 #define MAYBE_CreatePanelOnDelayedOverflow DISABLED_CreatePanelOnDelayedOverflow | |
241 #define MAYBE_CloseOverflowPanels DISABLED_CloseOverflowPanels | |
242 #define MAYBE_CloseNormalPanels DISABLED_CloseNormalPanels | |
243 #define MAYBE_ActivateOverflowPanels DISABLED_ActivateOverflowPanels | |
244 #define MAYBE_HoverOverOverflowArea DISABLED_HoverOverOverflowArea | |
245 #endif | |
246 | |
247 IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, MAYBE_CreateOverflowPanels) { | |
248 PanelManager* panel_manager = PanelManager::GetInstance(); | |
249 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
250 PanelOverflowStrip* panel_overflow_strip = | |
251 panel_manager->panel_overflow_strip(); | |
252 | |
253 const int panel_widths[] = { | |
254 250, 260, 200, // normal | |
255 255, 220 // overflow | |
256 }; | |
257 CreateOverflowPanels(3, 2, panel_widths); | |
258 | |
259 std::vector<Panel*> panels = panel_manager->panels(); | |
260 ASSERT_EQ(5, panels.size()); | |
261 EXPECT_EQ(3, panel_strip->num_panels()); | |
262 EXPECT_EQ(2, panel_overflow_strip->num_panels()); | |
263 EXPECT_EQ(Panel::IN_OVERFLOW, panels[3]->expansion_state()); | |
264 EXPECT_TRUE(IsPanelVisible(panels[3])); | |
265 EXPECT_EQ(Panel::IN_OVERFLOW, panels[4]->expansion_state()); | |
266 EXPECT_TRUE(IsPanelVisible(panels[4])); | |
267 | |
268 PanelManager::GetInstance()->RemoveAll(); | |
269 } | |
270 | |
271 IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, | |
272 MAYBE_CreateMoreOverflowPanels) { | |
273 PanelManager* panel_manager = PanelManager::GetInstance(); | |
274 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
275 PanelOverflowStrip* panel_overflow_strip = | |
276 panel_manager->panel_overflow_strip(); | |
277 | |
278 const int panel_widths[] = { | |
279 250, 260, 200, // normal | |
280 255, 220, 210, // overflow | |
281 220, 230 // overflow-on-overflow | |
282 }; | |
283 CreateOverflowPanels(3, 5, panel_widths); | |
284 | |
285 std::vector<Panel*> panels = panel_manager->panels(); | |
286 ASSERT_EQ(8, panels.size()); | |
287 EXPECT_EQ(3, panel_strip->num_panels()); | |
288 EXPECT_EQ(5, panel_overflow_strip->num_panels()); | |
289 EXPECT_EQ(Panel::IN_OVERFLOW, panels[3]->expansion_state()); | |
290 EXPECT_TRUE(IsPanelVisible(panels[3])); | |
291 EXPECT_EQ(Panel::IN_OVERFLOW, panels[4]->expansion_state()); | |
292 EXPECT_TRUE(IsPanelVisible(panels[4])); | |
293 EXPECT_EQ(Panel::IN_OVERFLOW, panels[5]->expansion_state()); | |
294 EXPECT_TRUE(IsPanelVisible(panels[5])); | |
295 EXPECT_EQ(Panel::IN_OVERFLOW, panels[6]->expansion_state()); | |
296 EXPECT_FALSE(IsPanelVisible(panels[6])); | |
297 EXPECT_EQ(Panel::IN_OVERFLOW, panels[7]->expansion_state()); | |
298 EXPECT_FALSE(IsPanelVisible(panels[7])); | |
299 | |
300 PanelManager::GetInstance()->RemoveAll(); | |
301 } | |
302 | |
303 IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, | |
304 MAYBE_CreatePanelOnDelayedOverflow) { | |
305 // Create 2 big panels. | |
306 Panel* panel0 = CreatePanelWithBounds("Panel0", gfx::Rect(0, 0, 260, 200)); | |
307 Panel* panel1 = CreatePanelWithBounds("Panel1", gfx::Rect(0, 0, 260, 200)); | |
308 | |
309 // Create 2 overflow panels without waiting for them to be moved to overflow. | |
310 Panel* panel2 = CreatePanelWithBounds("Panel2", gfx::Rect(0, 0, 255, 200)); | |
jennb
2011/12/14 00:55:29
CreatePanelWithBounds invokes MessageLoop RunAllPe
jianli
2011/12/14 22:36:20
Done. Added wait_for_fully_created to CreatePanelP
| |
311 Panel* panel3 = CreatePanelWithBounds("Panel3", gfx::Rect(0, 0, 255, 200)); | |
312 | |
313 // Create 1 small panel that could fit within the available space in the | |
314 // panel strip. | |
315 Panel* panel4 = CreatePanelWithBounds("Panel4", gfx::Rect(0, 0, 100, 200)); | |
316 EXPECT_EQ(Panel::EXPANDED, panel4->expansion_state()); | |
317 EXPECT_FALSE(panel4->has_temporary_layout()); | |
318 | |
319 PanelManager::GetInstance()->RemoveAll(); | |
320 } | |
321 | |
322 IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, MAYBE_CloseOverflowPanels) { | |
323 PanelManager* panel_manager = PanelManager::GetInstance(); | |
324 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
325 PanelOverflowStrip* panel_overflow_strip = | |
326 panel_manager->panel_overflow_strip(); | |
327 | |
328 // Create normal and overflow panels. | |
329 // normal: P0, P1, P2 | |
330 // overflow: P3, P4, P5 | |
331 // overflow-on-overflow: P6, P7 | |
332 int num_normal_panels = 3; | |
333 int num_overflow_panels = 5; | |
334 const int panel_widths[] = { | |
335 260, 250, 200, // normal | |
336 255, 260, 120, // overflow | |
337 240, 210 // overflow-on-overflow | |
338 }; | |
339 std::vector<Panel*> panels = CreateOverflowPanels( | |
340 num_normal_panels, num_overflow_panels, panel_widths); | |
341 | |
342 NormalPanelDataList expected_normal_panel_data_list; | |
343 expected_normal_panel_data_list.push_back( | |
344 PanelData(panels[0], Panel::EXPANDED, true, false)); | |
345 expected_normal_panel_data_list.push_back( | |
346 PanelData(panels[1], Panel::EXPANDED, true, false)); | |
347 expected_normal_panel_data_list.push_back( | |
348 PanelData(panels[2], Panel::EXPANDED, true, false)); | |
349 | |
350 OverflowPanelDataList expected_overflow_panel_data_list; | |
351 expected_overflow_panel_data_list.push_back( | |
352 PanelData(panels[3], Panel::IN_OVERFLOW, true, false)); | |
353 expected_overflow_panel_data_list.push_back( | |
354 PanelData(panels[4], Panel::IN_OVERFLOW, true, false)); | |
355 expected_overflow_panel_data_list.push_back( | |
356 PanelData(panels[5], Panel::IN_OVERFLOW, true, false)); | |
357 expected_overflow_panel_data_list.push_back( | |
358 PanelData(panels[6], Panel::IN_OVERFLOW, false, false)); | |
359 expected_overflow_panel_data_list.push_back( | |
360 PanelData(panels[7], Panel::IN_OVERFLOW, false, false)); | |
361 | |
362 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
jennb
2011/12/14 00:55:29
You're still not comparing the actual values insid
jianli
2011/12/14 22:36:20
I changed to construct the expected list each time
| |
363 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
364 | |
365 // Close an overflow-on-overflow panel. Expect only that panel is closed. | |
366 // normal: P0, P1, P2 | |
367 // overflow: P3, P4, P5, | |
368 // overflow-on-overflow: P7 | |
369 CloseWindowAndWait(panels[6]->browser()); | |
370 num_overflow_panels--; | |
371 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
372 panel_manager->num_panels()); | |
373 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
374 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
375 expected_overflow_panel_data_list.remove(panels[6]); | |
jennb
2011/12/14 00:55:29
list does not have index 6. Indexing mistakes thro
jianli
2011/12/14 22:36:20
Both panels and expected_overflow_panel_data_list
| |
376 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
377 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
378 | |
379 // Close an overflow panel. Expect an overflow-on-overflow panel to become | |
380 // visible in the overflow strip. | |
381 // normal: P0, P1, P2 | |
382 // overflow: P3, P5, P7 | |
383 CloseWindowAndWait(panels[4]->browser()); | |
384 num_overflow_panels--; | |
385 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
386 panel_manager->num_panels()); | |
387 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
388 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
389 expected_overflow_panel_data_list.remove(panels[4]); | |
390 expected_overflow_panel_data_list.get(panels[7])->visible = true; | |
391 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
392 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
393 | |
394 // Close an overflow panel. Expect only that panel is closed. | |
395 CloseWindowAndWait(panels[3]->browser()); | |
396 num_overflow_panels--; | |
397 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
398 panel_manager->num_panels()); | |
399 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
400 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
401 expected_overflow_panel_data_list.remove(panels[3]); | |
402 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
403 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
404 | |
405 panel_manager->RemoveAll(); | |
406 } | |
407 | |
408 IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, MAYBE_CloseNormalPanels) { | |
409 PanelManager* panel_manager = PanelManager::GetInstance(); | |
410 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
411 PanelOverflowStrip* panel_overflow_strip = | |
412 panel_manager->panel_overflow_strip(); | |
413 | |
414 // Create normal and overflow panels. | |
415 // normal: P0, P1, P2 | |
416 // overflow: P3, P4, P5 | |
417 // overflow-on-overflow: P6, P7, P8 | |
418 int num_normal_panels = 3; | |
419 int num_overflow_panels = 6; | |
420 const int panel_widths[] = { | |
421 260, 250, 200, // normal | |
422 255, 260, 120, // overflow | |
423 240, 210, 258 // overflow-on-overflow | |
424 }; | |
425 std::vector<Panel*> panels = CreateOverflowPanels( | |
426 num_normal_panels, num_overflow_panels, panel_widths); | |
427 | |
428 NormalPanelDataList expected_normal_panel_data_list; | |
429 expected_normal_panel_data_list.push_back( | |
430 PanelData(panels[0], Panel::EXPANDED, true, false)); | |
431 expected_normal_panel_data_list.push_back( | |
432 PanelData(panels[1], Panel::EXPANDED, true, false)); | |
433 expected_normal_panel_data_list.push_back( | |
434 PanelData(panels[2], Panel::EXPANDED, true, false)); | |
435 | |
436 OverflowPanelDataList expected_overflow_panel_data_list; | |
437 expected_overflow_panel_data_list.push_back( | |
438 PanelData(panels[3], Panel::IN_OVERFLOW, true, false)); | |
439 expected_overflow_panel_data_list.push_back( | |
440 PanelData(panels[4], Panel::IN_OVERFLOW, true, false)); | |
441 expected_overflow_panel_data_list.push_back( | |
442 PanelData(panels[5], Panel::IN_OVERFLOW, true, false)); | |
443 expected_overflow_panel_data_list.push_back( | |
444 PanelData(panels[6], Panel::IN_OVERFLOW, false, false)); | |
445 expected_overflow_panel_data_list.push_back( | |
446 PanelData(panels[7], Panel::IN_OVERFLOW, false, false)); | |
447 expected_overflow_panel_data_list.push_back( | |
448 PanelData(panels[8], Panel::IN_OVERFLOW, false, false)); | |
449 | |
450 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
451 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
452 | |
453 // Close a normal panel. Expect an overflow panel to move over and an | |
454 // overflow-on-overflow panel to become visible. | |
455 // normal: P0, P2, P3 | |
456 // overflow: P4, P5, P6 | |
457 // overflow-on-overflow: P7, P8 | |
458 CloseWindowAndWait(panels[1]->browser()); | |
459 num_overflow_panels--; | |
460 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
461 panel_manager->num_panels()); | |
462 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
463 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
464 expected_normal_panel_data_list.remove(panels[1]); | |
465 expected_normal_panel_data_list.push_back( | |
466 expected_overflow_panel_data_list.remove(panels[3])); | |
467 expected_overflow_panel_data_list.get(panels[6])->visible = true; | |
468 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
469 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
470 | |
471 // Close another normal panel. Remaining overflow panels cannot move over | |
472 // due to not enough room. | |
473 // normal: P0, P3 | |
474 // overflow: P4, P5, P6 | |
475 // overflow-on-overflow: P7, P8 | |
476 CloseWindowAndWait(panels[2]->browser()); | |
477 num_normal_panels--; | |
478 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
479 panel_manager->num_panels()); | |
480 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
481 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
482 expected_normal_panel_data_list.remove(panels[2]); | |
483 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
484 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
485 | |
486 // Close one more normal panel. Expect two overflow panels to move over and | |
487 // two overflow-on-overflow panels to become visible. | |
488 // normal: P0, P4, P5 | |
489 // overflow: P6, P7, P8 | |
490 CloseWindowAndWait(panels[3]->browser()); | |
491 num_normal_panels++; | |
492 num_overflow_panels -= 2; | |
493 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
494 panel_manager->num_panels()); | |
495 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
496 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
497 expected_normal_panel_data_list.remove(panels[3]); | |
498 expected_normal_panel_data_list.push_back( | |
499 expected_overflow_panel_data_list.remove(panels[4])); | |
500 expected_normal_panel_data_list.push_back( | |
501 expected_overflow_panel_data_list.remove(panels[5])); | |
502 expected_overflow_panel_data_list.get(panels[7])->visible = true; | |
503 expected_overflow_panel_data_list.get(panels[8])->visible = true; | |
504 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
505 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
506 | |
507 // Close another normal panel. Expect one overflow panel to move over. | |
508 // normal: P4, P5, P6 | |
509 // overflow: P7, P8 | |
510 CloseWindowAndWait(panels[0]->browser()); | |
511 num_overflow_panels--; | |
512 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
513 panel_manager->num_panels()); | |
514 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
515 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
516 expected_normal_panel_data_list.remove(panels[0]); | |
517 expected_normal_panel_data_list.push_back( | |
518 expected_overflow_panel_data_list.remove(panels[6])); | |
519 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
520 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
521 | |
522 panel_manager->RemoveAll(); | |
523 } | |
524 | |
525 IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, MAYBE_ActivateOverflowPanels) { | |
526 PanelManager* panel_manager = PanelManager::GetInstance(); | |
527 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
528 PanelOverflowStrip* panel_overflow_strip = | |
529 panel_manager->panel_overflow_strip(); | |
530 panel_overflow_strip->set_max_visible_panels(3); | |
531 | |
532 // Create normal and overflow panels. | |
533 // normal: P0, P1, P2 | |
534 // overflow: P3, P4, P5 | |
535 // overflow-on-overflow: P6, P7 | |
536 const int panel_widths[] = { | |
537 250, 260, 200, // normal | |
538 210, 260, 230, // overflow | |
539 255, 210 // overflow-on-overflow | |
540 }; | |
541 std::vector<Panel*> panels = CreateOverflowPanels(3, 5, panel_widths); | |
542 | |
543 NormalPanelDataList expected_normal_panel_data_list; | |
544 expected_normal_panel_data_list.push_back( | |
545 PanelData(panels[0], Panel::EXPANDED, true, false)); | |
546 expected_normal_panel_data_list.push_back( | |
547 PanelData(panels[1], Panel::EXPANDED, true, false)); | |
548 expected_normal_panel_data_list.push_back( | |
549 PanelData(panels[2], Panel::EXPANDED, true, false)); | |
550 | |
551 OverflowPanelDataList expected_overflow_panel_data_list; | |
552 expected_overflow_panel_data_list.push_back( | |
553 PanelData(panels[3], Panel::IN_OVERFLOW, true, false)); | |
554 expected_overflow_panel_data_list.push_back( | |
555 PanelData(panels[4], Panel::IN_OVERFLOW, true, false)); | |
556 expected_overflow_panel_data_list.push_back( | |
557 PanelData(panels[5], Panel::IN_OVERFLOW, true, false)); | |
558 expected_overflow_panel_data_list.push_back( | |
559 PanelData(panels[6], Panel::IN_OVERFLOW, false, false)); | |
560 expected_overflow_panel_data_list.push_back( | |
561 PanelData(panels[7], Panel::IN_OVERFLOW, false, false)); | |
562 | |
563 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
564 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
565 | |
566 // Activate an overflow panel. Expect one normal panel is swapped into the | |
567 // overflow strip. | |
568 // normal: P0, P1, P3 | |
569 // overflow: P2, P4, P5 | |
570 // overflow-on-overflow: P6, P7 | |
571 panels[3]->Activate(); | |
572 WaitForPanelActiveState(panels[3], SHOW_AS_ACTIVE); | |
573 WaitForExpansionStateChanged(panels[3], Panel::EXPANDED); | |
574 expected_overflow_panel_data_list.push_front( | |
575 expected_normal_panel_data_list.remove(panels[2])); | |
576 expected_normal_panel_data_list.push_back( | |
577 expected_overflow_panel_data_list.remove(panels[3])); | |
578 expected_normal_panel_data_list.get(panels[3])->active = true; | |
579 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
580 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
581 | |
582 // Activate an overflow panel. Expect two normal panels are swapped into the | |
583 // overflow strip and one overflow panel to become hidden. | |
584 // normal: P0, P4 | |
585 // overflow: P1, P3, P2 | |
586 // overflow-on-overflow: P5, P6, P7 | |
587 panels[4]->Activate(); | |
588 WaitForPanelActiveState(panels[4], SHOW_AS_ACTIVE); | |
589 WaitForExpansionStateChanged(panels[4], Panel::EXPANDED); | |
590 WaitForPanelActiveState(panels[3], SHOW_AS_INACTIVE); | |
591 expected_overflow_panel_data_list.push_front( | |
592 expected_normal_panel_data_list.remove(panels[3])); | |
593 expected_overflow_panel_data_list.push_front( | |
594 expected_normal_panel_data_list.remove(panels[1])); | |
595 expected_normal_panel_data_list.push_back( | |
596 expected_overflow_panel_data_list.remove(panels[4])); | |
597 expected_normal_panel_data_list.get(panels[4])->active = true; | |
598 expected_overflow_panel_data_list.get(panels[3])->active = false; | |
599 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
600 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
601 | |
602 // Activate an overflow-on-overflow panel. Expect one normal panel is swapped | |
603 // into the overflow strip. | |
604 // normal: P0, P6 | |
605 // overflow: P4, P1, P3, | |
606 // overflow-on-overflow: P2, P5, P7 | |
607 panels[6]->Activate(); | |
608 WaitForPanelActiveState(panels[6], SHOW_AS_ACTIVE); | |
609 WaitForExpansionStateChanged(panels[6], Panel::EXPANDED); | |
610 WaitForPanelActiveState(panels[4], SHOW_AS_INACTIVE); | |
611 expected_overflow_panel_data_list.push_front( | |
612 expected_normal_panel_data_list.remove(panels[4])); | |
613 expected_normal_panel_data_list.push_back( | |
614 expected_overflow_panel_data_list.remove(panels[6])); | |
615 expected_normal_panel_data_list.get(panels[6])->active = true; | |
616 expected_overflow_panel_data_list.get(panels[4])->active = false; | |
617 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
618 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
619 | |
620 // Activate an overflow-on-overflow panel. Not any normal panel is swapped | |
621 // since there has already been enough space in the panel strip. | |
622 // normal: P0, P6, P7 | |
623 // overflow: P4, P1, P3, | |
624 // overflow-on-overflow: P2, P5 | |
625 panels[7]->Activate(); | |
626 WaitForPanelActiveState(panels[7], SHOW_AS_ACTIVE); | |
627 WaitForExpansionStateChanged(panels[7], Panel::EXPANDED); | |
628 WaitForPanelActiveState(panels[6], SHOW_AS_INACTIVE); | |
629 expected_normal_panel_data_list.push_back( | |
630 expected_overflow_panel_data_list.remove(panels[7])); | |
631 expected_normal_panel_data_list.get(panels[7])->active = true; | |
632 expected_normal_panel_data_list.get(panels[6])->active = false; | |
633 EXPECT_EQ(expected_normal_panel_data_list, GetAllNormalPanelData()); | |
634 EXPECT_EQ(expected_overflow_panel_data_list, GetAllOverflowPanelData()); | |
635 | |
636 panel_manager->RemoveAll(); | |
637 } | |
638 | |
639 IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, MAYBE_HoverOverOverflowArea) { | |
640 PanelManager* panel_manager = PanelManager::GetInstance(); | |
641 PanelMouseWatcher* mouse_watcher = new TestPanelMouseWatcher(); | |
642 panel_manager->SetMouseWatcherForTesting(mouse_watcher); | |
643 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
644 PanelOverflowStrip* panel_overflow_strip = | |
645 panel_manager->panel_overflow_strip(); | |
646 panel_overflow_strip->set_max_visible_panels(3); | |
647 int iconified_width = panel_overflow_strip->current_display_width(); | |
648 | |
649 // Create normal and overflow panels. | |
650 // normal: P0, P1, P2 | |
651 // overflow: P3, P4, P5 | |
652 // overflow-on-overflow: P6, P7 | |
653 const int panel_widths[] = { | |
654 250, 260, 200, // normal | |
655 255, 220, 260, // overflow | |
656 140, 210 // overflow-on-overflow | |
657 }; | |
658 std::vector<Panel*> panels = CreateOverflowPanels(3, 5, panel_widths); | |
659 | |
660 // Move mouse beyond the right edge of the top overflow panel. | |
661 // Expect the overflow area remains shrunk. | |
662 MoveMouse(gfx::Point(panels[5]->GetBounds().right() + 1, | |
663 panels[5]->GetBounds().y())); | |
664 EXPECT_EQ(iconified_width, panel_overflow_strip->current_display_width()); | |
665 | |
666 // Move mouse above the top overflow panel. Expect the overflow area | |
667 // remains shrunk. | |
668 MoveMouse(gfx::Point(panels[5]->GetBounds().x(), | |
669 panels[5]->GetBounds().y() - 1)); | |
670 EXPECT_EQ(iconified_width, panel_overflow_strip->current_display_width()); | |
671 | |
672 // Move mouse below the bottom overflow panel. Expect the overflow area | |
673 // remains shrunk. | |
674 MoveMouse(gfx::Point(panels[3]->GetBounds().right(), | |
675 panels[3]->GetBounds().bottom() + 1)); | |
676 EXPECT_EQ(iconified_width, panel_overflow_strip->current_display_width()); | |
677 | |
678 // Move mouse to the origin of an overflow panel. Expect the overflow area | |
679 // gets expanded. | |
680 MoveMouseAndWaitForOverflowAnimationEnded( | |
681 panels[4]->GetBounds().origin()); | |
682 int hover_width = panel_overflow_strip->current_display_width(); | |
683 EXPECT_GT(hover_width, iconified_width); | |
684 EXPECT_EQ(hover_width, panels[3]->GetBounds().width()); | |
685 EXPECT_EQ(hover_width, panels[4]->GetBounds().width()); | |
686 EXPECT_EQ(hover_width, panels[5]->GetBounds().width()); | |
687 EXPECT_EQ(hover_width, panels[6]->GetBounds().width()); | |
688 EXPECT_EQ(hover_width, panels[7]->GetBounds().width()); | |
689 | |
690 // Move mouse to the origin of another overflow panel. Expect the overflow | |
691 // area remains expanded. | |
692 MoveMouse(panels[5]->GetBounds().origin()); | |
693 EXPECT_EQ(hover_width, panel_overflow_strip->current_display_width()); | |
694 | |
695 // Move mouse beyond the left edge of an overflow panel. Expect the overflow | |
696 // area remains expanded. | |
697 MoveMouse(gfx::Point(panels[5]->GetBounds().x() - 5, | |
698 panels[5]->GetBounds().y())); | |
699 EXPECT_EQ(hover_width, panel_overflow_strip->current_display_width()); | |
700 | |
701 // Move mouse to the origin of the top overflow-on-overflow panel. Expect the | |
702 // overflow area remains expanded. | |
703 MoveMouse(panels[7]->GetBounds().origin()); | |
704 EXPECT_EQ(hover_width, panel_overflow_strip->current_display_width()); | |
705 | |
706 // Move mouse to the bottom-right corner of the bottom overflow panel. | |
707 // Expect the overflow area remains expanded. | |
708 MoveMouse(gfx::Point(panels[3]->GetBounds().right(), | |
709 panels[3]->GetBounds().bottom())); | |
710 EXPECT_EQ(hover_width, panel_overflow_strip->current_display_width()); | |
711 | |
712 // Move mouse beyond the right edge of the hover panel. Expect the overflow | |
713 // area gets shrunk. | |
714 MoveMouseAndWaitForOverflowAnimationEnded(gfx::Point( | |
715 panels[4]->GetBounds().right() + 5, panels[4]->GetBounds().y())); | |
716 EXPECT_EQ(iconified_width, panel_overflow_strip->current_display_width()); | |
717 EXPECT_EQ(iconified_width, panels[3]->GetBounds().width()); | |
718 EXPECT_EQ(iconified_width, panels[4]->GetBounds().width()); | |
719 EXPECT_EQ(iconified_width, panels[5]->GetBounds().width()); | |
720 EXPECT_EQ(0, panels[6]->GetBounds().width()); | |
721 EXPECT_EQ(0, panels[7]->GetBounds().width()); | |
722 | |
723 // Move mouse beyond the left edge of an overflow panel. Expect the overflow | |
724 // area gets expanded. | |
725 MoveMouseAndWaitForOverflowAnimationEnded(gfx::Point( | |
726 panels[4]->GetBounds().x() - 5, panels[4]->GetBounds().y())); | |
727 EXPECT_EQ(hover_width, panel_overflow_strip->current_display_width()); | |
728 EXPECT_EQ(hover_width, panels[3]->GetBounds().width()); | |
729 EXPECT_EQ(hover_width, panels[4]->GetBounds().width()); | |
730 EXPECT_EQ(hover_width, panels[5]->GetBounds().width()); | |
731 EXPECT_EQ(hover_width, panels[6]->GetBounds().width()); | |
732 EXPECT_EQ(hover_width, panels[7]->GetBounds().width()); | |
733 | |
734 // Move mouse above the top overflow-on-overflow panel. Expect the overflow | |
735 // area gets shrunk. | |
736 MoveMouseAndWaitForOverflowAnimationEnded(gfx::Point( | |
737 panels[7]->GetBounds().x(), panels[7]->GetBounds().y() - 1)); | |
738 EXPECT_EQ(iconified_width, panel_overflow_strip->current_display_width()); | |
739 EXPECT_EQ(iconified_width, panels[3]->GetBounds().width()); | |
740 EXPECT_EQ(iconified_width, panels[4]->GetBounds().width()); | |
741 EXPECT_EQ(iconified_width, panels[5]->GetBounds().width()); | |
742 EXPECT_EQ(0, panels[6]->GetBounds().width()); | |
743 EXPECT_EQ(0, panels[7]->GetBounds().width()); | |
744 | |
745 panel_manager->RemoveAll(); | |
746 } | |
OLD | NEW |