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.
6 #include "base/prefs/pref_service.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/app/chrome_command_ids.h"
9 #include "chrome/browser/chrome_notification_types.h"
10 #include "chrome/browser/devtools/devtools_window.h"
11 #include "chrome/browser/extensions/extension_apitest.h"
12 #include "chrome/browser/net/url_request_mock_util.h"
13 #include "chrome/browser/prefs/browser_prefs.h"
14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
16 #include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
17 #include "chrome/browser/ui/browser.h"
18 #include "chrome/browser/ui/browser_commands.h"
19 #include "chrome/browser/ui/browser_finder.h"
20 #include "chrome/browser/ui/browser_iterator.h"
21 #include "chrome/browser/ui/browser_window.h"
22 #include "chrome/browser/ui/panels/base_panel_browser_test.h"
23 #include "chrome/browser/ui/panels/docked_panel_collection.h"
24 #include "chrome/browser/ui/panels/native_panel.h"
25 #include "chrome/browser/ui/panels/panel.h"
26 #include "chrome/browser/ui/panels/panel_manager.h"
27 #include "chrome/browser/ui/panels/test_panel_active_state_observer.h"
28 #include "chrome/browser/web_applications/web_app.h"
29 #include "chrome/common/chrome_switches.h"
30 #include "chrome/common/pref_names.h"
31 #include "chrome/common/url_constants.h"
32 #include "chrome/test/base/interactive_test_utils.h"
33 #include "chrome/test/base/ui_test_utils.h"
34 #include "content/public/browser/native_web_keyboard_event.h"
35 #include "content/public/browser/notification_service.h"
36 #include "content/public/browser/web_contents.h"
37 #include "content/public/common/url_constants.h"
38 #include "content/public/test/browser_test_utils.h"
39 #include "extensions/browser/extension_registry.h"
40 #include "extensions/common/constants.h"
41 #include "net/base/net_util.h"
42 #include "net/test/url_request/url_request_mock_http_job.h"
43 #include "testing/gtest/include/gtest/gtest.h"
44 #include "ui/base/hit_test.h"
45 #include "ui/events/event_utils.h"
46 #include "ui/gfx/screen.h"
48 using content::WebContents
;
50 class PanelBrowserTest
: public BasePanelBrowserTest
{
52 PanelBrowserTest() : BasePanelBrowserTest() {
56 // Helper function for debugging.
57 void PrintAllPanelBounds() {
58 const std::vector
<Panel
*>& panels
= PanelManager::GetInstance()->panels();
59 DLOG(WARNING
) << "PanelBounds:";
60 for (size_t i
= 0; i
< panels
.size(); ++i
) {
61 DLOG(WARNING
) << "#=" << i
62 << ", ptr=" << panels
[i
]
63 << ", x=" << panels
[i
]->GetBounds().x()
64 << ", y=" << panels
[i
]->GetBounds().y()
65 << ", width=" << panels
[i
]->GetBounds().width()
66 << ", height" << panels
[i
]->GetBounds().height();
70 std::vector
<gfx::Rect
> GetAllPanelBounds() {
71 std::vector
<Panel
*> panels
= PanelManager::GetInstance()->panels();
72 std::vector
<gfx::Rect
> bounds
;
73 for (size_t i
= 0; i
< panels
.size(); i
++)
74 bounds
.push_back(panels
[i
]->GetBounds());
78 std::vector
<gfx::Rect
> AddXDeltaToBounds(const std::vector
<gfx::Rect
>& bounds
,
79 const std::vector
<int>& delta_x
) {
80 std::vector
<gfx::Rect
> new_bounds
= bounds
;
81 for (size_t i
= 0; i
< bounds
.size(); ++i
)
82 new_bounds
[i
].Offset(delta_x
[i
], 0);
86 std::vector
<Panel::ExpansionState
> GetAllPanelExpansionStates() {
87 std::vector
<Panel
*> panels
= PanelManager::GetInstance()->panels();
88 std::vector
<Panel::ExpansionState
> expansion_states
;
89 for (size_t i
= 0; i
< panels
.size(); i
++)
90 expansion_states
.push_back(panels
[i
]->expansion_state());
91 return expansion_states
;
94 std::vector
<bool> GetAllPanelActiveStates() {
95 std::vector
<Panel
*> panels
= PanelManager::GetInstance()->panels();
96 std::vector
<bool> active_states
;
97 for (size_t i
= 0; i
< panels
.size(); i
++)
98 active_states
.push_back(panels
[i
]->IsActive());
102 std::vector
<bool> ProduceExpectedActiveStates(
103 int expected_active_panel_index
) {
104 std::vector
<Panel
*> panels
= PanelManager::GetInstance()->panels();
105 std::vector
<bool> active_states
;
106 for (int i
= 0; i
< static_cast<int>(panels
.size()); i
++)
107 active_states
.push_back(i
== expected_active_panel_index
);
108 return active_states
;
111 void WaitForPanelActiveStates(const std::vector
<bool>& old_states
,
112 const std::vector
<bool>& new_states
) {
113 DCHECK(old_states
.size() == new_states
.size());
114 std::vector
<Panel
*> panels
= PanelManager::GetInstance()->panels();
115 for (size_t i
= 0; i
< old_states
.size(); i
++) {
116 if (old_states
[i
] != new_states
[i
]){
117 WaitForPanelActiveState(
118 panels
[i
], new_states
[i
] ? SHOW_AS_ACTIVE
: SHOW_AS_INACTIVE
);
123 void TestMinimizeRestore() {
124 // This constant is used to generate a point 'sufficiently higher then
125 // top edge of the panel'. On some platforms (Mac) we extend hover area
126 // a bit above the minimized panel as well, so it takes significant
127 // distance to 'move mouse out' of the hover-sensitive area.
128 const int kFarEnoughFromHoverArea
= 153;
130 PanelManager
* panel_manager
= PanelManager::GetInstance();
131 std::vector
<Panel
*> panels
= panel_manager
->panels();
132 std::vector
<gfx::Rect
> test_begin_bounds
= GetAllPanelBounds();
133 std::vector
<gfx::Rect
> expected_bounds
= test_begin_bounds
;
134 std::vector
<Panel::ExpansionState
> expected_expansion_states(
135 panels
.size(), Panel::EXPANDED
);
136 std::vector
<NativePanelTesting
*> native_panels_testing(panels
.size());
137 for (size_t i
= 0; i
< panels
.size(); ++i
) {
138 native_panels_testing
[i
] = CreateNativePanelTesting(panels
[i
]);
141 // Verify titlebar click does not minimize.
142 for (size_t index
= 0; index
< panels
.size(); ++index
) {
143 // Press left mouse button. Verify nothing changed.
144 native_panels_testing
[index
]->PressLeftMouseButtonTitlebar(
145 panels
[index
]->GetBounds().origin());
146 EXPECT_EQ(expected_bounds
, GetAllPanelBounds());
147 EXPECT_EQ(expected_expansion_states
, GetAllPanelExpansionStates());
149 // Release mouse button. Verify nothing changed.
150 native_panels_testing
[index
]->ReleaseMouseButtonTitlebar();
151 EXPECT_EQ(expected_bounds
, GetAllPanelBounds());
152 EXPECT_EQ(expected_expansion_states
, GetAllPanelExpansionStates());
155 // Minimize all panels for next stage in test.
156 for (size_t index
= 0; index
< panels
.size(); ++index
) {
157 panels
[index
]->Minimize();
158 expected_bounds
[index
].set_height(panel::kMinimizedPanelHeight
);
159 expected_bounds
[index
].set_y(
160 test_begin_bounds
[index
].y() +
161 test_begin_bounds
[index
].height() - panel::kMinimizedPanelHeight
);
162 expected_expansion_states
[index
] = Panel::MINIMIZED
;
163 EXPECT_EQ(expected_bounds
, GetAllPanelBounds());
164 EXPECT_EQ(expected_expansion_states
, GetAllPanelExpansionStates());
167 // Setup bounds and expansion states for minimized and titlebar-only
169 std::vector
<Panel::ExpansionState
> titlebar_exposed_states(
170 panels
.size(), Panel::TITLE_ONLY
);
171 std::vector
<gfx::Rect
> minimized_bounds
= expected_bounds
;
172 std::vector
<Panel::ExpansionState
> minimized_states(
173 panels
.size(), Panel::MINIMIZED
);
174 std::vector
<gfx::Rect
> titlebar_exposed_bounds
= test_begin_bounds
;
175 for (size_t index
= 0; index
< panels
.size(); ++index
) {
176 titlebar_exposed_bounds
[index
].set_height(
177 panels
[index
]->native_panel()->TitleOnlyHeight());
178 titlebar_exposed_bounds
[index
].set_y(
179 test_begin_bounds
[index
].y() +
180 test_begin_bounds
[index
].height() -
181 panels
[index
]->native_panel()->TitleOnlyHeight());
184 // Test hover. All panels are currently in minimized state.
185 EXPECT_EQ(minimized_states
, GetAllPanelExpansionStates());
186 for (size_t index
= 0; index
< panels
.size(); ++index
) {
187 // Hover mouse on minimized panel.
188 // Verify titlebar is exposed on all panels.
189 gfx::Point
hover_point(panels
[index
]->GetBounds().origin());
190 MoveMouseAndWaitForExpansionStateChange(panels
[index
], hover_point
);
191 EXPECT_EQ(titlebar_exposed_bounds
, GetAllPanelBounds());
192 EXPECT_EQ(titlebar_exposed_states
, GetAllPanelExpansionStates());
194 // Hover mouse above the panel. Verify all panels are minimized.
196 panels
[index
]->GetBounds().y() - kFarEnoughFromHoverArea
);
197 MoveMouseAndWaitForExpansionStateChange(panels
[index
], hover_point
);
198 EXPECT_EQ(minimized_bounds
, GetAllPanelBounds());
199 EXPECT_EQ(minimized_states
, GetAllPanelExpansionStates());
201 // Hover mouse below minimized panel.
202 // Verify titlebar is exposed on all panels.
203 hover_point
.set_y(panels
[index
]->GetBounds().y() +
204 panels
[index
]->GetBounds().height() + 5);
205 MoveMouseAndWaitForExpansionStateChange(panels
[index
], hover_point
);
206 EXPECT_EQ(titlebar_exposed_bounds
, GetAllPanelBounds());
207 EXPECT_EQ(titlebar_exposed_states
, GetAllPanelExpansionStates());
209 // Hover below titlebar exposed panel. Verify nothing changed.
210 hover_point
.set_y(panels
[index
]->GetBounds().y() +
211 panels
[index
]->GetBounds().height() + 6);
212 MoveMouse(hover_point
);
213 EXPECT_EQ(titlebar_exposed_bounds
, GetAllPanelBounds());
214 EXPECT_EQ(titlebar_exposed_states
, GetAllPanelExpansionStates());
216 // Hover mouse above panel. Verify all panels are minimized.
218 panels
[index
]->GetBounds().y() - kFarEnoughFromHoverArea
);
219 MoveMouseAndWaitForExpansionStateChange(panels
[index
], hover_point
);
220 EXPECT_EQ(minimized_bounds
, GetAllPanelBounds());
221 EXPECT_EQ(minimized_states
, GetAllPanelExpansionStates());
224 // Test restore. All panels are currently in minimized state.
225 for (size_t index
= 0; index
< panels
.size(); ++index
) {
226 // Hover on the last panel. This is to test the case of clicking on the
227 // panel when it's in titlebar exposed state.
228 if (index
== panels
.size() - 1)
229 MoveMouse(minimized_bounds
[index
].origin());
231 // Click minimized or title bar exposed panel as the case may be.
232 // Verify panel is restored to its original size.
233 native_panels_testing
[index
]->PressLeftMouseButtonTitlebar(
234 panels
[index
]->GetBounds().origin());
235 native_panels_testing
[index
]->ReleaseMouseButtonTitlebar();
236 expected_bounds
[index
].set_height(
237 test_begin_bounds
[index
].height());
238 expected_bounds
[index
].set_y(test_begin_bounds
[index
].y());
239 expected_expansion_states
[index
] = Panel::EXPANDED
;
240 EXPECT_EQ(expected_bounds
, GetAllPanelBounds());
241 EXPECT_EQ(expected_expansion_states
, GetAllPanelExpansionStates());
243 // Hover again on the last panel which is now restored, to reset the
244 // titlebar exposed state.
245 if (index
== panels
.size() - 1)
246 MoveMouse(minimized_bounds
[index
].origin());
249 // The below could be separate tests, just adding a TODO here for tracking.
250 // TODO(prasadt): Add test for dragging when in titlebar exposed state.
251 // TODO(prasadt): Add test in presence of auto hiding task bar.
253 for (size_t i
= 0; i
< panels
.size(); ++i
)
254 delete native_panels_testing
[i
];
258 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, CheckDockedPanelProperties
) {
259 PanelManager
* panel_manager
= PanelManager::GetInstance();
260 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
262 // Create 3 docked panels that are in expanded, title-only or minimized states
264 Panel
* panel1
= CreatePanelWithBounds("1", gfx::Rect(0, 0, 100, 100));
265 Panel
* panel2
= CreatePanelWithBounds("2", gfx::Rect(0, 0, 100, 100));
266 Panel
* panel3
= CreatePanelWithBounds("3", gfx::Rect(0, 0, 100, 100));
267 panel2
->SetExpansionState(Panel::TITLE_ONLY
);
268 EXPECT_EQ(Panel::TITLE_ONLY
, panel2
->expansion_state());
269 panel3
->SetExpansionState(Panel::MINIMIZED
);
270 EXPECT_EQ(Panel::MINIMIZED
, panel3
->expansion_state());
271 scoped_ptr
<NativePanelTesting
> panel1_testing(
272 CreateNativePanelTesting(panel1
));
273 scoped_ptr
<NativePanelTesting
> panel2_testing(
274 CreateNativePanelTesting(panel2
));
275 scoped_ptr
<NativePanelTesting
> panel3_testing(
276 CreateNativePanelTesting(panel3
));
278 // Ensure that the layout message can get a chance to be processed so that
279 // the button visibility can be updated.
280 base::MessageLoop::current()->RunUntilIdle();
282 EXPECT_EQ(3, panel_manager
->num_panels());
283 EXPECT_TRUE(docked_collection
->HasPanel(panel1
));
284 EXPECT_TRUE(docked_collection
->HasPanel(panel2
));
285 EXPECT_TRUE(docked_collection
->HasPanel(panel3
));
287 EXPECT_EQ(Panel::EXPANDED
, panel1
->expansion_state());
288 EXPECT_EQ(Panel::TITLE_ONLY
, panel2
->expansion_state());
289 EXPECT_EQ(Panel::MINIMIZED
, panel3
->expansion_state());
291 EXPECT_TRUE(panel1
->IsAlwaysOnTop());
292 EXPECT_TRUE(panel2
->IsAlwaysOnTop());
293 EXPECT_TRUE(panel3
->IsAlwaysOnTop());
295 EXPECT_TRUE(panel1_testing
->IsButtonVisible(panel::CLOSE_BUTTON
));
296 EXPECT_TRUE(panel2_testing
->IsButtonVisible(panel::CLOSE_BUTTON
));
297 EXPECT_TRUE(panel3_testing
->IsButtonVisible(panel::CLOSE_BUTTON
));
299 EXPECT_TRUE(panel1_testing
->IsButtonVisible(panel::MINIMIZE_BUTTON
));
300 EXPECT_FALSE(panel2_testing
->IsButtonVisible(panel::MINIMIZE_BUTTON
));
301 EXPECT_FALSE(panel3_testing
->IsButtonVisible(panel::MINIMIZE_BUTTON
));
303 EXPECT_FALSE(panel1_testing
->IsButtonVisible(panel::RESTORE_BUTTON
));
304 EXPECT_TRUE(panel2_testing
->IsButtonVisible(panel::RESTORE_BUTTON
));
305 EXPECT_TRUE(panel3_testing
->IsButtonVisible(panel::RESTORE_BUTTON
));
307 // Expanded panel cannot be resized at the bottom.
308 EXPECT_EQ(panel::RESIZABLE_EXCEPT_BOTTOM
, panel1
->CanResizeByMouse());
309 EXPECT_EQ(panel::NOT_RESIZABLE
, panel2
->CanResizeByMouse());
310 EXPECT_EQ(panel::NOT_RESIZABLE
, panel3
->CanResizeByMouse());
312 EXPECT_EQ(panel::TOP_ROUNDED
, panel1_testing
->GetWindowCornerStyle());
313 EXPECT_EQ(panel::TOP_ROUNDED
, panel1_testing
->GetWindowCornerStyle());
314 EXPECT_EQ(panel::TOP_ROUNDED
, panel3_testing
->GetWindowCornerStyle());
316 EXPECT_EQ(Panel::USE_PANEL_ATTENTION
, panel1
->attention_mode());
317 EXPECT_EQ(Panel::USE_PANEL_ATTENTION
, panel2
->attention_mode());
318 EXPECT_EQ(Panel::USE_PANEL_ATTENTION
, panel3
->attention_mode());
320 panel_manager
->CloseAll();
323 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, CreatePanel
) {
324 PanelManager
* panel_manager
= PanelManager::GetInstance();
325 EXPECT_EQ(0, panel_manager
->num_panels()); // No panels initially.
327 Panel
* panel
= CreatePanel("PanelTest");
328 EXPECT_EQ(1, panel_manager
->num_panels());
330 gfx::Rect bounds
= panel
->GetBounds();
331 EXPECT_GT(bounds
.x(), 0);
332 EXPECT_GT(bounds
.y(), 0);
333 EXPECT_GT(bounds
.width(), 0);
334 EXPECT_GT(bounds
.height(), 0);
336 EXPECT_EQ(bounds
.right(),
337 panel_manager
->docked_collection()->StartingRightPosition());
339 CloseWindowAndWait(panel
);
341 EXPECT_EQ(0, panel_manager
->num_panels());
344 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, CreateBigPanel
) {
345 gfx::Rect work_area
= PanelManager::GetInstance()->
346 display_settings_provider()->GetPrimaryWorkArea();
347 Panel
* panel
= CreatePanelWithBounds("BigPanel", work_area
);
348 gfx::Rect bounds
= panel
->GetBounds();
349 EXPECT_EQ(panel
->max_size().width(), bounds
.width());
350 EXPECT_LT(bounds
.width(), work_area
.width());
351 EXPECT_EQ(panel
->max_size().height(), bounds
.height());
352 EXPECT_LT(bounds
.height(), work_area
.height());
356 class WaitForStableInitialSize
: public TestPanelNotificationObserver
{
358 explicit WaitForStableInitialSize(Panel
* panel
)
359 : TestPanelNotificationObserver(
360 chrome::NOTIFICATION_PANEL_COLLECTION_UPDATED
,
361 content::NotificationService::AllSources()),
363 virtual ~WaitForStableInitialSize() {}
366 virtual bool AtExpectedState() OVERRIDE
{
367 return panel_
->GetBounds().height() > panel_
->TitleOnlyHeight();
372 class WaitForAutoResizeWider
: public TestPanelNotificationObserver
{
374 explicit WaitForAutoResizeWider(Panel
* panel
)
375 : TestPanelNotificationObserver(
376 chrome::NOTIFICATION_PANEL_COLLECTION_UPDATED
,
377 content::NotificationService::AllSources()),
379 initial_size_(panel
->GetBounds().size()) {}
380 virtual ~WaitForAutoResizeWider() {}
383 virtual bool AtExpectedState() OVERRIDE
{
384 return panel_
->GetBounds().width() > initial_size_
.width();
387 gfx::Size initial_size_
;
390 class WaitForAutoResizeNarrower
: public TestPanelNotificationObserver
{
392 explicit WaitForAutoResizeNarrower(Panel
* panel
)
393 : TestPanelNotificationObserver(
394 chrome::NOTIFICATION_PANEL_COLLECTION_UPDATED
,
395 content::NotificationService::AllSources()),
397 initial_size_(panel
->GetBounds().size()) {}
398 virtual ~WaitForAutoResizeNarrower() {}
401 virtual bool AtExpectedState() OVERRIDE
{
402 return panel_
->GetBounds().width() < initial_size_
.width();
405 gfx::Size initial_size_
;
409 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, DISABLED_AutoResize
) {
410 PanelManager
* panel_manager
= PanelManager::GetInstance();
411 panel_manager
->enable_auto_sizing(true);
412 // Bigger space is needed by this test.
413 mock_display_settings_provider()->SetPrimaryDisplay(
414 gfx::Rect(0, 0, 1200, 900), gfx::Rect(0, 0, 1200, 900));
416 // Create a test panel with web contents loaded.
417 CreatePanelParams
params("PanelTest1", gfx::Rect(), SHOW_AS_ACTIVE
);
418 GURL
url(ui_test_utils::GetTestUrl(
419 base::FilePath(kTestDir
),
420 base::FilePath(FILE_PATH_LITERAL("update-preferred-size.html"))));
422 Panel
* panel
= CreatePanelWithParams(params
);
424 // Ensure panel has auto resized to original web content size.
425 // The resize will update the docked panel collection.
426 WaitForStableInitialSize
initial_resize(panel
);
427 initial_resize
.Wait();
428 gfx::Rect initial_bounds
= panel
->GetBounds();
430 // Expand the test page. The resize will update the docked panel collection.
431 WaitForAutoResizeWider
enlarge(panel
);
432 EXPECT_TRUE(content::ExecuteScript(
433 panel
->GetWebContents(), "changeSize(50);"));
435 gfx::Rect bounds_on_grow
= panel
->GetBounds();
436 EXPECT_GT(bounds_on_grow
.width(), initial_bounds
.width());
437 EXPECT_EQ(bounds_on_grow
.height(), initial_bounds
.height());
439 // Shrink the test page. The resize will update the docked panel collection.
440 WaitForAutoResizeNarrower
shrink(panel
);
441 EXPECT_TRUE(content::ExecuteScript(
442 panel
->GetWebContents(), "changeSize(-30);"));
444 gfx::Rect bounds_on_shrink
= panel
->GetBounds();
445 EXPECT_LT(bounds_on_shrink
.width(), bounds_on_grow
.width());
446 EXPECT_GT(bounds_on_shrink
.width(), initial_bounds
.width());
447 EXPECT_EQ(bounds_on_shrink
.height(), initial_bounds
.height());
449 // Verify resizing turns off auto-resizing and panel no longer auto-resizes.
450 gfx::Rect previous_bounds
= panel
->GetBounds();
451 // These should be identical because the panel is expanded.
452 EXPECT_EQ(previous_bounds
.size(), panel
->GetRestoredBounds().size());
453 gfx::Size
new_size(previous_bounds
.size());
454 new_size
.Enlarge(5, 5);
455 gfx::Rect
new_bounds(previous_bounds
.origin(), new_size
);
456 panel
->SetBounds(new_bounds
);
457 EXPECT_FALSE(panel
->auto_resizable());
458 EXPECT_EQ(new_bounds
.size(), panel
->GetBounds().size());
459 EXPECT_EQ(new_bounds
.size(), panel
->GetRestoredBounds().size());
461 // Turn back on auto-resize and verify that panel auto resizes.
462 content::WindowedNotificationObserver
auto_resize_enabled(
463 chrome::NOTIFICATION_PANEL_COLLECTION_UPDATED
,
464 content::NotificationService::AllSources());
465 panel
->SetAutoResizable(true);
466 auto_resize_enabled
.Wait();
467 gfx::Rect bounds_auto_resize_enabled
= panel
->GetBounds();
468 EXPECT_EQ(bounds_on_shrink
.width(), bounds_auto_resize_enabled
.width());
469 EXPECT_EQ(bounds_on_shrink
.height(), bounds_auto_resize_enabled
.height());
474 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, ResizePanel
) {
475 PanelManager
* panel_manager
= PanelManager::GetInstance();
476 panel_manager
->enable_auto_sizing(true);
478 Panel
* panel
= CreatePanel("TestPanel");
479 EXPECT_TRUE(panel
->auto_resizable());
480 EXPECT_EQ(Panel::EXPANDED
, panel
->expansion_state());
482 // Verify resizing turns off auto-resizing and that it works.
483 gfx::Rect original_bounds
= panel
->GetBounds();
484 // These should be identical because the panel is expanded.
485 EXPECT_EQ(original_bounds
.size(), panel
->GetRestoredBounds().size());
486 gfx::Size
new_size(original_bounds
.size());
487 new_size
.Enlarge(5, 5);
488 gfx::Rect
new_bounds(original_bounds
.origin(), new_size
);
489 panel
->SetBounds(new_bounds
);
490 EXPECT_FALSE(panel
->auto_resizable());
491 EXPECT_EQ(new_bounds
.size(), panel
->GetBounds().size());
492 EXPECT_EQ(new_bounds
.size(), panel
->GetRestoredBounds().size());
494 // Verify current height unaffected when panel is not expanded.
495 panel
->SetExpansionState(Panel::MINIMIZED
);
496 int original_height
= panel
->GetBounds().height();
497 new_size
.Enlarge(5, 5);
498 new_bounds
.set_size(new_size
);
499 panel
->SetBounds(new_bounds
);
500 EXPECT_EQ(new_bounds
.size().width(), panel
->GetBounds().width());
501 EXPECT_EQ(original_height
, panel
->GetBounds().height());
502 EXPECT_EQ(new_bounds
.size(), panel
->GetRestoredBounds().size());
507 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, AnimateBounds
) {
508 // Create a detached panel, instead of docked panel because it cannot be
509 // moved to any location.
510 Panel
* panel
= CreateDetachedPanel("1", gfx::Rect(200, 100, 100, 100));
511 scoped_ptr
<NativePanelTesting
> panel_testing(
512 CreateNativePanelTesting(panel
));
514 // Validates that no animation should be triggered when the panel is being
516 gfx::Point
mouse_location(panel
->GetBounds().origin());
517 panel_testing
->PressLeftMouseButtonTitlebar(mouse_location
);
518 panel_testing
->DragTitlebar(mouse_location
+ gfx::Vector2d(-100, 5));
519 EXPECT_FALSE(panel_testing
->IsAnimatingBounds());
520 panel_testing
->FinishDragTitlebar();
522 // Set bounds with animation.
523 gfx::Rect bounds
= gfx::Rect(10, 20, 150, 160);
524 panel
->SetPanelBounds(bounds
);
525 EXPECT_TRUE(panel_testing
->IsAnimatingBounds());
526 WaitForBoundsAnimationFinished(panel
);
527 EXPECT_FALSE(panel_testing
->IsAnimatingBounds());
528 EXPECT_EQ(bounds
, panel
->GetBounds());
530 // Set bounds without animation.
531 bounds
= gfx::Rect(30, 40, 200, 220);
532 panel
->SetPanelBoundsInstantly(bounds
);
533 EXPECT_FALSE(panel_testing
->IsAnimatingBounds());
534 EXPECT_EQ(bounds
, panel
->GetBounds());
539 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, RestoredBounds
) {
540 Panel
* panel
= CreatePanelWithBounds("PanelTest", gfx::Rect(0, 0, 100, 100));
541 EXPECT_EQ(Panel::EXPANDED
, panel
->expansion_state());
542 EXPECT_EQ(panel
->GetBounds(), panel
->GetRestoredBounds());
544 panel
->SetExpansionState(Panel::MINIMIZED
);
545 EXPECT_EQ(Panel::MINIMIZED
, panel
->expansion_state());
546 gfx::Rect bounds
= panel
->GetBounds();
547 gfx::Rect restored
= panel
->GetRestoredBounds();
548 EXPECT_EQ(bounds
.x(), restored
.x());
549 EXPECT_GT(bounds
.y(), restored
.y());
550 EXPECT_EQ(bounds
.width(), restored
.width());
551 EXPECT_LT(bounds
.height(), restored
.height());
553 panel
->SetExpansionState(Panel::TITLE_ONLY
);
554 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
555 bounds
= panel
->GetBounds();
556 restored
= panel
->GetRestoredBounds();
557 EXPECT_EQ(bounds
.x(), restored
.x());
558 EXPECT_GT(bounds
.y(), restored
.y());
559 EXPECT_EQ(bounds
.width(), restored
.width());
560 EXPECT_LT(bounds
.height(), restored
.height());
562 panel
->SetExpansionState(Panel::MINIMIZED
);
563 EXPECT_EQ(Panel::MINIMIZED
, panel
->expansion_state());
564 bounds
= panel
->GetBounds();
565 restored
= panel
->GetRestoredBounds();
566 EXPECT_EQ(bounds
.x(), restored
.x());
567 EXPECT_GT(bounds
.y(), restored
.y());
568 EXPECT_EQ(bounds
.width(), restored
.width());
569 EXPECT_LT(bounds
.height(), restored
.height());
571 panel
->SetExpansionState(Panel::EXPANDED
);
572 EXPECT_EQ(panel
->GetBounds(), panel
->GetRestoredBounds());
574 // Verify that changing the panel bounds does not affect the restored height.
575 int saved_restored_height
= restored
.height();
576 panel
->SetExpansionState(Panel::MINIMIZED
);
577 bounds
= gfx::Rect(10, 20, 300, 400);
578 panel
->SetPanelBounds(bounds
);
579 EXPECT_EQ(saved_restored_height
, panel
->GetRestoredBounds().height());
581 panel
->SetExpansionState(Panel::TITLE_ONLY
);
582 bounds
= gfx::Rect(20, 30, 100, 200);
583 panel
->SetPanelBounds(bounds
);
584 EXPECT_EQ(saved_restored_height
, panel
->GetRestoredBounds().height());
586 panel
->SetExpansionState(Panel::EXPANDED
);
587 bounds
= gfx::Rect(40, 60, 300, 400);
588 panel
->SetPanelBounds(bounds
);
589 EXPECT_EQ(saved_restored_height
, panel
->GetRestoredBounds().height());
590 panel
->set_full_size(bounds
.size());
591 EXPECT_NE(saved_restored_height
, panel
->GetRestoredBounds().height());
596 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, MinimizeRestore
) {
597 // Test with one panel.
598 CreatePanelWithBounds("PanelTest1", gfx::Rect(0, 0, 100, 100));
599 TestMinimizeRestore();
601 PanelManager::GetInstance()->CloseAll();
604 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, MinimizeRestoreTwoPanels
) {
605 // Test with two panels.
606 CreatePanelWithBounds("PanelTest1", gfx::Rect(0, 0, 100, 100));
607 CreatePanelWithBounds("PanelTest2", gfx::Rect(0, 0, 110, 110));
608 TestMinimizeRestore();
610 PanelManager::GetInstance()->CloseAll();
613 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, MinimizeRestoreThreePanels
) {
614 // Test with three panels.
615 CreatePanelWithBounds("PanelTest1", gfx::Rect(0, 0, 100, 100));
616 CreatePanelWithBounds("PanelTest2", gfx::Rect(0, 0, 110, 110));
617 CreatePanelWithBounds("PanelTest3", gfx::Rect(0, 0, 120, 120));
618 TestMinimizeRestore();
620 PanelManager::GetInstance()->CloseAll();
623 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, MinimizeRestoreButtonClick
) {
624 // Test with three panels.
625 Panel
* panel1
= CreatePanel("PanelTest1");
626 Panel
* panel2
= CreatePanel("PanelTest2");
627 Panel
* panel3
= CreatePanel("PanelTest3");
628 EXPECT_FALSE(panel1
->IsMinimized());
629 EXPECT_FALSE(panel2
->IsMinimized());
630 EXPECT_FALSE(panel3
->IsMinimized());
632 // Click restore button on an expanded panel. Expect no change.
633 panel1
->OnRestoreButtonClicked(panel::NO_MODIFIER
);
634 EXPECT_FALSE(panel1
->IsMinimized());
635 EXPECT_FALSE(panel2
->IsMinimized());
636 EXPECT_FALSE(panel3
->IsMinimized());
638 // Click minimize button on an expanded panel. Only that panel will minimize.
639 panel1
->OnMinimizeButtonClicked(panel::NO_MODIFIER
);
640 EXPECT_TRUE(panel1
->IsMinimized());
641 EXPECT_FALSE(panel2
->IsMinimized());
642 EXPECT_FALSE(panel3
->IsMinimized());
644 // Click minimize button on a minimized panel. Expect no change.
645 panel1
->OnMinimizeButtonClicked(panel::NO_MODIFIER
);
646 EXPECT_TRUE(panel1
->IsMinimized());
647 EXPECT_FALSE(panel2
->IsMinimized());
648 EXPECT_FALSE(panel3
->IsMinimized());
650 // Minimize all panels by clicking minimize button on an expanded panel
651 // with the apply-all modifier.
652 panel2
->OnMinimizeButtonClicked(panel::APPLY_TO_ALL
);
653 EXPECT_TRUE(panel1
->IsMinimized());
654 EXPECT_TRUE(panel2
->IsMinimized());
655 EXPECT_TRUE(panel3
->IsMinimized());
657 // Click restore button on a minimized panel. Only that panel will restore.
658 panel2
->OnRestoreButtonClicked(panel::NO_MODIFIER
);
659 EXPECT_TRUE(panel1
->IsMinimized());
660 EXPECT_FALSE(panel2
->IsMinimized());
661 EXPECT_TRUE(panel3
->IsMinimized());
663 // Restore all panels by clicking restore button on a minimized panel.
664 panel3
->OnRestoreButtonClicked(panel::APPLY_TO_ALL
);
665 EXPECT_FALSE(panel1
->IsMinimized());
666 EXPECT_FALSE(panel2
->IsMinimized());
667 EXPECT_FALSE(panel3
->IsMinimized());
670 // http://crbug.com/243891 flaky on Linux
671 #if defined(OS_LINUX)
672 #define MAYBE_RestoreAllWithTitlebarClick DISABLED_RestoreAllWithTitlebarClick
674 #define MAYBE_RestoreAllWithTitlebarClick RestoreAllWithTitlebarClick
676 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, MAYBE_RestoreAllWithTitlebarClick
) {
677 // Test with three panels.
678 Panel
* panel1
= CreatePanel("PanelTest1");
679 Panel
* panel2
= CreatePanel("PanelTest2");
680 Panel
* panel3
= CreatePanel("PanelTest3");
681 EXPECT_FALSE(panel1
->IsMinimized());
682 EXPECT_FALSE(panel2
->IsMinimized());
683 EXPECT_FALSE(panel3
->IsMinimized());
685 scoped_ptr
<NativePanelTesting
> test_panel1(
686 CreateNativePanelTesting(panel1
));
687 scoped_ptr
<NativePanelTesting
> test_panel2(
688 CreateNativePanelTesting(panel2
));
689 scoped_ptr
<NativePanelTesting
> test_panel3(
690 CreateNativePanelTesting(panel3
));
692 // Click on an expanded panel's titlebar using the apply-all modifier.
693 // Verify expansion state is unchanged.
694 test_panel2
->PressLeftMouseButtonTitlebar(panel2
->GetBounds().origin(),
695 panel::APPLY_TO_ALL
);
696 test_panel2
->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL
);
697 EXPECT_FALSE(panel1
->IsMinimized());
698 EXPECT_FALSE(panel2
->IsMinimized());
699 EXPECT_FALSE(panel3
->IsMinimized());
701 // Click on a minimized panel's titlebar using the apply-all modifier.
705 EXPECT_TRUE(panel1
->IsMinimized());
706 EXPECT_TRUE(panel2
->IsMinimized());
707 EXPECT_TRUE(panel3
->IsMinimized());
709 // Nothing changes until mouse is released.
710 test_panel1
->PressLeftMouseButtonTitlebar(panel1
->GetBounds().origin(),
711 panel::APPLY_TO_ALL
);
712 EXPECT_TRUE(panel1
->IsMinimized());
713 EXPECT_TRUE(panel2
->IsMinimized());
714 EXPECT_TRUE(panel3
->IsMinimized());
715 // Verify all panels restored when mouse is released.
716 test_panel1
->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL
);
717 EXPECT_FALSE(panel1
->IsMinimized());
718 EXPECT_FALSE(panel2
->IsMinimized());
719 EXPECT_FALSE(panel3
->IsMinimized());
721 // Minimize a single panel. Then click on expanded panel with apply-all
722 // modifier. Verify nothing changes.
724 EXPECT_TRUE(panel1
->IsMinimized());
725 EXPECT_FALSE(panel2
->IsMinimized());
726 EXPECT_FALSE(panel3
->IsMinimized());
728 test_panel2
->PressLeftMouseButtonTitlebar(panel2
->GetBounds().origin(),
729 panel::APPLY_TO_ALL
);
730 test_panel2
->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL
);
731 EXPECT_TRUE(panel1
->IsMinimized());
732 EXPECT_FALSE(panel2
->IsMinimized());
733 EXPECT_FALSE(panel3
->IsMinimized());
735 // Minimize another panel. Then click on a minimized panel with apply-all
736 // modifier to restore all panels.
738 EXPECT_TRUE(panel1
->IsMinimized());
739 EXPECT_TRUE(panel2
->IsMinimized());
740 EXPECT_FALSE(panel3
->IsMinimized());
742 test_panel2
->PressLeftMouseButtonTitlebar(panel2
->GetBounds().origin(),
743 panel::APPLY_TO_ALL
);
744 test_panel2
->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL
);
745 EXPECT_FALSE(panel1
->IsMinimized());
746 EXPECT_FALSE(panel2
->IsMinimized());
747 EXPECT_FALSE(panel3
->IsMinimized());
749 // Click on the single minimized panel. Verify all are restored.
751 EXPECT_TRUE(panel1
->IsMinimized());
752 EXPECT_FALSE(panel2
->IsMinimized());
753 EXPECT_FALSE(panel3
->IsMinimized());
755 test_panel1
->PressLeftMouseButtonTitlebar(panel1
->GetBounds().origin(),
756 panel::APPLY_TO_ALL
);
757 test_panel1
->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL
);
758 EXPECT_FALSE(panel1
->IsMinimized());
759 EXPECT_FALSE(panel2
->IsMinimized());
760 EXPECT_FALSE(panel3
->IsMinimized());
762 // Click on the single expanded panel. Verify nothing changes.
765 EXPECT_TRUE(panel1
->IsMinimized());
766 EXPECT_FALSE(panel2
->IsMinimized());
767 EXPECT_TRUE(panel3
->IsMinimized());
769 test_panel2
->PressLeftMouseButtonTitlebar(panel2
->GetBounds().origin(),
770 panel::APPLY_TO_ALL
);
771 test_panel2
->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL
);
772 EXPECT_TRUE(panel1
->IsMinimized());
773 EXPECT_FALSE(panel2
->IsMinimized());
774 EXPECT_TRUE(panel3
->IsMinimized());
776 // Hover over a minimized panel and click on the titlebar while it is in
777 // title-only mode. Should restore all panels.
779 EXPECT_TRUE(panel1
->IsMinimized());
780 EXPECT_TRUE(panel2
->IsMinimized());
781 EXPECT_TRUE(panel3
->IsMinimized());
783 MoveMouseAndWaitForExpansionStateChange(panel2
, panel2
->GetBounds().origin());
784 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
785 EXPECT_EQ(Panel::TITLE_ONLY
, panel2
->expansion_state());
786 EXPECT_EQ(Panel::TITLE_ONLY
, panel3
->expansion_state());
788 test_panel3
->PressLeftMouseButtonTitlebar(panel3
->GetBounds().origin(),
789 panel::APPLY_TO_ALL
);
790 test_panel3
->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL
);
791 EXPECT_FALSE(panel1
->IsMinimized());
792 EXPECT_FALSE(panel2
->IsMinimized());
793 EXPECT_FALSE(panel3
->IsMinimized());
795 // Draw attention to a minimized panel. Click on a minimized panel that is
796 // not drawing attention. Verify restore all applies without affecting
801 EXPECT_TRUE(panel1
->IsMinimized());
802 EXPECT_TRUE(panel2
->IsMinimized());
803 EXPECT_TRUE(panel3
->IsMinimized());
805 panel1
->FlashFrame(true);
806 EXPECT_TRUE(panel1
->IsDrawingAttention());
808 test_panel2
->PressLeftMouseButtonTitlebar(panel2
->GetBounds().origin(),
809 panel::APPLY_TO_ALL
);
810 test_panel2
->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL
);
811 EXPECT_FALSE(panel1
->IsMinimized());
812 EXPECT_FALSE(panel2
->IsMinimized());
813 EXPECT_FALSE(panel3
->IsMinimized());
814 EXPECT_TRUE(panel1
->IsDrawingAttention());
816 // Restore all panels by clicking on the minimized panel that is drawing
817 // attention. Verify restore all applies and clears draw attention.
821 EXPECT_TRUE(panel1
->IsMinimized());
822 EXPECT_TRUE(panel2
->IsMinimized());
823 EXPECT_TRUE(panel3
->IsMinimized());
825 test_panel1
->PressLeftMouseButtonTitlebar(panel1
->GetBounds().origin(),
826 panel::APPLY_TO_ALL
);
827 test_panel1
->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL
);
828 EXPECT_FALSE(panel1
->IsMinimized());
829 EXPECT_FALSE(panel2
->IsMinimized());
830 EXPECT_FALSE(panel3
->IsMinimized());
831 EXPECT_FALSE(panel1
->IsDrawingAttention());
833 PanelManager::GetInstance()->CloseAll();
836 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
,
837 MinimizeRestoreOnAutoHidingDesktopBar
) {
838 PanelManager
* panel_manager
= PanelManager::GetInstance();
839 DockedPanelCollection
* docked_collection
= panel_manager
->docked_collection();
840 int expected_bottom_on_expanded
= docked_collection
->work_area().bottom();
841 int expected_bottom_on_title_only
= expected_bottom_on_expanded
;
842 int expected_bottom_on_minimized
= expected_bottom_on_expanded
;
844 // Turn on auto-hiding.
845 static const int bottom_bar_thickness
= 40;
846 mock_display_settings_provider()->EnableAutoHidingDesktopBar(
847 DisplaySettingsProvider::DESKTOP_BAR_ALIGNED_BOTTOM
,
849 bottom_bar_thickness
);
850 expected_bottom_on_title_only
-= bottom_bar_thickness
;
852 Panel
* panel
= CreatePanel("1");
853 int initial_height
= panel
->GetBounds().height();
855 EXPECT_EQ(Panel::EXPANDED
, panel
->expansion_state());
856 EXPECT_EQ(expected_bottom_on_expanded
, panel
->GetBounds().bottom());
859 WaitForBoundsAnimationFinished(panel
);
860 EXPECT_EQ(Panel::MINIMIZED
, panel
->expansion_state());
861 EXPECT_EQ(panel::kMinimizedPanelHeight
, panel
->GetBounds().height());
862 EXPECT_EQ(expected_bottom_on_minimized
, panel
->GetBounds().bottom());
864 panel
->SetExpansionState(Panel::TITLE_ONLY
);
865 WaitForBoundsAnimationFinished(panel
);
866 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
867 EXPECT_EQ(panel::kTitlebarHeight
, panel
->GetBounds().height());
868 EXPECT_EQ(expected_bottom_on_title_only
, panel
->GetBounds().bottom());
871 WaitForBoundsAnimationFinished(panel
);
872 EXPECT_EQ(Panel::EXPANDED
, panel
->expansion_state());
873 EXPECT_EQ(initial_height
, panel
->GetBounds().height());
874 EXPECT_EQ(expected_bottom_on_expanded
, panel
->GetBounds().bottom());
879 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, ChangeAutoHideTaskBarThickness
) {
880 PanelManager
* manager
= PanelManager::GetInstance();
881 DockedPanelCollection
* docked_collection
= manager
->docked_collection();
882 int initial_starting_right_position
=
883 docked_collection
->StartingRightPosition();
885 int bottom_bar_thickness
= 20;
886 int right_bar_thickness
= 30;
887 mock_display_settings_provider()->EnableAutoHidingDesktopBar(
888 DisplaySettingsProvider::DESKTOP_BAR_ALIGNED_BOTTOM
,
890 bottom_bar_thickness
);
891 mock_display_settings_provider()->EnableAutoHidingDesktopBar(
892 DisplaySettingsProvider::DESKTOP_BAR_ALIGNED_RIGHT
,
894 right_bar_thickness
);
895 EXPECT_EQ(initial_starting_right_position
,
896 docked_collection
->StartingRightPosition());
898 Panel
* panel
= CreatePanel("PanelTest");
899 panel
->SetExpansionState(Panel::TITLE_ONLY
);
900 WaitForBoundsAnimationFinished(panel
);
902 EXPECT_EQ(docked_collection
->work_area().bottom() - bottom_bar_thickness
,
903 panel
->GetBounds().bottom());
904 EXPECT_EQ(docked_collection
->StartingRightPosition(),
905 panel
->GetBounds().right());
907 initial_starting_right_position
= docked_collection
->StartingRightPosition();
908 int bottom_bar_thickness_delta
= 10;
909 bottom_bar_thickness
+= bottom_bar_thickness_delta
;
910 int right_bar_thickness_delta
= 15;
911 right_bar_thickness
+= right_bar_thickness_delta
;
912 mock_display_settings_provider()->SetDesktopBarThickness(
913 DisplaySettingsProvider::DESKTOP_BAR_ALIGNED_BOTTOM
,
914 bottom_bar_thickness
);
915 mock_display_settings_provider()->SetDesktopBarThickness(
916 DisplaySettingsProvider::DESKTOP_BAR_ALIGNED_RIGHT
,
917 right_bar_thickness
);
918 base::MessageLoopForUI::current()->RunUntilIdle();
919 EXPECT_EQ(initial_starting_right_position
,
920 docked_collection
->StartingRightPosition());
921 EXPECT_EQ(docked_collection
->work_area().bottom() - bottom_bar_thickness
,
922 panel
->GetBounds().bottom());
923 EXPECT_EQ(docked_collection
->StartingRightPosition(),
924 panel
->GetBounds().right());
926 initial_starting_right_position
= docked_collection
->StartingRightPosition();
927 bottom_bar_thickness_delta
= 20;
928 bottom_bar_thickness
-= bottom_bar_thickness_delta
;
929 right_bar_thickness_delta
= 10;
930 right_bar_thickness
-= right_bar_thickness_delta
;
931 mock_display_settings_provider()->SetDesktopBarThickness(
932 DisplaySettingsProvider::DESKTOP_BAR_ALIGNED_BOTTOM
,
933 bottom_bar_thickness
);
934 mock_display_settings_provider()->SetDesktopBarThickness(
935 DisplaySettingsProvider::DESKTOP_BAR_ALIGNED_RIGHT
,
936 right_bar_thickness
);
937 base::MessageLoopForUI::current()->RunUntilIdle();
938 EXPECT_EQ(docked_collection
->StartingRightPosition(),
939 initial_starting_right_position
);
940 EXPECT_EQ(docked_collection
->work_area().bottom() - bottom_bar_thickness
,
941 panel
->GetBounds().bottom());
942 EXPECT_EQ(docked_collection
->StartingRightPosition(),
943 panel
->GetBounds().right());
948 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, ActivatePanelOrTabbedWindow
) {
949 if (!WmSupportWindowActivation()) {
950 LOG(WARNING
) << "Skipping test due to WM problems.";
954 Panel
* panel1
= CreatePanel("Panel1");
955 Panel
* panel2
= CreatePanel("Panel2");
957 // Activate main tabbed window.
958 browser()->window()->Activate();
959 WaitForPanelActiveState(panel2
, SHOW_AS_INACTIVE
);
963 WaitForPanelActiveState(panel2
, SHOW_AS_ACTIVE
);
965 // Activate the main tabbed window back.
966 browser()->window()->Activate();
967 WaitForPanelActiveState(panel2
, SHOW_AS_INACTIVE
);
969 // Activate another panel.
971 WaitForPanelActiveState(panel1
, SHOW_AS_ACTIVE
);
972 WaitForPanelActiveState(panel2
, SHOW_AS_INACTIVE
);
974 // Switch focus between panels.
976 WaitForPanelActiveState(panel2
, SHOW_AS_ACTIVE
);
977 WaitForPanelActiveState(panel1
, SHOW_AS_INACTIVE
);
979 PanelManager::GetInstance()->CloseAll();
982 // TODO(jianli): To be enabled for other platforms.
983 #if defined(OS_WIN) || defined(OS_LINUX)
984 #define MAYBE_ActivateDeactivateBasic ActivateDeactivateBasic
986 #define MAYBE_ActivateDeactivateBasic DISABLED_ActivateDeactivateBasic
988 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, MAYBE_ActivateDeactivateBasic
) {
989 if (!WmSupportWindowActivation()) {
990 LOG(WARNING
) << "Skipping test due to WM problems.";
994 // Create an active panel.
995 Panel
* panel
= CreatePanel("PanelTest");
996 scoped_ptr
<NativePanelTesting
> native_panel_testing(
997 CreateNativePanelTesting(panel
));
999 WaitForPanelActiveState(panel
, SHOW_AS_ACTIVE
); // doublecheck active state
1000 EXPECT_TRUE(native_panel_testing
->VerifyActiveState(true));
1002 // Deactivate the panel.
1003 panel
->Deactivate();
1004 WaitForPanelActiveState(panel
, SHOW_AS_INACTIVE
);
1006 // On GTK there is no way to deactivate a window. So the Deactivate() call
1007 // above does not actually deactivate the window, but simply lowers it.
1008 #if !defined(OS_LINUX)
1009 EXPECT_TRUE(native_panel_testing
->VerifyActiveState(false));
1012 // This test does not reactivate the panel because the panel might not be
1013 // reactivated programmatically once it is deactivated.
1016 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, ActivateDeactivateMultiple
) {
1017 if (!WmSupportWindowActivation()) {
1018 LOG(WARNING
) << "Skipping test due to WM problems.";
1022 BrowserWindow
* tabbed_window
= browser()->window();
1024 // Create 4 panels in the following screen layout:
1026 const int kNumPanels
= 4;
1027 for (int i
= 0; i
< kNumPanels
; ++i
)
1028 CreatePanelWithBounds(MakePanelName(i
), gfx::Rect(0, 0, 100, 100));
1029 const std::vector
<Panel
*>& panels
= PanelManager::GetInstance()->panels();
1031 std::vector
<bool> expected_active_states
;
1032 std::vector
<bool> last_active_states
;
1034 // The last created panel, P3, should be active.
1035 expected_active_states
= ProduceExpectedActiveStates(3);
1036 EXPECT_EQ(expected_active_states
, GetAllPanelActiveStates());
1037 EXPECT_FALSE(tabbed_window
->IsActive());
1039 // Activating P1 should cause P3 to lose focus.
1040 panels
[1]->Activate();
1041 last_active_states
= expected_active_states
;
1042 expected_active_states
= ProduceExpectedActiveStates(1);
1043 WaitForPanelActiveStates(last_active_states
, expected_active_states
);
1044 EXPECT_EQ(expected_active_states
, GetAllPanelActiveStates());
1046 // Minimizing inactive panel P2 should not affect other panels' active states.
1047 panels
[2]->SetExpansionState(Panel::MINIMIZED
);
1048 EXPECT_EQ(expected_active_states
, GetAllPanelActiveStates());
1049 EXPECT_FALSE(tabbed_window
->IsActive());
1052 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, DrawAttentionBasic
) {
1053 Panel
* panel
= CreateInactivePanel("P1");
1054 scoped_ptr
<NativePanelTesting
> native_panel_testing(
1055 CreateNativePanelTesting(panel
));
1057 // Test that the attention is drawn when the expanded panel is not in focus.
1058 EXPECT_EQ(Panel::EXPANDED
, panel
->expansion_state());
1059 EXPECT_FALSE(panel
->IsActive());
1060 EXPECT_FALSE(panel
->IsDrawingAttention());
1061 panel
->FlashFrame(true);
1062 EXPECT_TRUE(panel
->IsDrawingAttention());
1063 EXPECT_TRUE(native_panel_testing
->VerifyDrawingAttention());
1065 // Stop drawing attention.
1066 panel
->FlashFrame(false);
1067 EXPECT_FALSE(panel
->IsDrawingAttention());
1068 EXPECT_FALSE(native_panel_testing
->VerifyDrawingAttention());
1070 // Draw attention, then minimize. Titlebar should remain visible.
1071 panel
->FlashFrame(true);
1072 EXPECT_TRUE(panel
->IsDrawingAttention());
1075 EXPECT_TRUE(panel
->IsDrawingAttention());
1076 EXPECT_EQ(Panel::TITLE_ONLY
, panel
->expansion_state());
1078 // Stop drawing attention. Titlebar should no longer be visible.
1079 panel
->FlashFrame(false);
1080 EXPECT_FALSE(panel
->IsDrawingAttention());
1081 EXPECT_EQ(Panel::MINIMIZED
, panel
->expansion_state());
1086 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, DrawAttentionWhileMinimized
) {
1087 Panel
* panel1
= CreateInactivePanel("P1");
1088 Panel
* panel2
= CreateInactivePanel("P2");
1090 scoped_ptr
<NativePanelTesting
> native_panel1_testing(
1091 CreateNativePanelTesting(panel1
));
1093 // Test that the attention is drawn and the title-bar is brought up when the
1094 // minimized panel is drawing attention.
1096 EXPECT_EQ(Panel::MINIMIZED
, panel1
->expansion_state());
1097 panel1
->FlashFrame(true);
1098 EXPECT_TRUE(panel1
->IsDrawingAttention());
1099 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
1100 EXPECT_TRUE(native_panel1_testing
->VerifyDrawingAttention());
1102 // Test that we cannot bring up other minimized panel if the mouse is over
1103 // the panel that draws attension.
1105 gfx::Point
hover_point(panel1
->GetBounds().origin());
1106 MoveMouse(hover_point
);
1107 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
1108 EXPECT_EQ(Panel::MINIMIZED
, panel2
->expansion_state());
1110 // Test that we cannot bring down the panel that is drawing the attention.
1111 hover_point
.set_y(hover_point
.y() - 200);
1112 MoveMouse(hover_point
);
1113 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
1115 // Test that the attention is cleared when activated.
1117 WaitForPanelActiveState(panel1
, SHOW_AS_ACTIVE
);
1118 EXPECT_FALSE(panel1
->IsDrawingAttention());
1119 EXPECT_EQ(Panel::EXPANDED
, panel1
->expansion_state());
1120 EXPECT_FALSE(native_panel1_testing
->VerifyDrawingAttention());
1122 PanelManager::GetInstance()->CloseAll();
1125 // Verify that minimized state of a panel is correct after draw attention
1126 // is stopped when there are other minimized panels.
1127 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, StopDrawingAttentionWhileMinimized
) {
1128 Panel
* panel1
= CreateInactivePanel("P1");
1129 Panel
* panel2
= CreateInactivePanel("P2");
1132 EXPECT_EQ(Panel::MINIMIZED
, panel1
->expansion_state());
1134 EXPECT_EQ(Panel::MINIMIZED
, panel2
->expansion_state());
1136 // Verify panel returns to minimized state when no longer drawing attention.
1137 panel1
->FlashFrame(true);
1138 EXPECT_TRUE(panel1
->IsDrawingAttention());
1139 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
1141 panel1
->FlashFrame(false);
1142 EXPECT_FALSE(panel1
->IsDrawingAttention());
1143 EXPECT_EQ(Panel::MINIMIZED
, panel1
->expansion_state());
1145 // Hover over other minimized panel to bring up titlebars.
1146 gfx::Point
hover_point(panel2
->GetBounds().origin());
1147 MoveMouseAndWaitForExpansionStateChange(panel1
, hover_point
);
1148 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
1149 EXPECT_EQ(Panel::TITLE_ONLY
, panel2
->expansion_state());
1151 // Verify panel keeps titlebar visible when no longer drawing attention
1152 // if titlebars are up.
1153 panel1
->FlashFrame(true);
1154 EXPECT_TRUE(panel1
->IsDrawingAttention());
1155 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
1157 panel1
->FlashFrame(false);
1158 EXPECT_FALSE(panel1
->IsDrawingAttention());
1159 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
1161 // Move mouse away. All panels should return to minimized state.
1162 hover_point
.set_y(hover_point
.y() - 200);
1163 MoveMouseAndWaitForExpansionStateChange(panel1
, hover_point
);
1164 EXPECT_EQ(Panel::MINIMIZED
, panel1
->expansion_state());
1165 EXPECT_EQ(Panel::MINIMIZED
, panel2
->expansion_state());
1167 // Verify minimized panel that is drawing attention stays in title-only mode
1168 // after attention is cleared if mouse is in the titlebar area.
1169 panel1
->FlashFrame(true);
1170 EXPECT_TRUE(panel1
->IsDrawingAttention());
1171 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
1173 gfx::Point
hover_point_in_panel(panel1
->GetBounds().origin());
1174 MoveMouse(hover_point_in_panel
);
1176 panel1
->FlashFrame(false);
1177 EXPECT_FALSE(panel1
->IsDrawingAttention());
1178 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
1179 EXPECT_EQ(Panel::MINIMIZED
, panel2
->expansion_state());
1181 // Typical user scenario will detect the mouse in the panel
1182 // after attention is cleared, causing titles to pop up, so
1183 // we simulate that here.
1184 MoveMouseAndWaitForExpansionStateChange(panel2
, hover_point_in_panel
);
1185 EXPECT_EQ(Panel::TITLE_ONLY
, panel1
->expansion_state());
1186 EXPECT_EQ(Panel::TITLE_ONLY
, panel2
->expansion_state());
1188 // Move mouse away and panels should go back to fully minimized state.
1189 MoveMouseAndWaitForExpansionStateChange(panel1
, hover_point
);
1190 EXPECT_EQ(Panel::MINIMIZED
, panel1
->expansion_state());
1191 EXPECT_EQ(Panel::MINIMIZED
, panel2
->expansion_state());
1193 PanelManager::GetInstance()->CloseAll();
1196 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, DrawAttentionWhenActive
) {
1197 // Create an active panel.
1198 Panel
* panel
= CreatePanel("P1");
1199 scoped_ptr
<NativePanelTesting
> native_panel_testing(
1200 CreateNativePanelTesting(panel
));
1202 // Test that the attention should not be drawn if the expanded panel is in
1204 panel
->FlashFrame(true);
1205 EXPECT_FALSE(panel
->IsDrawingAttention());
1206 EXPECT_FALSE(native_panel_testing
->VerifyDrawingAttention());
1211 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, DrawAttentionResetOnActivate
) {
1212 Panel
* panel
= CreateInactivePanel("P1");
1213 scoped_ptr
<NativePanelTesting
> native_panel_testing(
1214 CreateNativePanelTesting(panel
));
1216 panel
->FlashFrame(true);
1217 EXPECT_TRUE(panel
->IsDrawingAttention());
1218 EXPECT_TRUE(native_panel_testing
->VerifyDrawingAttention());
1220 // Test that the attention is cleared when panel gets focus.
1222 WaitForPanelActiveState(panel
, SHOW_AS_ACTIVE
);
1223 EXPECT_FALSE(panel
->IsDrawingAttention());
1224 EXPECT_FALSE(native_panel_testing
->VerifyDrawingAttention());
1229 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
,
1230 DrawAttentionMinimizedNotResetOnActivate
) {
1231 Panel
* panel
= CreateInactivePanel("P1");
1234 EXPECT_TRUE(panel
->IsMinimized());
1235 panel
->FlashFrame(true);
1236 EXPECT_TRUE(panel
->IsDrawingAttention());
1238 // Simulate panel being activated while minimized. Cannot call
1239 // Activate() as that expands the panel.
1240 panel
->OnActiveStateChanged(true);
1241 EXPECT_TRUE(panel
->IsDrawingAttention()); // Unchanged.
1243 // Unminimize panel to show that attention would have been cleared
1244 // if panel had not been minimized.
1246 EXPECT_FALSE(panel
->IsMinimized());
1247 EXPECT_TRUE(panel
->IsDrawingAttention()); // Unchanged.
1249 panel
->OnActiveStateChanged(true);
1250 EXPECT_FALSE(panel
->IsDrawingAttention()); // Attention cleared.
1255 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, DrawAttentionResetOnClick
) {
1256 Panel
* panel
= CreateInactivePanel("P1");
1257 scoped_ptr
<NativePanelTesting
> native_panel_testing(
1258 CreateNativePanelTesting(panel
));
1260 panel
->FlashFrame(true);
1261 EXPECT_TRUE(panel
->IsDrawingAttention());
1262 EXPECT_TRUE(native_panel_testing
->VerifyDrawingAttention());
1264 // Test that the attention is cleared when panel gets focus.
1265 native_panel_testing
->PressLeftMouseButtonTitlebar(
1266 panel
->GetBounds().origin());
1267 native_panel_testing
->ReleaseMouseButtonTitlebar();
1269 WaitForPanelActiveState(panel
, SHOW_AS_ACTIVE
);
1270 EXPECT_FALSE(panel
->IsDrawingAttention());
1271 EXPECT_FALSE(native_panel_testing
->VerifyDrawingAttention());
1276 // http://crbug.com/175760; several panel tests failing regularly on mac.
1277 #if defined(OS_MACOSX)
1278 #define MAYBE_MinimizeImmediatelyAfterRestore \
1279 DISABLED_MinimizeImmediatelyAfterRestore
1281 #define MAYBE_MinimizeImmediatelyAfterRestore MinimizeImmediatelyAfterRestore
1283 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
,
1284 MAYBE_MinimizeImmediatelyAfterRestore
) {
1285 CreatePanelParams
params("Panel Test", gfx::Rect(), SHOW_AS_ACTIVE
);
1286 Panel
* panel
= CreatePanelWithParams(params
);
1287 scoped_ptr
<NativePanelTesting
> native_panel_testing(
1288 CreateNativePanelTesting(panel
));
1290 PanelActiveStateObserver
signal(panel
, false);
1291 panel
->Minimize(); // this should deactivate.
1293 EXPECT_EQ(Panel::MINIMIZED
, panel
->expansion_state());
1296 EXPECT_EQ(Panel::EXPANDED
, panel
->expansion_state());
1298 // Verify that minimizing a panel right after expansion works.
1300 EXPECT_EQ(Panel::MINIMIZED
, panel
->expansion_state());
1305 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, FocusLostOnMinimize
) {
1306 CreatePanelParams
params("Initially Active", gfx::Rect(), SHOW_AS_ACTIVE
);
1307 Panel
* panel
= CreatePanelWithParams(params
);
1308 EXPECT_EQ(Panel::EXPANDED
, panel
->expansion_state());
1310 PanelActiveStateObserver
signal(panel
, false);
1316 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, CreateInactiveSwitchToActive
) {
1317 Panel
* panel
= CreateInactivePanel("1");
1320 WaitForPanelActiveState(panel
, SHOW_AS_ACTIVE
);
1325 // TODO(dimich): try/enable on other platforms. See bug 103253 for details on
1326 // why this is disabled on windows.
1327 #if defined(OS_MACOSX)
1328 #define MAYBE_MinimizeTwoPanelsWithoutTabbedWindow \
1329 MinimizeTwoPanelsWithoutTabbedWindow
1331 #define MAYBE_MinimizeTwoPanelsWithoutTabbedWindow \
1332 DISABLED_MinimizeTwoPanelsWithoutTabbedWindow
1335 // When there are 2 panels and no chrome window, minimizing one panel does
1336 // not expand/focuses another.
1337 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
,
1338 MAYBE_MinimizeTwoPanelsWithoutTabbedWindow
) {
1339 CreatePanelParams
params("Initially Inactive", gfx::Rect(), SHOW_AS_INACTIVE
);
1340 Panel
* panel1
= CreatePanelWithParams(params
);
1341 Panel
* panel2
= CreatePanelWithParams(params
);
1343 // Close main tabbed window.
1344 content::WindowedNotificationObserver
signal(
1345 chrome::NOTIFICATION_BROWSER_CLOSED
,
1346 content::Source
<Browser
>(browser()));
1347 chrome::CloseWindow(browser());
1350 EXPECT_EQ(Panel::EXPANDED
, panel1
->expansion_state());
1351 EXPECT_EQ(Panel::EXPANDED
, panel2
->expansion_state());
1353 WaitForPanelActiveState(panel1
, SHOW_AS_ACTIVE
);
1355 panel1
->SetExpansionState(Panel::MINIMIZED
);
1356 base::MessageLoop::current()->RunUntilIdle();
1357 WaitForPanelActiveState(panel1
, SHOW_AS_INACTIVE
);
1358 EXPECT_EQ(Panel::MINIMIZED
, panel1
->expansion_state());
1360 panel2
->SetExpansionState(Panel::MINIMIZED
);
1361 base::MessageLoop::current()->RunUntilIdle();
1362 WaitForPanelActiveState(panel2
, SHOW_AS_INACTIVE
);
1363 EXPECT_EQ(Panel::MINIMIZED
, panel2
->expansion_state());
1365 // Verify that panel1 is still minimized and not active.
1366 WaitForPanelActiveState(panel1
, SHOW_AS_INACTIVE
);
1367 EXPECT_EQ(Panel::MINIMIZED
, panel1
->expansion_state());
1369 // Another check for the same.
1370 EXPECT_FALSE(panel1
->IsActive());
1371 EXPECT_FALSE(panel2
->IsActive());
1377 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
,
1378 NonExtensionDomainPanelsCloseOnUninstall
) {
1379 // Create a test extension.
1380 base::DictionaryValue empty_value
;
1381 scoped_refptr
<extensions::Extension
> extension
=
1382 CreateExtension(FILE_PATH_LITERAL("TestExtension"),
1383 extensions::Manifest::INTERNAL
, empty_value
);
1384 std::string extension_app_name
=
1385 web_app::GenerateApplicationNameFromExtensionId(extension
->id());
1387 PanelManager
* panel_manager
= PanelManager::GetInstance();
1388 EXPECT_EQ(0, panel_manager
->num_panels());
1390 // Create a panel with the extension as host.
1391 CreatePanelParams
params(extension_app_name
, gfx::Rect(), SHOW_AS_ACTIVE
);
1392 std::string
extension_domain_url(extensions::kExtensionScheme
);
1393 extension_domain_url
+= "://";
1394 extension_domain_url
+= extension
->id();
1395 extension_domain_url
+= "/hello.html";
1396 params
.url
= GURL(extension_domain_url
);
1397 Panel
* panel
= CreatePanelWithParams(params
);
1398 EXPECT_EQ(1, panel_manager
->num_panels());
1400 // Create a panel with a non-extension host.
1401 CreatePanelParams
params1(extension_app_name
, gfx::Rect(), SHOW_AS_ACTIVE
);
1402 params1
.url
= GURL(url::kAboutBlankURL
);
1403 Panel
* panel1
= CreatePanelWithParams(params1
);
1404 EXPECT_EQ(2, panel_manager
->num_panels());
1406 // Create another extension and a panel from that extension.
1407 scoped_refptr
<extensions::Extension
> extension_other
=
1408 CreateExtension(FILE_PATH_LITERAL("TestExtensionOther"),
1409 extensions::Manifest::INTERNAL
, empty_value
);
1410 std::string extension_app_name_other
=
1411 web_app::GenerateApplicationNameFromExtensionId(extension_other
->id());
1412 Panel
* panel_other
= CreatePanel(extension_app_name_other
);
1414 content::WindowedNotificationObserver
signal(
1415 chrome::NOTIFICATION_PANEL_CLOSED
,
1416 content::Source
<Panel
>(panel
));
1417 content::WindowedNotificationObserver
signal1(
1418 chrome::NOTIFICATION_PANEL_CLOSED
,
1419 content::Source
<Panel
>(panel1
));
1421 // Send unload notification on the first extension.
1422 extensions::ExtensionRegistry
* registry
=
1423 extensions::ExtensionRegistry::Get(browser()->profile());
1424 registry
->RemoveEnabled(extension
->id());
1425 registry
->TriggerOnUnloaded(
1426 extension
.get(), extensions::UnloadedExtensionInfo::REASON_UNINSTALL
);
1428 // Wait for the panels opened by the first extension to close.
1432 // Verify that the panel that's left is the panel from the second extension.
1433 EXPECT_EQ(panel_other
, panel_manager
->panels()[0]);
1434 panel_other
->Close();
1437 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, OnBeforeUnloadOnClose
) {
1438 PanelManager
* panel_manager
= PanelManager::GetInstance();
1439 EXPECT_EQ(0, panel_manager
->num_panels()); // No panels initially.
1441 const base::string16 title_first_close
= base::UTF8ToUTF16("TitleFirstClose");
1442 const base::string16 title_second_close
=
1443 base::UTF8ToUTF16("TitleSecondClose");
1445 // Create a test panel with web contents loaded.
1446 CreatePanelParams
params("PanelTest1", gfx::Rect(0, 0, 300, 300),
1448 params
.url
= ui_test_utils::GetTestUrl(
1449 base::FilePath(kTestDir
),
1450 base::FilePath(FILE_PATH_LITERAL("onbeforeunload.html")));
1451 Panel
* panel
= CreatePanelWithParams(params
);
1452 EXPECT_EQ(1, panel_manager
->num_panels());
1454 // Close panel and verify it closes despite having a onbeforeunload handler.
1455 CloseWindowAndWait(panel
);
1456 EXPECT_EQ(0, panel_manager
->num_panels());
1459 // http://crbug.com/175760; several panel tests failing regularly on mac.
1460 #if defined(OS_MACOSX)
1461 #define MAYBE_SizeClamping DISABLED_SizeClamping
1463 #define MAYBE_SizeClamping SizeClamping
1465 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, MAYBE_SizeClamping
) {
1466 // Using '0' sizes is equivalent of not providing sizes in API and causes
1467 // minimum sizes to be applied to facilitate auto-sizing.
1468 CreatePanelParams
params("Panel", gfx::Rect(), SHOW_AS_ACTIVE
);
1469 Panel
* panel
= CreatePanelWithParams(params
);
1470 EXPECT_EQ(panel
->min_size().width(), panel
->GetBounds().width());
1471 EXPECT_EQ(panel
->min_size().height(), panel
->GetBounds().height());
1472 int reasonable_width
= panel
->min_size().width() + 10;
1473 int reasonable_height
= panel
->min_size().height() + 20;
1477 // Using reasonable actual sizes should avoid clamping.
1478 CreatePanelParams
params1("Panel1",
1480 reasonable_width
, reasonable_height
),
1482 panel
= CreatePanelWithParams(params1
);
1483 EXPECT_EQ(reasonable_width
, panel
->GetBounds().width());
1484 EXPECT_EQ(reasonable_height
, panel
->GetBounds().height());
1487 // Using just one size should auto-compute some reasonable other size.
1488 int given_height
= 200;
1489 CreatePanelParams
params2("Panel2", gfx::Rect(0, 0, 0, given_height
),
1491 panel
= CreatePanelWithParams(params2
);
1492 EXPECT_GT(panel
->GetBounds().width(), 0);
1493 EXPECT_EQ(given_height
, panel
->GetBounds().height());
1497 // http://crbug.com/175760; several panel tests failing regularly on mac.
1498 // http://crbug.com/179890; TightAutosizeAroundSingleLine broken on Windows by
1499 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
,
1500 DISABLED_TightAutosizeAroundSingleLine
) {
1501 PanelManager::GetInstance()->enable_auto_sizing(true);
1502 // Using 0 sizes triggers auto-sizing.
1503 CreatePanelParams
params("Panel", gfx::Rect(), SHOW_AS_ACTIVE
);
1504 params
.url
= GURL("data:text/html;charset=utf-8,<!doctype html><body>");
1505 Panel
* panel
= CreatePanelWithParams(params
);
1507 // Ensure panel has auto resized to original web content size.
1508 WaitForStableInitialSize
initial_resize(panel
);
1509 initial_resize
.Wait();
1511 int initial_width
= panel
->GetBounds().width();
1512 int initial_height
= panel
->GetBounds().height();
1514 // Inject some HTML content into the panel.
1515 WaitForAutoResizeWider
enlarge(panel
);
1516 EXPECT_TRUE(content::ExecuteScript(
1517 panel
->GetWebContents(),
1518 "document.body.innerHTML ="
1519 " '<nobr>line of text and a <button>Button</button>';"));
1522 // The panel should have become larger in both dimensions (the minimums
1523 // has to be set to be smaller then a simple 1-line content, so the autosize
1524 // can work correctly.
1525 EXPECT_GT(panel
->GetBounds().width(), initial_width
);
1526 EXPECT_GT(panel
->GetBounds().height(), initial_height
);
1531 // http://crbug.com/175760; several panel tests failing regularly on mac.
1532 #if defined(OS_MACOSX)
1533 #define MAYBE_DefaultMaxSizeOnDisplaySettingsChange \
1534 DISABLED_DefaultMaxSizeOnDisplaySettingsChange
1536 #define MAYBE_DefaultMaxSizeOnDisplaySettingsChange \
1537 DefaultMaxSizeOnDisplaySettingsChange
1539 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
,
1540 MAYBE_DefaultMaxSizeOnDisplaySettingsChange
) {
1541 Panel
* panel
= CreatePanelWithBounds("1", gfx::Rect(0, 0, 240, 220));
1543 gfx::Size old_max_size
= panel
->max_size();
1544 gfx::Size old_full_size
= panel
->full_size();
1546 // Shrink the work area. Expect max size and full size become smaller.
1547 gfx::Rect
smaller_work_area(0, 0, 500, 300);
1548 mock_display_settings_provider()->SetPrimaryDisplay(
1549 smaller_work_area
, smaller_work_area
);
1550 EXPECT_GT(old_max_size
.width(), panel
->max_size().width());
1551 EXPECT_GT(old_max_size
.height(), panel
->max_size().height());
1552 EXPECT_GT(smaller_work_area
.width(), panel
->max_size().width());
1553 EXPECT_GT(smaller_work_area
.height(), panel
->max_size().height());
1554 EXPECT_GT(old_full_size
.width(), panel
->full_size().width());
1555 EXPECT_GT(old_full_size
.height(), panel
->full_size().height());
1556 EXPECT_GE(panel
->max_size().width(), panel
->full_size().width());
1557 EXPECT_GE(panel
->max_size().height(), panel
->full_size().height());
1562 // http://crbug.com/175760; several panel tests failing regularly on mac.
1563 #if defined(OS_MACOSX)
1564 #define MAYBE_CustomMaxSizeOnDisplaySettingsChange \
1565 DISABLED_CustomMaxSizeOnDisplaySettingsChange
1567 #define MAYBE_CustomMaxSizeOnDisplaySettingsChange \
1568 CustomMaxSizeOnDisplaySettingsChange
1570 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
,
1571 MAYBE_CustomMaxSizeOnDisplaySettingsChange
) {
1572 PanelManager
* panel_manager
= PanelManager::GetInstance();
1573 Panel
* panel
= CreatePanelWithBounds("1", gfx::Rect(0, 0, 240, 220));
1575 // Trigger custom max size by user resizing.
1576 gfx::Size bigger_size
= gfx::Size(550, 400);
1577 gfx::Point mouse_location
= panel
->GetBounds().origin();
1578 panel_manager
->StartResizingByMouse(panel
,
1581 mouse_location
.Offset(panel
->GetBounds().width() - bigger_size
.width(),
1582 panel
->GetBounds().height() - bigger_size
.height());
1583 panel_manager
->ResizeByMouse(mouse_location
);
1584 panel_manager
->EndResizingByMouse(false);
1586 gfx::Size old_max_size
= panel
->max_size();
1587 EXPECT_EQ(bigger_size
, old_max_size
);
1588 gfx::Size old_full_size
= panel
->full_size();
1589 EXPECT_EQ(bigger_size
, old_full_size
);
1591 // Shrink the work area. Expect max size and full size become smaller.
1592 gfx::Rect
smaller_work_area(0, 0, 500, 300);
1593 mock_display_settings_provider()->SetPrimaryDisplay(
1594 smaller_work_area
, smaller_work_area
);
1595 EXPECT_GT(old_max_size
.width(), panel
->max_size().width());
1596 EXPECT_GT(old_max_size
.height(), panel
->max_size().height());
1597 EXPECT_GE(smaller_work_area
.width(), panel
->max_size().width());
1598 EXPECT_EQ(smaller_work_area
.height(), panel
->max_size().height());
1599 EXPECT_GT(old_full_size
.width(), panel
->full_size().width());
1600 EXPECT_GT(old_full_size
.height(), panel
->full_size().height());
1601 EXPECT_GE(panel
->max_size().width(), panel
->full_size().width());
1602 EXPECT_GE(panel
->max_size().height(), panel
->full_size().height());
1603 EXPECT_EQ(smaller_work_area
.height(), panel
->full_size().height());
1608 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, DevTools
) {
1609 // Create a test panel with web contents loaded.
1610 CreatePanelParams
params("1", gfx::Rect(0, 0, 200, 220), SHOW_AS_ACTIVE
);
1611 GURL
url(ui_test_utils::GetTestUrl(
1612 base::FilePath(kTestDir
),
1613 base::FilePath(FILE_PATH_LITERAL("update-preferred-size.html"))));
1615 Panel
* panel
= CreatePanelWithParams(params
);
1618 size_t num_browsers
= 1;
1619 EXPECT_EQ(num_browsers
, chrome::GetBrowserCount(
1620 browser()->profile(),
1621 browser()->host_desktop_type()));
1622 content::WindowedNotificationObserver
signal(
1623 chrome::NOTIFICATION_BROWSER_WINDOW_READY
,
1624 content::NotificationService::AllSources());
1625 EXPECT_TRUE(panel
->ExecuteCommandIfEnabled(IDC_DEV_TOOLS
));
1628 // Check that the new browser window that opened is dev tools window.
1630 EXPECT_EQ(num_browsers
, chrome::GetBrowserCount(
1631 browser()->profile(),
1632 browser()->host_desktop_type()));
1633 for (chrome::BrowserIterator iter
; !iter
.done(); iter
.Next()) {
1634 if (*iter
== browser())
1636 ASSERT_TRUE((*iter
)->is_devtools());
1642 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, DevToolsConsole
) {
1643 // Create a test panel with web contents loaded.
1644 CreatePanelParams
params("1", gfx::Rect(0, 0, 200, 220), SHOW_AS_ACTIVE
);
1645 GURL
url(ui_test_utils::GetTestUrl(
1646 base::FilePath(kTestDir
),
1647 base::FilePath(FILE_PATH_LITERAL("update-preferred-size.html"))));
1649 Panel
* panel
= CreatePanelWithParams(params
);
1651 // Open devtools console.
1652 size_t num_browsers
= 1;
1653 EXPECT_EQ(num_browsers
, chrome::GetBrowserCount(
1654 browser()->profile(),
1655 browser()->host_desktop_type()));
1656 content::WindowedNotificationObserver
signal(
1657 chrome::NOTIFICATION_BROWSER_WINDOW_READY
,
1658 content::NotificationService::AllSources());
1659 EXPECT_TRUE(panel
->ExecuteCommandIfEnabled(IDC_DEV_TOOLS_CONSOLE
));
1662 // Check that the new browser window that opened is dev tools window.
1664 EXPECT_EQ(num_browsers
, chrome::GetBrowserCount(
1665 browser()->profile(),
1666 browser()->host_desktop_type()));
1667 for (chrome::BrowserIterator iter
; !iter
.done(); iter
.Next()) {
1668 if (*iter
== browser())
1670 ASSERT_TRUE((*iter
)->is_devtools());
1677 #define MAYBE_Accelerator Accelerator
1679 #define MAYBE_Accelerator DISABLED_Accelerator
1681 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
, MAYBE_Accelerator
) {
1682 PanelManager
* panel_manager
= PanelManager::GetInstance();
1684 // Create a test panel with web contents loaded.
1685 CreatePanelParams
params("1", gfx::Rect(), SHOW_AS_ACTIVE
);
1686 GURL
url(ui_test_utils::GetTestUrl(
1687 base::FilePath(kTestDir
),
1688 base::FilePath(FILE_PATH_LITERAL("update-preferred-size.html"))));
1690 Panel
* panel
= CreatePanelWithParams(params
);
1691 EXPECT_EQ(1, panel_manager
->num_panels());
1693 // Close the panel by acclerator.
1694 content::WindowedNotificationObserver
signal(
1695 chrome::NOTIFICATION_PANEL_CLOSED
,
1696 content::Source
<Panel
>(panel
));
1697 #if defined(USE_AURA)
1698 double now
= ui::EventTimeForNow().InSecondsF();
1699 content::NativeWebKeyboardEvent
key_event(
1703 ui::EF_CONTROL_DOWN
,
1705 #elif defined(OS_WIN)
1706 ::MSG key_msg
= { NULL
, WM_KEYDOWN
, ui::VKEY_W
, 0 };
1707 content::NativeWebKeyboardEvent
key_event(key_msg
);
1708 key_event
.modifiers
= content::NativeWebKeyboardEvent::ControlKey
;
1710 content::NativeWebKeyboardEvent key_event
;
1712 panel
->HandleKeyboardEvent(key_event
);
1714 EXPECT_EQ(0, panel_manager
->num_panels());
1717 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
,
1718 HideDockedPanelCreatedBeforeFullScreenMode
) {
1719 // Create a docked panel.
1720 Panel
* panel
= CreatePanel("PanelTest");
1721 scoped_ptr
<NativePanelTesting
> panel_testing(CreateNativePanelTesting(panel
));
1723 // Panel should be visible at first.
1724 EXPECT_TRUE(panel_testing
->IsWindowVisible());
1726 // Panel should become hidden when entering full-screen mode.
1727 mock_display_settings_provider()->EnableFullScreenMode(true);
1728 EXPECT_FALSE(panel_testing
->IsWindowVisible());
1730 // Panel should become visible when leaving full-screen mode.
1731 mock_display_settings_provider()->EnableFullScreenMode(false);
1732 EXPECT_TRUE(panel_testing
->IsWindowVisible());
1734 PanelManager::GetInstance()->CloseAll();
1737 IN_PROC_BROWSER_TEST_F(PanelBrowserTest
,
1738 HideDockedPanelCreatedOnFullScreenMode
) {
1739 // Enable full-screen mode first.
1740 mock_display_settings_provider()->EnableFullScreenMode(true);
1742 // Create a docked panel without waiting for it to be shown since it is not
1743 // supposed to be shown on full-screen mode.
1744 CreatePanelParams
params("1", gfx::Rect(0, 0, 250, 200), SHOW_AS_ACTIVE
);
1745 params
.wait_for_fully_created
= false;
1746 Panel
* panel
= CreatePanelWithParams(params
);
1747 scoped_ptr
<NativePanelTesting
> panel_testing(
1748 CreateNativePanelTesting(panel
));
1750 // Panel should not be shown on full-screen mode.
1751 EXPECT_FALSE(panel_testing
->IsWindowVisible());
1753 // Panel should become visible when leaving full-screen mode.
1754 mock_display_settings_provider()->EnableFullScreenMode(false);
1755 EXPECT_TRUE(panel_testing
->IsWindowVisible());
1757 PanelManager::GetInstance()->CloseAll();
1760 class PanelExtensionApiTest
: public ExtensionApiTest
{
1762 virtual void SetUpCommandLine(CommandLine
* command_line
) OVERRIDE
{
1763 ExtensionApiTest::SetUpCommandLine(command_line
);
1764 command_line
->AppendSwitch(switches::kEnablePanels
);
1768 #if defined(OS_LINUX) || (!defined(OS_WIN) && defined(USE_AURA)) || \
1770 // Focus test fails if there is no window manager on Linux.
1771 // Aura panels have different behavior that do not apply to this test.
1772 #define MAYBE_FocusChangeEventOnMinimize DISABLED_FocusChangeEventOnMinimize
1774 #define MAYBE_FocusChangeEventOnMinimize FocusChangeEventOnMinimize
1776 IN_PROC_BROWSER_TEST_F(PanelExtensionApiTest
,
1777 MAYBE_FocusChangeEventOnMinimize
) {
1778 // This is needed so the subsequently created panels can be activated.
1779 // On a Mac, it transforms background-only test process into foreground one.
1780 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
1781 ASSERT_TRUE(RunExtensionTest("panels/focus_change_on_minimize")) << message_
;