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 kMaxVisibleOverflow = 3; | |
jennb
2011/12/10 00:42:46
nit: kMaxVisibleOverflowForTesting (so I don't go
jianli
2011/12/13 23:23:40
Done.
| |
23 | |
24 // Encapsulates all the info we care about a panel when we do the testing. | |
25 // We want to verify | |
jennb
2011/12/10 00:42:46
unfinished sentence?
jianli
2011/12/13 23:23:40
Done.
| |
26 struct PanelData { | |
27 Panel* panel; | |
28 std::string name; | |
29 Panel::ExpansionState expansion_state; | |
jennb
2011/12/10 00:42:46
prefix the things that you're checking with expect
jianli
2011/12/13 23:23:40
I rather prefix the struct variable with expected_
| |
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 | |
49 bool operator==(const PanelData& another) const { | |
50 return panel == another.panel && | |
51 expansion_state == another.expansion_state && | |
52 visible == another.visible && | |
53 active == another.active; | |
54 } | |
55 | |
56 bool operator!=(const PanelData& another) const { | |
57 return !(*this == another); | |
58 } | |
59 }; | |
60 | |
61 // For gtest printing. | |
62 ::std::ostream& operator<<(::std::ostream& os, const PanelData& data); | |
63 ::std::ostream& operator<<(::std::ostream& os, const PanelData& data) { | |
64 return os << "(" << data.name << ", " << data.expansion_state << ", " | |
65 << data.visible << ", " << data.active << ")"; | |
66 } | |
67 | |
68 | |
69 class BasePanelDataList : public std::deque<PanelData> { | |
70 public: | |
71 PanelData* get(Panel* panel) { | |
72 for (BasePanelDataList::iterator iter = begin(); iter != end(); ++iter) { | |
73 if (iter->panel == panel) | |
74 return &(*iter); | |
75 } | |
76 return NULL; | |
77 } | |
78 | |
79 protected: | |
80 using std::deque<PanelData>::push_back; | |
81 using std::deque<PanelData>::push_front; | |
82 | |
83 virtual PanelData remove(Panel* panel) { | |
84 PanelData panel_data; | |
85 for (BasePanelDataList::iterator iter = begin(); iter != end(); ++iter) { | |
86 if (iter->panel == panel) { | |
87 panel_data = *iter; | |
88 erase(iter); | |
89 break; | |
90 } | |
91 } | |
92 return panel_data; | |
93 } | |
94 }; | |
95 | |
96 class NormalPanelDataList : public BasePanelDataList { | |
97 public: | |
98 void push_back(const PanelData& panel_data) { | |
99 BasePanelDataList::push_back(panel_data); | |
100 back().expansion_state = Panel::EXPANDED; | |
101 back().visible = true; | |
102 } | |
103 | |
104 virtual PanelData remove(Panel* panel) OVERRIDE { | |
105 return BasePanelDataList::remove(panel); | |
jennb
2011/12/10 00:42:46
Why override if only calling base class?
jianli
2011/12/13 23:23:40
Removed.
| |
106 } | |
107 }; | |
108 | |
109 class OverflowPanelDataList : public BasePanelDataList { | |
110 public: | |
111 void push_back(const PanelData& panel_data) { | |
112 BasePanelDataList::push_back(panel_data); | |
113 back().expansion_state = Panel::IN_OVERFLOW; | |
114 back().visible = size() <= kMaxVisibleOverflow; | |
115 } | |
116 | |
117 void push_front(const PanelData& panel_data) { | |
118 BasePanelDataList::push_front(panel_data); | |
119 front().expansion_state = Panel::IN_OVERFLOW; | |
120 front().visible = true; | |
121 if (size() > kMaxVisibleOverflow) | |
122 (*this)[kMaxVisibleOverflow].visible = false; | |
jennb
2011/12/10 00:42:46
Ah, so this is why you use deque, instead of std::
jianli
2011/12/13 23:23:40
Yes, using list will save us from reimplmenting re
| |
123 } | |
124 | |
125 virtual PanelData remove(Panel* panel) OVERRIDE { | |
126 PanelData panel_data = BasePanelDataList::remove(panel); | |
127 if (size() >= kMaxVisibleOverflow) | |
128 (*this)[kMaxVisibleOverflow - 1].visible = true; | |
129 return panel_data; | |
130 } | |
131 }; | |
132 | |
133 } // namespace | |
134 | |
135 class OverflowPanelBrowserTest : public BasePanelBrowserTest { | |
136 public: | |
137 OverflowPanelBrowserTest() : BasePanelBrowserTest() { | |
138 } | |
139 | |
140 virtual ~OverflowPanelBrowserTest() { | |
141 } | |
142 | |
143 virtual void SetUpOnMainThread() OVERRIDE { | |
144 BasePanelBrowserTest::SetUpOnMainThread(); | |
145 | |
146 PanelManager::GetInstance()->panel_overflow_strip()-> | |
147 set_max_visible_panels(kMaxVisibleOverflow); | |
148 } | |
149 | |
150 protected: | |
151 static NormalPanelDataList GetAllNormalPanelData() { | |
152 NormalPanelDataList panel_data_list; | |
153 PanelStrip::Panels panels = | |
154 PanelManager::GetInstance()->panel_strip()->panels(); | |
155 for (PanelStrip::Panels::const_iterator iter = panels.begin(); | |
156 iter != panels.end(); ++iter) { | |
157 Panel* panel = *iter; | |
158 panel_data_list.push_back(PanelData(panel)); | |
159 } | |
160 return panel_data_list; | |
161 } | |
162 | |
163 static OverflowPanelDataList GetAllOverflowPanelData() { | |
164 OverflowPanelDataList panel_data_list; | |
165 PanelOverflowStrip::Panels panels = | |
166 PanelManager::GetInstance()->panel_overflow_strip()->panels(); | |
167 for (PanelOverflowStrip::Panels::const_iterator iter = panels.begin(); | |
168 iter != panels.end(); ++iter) { | |
169 Panel* panel = *iter; | |
170 panel_data_list.push_back(PanelData(panel)); | |
171 } | |
172 return panel_data_list; | |
173 } | |
174 | |
175 static void MoveMouseAndWaitForOverflowAnimationEnded( | |
176 const gfx::Point& position) { | |
177 ui_test_utils::WindowedNotificationObserver signal( | |
178 chrome::NOTIFICATION_PANEL_BOUNDS_ANIMATIONS_FINISHED, | |
179 content::Source<PanelOverflowStrip>( | |
180 PanelManager::GetInstance()->panel_overflow_strip())); | |
181 MoveMouse(position); | |
182 signal.Wait(); | |
183 } | |
184 | |
185 static bool IsPanelVisible(Panel* panel) { | |
186 return !panel->GetBounds().IsEmpty(); | |
187 } | |
188 | |
189 void CreateOverflowPanels(int num_normal_panels, | |
190 int num_overflow_panels, | |
191 const int* panel_widthes) { | |
jennb
2011/12/10 00:42:46
typo: widths
jianli
2011/12/13 23:23:40
Done.
| |
192 const int kTestPanelHeight = 200; | |
193 | |
194 // First, create normal panels to fill the panel strip. | |
195 int i = 0; | |
196 for (i = 0; i < num_normal_panels; ++i) { | |
jennb
2011/12/10 00:42:46
i already initialized to 0
jianli
2011/12/13 23:23:40
Done.
| |
197 CreatePanelParams params( | |
198 GetPanelName(i), | |
199 gfx::Rect(0, 0, panel_widthes[i], kTestPanelHeight), | |
200 SHOW_AS_INACTIVE); | |
201 CreatePanelWithParams(params); | |
202 } | |
203 | |
204 // Then, create panels that would be placed in the overflow strip. | |
205 for (; i < num_normal_panels + num_overflow_panels; ++i) { | |
jennb
2011/12/10 00:42:46
nit: sum once and use var in conditional
jianli
2011/12/13 23:23:40
Done.
| |
206 CreatePanelParams params( | |
207 GetPanelName(i), | |
208 gfx::Rect(0, 0, panel_widthes[i], kTestPanelHeight), | |
209 SHOW_AS_INACTIVE); | |
210 Panel* panel = CreatePanelWithParams(params); | |
211 WaitForExpansionStateChanged(panel, Panel::IN_OVERFLOW); | |
212 } | |
213 } | |
214 }; | |
215 | |
216 // TODO(jianli): remove the guard when overflow support is enabled on other | |
jennb
2011/12/10 00:42:46
Or just #if this entire file for OS_WIN.
jianli
2011/12/13 23:23:40
I would like to have this file compiled also for o
| |
217 // platforms. http://crbug.com/105073 | |
218 #if defined(OS_WIN) | |
219 #define MAYBE_CreateOverflowPanels CreateOverflowPanels | |
220 #define MAYBE_CreateMoreOverflowPanels CreateMoreOverflowPanels | |
221 #define MAYBE_CreatePanelOnDelayedOverflow FAILS_CreatePanelOnDelayedOverflow | |
222 #define MAYBE_CloseOverflowPanels CloseOverflowPanels | |
223 #define MAYBE_CloseNormalPanels CloseNormalPanels | |
224 #define MAYBE_ActivateOverflowPanels ActivateOverflowPanels | |
225 #define MAYBE_HoverOverOverflowArea HoverOverOverflowArea | |
226 #else | |
227 #define MAYBE_CreateOverflowPanels DISABLED_CreateOverflowPanels | |
228 #define MAYBE_CreateMoreOverflowPanels DISABLED_CreateMoreOverflowPanels | |
229 #define MAYBE_CreatePanelOnDelayedOverflow DISABLED_CreatePanelOnDelayedOverflow | |
230 #define MAYBE_CloseOverflowPanels DISABLED_CloseOverflowPanels | |
231 #define MAYBE_CloseNormalPanels DISABLED_CloseNormalPanels | |
232 #define MAYBE_ActivateOverflowPanels DISABLED_ActivateOverflowPanels | |
233 #define MAYBE_HoverOverOverflowArea DISABLED_HoverOverOverflowArea | |
234 #endif | |
235 | |
236 IN_PROC_BROWSER_TEST_F(OverflowPanelBrowserTest, MAYBE_CreateOverflowPanels) { | |
237 PanelManager* panel_manager = PanelManager::GetInstance(); | |
238 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
239 PanelOverflowStrip* panel_overflow_strip = | |
240 panel_manager->panel_overflow_strip(); | |
241 | |
242 const int panel_widthes[] = { | |
243 250, 260, 200, // normal | |
244 255, 220 // overflow | |
245 }; | |
246 CreateOverflowPanels(3, 2, panel_widthes); | |
247 | |
248 std::vector<Panel*> panels = panel_manager->panels(); | |
249 ASSERT_EQ(5, panels.size()); | |
250 EXPECT_EQ(3, panel_strip->num_panels()); | |
251 EXPECT_EQ(2, panel_overflow_strip->num_panels()); | |
252 EXPECT_EQ(Panel::IN_OVERFLOW, panels[3]->expansion_state()); | |
253 EXPECT_TRUE(IsPanelVisible(panels[3])); | |
254 EXPECT_EQ(Panel::IN_OVERFLOW, panels[4]->expansion_state()); | |
255 EXPECT_TRUE(IsPanelVisible(panels[4])); | |
256 | |
257 PanelManager::GetInstance()->RemoveAll(); | |
258 } | |
259 | |
260 IN_PROC_BROWSER_TEST_F(OverflowPanelBrowserTest, | |
261 MAYBE_CreateMoreOverflowPanels) { | |
262 PanelManager* panel_manager = PanelManager::GetInstance(); | |
263 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
264 PanelOverflowStrip* panel_overflow_strip = | |
265 panel_manager->panel_overflow_strip(); | |
266 | |
267 const int panel_widthes[] = { | |
268 250, 260, 200, // normal | |
269 255, 220, 210, // overflow | |
270 220, 230 // overflow-on-overflow | |
271 }; | |
272 CreateOverflowPanels(3, 5, panel_widthes); | |
273 | |
274 std::vector<Panel*> panels = panel_manager->panels(); | |
275 ASSERT_EQ(8, panels.size()); | |
276 EXPECT_EQ(3, panel_strip->num_panels()); | |
277 EXPECT_EQ(5, panel_overflow_strip->num_panels()); | |
278 EXPECT_EQ(Panel::IN_OVERFLOW, panels[3]->expansion_state()); | |
279 EXPECT_TRUE(IsPanelVisible(panels[3])); | |
280 EXPECT_EQ(Panel::IN_OVERFLOW, panels[4]->expansion_state()); | |
281 EXPECT_TRUE(IsPanelVisible(panels[4])); | |
282 EXPECT_EQ(Panel::IN_OVERFLOW, panels[5]->expansion_state()); | |
283 EXPECT_TRUE(IsPanelVisible(panels[5])); | |
284 EXPECT_EQ(Panel::IN_OVERFLOW, panels[6]->expansion_state()); | |
285 EXPECT_FALSE(IsPanelVisible(panels[6])); | |
286 EXPECT_EQ(Panel::IN_OVERFLOW, panels[7]->expansion_state()); | |
287 EXPECT_FALSE(IsPanelVisible(panels[7])); | |
288 | |
289 PanelManager::GetInstance()->RemoveAll(); | |
290 } | |
291 | |
292 IN_PROC_BROWSER_TEST_F(OverflowPanelBrowserTest, | |
jennb
2011/12/10 00:42:46
Log bug for this one and comment here?
jianli
2011/12/13 23:23:40
Done. Comment added at the line "#define MAYBE_Cre
| |
293 MAYBE_CreatePanelOnDelayedOverflow) { | |
294 // Create 2 big panels. | |
295 Panel* panel0 = CreatePanelWithBounds("Panel0", gfx::Rect(0, 0, 260, 200)); | |
296 Panel* panel1 = CreatePanelWithBounds("Panel1", gfx::Rect(0, 0, 260, 200)); | |
297 | |
298 // Create 2 overflow panels without waiting them to be moved to overflow. | |
jennb
2011/12/10 00:42:46
grammar: waiting them
jianli
2011/12/13 23:23:40
Done.
| |
299 CreatePanelParams params( | |
300 "Panel2", gfx::Rect(0, 0, 255, 200), SHOW_AS_INACTIVE); | |
jennb
2011/12/10 00:42:46
Does it need to be SHOW_AS_INACTIVE for this test
jianli
2011/12/13 23:23:40
No. Change to SHOW_AS_ACTIVE.
| |
301 Panel* panel2 = CreatePanelWithParams(params); | |
302 CreatePanelParams params2( | |
303 "Panel3", gfx::Rect(0, 0, 255, 200), SHOW_AS_INACTIVE); | |
304 Panel* panel3 = CreatePanelWithParams(params2); | |
305 | |
306 // Create 1 small panel that could fit within the available space in the | |
307 // panel strip. | |
308 Panel* panel4 = CreatePanelWithBounds("Panel4", gfx::Rect(0, 0, 100, 200)); | |
309 EXPECT_EQ(Panel::EXPANDED, panel4->expansion_state()); | |
310 EXPECT_FALSE(panel4->has_temporary_layout()); | |
311 | |
312 PanelManager::GetInstance()->RemoveAll(); | |
313 } | |
314 | |
315 IN_PROC_BROWSER_TEST_F(OverflowPanelBrowserTest, MAYBE_CloseOverflowPanels) { | |
316 PanelManager* panel_manager = PanelManager::GetInstance(); | |
317 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
318 PanelOverflowStrip* panel_overflow_strip = | |
319 panel_manager->panel_overflow_strip(); | |
320 | |
321 // Create normal and overflow panels. | |
322 // normal: P0, P1, P2 | |
323 // overflow: P3, P4, P5 | |
324 // overflow-on-overflow: P6, P7 | |
325 int num_normal_panels = 3; | |
326 int num_overflow_panels = 5; | |
327 const int panel_widthes[] = { | |
328 260, 250, 200, // normal | |
329 255, 260, 120, // overflow | |
330 240, 210 // overflow-on-overflow | |
331 }; | |
332 CreateOverflowPanels(num_normal_panels, num_overflow_panels, panel_widthes); | |
333 NormalPanelDataList normal_panel_data_list = GetAllNormalPanelData(); | |
334 ASSERT_EQ(3, normal_panel_data_list.size()); | |
335 OverflowPanelDataList overflow_panel_data_list = GetAllOverflowPanelData(); | |
336 ASSERT_EQ(5, overflow_panel_data_list.size()); | |
337 Panel* panel3 = overflow_panel_data_list[1].panel; | |
jennb
2011/12/10 00:42:46
isn't panel3 at index 0, and panel4 at index 1?
jianli
2011/12/13 23:23:40
Done.
| |
338 Panel* panel4 = overflow_panel_data_list[2].panel; | |
339 Panel* panel6 = overflow_panel_data_list[3].panel; | |
340 Panel* panel7 = overflow_panel_data_list[4].panel; | |
341 | |
342 // Close an overflow-on-overflow panel. Expect only that panel is closed. | |
343 // normal: P0, P1, P2 | |
344 // overflow: P3, P4, P5, | |
345 // overflow-on-overflow: P7 | |
346 CloseWindowAndWait(panel6->browser()); | |
347 num_overflow_panels--; | |
348 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
349 panel_manager->num_panels()); | |
350 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
351 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
352 overflow_panel_data_list.remove(panel6); | |
353 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
jennb
2011/12/10 00:42:46
It doesn't look like these actually check the curr
jianli
2011/12/13 23:23:40
I added the check before we perform the 1st close
| |
354 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
355 | |
356 // Close an overflow panel. Expect an overflow-on-overflow panel to become | |
357 // visible in the overflow strip. | |
358 // normal: P0, P1, P2 | |
359 // overflow: P3, P5, P7 | |
360 CloseWindowAndWait(panel4->browser()); | |
361 num_overflow_panels--; | |
362 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
363 panel_manager->num_panels()); | |
364 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
365 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
366 overflow_panel_data_list.remove(panel4); | |
367 overflow_panel_data_list.get(panel7)->visible = true; | |
368 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
369 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
370 | |
371 // Close an overflow panel. Expect only that panel is closed. | |
372 CloseWindowAndWait(panel3->browser()); | |
373 num_overflow_panels--; | |
374 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
375 panel_manager->num_panels()); | |
376 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
377 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
378 overflow_panel_data_list.remove(panel3); | |
379 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
380 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
381 | |
382 panel_manager->RemoveAll(); | |
383 } | |
384 | |
385 IN_PROC_BROWSER_TEST_F(OverflowPanelBrowserTest, MAYBE_CloseNormalPanels) { | |
386 PanelManager* panel_manager = PanelManager::GetInstance(); | |
387 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
388 PanelOverflowStrip* panel_overflow_strip = | |
389 panel_manager->panel_overflow_strip(); | |
390 | |
391 // Create normal and overflow panels. | |
392 // normal: P0, P1, P2 | |
393 // overflow: P3, P4, P5 | |
394 // overflow-on-overflow: P6, P7, P8 | |
395 int num_normal_panels = 3; | |
396 int num_overflow_panels = 6; | |
397 const int panel_widthes[] = { | |
398 260, 250, 200, // normal | |
399 255, 260, 120, // overflow | |
400 240, 210, 258 // overflow-on-overflow | |
401 }; | |
402 CreateOverflowPanels(num_normal_panels, num_overflow_panels, panel_widthes); | |
403 NormalPanelDataList normal_panel_data_list = GetAllNormalPanelData(); | |
404 ASSERT_EQ(3, normal_panel_data_list.size()); | |
405 OverflowPanelDataList overflow_panel_data_list = GetAllOverflowPanelData(); | |
406 ASSERT_EQ(6, overflow_panel_data_list.size()); | |
407 Panel* panel0 = normal_panel_data_list[0].panel; | |
408 Panel* panel1 = normal_panel_data_list[1].panel; | |
409 Panel* panel2 = normal_panel_data_list[2].panel; | |
410 Panel* panel3 = overflow_panel_data_list[0].panel; | |
411 Panel* panel4 = overflow_panel_data_list[1].panel; | |
412 Panel* panel5 = overflow_panel_data_list[2].panel; | |
413 Panel* panel6 = overflow_panel_data_list[3].panel; | |
414 Panel* panel7 = overflow_panel_data_list[4].panel; | |
415 Panel* panel8 = overflow_panel_data_list[5].panel; | |
416 | |
417 // Close a normal panel. Expect an overflow panel to move over and an | |
418 // overflow-on-overflow panel to become visible. | |
419 // normal: P0, P2, P3 | |
420 // overflow: P4, P5, P6 | |
421 // overflow-on-overflow: P7, P8 | |
422 CloseWindowAndWait(panel1->browser()); | |
423 num_overflow_panels--; | |
424 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
425 panel_manager->num_panels()); | |
426 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
427 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
428 normal_panel_data_list.remove(panel1); | |
429 normal_panel_data_list.push_back(overflow_panel_data_list.remove(panel3)); | |
430 overflow_panel_data_list.get(panel6)->visible = true; | |
431 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
432 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
433 | |
434 // Close another normal panel. Remaining overflow panels cannot move over | |
435 // due to not enough room. | |
436 // normal: P0, P3 | |
437 // overflow: P4, P5, P6 | |
438 // overflow-on-overflow: P7, P8 | |
439 CloseWindowAndWait(panel2->browser()); | |
440 num_normal_panels--; | |
441 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
442 panel_manager->num_panels()); | |
443 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
444 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
445 normal_panel_data_list.remove(panel2); | |
446 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
447 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
448 | |
449 // Close one more normal panel. Expect two overflow panels to move over and | |
450 // two overflow-on-overflow panels to become visible. | |
451 // normal: P0, P4, P5 | |
452 // overflow: P6, P7, P8 | |
453 CloseWindowAndWait(panel3->browser()); | |
454 num_normal_panels++; | |
455 num_overflow_panels -= 2; | |
456 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
457 panel_manager->num_panels()); | |
458 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
459 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
460 normal_panel_data_list.remove(panel3); | |
461 normal_panel_data_list.push_back(overflow_panel_data_list.remove(panel4)); | |
462 normal_panel_data_list.push_back(overflow_panel_data_list.remove(panel5)); | |
463 overflow_panel_data_list.get(panel7)->visible = true; | |
464 overflow_panel_data_list.get(panel8)->visible = true; | |
465 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
466 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
467 | |
468 // Close another normal panel. Expect one overflow panel to move over. | |
469 // normal: P4, P5, P6 | |
470 // overflow: P7, P8 | |
471 CloseWindowAndWait(panel0->browser()); | |
472 num_overflow_panels--; | |
473 ASSERT_EQ(num_normal_panels + num_overflow_panels, | |
474 panel_manager->num_panels()); | |
475 EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); | |
476 EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); | |
477 normal_panel_data_list.remove(panel0); | |
478 normal_panel_data_list.push_back(overflow_panel_data_list.remove(panel6)); | |
479 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
480 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
481 | |
482 panel_manager->RemoveAll(); | |
483 } | |
484 | |
485 IN_PROC_BROWSER_TEST_F(OverflowPanelBrowserTest, MAYBE_ActivateOverflowPanels) { | |
486 PanelManager* panel_manager = PanelManager::GetInstance(); | |
487 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
488 PanelOverflowStrip* panel_overflow_strip = | |
489 panel_manager->panel_overflow_strip(); | |
490 panel_overflow_strip->set_max_visible_panels(3); | |
491 | |
492 // Create normal and overflow panels. | |
493 // normal: P0, P1, P2 | |
494 // overflow: P3, P4, P5 | |
495 // overflow-on-overflow: P6, P7 | |
496 const int panel_widthes[] = { | |
497 250, 260, 200, // normal | |
498 210, 260, 230, // overflow | |
499 255, 210 // overflow-on-overflow | |
500 }; | |
501 int num_normal_panels = 3; | |
502 int num_overflow_panels = 5; | |
503 CreateOverflowPanels(num_normal_panels, num_overflow_panels, panel_widthes); | |
504 NormalPanelDataList normal_panel_data_list = GetAllNormalPanelData(); | |
505 ASSERT_EQ(3, normal_panel_data_list.size()); | |
506 OverflowPanelDataList overflow_panel_data_list = GetAllOverflowPanelData(); | |
507 ASSERT_EQ(5, overflow_panel_data_list.size()); | |
508 Panel* panel1 = normal_panel_data_list[1].panel; | |
509 Panel* panel2 = normal_panel_data_list[2].panel; | |
510 Panel* panel3 = overflow_panel_data_list[0].panel; | |
511 Panel* panel4 = overflow_panel_data_list[1].panel; | |
512 Panel* panel5 = overflow_panel_data_list[2].panel; | |
513 Panel* panel6 = overflow_panel_data_list[3].panel; | |
514 Panel* panel7 = overflow_panel_data_list[4].panel; | |
515 | |
516 // Activate an overflow panel. Expect one normal panel is swapped into the | |
517 // overflow strip. | |
518 // normal: P0, P1, P3 | |
519 // overflow: P2, P4, P5 | |
520 // overflow-on-overflow: P6, P7 | |
521 panel3->Activate(); | |
522 WaitForPanelActiveState(panel3, SHOW_AS_ACTIVE); | |
jennb
2011/12/10 00:42:46
Should be waiting for expansion state change to IN
jianli
2011/12/13 23:23:40
Done.
| |
523 overflow_panel_data_list.push_front(normal_panel_data_list.remove(panel2)); | |
524 normal_panel_data_list.push_back(overflow_panel_data_list.remove(panel3)); | |
525 normal_panel_data_list.get(panel3)->active = true; | |
526 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
527 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
528 | |
529 // Activate an overflow panel. Expect two normal panels are swapped into the | |
530 // overflow strip and one overflow panel to become hidden. | |
531 // normal: P0, P4 | |
532 // overflow: P1, P3, P2 | |
533 // overflow-on-overflow: P5, P6, P7 | |
534 panel4->Activate(); | |
535 WaitForPanelActiveState(panel4, SHOW_AS_ACTIVE); | |
536 WaitForPanelActiveState(panel3, SHOW_AS_INACTIVE); | |
537 overflow_panel_data_list.push_front(normal_panel_data_list.remove(panel3)); | |
538 overflow_panel_data_list.push_front(normal_panel_data_list.remove(panel1)); | |
539 normal_panel_data_list.push_back(overflow_panel_data_list.remove(panel4)); | |
540 normal_panel_data_list.get(panel4)->active = true; | |
541 overflow_panel_data_list.get(panel3)->active = false; | |
542 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
543 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
544 | |
545 // Activate an overflow-on-overflow panel. Expect one normal panel is swapped | |
546 // into the overflow strip. | |
547 // normal: P0, P6 | |
548 // overflow: P4, P1, P3, | |
549 // overflow-on-overflow: P2, P5, P7 | |
550 panel6->Activate(); | |
551 WaitForPanelActiveState(panel6, SHOW_AS_ACTIVE); | |
552 WaitForPanelActiveState(panel4, SHOW_AS_INACTIVE); | |
553 overflow_panel_data_list.push_front(normal_panel_data_list.remove(panel4)); | |
554 normal_panel_data_list.push_back(overflow_panel_data_list.remove(panel6)); | |
555 normal_panel_data_list.get(panel6)->active = true; | |
556 overflow_panel_data_list.get(panel4)->active = false; | |
557 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
558 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
559 | |
560 // Activate an overflow-on-overflow panel. Not any normal panel is swapped | |
561 // since there has already been enough space in the panel strip. | |
562 // normal: P0, P6, P7 | |
563 // overflow: P4, P1, P3, | |
564 // overflow-on-overflow: P2, P5 | |
565 panel7->Activate(); | |
566 WaitForPanelActiveState(panel7, SHOW_AS_ACTIVE); | |
567 WaitForPanelActiveState(panel6, SHOW_AS_INACTIVE); | |
568 normal_panel_data_list.push_back(overflow_panel_data_list.remove(panel7)); | |
569 normal_panel_data_list.get(panel7)->active = true; | |
570 normal_panel_data_list.get(panel6)->active = false; | |
571 EXPECT_EQ(normal_panel_data_list, GetAllNormalPanelData()); | |
572 EXPECT_EQ(overflow_panel_data_list, GetAllOverflowPanelData()); | |
573 | |
574 panel_manager->RemoveAll(); | |
575 } | |
576 | |
577 IN_PROC_BROWSER_TEST_F(OverflowPanelBrowserTest, MAYBE_HoverOverOverflowArea) { | |
578 PanelManager* panel_manager = PanelManager::GetInstance(); | |
579 PanelMouseWatcher* mouse_watcher = new TestPanelMouseWatcher(); | |
580 panel_manager->SetMouseWatcherForTesting(mouse_watcher); | |
581 PanelStrip* panel_strip = panel_manager->panel_strip(); | |
582 PanelOverflowStrip* panel_overflow_strip = | |
583 panel_manager->panel_overflow_strip(); | |
584 panel_overflow_strip->set_max_visible_panels(3); | |
585 int hover_width = PanelOverflowStrip::kOverflowAreaHoverWidth; | |
586 | |
587 // Create normal and overflow panels. | |
588 // normal: P0, P1, P2 | |
589 // overflow: P3, P4, P5 | |
590 // overflow-on-overflow: P6, P7 | |
591 const int panel_widthes[] = { | |
592 250, 260, 200, // normal | |
593 255, 220, 260, // overflow | |
594 140, 210 // overflow-on-overflow | |
595 }; | |
596 int num_normal_panels = 3; | |
597 int num_overflow_panels = 5; | |
598 CreateOverflowPanels(num_normal_panels, num_overflow_panels, panel_widthes); | |
599 OverflowPanelDataList overflow_panel_data_list = GetAllOverflowPanelData(); | |
600 ASSERT_EQ(5, overflow_panel_data_list.size()); | |
601 Panel* panel3 = overflow_panel_data_list[0].panel; | |
602 Panel* panel4 = overflow_panel_data_list[1].panel; | |
603 Panel* panel5 = overflow_panel_data_list[2].panel; | |
604 Panel* panel6 = overflow_panel_data_list[3].panel; | |
605 Panel* panel7 = overflow_panel_data_list[4].panel; | |
606 int iconified_width = panel4->GetBounds().width(); | |
607 gfx::Rect iconified_bounds3 = overflow_panel_data_list[0].panel->GetBounds(); | |
608 gfx::Rect iconified_bounds5 = overflow_panel_data_list[2].panel->GetBounds(); | |
609 | |
610 // Test that only the mouse point within the shrunk overflow area will | |
611 // expand the overflow area. | |
612 EXPECT_TRUE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
jennb
2011/12/10 00:42:46
Should be able to use MouseMove() in this test if
jianli
2011/12/13 23:23:40
Done.
| |
613 iconified_bounds5.origin())); | |
614 EXPECT_TRUE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
615 gfx::Point(iconified_bounds5.x() - 1, iconified_bounds5.y()))); | |
616 EXPECT_FALSE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
617 gfx::Point(iconified_bounds5.right() + 1, iconified_bounds5.y()))); | |
618 EXPECT_FALSE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
619 gfx::Point(iconified_bounds5.x(), iconified_bounds5.y() - 1))); | |
620 EXPECT_FALSE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
621 gfx::Point(iconified_bounds3.x(), iconified_bounds3.bottom() + 1))); | |
622 | |
623 // Hover mouse on an overflow panel. | |
624 gfx::Point hover_point(panel4->GetBounds().origin()); | |
625 MoveMouseAndWaitForOverflowAnimationEnded(hover_point); | |
626 EXPECT_EQ(hover_width, panel3->GetBounds().width()); | |
jennb
2011/12/10 00:42:46
Could iterate over all panels in overflow strip to
jianli
2011/12/13 23:23:40
Done.
| |
627 EXPECT_EQ(hover_width, panel4->GetBounds().width()); | |
628 EXPECT_EQ(hover_width, panel5->GetBounds().width()); | |
629 EXPECT_EQ(hover_width, panel6->GetBounds().width()); | |
630 EXPECT_EQ(hover_width, panel7->GetBounds().width()); | |
631 | |
632 // Test that only the mouse outside the expanded overflow area will | |
633 // shrink the overflow area. | |
634 EXPECT_TRUE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
635 iconified_bounds5.origin())); | |
636 EXPECT_TRUE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
637 gfx::Point(iconified_bounds5.x() - 1, iconified_bounds5.y()))); | |
638 EXPECT_TRUE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
639 gfx::Point(iconified_bounds5.x() + hover_width, iconified_bounds5.y()))); | |
640 EXPECT_FALSE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
641 gfx::Point(iconified_bounds5.x() + hover_width + 1, | |
jennb
2011/12/10 00:42:46
instead of iconified.x+hover_width, could you just
jianli
2011/12/13 23:23:40
Done.
| |
642 iconified_bounds5.y()))); | |
643 | |
644 EXPECT_TRUE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
645 panel7->GetBounds().origin())); | |
646 EXPECT_FALSE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
647 gfx::Point(panel7->GetBounds().x(), panel7->GetBounds().y() - 1))); | |
648 EXPECT_TRUE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
649 gfx::Point(iconified_bounds3.x(), iconified_bounds3.bottom()))); | |
650 EXPECT_FALSE(panel_overflow_strip->TestShouldShowOverflowTitles( | |
651 gfx::Point(iconified_bounds3.x(), iconified_bounds3.bottom() + 1))); | |
652 | |
653 // Move mouse away from the expanded overflow area. | |
654 hover_point.set_x(hover_point.x() + hover_width + 10); | |
655 MoveMouseAndWaitForOverflowAnimationEnded(hover_point); | |
656 EXPECT_EQ(iconified_width, panel3->GetBounds().width()); | |
657 EXPECT_EQ(iconified_width, panel4->GetBounds().width()); | |
658 EXPECT_EQ(iconified_width, panel5->GetBounds().width()); | |
659 EXPECT_EQ(0, panel6->GetBounds().width()); | |
660 EXPECT_EQ(0, panel7->GetBounds().width()); | |
661 | |
662 panel_manager->RemoveAll(); | |
663 } | |
OLD | NEW |