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.
4
5 #include "base/message_loop/message_loop.h"
6 #include "chrome/browser/ui/panels/base_panel_browser_test.h"
7 #include "chrome/browser/ui/panels/detached_panel_collection.h"
8 #include "chrome/browser/ui/panels/native_panel.h"
9 #include "chrome/browser/ui/panels/panel.h"
10 #include "chrome/browser/ui/panels/panel_manager.h"
11
12 class DetachedPanelBrowserTest : public BasePanelBrowserTest {
13 };
14
IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,CheckDetachedPanelProperties)15 IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest, CheckDetachedPanelProperties) {
16 PanelManager* panel_manager = PanelManager::GetInstance();
17 DetachedPanelCollection* detached_collection =
18 panel_manager->detached_collection();
19
20 // Create an initially detached panel (as opposed to other tests which create
21 // a docked panel, then detaches it).
22 gfx::Rect bounds(300, 200, 250, 200);
23 CreatePanelParams params("1", bounds, SHOW_AS_ACTIVE);
24 params.create_mode = PanelManager::CREATE_AS_DETACHED;
25 Panel* panel = CreatePanelWithParams(params);
26 scoped_ptr<NativePanelTesting> panel_testing(
27 CreateNativePanelTesting(panel));
28
29 EXPECT_EQ(1, panel_manager->num_panels());
30 EXPECT_TRUE(detached_collection->HasPanel(panel));
31
32 EXPECT_EQ(bounds.x(), panel->GetBounds().x());
33 // Ignore checking y position since the detached panel will be placed near
34 // the top if the stacking mode is enabled.
35 if (!PanelManager::IsPanelStackingEnabled())
36 EXPECT_EQ(bounds.y(), panel->GetBounds().y());
37 EXPECT_EQ(bounds.width(), panel->GetBounds().width());
38 EXPECT_EQ(bounds.height(), panel->GetBounds().height());
39 EXPECT_FALSE(panel->IsAlwaysOnTop());
40
41 EXPECT_TRUE(panel_testing->IsButtonVisible(panel::CLOSE_BUTTON));
42 // The minimize button will not be shown on some Linux desktop environment
43 // that does not support system minimize.
44 if (PanelManager::CanUseSystemMinimize())
45 EXPECT_TRUE(panel_testing->IsButtonVisible(panel::MINIMIZE_BUTTON));
46 else
47 EXPECT_FALSE(panel_testing->IsButtonVisible(panel::MINIMIZE_BUTTON));
48 EXPECT_FALSE(panel_testing->IsButtonVisible(panel::RESTORE_BUTTON));
49
50 EXPECT_EQ(panel::RESIZABLE_ALL, panel->CanResizeByMouse());
51
52 EXPECT_EQ(panel::ALL_ROUNDED, panel_testing->GetWindowCornerStyle());
53
54 Panel::AttentionMode expected_attention_mode =
55 static_cast<Panel::AttentionMode>(Panel::USE_PANEL_ATTENTION |
56 Panel::USE_SYSTEM_ATTENTION);
57 EXPECT_EQ(expected_attention_mode, panel->attention_mode());
58
59 panel_manager->CloseAll();
60 }
61
IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,DrawAttentionOnActive)62 IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest, DrawAttentionOnActive) {
63 // Create a detached panel that is initially active.
64 Panel* panel = CreateDetachedPanel("1", gfx::Rect(300, 200, 250, 200));
65 scoped_ptr<NativePanelTesting> native_panel_testing(
66 CreateNativePanelTesting(panel));
67
68 // Test that the attention should not be drawn if the detached panel is in
69 // focus.
70 EXPECT_FALSE(panel->IsDrawingAttention());
71 panel->FlashFrame(true);
72 EXPECT_FALSE(panel->IsDrawingAttention());
73 EXPECT_FALSE(native_panel_testing->VerifyDrawingAttention());
74
75 panel->Close();
76 }
77
IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,DrawAttentionOnInactive)78 IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest, DrawAttentionOnInactive) {
79 // Create an inactive detached panel.
80 Panel* panel =
81 CreateInactiveDetachedPanel("1", gfx::Rect(300, 200, 250, 200));
82 scoped_ptr<NativePanelTesting> native_panel_testing(
83 CreateNativePanelTesting(panel));
84
85 // Test that the attention is drawn when the detached panel is not in focus.
86 EXPECT_FALSE(panel->IsActive());
87 EXPECT_FALSE(panel->IsDrawingAttention());
88 panel->FlashFrame(true);
89 EXPECT_TRUE(panel->IsDrawingAttention());
90 EXPECT_TRUE(native_panel_testing->VerifyDrawingAttention());
91
92 // Stop drawing attention.
93 panel->FlashFrame(false);
94 EXPECT_FALSE(panel->IsDrawingAttention());
95 EXPECT_FALSE(native_panel_testing->VerifyDrawingAttention());
96
97 PanelManager::GetInstance()->CloseAll();
98 }
99
IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,DrawAttentionResetOnActivate)100 IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest, DrawAttentionResetOnActivate) {
101 // Create an inactive detached panel.
102 Panel* panel =
103 CreateInactiveDetachedPanel("1", gfx::Rect(300, 200, 250, 200));
104 scoped_ptr<NativePanelTesting> native_panel_testing(
105 CreateNativePanelTesting(panel));
106
107 // Test that the attention is drawn when the detached panel is not in focus.
108 panel->FlashFrame(true);
109 EXPECT_TRUE(panel->IsDrawingAttention());
110 EXPECT_TRUE(native_panel_testing->VerifyDrawingAttention());
111
112 // Test that the attention is cleared when panel gets focus.
113 panel->Activate();
114 WaitForPanelActiveState(panel, SHOW_AS_ACTIVE);
115 EXPECT_FALSE(panel->IsDrawingAttention());
116 EXPECT_FALSE(native_panel_testing->VerifyDrawingAttention());
117
118 PanelManager::GetInstance()->CloseAll();
119 }
120
IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,ClickTitlebar)121 IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest, ClickTitlebar) {
122 Panel* panel = CreateDetachedPanel("1", gfx::Rect(300, 200, 250, 200));
123 EXPECT_FALSE(panel->IsMinimized());
124
125 // Clicking on an active detached panel's titlebar has no effect, regardless
126 // of modifier.
127 scoped_ptr<NativePanelTesting> test_panel(
128 CreateNativePanelTesting(panel));
129 test_panel->PressLeftMouseButtonTitlebar(panel->GetBounds().origin());
130 test_panel->ReleaseMouseButtonTitlebar();
131 EXPECT_TRUE(panel->IsActive());
132 EXPECT_FALSE(panel->IsMinimized());
133
134 test_panel->PressLeftMouseButtonTitlebar(panel->GetBounds().origin(),
135 panel::APPLY_TO_ALL);
136 test_panel->ReleaseMouseButtonTitlebar(panel::APPLY_TO_ALL);
137 EXPECT_TRUE(panel->IsActive());
138 EXPECT_FALSE(panel->IsMinimized());
139
140 // Clicking on an inactive detached panel's titlebar activates it.
141 DeactivatePanel(panel);
142 test_panel->PressLeftMouseButtonTitlebar(panel->GetBounds().origin());
143 test_panel->ReleaseMouseButtonTitlebar();
144 WaitForPanelActiveState(panel, SHOW_AS_ACTIVE);
145 EXPECT_FALSE(panel->IsMinimized());
146
147 PanelManager::GetInstance()->CloseAll();
148 }
149
IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,UpdateDetachedPanelOnPrimaryDisplayChange)150 IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,
151 UpdateDetachedPanelOnPrimaryDisplayChange) {
152 PanelManager* panel_manager = PanelManager::GetInstance();
153
154 // Create a big detached panel on the primary display.
155 gfx::Rect initial_bounds(50, 50, 700, 500);
156 Panel* panel = CreateDetachedPanel("1", initial_bounds);
157 EXPECT_EQ(initial_bounds, panel->GetBounds());
158
159 // Make the primary display smaller.
160 // Expect that the panel should be resized to fit within the display.
161 gfx::Rect primary_display_area(0, 0, 500, 300);
162 gfx::Rect primary_work_area(0, 0, 500, 280);
163 mock_display_settings_provider()->SetPrimaryDisplay(
164 primary_display_area, primary_work_area);
165
166 gfx::Rect bounds = panel->GetBounds();
167 EXPECT_LE(primary_work_area.x(), bounds.x());
168 EXPECT_LE(bounds.x(), primary_work_area.right());
169 EXPECT_LE(primary_work_area.y(), bounds.y());
170 EXPECT_LE(bounds.y(), primary_work_area.bottom());
171
172 panel_manager->CloseAll();
173 }
174
IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,UpdateDetachedPanelOnSecondaryDisplayChange)175 IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,
176 UpdateDetachedPanelOnSecondaryDisplayChange) {
177 PanelManager* panel_manager = PanelManager::GetInstance();
178
179 // Setup 2 displays with secondary display on the right side of primary
180 // display.
181 gfx::Rect primary_display_area(0, 0, 400, 600);
182 gfx::Rect primary_work_area(0, 0, 400, 560);
183 mock_display_settings_provider()->SetPrimaryDisplay(
184 primary_display_area, primary_work_area);
185 gfx::Rect secondary_display_area(400, 0, 400, 500);
186 gfx::Rect secondary_work_area(400, 0, 400, 460);
187 mock_display_settings_provider()->SetSecondaryDisplay(
188 secondary_display_area, secondary_work_area);
189
190 // Create a big detached panel on the seconday display.
191 gfx::Rect initial_bounds(450, 50, 350, 400);
192 Panel* panel = CreateDetachedPanel("1", initial_bounds);
193 EXPECT_EQ(initial_bounds, panel->GetBounds());
194
195 // Move down the secondary display and make it smaller.
196 // Expect that the panel should be resized to fit within the display.
197 secondary_display_area.SetRect(400, 100, 300, 400);
198 secondary_work_area.SetRect(400, 100, 300, 360);
199 mock_display_settings_provider()->SetSecondaryDisplay(
200 secondary_display_area, secondary_work_area);
201
202 gfx::Rect bounds = panel->GetBounds();
203 EXPECT_LE(secondary_work_area.x(), bounds.x());
204 EXPECT_LE(bounds.x(), secondary_work_area.right());
205 EXPECT_LE(secondary_work_area.y(), bounds.y());
206 EXPECT_LE(bounds.y(), secondary_work_area.bottom());
207
208 panel_manager->CloseAll();
209 }
210
IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,KeepShowingDetachedPanelCreatedBeforeFullScreenMode)211 IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,
212 KeepShowingDetachedPanelCreatedBeforeFullScreenMode) {
213 // Create a detached panel.
214 CreatePanelParams params("1", gfx::Rect(300, 200, 250, 200), SHOW_AS_ACTIVE);
215 params.create_mode = PanelManager::CREATE_AS_DETACHED;
216 Panel* panel = CreatePanelWithParams(params);
217 scoped_ptr<NativePanelTesting> panel_testing(CreateNativePanelTesting(panel));
218
219 // Panel should be visible at first.
220 EXPECT_TRUE(panel_testing->IsWindowVisible());
221
222 // Panel's visibility should not be affected when entering full-screen mode.
223 mock_display_settings_provider()->EnableFullScreenMode(true);
224 EXPECT_TRUE(panel_testing->IsWindowVisible());
225
226 // Panel's visibility should not be affected when leaving full-screen mode.
227 mock_display_settings_provider()->EnableFullScreenMode(false);
228 EXPECT_TRUE(panel_testing->IsWindowVisible());
229
230 PanelManager::GetInstance()->CloseAll();
231 }
232
IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,HideDetachedPanelCreatedOnFullScreenMode)233 IN_PROC_BROWSER_TEST_F(DetachedPanelBrowserTest,
234 HideDetachedPanelCreatedOnFullScreenMode) {
235 // Enable full-screen mode first.
236 mock_display_settings_provider()->EnableFullScreenMode(true);
237
238 // Create a detached panel without waiting it to be shown since it is not
239 // supposed to be shown on full-screen mode.
240 CreatePanelParams params("1", gfx::Rect(300, 200, 250, 200), SHOW_AS_ACTIVE);
241 params.create_mode = PanelManager::CREATE_AS_DETACHED;
242 params.wait_for_fully_created = false;
243 Panel* panel = CreatePanelWithParams(params);
244 scoped_ptr<NativePanelTesting> panel_testing(CreateNativePanelTesting(panel));
245
246 // Panel should not be shown on full-screen mode.
247 EXPECT_FALSE(panel_testing->IsWindowVisible());
248
249 // Panel should become visible when leaving full-screen mode.
250 mock_display_settings_provider()->EnableFullScreenMode(false);
251 EXPECT_TRUE(panel_testing->IsWindowVisible());
252
253 PanelManager::GetInstance()->CloseAll();
254 }
255