Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(294)

Side by Side Diff: chrome/browser/ui/panels/overflow_panel_browsertest.cc

Issue 8872044: Add test cases for panel overflow handling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix per feedback Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698