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

Side by Side Diff: chrome/browser/ui/fullscreen_controller.cc

Issue 10261011: Windowed mode mouse lock addded to fullscreen controller. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Mac build bot errors Created 8 years, 7 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/fullscreen_controller.h" 5 #include "chrome/browser/ui/fullscreen_controller.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "chrome/browser/content_settings/host_content_settings_map.h" 10 #include "chrome/browser/content_settings/host_content_settings_map.h"
11 #include "chrome/browser/download/download_shelf.h" 11 #include "chrome/browser/download/download_shelf.h"
12 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/ui/browser.h" 13 #include "chrome/browser/ui/browser.h"
14 #include "chrome/browser/ui/browser_window.h" 14 #include "chrome/browser/ui/browser_window.h"
15 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 15 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
16 #include "chrome/common/chrome_notification_types.h" 16 #include "chrome/common/chrome_notification_types.h"
17 #include "chrome/common/chrome_switches.h" 17 #include "chrome/common/chrome_switches.h"
18 #include "chrome/common/extensions/extension.h" 18 #include "chrome/common/extensions/extension.h"
19 #include "content/public/browser/notification_service.h" 19 #include "content/public/browser/notification_service.h"
20 #include "content/public/browser/render_view_host.h" 20 #include "content/public/browser/render_view_host.h"
21 #include "content/public/browser/render_widget_host_view.h"
21 #include "content/public/browser/user_metrics.h" 22 #include "content/public/browser/user_metrics.h"
22 #include "content/public/browser/web_contents.h" 23 #include "content/public/browser/web_contents.h"
23 24
24 using content::RenderViewHost; 25 using content::RenderViewHost;
25 using content::UserMetricsAction; 26 using content::UserMetricsAction;
26 using content::WebContents; 27 using content::WebContents;
27 28
28 FullscreenController::FullscreenController(BrowserWindow* window, 29 FullscreenController::FullscreenController(BrowserWindow* window,
29 Profile* profile, 30 Profile* profile,
30 Browser* browser) 31 Browser* browser)
31 : window_(window), 32 : window_(window),
32 profile_(profile), 33 profile_(profile),
33 browser_(browser), 34 browser_(browser),
34 fullscreened_tab_(NULL), 35 fullscreened_tab_(NULL),
35 tab_caused_fullscreen_(false), 36 tab_caused_fullscreen_(false),
36 tab_fullscreen_accepted_(false), 37 tab_fullscreen_accepted_(false),
38 toggled_into_fullscreen_(false),
39 mouse_lock_tab_(NULL),
37 mouse_lock_state_(MOUSELOCK_NOT_REQUESTED) { 40 mouse_lock_state_(MOUSELOCK_NOT_REQUESTED) {
38 } 41 }
39 42
40 bool FullscreenController::IsFullscreenForBrowser() const { 43 bool FullscreenController::IsFullscreenForBrowser() const {
41 return window_->IsFullscreen() && !tab_caused_fullscreen_; 44 return window_->IsFullscreen() && !tab_caused_fullscreen_;
42 } 45 }
43 46
44 bool FullscreenController::IsFullscreenForTabOrPending() const { 47 bool FullscreenController::IsFullscreenForTabOrPending() const {
45 return fullscreened_tab_ != NULL; 48 return fullscreened_tab_ != NULL;
46 } 49 }
(...skipping 10 matching lines...) Expand all
57 60
58 bool FullscreenController::IsMouseLockRequested() const { 61 bool FullscreenController::IsMouseLockRequested() const {
59 return mouse_lock_state_ == MOUSELOCK_REQUESTED; 62 return mouse_lock_state_ == MOUSELOCK_REQUESTED;
60 } 63 }
61 64
62 bool FullscreenController::IsMouseLocked() const { 65 bool FullscreenController::IsMouseLocked() const {
63 return mouse_lock_state_ == MOUSELOCK_ACCEPTED; 66 return mouse_lock_state_ == MOUSELOCK_ACCEPTED;
64 } 67 }
65 68
66 void FullscreenController::RequestToLockMouse(WebContents* tab, 69 void FullscreenController::RequestToLockMouse(WebContents* tab,
67 bool /* user_gesture */) { 70 bool user_gesture) {
68 // TODO(scheib) user_gesture required for Mouse Lock in Windowed Mode. 71 DCHECK(!IsMouseLocked());
69 // See http://crbug.com/107013, which will land in multiple patches. 72 MessageLoop::current()->PostTask(FROM_HERE,
sky 2012/05/21 15:18:38 Why does this need to be delayed? At a minimum add
scheib 2012/05/21 20:29:13 Done: Delay not needed, removed PostTask.
73 base::Bind(&FullscreenController::NotifyMouseLockChange, this));
70 74
71 DCHECK(!IsMouseLocked()); 75 // Must have a user gesture, or we must already be in tab fullscreen.
72 76 if (!user_gesture && !IsFullscreenForTabOrPending(tab)) {
73 // Mouse Lock is only permitted when browser is in tab fullscreen.
74 if (!IsFullscreenForTabOrPending(tab)) {
75 tab->GotResponseToLockMouseRequest(false); 77 tab->GotResponseToLockMouseRequest(false);
76 return; 78 return;
77 } 79 }
78 80
81 mouse_lock_tab_ = TabContentsWrapper::GetCurrentWrapperForContents(tab);
82 FullscreenExitBubbleType bubble_type = GetFullscreenExitBubbleType();
83
79 switch (GetMouseLockSetting(tab->GetURL())) { 84 switch (GetMouseLockSetting(tab->GetURL())) {
80 case CONTENT_SETTING_ALLOW: 85 case CONTENT_SETTING_ALLOW:
81 if (tab_fullscreen_accepted_) { 86 // If bubble already displaying buttons we must not lock the mouse yet,
82 if (tab->GotResponseToLockMouseRequest(true)) 87 // or it would prevent pressing those buttons. Instead, merge the request.
88 if (fullscreen_bubble::ShowButtonsForType(bubble_type)) {
89 mouse_lock_state_ = MOUSELOCK_REQUESTED;
90 } else {
91 // Lock mouse.
92 if (tab->GotResponseToLockMouseRequest(true)) {
83 mouse_lock_state_ = MOUSELOCK_ACCEPTED; 93 mouse_lock_state_ = MOUSELOCK_ACCEPTED;
84 } else { 94 } else {
85 mouse_lock_state_ = MOUSELOCK_REQUESTED; 95 mouse_lock_tab_ = NULL;
96 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
97 }
86 } 98 }
87 break; 99 break;
88 case CONTENT_SETTING_BLOCK: 100 case CONTENT_SETTING_BLOCK:
89 tab->GotResponseToLockMouseRequest(false); 101 tab->GotResponseToLockMouseRequest(false);
102 mouse_lock_tab_ = NULL;
103 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
90 break; 104 break;
91 case CONTENT_SETTING_ASK: 105 case CONTENT_SETTING_ASK:
92 mouse_lock_state_ = MOUSELOCK_REQUESTED; 106 mouse_lock_state_ = MOUSELOCK_REQUESTED;
93 break; 107 break;
94 default: 108 default:
95 NOTREACHED(); 109 NOTREACHED();
96 } 110 }
97 UpdateFullscreenExitBubbleContent(); 111 UpdateFullscreenExitBubbleContent();
98 } 112 }
99 113
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 TogglePresentationModeInternal(true); 149 TogglePresentationModeInternal(true);
136 #else 150 #else
137 ToggleFullscreenModeInternal(true); 151 ToggleFullscreenModeInternal(true);
138 #endif 152 #endif
139 } else { 153 } else {
140 // If currently there is a tab in "tab fullscreen" mode and fullscreen 154 // If currently there is a tab in "tab fullscreen" mode and fullscreen
141 // was not caused by it (i.e., previously it was in "browser fullscreen" 155 // was not caused by it (i.e., previously it was in "browser fullscreen"
142 // mode), we need to switch back to "browser fullscreen" mode. In this 156 // mode), we need to switch back to "browser fullscreen" mode. In this
143 // case, all we have to do is notifying the tab that it has exited "tab 157 // case, all we have to do is notifying the tab that it has exited "tab
144 // fullscreen" mode. 158 // fullscreen" mode.
145 NotifyTabOfFullscreenExitIfNecessary(); 159 NotifyTabOfExitIfNecessary();
146 } 160 }
147 } 161 }
148 } 162 }
149 } 163 }
150 164
151 #if defined(OS_MACOSX) 165 #if defined(OS_MACOSX)
152 void FullscreenController::TogglePresentationMode() { 166 void FullscreenController::TogglePresentationMode() {
153 TogglePresentationModeInternal(false); 167 TogglePresentationModeInternal(false);
154 } 168 }
155 #endif 169 #endif
156 170
157 void FullscreenController::ToggleFullscreenMode() { 171 void FullscreenController::ToggleFullscreenMode() {
158 extension_caused_fullscreen_ = GURL(); 172 extension_caused_fullscreen_ = GURL();
159 ToggleFullscreenModeInternal(false); 173 ToggleFullscreenModeInternal(false);
160 } 174 }
161 175
162 void FullscreenController::ToggleFullscreenModeWithExtension( 176 void FullscreenController::ToggleFullscreenModeWithExtension(
163 const GURL& extension_url) { 177 const GURL& extension_url) {
164 // |extension_caused_fullscreen_| will be reset if this causes fullscreen to 178 // |extension_caused_fullscreen_| will be reset if this causes fullscreen to
165 // exit. 179 // exit.
166 extension_caused_fullscreen_ = extension_url; 180 extension_caused_fullscreen_ = extension_url;
167 ToggleFullscreenModeInternal(false); 181 ToggleFullscreenModeInternal(false);
168 } 182 }
169 183
170 void FullscreenController::LostMouseLock() { 184 void FullscreenController::LostMouseLock() {
171 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; 185 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
186 mouse_lock_tab_ = NULL;
187 MessageLoop::current()->PostTask(FROM_HERE,
188 base::Bind(&FullscreenController::NotifyMouseLockChange, this));
sky 2012/05/21 15:18:38 Why is this delayed? With the delayed calls what
scheib 2012/05/21 20:29:13 Done.
172 UpdateFullscreenExitBubbleContent(); 189 UpdateFullscreenExitBubbleContent();
173 } 190 }
174 191
175 void FullscreenController::OnTabClosing(WebContents* web_contents) { 192 void FullscreenController::OnTabClosing(WebContents* web_contents) {
176 if (IsFullscreenForTabOrPending(web_contents)) { 193 if (IsFullscreenForTabOrPending(web_contents)) {
177 ExitTabbedFullscreenModeIfNecessary(); 194 ExitTabFullscreenOrMouseLockIfNecessary();
178 // The call to exit fullscreen may result in asynchronous notification of 195 // The call to exit fullscreen may result in asynchronous notification of
179 // fullscreen state change (e.g., on Linux). We don't want to rely on it 196 // fullscreen state change (e.g., on Linux). We don't want to rely on it
180 // to call NotifyTabOfFullscreenExitIfNecessary(), because at that point 197 // to call NotifyTabOfExitIfNecessary(), because at that point
181 // |fullscreen_tab_| may not be valid. Instead, we call it here to clean up 198 // |fullscreened_tab_| may not be valid. Instead, we call it here to clean
182 // tab fullscreen related state. 199 // up tab fullscreen related state.
183 NotifyTabOfFullscreenExitIfNecessary(); 200 NotifyTabOfExitIfNecessary();
184 } 201 }
185 } 202 }
186 203
187 void FullscreenController::OnTabDeactivated(TabContentsWrapper* contents) { 204 void FullscreenController::OnTabDeactivated(TabContentsWrapper* contents) {
188 if (contents == fullscreened_tab_) 205 if (contents == fullscreened_tab_)
189 ExitTabbedFullscreenModeIfNecessary(); 206 ExitTabFullscreenOrMouseLockIfNecessary();
190 } 207 }
191 208
192 void FullscreenController::OnAcceptFullscreenPermission( 209 void FullscreenController::OnAcceptFullscreenPermission(
193 const GURL& url, 210 const GURL& url,
194 FullscreenExitBubbleType bubble_type) { 211 FullscreenExitBubbleType bubble_type) {
195 bool mouse_lock = false; 212 bool mouse_lock = false;
196 bool fullscreen = false; 213 bool fullscreen = false;
197 fullscreen_bubble::PermissionRequestedByType(bubble_type, &fullscreen, 214 fullscreen_bubble::PermissionRequestedByType(bubble_type, &fullscreen,
198 &mouse_lock); 215 &mouse_lock);
199 DCHECK(fullscreened_tab_); 216 DCHECK(!(fullscreen && tab_fullscreen_accepted_));
200 DCHECK_NE(tab_fullscreen_accepted_, fullscreen); 217 DCHECK(!(mouse_lock && IsMouseLocked()));
201 218
202 HostContentSettingsMap* settings_map = profile_->GetHostContentSettingsMap(); 219 HostContentSettingsMap* settings_map = profile_->GetHostContentSettingsMap();
203 ContentSettingsPattern pattern = ContentSettingsPattern::FromURL(url); 220 ContentSettingsPattern pattern = ContentSettingsPattern::FromURL(url);
204 if (mouse_lock) { 221
222 if (mouse_lock && !IsMouseLocked()) {
205 DCHECK(IsMouseLockRequested()); 223 DCHECK(IsMouseLockRequested());
206 // TODO(markusheintz): We should allow patterns for all possible URLs here. 224 // TODO(markusheintz): We should allow patterns for all possible URLs here.
207 if (pattern.IsValid()) { 225 if (pattern.IsValid()) {
208 settings_map->SetContentSetting( 226 settings_map->SetContentSetting(
209 pattern, ContentSettingsPattern::Wildcard(), 227 pattern, ContentSettingsPattern::Wildcard(),
210 CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string(), 228 CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string(),
211 CONTENT_SETTING_ALLOW); 229 CONTENT_SETTING_ALLOW);
212 } 230 }
213 mouse_lock_state_ = 231
214 fullscreened_tab_->web_contents()->GotResponseToLockMouseRequest(true) ? 232 if (mouse_lock_tab_ &&
215 MOUSELOCK_ACCEPTED : MOUSELOCK_NOT_REQUESTED; 233 mouse_lock_tab_->web_contents() &&
234 mouse_lock_tab_->web_contents()->GotResponseToLockMouseRequest(true)) {
235 mouse_lock_state_ = MOUSELOCK_ACCEPTED;
hashimoto 2012/05/21 07:37:05 nit: same indent as 'else' below
scheib 2012/05/21 20:29:13 Done.
236 } else {
237 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
238 mouse_lock_tab_ = NULL;
239 }
240
241 MessageLoop::current()->PostTask(FROM_HERE,
242 base::Bind(&FullscreenController::NotifyMouseLockChange, this));
216 } 243 }
217 if (!tab_fullscreen_accepted_) { 244
245 if (fullscreen && !tab_fullscreen_accepted_) {
246 DCHECK(fullscreened_tab_);
218 if (pattern.IsValid()) { 247 if (pattern.IsValid()) {
219 settings_map->SetContentSetting( 248 settings_map->SetContentSetting(
220 pattern, ContentSettingsPattern::Wildcard(), 249 pattern, ContentSettingsPattern::Wildcard(),
221 CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string(), 250 CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string(),
222 CONTENT_SETTING_ALLOW); 251 CONTENT_SETTING_ALLOW);
223 } 252 }
224 tab_fullscreen_accepted_ = true; 253 tab_fullscreen_accepted_ = true;
225 } 254 }
226 UpdateFullscreenExitBubbleContent(); 255 UpdateFullscreenExitBubbleContent();
227 } 256 }
228 257
229 void FullscreenController::OnDenyFullscreenPermission( 258 void FullscreenController::OnDenyFullscreenPermission(
230 FullscreenExitBubbleType bubble_type) { 259 FullscreenExitBubbleType bubble_type) {
231 bool mouse_lock = false; 260 bool mouse_lock = false;
232 bool fullscreen = false; 261 bool fullscreen = false;
233 fullscreen_bubble::PermissionRequestedByType(bubble_type, &fullscreen, 262 fullscreen_bubble::PermissionRequestedByType(bubble_type, &fullscreen,
234 &mouse_lock); 263 &mouse_lock);
235 DCHECK(fullscreened_tab_); 264 DCHECK(fullscreened_tab_ || mouse_lock_tab_);
236 DCHECK_NE(tab_fullscreen_accepted_, fullscreen); 265 DCHECK(!(fullscreen && tab_fullscreen_accepted_));
266 DCHECK(!(mouse_lock && IsMouseLocked()));
237 267
238 if (mouse_lock) { 268 if (mouse_lock) {
239 DCHECK(IsMouseLockRequested()); 269 DCHECK(IsMouseLockRequested());
240 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; 270 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
241 fullscreened_tab_->web_contents()->GotResponseToLockMouseRequest(false); 271 if (mouse_lock_tab_ && mouse_lock_tab_->web_contents())
272 mouse_lock_tab_->web_contents()->GotResponseToLockMouseRequest(false);
273 mouse_lock_tab_ = NULL;
274 MessageLoop::current()->PostTask(FROM_HERE,
275 base::Bind(&FullscreenController::NotifyMouseLockChange, this));
276
277 // UpdateFullscreenExitBubbleContent() must be called, but to avoid
278 // duplicate calls we do so only if not adjusting the fullscreen state
279 // below, which also calls UpdateFullscreenExitBubbleContent().
242 if (!fullscreen) 280 if (!fullscreen)
243 UpdateFullscreenExitBubbleContent(); 281 UpdateFullscreenExitBubbleContent();
244 } 282 }
245 283
246 if (fullscreen) 284 if (fullscreen)
247 ExitTabbedFullscreenModeIfNecessary(); 285 ExitTabFullscreenOrMouseLockIfNecessary();
248 } 286 }
249 287
250 void FullscreenController::WindowFullscreenStateChanged() { 288 void FullscreenController::WindowFullscreenStateChanged() {
251 MessageLoop::current()->PostTask(FROM_HERE, 289 MessageLoop::current()->PostTask(FROM_HERE,
252 base::Bind(&FullscreenController::NotifyFullscreenChange, this)); 290 base::Bind(&FullscreenController::NotifyFullscreenChange, this));
253 bool exiting_fullscreen; 291 bool exiting_fullscreen;
254 #if defined(OS_MACOSX) 292 #if defined(OS_MACOSX)
255 exiting_fullscreen = !window_->InPresentationMode(); 293 exiting_fullscreen = !window_->InPresentationMode();
256 #else 294 #else
257 exiting_fullscreen = !window_->IsFullscreen(); 295 exiting_fullscreen = !window_->IsFullscreen();
258 #endif 296 #endif
259 if (exiting_fullscreen) 297 if (exiting_fullscreen)
260 NotifyTabOfFullscreenExitIfNecessary(); 298 NotifyTabOfExitIfNecessary();
261 if (exiting_fullscreen) 299 if (exiting_fullscreen)
262 window_->GetDownloadShelf()->Unhide(); 300 window_->GetDownloadShelf()->Unhide();
263 else 301 else
264 window_->GetDownloadShelf()->Hide(); 302 window_->GetDownloadShelf()->Hide();
265 } 303 }
266 304
267 bool FullscreenController::HandleUserPressedEscape() { 305 bool FullscreenController::HandleUserPressedEscape() {
268 if (!IsFullscreenForTabOrPending()) 306 if (IsFullscreenForTabOrPending() ||
269 return false; 307 IsMouseLocked() || IsMouseLockRequested()) {
270 ExitTabbedFullscreenModeIfNecessary(); 308 ExitTabFullscreenOrMouseLockIfNecessary();
271 return true; 309 return true;
310 }
311
312 return false;
272 } 313 }
273 314
274 FullscreenController::~FullscreenController() {} 315 FullscreenController::~FullscreenController() {}
275 316
276 void FullscreenController::NotifyTabOfFullscreenExitIfNecessary() { 317 void FullscreenController::NotifyTabOfExitIfNecessary() {
277 if (fullscreened_tab_) { 318 if (fullscreened_tab_) {
278 RenderViewHost* rvh = 319 RenderViewHost* rvh =
279 fullscreened_tab_->web_contents()->GetRenderViewHost(); 320 fullscreened_tab_->web_contents()->GetRenderViewHost();
280 fullscreened_tab_ = NULL; 321 fullscreened_tab_ = NULL;
281 tab_caused_fullscreen_ = false; 322 tab_caused_fullscreen_ = false;
282 tab_fullscreen_accepted_ = false; 323 tab_fullscreen_accepted_ = false;
283 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
284 if (rvh) 324 if (rvh)
285 rvh->ExitFullscreen(); 325 rvh->ExitFullscreen();
286 } else { 326 }
287 DCHECK_EQ(mouse_lock_state_, MOUSELOCK_NOT_REQUESTED); 327
328 if (mouse_lock_tab_) {
329 WebContents* web_contents = mouse_lock_tab_->web_contents();
330 if (IsMouseLockRequested()) {
331 web_contents->GotResponseToLockMouseRequest(false);
332 } else if (web_contents->GetRenderViewHost() &&
333 web_contents->GetRenderViewHost()->GetView()) {
334 web_contents->GetRenderViewHost()->GetView()->UnlockMouse();
335 }
336 mouse_lock_tab_ = NULL;
337 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
288 } 338 }
289 339
290 UpdateFullscreenExitBubbleContent(); 340 UpdateFullscreenExitBubbleContent();
291 } 341 }
292 342
293 void FullscreenController::ExitTabbedFullscreenModeIfNecessary() { 343 void FullscreenController::ExitTabFullscreenOrMouseLockIfNecessary() {
294 if (tab_caused_fullscreen_) 344 if (tab_caused_fullscreen_)
295 ToggleFullscreenMode(); 345 ToggleFullscreenMode();
296 else 346 else
297 NotifyTabOfFullscreenExitIfNecessary(); 347 NotifyTabOfExitIfNecessary();
298 } 348 }
299 349
300 void FullscreenController::UpdateFullscreenExitBubbleContent() { 350 void FullscreenController::UpdateFullscreenExitBubbleContent() {
301 GURL url; 351 GURL url;
302 if (fullscreened_tab_) 352 if (fullscreened_tab_)
303 url = fullscreened_tab_->web_contents()->GetURL(); 353 url = fullscreened_tab_->web_contents()->GetURL();
354 else if (mouse_lock_tab_)
355 url = mouse_lock_tab_->web_contents()->GetURL();
304 else if (!extension_caused_fullscreen_.is_empty()) 356 else if (!extension_caused_fullscreen_.is_empty())
305 url = extension_caused_fullscreen_; 357 url = extension_caused_fullscreen_;
306 358
307 window_->UpdateFullscreenExitBubbleContent(url, 359 FullscreenExitBubbleType bubble_type = GetFullscreenExitBubbleType();
308 GetFullscreenExitBubbleType()); 360
361 // If bubble displays buttons, unlock mouse to allow pressing them.
362 if (fullscreen_bubble::ShowButtonsForType(bubble_type) &&
363 IsMouseLocked() &&
364 mouse_lock_tab_->web_contents()) {
365 WebContents* web_contents = mouse_lock_tab_->web_contents();
366 if (web_contents && web_contents->GetRenderViewHost() &&
367 web_contents->GetRenderViewHost()->GetView())
368 web_contents->GetRenderViewHost()->GetView()->UnlockMouse();
369 }
370
371 window_->UpdateFullscreenExitBubbleContent(url, bubble_type);
309 } 372 }
310 373
311 void FullscreenController::NotifyFullscreenChange() { 374 void FullscreenController::NotifyFullscreenChange() {
312 content::NotificationService::current()->Notify( 375 content::NotificationService::current()->Notify(
313 chrome::NOTIFICATION_FULLSCREEN_CHANGED, 376 chrome::NOTIFICATION_FULLSCREEN_CHANGED,
314 content::Source<FullscreenController>(this), 377 content::Source<FullscreenController>(this),
315 content::NotificationService::NoDetails()); 378 content::NotificationService::NoDetails());
316 } 379 }
317 380
381 void FullscreenController::NotifyMouseLockChange() {
382 content::NotificationService::current()->Notify(
383 chrome::NOTIFICATION_MOUSE_LOCK_CHANGED,
384 content::Source<FullscreenController>(this),
385 content::NotificationService::NoDetails());
386 }
387
318 FullscreenExitBubbleType FullscreenController::GetFullscreenExitBubbleType() 388 FullscreenExitBubbleType FullscreenController::GetFullscreenExitBubbleType()
319 const { 389 const {
320 if (!fullscreened_tab_) { 390 // In kiosk mode we always want to be fullscreen and do not want to show
321 DCHECK_EQ(MOUSELOCK_NOT_REQUESTED, mouse_lock_state_); 391 // exit instructions for browser mode fullscreen.
322 return !extension_caused_fullscreen_.is_empty() ? 392 bool kiosk = false;
323 FEB_TYPE_BROWSER_EXTENSION_FULLSCREEN_EXIT_INSTRUCTION : 393 #if !defined(OS_MACOSX) // Kiosk mode not available on Mac.
324 FEB_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION; 394 kiosk = CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode);
395 #endif
396
397 if (fullscreened_tab_) {
398 if (tab_fullscreen_accepted_) {
399 if (IsMouseLocked()) {
400 return FEB_TYPE_FULLSCREEN_MOUSELOCK_EXIT_INSTRUCTION;
401 } else if (IsMouseLockRequested()) {
402 return FEB_TYPE_MOUSELOCK_BUTTONS;
403 } else {
404 return FEB_TYPE_FULLSCREEN_EXIT_INSTRUCTION;
405 }
406 } else { // Full screen not yet accepted.
407 if (IsMouseLockRequested()) {
408 return FEB_TYPE_FULLSCREEN_MOUSELOCK_BUTTONS;
409 } else {
410 return FEB_TYPE_FULLSCREEN_BUTTONS;
411 }
412 }
413 } else { // Not tab full screen.
414 if (IsMouseLocked()) {
415 return FEB_TYPE_MOUSELOCK_EXIT_INSTRUCTION;
416 } else if (IsMouseLockRequested()) {
417 return FEB_TYPE_MOUSELOCK_BUTTONS;
418 } else {
419 if (!extension_caused_fullscreen_.is_empty()) {
420 return FEB_TYPE_BROWSER_EXTENSION_FULLSCREEN_EXIT_INSTRUCTION;
421 } else if (toggled_into_fullscreen_ && !kiosk) {
422 return FEB_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION;
423 } else {
424 return FEB_TYPE_NONE;
425 }
426 }
325 } 427 }
326 if (fullscreened_tab_ && !tab_fullscreen_accepted_) { 428 NOTREACHED();
327 DCHECK_NE(MOUSELOCK_ACCEPTED, mouse_lock_state_); 429 return FEB_TYPE_NONE;
328 return mouse_lock_state_ == MOUSELOCK_REQUESTED ?
329 FEB_TYPE_FULLSCREEN_MOUSELOCK_BUTTONS : FEB_TYPE_FULLSCREEN_BUTTONS;
330 }
331 if (mouse_lock_state_ == MOUSELOCK_REQUESTED)
332 return FEB_TYPE_MOUSELOCK_BUTTONS;
333 return mouse_lock_state_ == MOUSELOCK_ACCEPTED ?
334 FEB_TYPE_FULLSCREEN_MOUSELOCK_EXIT_INSTRUCTION :
335 FEB_TYPE_FULLSCREEN_EXIT_INSTRUCTION;
336 } 430 }
337 431
338 ContentSetting 432 ContentSetting
339 FullscreenController::GetFullscreenSetting(const GURL& url) const { 433 FullscreenController::GetFullscreenSetting(const GURL& url) const {
340 if (url.SchemeIsFile()) 434 if (url.SchemeIsFile())
341 return CONTENT_SETTING_ALLOW; 435 return CONTENT_SETTING_ALLOW;
342 436
343 return profile_->GetHostContentSettingsMap()->GetContentSetting(url, url, 437 return profile_->GetHostContentSettingsMap()->GetContentSetting(url, url,
344 CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string()); 438 CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string());
345 439
346 } 440 }
347 441
348 ContentSetting 442 ContentSetting
349 FullscreenController::GetMouseLockSetting(const GURL& url) const { 443 FullscreenController::GetMouseLockSetting(const GURL& url) const {
350 if (url.SchemeIsFile()) 444 if (url.SchemeIsFile())
351 return CONTENT_SETTING_ALLOW; 445 return CONTENT_SETTING_ALLOW;
352 446
353 HostContentSettingsMap* settings_map = profile_->GetHostContentSettingsMap(); 447 HostContentSettingsMap* settings_map = profile_->GetHostContentSettingsMap();
354 return settings_map->GetContentSetting(url, url, 448 return settings_map->GetContentSetting(url, url,
355 CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string()); 449 CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string());
356 } 450 }
357 451
358 #if defined(OS_MACOSX) 452 #if defined(OS_MACOSX)
359 void FullscreenController::TogglePresentationModeInternal(bool for_tab) { 453 void FullscreenController::TogglePresentationModeInternal(bool for_tab) {
360 bool entering_fullscreen = !window_->InPresentationMode(); 454 toggled_into_fullscreen_ = !window_->InPresentationMode();
361 GURL url; 455 GURL url;
362 if (for_tab) { 456 if (for_tab) {
363 url = browser_->GetSelectedWebContents()->GetURL(); 457 url = browser_->GetSelectedWebContents()->GetURL();
364 tab_fullscreen_accepted_ = entering_fullscreen && 458 tab_fullscreen_accepted_ = toggled_into_fullscreen_ &&
365 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW; 459 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
366 } 460 }
367 if (entering_fullscreen) 461 if (toggled_into_fullscreen_)
368 window_->EnterPresentationMode(url, GetFullscreenExitBubbleType()); 462 window_->EnterPresentationMode(url, GetFullscreenExitBubbleType());
369 else 463 else
370 window_->ExitPresentationMode(); 464 window_->ExitPresentationMode();
465 UpdateFullscreenExitBubbleContent();
371 466
372 // WindowFullscreenStateChanged will be called by BrowserWindowController 467 // WindowFullscreenStateChanged will be called by BrowserWindowController
373 // when the transition completes. 468 // when the transition completes.
374 } 469 }
375 #endif 470 #endif
376 471
377 // TODO(koz): Change |for_tab| to an enum. 472 // TODO(koz): Change |for_tab| to an enum.
378 void FullscreenController::ToggleFullscreenModeInternal(bool for_tab) { 473 void FullscreenController::ToggleFullscreenModeInternal(bool for_tab) {
379 bool entering_fullscreen = !window_->IsFullscreen(); 474 toggled_into_fullscreen_ = !window_->IsFullscreen();
380 475
381 #if !defined(OS_MACOSX) 476 // In kiosk mode, we always want to be fullscreen. When the browser first
382 // In kiosk mode, we always want to be fullscreen. When the browser first 477 // starts we're not yet fullscreen, so let the initial toggle go through.
383 // starts we're not yet fullscreen, so let the initial toggle go through. 478 #if !defined(OS_MACOSX) // Kiosk mode not available on Mac.
384 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode) && 479 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode) &&
385 window_->IsFullscreen()) 480 window_->IsFullscreen())
386 return; 481 return;
387 #endif 482 #endif
388 483
389 GURL url; 484 GURL url;
390 if (for_tab) { 485 if (for_tab) {
391 url = browser_->GetSelectedWebContents()->GetURL(); 486 url = browser_->GetSelectedWebContents()->GetURL();
392 tab_fullscreen_accepted_ = entering_fullscreen && 487 tab_fullscreen_accepted_ = toggled_into_fullscreen_ &&
393 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW; 488 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
394 } else { 489 } else {
395 if (!extension_caused_fullscreen_.is_empty()) 490 if (!extension_caused_fullscreen_.is_empty())
396 url = extension_caused_fullscreen_; 491 url = extension_caused_fullscreen_;
397 content::RecordAction(UserMetricsAction("ToggleFullscreen")); 492 content::RecordAction(UserMetricsAction("ToggleFullscreen"));
398 } 493 }
399 if (entering_fullscreen) { 494 if (toggled_into_fullscreen_) {
400 window_->EnterFullscreen(url, GetFullscreenExitBubbleType()); 495 window_->EnterFullscreen(url, GetFullscreenExitBubbleType());
401 } else { 496 } else {
402 window_->ExitFullscreen(); 497 window_->ExitFullscreen();
403 extension_caused_fullscreen_ = GURL(); 498 extension_caused_fullscreen_ = GURL();
404 } 499 }
500 UpdateFullscreenExitBubbleContent();
405 501
406 // Once the window has become fullscreen it'll call back to 502 // Once the window has become fullscreen it'll call back to
407 // WindowFullscreenStateChanged(). We don't do this immediately as 503 // WindowFullscreenStateChanged(). We don't do this immediately as
408 // BrowserWindow::EnterFullscreen() asks for bookmark_bar_state_, so we let 504 // BrowserWindow::EnterFullscreen() asks for bookmark_bar_state_, so we let
409 // the BrowserWindow invoke WindowFullscreenStateChanged when appropriate. 505 // the BrowserWindow invoke WindowFullscreenStateChanged when appropriate.
410 } 506 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698