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

Side by Side Diff: chrome/browser/ui/views/immersive_mode_controller_browsertest.cc

Issue 12754010: Move immersive_mode_controller into c/b/ui/views/frame (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/ui/views/immersive_mode_controller.cc ('k') | chrome/chrome_browser_ui.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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)
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/immersive_mode_controller.cc ('k') | chrome/chrome_browser_ui.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698