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

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

Issue 9353010: Add FullscreenController::ToggleFullscreenModeWithExtension (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix method defenition ordering, add comment Created 8 years, 10 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 "content/browser/renderer_host/render_view_host.h" 19 #include "content/browser/renderer_host/render_view_host.h"
19 #include "content/public/browser/notification_service.h" 20 #include "content/public/browser/notification_service.h"
20 #include "content/public/browser/user_metrics.h" 21 #include "content/public/browser/user_metrics.h"
21 #include "content/public/browser/web_contents.h" 22 #include "content/public/browser/web_contents.h"
22 23
23 using content::UserMetricsAction; 24 using content::UserMetricsAction;
24 using content::WebContents; 25 using content::WebContents;
25 26
26 FullscreenController::FullscreenController(BrowserWindow* window, 27 FullscreenController::FullscreenController(BrowserWindow* window,
27 Profile* profile, 28 Profile* profile,
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 in_browser_or_tab_fullscreen_mode = window_->InPresentationMode(); 104 in_browser_or_tab_fullscreen_mode = window_->InPresentationMode();
104 #else 105 #else
105 in_browser_or_tab_fullscreen_mode = window_->IsFullscreen(); 106 in_browser_or_tab_fullscreen_mode = window_->IsFullscreen();
106 #endif 107 #endif
107 108
108 if (enter_fullscreen) { 109 if (enter_fullscreen) {
109 fullscreened_tab_ = TabContentsWrapper::GetCurrentWrapperForContents(tab); 110 fullscreened_tab_ = TabContentsWrapper::GetCurrentWrapperForContents(tab);
110 if (!in_browser_or_tab_fullscreen_mode) { 111 if (!in_browser_or_tab_fullscreen_mode) {
111 tab_caused_fullscreen_ = true; 112 tab_caused_fullscreen_ = true;
112 #if defined(OS_MACOSX) 113 #if defined(OS_MACOSX)
113 TogglePresentationMode(true); 114 TogglePresentationModeInternal(true);
114 #else 115 #else
115 ToggleFullscreenMode(true); 116 ToggleFullscreenModeInternal(true);
116 #endif 117 #endif
117 } else { 118 } else {
118 // We need to update the fullscreen exit bubble, e.g., going from browser 119 // We need to update the fullscreen exit bubble, e.g., going from browser
119 // fullscreen to tab fullscreen will need to show different content. 120 // fullscreen to tab fullscreen will need to show different content.
120 const GURL& url = tab->GetURL(); 121 const GURL& url = tab->GetURL();
121 if (!tab_fullscreen_accepted_) { 122 if (!tab_fullscreen_accepted_) {
122 tab_fullscreen_accepted_ = 123 tab_fullscreen_accepted_ =
123 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW; 124 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
124 } 125 }
125 UpdateFullscreenExitBubbleContent(); 126 UpdateFullscreenExitBubbleContent();
126 } 127 }
127 } else { 128 } else {
128 if (in_browser_or_tab_fullscreen_mode) { 129 if (in_browser_or_tab_fullscreen_mode) {
129 if (tab_caused_fullscreen_) { 130 if (tab_caused_fullscreen_) {
130 #if defined(OS_MACOSX) 131 #if defined(OS_MACOSX)
131 TogglePresentationMode(true); 132 TogglePresentationModeInternal(true);
132 #else 133 #else
133 ToggleFullscreenMode(true); 134 ToggleFullscreenModeInternal(true);
134 #endif 135 #endif
135 } else { 136 } else {
136 // If currently there is a tab in "tab fullscreen" mode and fullscreen 137 // If currently there is a tab in "tab fullscreen" mode and fullscreen
137 // was not caused by it (i.e., previously it was in "browser fullscreen" 138 // was not caused by it (i.e., previously it was in "browser fullscreen"
138 // mode), we need to switch back to "browser fullscreen" mode. In this 139 // mode), we need to switch back to "browser fullscreen" mode. In this
139 // case, all we have to do is notifying the tab that it has exited "tab 140 // case, all we have to do is notifying the tab that it has exited "tab
140 // fullscreen" mode. 141 // fullscreen" mode.
141 NotifyTabOfFullscreenExitIfNecessary(); 142 NotifyTabOfFullscreenExitIfNecessary();
142 } 143 }
143 } 144 }
144 } 145 }
145 } 146 }
146 147
147 #if defined(OS_MACOSX) 148 #if defined(OS_MACOSX)
148 void FullscreenController::TogglePresentationMode(bool for_tab) { 149 void FullscreenController::TogglePresentationMode() {
149 bool entering_fullscreen = !window_->InPresentationMode(); 150 TogglePresentationModeInternal(false);
150 GURL url;
151 if (for_tab) {
152 url = browser_->GetSelectedWebContents()->GetURL();
153 tab_fullscreen_accepted_ = entering_fullscreen &&
154 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
155 }
156 if (entering_fullscreen)
157 window_->EnterPresentationMode(url, GetFullscreenExitBubbleType());
158 else
159 window_->ExitPresentationMode();
160 WindowFullscreenStateChanged();
161 } 151 }
162 #endif 152 #endif
163 153
164 // TODO(koz): Change |for_tab| to an enum. 154 void FullscreenController::ToggleFullscreenMode() {
165 void FullscreenController::ToggleFullscreenMode(bool for_tab) { 155 extension_caused_fullscreen_ = NULL;
166 bool entering_fullscreen = !window_->IsFullscreen(); 156 ToggleFullscreenModeInternal(false);
157 }
167 158
168 #if !defined(OS_MACOSX) 159 void FullscreenController::ToggleFullscreenModeWithExtension(
169 // In kiosk mode, we always want to be fullscreen. When the browser first 160 const Extension& extension) {
170 // starts we're not yet fullscreen, so let the initial toggle go through. 161 extension_caused_fullscreen_ = &extension;
yzshen1 2012/02/10 21:24:49 [nit, optional] Please comment that if this causes
hashimoto 2012/02/13 07:43:44 Done.
171 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode) && 162 ToggleFullscreenModeInternal(false);
172 window_->IsFullscreen())
173 return;
174 #endif
175
176 GURL url;
177 if (for_tab) {
178 url = browser_->GetSelectedWebContents()->GetURL();
179 tab_fullscreen_accepted_ = entering_fullscreen &&
180 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
181 } else {
182 content::RecordAction(UserMetricsAction("ToggleFullscreen"));
183 }
184 if (entering_fullscreen)
185 window_->EnterFullscreen(url, GetFullscreenExitBubbleType());
186 else
187 window_->ExitFullscreen();
188
189 // Once the window has become fullscreen it'll call back to
190 // WindowFullscreenStateChanged(). We don't do this immediately as
191 // BrowserWindow::EnterFullscreen() asks for bookmark_bar_state_, so we let
192 // the BrowserWindow invoke WindowFullscreenStateChanged when appropriate.
193
194 // TODO: convert mac to invoke WindowFullscreenStateChanged once it updates
195 // the necessary state of the frame.
196 #if defined(OS_MACOSX)
197 WindowFullscreenStateChanged();
198 #endif
199 } 163 }
200 164
201 void FullscreenController::LostMouseLock() { 165 void FullscreenController::LostMouseLock() {
202 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; 166 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
203 UpdateFullscreenExitBubbleContent(); 167 UpdateFullscreenExitBubbleContent();
204 } 168 }
205 169
206 void FullscreenController::OnTabClosing(WebContents* web_contents) { 170 void FullscreenController::OnTabClosing(WebContents* web_contents) {
207 if (IsFullscreenForTab(web_contents)) { 171 if (IsFullscreenForTab(web_contents)) {
208 ExitTabbedFullscreenModeIfNecessary(); 172 ExitTabbedFullscreenModeIfNecessary();
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 fullscreened_tab_ = NULL; 271 fullscreened_tab_ = NULL;
308 tab_caused_fullscreen_ = false; 272 tab_caused_fullscreen_ = false;
309 tab_fullscreen_accepted_ = false; 273 tab_fullscreen_accepted_ = false;
310 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; 274 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
311 275
312 UpdateFullscreenExitBubbleContent(); 276 UpdateFullscreenExitBubbleContent();
313 } 277 }
314 278
315 void FullscreenController::ExitTabbedFullscreenModeIfNecessary() { 279 void FullscreenController::ExitTabbedFullscreenModeIfNecessary() {
316 if (tab_caused_fullscreen_) 280 if (tab_caused_fullscreen_)
317 ToggleFullscreenMode(false); 281 ToggleFullscreenMode();
318 else 282 else
319 NotifyTabOfFullscreenExitIfNecessary(); 283 NotifyTabOfFullscreenExitIfNecessary();
320 } 284 }
321 285
322 void FullscreenController::UpdateFullscreenExitBubbleContent() { 286 void FullscreenController::UpdateFullscreenExitBubbleContent() {
323 GURL url; 287 GURL url;
324 if (fullscreened_tab_) 288 if (fullscreened_tab_)
325 url = fullscreened_tab_->web_contents()->GetURL(); 289 url = fullscreened_tab_->web_contents()->GetURL();
290 else if (extension_caused_fullscreen_)
291 url = extension_caused_fullscreen_->url();
yzshen1 2012/02/10 21:24:49 What is the lifespan of extension_caused_fullscree
hashimoto 2012/02/13 07:43:44 Good point, thank you for pointing this out. If th
yzshen1 2012/02/13 18:38:48 It seems fine to me. Just out of curiosity: Accor
326 292
327 window_->UpdateFullscreenExitBubbleContent(url, 293 window_->UpdateFullscreenExitBubbleContent(url,
328 GetFullscreenExitBubbleType()); 294 GetFullscreenExitBubbleType());
329 } 295 }
330 296
331 void FullscreenController::NotifyFullscreenChange() { 297 void FullscreenController::NotifyFullscreenChange() {
332 content::NotificationService::current()->Notify( 298 content::NotificationService::current()->Notify(
333 chrome::NOTIFICATION_FULLSCREEN_CHANGED, 299 chrome::NOTIFICATION_FULLSCREEN_CHANGED,
334 content::Source<FullscreenController>(this), 300 content::Source<FullscreenController>(this),
335 content::NotificationService::NoDetails()); 301 content::NotificationService::NoDetails());
336 } 302 }
337 303
338 FullscreenExitBubbleType 304 FullscreenExitBubbleType FullscreenController::GetFullscreenExitBubbleType()
339 FullscreenController::GetFullscreenExitBubbleType() const { 305 const {
340 if (!fullscreened_tab_) { 306 if (!fullscreened_tab_) {
341 DCHECK_EQ(MOUSELOCK_NOT_REQUESTED, mouse_lock_state_); 307 DCHECK_EQ(MOUSELOCK_NOT_REQUESTED, mouse_lock_state_);
342 return FEB_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION; 308 return extension_caused_fullscreen_ ?
309 FEB_TYPE_BROWSER_EXTENSION_FULLSCREEN_EXIT_INSTRUCTION :
310 FEB_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION;
343 } 311 }
344 if (fullscreened_tab_ && !tab_fullscreen_accepted_) { 312 if (fullscreened_tab_ && !tab_fullscreen_accepted_) {
345 DCHECK_NE(MOUSELOCK_ACCEPTED, mouse_lock_state_); 313 DCHECK_NE(MOUSELOCK_ACCEPTED, mouse_lock_state_);
346 return mouse_lock_state_ == MOUSELOCK_REQUESTED ? 314 return mouse_lock_state_ == MOUSELOCK_REQUESTED ?
347 FEB_TYPE_FULLSCREEN_MOUSELOCK_BUTTONS : FEB_TYPE_FULLSCREEN_BUTTONS; 315 FEB_TYPE_FULLSCREEN_MOUSELOCK_BUTTONS : FEB_TYPE_FULLSCREEN_BUTTONS;
348 } 316 }
349 if (mouse_lock_state_ == MOUSELOCK_REQUESTED) 317 if (mouse_lock_state_ == MOUSELOCK_REQUESTED)
350 return FEB_TYPE_MOUSELOCK_BUTTONS; 318 return FEB_TYPE_MOUSELOCK_BUTTONS;
351 return mouse_lock_state_ == MOUSELOCK_ACCEPTED ? 319 return mouse_lock_state_ == MOUSELOCK_ACCEPTED ?
352 FEB_TYPE_FULLSCREEN_MOUSELOCK_EXIT_INSTRUCTION : 320 FEB_TYPE_FULLSCREEN_MOUSELOCK_EXIT_INSTRUCTION :
(...skipping 12 matching lines...) Expand all
365 333
366 ContentSetting 334 ContentSetting
367 FullscreenController::GetMouseLockSetting(const GURL& url) const { 335 FullscreenController::GetMouseLockSetting(const GURL& url) const {
368 if (url.SchemeIsFile()) 336 if (url.SchemeIsFile())
369 return CONTENT_SETTING_ALLOW; 337 return CONTENT_SETTING_ALLOW;
370 338
371 HostContentSettingsMap* settings_map = profile_->GetHostContentSettingsMap(); 339 HostContentSettingsMap* settings_map = profile_->GetHostContentSettingsMap();
372 return settings_map->GetContentSetting(url, url, 340 return settings_map->GetContentSetting(url, url,
373 CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string()); 341 CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string());
374 } 342 }
343
344 #if defined(OS_MACOSX)
345 void FullscreenController::TogglePresentationModeInternal(bool for_tab) {
346 bool entering_fullscreen = !window_->InPresentationMode();
347 GURL url;
348 if (for_tab) {
349 url = browser_->GetSelectedWebContents()->GetURL();
350 tab_fullscreen_accepted_ = entering_fullscreen &&
351 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
352 }
353 if (entering_fullscreen)
354 window_->EnterPresentationMode(url, GetFullscreenExitBubbleType());
355 else
356 window_->ExitPresentationMode();
357 WindowFullscreenStateChanged();
358 }
359 #endif
360
361 // TODO(koz): Change |for_tab| to an enum.
362 void FullscreenController::ToggleFullscreenModeInternal(bool for_tab) {
363 bool entering_fullscreen = !window_->IsFullscreen();
364
365 #if !defined(OS_MACOSX)
366 // In kiosk mode, we always want to be fullscreen. When the browser first
367 // starts we're not yet fullscreen, so let the initial toggle go through.
368 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode) &&
369 window_->IsFullscreen())
370 return;
371 #endif
372
373 GURL url;
374 if (for_tab) {
375 url = browser_->GetSelectedWebContents()->GetURL();
376 tab_fullscreen_accepted_ = entering_fullscreen &&
377 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
378 } else {
379 if (extension_caused_fullscreen_)
380 url = extension_caused_fullscreen_->url();
381 content::RecordAction(UserMetricsAction("ToggleFullscreen"));
382 }
383 if (entering_fullscreen) {
384 window_->EnterFullscreen(url, GetFullscreenExitBubbleType());
385 } else {
386 window_->ExitFullscreen();
387 extension_caused_fullscreen_ = NULL;
388 }
389
390 // Once the window has become fullscreen it'll call back to
391 // WindowFullscreenStateChanged(). We don't do this immediately as
392 // BrowserWindow::EnterFullscreen() asks for bookmark_bar_state_, so we let
393 // the BrowserWindow invoke WindowFullscreenStateChanged when appropriate.
394
395 // TODO: convert mac to invoke WindowFullscreenStateChanged once it updates
396 // the necessary state of the frame.
397 #if defined(OS_MACOSX)
398 WindowFullscreenStateChanged();
399 #endif
400 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/fullscreen_controller.h ('k') | chrome/browser/ui/fullscreen_exit_bubble_type.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698