1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/message_loop/message_loop.h"
6 #include "chrome/browser/chrome_notification_types.h"
7 #include "chrome/browser/ui/panels/base_panel_browser_test.h"
8 #include "chrome/browser/ui/panels/detached_panel_collection.h"
9 #include "chrome/browser/ui/panels/docked_panel_collection.h"
10 #include "chrome/browser/ui/panels/native_panel.h"
11 #include "chrome/browser/ui/panels/panel.h"
12 #include "chrome/browser/ui/panels/panel_drag_controller.h"
13 #include "chrome/browser/ui/panels/panel_manager.h"
14 #include "chrome/browser/ui/panels/stacked_panel_collection.h"
15 #include "chrome/browser/ui/panels/test_panel_collection_squeeze_observer.h"
16 #include "content/public/browser/notification_service.h"
17 #include "content/public/test/test_utils.h"
19 class PanelDragBrowserTest
: public BasePanelBrowserTest
{
21 PanelDragBrowserTest() : BasePanelBrowserTest() {
24 virtual ~PanelDragBrowserTest() {
27 virtual void SetUpOnMainThread() OVERRIDE
{
28 BasePanelBrowserTest::SetUpOnMainThread();
30 // All the tests here assume using mocked 800x600 display area for the
31 // primary monitor. Do the check now.
32 gfx::Rect primary_display_area
= PanelManager::GetInstance()->
33 display_settings_provider()->GetPrimaryDisplayArea();
34 DCHECK(primary_display_area
.width() == 800);
35 DCHECK(primary_display_area
.height() == 600);
38 // Drag |panel| from its origin by the offset |delta|.
39 void DragPanelByDelta(Panel
* panel
, const gfx::Vector2d
& delta
) {
40 scoped_ptr
<NativePanelTesting
> panel_testing(
41 CreateNativePanelTesting(panel
));
42 gfx::Point
mouse_location(panel
->GetBounds().origin());
43 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
44 panel_testing
->DragTitlebar(mouse_location
+ delta
);
45 panel_testing
->FinishDragTitlebar();
48 // Drag |panel| from its origin to |new_mouse_location|.
49 void DragPanelToMouseLocation(Panel
* panel
,
50 const gfx::Point
& new_mouse_location
) {
51 scoped_ptr
<NativePanelTesting
> panel_testing(
52 CreateNativePanelTesting(panel
));
53 gfx::Point
mouse_location(panel
->GetBounds().origin());
54 panel_testing
->PressLeftMouseButtonTitlebar(panel
->GetBounds().origin());
55 panel_testing
->DragTitlebar(new_mouse_location
);
56 panel_testing
->FinishDragTitlebar();
59 // Return the bounds of a panel given its initial bounds and the bounds of the
61 static gfx::Rect
GetStackedAtBottomPanelBounds(
62 const gfx::Rect
& initial_bounds
,
63 const gfx::Rect
& above_bounds
) {
64 return gfx::Rect(above_bounds
.x(),
65 above_bounds
.bottom(),
67 initial_bounds
.height());
70 // Return the bounds of a panel given its initial bounds and the bounds of the
72 static gfx::Rect
GetStackedAtTopPanelBounds(
73 const gfx::Rect
& initial_bounds
,
74 const gfx::Rect
& below_bounds
) {
75 return gfx::Rect(below_bounds
.x(),
76 below_bounds
.y() - initial_bounds
.height(),
77 initial_bounds
.width(),
78 initial_bounds
.height());
81 static gfx::Vector2d
GetDragDeltaToRemainDocked() {
84 -(PanelDragController::GetDetachDockedPanelThresholdForTesting() / 2));
87 static gfx::Vector2d
GetDragDeltaToDetach() {
90 -(PanelDragController::GetDetachDockedPanelThresholdForTesting() + 20));
93 static gfx::Vector2d
GetDragDeltaToRemainDetached(Panel
* panel
) {
95 panel
->manager()->docked_collection()->work_area().bottom() -
96 panel
->GetBounds().bottom();
100 PanelDragController::GetDockDetachedPanelThresholdForTesting() * 2);
103 static gfx::Vector2d
GetDragDeltaToAttach(Panel
* panel
) {
105 panel
->manager()->docked_collection()->work_area().bottom() -
106 panel
->GetBounds().bottom();
107 return gfx::Vector2d(
110 PanelDragController::GetDockDetachedPanelThresholdForTesting() / 2);
113 // Return the delta needed to drag |panel1| to stack to the bottom of
115 static gfx::Vector2d
GetDragDeltaToStackToBottom(Panel
* panel1
,
117 gfx::Rect bounds1
= panel1
->GetBounds();
118 gfx::Rect bounds2
= panel2
->GetBounds();
119 return gfx::Vector2d(
120 bounds2
.x() - bounds1
.x(),
121 bounds2
.bottom() - bounds1
.y() +
122 PanelDragController::GetGluePanelDistanceThresholdForTesting() / 2);
125 // Return the delta needed to drag |panel1| to unstack from the bottom of
127 static gfx::Vector2d
GetDragDeltaToUnstackFromBottom(Panel
* panel1
,
129 gfx::Rect bounds1
= panel1
->GetBounds();
130 gfx::Rect bounds2
= panel2
->GetBounds();
131 return gfx::Vector2d(
132 0, PanelDragController::GetGluePanelDistanceThresholdForTesting() * 2);
135 // Return the delta needed to drag |panel1| to stack to the top of |panel2|.
136 static gfx::Vector2d
GetDragDeltaToStackToTop(Panel
* panel1
, Panel
* panel2
) {
137 gfx::Rect bounds1
= panel1
->GetBounds();
138 gfx::Rect bounds2
= panel2
->GetBounds();
139 StackedPanelCollection
* stack1
= panel1
->stack();
140 int bottom
= stack1
? stack1
->bottom_panel()->GetBounds().bottom()
142 return gfx::Vector2d(
143 bounds2
.x() - bounds1
.x(),
144 bounds2
.y() - bottom
-
145 PanelDragController::GetGluePanelDistanceThresholdForTesting() / 2);
148 // Return the delta needed to drag |panel1| to unstack from the top of
150 static gfx::Vector2d
GetDragDeltaToUnstackFromTop(Panel
* panel1
,
152 gfx::Rect bounds1
= panel1
->GetBounds();
153 gfx::Rect bounds2
= panel2
->GetBounds();
154 return gfx::Vector2d(
155 0, -PanelDragController::GetGluePanelDistanceThresholdForTesting() * 2);
158 // Return the delta needed to drag |panel1| to snap to the left of |panel2|.
159 static gfx::Vector2d
GetDragDeltaToSnapToLeft(Panel
* panel1
,
161 gfx::Rect bounds1
= panel1
->GetBounds();
162 gfx::Rect bounds2
= panel2
->GetBounds();
163 return gfx::Vector2d(
164 bounds2
.x() - bounds1
.width() - bounds1
.x() -
165 PanelDragController::GetGluePanelDistanceThresholdForTesting() / 2,
166 bounds2
.y() - bounds1
.y() +
167 PanelDragController::GetGluePanelDistanceThresholdForTesting() * 2);
170 // Return the delta needed to drag |panel1| to snap to the right of |panel2|.
171 static gfx::Vector2d
GetDragDeltaToSnapToRight(Panel
* panel1
,
173 gfx::Rect bounds1
= panel1
->GetBounds();
174 gfx::Rect bounds2
= panel2
->GetBounds();
175 return gfx::Vector2d(
176 bounds2
.right() - bounds1
.x() +
177 PanelDragController::GetGluePanelDistanceThresholdForTesting() / 2,
178 bounds2
.y() - bounds1
.y() +
179 PanelDragController::GetGluePanelDistanceThresholdForTesting() * 2);
182 // Return the delta needed to drag |panel| to unsnap from its current
184 static gfx::Vector2d
GetDragDeltaToUnsnap(Panel
* panel
) {
185 return gfx::Vector2d(
186 PanelDragController::GetGluePanelDistanceThresholdForTesting() * 2, 0);
190 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, DragOneDockedPanel
) {
191 static const int big_delta_x
= 70;
192 static const int big_delta_y
= 30; // Do not exceed the threshold to detach.
194 Panel
* panel
= CreateDockedPanel("1", gfx::Rect(0, 0, 100, 100));
195 scoped_ptr
<NativePanelTesting
> panel_testing(
196 CreateNativePanelTesting(panel
));
197 gfx::Rect panel_old_bounds
= panel
->GetBounds();
200 gfx::Point mouse_location
= panel_old_bounds
.origin();
201 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
202 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
204 mouse_location
.Offset(-big_delta_x
, 0);
205 panel_testing
->DragTitlebar(mouse_location
);
206 gfx::Rect panel_new_bounds
= panel_old_bounds
;
207 panel_new_bounds
.Offset(-big_delta_x
, 0);
208 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
210 panel_testing
->FinishDragTitlebar();
211 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
213 // Drag left and cancel.
214 mouse_location
= panel_old_bounds
.origin();
215 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
216 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
218 mouse_location
.Offset(-big_delta_x
, 0);
219 panel_testing
->DragTitlebar(mouse_location
);
220 panel_new_bounds
= panel_old_bounds
;
221 panel_new_bounds
.Offset(-big_delta_x
, 0);
222 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
224 panel_testing
->CancelDragTitlebar();
225 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
228 mouse_location
= panel_old_bounds
.origin();
229 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
230 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
232 mouse_location
.Offset(big_delta_x
, 0);
233 panel_testing
->DragTitlebar(mouse_location
);
234 panel_new_bounds
= panel_old_bounds
;
235 panel_new_bounds
.Offset(big_delta_x
, 0);
236 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
238 panel_testing
->FinishDragTitlebar();
239 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
241 // Drag right and up. Expect no vertical movement.
242 mouse_location
= panel_old_bounds
.origin();
243 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
244 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
246 mouse_location
.Offset(big_delta_x
, big_delta_y
);
247 panel_testing
->DragTitlebar(mouse_location
);
248 panel_new_bounds
= panel_old_bounds
;
249 panel_new_bounds
.Offset(big_delta_x
, 0);
250 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
252 panel_testing
->FinishDragTitlebar();
253 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
255 // Drag up. Expect no movement on drag.
256 mouse_location
= panel_old_bounds
.origin();
257 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
258 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
260 mouse_location
.Offset(0, -big_delta_y
);
261 panel_testing
->DragTitlebar(mouse_location
);
262 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
264 panel_testing
->FinishDragTitlebar();
265 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
267 // Drag down. Expect no movement on drag.
268 mouse_location
= panel_old_bounds
.origin();
269 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
270 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
272 mouse_location
.Offset(0, big_delta_y
);
273 panel_testing
->DragTitlebar(mouse_location
);
274 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
276 panel_testing
->FinishDragTitlebar();
277 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
279 PanelManager::GetInstance()->CloseAll();
282 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, DragTwoDockedPanels
) {
283 static const gfx::Vector2d
small_delta(10, 0);
285 Panel
* panel1
= CreateDockedPanel("1", gfx::Rect(0, 0, 100, 100));
286 Panel
* panel2
= CreateDockedPanel("2", gfx::Rect(0, 0, 100, 100));
287 scoped_ptr
<NativePanelTesting
> panel1_testing(
288 CreateNativePanelTesting(panel1
));
289 scoped_ptr
<NativePanelTesting
> panel2_testing(
290 CreateNativePanelTesting(panel2
));
291 gfx::Point position1
= panel1
->GetBounds().origin();
292 gfx::Point position2
= panel2
->GetBounds().origin();
294 // Drag right panel towards left with small delta.
295 // Expect no shuffle: P1 P2
296 gfx::Point mouse_location
= position1
;
297 panel1_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
298 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
299 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
301 mouse_location
= mouse_location
- small_delta
;
302 panel1_testing
->DragTitlebar(mouse_location
);
303 EXPECT_EQ(mouse_location
, panel1
->GetBounds().origin());
304 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
306 panel1_testing
->FinishDragTitlebar();
307 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
308 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
310 // Drag right panel towards left with big delta.
311 // Expect shuffle: P2 P1
312 mouse_location
= position1
;
313 panel1_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
314 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
315 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
317 mouse_location
= position2
+ gfx::Vector2d(1, 0);
318 panel1_testing
->DragTitlebar(mouse_location
);
319 EXPECT_EQ(mouse_location
, panel1
->GetBounds().origin());
320 EXPECT_EQ(position1
, panel2
->GetBounds().origin());
322 panel1_testing
->FinishDragTitlebar();
323 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
324 EXPECT_EQ(position1
, panel2
->GetBounds().origin());
326 // Drag left panel towards right with small delta.
327 // Expect no shuffle: P2 P1
328 mouse_location
= position2
;
329 panel1_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
330 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
331 EXPECT_EQ(position1
, panel2
->GetBounds().origin());
333 mouse_location
= mouse_location
+ small_delta
;
334 panel1_testing
->DragTitlebar(mouse_location
);
335 EXPECT_EQ(mouse_location
, panel1
->GetBounds().origin());
336 EXPECT_EQ(position1
, panel2
->GetBounds().origin());
338 panel1_testing
->FinishDragTitlebar();
339 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
340 EXPECT_EQ(position1
, panel2
->GetBounds().origin());
342 // Drag left panel towards right with big delta.
343 // Expect shuffle: P1 P2
344 mouse_location
= position2
;
345 panel1_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
346 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
347 EXPECT_EQ(position1
, panel2
->GetBounds().origin());
349 mouse_location
= position1
+ gfx::Vector2d(1, 0);
350 panel1_testing
->DragTitlebar(mouse_location
);
351 EXPECT_EQ(mouse_location
, panel1
->GetBounds().origin());
352 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
354 panel1_testing
->FinishDragTitlebar();
355 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
356 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
358 // Drag right panel towards left with big delta and then cancel the drag.
359 // Expect shuffle after drag: P2 P1
360 // Expect shuffle after cancel: P1 P2
361 mouse_location
= position1
;
362 panel1_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
363 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
364 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
366 mouse_location
= position2
+ gfx::Vector2d(1, 0);
367 panel1_testing
->DragTitlebar(mouse_location
);
368 EXPECT_EQ(mouse_location
, panel1
->GetBounds().origin());
369 EXPECT_EQ(position1
, panel2
->GetBounds().origin());
371 panel1_testing
->CancelDragTitlebar();
372 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
373 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
375 PanelManager::GetInstance()->CloseAll();
378 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, DragThreeDockedPanels
) {
379 Panel
* panel1
= CreateDockedPanel("1", gfx::Rect(0, 0, 100, 100));
380 Panel
* panel2
= CreateDockedPanel("2", gfx::Rect(0, 0, 100, 100));
381 Panel
* panel3
= CreateDockedPanel("3", gfx::Rect(0, 0, 100, 100));
382 scoped_ptr
<NativePanelTesting
> panel2_testing(
383 CreateNativePanelTesting(panel2
));
384 scoped_ptr
<NativePanelTesting
> panel3_testing(
385 CreateNativePanelTesting(panel3
));
386 gfx::Point position1
= panel1
->GetBounds().origin();
387 gfx::Point position2
= panel2
->GetBounds().origin();
388 gfx::Point position3
= panel3
->GetBounds().origin();
390 // Drag leftmost panel to become the rightmost in 2 drags. Each drag will
391 // shuffle one panel.
392 // Expect shuffle after 1st drag: P1 P3 P2
393 // Expect shuffle after 2nd drag: P3 P1 P2
394 gfx::Point mouse_location
= position3
;
395 panel3_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
396 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
397 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
398 EXPECT_EQ(position3
, panel3
->GetBounds().origin());
400 mouse_location
= position2
+ gfx::Vector2d(1, 0);
401 panel3_testing
->DragTitlebar(mouse_location
);
402 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
403 EXPECT_EQ(position3
, panel2
->GetBounds().origin());
404 EXPECT_EQ(mouse_location
, panel3
->GetBounds().origin());
406 mouse_location
= position1
+ gfx::Vector2d(1, 0);
407 panel3_testing
->DragTitlebar(mouse_location
);
408 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
409 EXPECT_EQ(position3
, panel2
->GetBounds().origin());
410 EXPECT_EQ(mouse_location
, panel3
->GetBounds().origin());
412 panel3_testing
->FinishDragTitlebar();
413 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
414 EXPECT_EQ(position3
, panel2
->GetBounds().origin());
415 EXPECT_EQ(position1
, panel3
->GetBounds().origin());
417 // Drag rightmost panel to become the leftmost in 2 drags and then cancel the
418 // drag. Each drag will shuffle one panel and the cancellation will restore
420 // Expect shuffle after 1st drag: P1 P3 P2
421 // Expect shuffle after 2nd drag: P1 P2 P3
422 // Expect shuffle after cancel: P3 P1 P2
423 mouse_location
= position1
;
424 panel3_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
425 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
426 EXPECT_EQ(position3
, panel2
->GetBounds().origin());
427 EXPECT_EQ(position1
, panel3
->GetBounds().origin());
429 mouse_location
= position2
+ gfx::Vector2d(1, 0);
430 panel3_testing
->DragTitlebar(mouse_location
);
431 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
432 EXPECT_EQ(position3
, panel2
->GetBounds().origin());
433 EXPECT_EQ(mouse_location
, panel3
->GetBounds().origin());
435 mouse_location
= position3
+ gfx::Vector2d(1, 0);
436 panel3_testing
->DragTitlebar(mouse_location
);
437 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
438 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
439 EXPECT_EQ(mouse_location
, panel3
->GetBounds().origin());
441 panel3_testing
->CancelDragTitlebar();
442 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
443 EXPECT_EQ(position3
, panel2
->GetBounds().origin());
444 EXPECT_EQ(position1
, panel3
->GetBounds().origin());
446 // Drag leftmost panel to become the rightmost in a single drag. The drag will
447 // shuffle 2 panels at a time.
448 // Expect shuffle: P2 P3 P1
449 mouse_location
= position3
;
450 panel2_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
451 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
452 EXPECT_EQ(position3
, panel2
->GetBounds().origin());
453 EXPECT_EQ(position1
, panel3
->GetBounds().origin());
455 mouse_location
= position1
+ gfx::Vector2d(1, 0);
456 panel2_testing
->DragTitlebar(mouse_location
);
457 EXPECT_EQ(position3
, panel1
->GetBounds().origin());
458 EXPECT_EQ(mouse_location
, panel2
->GetBounds().origin());
459 EXPECT_EQ(position2
, panel3
->GetBounds().origin());
461 panel2_testing
->FinishDragTitlebar();
462 EXPECT_EQ(position3
, panel1
->GetBounds().origin());
463 EXPECT_EQ(position1
, panel2
->GetBounds().origin());
464 EXPECT_EQ(position2
, panel3
->GetBounds().origin());
466 // Drag rightmost panel to become the leftmost in a single drag. The drag will
467 // shuffle 2 panels at a time.
468 // Expect shuffle: P3 P1 P2
469 mouse_location
= position1
;
470 panel2_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
471 EXPECT_EQ(position3
, panel1
->GetBounds().origin());
472 EXPECT_EQ(position1
, panel2
->GetBounds().origin());
473 EXPECT_EQ(position2
, panel3
->GetBounds().origin());
475 mouse_location
= position3
+ gfx::Vector2d(1, 0);
476 panel2_testing
->DragTitlebar(mouse_location
);
477 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
478 EXPECT_EQ(mouse_location
, panel2
->GetBounds().origin());
479 EXPECT_EQ(position1
, panel3
->GetBounds().origin());
481 panel2_testing
->FinishDragTitlebar();
482 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
483 EXPECT_EQ(position3
, panel2
->GetBounds().origin());
484 EXPECT_EQ(position1
, panel3
->GetBounds().origin());
486 // Drag rightmost panel to become the leftmost in a single drag and then
487 // cancel the drag. The drag will shuffle 2 panels and the cancellation will
488 // restore all panels.
489 // Expect shuffle after drag: P1 P2 P3
490 // Expect shuffle after cancel: P3 P1 P2
491 mouse_location
= position1
;
492 panel3_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
493 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
494 EXPECT_EQ(position3
, panel2
->GetBounds().origin());
495 EXPECT_EQ(position1
, panel3
->GetBounds().origin());
497 mouse_location
= position3
+ gfx::Vector2d(1, 0);
498 panel3_testing
->DragTitlebar(mouse_location
);
499 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
500 EXPECT_EQ(position2
, panel2
->GetBounds().origin());
501 EXPECT_EQ(mouse_location
, panel3
->GetBounds().origin());
503 panel3_testing
->CancelDragTitlebar();
504 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
505 EXPECT_EQ(position3
, panel2
->GetBounds().origin());
506 EXPECT_EQ(position1
, panel3
->GetBounds().origin());
508 PanelManager::GetInstance()->CloseAll();
511 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, DragMinimizedPanel
) {
512 Panel
* panel
= CreatePanel("panel1");
513 scoped_ptr
<NativePanelTesting
> panel_testing(
514 CreateNativePanelTesting(panel
));
517 EXPECT_EQ(Panel::MINIMIZED
, panel
->expansion_state());
519 // Hover over minimized panel to bring up titlebar.
520 gfx::Point
hover_point(panel
->GetBounds().origin());
521 MoveMouseAndWaitForExpansionStateChange(panel
, hover_point
);
522 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
524 // Verify we can drag a minimized panel.
525 gfx::Rect panel_old_bounds
= panel
->GetBounds();
526 gfx::Point mouse_location
= panel_old_bounds
.origin();
527 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
528 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
529 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
531 mouse_location
.Offset(-70, 0);
532 panel_testing
->DragTitlebar(mouse_location
);
533 gfx::Rect panel_new_bounds
= panel_old_bounds
;
534 panel_new_bounds
.Offset(-70, 0);
535 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
536 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
538 // Verify panel returns to fully minimized state after dragging ends once
539 // mouse moves away from panel.
540 panel_testing
->FinishDragTitlebar();
541 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
543 MoveMouseAndWaitForExpansionStateChange(panel
, mouse_location
);
544 EXPECT_EQ(Panel::MINIMIZED
, panel
->expansion_state());
549 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
,
550 DragMinimizedPanelWhileDrawingAttention
) {
551 Panel
* panel
= CreatePanel("panel1");
552 scoped_ptr
<NativePanelTesting
> panel_testing(
553 CreateNativePanelTesting(panel
));
554 CreatePanel("panel2");
557 EXPECT_EQ(Panel::MINIMIZED
, panel
->expansion_state());
559 panel
->FlashFrame(true);
560 EXPECT_TRUE(panel
->IsDrawingAttention());
561 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
563 // Drag the panel. Verify panel stays in title-only state after attention is
564 // cleared because it is being dragged.
565 gfx::Rect panel_old_bounds
= panel
->GetBounds();
566 gfx::Point mouse_location
= panel_old_bounds
.origin();
567 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
568 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
569 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
571 mouse_location
.Offset(-70, 0);
572 panel_testing
->DragTitlebar(mouse_location
);
573 gfx::Rect panel_new_bounds
= panel_old_bounds
;
574 panel_new_bounds
.Offset(-70, 0);
575 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
577 panel
->FlashFrame(false);
578 EXPECT_FALSE(panel
->IsDrawingAttention());
579 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
581 // Typical user scenario will detect the mouse in the panel
582 // after attention is cleared, causing titles to pop up, so
583 // we simulate that here.
584 MoveMouse(mouse_location
);
586 // Verify panel returns to fully minimized state after dragging ends once
587 // mouse moves away from the panel.
588 panel_testing
->FinishDragTitlebar();
589 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
591 mouse_location
.Offset(0, -50);
592 MoveMouseAndWaitForExpansionStateChange(panel
, mouse_location
);
593 EXPECT_EQ(Panel::MINIMIZED
, panel
->expansion_state());
595 PanelManager::GetInstance()->CloseAll();
598 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, CloseDockedPanelOnDrag
) {
599 PanelManager
* panel_manager
= PanelManager::GetInstance();
600 PanelDragController
* drag_controller
= panel_manager
->drag_controller();
601 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
603 // Create 4 docked panels.
604 // We have: P4 P3 P2 P1
605 Panel
* panel1
= CreatePanelWithBounds("Panel1", gfx::Rect(0, 0, 100, 100));
606 Panel
* panel2
= CreatePanelWithBounds("Panel2", gfx::Rect(0, 0, 100, 100));
607 Panel
* panel3
= CreatePanelWithBounds("Panel3", gfx::Rect(0, 0, 100, 100));
608 Panel
* panel4
= CreatePanelWithBounds("Panel4", gfx::Rect(0, 0, 100, 100));
609 ASSERT_EQ(4, docked_collection
->num_panels());
611 scoped_ptr
<NativePanelTesting
> panel1_testing(
612 CreateNativePanelTesting(panel1
));
613 gfx::Point position1
= panel1
->GetBounds().origin();
614 gfx::Point position2
= panel2
->GetBounds().origin();
615 gfx::Point position3
= panel3
->GetBounds().origin();
616 gfx::Point position4
= panel4
->GetBounds().origin();
618 // Test the scenario: drag a panel, close another panel, cancel the drag.
620 std::vector
<Panel
*> panels
;
621 gfx::Point panel1_new_position
= position1
;
622 panel1_new_position
.Offset(-500, 0);
624 // Start dragging a panel.
625 // We have: P1* P4 P3 P2
626 gfx::Point mouse_location
= panel1
->GetBounds().origin();
627 panel1_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
628 mouse_location
.Offset(-500, -5);
629 panel1_testing
->DragTitlebar(mouse_location
);
630 EXPECT_TRUE(drag_controller
->is_dragging());
631 EXPECT_EQ(panel1
, drag_controller
->dragging_panel());
633 ASSERT_EQ(4, docked_collection
->num_panels());
634 panels
= PanelManager::GetInstance()->panels();
635 EXPECT_EQ(panel2
, panels
[0]);
636 EXPECT_EQ(panel3
, panels
[1]);
637 EXPECT_EQ(panel4
, panels
[2]);
638 EXPECT_EQ(panel1
, panels
[3]);
639 EXPECT_EQ(position1
, panel2
->GetBounds().origin());
640 EXPECT_EQ(position2
, panel3
->GetBounds().origin());
641 EXPECT_EQ(position3
, panel4
->GetBounds().origin());
642 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
644 // Closing another panel while dragging in progress will keep the dragging
646 // We have: P1* P4 P3
647 CloseWindowAndWait(panel2
);
648 EXPECT_TRUE(drag_controller
->is_dragging());
649 EXPECT_EQ(panel1
, drag_controller
->dragging_panel());
651 ASSERT_EQ(3, docked_collection
->num_panels());
652 panels
= PanelManager::GetInstance()->panels();
653 EXPECT_EQ(panel3
, panels
[0]);
654 EXPECT_EQ(panel4
, panels
[1]);
655 EXPECT_EQ(panel1
, panels
[2]);
656 EXPECT_EQ(position1
, panel3
->GetBounds().origin());
657 EXPECT_EQ(position2
, panel4
->GetBounds().origin());
658 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
662 panel1_testing
->CancelDragTitlebar();
663 EXPECT_FALSE(drag_controller
->is_dragging());
665 ASSERT_EQ(3, docked_collection
->num_panels());
666 panels
= PanelManager::GetInstance()->panels();
667 EXPECT_EQ(panel1
, panels
[0]);
668 EXPECT_EQ(panel3
, panels
[1]);
669 EXPECT_EQ(panel4
, panels
[2]);
670 EXPECT_EQ(position1
, panel1
->GetBounds().origin());
671 EXPECT_EQ(position2
, panel3
->GetBounds().origin());
672 EXPECT_EQ(position3
, panel4
->GetBounds().origin());
675 // Test the scenario: drag a panel, close another panel, end the drag.
677 std::vector
<Panel
*> panels
;
678 gfx::Point panel1_new_position
= position1
;
679 panel1_new_position
.Offset(-500, 0);
681 // Start dragging a panel.
682 // We have: P1* P4 P3
683 gfx::Point mouse_location
= panel1
->GetBounds().origin();
684 panel1_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
685 mouse_location
.Offset(-500, -5);
686 panel1_testing
->DragTitlebar(mouse_location
);
687 EXPECT_TRUE(drag_controller
->is_dragging());
688 EXPECT_EQ(panel1
, drag_controller
->dragging_panel());
690 ASSERT_EQ(3, docked_collection
->num_panels());
691 panels
= PanelManager::GetInstance()->panels();
692 EXPECT_EQ(panel3
, panels
[0]);
693 EXPECT_EQ(panel4
, panels
[1]);
694 EXPECT_EQ(panel1
, panels
[2]);
695 EXPECT_EQ(position1
, panel3
->GetBounds().origin());
696 EXPECT_EQ(position2
, panel4
->GetBounds().origin());
697 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
699 // Closing another panel while dragging in progress will keep the dragging
702 CloseWindowAndWait(panel3
);
703 EXPECT_TRUE(drag_controller
->is_dragging());
704 EXPECT_EQ(panel1
, drag_controller
->dragging_panel());
706 ASSERT_EQ(2, docked_collection
->num_panels());
707 panels
= PanelManager::GetInstance()->panels();
708 EXPECT_EQ(panel4
, panels
[0]);
709 EXPECT_EQ(panel1
, panels
[1]);
710 EXPECT_EQ(position1
, panel4
->GetBounds().origin());
711 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
715 panel1_testing
->FinishDragTitlebar();
716 EXPECT_FALSE(drag_controller
->is_dragging());
718 ASSERT_EQ(2, docked_collection
->num_panels());
719 panels
= PanelManager::GetInstance()->panels();
720 EXPECT_EQ(panel4
, panels
[0]);
721 EXPECT_EQ(panel1
, panels
[1]);
722 EXPECT_EQ(position1
, panel4
->GetBounds().origin());
723 EXPECT_EQ(position2
, panel1
->GetBounds().origin());
726 // Test the scenario: drag a panel and close the dragging panel.
728 std::vector
<Panel
*> panels
;
729 gfx::Point panel1_new_position
= position2
;
730 panel1_new_position
.Offset(-500, 0);
732 // Start dragging a panel again.
734 gfx::Point mouse_location
= panel1
->GetBounds().origin();
735 panel1_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
736 mouse_location
.Offset(-500, -5);
737 panel1_testing
->DragTitlebar(mouse_location
);
738 EXPECT_TRUE(drag_controller
->is_dragging());
739 EXPECT_EQ(panel1
, drag_controller
->dragging_panel());
740 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
742 ASSERT_EQ(2, docked_collection
->num_panels());
743 panels
= PanelManager::GetInstance()->panels();
744 EXPECT_EQ(panel4
, panels
[0]);
745 EXPECT_EQ(panel1
, panels
[1]);
746 EXPECT_EQ(position1
, panel4
->GetBounds().origin());
748 // Closing the dragging panel should make the drag controller abort.
750 content::WindowedNotificationObserver
signal(
751 chrome::NOTIFICATION_PANEL_CLOSED
, content::Source
<Panel
>(panel1
));
753 EXPECT_FALSE(drag_controller
->is_dragging());
755 // Continue the drag to ensure the drag controller does not crash.
756 panel1_new_position
.Offset(20, 30);
757 panel1_testing
->DragTitlebar(panel1_new_position
);
758 panel1_testing
->FinishDragTitlebar();
760 // Wait till the panel is fully closed.
762 ASSERT_EQ(1, docked_collection
->num_panels());
763 panels
= PanelManager::GetInstance()->panels();
764 EXPECT_EQ(panel4
, panels
[0]);
765 EXPECT_EQ(position1
, panel4
->GetBounds().origin());
768 panel_manager
->CloseAll();
771 // http://crbug.com/175760; several panel tests failing regularly on mac.
772 #if defined(OS_MACOSX)
773 #define MAYBE_DragOneDetachedPanel DISABLED_DragOneDetachedPanel
775 #define MAYBE_DragOneDetachedPanel DragOneDetachedPanel
777 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, MAYBE_DragOneDetachedPanel
) {
778 Panel
* panel
= CreateDetachedPanel("1", gfx::Rect(300, 200, 250, 200));
780 // Test that the detached panel can be dragged almost anywhere except getting
781 // close to the bottom of the docked area to trigger the attach.
782 scoped_ptr
<NativePanelTesting
> panel_testing(
783 CreateNativePanelTesting(panel
));
784 gfx::Point origin
= panel
->GetBounds().origin();
786 panel_testing
->PressLeftMouseButtonTitlebar(origin
);
787 EXPECT_EQ(origin
, panel
->GetBounds().origin());
789 origin
.Offset(-51, -102);
790 panel_testing
->DragTitlebar(origin
);
791 EXPECT_EQ(origin
, panel
->GetBounds().origin());
793 origin
.Offset(37, 45);
794 panel_testing
->DragTitlebar(origin
);
795 EXPECT_EQ(origin
, panel
->GetBounds().origin());
797 panel_testing
->FinishDragTitlebar();
798 EXPECT_EQ(origin
, panel
->GetBounds().origin());
800 // Test that cancelling the drag will return the panel the the original
802 gfx::Point original_position
= panel
->GetBounds().origin();
803 origin
= original_position
;
805 panel_testing
->PressLeftMouseButtonTitlebar(origin
);
806 EXPECT_EQ(origin
, panel
->GetBounds().origin());
808 origin
.Offset(-51, -102);
809 panel_testing
->DragTitlebar(origin
);
810 EXPECT_EQ(origin
, panel
->GetBounds().origin());
812 origin
.Offset(37, 45);
813 panel_testing
->DragTitlebar(origin
);
814 EXPECT_EQ(origin
, panel
->GetBounds().origin());
816 panel_testing
->CancelDragTitlebar();
817 WaitForBoundsAnimationFinished(panel
);
818 EXPECT_EQ(original_position
, panel
->GetBounds().origin());
820 PanelManager::GetInstance()->CloseAll();
823 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, CloseDetachedPanelOnDrag
) {
824 PanelManager
* panel_manager
= PanelManager::GetInstance();
825 PanelDragController
* drag_controller
= panel_manager
->drag_controller();
826 DetachedPanelCollection
* detached_collection
=
827 panel_manager
->detached_collection();
829 // Create 1 detached panel.
830 Panel
* panel1
= CreateDetachedPanel("1", gfx::Rect(100, 200, 100, 100));
831 ASSERT_EQ(1, detached_collection
->num_panels());
833 scoped_ptr
<NativePanelTesting
> panel1_testing(
834 CreateNativePanelTesting(panel1
));
835 gfx::Point panel1_old_position
= panel1
->GetBounds().origin();
837 // Test the scenario: drag a panel, close another panel, cancel the drag.
839 // Create a panel to be closed.
840 Panel
* panel2
= CreateDetachedPanel("2", gfx::Rect(300, 210, 110, 110));
842 // Start dragging a panel.
843 panel1_testing
->PressLeftMouseButtonTitlebar(panel1
->GetBounds().origin());
844 gfx::Point panel1_new_position
= panel1_old_position
;
845 panel1_new_position
.Offset(-51, -102);
846 panel1_testing
->DragTitlebar(panel1_new_position
);
847 EXPECT_TRUE(drag_controller
->is_dragging());
848 EXPECT_EQ(panel1
, drag_controller
->dragging_panel());
850 ASSERT_EQ(2, detached_collection
->num_panels());
851 EXPECT_TRUE(detached_collection
->HasPanel(panel1
));
852 EXPECT_TRUE(detached_collection
->HasPanel(panel2
));
853 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
855 // Closing another panel while dragging in progress will keep the dragging
857 CloseWindowAndWait(panel2
);
858 EXPECT_TRUE(drag_controller
->is_dragging());
859 EXPECT_EQ(panel1
, drag_controller
->dragging_panel());
861 ASSERT_EQ(1, detached_collection
->num_panels());
862 EXPECT_TRUE(detached_collection
->HasPanel(panel1
));
863 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
866 panel1_testing
->CancelDragTitlebar();
867 WaitForBoundsAnimationFinished(panel1
);
868 EXPECT_FALSE(drag_controller
->is_dragging());
869 EXPECT_EQ(panel1_old_position
, panel1
->GetBounds().origin());
872 // Test the scenario: drag a panel, close another panel, end the drag.
874 // Create a panel to be closed.
875 Panel
* panel2
= CreateDetachedPanel("2", gfx::Rect(300, 210, 110, 110));
877 // Start dragging a panel.
878 panel1_testing
->PressLeftMouseButtonTitlebar(panel1
->GetBounds().origin());
879 gfx::Point panel1_new_position
= panel1_old_position
;
880 panel1_new_position
.Offset(-51, -102);
881 panel1_testing
->DragTitlebar(panel1_new_position
);
882 EXPECT_TRUE(drag_controller
->is_dragging());
883 EXPECT_EQ(panel1
, drag_controller
->dragging_panel());
885 ASSERT_EQ(2, detached_collection
->num_panels());
886 EXPECT_TRUE(detached_collection
->HasPanel(panel1
));
887 EXPECT_TRUE(detached_collection
->HasPanel(panel2
));
888 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
890 // Closing another panel while dragging in progress will keep the dragging
892 CloseWindowAndWait(panel2
);
893 EXPECT_TRUE(drag_controller
->is_dragging());
894 EXPECT_EQ(panel1
, drag_controller
->dragging_panel());
896 ASSERT_EQ(1, detached_collection
->num_panels());
897 EXPECT_TRUE(detached_collection
->HasPanel(panel1
));
898 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
901 panel1_testing
->FinishDragTitlebar();
902 EXPECT_FALSE(drag_controller
->is_dragging());
903 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
906 // Test the scenario: drag a panel and close the dragging panel.
908 // Start dragging a panel again.
909 panel1_testing
->PressLeftMouseButtonTitlebar(panel1
->GetBounds().origin());
910 gfx::Point panel1_new_position
= panel1
->GetBounds().origin();
911 panel1_new_position
.Offset(45, 67);
912 panel1_testing
->DragTitlebar(panel1_new_position
);
913 EXPECT_TRUE(drag_controller
->is_dragging());
914 EXPECT_EQ(panel1
, drag_controller
->dragging_panel());
916 ASSERT_EQ(1, detached_collection
->num_panels());
917 EXPECT_TRUE(detached_collection
->HasPanel(panel1
));
918 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
920 // Closing the dragging panel should make the drag controller abort.
921 content::WindowedNotificationObserver
signal(
922 chrome::NOTIFICATION_PANEL_CLOSED
, content::Source
<Panel
>(panel1
));
924 EXPECT_FALSE(drag_controller
->is_dragging());
926 // Continue the drag to ensure the drag controller does not crash.
927 panel1_new_position
.Offset(20, 30);
928 panel1_testing
->DragTitlebar(panel1_new_position
);
929 panel1_testing
->FinishDragTitlebar();
931 // Wait till the panel is fully closed.
933 ASSERT_EQ(0, detached_collection
->num_panels());
937 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, Detach
) {
938 PanelManager
* panel_manager
= PanelManager::GetInstance();
939 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
940 DetachedPanelCollection
* detached_collection
=
941 panel_manager
->detached_collection();
943 // Create one docked panel.
944 Panel
* panel
= CreateDockedPanel("1", gfx::Rect(0, 0, 100, 100));
945 ASSERT_EQ(1, docked_collection
->num_panels());
946 ASSERT_EQ(0, detached_collection
->num_panels());
948 gfx::Rect panel_old_bounds
= panel
->GetBounds();
950 // Press on title-bar.
951 scoped_ptr
<NativePanelTesting
> panel_testing(
952 CreateNativePanelTesting(panel
));
953 gfx::Point
mouse_location(panel
->GetBounds().origin());
954 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
956 // Drag up the panel in a small offset that does not trigger the detach.
957 // Expect that the panel is still docked and only x coordinate of its position
959 gfx::Vector2d drag_delta_to_remain_docked
= GetDragDeltaToRemainDocked();
960 mouse_location
= mouse_location
+ drag_delta_to_remain_docked
;
961 panel_testing
->DragTitlebar(mouse_location
);
962 ASSERT_EQ(1, docked_collection
->num_panels());
963 ASSERT_EQ(0, detached_collection
->num_panels());
964 EXPECT_EQ(PanelCollection::DOCKED
, panel
->collection()->type());
965 gfx::Rect panel_new_bounds
= panel_old_bounds
;
966 panel_new_bounds
.Offset(drag_delta_to_remain_docked
.x(), 0);
967 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
969 // Continue dragging up the panel in big offset that triggers the detach.
970 // Expect that the panel is previewed as detached.
971 gfx::Vector2d drag_delta_to_detach
= GetDragDeltaToDetach();
972 mouse_location
= mouse_location
+ drag_delta_to_detach
;
973 panel_testing
->DragTitlebar(mouse_location
);
974 ASSERT_EQ(0, docked_collection
->num_panels());
975 ASSERT_EQ(1, detached_collection
->num_panels());
976 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
977 panel_new_bounds
.Offset(
978 drag_delta_to_detach
.x(),
979 drag_delta_to_detach
.y() + drag_delta_to_remain_docked
.y());
980 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
983 // Expect that the panel stays as detached.
984 panel_testing
->FinishDragTitlebar();
985 ASSERT_EQ(0, docked_collection
->num_panels());
986 ASSERT_EQ(1, detached_collection
->num_panels());
987 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
988 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
990 panel_manager
->CloseAll();
993 // http://crbug.com/175760; several panel tests failing regularly on mac.
994 #if defined(OS_MACOSX)
995 #define MAYBE_DetachAndCancel DISABLED_DetachAndCancel
997 #define MAYBE_DetachAndCancel DetachAndCancel
999 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, MAYBE_DetachAndCancel
) {
1000 PanelManager
* panel_manager
= PanelManager::GetInstance();
1001 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
1002 DetachedPanelCollection
* detached_collection
=
1003 panel_manager
->detached_collection();
1005 // Create one docked panel.
1006 Panel
* panel
= CreateDockedPanel("1", gfx::Rect(0, 0, 100, 100));
1007 ASSERT_EQ(1, docked_collection
->num_panels());
1008 ASSERT_EQ(0, detached_collection
->num_panels());
1010 gfx::Rect panel_old_bounds
= panel
->GetBounds();
1012 // Press on title-bar.
1013 scoped_ptr
<NativePanelTesting
> panel_testing(
1014 CreateNativePanelTesting(panel
));
1015 gfx::Point
mouse_location(panel
->GetBounds().origin());
1016 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
1018 // Drag up the panel in a small offset that does not trigger the detach.
1019 // Expect that the panel is still docked and only x coordinate of its position
1021 gfx::Vector2d drag_delta_to_remain_docked
= GetDragDeltaToRemainDocked();
1022 mouse_location
= mouse_location
+ drag_delta_to_remain_docked
;
1023 panel_testing
->DragTitlebar(mouse_location
);
1024 ASSERT_EQ(1, docked_collection
->num_panels());
1025 ASSERT_EQ(0, detached_collection
->num_panels());
1026 EXPECT_EQ(PanelCollection::DOCKED
, panel
->collection()->type());
1027 gfx::Rect panel_new_bounds
= panel_old_bounds
;
1028 panel_new_bounds
.Offset(drag_delta_to_remain_docked
.x(), 0);
1029 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
1031 // Continue dragging up the panel in big offset that triggers the detach.
1032 // Expect that the panel is previewed as detached.
1033 gfx::Vector2d drag_delta_to_detach
= GetDragDeltaToDetach();
1034 mouse_location
= mouse_location
+ drag_delta_to_detach
;
1035 panel_testing
->DragTitlebar(mouse_location
);
1036 ASSERT_EQ(0, docked_collection
->num_panels());
1037 ASSERT_EQ(1, detached_collection
->num_panels());
1038 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1039 panel_new_bounds
.Offset(
1040 drag_delta_to_detach
.x(),
1041 drag_delta_to_detach
.y() + drag_delta_to_remain_docked
.y());
1042 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
1045 // Expect that the panel is back as docked.
1046 panel_testing
->CancelDragTitlebar();
1047 ASSERT_EQ(1, docked_collection
->num_panels());
1048 ASSERT_EQ(0, detached_collection
->num_panels());
1049 EXPECT_EQ(PanelCollection::DOCKED
, panel
->collection()->type());
1050 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
1052 panel_manager
->CloseAll();
1055 // http://crbug.com/175760; several panel tests failing regularly on mac.
1056 #if defined(OS_MACOSX)
1057 #define MAYBE_Attach DISABLED_Attach
1059 #define MAYBE_Attach Attach
1061 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, MAYBE_Attach
) {
1062 PanelManager
* panel_manager
= PanelManager::GetInstance();
1063 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
1064 DetachedPanelCollection
* detached_collection
=
1065 panel_manager
->detached_collection();
1067 // Create one detached panel.
1068 Panel
* panel
= CreateDetachedPanel("1", gfx::Rect(400, 300, 100, 100));
1069 ASSERT_EQ(0, docked_collection
->num_panels());
1070 ASSERT_EQ(1, detached_collection
->num_panels());
1071 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1073 gfx::Rect panel_old_bounds
= panel
->GetBounds();
1075 // Press on title-bar.
1076 scoped_ptr
<NativePanelTesting
> panel_testing(
1077 CreateNativePanelTesting(panel
));
1078 gfx::Point
mouse_location(panel
->GetBounds().origin());
1079 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
1081 // Drag down the panel but not close enough to the bottom of work area.
1082 // Expect that the panel is still detached.
1083 gfx::Vector2d drag_delta_to_remain_detached
=
1084 GetDragDeltaToRemainDetached(panel
);
1085 mouse_location
= mouse_location
+ drag_delta_to_remain_detached
;
1086 panel_testing
->DragTitlebar(mouse_location
);
1087 ASSERT_EQ(0, docked_collection
->num_panels());
1088 ASSERT_EQ(1, detached_collection
->num_panels());
1089 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1090 gfx::Rect panel_new_bounds
= panel_old_bounds
;
1091 panel_new_bounds
.Offset(drag_delta_to_remain_detached
);
1092 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
1094 // Continue dragging down the panel to make it close enough to the bottom of
1096 // Expect that the panel is previewed as docked.
1097 gfx::Vector2d drag_delta_to_attach
= GetDragDeltaToAttach(panel
);
1098 mouse_location
= mouse_location
+ drag_delta_to_attach
;
1099 panel_testing
->DragTitlebar(mouse_location
);
1100 ASSERT_EQ(1, docked_collection
->num_panels());
1101 ASSERT_EQ(0, detached_collection
->num_panels());
1102 EXPECT_EQ(PanelCollection::DOCKED
, panel
->collection()->type());
1103 panel_new_bounds
.Offset(drag_delta_to_attach
);
1104 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
1107 // Expect that the panel stays as docked and moves to the final position.
1108 panel_testing
->FinishDragTitlebar();
1109 ASSERT_EQ(1, docked_collection
->num_panels());
1110 ASSERT_EQ(0, detached_collection
->num_panels());
1111 EXPECT_EQ(PanelCollection::DOCKED
, panel
->collection()->type());
1112 panel_new_bounds
.set_x(
1113 docked_collection
->StartingRightPosition() - panel_new_bounds
.width());
1114 panel_new_bounds
.set_y(
1115 docked_collection
->work_area().bottom() - panel_new_bounds
.height());
1116 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
1118 panel_manager
->CloseAll();
1121 // http://crbug.com/175760; several panel tests failing regularly on mac.
1122 #if defined(OS_MACOSX)
1123 #define MAYBE_AttachAndCancel DISABLED_AttachAndCancel
1125 #define MAYBE_AttachAndCancel AttachAndCancel
1127 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, MAYBE_AttachAndCancel
) {
1128 PanelManager
* panel_manager
= PanelManager::GetInstance();
1129 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
1130 DetachedPanelCollection
* detached_collection
=
1131 panel_manager
->detached_collection();
1133 // Create one detached panel.
1134 Panel
* panel
= CreateDetachedPanel("1", gfx::Rect(400, 300, 100, 100));
1135 ASSERT_EQ(0, docked_collection
->num_panels());
1136 ASSERT_EQ(1, detached_collection
->num_panels());
1137 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1139 gfx::Rect panel_old_bounds
= panel
->GetBounds();
1141 // Press on title-bar.
1142 scoped_ptr
<NativePanelTesting
> panel_testing(
1143 CreateNativePanelTesting(panel
));
1144 gfx::Point
mouse_location(panel
->GetBounds().origin());
1145 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
1147 // Drag down the panel but not close enough to the bottom of work area.
1148 // Expect that the panel is still detached.
1149 gfx::Vector2d drag_delta_to_remain_detached
=
1150 GetDragDeltaToRemainDetached(panel
);
1151 mouse_location
= mouse_location
+ drag_delta_to_remain_detached
;
1152 panel_testing
->DragTitlebar(mouse_location
);
1153 ASSERT_EQ(0, docked_collection
->num_panels());
1154 ASSERT_EQ(1, detached_collection
->num_panels());
1155 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1156 gfx::Rect panel_new_bounds
= panel_old_bounds
;
1157 panel_new_bounds
.Offset(drag_delta_to_remain_detached
);
1158 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
1160 // Continue dragging down the panel to make it close enough to the bottom of
1162 // Expect that the panel is previewed as docked.
1163 gfx::Vector2d drag_delta_to_attach
= GetDragDeltaToAttach(panel
);
1164 mouse_location
= mouse_location
+ drag_delta_to_attach
;
1165 panel_testing
->DragTitlebar(mouse_location
);
1166 ASSERT_EQ(1, docked_collection
->num_panels());
1167 ASSERT_EQ(0, detached_collection
->num_panels());
1168 EXPECT_EQ(PanelCollection::DOCKED
, panel
->collection()->type());
1169 panel_new_bounds
.Offset(drag_delta_to_attach
);
1170 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
1173 // Expect that the panel is back as detached.
1174 panel_testing
->CancelDragTitlebar();
1175 ASSERT_EQ(0, docked_collection
->num_panels());
1176 ASSERT_EQ(1, detached_collection
->num_panels());
1177 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1178 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
1180 panel_manager
->CloseAll();
1183 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, DetachAttachAndCancel
) {
1184 PanelManager
* panel_manager
= PanelManager::GetInstance();
1185 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
1186 DetachedPanelCollection
* detached_collection
=
1187 panel_manager
->detached_collection();
1189 // Create one docked panel.
1190 Panel
* panel
= CreateDockedPanel("1", gfx::Rect(0, 0, 100, 100));
1191 ASSERT_EQ(1, docked_collection
->num_panels());
1192 ASSERT_EQ(0, detached_collection
->num_panels());
1194 gfx::Rect panel_old_bounds
= panel
->GetBounds();
1196 // Press on title-bar.
1197 scoped_ptr
<NativePanelTesting
> panel_testing(
1198 CreateNativePanelTesting(panel
));
1199 gfx::Point
mouse_location(panel
->GetBounds().origin());
1200 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
1202 // Drag up the panel to trigger the detach.
1203 // Expect that the panel is previewed as detached.
1204 gfx::Vector2d drag_delta_to_detach
= GetDragDeltaToDetach();
1205 mouse_location
= mouse_location
+ drag_delta_to_detach
;
1206 panel_testing
->DragTitlebar(mouse_location
);
1207 ASSERT_EQ(0, docked_collection
->num_panels());
1208 ASSERT_EQ(1, detached_collection
->num_panels());
1209 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1210 gfx::Rect panel_new_bounds
= panel_old_bounds
;
1211 panel_new_bounds
.Offset(drag_delta_to_detach
);
1212 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
1214 // Continue dragging down the panel to trigger the re-attach.
1215 gfx::Vector2d drag_delta_to_reattach
= GetDragDeltaToAttach(panel
);
1216 mouse_location
= mouse_location
+ drag_delta_to_reattach
;
1217 panel_testing
->DragTitlebar(mouse_location
);
1218 ASSERT_EQ(1, docked_collection
->num_panels());
1219 ASSERT_EQ(0, detached_collection
->num_panels());
1220 EXPECT_EQ(PanelCollection::DOCKED
, panel
->collection()->type());
1221 panel_new_bounds
.Offset(drag_delta_to_reattach
);
1222 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
1224 // Continue dragging up the panel to trigger the detach again.
1225 gfx::Vector2d drag_delta_to_detach_again
= GetDragDeltaToDetach();
1226 mouse_location
= mouse_location
+ drag_delta_to_detach_again
;
1227 panel_testing
->DragTitlebar(mouse_location
);
1228 ASSERT_EQ(0, docked_collection
->num_panels());
1229 ASSERT_EQ(1, detached_collection
->num_panels());
1230 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1231 panel_new_bounds
.Offset(drag_delta_to_detach_again
);
1232 EXPECT_EQ(panel_new_bounds
, panel
->GetBounds());
1235 // Expect that the panel stays as docked.
1236 panel_testing
->CancelDragTitlebar();
1237 ASSERT_EQ(1, docked_collection
->num_panels());
1238 ASSERT_EQ(0, detached_collection
->num_panels());
1239 EXPECT_EQ(PanelCollection::DOCKED
, panel
->collection()->type());
1240 EXPECT_EQ(panel_old_bounds
, panel
->GetBounds());
1242 panel_manager
->CloseAll();
1245 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, DetachWithSqueeze
) {
1246 PanelManager
* panel_manager
= PanelManager::GetInstance();
1247 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
1248 DetachedPanelCollection
* detached_collection
=
1249 panel_manager
->detached_collection();
1251 // Create some docked panels.
1252 // docked: P1 P2 P3 P4 P5
1253 Panel
* panel1
= CreateDockedPanel("1", gfx::Rect(0, 0, 200, 100));
1254 Panel
* panel2
= CreateDockedPanel("2", gfx::Rect(0, 0, 200, 100));
1255 Panel
* panel3
= CreateDockedPanel("3", gfx::Rect(0, 0, 200, 100));
1256 Panel
* panel4
= CreateDockedPanel("4", gfx::Rect(0, 0, 200, 100));
1257 Panel
* panel5
= CreateDockedPanel("5", gfx::Rect(0, 0, 200, 100));
1258 ASSERT_EQ(0, detached_collection
->num_panels());
1259 ASSERT_EQ(5, docked_collection
->num_panels());
1261 // Drag to detach the middle docked panel.
1264 // docked: P1 P3 P4 P5
1265 gfx::Point panel2_docked_position
= panel2
->GetBounds().origin();
1266 gfx::Vector2d
drag_delta_to_detach_panel2(-20, -100);
1267 DragPanelByDelta(panel2
, drag_delta_to_detach_panel2
);
1268 ASSERT_EQ(1, detached_collection
->num_panels());
1269 ASSERT_EQ(4, docked_collection
->num_panels());
1270 EXPECT_EQ(PanelCollection::DOCKED
, panel1
->collection()->type());
1271 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
1272 EXPECT_EQ(PanelCollection::DOCKED
, panel3
->collection()->type());
1273 EXPECT_EQ(PanelCollection::DOCKED
, panel4
->collection()->type());
1274 EXPECT_EQ(PanelCollection::DOCKED
, panel5
->collection()->type());
1275 gfx::Point panel2_new_position
=
1276 panel2_docked_position
+ drag_delta_to_detach_panel2
;
1277 EXPECT_EQ(panel2_new_position
, panel2
->GetBounds().origin());
1279 // Drag to detach the left-most docked panel.
1283 gfx::Point panel4_docked_position
= panel4
->GetBounds().origin();
1284 gfx::Vector2d
drag_delta_to_detach_panel4(-40, -250);
1285 DragPanelByDelta(panel4
, drag_delta_to_detach_panel4
);
1286 ASSERT_EQ(2, detached_collection
->num_panels());
1287 ASSERT_EQ(3, docked_collection
->num_panels());
1288 EXPECT_EQ(PanelCollection::DOCKED
, panel1
->collection()->type());
1289 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
1290 EXPECT_EQ(PanelCollection::DOCKED
, panel3
->collection()->type());
1291 EXPECT_EQ(PanelCollection::DETACHED
, panel4
->collection()->type());
1292 EXPECT_EQ(PanelCollection::DOCKED
, panel5
->collection()->type());
1293 EXPECT_EQ(panel2_new_position
, panel2
->GetBounds().origin());
1294 gfx::Point panel4_new_position
=
1295 panel4_docked_position
+ drag_delta_to_detach_panel4
;
1296 EXPECT_EQ(panel4_new_position
, panel4
->GetBounds().origin());
1298 // Drag to detach the right-most docked panel.
1300 // detached: P1 P2 P4
1302 gfx::Point docked_position1
= panel1
->GetBounds().origin();
1303 gfx::Point docked_position2
= panel3
->GetBounds().origin();
1304 gfx::Vector2d
drag_delta_to_detach_panel1(-60, -400);
1305 DragPanelByDelta(panel1
, drag_delta_to_detach_panel1
);
1306 ASSERT_EQ(3, detached_collection
->num_panels());
1307 ASSERT_EQ(2, docked_collection
->num_panels());
1308 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
1309 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
1310 EXPECT_EQ(PanelCollection::DOCKED
, panel3
->collection()->type());
1311 EXPECT_EQ(PanelCollection::DETACHED
, panel4
->collection()->type());
1312 EXPECT_EQ(PanelCollection::DOCKED
, panel5
->collection()->type());
1313 gfx::Point panel1_new_position
=
1314 docked_position1
+ drag_delta_to_detach_panel1
;
1315 EXPECT_EQ(panel1_new_position
, panel1
->GetBounds().origin());
1316 EXPECT_EQ(panel2_new_position
, panel2
->GetBounds().origin());
1317 EXPECT_EQ(panel4_new_position
, panel4
->GetBounds().origin());
1319 // No more squeeze, docked panels should stay put.
1320 EXPECT_EQ(docked_position1
, panel3
->GetBounds().origin());
1321 EXPECT_EQ(panel1
->GetBounds().width(), panel1
->GetRestoredBounds().width());
1322 EXPECT_EQ(docked_position2
, panel5
->GetBounds().origin());
1323 EXPECT_EQ(panel2
->GetBounds().width(), panel2
->GetRestoredBounds().width());
1325 panel_manager
->CloseAll();
1328 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, AttachWithSqueeze
) {
1329 PanelManager
* panel_manager
= PanelManager::GetInstance();
1330 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
1331 DetachedPanelCollection
* detached_collection
=
1332 panel_manager
->detached_collection();
1334 // Create some detached, docked panels.
1335 // detached: P1 P2 P3
1336 // docked: P4 P5 P6 P7
1337 Panel
* panel1
= CreateInactiveDetachedPanel(
1338 "1", gfx::Rect(100, 300, 200, 100));
1339 Panel
* panel2
= CreateInactiveDetachedPanel(
1340 "2", gfx::Rect(200, 300, 200, 100));
1341 Panel
* panel3
= CreateInactiveDetachedPanel(
1342 "3", gfx::Rect(400, 300, 200, 100));
1343 Panel
* panel4
= CreateInactiveDockedPanel("4", gfx::Rect(0, 0, 200, 100));
1344 Panel
* panel5
= CreateInactiveDockedPanel("5", gfx::Rect(0, 0, 200, 100));
1345 Panel
* panel6
= CreateInactiveDockedPanel("6", gfx::Rect(0, 0, 200, 100));
1346 Panel
* panel7
= CreateDockedPanel("7", gfx::Rect(0, 0, 200, 100));
1347 ASSERT_EQ(3, detached_collection
->num_panels());
1348 ASSERT_EQ(4, docked_collection
->num_panels());
1350 // Wait for active states to settle.
1351 PanelCollectionSqueezeObserver
panel7_settled(docked_collection
, panel7
);
1352 panel7_settled
.Wait();
1354 gfx::Point detached_position1
= panel1
->GetBounds().origin();
1355 gfx::Point detached_position2
= panel2
->GetBounds().origin();
1356 gfx::Point detached_position3
= panel3
->GetBounds().origin();
1357 gfx::Point docked_position4
= panel4
->GetBounds().origin();
1358 gfx::Point docked_position5
= panel5
->GetBounds().origin();
1359 gfx::Point docked_position6
= panel6
->GetBounds().origin();
1360 gfx::Point docked_position7
= panel7
->GetBounds().origin();
1362 // Drag to attach a detached panel between 2 docked panels.
1365 // docked: P4 P3 P5 P6 P7
1366 gfx::Point
drag_to_location(panel5
->GetBounds().x() + 10,
1367 panel5
->GetBounds().y());
1368 DragPanelToMouseLocation(panel3
, drag_to_location
);
1369 ASSERT_EQ(2, detached_collection
->num_panels());
1370 ASSERT_EQ(5, docked_collection
->num_panels());
1371 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
1372 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
1373 EXPECT_EQ(PanelCollection::DOCKED
, panel3
->collection()->type());
1374 EXPECT_EQ(PanelCollection::DOCKED
, panel4
->collection()->type());
1375 EXPECT_EQ(PanelCollection::DOCKED
, panel5
->collection()->type());
1376 EXPECT_EQ(PanelCollection::DOCKED
, panel6
->collection()->type());
1377 EXPECT_EQ(PanelCollection::DOCKED
, panel7
->collection()->type());
1378 EXPECT_EQ(detached_position1
, panel1
->GetBounds().origin());
1379 EXPECT_EQ(detached_position2
, panel2
->GetBounds().origin());
1381 // Wait for active states to settle.
1382 base::MessageLoopForUI::current()->RunUntilIdle();
1384 // Panel positions should have shifted because of the "squeeze" mode.
1385 EXPECT_NE(docked_position4
, panel4
->GetBounds().origin());
1386 EXPECT_LT(panel4
->GetBounds().width(), panel4
->GetRestoredBounds().width());
1387 EXPECT_NE(docked_position5
, panel5
->GetBounds().origin());
1388 EXPECT_LT(panel5
->GetBounds().width(), panel5
->GetRestoredBounds().width());
1391 // The panel we dragged becomes the active one.
1392 EXPECT_EQ(true, panel3
->IsActive());
1393 EXPECT_EQ(panel3
->GetBounds().width(), panel3
->GetRestoredBounds().width());
1395 EXPECT_NE(docked_position6
, panel6
->GetBounds().origin());
1397 // The last panel is active so these positions do not change.
1398 // TODO (ABurago) this is wrong behavior, a panel should activate
1399 // when it is dragged (it does in real usage, but not when drag is
1400 // simulated in a test). Change this test when the behavior is fixed.
1401 EXPECT_EQ(true, panel7
->IsActive());
1402 EXPECT_EQ(panel7
->GetBounds().width(), panel7
->GetRestoredBounds().width());
1404 EXPECT_EQ(docked_position6
, panel6
->GetBounds().origin());
1406 EXPECT_EQ(docked_position7
, panel7
->GetBounds().origin());
1408 // Drag to attach a detached panel to most-right.
1411 // docked: P2 P4 P3 P5 P6 P7
1412 gfx::Point
drag_to_location2(panel4
->GetBounds().right() + 10,
1413 panel4
->GetBounds().y());
1414 DragPanelToMouseLocation(panel2
, drag_to_location2
);
1415 ASSERT_EQ(1, detached_collection
->num_panels());
1416 ASSERT_EQ(6, docked_collection
->num_panels());
1417 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
1418 EXPECT_EQ(PanelCollection::DOCKED
, panel2
->collection()->type());
1419 EXPECT_EQ(PanelCollection::DOCKED
, panel3
->collection()->type());
1420 EXPECT_EQ(PanelCollection::DOCKED
, panel4
->collection()->type());
1421 EXPECT_EQ(PanelCollection::DOCKED
, panel5
->collection()->type());
1422 EXPECT_EQ(PanelCollection::DOCKED
, panel6
->collection()->type());
1423 EXPECT_EQ(PanelCollection::DOCKED
, panel7
->collection()->type());
1424 EXPECT_EQ(detached_position1
, panel1
->GetBounds().origin());
1426 // Drag to attach a detached panel to most-left.
1428 // docked: P2 P4 P1 P3 P5 P6 P7
1429 gfx::Point
drag_to_location3(panel3
->GetBounds().x() - 10,
1430 panel3
->GetBounds().y());
1431 DragPanelToMouseLocation(panel1
, drag_to_location3
);
1432 ASSERT_EQ(0, detached_collection
->num_panels());
1433 ASSERT_EQ(7, docked_collection
->num_panels());
1434 EXPECT_EQ(PanelCollection::DOCKED
, panel1
->collection()->type());
1435 EXPECT_EQ(PanelCollection::DOCKED
, panel2
->collection()->type());
1436 EXPECT_EQ(PanelCollection::DOCKED
, panel3
->collection()->type());
1437 EXPECT_EQ(PanelCollection::DOCKED
, panel4
->collection()->type());
1438 EXPECT_EQ(PanelCollection::DOCKED
, panel5
->collection()->type());
1439 EXPECT_EQ(PanelCollection::DOCKED
, panel6
->collection()->type());
1440 EXPECT_EQ(PanelCollection::DOCKED
, panel7
->collection()->type());
1442 panel_manager
->CloseAll();
1445 // http://crbug.com/175760; several panel tests failing regularly on mac.
1446 #if defined(OS_MACOSX)
1447 #define MAYBE_DragDetachedPanelToTop DISABLED_DragDetachedPanelToTop
1449 #define MAYBE_DragDetachedPanelToTop DragDetachedPanelToTop
1451 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, MAYBE_DragDetachedPanelToTop
) {
1452 // Setup the test areas to have top-aligned bar excluded from work area.
1453 const gfx::Rect
primary_display_area(0, 0, 800, 600);
1454 const gfx::Rect
primary_work_area(0, 10, 800, 590);
1455 mock_display_settings_provider()->SetPrimaryDisplay(
1456 primary_display_area
, primary_work_area
);
1458 PanelManager
* panel_manager
= PanelManager::GetInstance();
1459 Panel
* panel
= CreateDetachedPanel("1", gfx::Rect(300, 200, 250, 200));
1461 // Drag up the panel. Expect that the panel should not go outside the top of
1463 gfx::Point
drag_to_location(250, 0);
1464 DragPanelToMouseLocation(panel
, drag_to_location
);
1465 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1466 EXPECT_EQ(drag_to_location
.x(), panel
->GetBounds().origin().x());
1467 EXPECT_EQ(primary_work_area
.y(), panel
->GetBounds().origin().y());
1469 // Drag down the panel. Expect that the panel can be dragged without
1471 drag_to_location
= gfx::Point(280, 150);
1472 DragPanelToMouseLocation(panel
, drag_to_location
);
1473 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1474 EXPECT_EQ(drag_to_location
, panel
->GetBounds().origin());
1476 panel_manager
->CloseAll();
1479 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
,
1480 DragDockedPanelToSecondaryDisplay
) {
1481 // Setup 2 displays with secondary display on the right side of primary
1483 mock_display_settings_provider()->SetPrimaryDisplay(
1484 gfx::Rect(0, 0, 400, 600), gfx::Rect(0, 0, 400, 560));
1485 gfx::Rect
secondary_display_area(400, 100, 400, 500);
1486 mock_display_settings_provider()->SetSecondaryDisplay(
1487 secondary_display_area
, secondary_display_area
);
1489 // Create a docked panel.
1490 gfx::Size
panel_size(100, 100);
1491 Panel
* panel
= CreateDockedPanel("1", gfx::Rect(gfx::Point(), panel_size
));
1492 EXPECT_EQ(PanelCollection::DOCKED
, panel
->collection()->type());
1494 // Drag the panel to the secondary display horizontally.
1495 // Expected that the panel should become detached.
1496 gfx::Point
drag_to_location(secondary_display_area
.x() + 100,
1497 panel
->GetBounds().y());
1498 DragPanelToMouseLocation(panel
, drag_to_location
);
1499 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1500 gfx::Rect
expected_bounds(drag_to_location
, panel_size
);
1501 EXPECT_EQ(expected_bounds
, panel
->GetBounds());
1503 PanelManager::GetInstance()->CloseAll();
1506 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
,
1507 DragDetachedPanelToSecondaryDisplay
) {
1508 // Setup 2 displays with secondary display at the bottom of primary display.
1509 mock_display_settings_provider()->SetPrimaryDisplay(
1510 gfx::Rect(0, 0, 800, 300), gfx::Rect(0, 0, 800, 260));
1511 gfx::Rect
secondary_display_area(100, 300, 700, 250);
1512 mock_display_settings_provider()->SetSecondaryDisplay(
1513 secondary_display_area
, secondary_display_area
);
1515 // Create a detached panel on the primary display.
1516 gfx::Rect
initial_panel_bounds(300, 50, 100, 100);
1517 Panel
* panel
= CreateDetachedPanel("1", initial_panel_bounds
);
1518 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1519 EXPECT_EQ(initial_panel_bounds
, panel
->GetBounds());
1521 // Drag down the panel to the secondary display vertically.
1522 // Expected that the panel should remain detached.
1523 gfx::Point
drag_to_location(initial_panel_bounds
.x(),
1524 secondary_display_area
.y() + 100);
1525 DragPanelToMouseLocation(panel
, drag_to_location
);
1526 EXPECT_EQ(PanelCollection::DETACHED
, panel
->collection()->type());
1527 gfx::Rect
expected_bounds(drag_to_location
, initial_panel_bounds
.size());
1528 EXPECT_EQ(expected_bounds
, panel
->GetBounds());
1530 PanelManager::GetInstance()->CloseAll();
1533 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, GroupPanelAndPanelFromBottom
) {
1534 PanelManager
* panel_manager
= PanelManager::GetInstance();
1535 DetachedPanelCollection
* detached_collection
=
1536 panel_manager
->detached_collection();
1538 // Create two detached panels.
1539 Panel
* panel1
= CreateDetachedPanel("1", gfx::Rect(300, 200, 200, 100));
1540 Panel
* panel2
= CreateDetachedPanel("2", gfx::Rect(100, 100, 150, 150));
1541 ASSERT_EQ(2, detached_collection
->num_panels());
1542 ASSERT_EQ(0, panel_manager
->num_stacks());
1543 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
1544 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
1546 gfx::Rect panel1_old_bounds
= panel1
->GetBounds();
1547 gfx::Rect panel2_old_bounds
= panel2
->GetBounds();
1549 // Press on title-bar of P2.
1550 scoped_ptr
<NativePanelTesting
> panel2_testing(
1551 CreateNativePanelTesting(panel2
));
1552 gfx::Point
mouse_location(panel2
->GetBounds().origin());
1553 gfx::Point original_mouse_location
= mouse_location
;
1554 panel2_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
1556 // Drag P2 close to the bottom of P1 to trigger the stacking. Expect:
1557 // 1) P1 and P2 form a stack.
1558 // 2) P2 jumps vertcially to align to the bottom edge of P1.
1559 // 3) P2 moves horizontally by the dragging delta.
1560 // 4) The width of P2 remains unchanged.
1561 gfx::Vector2d drag_delta_to_stack
=
1562 GetDragDeltaToStackToBottom(panel2
, panel1
);
1563 mouse_location
= mouse_location
+ drag_delta_to_stack
;
1564 panel2_testing
->DragTitlebar(mouse_location
);
1565 ASSERT_EQ(0, detached_collection
->num_panels());
1566 ASSERT_EQ(1, panel_manager
->num_stacks());
1567 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
1568 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
1569 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1570 gfx::Rect
panel2_new_bounds(panel2_old_bounds
.x() + drag_delta_to_stack
.x(),
1571 panel1_old_bounds
.bottom(),
1572 panel2_old_bounds
.width(),
1573 panel2_old_bounds
.height());
1574 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1576 // Drag P2 somewhat away from the bottom of P1 to trigger the unstacking.
1577 // Expect P1 and P2 become detached.
1578 gfx::Vector2d drag_delta_to_unstack
=
1579 GetDragDeltaToUnstackFromBottom(panel2
, panel1
);
1580 mouse_location
= mouse_location
+ drag_delta_to_unstack
;
1581 panel2_testing
->DragTitlebar(mouse_location
);
1582 ASSERT_EQ(2, detached_collection
->num_panels());
1583 ASSERT_EQ(0, panel_manager
->num_stacks());
1584 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
1585 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
1586 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1587 panel2_new_bounds
.set_origin(panel2_old_bounds
.origin());
1588 panel2_new_bounds
.Offset(mouse_location
- original_mouse_location
);
1589 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1591 // Drag P2 close to the bottom of P1 to trigger the stacking again. Expect:
1592 // 1) P1 and P2 form a stack.
1593 // 2) P2 jumps vertcially to align to the bottom edge of P1.
1594 // 3) P2 moves horizontally by the dragging delta.
1595 // 4) The width of P2 remains unchanged.
1596 drag_delta_to_stack
= GetDragDeltaToStackToBottom(panel2
, panel1
);
1597 mouse_location
= mouse_location
+ drag_delta_to_stack
;
1598 panel2_testing
->DragTitlebar(mouse_location
);
1599 ASSERT_EQ(0, detached_collection
->num_panels());
1600 ASSERT_EQ(1, panel_manager
->num_stacks());
1601 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
1602 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
1603 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1604 panel2_new_bounds
.set_x(panel2_new_bounds
.x() + drag_delta_to_stack
.x());
1605 panel2_new_bounds
.set_y(panel1_old_bounds
.bottom());
1606 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1608 // Move the mouse a little bit. Expect P2 only moves horizontally. P2 should
1609 // not move vertically since its top edge already glues to the bottom edge
1611 gfx::Vector2d
small_delta(1, -1);
1612 mouse_location
= mouse_location
+ small_delta
;
1613 panel2_testing
->DragTitlebar(mouse_location
);
1614 ASSERT_EQ(0, detached_collection
->num_panels());
1615 ASSERT_EQ(1, panel_manager
->num_stacks());
1616 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
1617 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
1618 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1619 panel2_new_bounds
.set_x(panel2_new_bounds
.x() + small_delta
.x());
1620 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1622 // Finish the drag. Expect:
1623 // 1) P1 and P2 remain stacked.
1624 // 2) P2 moves horizontally to align with P1.
1625 // 3) The width of P2 is adjusted to be same as the one of P1.
1626 panel2_testing
->FinishDragTitlebar();
1627 WaitForBoundsAnimationFinished(panel2
);
1628 ASSERT_EQ(0, detached_collection
->num_panels());
1629 ASSERT_EQ(1, panel_manager
->num_stacks());
1630 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
1631 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
1632 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1633 panel2_new_bounds
.set_x(panel1_old_bounds
.x());
1634 panel2_new_bounds
.set_width(panel1_old_bounds
.width());
1635 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1637 panel_manager
->CloseAll();
1640 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, GroupPanelAndPanelFromTop
) {
1641 PanelManager
* panel_manager
= PanelManager::GetInstance();
1642 DetachedPanelCollection
* detached_collection
=
1643 panel_manager
->detached_collection();
1645 // Create two detached panels.
1646 Panel
* panel1
= CreateDetachedPanel("1", gfx::Rect(300, 300, 200, 100));
1647 Panel
* panel2
= CreateDetachedPanel("2", gfx::Rect(100, 200, 150, 150));
1648 ASSERT_EQ(2, detached_collection
->num_panels());
1649 ASSERT_EQ(0, panel_manager
->num_stacks());
1650 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
1651 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
1653 gfx::Rect panel1_old_bounds
= panel1
->GetBounds();
1654 gfx::Rect panel2_old_bounds
= panel2
->GetBounds();
1656 // Press on title-bar of P2.
1657 scoped_ptr
<NativePanelTesting
> panel2_testing(
1658 CreateNativePanelTesting(panel2
));
1659 gfx::Point
mouse_location(panel2
->GetBounds().origin());
1660 gfx::Point original_mouse_location
= mouse_location
;
1661 panel2_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
1663 // Drag P2 close to the top of P1 to trigger the stacking. Expect:
1664 // 1) P2 and P1 form a stack.
1665 // 2) P2 jumps vertcially to align to the top edge of P1.
1666 // 3) P2 moves horizontally by the dragging delta.
1667 // 4) The width of both P1 and P2 remains unchanged.
1668 gfx::Vector2d drag_delta_to_stack
= GetDragDeltaToStackToTop(panel2
, panel1
);
1669 mouse_location
= mouse_location
+ drag_delta_to_stack
;
1670 panel2_testing
->DragTitlebar(mouse_location
);
1671 ASSERT_EQ(0, detached_collection
->num_panels());
1672 ASSERT_EQ(1, panel_manager
->num_stacks());
1673 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
1674 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
1675 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1676 gfx::Rect
panel2_new_bounds(
1677 panel2_old_bounds
.x() + drag_delta_to_stack
.x(),
1678 panel1_old_bounds
.y() - panel2_old_bounds
.height(),
1679 panel2_old_bounds
.width(),
1680 panel2_old_bounds
.height());
1681 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1683 // Drag P2 somewhat away from the top of P1 to trigger the unstacking.
1684 // Expect P1 and P2 become detached.
1685 gfx::Vector2d drag_delta_to_unstack
=
1686 GetDragDeltaToUnstackFromTop(panel2
, panel1
);
1687 mouse_location
= mouse_location
+ drag_delta_to_unstack
;
1688 panel2_testing
->DragTitlebar(mouse_location
);
1689 ASSERT_EQ(2, detached_collection
->num_panels());
1690 ASSERT_EQ(0, panel_manager
->num_stacks());
1691 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
1692 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
1693 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1694 panel2_new_bounds
.set_origin(panel2_old_bounds
.origin());
1695 panel2_new_bounds
.Offset(mouse_location
- original_mouse_location
);
1696 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1698 // Drag P2 close to the top of P1 to trigger the stacking again. Expect:
1699 // 1) P2 and P1 form a stack.
1700 // 2) P2 jumps vertcially to align to the top edge of P1.
1701 // 3) P2 moves horizontally by the dragging delta.
1702 // 4) The width of both P1 and P2 remains unchanged.
1703 drag_delta_to_stack
= GetDragDeltaToStackToTop(panel2
, panel1
);
1704 mouse_location
= mouse_location
+ drag_delta_to_stack
;
1705 panel2_testing
->DragTitlebar(mouse_location
);
1706 ASSERT_EQ(0, detached_collection
->num_panels());
1707 ASSERT_EQ(1, panel_manager
->num_stacks());
1708 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
1709 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
1710 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1711 panel2_new_bounds
.set_x(panel2_new_bounds
.x() + drag_delta_to_stack
.x());
1712 panel2_new_bounds
.set_y(panel1_old_bounds
.y() - panel2_old_bounds
.height());
1713 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1715 // Move the mouse a little bit. Expect only P2 moves horizontally. P2 should
1716 // not move vertically because its bottom edge already glues to the top edge
1718 gfx::Vector2d
small_delta(1, -1);
1719 mouse_location
= mouse_location
+ small_delta
;
1720 panel2_testing
->DragTitlebar(mouse_location
);
1721 ASSERT_EQ(0, detached_collection
->num_panels());
1722 ASSERT_EQ(1, panel_manager
->num_stacks());
1723 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
1724 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
1725 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1726 panel2_new_bounds
.set_x(panel2_new_bounds
.x() + small_delta
.x());
1727 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1729 // Finish the drag. Expect:
1730 // 1) P2 and P1 remain stacked.
1731 // 2) P2 moves horizontally to align with P1.
1732 // 3) The width of P1 is adjusted to be same as the one of P2.
1733 panel2_testing
->FinishDragTitlebar();
1734 WaitForBoundsAnimationFinished(panel1
);
1735 ASSERT_EQ(0, detached_collection
->num_panels());
1736 ASSERT_EQ(1, panel_manager
->num_stacks());
1737 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
1738 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
1739 gfx::Rect panel1_new_bounds
= panel1_old_bounds
;
1740 panel1_new_bounds
.set_width(panel2_new_bounds
.width());
1741 EXPECT_EQ(panel1_new_bounds
, panel1
->GetBounds());
1742 panel2_new_bounds
.set_x(panel1_new_bounds
.x());
1743 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1745 panel_manager
->CloseAll();
1748 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, GroupAndCancel
) {
1749 PanelManager
* panel_manager
= PanelManager::GetInstance();
1750 DetachedPanelCollection
* detached_collection
=
1751 panel_manager
->detached_collection();
1753 // Create two detached panels.
1754 Panel
* panel1
= CreateDetachedPanel("1", gfx::Rect(300, 200, 200, 100));
1755 Panel
* panel2
= CreateDetachedPanel("2", gfx::Rect(100, 100, 150, 150));
1756 ASSERT_EQ(2, detached_collection
->num_panels());
1757 ASSERT_EQ(0, panel_manager
->num_stacks());
1758 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
1759 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
1761 gfx::Rect panel1_old_bounds
= panel1
->GetBounds();
1762 gfx::Rect panel2_old_bounds
= panel2
->GetBounds();
1764 // Press on title-bar.
1765 scoped_ptr
<NativePanelTesting
> panel2_testing(
1766 CreateNativePanelTesting(panel2
));
1767 gfx::Point
mouse_location(panel2
->GetBounds().origin());
1768 gfx::Point original_mouse_location
= mouse_location
;
1769 panel2_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
1771 // Drag P2 close to the bottom of P1 to trigger the stacking.
1772 // Expect that P2 stacks to P1 and P2's width remains unchanged.
1773 gfx::Vector2d drag_delta_to_stack
=
1774 GetDragDeltaToStackToBottom(panel2
, panel1
);
1775 mouse_location
= mouse_location
+ drag_delta_to_stack
;
1776 panel2_testing
->DragTitlebar(mouse_location
);
1777 ASSERT_EQ(0, detached_collection
->num_panels());
1778 ASSERT_EQ(1, panel_manager
->num_stacks());
1779 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
1780 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
1781 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1782 gfx::Rect
panel2_new_bounds(panel1_old_bounds
.x(),
1783 panel1_old_bounds
.bottom(),
1784 panel2_old_bounds
.width(),
1785 panel2_old_bounds
.height());
1786 EXPECT_EQ(panel2_new_bounds
, panel2
->GetBounds());
1789 // Expect that the P1 and P2 become detached.
1790 panel2_testing
->CancelDragTitlebar();
1791 ASSERT_EQ(2, detached_collection
->num_panels());
1792 ASSERT_EQ(0, panel_manager
->num_stacks());
1793 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
1794 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
1795 EXPECT_EQ(panel1_old_bounds
, panel1
->GetBounds());
1796 EXPECT_EQ(panel2_old_bounds
, panel2
->GetBounds());
1798 panel_manager
->CloseAll();
1801 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, GroupPanelAndStackFromBottom
) {
1802 PanelManager
* panel_manager
= PanelManager::GetInstance();
1803 DetachedPanelCollection
* detached_collection
=
1804 panel_manager
->detached_collection();
1806 // Create 2 stacked panels.
1807 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
1808 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 100, 200, 150);
1809 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
1810 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
1811 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
1812 ASSERT_EQ(0, detached_collection
->num_panels());
1813 ASSERT_EQ(1, panel_manager
->num_stacks());
1814 ASSERT_EQ(2, stack
->num_panels());
1815 EXPECT_EQ(stack
, panel1
->collection());
1816 EXPECT_EQ(stack
, panel2
->collection());
1818 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
1819 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
1820 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
1821 panel2_initial_bounds
, panel1_expected_bounds
);
1822 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
1824 // Create 1 detached panel.
1825 gfx::Rect panel3_initial_bounds
= gfx::Rect(300, 200, 100, 100);
1826 Panel
* panel3
= CreateDetachedPanel("3", panel3_initial_bounds
);
1827 ASSERT_EQ(1, detached_collection
->num_panels());
1828 gfx::Rect
panel3_expected_bounds(panel3_initial_bounds
);
1829 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
1831 // Drag P3 close to the bottom edge of P1 that is not the bottom panel.
1832 // Expect no stacking.
1833 gfx::Vector2d drag_delta_to_stack
=
1834 GetDragDeltaToStackToBottom(panel3
, panel1
);
1835 DragPanelByDelta(panel3
, drag_delta_to_stack
);
1836 ASSERT_EQ(1, detached_collection
->num_panels());
1837 ASSERT_EQ(2, stack
->num_panels());
1838 ASSERT_EQ(1, panel_manager
->num_stacks());
1840 // Drag P3 close to the bottom edge of P2 that is the bottom panel.
1841 // Expect that P3 becomes the bottom panel of the stack.
1842 drag_delta_to_stack
= GetDragDeltaToStackToBottom(panel3
, panel2
);
1843 DragPanelByDelta(panel3
, drag_delta_to_stack
);
1844 WaitForBoundsAnimationFinished(panel3
);
1845 ASSERT_EQ(0, detached_collection
->num_panels());
1846 ASSERT_EQ(3, stack
->num_panels());
1847 ASSERT_EQ(1, panel_manager
->num_stacks());
1848 EXPECT_EQ(stack
, panel1
->collection());
1849 EXPECT_EQ(stack
, panel2
->collection());
1850 EXPECT_EQ(stack
, panel3
->collection());
1851 EXPECT_EQ(panel3
, stack
->bottom_panel());
1853 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
1854 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
1855 panel3_expected_bounds
= GetStackedAtBottomPanelBounds(
1856 panel3_initial_bounds
, panel2_expected_bounds
);
1857 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
1859 panel_manager
->CloseAll();
1862 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, GroupPanelAndStackFromTop
) {
1863 PanelManager
* panel_manager
= PanelManager::GetInstance();
1864 DetachedPanelCollection
* detached_collection
=
1865 panel_manager
->detached_collection();
1867 // Create 2 stacked panels.
1868 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
1869 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 300, 200, 150);
1870 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
1871 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
1872 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
1873 ASSERT_EQ(0, detached_collection
->num_panels());
1874 ASSERT_EQ(1, panel_manager
->num_stacks());
1875 ASSERT_EQ(2, stack
->num_panels());
1876 EXPECT_EQ(stack
, panel1
->collection());
1877 EXPECT_EQ(stack
, panel2
->collection());
1879 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
1880 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
1881 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
1882 panel2_initial_bounds
, panel1_expected_bounds
);
1883 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
1885 // Create 1 detached panel.
1886 gfx::Rect panel3_initial_bounds
= gfx::Rect(300, 200, 100, 100);
1887 Panel
* panel3
= CreateDetachedPanel("3", panel3_initial_bounds
);
1888 ASSERT_EQ(1, detached_collection
->num_panels());
1889 gfx::Rect
panel3_expected_bounds(panel3_initial_bounds
);
1890 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
1892 // Drag P3 close to the top edge of P2 that is not the top panel.
1893 // Expect no stacking.
1894 gfx::Vector2d drag_delta_to_stack
= GetDragDeltaToStackToTop(panel3
, panel2
);
1895 DragPanelByDelta(panel3
, drag_delta_to_stack
);
1896 ASSERT_EQ(1, detached_collection
->num_panels());
1897 ASSERT_EQ(2, stack
->num_panels());
1898 ASSERT_EQ(1, panel_manager
->num_stacks());
1900 // Drag P3 close to the top edge of P1 that is the top panel.
1901 // Expect that P3 becomes the top panel of the stack.
1902 drag_delta_to_stack
= GetDragDeltaToStackToTop(panel3
, panel1
);
1903 DragPanelByDelta(panel3
, drag_delta_to_stack
);
1904 WaitForBoundsAnimationFinished(panel1
);
1905 WaitForBoundsAnimationFinished(panel2
);
1906 ASSERT_EQ(0, detached_collection
->num_panels());
1907 ASSERT_EQ(3, stack
->num_panels());
1908 ASSERT_EQ(1, panel_manager
->num_stacks());
1909 EXPECT_EQ(stack
, panel1
->collection());
1910 EXPECT_EQ(stack
, panel2
->collection());
1911 EXPECT_EQ(stack
, panel3
->collection());
1912 EXPECT_EQ(panel3
, stack
->top_panel());
1914 panel3_expected_bounds
= GetStackedAtTopPanelBounds(
1915 panel3_initial_bounds
, panel1_expected_bounds
);
1916 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
1917 panel1_expected_bounds
.set_width(panel3_expected_bounds
.width());
1918 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
1919 panel2_expected_bounds
.set_width(panel3_expected_bounds
.width());
1920 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
1922 panel_manager
->CloseAll();
1925 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, GroupStackAndPanelFromBottom
) {
1926 PanelManager
* panel_manager
= PanelManager::GetInstance();
1927 DetachedPanelCollection
* detached_collection
=
1928 panel_manager
->detached_collection();
1930 // Create 2 stacked panels.
1931 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
1932 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 100, 200, 150);
1933 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
1934 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
1935 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
1936 ASSERT_EQ(0, detached_collection
->num_panels());
1937 ASSERT_EQ(1, panel_manager
->num_stacks());
1938 ASSERT_EQ(2, stack
->num_panels());
1939 EXPECT_EQ(stack
, panel1
->stack());
1940 EXPECT_EQ(stack
, panel2
->stack());
1942 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
1943 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
1944 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
1945 panel2_initial_bounds
, panel1_expected_bounds
);
1946 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
1948 // Create 1 detached panel.
1949 gfx::Rect panel3_initial_bounds
= gfx::Rect(300, 200, 100, 100);
1950 Panel
* panel3
= CreateDetachedPanel("3", panel3_initial_bounds
);
1951 ASSERT_EQ(1, detached_collection
->num_panels());
1952 gfx::Rect
panel3_expected_bounds(panel3_initial_bounds
);
1953 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
1955 // Drag P1 (together with P2) to stack to the bottom of P3.
1956 // Expect that P1 and P2 append to the bottom of P3 and all 3 panels are in
1958 gfx::Vector2d drag_delta_to_stack
=
1959 GetDragDeltaToStackToBottom(panel1
, panel3
);
1960 DragPanelByDelta(panel1
, drag_delta_to_stack
);
1961 WaitForBoundsAnimationFinished(panel1
);
1962 WaitForBoundsAnimationFinished(panel2
);
1963 ASSERT_EQ(0, detached_collection
->num_panels());
1964 ASSERT_EQ(1, panel_manager
->num_stacks());
1965 StackedPanelCollection
* final_stack
= panel_manager
->stacks().front();
1966 ASSERT_EQ(3, final_stack
->num_panels());
1967 EXPECT_EQ(final_stack
, panel1
->stack());
1968 EXPECT_EQ(final_stack
, panel2
->stack());
1969 EXPECT_EQ(final_stack
, panel3
->stack());
1971 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
1972 panel1_expected_bounds
= GetStackedAtBottomPanelBounds(
1973 panel1_initial_bounds
, panel3_expected_bounds
);
1974 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
1975 panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
1976 panel2_initial_bounds
, panel1_expected_bounds
);
1977 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
1979 panel_manager
->CloseAll();
1982 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, GroupStackAndPanelFromTop
) {
1983 PanelManager
* panel_manager
= PanelManager::GetInstance();
1984 DetachedPanelCollection
* detached_collection
=
1985 panel_manager
->detached_collection();
1987 // Create 2 stacked panels.
1988 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
1989 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 100, 200, 150);
1990 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
1991 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
1992 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
1993 ASSERT_EQ(0, detached_collection
->num_panels());
1994 ASSERT_EQ(1, panel_manager
->num_stacks());
1995 ASSERT_EQ(2, stack
->num_panels());
1996 EXPECT_EQ(stack
, panel1
->stack());
1997 EXPECT_EQ(stack
, panel2
->stack());
1999 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2000 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2001 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2002 panel2_initial_bounds
, panel1_expected_bounds
);
2003 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2005 // Create 1 detached panel.
2006 gfx::Rect panel3_initial_bounds
= gfx::Rect(300, 450, 100, 100);
2007 Panel
* panel3
= CreateDetachedPanel("3", panel3_initial_bounds
);
2008 ASSERT_EQ(1, detached_collection
->num_panels());
2009 gfx::Rect
panel3_expected_bounds(panel3_initial_bounds
);
2010 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2012 // Drag P1 (together with P2) to stack to the top of P3.
2013 // Expect that P1 and P2 add to the top of P3 and all 3 panels are in
2014 // one stack. P1 and P2 should align to top of P3 while P3 should update its
2015 // width to be same as the width of P1 and P2.
2016 gfx::Vector2d drag_delta_to_stack
= GetDragDeltaToStackToTop(panel1
, panel3
);
2017 DragPanelByDelta(panel1
, drag_delta_to_stack
);
2018 WaitForBoundsAnimationFinished(panel3
);
2019 ASSERT_EQ(0, detached_collection
->num_panels());
2020 ASSERT_EQ(1, panel_manager
->num_stacks());
2021 StackedPanelCollection
* final_stack
= panel_manager
->stacks().front();
2022 ASSERT_EQ(3, final_stack
->num_panels());
2023 EXPECT_EQ(final_stack
, panel1
->stack());
2024 EXPECT_EQ(final_stack
, panel2
->stack());
2025 EXPECT_EQ(final_stack
, panel3
->stack());
2027 panel3_expected_bounds
.set_width(panel1_expected_bounds
.width());
2028 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2029 panel2_expected_bounds
= GetStackedAtTopPanelBounds(
2030 panel2_expected_bounds
, panel3_expected_bounds
);
2031 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2032 panel1_expected_bounds
= GetStackedAtTopPanelBounds(
2033 panel1_expected_bounds
, panel2_expected_bounds
);
2034 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2036 panel_manager
->CloseAll();
2039 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, GroupStackAndStackFromBottom
) {
2040 PanelManager
* panel_manager
= PanelManager::GetInstance();
2041 DetachedPanelCollection
* detached_collection
=
2042 panel_manager
->detached_collection();
2044 // Create 2 stacked panels.
2045 StackedPanelCollection
* stack1
= panel_manager
->CreateStack();
2046 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 50, 200, 150);
2047 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack1
);
2048 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2049 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack1
);
2050 ASSERT_EQ(0, detached_collection
->num_panels());
2051 ASSERT_EQ(1, panel_manager
->num_stacks());
2052 ASSERT_EQ(2, stack1
->num_panels());
2053 EXPECT_EQ(stack1
, panel1
->stack());
2054 EXPECT_EQ(stack1
, panel2
->stack());
2056 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2057 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2058 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2059 panel2_initial_bounds
, panel1_expected_bounds
);
2060 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2062 // Create 2 more stacked panels in another stack.
2063 StackedPanelCollection
* stack2
= panel_manager
->CreateStack();
2064 gfx::Rect panel3_initial_bounds
= gfx::Rect(300, 100, 220, 120);
2065 Panel
* panel3
= CreateStackedPanel("3", panel3_initial_bounds
, stack2
);
2066 gfx::Rect panel4_initial_bounds
= gfx::Rect(0, 0, 180, 140);
2067 Panel
* panel4
= CreateStackedPanel("4", panel4_initial_bounds
, stack2
);
2068 ASSERT_EQ(0, detached_collection
->num_panels());
2069 ASSERT_EQ(2, panel_manager
->num_stacks());
2070 ASSERT_EQ(2, stack2
->num_panels());
2071 EXPECT_EQ(stack2
, panel3
->stack());
2072 EXPECT_EQ(stack2
, panel4
->stack());
2074 gfx::Rect
panel3_expected_bounds(panel3_initial_bounds
);
2075 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2076 gfx::Rect panel4_expected_bounds
= GetStackedAtBottomPanelBounds(
2077 panel4_initial_bounds
, panel3_expected_bounds
);
2078 EXPECT_EQ(panel4_expected_bounds
, panel4
->GetBounds());
2080 // Drag P3 (together with P4) to stack to the bottom of the stack consisting
2082 // Expect that P3 and P4 append to the bottom of P2 and all 4 panels are in
2084 gfx::Vector2d drag_delta_to_stack
=
2085 GetDragDeltaToStackToBottom(panel3
, panel2
);
2086 DragPanelByDelta(panel3
, drag_delta_to_stack
);
2087 WaitForBoundsAnimationFinished(panel3
);
2088 WaitForBoundsAnimationFinished(panel4
);
2089 ASSERT_EQ(0, detached_collection
->num_panels());
2090 ASSERT_EQ(1, panel_manager
->num_stacks());
2091 StackedPanelCollection
* final_stack
= panel_manager
->stacks().front();
2092 ASSERT_EQ(4, final_stack
->num_panels());
2093 EXPECT_EQ(final_stack
, panel1
->stack());
2094 EXPECT_EQ(final_stack
, panel2
->stack());
2095 EXPECT_EQ(final_stack
, panel3
->stack());
2096 EXPECT_EQ(final_stack
, panel4
->stack());
2098 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2099 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2100 panel3_expected_bounds
= GetStackedAtBottomPanelBounds(
2101 panel3_initial_bounds
, panel2_expected_bounds
);
2102 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2103 panel4_expected_bounds
= GetStackedAtBottomPanelBounds(
2104 panel4_initial_bounds
, panel3_expected_bounds
);
2105 EXPECT_EQ(panel4_expected_bounds
, panel4
->GetBounds());
2107 panel_manager
->CloseAll();
2110 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, GroupStackAndStackFromTop
) {
2111 PanelManager
* panel_manager
= PanelManager::GetInstance();
2112 DetachedPanelCollection
* detached_collection
=
2113 panel_manager
->detached_collection();
2115 // Create 2 stacked panels.
2116 StackedPanelCollection
* stack1
= panel_manager
->CreateStack();
2117 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 50, 200, 150);
2118 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack1
);
2119 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2120 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack1
);
2121 ASSERT_EQ(0, detached_collection
->num_panels());
2122 ASSERT_EQ(1, panel_manager
->num_stacks());
2123 ASSERT_EQ(2, stack1
->num_panels());
2124 EXPECT_EQ(stack1
, panel1
->stack());
2125 EXPECT_EQ(stack1
, panel2
->stack());
2127 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2128 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2129 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2130 panel2_initial_bounds
, panel1_expected_bounds
);
2131 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2133 // Create 2 more stacked panels in another stack.
2134 StackedPanelCollection
* stack2
= panel_manager
->CreateStack();
2135 gfx::Rect panel3_initial_bounds
= gfx::Rect(300, 350, 220, 110);
2136 Panel
* panel3
= CreateStackedPanel("3", panel3_initial_bounds
, stack2
);
2137 gfx::Rect panel4_initial_bounds
= gfx::Rect(0, 0, 180, 100);
2138 Panel
* panel4
= CreateStackedPanel("4", panel4_initial_bounds
, stack2
);
2139 ASSERT_EQ(0, detached_collection
->num_panels());
2140 ASSERT_EQ(2, panel_manager
->num_stacks());
2141 ASSERT_EQ(2, stack2
->num_panels());
2142 EXPECT_EQ(stack2
, panel3
->stack());
2143 EXPECT_EQ(stack2
, panel4
->stack());
2145 gfx::Rect
panel3_expected_bounds(panel3_initial_bounds
);
2146 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2147 gfx::Rect panel4_expected_bounds
= GetStackedAtBottomPanelBounds(
2148 panel4_initial_bounds
, panel3_expected_bounds
);
2149 EXPECT_EQ(panel4_expected_bounds
, panel4
->GetBounds());
2151 // Drag P1 (together with P2) to stack to the top of the stack consisting
2153 // Expect that P1 and P2 add to the top of P3 and all 4 panels are in
2154 // one stack. P1 and P2 should align to top of P3 while P3 and P4 should
2155 // update their width to be same as the width of P1 and P2.
2156 gfx::Vector2d drag_delta_to_stack
= GetDragDeltaToStackToTop(panel1
, panel3
);
2157 DragPanelByDelta(panel1
, drag_delta_to_stack
);
2158 WaitForBoundsAnimationFinished(panel3
);
2159 WaitForBoundsAnimationFinished(panel4
);
2160 ASSERT_EQ(0, detached_collection
->num_panels());
2161 ASSERT_EQ(1, panel_manager
->num_stacks());
2162 StackedPanelCollection
* final_stack
= panel_manager
->stacks().front();
2163 ASSERT_EQ(4, final_stack
->num_panels());
2164 EXPECT_EQ(final_stack
, panel1
->stack());
2165 EXPECT_EQ(final_stack
, panel2
->stack());
2166 EXPECT_EQ(final_stack
, panel3
->stack());
2167 EXPECT_EQ(final_stack
, panel4
->stack());
2169 panel4_expected_bounds
.set_width(panel1_expected_bounds
.width());
2170 EXPECT_EQ(panel4_expected_bounds
, panel4
->GetBounds());
2171 panel3_expected_bounds
.set_width(panel1_expected_bounds
.width());
2172 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2173 panel2_expected_bounds
= GetStackedAtTopPanelBounds(
2174 panel2_expected_bounds
, panel3_expected_bounds
);
2175 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2176 panel1_expected_bounds
= GetStackedAtTopPanelBounds(
2177 panel1_expected_bounds
, panel2_expected_bounds
);
2178 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2180 panel_manager
->CloseAll();
2183 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, UngroupTwoPanelStack
) {
2184 PanelManager
* panel_manager
= PanelManager::GetInstance();
2185 DetachedPanelCollection
* detached_collection
=
2186 panel_manager
->detached_collection();
2188 // Create 2 stacked panels.
2189 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
2190 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 50, 200, 150);
2191 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
2192 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2193 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
2194 ASSERT_EQ(0, detached_collection
->num_panels());
2195 ASSERT_EQ(2, stack
->num_panels());
2196 ASSERT_EQ(1, panel_manager
->num_stacks());
2197 EXPECT_EQ(stack
, panel1
->stack());
2198 EXPECT_EQ(stack
, panel2
->stack());
2200 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2201 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2202 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2203 panel2_initial_bounds
, panel1_expected_bounds
);
2204 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2205 gfx::Rect panel2_old_bounds
= panel2_expected_bounds
;
2207 // Press on title-bar.
2208 scoped_ptr
<NativePanelTesting
> panel2_testing(
2209 CreateNativePanelTesting(panel2
));
2210 gfx::Point
mouse_location(panel2
->GetBounds().origin());
2211 gfx::Point original_mouse_location
= mouse_location
;
2212 panel2_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
2214 // Drag P2 away from the bottom of P1 to trigger the unstacking.
2215 // Expect that P1 and P2 get detached.
2216 gfx::Vector2d drag_delta_to_unstack
=
2217 GetDragDeltaToUnstackFromBottom(panel2
, panel1
);
2218 mouse_location
= mouse_location
+ drag_delta_to_unstack
;
2219 panel2_testing
->DragTitlebar(mouse_location
);
2220 ASSERT_EQ(2, detached_collection
->num_panels());
2221 ASSERT_TRUE(stack
->num_panels() == 0);
2222 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
2223 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
2224 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2225 panel2_expected_bounds
.Offset(drag_delta_to_unstack
);
2226 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2228 // Drag P2 a bit closer to the bottom of P1 to trigger the stacking.
2229 // Expect P1 and P2 get stacked together.
2230 gfx::Vector2d drag_delta_to_stack
=
2231 GetDragDeltaToStackToBottom(panel2
, panel1
);
2232 mouse_location
= mouse_location
+ drag_delta_to_stack
;
2233 panel2_testing
->DragTitlebar(mouse_location
);
2234 ASSERT_EQ(0, detached_collection
->num_panels());
2235 // Note that the empty stack might still exist until the drag ends.
2236 ASSERT_GE(panel_manager
->num_stacks(), 1);
2237 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
2238 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
2239 EXPECT_EQ(panel1
->stack(), panel2
->stack());
2240 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2241 panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2242 panel2_initial_bounds
, panel1_expected_bounds
);
2243 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2245 // Drag P2 away from the bottom of P1 to trigger the unstacking again.
2246 // Expect that P1 and P2 get detached.
2247 drag_delta_to_unstack
= GetDragDeltaToUnstackFromBottom(panel2
, panel1
);
2248 mouse_location
= mouse_location
+ drag_delta_to_unstack
;
2249 panel2_testing
->DragTitlebar(mouse_location
);
2250 ASSERT_EQ(2, detached_collection
->num_panels());
2251 ASSERT_TRUE(stack
->num_panels() == 0);
2252 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
2253 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
2254 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2255 panel2_expected_bounds
= panel2_old_bounds
;
2256 panel2_expected_bounds
.Offset(mouse_location
- original_mouse_location
);
2257 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2260 // Expect that the P1 and P2 stay detached.
2261 panel2_testing
->FinishDragTitlebar();
2262 ASSERT_EQ(2, detached_collection
->num_panels());
2263 ASSERT_EQ(0, panel_manager
->num_stacks());
2264 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
2265 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
2266 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2267 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2269 panel_manager
->CloseAll();
2272 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, UngroupAndCancel
) {
2273 PanelManager
* panel_manager
= PanelManager::GetInstance();
2274 DetachedPanelCollection
* detached_collection
=
2275 panel_manager
->detached_collection();
2277 // Create 2 stacked panels.
2278 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
2279 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 50, 200, 150);
2280 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
2281 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2282 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
2283 ASSERT_EQ(0, detached_collection
->num_panels());
2284 ASSERT_EQ(2, stack
->num_panels());
2285 ASSERT_EQ(1, panel_manager
->num_stacks());
2286 EXPECT_EQ(stack
, panel1
->stack());
2287 EXPECT_EQ(stack
, panel2
->stack());
2289 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2290 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2291 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2292 panel2_initial_bounds
, panel1_expected_bounds
);
2293 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2294 gfx::Rect panel2_old_bounds
= panel2
->GetBounds();
2296 // Press on title-bar.
2297 scoped_ptr
<NativePanelTesting
> panel2_testing(
2298 CreateNativePanelTesting(panel2
));
2299 gfx::Point
mouse_location(panel2
->GetBounds().origin());
2300 gfx::Point original_mouse_location
= mouse_location
;
2301 panel2_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
2303 // Drag P2 away from the bottom of P1 to trigger the unstacking.
2304 // Expect that P1 and P2 get detached.
2305 gfx::Vector2d drag_delta_to_unstack
=
2306 GetDragDeltaToUnstackFromBottom(panel2
, panel1
);
2307 mouse_location
= mouse_location
+ drag_delta_to_unstack
;
2308 panel2_testing
->DragTitlebar(mouse_location
);
2309 ASSERT_EQ(2, detached_collection
->num_panels());
2310 ASSERT_TRUE(stack
->num_panels() == 0);
2311 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
2312 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
2313 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2314 panel2_expected_bounds
.Offset(drag_delta_to_unstack
);
2315 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2318 // Expect that the P1 and P2 put back to the same stack.
2319 panel2_testing
->CancelDragTitlebar();
2320 WaitForBoundsAnimationFinished(panel2
);
2321 ASSERT_EQ(0, detached_collection
->num_panels());
2322 ASSERT_EQ(1, panel_manager
->num_stacks());
2323 EXPECT_EQ(PanelCollection::STACKED
, panel1
->collection()->type());
2324 EXPECT_EQ(PanelCollection::STACKED
, panel2
->collection()->type());
2325 EXPECT_EQ(stack
, panel1
->stack());
2326 EXPECT_EQ(stack
, panel2
->stack());
2327 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2328 EXPECT_EQ(panel2_old_bounds
, panel2
->GetBounds());
2330 panel_manager
->CloseAll();
2333 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
,
2334 UngroupBottomPanelInThreePanelStack
) {
2335 PanelManager
* panel_manager
= PanelManager::GetInstance();
2336 DetachedPanelCollection
* detached_collection
=
2337 panel_manager
->detached_collection();
2339 // Create 3 stacked panels.
2340 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
2341 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 50, 200, 150);
2342 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
2343 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2344 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
2345 gfx::Rect panel3_initial_bounds
= gfx::Rect(0, 0, 120, 120);
2346 Panel
* panel3
= CreateStackedPanel("3", panel3_initial_bounds
, stack
);
2347 ASSERT_EQ(0, detached_collection
->num_panels());
2348 ASSERT_EQ(1, panel_manager
->num_stacks());
2349 ASSERT_EQ(3, stack
->num_panels());
2350 EXPECT_EQ(stack
, panel1
->stack());
2351 EXPECT_EQ(stack
, panel2
->stack());
2352 EXPECT_EQ(stack
, panel3
->stack());
2354 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2355 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2356 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2357 panel2_initial_bounds
, panel1_expected_bounds
);
2358 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2359 gfx::Rect panel3_expected_bounds
= GetStackedAtBottomPanelBounds(
2360 panel3_initial_bounds
, panel2_expected_bounds
);
2361 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2363 // Drag P3 away to unstack from P2 and P1.
2364 // Expect that P1 and P2 are still in the stack while P3 gets detached.
2365 gfx::Vector2d drag_delta_to_unstack
=
2366 GetDragDeltaToUnstackFromBottom(panel3
, panel2
);
2367 DragPanelByDelta(panel3
, drag_delta_to_unstack
);
2368 ASSERT_EQ(1, detached_collection
->num_panels());
2369 ASSERT_EQ(1, panel_manager
->num_stacks());
2370 ASSERT_EQ(2, stack
->num_panels());
2371 EXPECT_EQ(stack
, panel1
->stack());
2372 EXPECT_EQ(stack
, panel2
->stack());
2373 EXPECT_EQ(PanelCollection::DETACHED
, panel3
->collection()->type());
2375 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2376 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2377 panel3_expected_bounds
.Offset(drag_delta_to_unstack
);
2378 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2380 panel_manager
->CloseAll();
2383 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
,
2384 UngroupMiddlePanelInThreePanelStack
) {
2385 PanelManager
* panel_manager
= PanelManager::GetInstance();
2386 DetachedPanelCollection
* detached_collection
=
2387 panel_manager
->detached_collection();
2389 // Create 3 stacked panels.
2390 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
2391 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 50, 200, 150);
2392 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
2393 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2394 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
2395 gfx::Rect panel3_initial_bounds
= gfx::Rect(0, 0, 120, 120);
2396 Panel
* panel3
= CreateStackedPanel("3", panel3_initial_bounds
, stack
);
2397 ASSERT_EQ(0, detached_collection
->num_panels());
2398 ASSERT_EQ(1, panel_manager
->num_stacks());
2399 ASSERT_EQ(3, stack
->num_panels());
2400 EXPECT_EQ(stack
, panel1
->stack());
2401 EXPECT_EQ(stack
, panel2
->stack());
2402 EXPECT_EQ(stack
, panel3
->stack());
2404 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2405 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2406 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2407 panel2_initial_bounds
, panel1_expected_bounds
);
2408 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2409 gfx::Rect panel3_expected_bounds
= GetStackedAtBottomPanelBounds(
2410 panel3_initial_bounds
, panel2_expected_bounds
);
2411 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2413 // Drag P2 (together with P3) away to unstack from P1.
2414 // Expect that P2 and P3 are still in a stack while P1 gets detached.
2415 gfx::Vector2d drag_delta_to_unstack
=
2416 GetDragDeltaToUnstackFromBottom(panel2
, panel1
);
2417 DragPanelByDelta(panel2
, drag_delta_to_unstack
);
2418 ASSERT_EQ(1, detached_collection
->num_panels());
2419 ASSERT_EQ(1, panel_manager
->num_stacks());
2420 StackedPanelCollection
* final_stack
= panel_manager
->stacks().front();
2421 ASSERT_EQ(2, final_stack
->num_panels());
2422 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
2423 EXPECT_EQ(final_stack
, panel2
->stack());
2424 EXPECT_EQ(final_stack
, panel3
->stack());
2426 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2427 panel2_expected_bounds
.Offset(drag_delta_to_unstack
);
2428 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2429 panel3_expected_bounds
.Offset(drag_delta_to_unstack
);
2430 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2432 panel_manager
->CloseAll();
2435 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
,
2436 UngroupThirdPanelInFourPanelStack
) {
2437 PanelManager
* panel_manager
= PanelManager::GetInstance();
2438 DetachedPanelCollection
* detached_collection
=
2439 panel_manager
->detached_collection();
2441 // Create 4 stacked panels.
2442 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
2443 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 120, 200, 100);
2444 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
2445 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2446 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
2447 gfx::Rect panel3_initial_bounds
= gfx::Rect(0, 0, 120, 120);
2448 Panel
* panel3
= CreateStackedPanel("3", panel3_initial_bounds
, stack
);
2449 gfx::Rect panel4_initial_bounds
= gfx::Rect(0, 0, 120, 110);
2450 Panel
* panel4
= CreateStackedPanel("4", panel4_initial_bounds
, stack
);
2451 ASSERT_EQ(0, detached_collection
->num_panels());
2452 ASSERT_EQ(1, panel_manager
->num_stacks());
2453 ASSERT_EQ(4, stack
->num_panels());
2454 EXPECT_EQ(stack
, panel1
->stack());
2455 EXPECT_EQ(stack
, panel2
->stack());
2456 EXPECT_EQ(stack
, panel3
->stack());
2457 EXPECT_EQ(stack
, panel4
->stack());
2459 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2460 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2461 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2462 panel2_initial_bounds
, panel1_expected_bounds
);
2463 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2464 gfx::Rect panel3_expected_bounds
= GetStackedAtBottomPanelBounds(
2465 panel3_initial_bounds
, panel2_expected_bounds
);
2466 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2467 gfx::Rect panel4_expected_bounds
= GetStackedAtBottomPanelBounds(
2468 panel4_initial_bounds
, panel3_expected_bounds
);
2469 EXPECT_EQ(panel4_expected_bounds
, panel4
->GetBounds());
2471 // Drag P3 (together with P4) away to unstack from P2.
2472 // Expect that P1 and P2 are in one stack while P3 and P4 are in different
2474 gfx::Vector2d drag_delta_to_unstack
=
2475 GetDragDeltaToUnstackFromBottom(panel3
, panel2
);
2476 DragPanelByDelta(panel3
, drag_delta_to_unstack
);
2477 ASSERT_EQ(0, detached_collection
->num_panels());
2478 ASSERT_EQ(2, panel_manager
->num_stacks());
2479 StackedPanelCollection
* final_stack1
= panel_manager
->stacks().front();
2480 ASSERT_EQ(2, final_stack1
->num_panels());
2481 StackedPanelCollection
* final_stack2
= panel_manager
->stacks().back();
2482 ASSERT_EQ(2, final_stack2
->num_panels());
2483 EXPECT_EQ(panel1
->stack(), panel2
->stack());
2484 EXPECT_EQ(panel3
->stack(), panel4
->stack());
2486 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2487 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2488 panel3_expected_bounds
.Offset(drag_delta_to_unstack
);
2489 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2490 panel4_expected_bounds
.Offset(drag_delta_to_unstack
);
2491 EXPECT_EQ(panel4_expected_bounds
, panel4
->GetBounds());
2493 panel_manager
->CloseAll();
2496 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, UngroupAndGroup
) {
2497 PanelManager
* panel_manager
= PanelManager::GetInstance();
2498 DetachedPanelCollection
* detached_collection
=
2499 panel_manager
->detached_collection();
2501 // Create 2 stacked panels.
2502 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
2503 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 50, 200, 150);
2504 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
2505 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2506 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
2507 ASSERT_EQ(0, detached_collection
->num_panels());
2508 ASSERT_EQ(2, stack
->num_panels());
2509 ASSERT_EQ(1, panel_manager
->num_stacks());
2510 EXPECT_EQ(stack
, panel1
->stack());
2511 EXPECT_EQ(stack
, panel2
->stack());
2513 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2514 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2515 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2516 panel2_initial_bounds
, panel1_expected_bounds
);
2517 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2519 // Create 1 detached panel.
2520 gfx::Rect panel3_initial_bounds
= gfx::Rect(300, 200, 100, 100);
2521 Panel
* panel3
= CreateDetachedPanel("3", panel3_initial_bounds
);
2522 ASSERT_EQ(1, detached_collection
->num_panels());
2523 gfx::Rect
panel3_expected_bounds(panel3_initial_bounds
);
2524 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2526 // Drag P2 to the bottom edge of P3 to trigger both unstacking and stacking.
2527 // Expect that P3 and P2 are stacked together while P1 gets detached.
2528 gfx::Vector2d drag_delta_to_unstack_and_stack
=
2529 GetDragDeltaToStackToBottom(panel2
, panel3
);
2530 DragPanelByDelta(panel2
, drag_delta_to_unstack_and_stack
);
2531 WaitForBoundsAnimationFinished(panel2
);
2532 ASSERT_EQ(1, detached_collection
->num_panels());
2533 ASSERT_EQ(1, panel_manager
->num_stacks());
2534 StackedPanelCollection
* final_stack
= panel_manager
->stacks().front();
2535 ASSERT_EQ(2, final_stack
->num_panels());
2536 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
2537 EXPECT_EQ(final_stack
, panel2
->stack());
2538 EXPECT_EQ(final_stack
, panel3
->stack());
2540 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2541 panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2542 panel2_initial_bounds
, panel3_expected_bounds
);
2543 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2544 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2546 panel_manager
->CloseAll();
2549 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, UngroupAndAttach
) {
2550 PanelManager
* panel_manager
= PanelManager::GetInstance();
2551 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
2552 DetachedPanelCollection
* detached_collection
=
2553 panel_manager
->detached_collection();
2555 // Create 2 stacked panels.
2556 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
2557 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 50, 200, 150);
2558 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
2559 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2560 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
2561 ASSERT_EQ(0, docked_collection
->num_panels());
2562 ASSERT_EQ(0, detached_collection
->num_panels());
2563 ASSERT_EQ(2, stack
->num_panels());
2564 ASSERT_EQ(1, panel_manager
->num_stacks());
2565 EXPECT_EQ(stack
, panel1
->stack());
2566 EXPECT_EQ(stack
, panel2
->stack());
2568 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2569 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2570 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2571 panel2_initial_bounds
, panel1_expected_bounds
);
2572 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2574 // Drag P2 close to the bottom of the work area to trigger both unstacking and
2576 // Expect that P2 gets docked while P2 gets detached.
2577 gfx::Vector2d drag_delta_to_unstack_and_attach
= GetDragDeltaToAttach(panel2
);
2578 DragPanelByDelta(panel2
, drag_delta_to_unstack_and_attach
);
2579 WaitForBoundsAnimationFinished(panel2
);
2580 ASSERT_EQ(1, docked_collection
->num_panels());
2581 ASSERT_EQ(1, detached_collection
->num_panels());
2582 ASSERT_EQ(0, panel_manager
->num_stacks());
2583 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
2584 EXPECT_EQ(PanelCollection::DOCKED
, panel2
->collection()->type());
2586 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2587 panel2_expected_bounds
.set_x(docked_collection
->StartingRightPosition() -
2588 panel2_expected_bounds
.width());
2589 panel2_expected_bounds
.set_y(docked_collection
->work_area().bottom() -
2590 panel2_expected_bounds
.height());
2591 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2593 panel_manager
->CloseAll();
2596 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, SnapPanelToPanelLeft
) {
2597 PanelManager
* panel_manager
= PanelManager::GetInstance();
2598 DetachedPanelCollection
* detached_collection
=
2599 panel_manager
->detached_collection();
2601 // Create 2 detached panels.
2602 gfx::Rect panel1_initial_bounds
= gfx::Rect(300, 200, 300, 200);
2603 Panel
* panel1
= CreateDetachedPanel("1", panel1_initial_bounds
);
2604 gfx::Rect panel2_initial_bounds
= gfx::Rect(100, 100, 100, 250);
2605 Panel
* panel2
= CreateDetachedPanel("2", panel2_initial_bounds
);
2606 ASSERT_EQ(2, detached_collection
->num_panels());
2608 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2609 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2610 gfx::Rect
panel2_expected_bounds(panel2_initial_bounds
);
2611 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2613 // Press on title-bar.
2614 scoped_ptr
<NativePanelTesting
> panel2_testing(
2615 CreateNativePanelTesting(panel2
));
2616 gfx::Point
mouse_location(panel2
->GetBounds().origin());
2617 gfx::Point original_mouse_location
= mouse_location
;
2618 panel2_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
2620 // Drag P2 close to the left of P1 to trigger the snapping.
2621 gfx::Vector2d drag_delta_to_snap
= GetDragDeltaToSnapToLeft(panel2
, panel1
);
2622 mouse_location
= mouse_location
+ drag_delta_to_snap
;
2623 panel2_testing
->DragTitlebar(mouse_location
);
2624 ASSERT_EQ(2, detached_collection
->num_panels());
2625 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2626 panel2_expected_bounds
.Offset(drag_delta_to_snap
);
2627 panel2_expected_bounds
.set_x(
2628 panel1_expected_bounds
.x() - panel2_expected_bounds
.width());
2629 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2631 // Drag P2 a bit away from the left of P1 to trigger the unsnapping.
2632 gfx::Vector2d drag_delta_to_unsnap
= GetDragDeltaToUnsnap(panel1
);
2633 mouse_location
= mouse_location
+ drag_delta_to_unsnap
;
2634 panel2_testing
->DragTitlebar(mouse_location
);
2635 ASSERT_EQ(2, detached_collection
->num_panels());
2636 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2637 panel2_expected_bounds
= panel2_initial_bounds
;
2638 panel2_expected_bounds
.Offset(mouse_location
- original_mouse_location
);
2639 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2641 // Drag P2 close to the left of P1 to trigger the snapping again.
2642 drag_delta_to_snap
= GetDragDeltaToSnapToLeft(panel2
, panel1
);
2643 mouse_location
= mouse_location
+ drag_delta_to_snap
;
2644 panel2_testing
->DragTitlebar(mouse_location
);
2645 ASSERT_EQ(2, detached_collection
->num_panels());
2646 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2647 panel2_expected_bounds
.Offset(drag_delta_to_snap
);
2648 panel2_expected_bounds
.set_x(
2649 panel1_expected_bounds
.x() - panel2_expected_bounds
.width());
2650 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2652 // Drag P2 vertically with a little bit of horizontal movement should still
2653 // keep the snapping.
2654 gfx::Vector2d
drag_delta_almost_vertically(2, 20);
2655 mouse_location
= mouse_location
+ drag_delta_almost_vertically
;
2656 panel2_testing
->DragTitlebar(mouse_location
);
2657 ASSERT_EQ(2, detached_collection
->num_panels());
2658 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2659 panel2_expected_bounds
.set_y(
2660 panel2_expected_bounds
.y() + drag_delta_almost_vertically
.y());
2661 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2664 panel2_testing
->FinishDragTitlebar();
2665 ASSERT_EQ(2, detached_collection
->num_panels());
2666 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2667 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2669 panel_manager
->CloseAll();
2672 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, SnapPanelToPanelRight
) {
2673 PanelManager
* panel_manager
= PanelManager::GetInstance();
2674 DetachedPanelCollection
* detached_collection
=
2675 panel_manager
->detached_collection();
2677 // Create 2 detached panels.
2678 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 200, 100, 200);
2679 Panel
* panel1
= CreateDetachedPanel("1", panel1_initial_bounds
);
2680 gfx::Rect panel2_initial_bounds
= gfx::Rect(300, 100, 200, 250);
2681 Panel
* panel2
= CreateDetachedPanel("2", panel2_initial_bounds
);
2682 ASSERT_EQ(2, detached_collection
->num_panels());
2684 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2685 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2686 gfx::Rect
panel2_expected_bounds(panel2_initial_bounds
);
2687 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2689 // Press on title-bar.
2690 scoped_ptr
<NativePanelTesting
> panel2_testing(
2691 CreateNativePanelTesting(panel2
));
2692 gfx::Point
mouse_location(panel2
->GetBounds().origin());
2693 gfx::Point original_mouse_location
= mouse_location
;
2694 panel2_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
2696 // Drag P1 close to the right of P2 to trigger the snapping.
2697 gfx::Vector2d drag_delta_to_snap
= GetDragDeltaToSnapToRight(panel2
, panel1
);
2698 mouse_location
= mouse_location
+ drag_delta_to_snap
;
2699 panel2_testing
->DragTitlebar(mouse_location
);
2700 ASSERT_EQ(2, detached_collection
->num_panels());
2701 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2702 panel2_expected_bounds
.Offset(drag_delta_to_snap
);
2703 panel2_expected_bounds
.set_x(panel1_expected_bounds
.right());
2704 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2706 // Drag P2 a bit away from the right of P1 to trigger the unsnapping.
2707 gfx::Vector2d drag_delta_to_unsnap
= GetDragDeltaToUnsnap(panel1
);
2708 mouse_location
= mouse_location
+ drag_delta_to_unsnap
;
2709 panel2_testing
->DragTitlebar(mouse_location
);
2710 ASSERT_EQ(2, detached_collection
->num_panels());
2711 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2712 panel2_expected_bounds
= panel2_initial_bounds
;
2713 panel2_expected_bounds
.Offset(mouse_location
- original_mouse_location
);
2714 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2716 // Drag P2 close to the right of P1 to trigger the snapping again.
2717 drag_delta_to_snap
= GetDragDeltaToSnapToRight(panel2
, panel1
);
2718 mouse_location
= mouse_location
+ drag_delta_to_snap
;
2719 panel2_testing
->DragTitlebar(mouse_location
);
2720 ASSERT_EQ(2, detached_collection
->num_panels());
2721 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2722 panel2_expected_bounds
.Offset(drag_delta_to_snap
);
2723 panel2_expected_bounds
.set_x(panel1_expected_bounds
.right());
2724 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2726 // Drag P2 vertically with a little bit of horizontal movement should still
2727 // keep the snapping.
2728 gfx::Vector2d
drag_delta_almost_vertically(2, -20);
2729 mouse_location
= mouse_location
+ drag_delta_almost_vertically
;
2730 panel2_testing
->DragTitlebar(mouse_location
);
2731 ASSERT_EQ(2, detached_collection
->num_panels());
2732 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2733 panel2_expected_bounds
.set_y(
2734 panel2_expected_bounds
.y() + drag_delta_almost_vertically
.y());
2735 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2738 panel2_testing
->FinishDragTitlebar();
2739 ASSERT_EQ(2, detached_collection
->num_panels());
2740 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2741 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2743 panel_manager
->CloseAll();
2746 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, SnapAndCancel
) {
2747 PanelManager
* panel_manager
= PanelManager::GetInstance();
2748 DetachedPanelCollection
* detached_collection
=
2749 panel_manager
->detached_collection();
2751 // Create 2 detached panels.
2752 gfx::Rect panel1_initial_bounds
= gfx::Rect(300, 200, 300, 200);
2753 Panel
* panel1
= CreateDetachedPanel("1", panel1_initial_bounds
);
2754 gfx::Rect panel2_initial_bounds
= gfx::Rect(100, 100, 100, 250);
2755 Panel
* panel2
= CreateDetachedPanel("2", panel2_initial_bounds
);
2756 ASSERT_EQ(2, detached_collection
->num_panels());
2758 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2759 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2760 gfx::Rect
panel2_expected_bounds(panel2_initial_bounds
);
2761 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2763 // Press on title-bar.
2764 scoped_ptr
<NativePanelTesting
> panel2_testing(
2765 CreateNativePanelTesting(panel2
));
2766 gfx::Point
mouse_location(panel2
->GetBounds().origin());
2767 gfx::Point original_mouse_location
= mouse_location
;
2768 panel2_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
2770 // Drag P2 close to the left of P1 to trigger the snapping.
2771 gfx::Vector2d drag_delta_to_snap
= GetDragDeltaToSnapToLeft(panel2
, panel1
);
2772 mouse_location
= mouse_location
+ drag_delta_to_snap
;
2773 panel2_testing
->DragTitlebar(mouse_location
);
2774 ASSERT_EQ(2, detached_collection
->num_panels());
2775 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2776 panel2_expected_bounds
.Offset(drag_delta_to_snap
);
2777 panel2_expected_bounds
.set_x(
2778 panel1_expected_bounds
.x() - panel2_expected_bounds
.width());
2779 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2782 panel2_testing
->CancelDragTitlebar();
2783 ASSERT_EQ(2, detached_collection
->num_panels());
2784 EXPECT_EQ(panel1_initial_bounds
, panel1
->GetBounds());
2785 EXPECT_EQ(panel2_initial_bounds
, panel2
->GetBounds());
2787 panel_manager
->CloseAll();
2790 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, SnapPanelToStackLeft
) {
2791 PanelManager
* panel_manager
= PanelManager::GetInstance();
2792 DetachedPanelCollection
* detached_collection
=
2793 panel_manager
->detached_collection();
2795 // Create 2 stacked panels.
2796 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
2797 gfx::Rect panel1_initial_bounds
= gfx::Rect(300, 100, 200, 150);
2798 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
2799 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2800 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
2801 ASSERT_EQ(0, detached_collection
->num_panels());
2802 ASSERT_EQ(1, panel_manager
->num_stacks());
2803 ASSERT_EQ(2, stack
->num_panels());
2804 EXPECT_EQ(stack
, panel1
->collection());
2805 EXPECT_EQ(stack
, panel2
->collection());
2807 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2808 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2809 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2810 panel2_initial_bounds
, panel1_expected_bounds
);
2811 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2813 // Create 1 detached panel.
2814 gfx::Rect panel3_initial_bounds
= gfx::Rect(100, 200, 100, 100);
2815 Panel
* panel3
= CreateDetachedPanel("3", panel3_initial_bounds
);
2816 ASSERT_EQ(1, detached_collection
->num_panels());
2817 EXPECT_EQ(PanelCollection::DETACHED
, panel3
->collection()->type());
2818 gfx::Rect
panel3_expected_bounds(panel3_initial_bounds
);
2819 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2821 // Drag P3 close to the left of the stack of P1 and P2 to trigger the
2823 gfx::Vector2d drag_delta_to_snap
= GetDragDeltaToSnapToLeft(panel3
, panel1
);
2824 DragPanelByDelta(panel3
, drag_delta_to_snap
);
2825 ASSERT_EQ(1, detached_collection
->num_panels());
2826 ASSERT_EQ(1, panel_manager
->num_stacks());
2827 ASSERT_EQ(2, stack
->num_panels());
2828 EXPECT_EQ(stack
, panel1
->collection());
2829 EXPECT_EQ(stack
, panel2
->collection());
2830 EXPECT_EQ(PanelCollection::DETACHED
, panel3
->collection()->type());
2831 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2832 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2833 panel3_expected_bounds
.Offset(drag_delta_to_snap
);
2834 panel3_expected_bounds
.set_x(
2835 panel1_expected_bounds
.x() - panel3_expected_bounds
.width());
2836 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2838 panel_manager
->CloseAll();
2841 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, SnapPanelToStackRight
) {
2842 PanelManager
* panel_manager
= PanelManager::GetInstance();
2843 DetachedPanelCollection
* detached_collection
=
2844 panel_manager
->detached_collection();
2846 // Create 2 stacked panels.
2847 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
2848 gfx::Rect panel1_initial_bounds
= gfx::Rect(100, 100, 200, 150);
2849 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
2850 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2851 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
2852 ASSERT_EQ(0, detached_collection
->num_panels());
2853 ASSERT_EQ(1, panel_manager
->num_stacks());
2854 ASSERT_EQ(2, stack
->num_panels());
2855 EXPECT_EQ(stack
, panel1
->collection());
2856 EXPECT_EQ(stack
, panel2
->collection());
2858 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2859 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2860 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2861 panel2_initial_bounds
, panel1_expected_bounds
);
2862 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2864 // Create 1 detached panel.
2865 gfx::Rect panel3_initial_bounds
= gfx::Rect(300, 200, 100, 100);
2866 Panel
* panel3
= CreateDetachedPanel("3", panel3_initial_bounds
);
2867 ASSERT_EQ(1, detached_collection
->num_panels());
2868 EXPECT_EQ(PanelCollection::DETACHED
, panel3
->collection()->type());
2869 gfx::Rect
panel3_expected_bounds(panel3_initial_bounds
);
2870 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2872 // Drag P3 close to the right of the stack of P1 and P2 to trigger the
2874 gfx::Vector2d drag_delta_to_snap
= GetDragDeltaToSnapToRight(panel3
, panel1
);
2875 DragPanelByDelta(panel3
, drag_delta_to_snap
);
2876 ASSERT_EQ(1, detached_collection
->num_panels());
2877 ASSERT_EQ(1, panel_manager
->num_stacks());
2878 ASSERT_EQ(2, stack
->num_panels());
2879 EXPECT_EQ(stack
, panel1
->collection());
2880 EXPECT_EQ(stack
, panel2
->collection());
2881 EXPECT_EQ(PanelCollection::DETACHED
, panel3
->collection()->type());
2882 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2883 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2884 panel3_expected_bounds
.Offset(drag_delta_to_snap
);
2885 panel3_expected_bounds
.set_x(panel1_expected_bounds
.right());
2886 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2888 panel_manager
->CloseAll();
2891 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, DetachAndSnap
) {
2892 PanelManager
* panel_manager
= PanelManager::GetInstance();
2893 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
2894 DetachedPanelCollection
* detached_collection
=
2895 panel_manager
->detached_collection();
2897 // Create 1 detached panel.
2898 Panel
* panel1
= CreateDetachedPanel("1", gfx::Rect(300, 200, 100, 100));
2899 ASSERT_EQ(0, docked_collection
->num_panels());
2900 ASSERT_EQ(1, detached_collection
->num_panels());
2901 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
2902 gfx::Rect panel1_bounds
= panel1
->GetBounds();
2904 // Create 1 docked panel.
2905 Panel
* panel2
= CreateDockedPanel("2", gfx::Rect(0, 0, 150, 150));
2906 ASSERT_EQ(1, docked_collection
->num_panels());
2907 ASSERT_EQ(1, detached_collection
->num_panels());
2908 EXPECT_EQ(PanelCollection::DOCKED
, panel2
->collection()->type());
2909 gfx::Rect panel2_bounds
= panel2
->GetBounds();
2911 // Drag P2 close to the right of P1 to trigger both detaching and snapping.
2912 gfx::Vector2d drag_delta_to_detach_and_snap
=
2913 GetDragDeltaToSnapToRight(panel2
, panel1
);
2914 DragPanelByDelta(panel2
, drag_delta_to_detach_and_snap
);
2915 ASSERT_EQ(0, docked_collection
->num_panels());
2916 ASSERT_EQ(2, detached_collection
->num_panels());
2917 EXPECT_EQ(PanelCollection::DETACHED
, panel1
->collection()->type());
2918 EXPECT_EQ(PanelCollection::DETACHED
, panel2
->collection()->type());
2919 EXPECT_EQ(panel1_bounds
, panel1
->GetBounds());
2920 panel2_bounds
.Offset(drag_delta_to_detach_and_snap
);
2921 panel2_bounds
.set_x(panel1_bounds
.right());
2922 EXPECT_EQ(panel2_bounds
, panel2
->GetBounds());
2924 panel_manager
->CloseAll();
2927 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, DragTopStackedPanel
) {
2928 PanelManager
* panel_manager
= PanelManager::GetInstance();
2930 // Create 3 stacked panels.
2931 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
2932 gfx::Rect panel1_initial_bounds
= gfx::Rect(300, 100, 200, 150);
2933 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
2934 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
2935 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
2936 gfx::Rect panel3_initial_bounds
= gfx::Rect(0, 0, 150, 200);
2937 Panel
* panel3
= CreateStackedPanel("3", panel3_initial_bounds
, stack
);
2938 ASSERT_EQ(3, stack
->num_panels());
2939 ASSERT_EQ(1, panel_manager
->num_stacks());
2940 EXPECT_EQ(stack
, panel1
->collection());
2941 EXPECT_EQ(stack
, panel2
->collection());
2942 EXPECT_EQ(stack
, panel3
->collection());
2944 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
2945 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2946 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
2947 panel2_initial_bounds
, panel1_expected_bounds
);
2948 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2949 gfx::Rect panel3_expected_bounds
= GetStackedAtBottomPanelBounds(
2950 panel3_initial_bounds
, panel2_expected_bounds
);
2951 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2953 // Drag the top panel by a delta.
2954 // Expect all panels are still in the same stack and they are all moved by the
2956 gfx::Vector2d
drag_delta(-50, -20);
2957 DragPanelByDelta(panel1
, drag_delta
);
2958 ASSERT_EQ(3, stack
->num_panels());
2959 ASSERT_EQ(1, panel_manager
->num_stacks());
2960 EXPECT_EQ(stack
, panel1
->collection());
2961 EXPECT_EQ(stack
, panel2
->collection());
2962 EXPECT_EQ(stack
, panel3
->collection());
2964 panel1_expected_bounds
.Offset(drag_delta
);
2965 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
2966 panel2_expected_bounds
.Offset(drag_delta
);
2967 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
2968 panel3_expected_bounds
.Offset(drag_delta
);
2969 EXPECT_EQ(panel3_expected_bounds
, panel3
->GetBounds());
2971 panel_manager
->CloseAll();
2974 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, SnapDetachedPanelToScreenEdge
) {
2975 PanelManager
* panel_manager
= PanelManager::GetInstance();
2976 int small_distance
=
2977 PanelDragController::GetSnapPanelToScreenEdgeThresholdForTesting() / 2;
2979 // Setup 2 displays with secondary display on the right side of primary
2981 gfx::Rect
primary_display_area(0, 0, 400, 600);
2982 gfx::Rect
primary_work_area(0, 0, 400, 560);
2983 mock_display_settings_provider()->SetPrimaryDisplay(
2984 primary_display_area
, primary_work_area
);
2985 gfx::Rect
secondary_display_area(400, 100, 400, 500);
2986 gfx::Rect
secondary_work_area(400, 140, 400, 460);
2987 mock_display_settings_provider()->SetSecondaryDisplay(
2988 secondary_display_area
, secondary_work_area
);
2990 // Create one detached panel on the primary display.
2991 gfx::Rect initial_bounds
= gfx::Rect(100, 100, 200, 150);
2992 Panel
* panel
= CreateDetachedPanel("1", initial_bounds
);
2993 gfx::Rect
expected_bounds(initial_bounds
);
2994 EXPECT_EQ(expected_bounds
, panel
->GetBounds());
2996 // Drag the panel close to the right edge of the primary display.
2997 // Expect that the panel should snap to the right edge.
2998 gfx::Point
drag_to_location(
2999 primary_work_area
.right() - small_distance
- panel
->GetBounds().width(),
3000 panel
->GetBounds().y());
3001 DragPanelToMouseLocation(panel
, drag_to_location
);
3002 expected_bounds
.set_x(primary_work_area
.right() - panel
->GetBounds().width());
3003 EXPECT_EQ(expected_bounds
, panel
->GetBounds());
3005 // Drag the panel close to the top-left corner of the primary display.
3006 // Expect that the panel should snap to the top-left corner.
3007 drag_to_location
= gfx::Point(
3008 primary_work_area
.x() + small_distance
,
3009 primary_work_area
.y() - small_distance
);
3010 DragPanelToMouseLocation(panel
, drag_to_location
);
3011 expected_bounds
.set_origin(primary_work_area
.origin());
3012 EXPECT_EQ(expected_bounds
, panel
->GetBounds());
3014 // Drag the panel close to the top-right corner of the secondary display.
3015 // Expect that the panel should snap to the top-right corner.
3016 drag_to_location
= gfx::Point(
3017 secondary_work_area
.right() - small_distance
- panel
->GetBounds().width(),
3018 secondary_work_area
.y() + small_distance
);
3019 DragPanelToMouseLocation(panel
, drag_to_location
);
3020 expected_bounds
.set_x(
3021 secondary_work_area
.right() - panel
->GetBounds().width());
3022 expected_bounds
.set_y(secondary_work_area
.y());
3023 EXPECT_EQ(expected_bounds
, panel
->GetBounds());
3025 panel_manager
->CloseAll();
3028 IN_PROC_BROWSER_TEST_F(PanelDragBrowserTest
, SnapStackedPanelToScreenEdge
) {
3029 PanelManager
* panel_manager
= PanelManager::GetInstance();
3030 int small_distance
=
3031 PanelDragController::GetSnapPanelToScreenEdgeThresholdForTesting() / 2;
3033 // Setup 2 displays with secondary display on the right side of primary
3035 gfx::Rect
primary_display_area(0, 0, 400, 600);
3036 gfx::Rect
primary_work_area(0, 0, 400, 560);
3037 mock_display_settings_provider()->SetPrimaryDisplay(
3038 primary_display_area
, primary_work_area
);
3039 gfx::Rect
secondary_display_area(400, 100, 400, 500);
3040 gfx::Rect
secondary_work_area(400, 140, 400, 460);
3041 mock_display_settings_provider()->SetSecondaryDisplay(
3042 secondary_display_area
, secondary_work_area
);
3044 // Create 2 stacked panels on the primary display.
3045 StackedPanelCollection
* stack
= panel_manager
->CreateStack();
3046 gfx::Rect panel1_initial_bounds
= gfx::Rect(300, 100, 200, 150);
3047 Panel
* panel1
= CreateStackedPanel("1", panel1_initial_bounds
, stack
);
3048 gfx::Rect panel2_initial_bounds
= gfx::Rect(0, 0, 150, 100);
3049 Panel
* panel2
= CreateStackedPanel("2", panel2_initial_bounds
, stack
);
3051 gfx::Rect
panel1_expected_bounds(panel1_initial_bounds
);
3052 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
3053 gfx::Rect panel2_expected_bounds
= GetStackedAtBottomPanelBounds(
3054 panel2_initial_bounds
, panel1_expected_bounds
);
3055 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
3057 // Drag the stack close to the left edge of the primary display.
3058 // Expect that the stack should snap to the left edge.
3059 gfx::Point
drag_to_location(
3060 primary_work_area
.x() + small_distance
, panel1
->GetBounds().y());
3061 DragPanelToMouseLocation(panel1
, drag_to_location
);
3063 panel1_expected_bounds
.set_x(primary_work_area
.x());
3064 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
3065 panel2_expected_bounds
.set_x(primary_work_area
.x());
3066 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
3068 // Drag the stack close to the bottom-right corner of the primary display.
3069 // Expect that the stack should snap to the bottom-right corner.
3070 drag_to_location
= gfx::Point(
3071 primary_work_area
.right() + small_distance
- panel1
->GetBounds().width(),
3072 primary_work_area
.bottom() - small_distance
-
3073 panel1
->GetBounds().height() - panel2
->GetBounds().height());
3074 DragPanelToMouseLocation(panel1
, drag_to_location
);
3076 int expected_x
= primary_work_area
.right() - panel1
->GetBounds().width();
3077 panel1_expected_bounds
.set_x(expected_x
);
3078 panel1_expected_bounds
.set_y(primary_work_area
.bottom() -
3079 panel1
->GetBounds().height() - panel2
->GetBounds().height());
3080 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
3081 panel2_expected_bounds
.set_x(expected_x
);
3082 panel2_expected_bounds
.set_y(primary_work_area
.bottom() -
3083 panel2
->GetBounds().height());
3084 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
3086 // Drag the stack close to the top-left corner of the secondary display.
3087 // Expect that the stack should snap to the top-left corner.
3088 drag_to_location
= gfx::Point(
3089 secondary_work_area
.x() + small_distance
,
3090 secondary_work_area
.y() + small_distance
);
3091 DragPanelToMouseLocation(panel1
, drag_to_location
);
3093 expected_x
= secondary_work_area
.x();
3094 panel1_expected_bounds
.set_x(expected_x
);
3095 panel1_expected_bounds
.set_y(secondary_work_area
.y());
3096 EXPECT_EQ(panel1_expected_bounds
, panel1
->GetBounds());
3097 panel2_expected_bounds
.set_x(expected_x
);
3098 panel2_expected_bounds
.set_y(panel1_expected_bounds
.bottom());
3099 EXPECT_EQ(panel2_expected_bounds
, panel2
->GetBounds());
3101 panel_manager
->CloseAll();