OLD | NEW |
| (Empty) |
1 // Copyright 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 "chrome/browser/ui/views/immersive_mode_controller.h" | |
6 | |
7 #include "chrome/app/chrome_command_ids.h" | |
8 #include "chrome/browser/ui/browser_commands.h" | |
9 #include "chrome/browser/ui/views/frame/browser_view.h" | |
10 #include "chrome/browser/ui/views/tabs/tab.h" | |
11 #include "chrome/browser/ui/views/tabs/tab_strip.h" | |
12 #include "chrome/test/base/in_process_browser_test.h" | |
13 #include "ui/compositor/layer_animator.h" | |
14 #include "ui/compositor/scoped_animation_duration_scale_mode.h" | |
15 #include "ui/gfx/rect.h" | |
16 #include "ui/views/view.h" | |
17 | |
18 #if defined(USE_ASH) | |
19 #include "ash/root_window_controller.h" | |
20 #include "ash/shelf/shelf_layout_manager.h" | |
21 #include "ash/shelf/shelf_types.h" | |
22 #include "ash/shell.h" | |
23 #include "ash/wm/window_properties.h" | |
24 #endif | |
25 | |
26 namespace { | |
27 | |
28 // Returns the bounds of |view| in widget coordinates. | |
29 gfx::Rect GetRectInWidget(views::View* view) { | |
30 return view->ConvertRectToWidget(view->GetLocalBounds()); | |
31 } | |
32 | |
33 } // namespace | |
34 | |
35 typedef InProcessBrowserTest ImmersiveModeControllerTest; | |
36 | |
37 // TODO(jamescook): If immersive mode becomes popular on CrOS, consider porting | |
38 // it to other Aura platforms (win_aura, linux_aura). http://crbug.com/163931 | |
39 #if defined(OS_CHROMEOS) | |
40 IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerTest, ImmersiveMode) { | |
41 ui::ScopedAnimationDurationScaleMode zero_duration_mode( | |
42 ui::ScopedAnimationDurationScaleMode::ZERO_DURATION); | |
43 ASSERT_TRUE(ImmersiveModeController::UseImmersiveFullscreen()); | |
44 | |
45 BrowserView* browser_view = static_cast<BrowserView*>(browser()->window()); | |
46 ImmersiveModeController* controller = | |
47 browser_view->immersive_mode_controller(); | |
48 views::View* contents_view = browser_view->GetTabContentsContainerView(); | |
49 | |
50 // Immersive mode is not on by default. | |
51 EXPECT_FALSE(controller->enabled()); | |
52 EXPECT_FALSE(controller->ShouldHideTopViews()); | |
53 | |
54 // Top-of-window views are visible. | |
55 EXPECT_TRUE(browser_view->IsTabStripVisible()); | |
56 EXPECT_TRUE(browser_view->IsToolbarVisible()); | |
57 | |
58 // Usual commands are enabled. | |
59 EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPEN_CURRENT_URL)); | |
60 EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ABOUT)); | |
61 EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN)); | |
62 | |
63 // Turning immersive mode on sets the toolbar to immersive style and hides | |
64 // the top-of-window views while leaving the tab strip visible. | |
65 chrome::ToggleFullscreenMode(browser()); | |
66 ASSERT_TRUE(browser_view->IsFullscreen()); | |
67 EXPECT_TRUE(controller->enabled()); | |
68 EXPECT_TRUE(controller->ShouldHideTopViews()); | |
69 EXPECT_FALSE(controller->IsRevealed()); | |
70 EXPECT_TRUE(browser_view->tabstrip()->IsImmersiveStyle()); | |
71 EXPECT_TRUE(browser_view->IsTabStripVisible()); | |
72 EXPECT_FALSE(browser_view->IsToolbarVisible()); | |
73 // Content area is immediately below the tab indicators. | |
74 EXPECT_EQ(GetRectInWidget(browser_view).y() + Tab::GetImmersiveHeight(), | |
75 GetRectInWidget(contents_view).y()); | |
76 | |
77 // Commands are still enabled (usually fullscreen disables these). | |
78 EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPEN_CURRENT_URL)); | |
79 EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ABOUT)); | |
80 EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN)); | |
81 | |
82 // Trigger a reveal keeps us in immersive mode, but top-of-window views | |
83 // become visible. | |
84 controller->StartRevealForTest(); | |
85 EXPECT_TRUE(controller->enabled()); | |
86 EXPECT_FALSE(controller->ShouldHideTopViews()); | |
87 EXPECT_TRUE(controller->IsRevealed()); | |
88 EXPECT_FALSE(browser_view->tabstrip()->IsImmersiveStyle()); | |
89 EXPECT_TRUE(browser_view->IsTabStripVisible()); | |
90 EXPECT_TRUE(browser_view->IsToolbarVisible()); | |
91 // Shelf hide triggered by enabling immersive mode eventually changes the | |
92 // widget bounds and causes a Layout(). Force it to happen early for test. | |
93 browser_view->parent()->Layout(); | |
94 // Content area is still immediately below the tab indicators. | |
95 EXPECT_EQ(GetRectInWidget(browser_view).y() + Tab::GetImmersiveHeight(), | |
96 GetRectInWidget(contents_view).y()); | |
97 | |
98 // Ending a reveal keeps us in immersive mode, but toolbar goes invisible. | |
99 controller->CancelReveal(); | |
100 EXPECT_TRUE(controller->enabled()); | |
101 EXPECT_TRUE(controller->ShouldHideTopViews()); | |
102 EXPECT_FALSE(controller->IsRevealed()); | |
103 EXPECT_TRUE(browser_view->tabstrip()->IsImmersiveStyle()); | |
104 EXPECT_TRUE(browser_view->IsTabStripVisible()); | |
105 EXPECT_FALSE(browser_view->IsToolbarVisible()); | |
106 | |
107 // Disabling immersive mode puts us back to the beginning. | |
108 chrome::ToggleFullscreenMode(browser()); | |
109 ASSERT_FALSE(browser_view->IsFullscreen()); | |
110 EXPECT_FALSE(controller->enabled()); | |
111 EXPECT_FALSE(controller->ShouldHideTopViews()); | |
112 EXPECT_FALSE(controller->IsRevealed()); | |
113 EXPECT_FALSE(browser_view->tabstrip()->IsImmersiveStyle()); | |
114 EXPECT_TRUE(browser_view->IsTabStripVisible()); | |
115 EXPECT_TRUE(browser_view->IsToolbarVisible()); | |
116 | |
117 // Disabling immersive mode while we are revealed should take us back to | |
118 // the beginning. | |
119 chrome::ToggleFullscreenMode(browser()); | |
120 ASSERT_TRUE(browser_view->IsFullscreen()); | |
121 EXPECT_TRUE(controller->enabled()); | |
122 controller->StartRevealForTest(); | |
123 | |
124 chrome::ToggleFullscreenMode(browser()); | |
125 ASSERT_FALSE(browser_view->IsFullscreen()); | |
126 EXPECT_FALSE(controller->enabled()); | |
127 EXPECT_FALSE(controller->ShouldHideTopViews()); | |
128 EXPECT_FALSE(controller->IsRevealed()); | |
129 EXPECT_FALSE(browser_view->tabstrip()->IsImmersiveStyle()); | |
130 EXPECT_TRUE(browser_view->IsTabStripVisible()); | |
131 EXPECT_TRUE(browser_view->IsToolbarVisible()); | |
132 | |
133 // When hiding the tab indicators, content is at the top of the browser view | |
134 // both before and during reveal. | |
135 controller->SetHideTabIndicatorsForTest(true); | |
136 chrome::ToggleFullscreenMode(browser()); | |
137 ASSERT_TRUE(browser_view->IsFullscreen()); | |
138 EXPECT_FALSE(browser_view->IsTabStripVisible()); | |
139 EXPECT_EQ(GetRectInWidget(browser_view).y(), | |
140 GetRectInWidget(contents_view).y()); | |
141 controller->StartRevealForTest(); | |
142 EXPECT_TRUE(browser_view->IsTabStripVisible()); | |
143 // Shelf hide triggered by enabling immersive mode eventually changes the | |
144 // widget bounds and causes a Layout(). Force it to happen early for test. | |
145 browser_view->parent()->Layout(); | |
146 EXPECT_EQ(GetRectInWidget(browser_view).y(), | |
147 GetRectInWidget(contents_view).y()); | |
148 chrome::ToggleFullscreenMode(browser()); | |
149 ASSERT_FALSE(browser_view->IsFullscreen()); | |
150 controller->SetHideTabIndicatorsForTest(false); | |
151 | |
152 // Reveal ends when the mouse moves out of the reveal view. | |
153 chrome::ToggleFullscreenMode(browser()); | |
154 ASSERT_TRUE(browser_view->IsFullscreen()); | |
155 EXPECT_TRUE(controller->enabled()); | |
156 controller->StartRevealForTest(); | |
157 controller->OnRevealViewLostMouseForTest(); | |
158 EXPECT_FALSE(controller->IsRevealed()); | |
159 | |
160 // Focus testing is not reliable on Windows, crbug.com/79493 | |
161 #if !defined(OS_WIN) | |
162 // Giving focus to the location bar prevents the reveal from ending when | |
163 // the mouse exits. | |
164 controller->StartRevealForTest(); | |
165 browser_view->SetFocusToLocationBar(false); | |
166 controller->OnRevealViewLostMouseForTest(); | |
167 EXPECT_TRUE(controller->IsRevealed()); | |
168 | |
169 // Releasing focus ends the reveal. | |
170 browser_view->GetFocusManager()->ClearFocus(); | |
171 EXPECT_FALSE(controller->IsRevealed()); | |
172 | |
173 // Placing focus in the location bar automatically causes a reveal. | |
174 browser_view->SetFocusToLocationBar(false); | |
175 EXPECT_TRUE(controller->IsRevealed()); | |
176 | |
177 // Releasing focus ends the reveal again. | |
178 browser_view->GetFocusManager()->ClearFocus(); | |
179 EXPECT_FALSE(controller->IsRevealed()); | |
180 | |
181 // Reveal and lock causes a reveal. | |
182 controller->RevealAndLock(true); | |
183 EXPECT_TRUE(controller->IsRevealed()); | |
184 | |
185 // The views stay revealed even if the mouse is lost or focus is lost. | |
186 controller->OnRevealViewLostMouseForTest(); | |
187 EXPECT_TRUE(controller->IsRevealed()); | |
188 browser_view->SetFocusToLocationBar(false); | |
189 EXPECT_TRUE(controller->IsRevealed()); | |
190 browser_view->GetFocusManager()->ClearFocus(); | |
191 EXPECT_TRUE(controller->IsRevealed()); | |
192 | |
193 // Ending the lock ends the reveal. | |
194 controller->RevealAndLock(false); | |
195 EXPECT_FALSE(controller->IsRevealed()); | |
196 #endif // defined(OS_WIN) | |
197 | |
198 // Window restore tracking is only implemented in the Aura port. | |
199 // Also, Windows Aura does not trigger maximize/restore notifications. | |
200 #if defined(USE_AURA) && !defined(OS_WIN) | |
201 // Restoring the window exits immersive mode. | |
202 browser_view->GetWidget()->Restore(); | |
203 ASSERT_FALSE(browser_view->IsFullscreen()); | |
204 EXPECT_FALSE(controller->enabled()); | |
205 EXPECT_FALSE(controller->ShouldHideTopViews()); | |
206 EXPECT_FALSE(controller->IsRevealed()); | |
207 EXPECT_FALSE(browser_view->tabstrip()->IsImmersiveStyle()); | |
208 EXPECT_TRUE(browser_view->IsTabStripVisible()); | |
209 EXPECT_TRUE(browser_view->IsToolbarVisible()); | |
210 #endif // defined(USE_AURA) && !defined(OS_WIN) | |
211 | |
212 // Don't crash if we exit the test during a reveal. | |
213 if (!browser_view->IsFullscreen()) | |
214 chrome::ToggleFullscreenMode(browser()); | |
215 ASSERT_TRUE(browser_view->IsFullscreen()); | |
216 ASSERT_TRUE(controller->enabled()); | |
217 controller->StartRevealForTest(); | |
218 } | |
219 | |
220 // Shelf-specific immersive mode tests. | |
221 IN_PROC_BROWSER_TEST_F(ImmersiveModeControllerTest, ImmersiveShelf) { | |
222 ui::ScopedAnimationDurationScaleMode zero_duration_mode( | |
223 ui::ScopedAnimationDurationScaleMode::ZERO_DURATION); | |
224 | |
225 BrowserView* browser_view = static_cast<BrowserView*>(browser()->window()); | |
226 ImmersiveModeController* immersive_controller = | |
227 browser_view->immersive_mode_controller(); | |
228 | |
229 // Shelf is visible when the test starts. | |
230 ash::internal::ShelfLayoutManager* shelf = | |
231 ash::Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager(); | |
232 ASSERT_EQ(ash::SHELF_VISIBLE, shelf->visibility_state()); | |
233 | |
234 // Turning immersive mode on sets the shelf to auto-hide. | |
235 chrome::ToggleFullscreenMode(browser()); | |
236 ASSERT_TRUE(browser_view->IsFullscreen()); | |
237 ASSERT_TRUE(immersive_controller->enabled()); | |
238 EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state()); | |
239 | |
240 // Disabling immersive mode puts it back. | |
241 chrome::ToggleFullscreenMode(browser()); | |
242 ASSERT_FALSE(browser_view->IsFullscreen()); | |
243 ASSERT_FALSE(immersive_controller->enabled()); | |
244 EXPECT_EQ(ash::SHELF_VISIBLE, shelf->visibility_state()); | |
245 | |
246 // The user could toggle the launcher behavior. | |
247 shelf->SetAutoHideBehavior(ash::SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS); | |
248 EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state()); | |
249 | |
250 // Enabling immersive mode keeps auto-hide. | |
251 chrome::ToggleFullscreenMode(browser()); | |
252 ASSERT_TRUE(browser_view->IsFullscreen()); | |
253 ASSERT_TRUE(immersive_controller->enabled()); | |
254 EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state()); | |
255 | |
256 // Disabling immersive mode maintains the user's auto-hide selection. | |
257 chrome::ToggleFullscreenMode(browser()); | |
258 ASSERT_FALSE(browser_view->IsFullscreen()); | |
259 ASSERT_FALSE(immersive_controller->enabled()); | |
260 EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state()); | |
261 | |
262 // Setting the window property directly toggles immersive mode. | |
263 aura::Window* window = browser_view->GetWidget()->GetNativeWindow(); | |
264 window->SetProperty(ash::internal::kImmersiveModeKey, true); | |
265 EXPECT_TRUE(immersive_controller->enabled()); | |
266 window->SetProperty(ash::internal::kImmersiveModeKey, false); | |
267 EXPECT_FALSE(immersive_controller->enabled()); | |
268 } | |
269 | |
270 #endif // defined(OS_CHROMEOS) | |
OLD | NEW |