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

Unified Diff: chrome/browser/ui/browser.cc

Issue 8423035: Split out fullscreen logic from Browser into FullscreenController. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/browser.cc
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index feb12336137346185cf985c96cfc4ce700ea3af7..3f65a096c3a2f3558b083b1138d56e7ddac98cbc 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -316,10 +316,6 @@ Browser::Browser(Type type, Profile* profile)
synced_window_delegate_(
new BrowserSyncedWindowDelegate(this))),
bookmark_bar_state_(BookmarkBar::HIDDEN),
- fullscreened_tab_(NULL),
- tab_caused_fullscreen_(false),
- tab_fullscreen_accepted_(false),
- mouse_lock_state_(MOUSELOCK_NOT_REQUESTED),
window_has_shown_(false) {
registrar_.Add(this, content::NOTIFICATION_SSL_VISIBLE_STATE_CHANGED,
content::NotificationService::AllSources());
@@ -434,6 +430,10 @@ Browser::~Browser() {
TabRestoreServiceDestroyed(tab_restore_service_);
}
+bool Browser::IsFullscreenForTab() const {
+ return fullscreen_controller_->IsFullscreenForTab();
+}
+
// static
Browser* Browser::Create(Profile* profile) {
Browser* browser = new Browser(TYPE_TABBED, profile);
@@ -508,6 +508,7 @@ void Browser::InitBrowserWindow() {
DCHECK(!window_);
window_ = CreateBrowserWindow();
+ fullscreen_controller_ = new FullscreenController(window_, profile_, this);
#if defined(OS_WIN) && !defined(USE_AURA)
{
@@ -1374,26 +1375,7 @@ void Browser::ShowSingletonTabOverwritingNTP(
}
void Browser::WindowFullscreenStateChanged() {
- UpdateCommandsForFullscreenMode(window_->IsFullscreen());
- UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TOGGLE_FULLSCREEN);
- MessageLoop::current()->PostTask(
- FROM_HERE, method_factory_.NewRunnableMethod(
- &Browser::NotifyFullscreenChange));
- bool notify_tab_of_exit;
-#if defined(OS_MACOSX)
- notify_tab_of_exit = !window_->InPresentationMode();
-#else
- notify_tab_of_exit = !window_->IsFullscreen();
-#endif
- if (notify_tab_of_exit)
- NotifyTabOfFullscreenExitIfNecessary();
-}
-
-void Browser::NotifyFullscreenChange() {
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_FULLSCREEN_CHANGED,
- content::Source<Browser>(this),
- content::NotificationService::NoDetails());
+ fullscreen_controller_->WindowFullscreenStateChanged();
}
///////////////////////////////////////////////////////////////////////////////
@@ -1734,69 +1716,12 @@ void Browser::ConvertPopupToTabbedBrowser() {
// TODO(koz): Change |for_tab| to an enum.
void Browser::ToggleFullscreenMode(bool for_tab) {
- bool entering_fullscreen = !window_->IsFullscreen();
-
-#if !defined(OS_MACOSX)
- // In kiosk mode, we always want to be fullscreen. When the browser first
- // starts we're not yet fullscreen, so let the initial toggle go through.
- if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode) &&
- window_->IsFullscreen())
- return;
-#endif
-
- GURL url;
- if (for_tab) {
- url = GetSelectedTabContents()->GetURL();
- tab_fullscreen_accepted_ = entering_fullscreen &&
- GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
- } else {
- UserMetrics::RecordAction(UserMetricsAction("ToggleFullscreen"));
- }
- if (entering_fullscreen)
- window_->EnterFullscreen(url, GetFullscreenExitBubbleType());
- else
- window_->ExitFullscreen();
-
- // Once the window has become fullscreen it'll call back to
- // WindowFullscreenStateChanged(). We don't do this immediately as
- // BrowserWindow::EnterFullscreen() asks for bookmark_bar_state_, so we let
- // the BrowserWindow invoke WindowFullscreenStateChanged when appropriate.
-
- // TODO: convert mac to invoke WindowFullscreenStateChanged once it updates
- // the necessary state of the frame.
-#if defined(OS_MACOSX)
- WindowFullscreenStateChanged();
-#endif
-}
-
-void Browser::NotifyTabOfFullscreenExitIfNecessary() {
- if (fullscreened_tab_)
- fullscreened_tab_->ExitFullscreenMode();
- else
- DCHECK_EQ(mouse_lock_state_, MOUSELOCK_NOT_REQUESTED);
-
- fullscreened_tab_ = NULL;
- tab_caused_fullscreen_ = false;
- tab_fullscreen_accepted_ = false;
- mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
-
- UpdateFullscreenExitBubbleContent();
+ fullscreen_controller_->ToggleFullscreenMode(for_tab);
}
#if defined(OS_MACOSX)
void Browser::TogglePresentationMode(bool for_tab) {
- bool entering_fullscreen = !window_->InPresentationMode();
- GURL url;
- if (for_tab) {
- url = GetSelectedTabContents()->GetURL();
- tab_fullscreen_accepted_ = entering_fullscreen &&
- GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
- }
- if (entering_fullscreen)
- window_->EnterPresentationMode(url, GetFullscreenExitBubbleType());
- else
- window_->ExitPresentationMode();
- WindowFullscreenStateChanged();
+ fullscreen_controller_->TogglePresentationMode(for_tab);
}
#endif
@@ -3243,15 +3168,7 @@ void Browser::TabInsertedAt(TabContentsWrapper* contents,
void Browser::TabClosingAt(TabStripModel* tab_strip_model,
TabContentsWrapper* contents,
int index) {
- if (fullscreened_tab_ == contents) {
- ExitTabbedFullscreenModeIfNecessary();
- // The call to exit fullscreen may result in asynchronous notification of
- // fullscreen state change (e.g., on Linux). We don't want to rely on it
- // to call NotifyTabOfFullscreenExitIfNecessary(), because at that point
- // |fullscreen_tab_| may not be valid. Instead, we call it here to clean up
- // tab fullscreen related state.
- NotifyTabOfFullscreenExitIfNecessary();
- }
+ fullscreen_controller_->OnTabClosing(contents->tab_contents());
content::NotificationService::current()->Notify(
content::NOTIFICATION_TAB_CLOSING,
content::Source<NavigationController>(&contents->controller()),
@@ -3266,8 +3183,7 @@ void Browser::TabDetachedAt(TabContentsWrapper* contents, int index) {
}
void Browser::TabDeactivated(TabContentsWrapper* contents) {
- if (contents == fullscreened_tab_)
- ExitTabbedFullscreenModeIfNecessary();
+ fullscreen_controller_->OnTabDeactivated(contents);
if (instant())
instant()->Hide();
@@ -3790,8 +3706,8 @@ bool Browser::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
bool* is_keyboard_shortcut) {
// Escape exits tabbed fullscreen mode.
// TODO(koz): Write a test for this http://crbug.com/100441.
- if (event.windowsKeyCode == 27 && fullscreened_tab_) {
- ExitTabbedFullscreenModeIfNecessary();
+ if (event.windowsKeyCode == 27 &&
+ fullscreen_controller_->HandleUserPressedEscape()) {
return true;
}
return window()->PreHandleKeyboardEvent(event, is_keyboard_shortcut);
@@ -3894,64 +3810,12 @@ void Browser::EnumerateDirectory(TabContents* tab, int request_id,
}
void Browser::ToggleFullscreenModeForTab(TabContents* tab,
- bool enter_fullscreen) {
- if (tab != GetSelectedTabContents())
- return;
-
- bool in_browser_or_tab_fullscreen_mode;
-#if defined(OS_MACOSX)
- in_browser_or_tab_fullscreen_mode = window_->InPresentationMode();
-#else
- in_browser_or_tab_fullscreen_mode = window_->IsFullscreen();
-#endif
-
- if (enter_fullscreen) {
- fullscreened_tab_ = TabContentsWrapper::GetCurrentWrapperForContents(tab);
- if (!in_browser_or_tab_fullscreen_mode) {
- tab_caused_fullscreen_ = true;
-#if defined(OS_MACOSX)
- TogglePresentationMode(true);
-#else
- ToggleFullscreenMode(true);
-#endif
- } else {
- // We need to update the fullscreen exit bubble, e.g., going from browser
- // fullscreen to tab fullscreen will need to show different content.
- const GURL& url = tab->GetURL();
- if (!tab_fullscreen_accepted_) {
- tab_fullscreen_accepted_ =
- GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
- }
- UpdateFullscreenExitBubbleContent();
- }
- } else {
- if (in_browser_or_tab_fullscreen_mode) {
- if (tab_caused_fullscreen_) {
-#if defined(OS_MACOSX)
- TogglePresentationMode(true);
-#else
- ToggleFullscreenMode(true);
-#endif
- } else {
- // If currently there is a tab in "tab fullscreen" mode and fullscreen
- // was not caused by it (i.e., previously it was in "browser fullscreen"
- // mode), we need to switch back to "browser fullscreen" mode. In this
- // case, all we have to do is notifying the tab that it has exited "tab
- // fullscreen" mode.
- NotifyTabOfFullscreenExitIfNecessary();
- }
- }
- }
+ bool enter_fullscreen) {
+ fullscreen_controller_->ToggleFullscreenModeForTab(tab, enter_fullscreen);
}
bool Browser::IsFullscreenForTab(const TabContents* tab) const {
- const TabContentsWrapper* wrapper =
- TabContentsWrapper::GetCurrentWrapperForContents(tab);
- bool result = wrapper && wrapper == fullscreened_tab_;
- DCHECK(!result || tab == GetSelectedTabContents());
- DCHECK(!result || window_->IsFullscreen());
-
- return result;
+ return fullscreen_controller_->IsFullscreenForTab(tab);
}
void Browser::JSOutOfMemory(TabContents* tab) {
@@ -4004,122 +3868,29 @@ void Browser::CrashedPlugin(TabContents* tab, const FilePath& plugin_path) {
CrashedPluginHelper(tab, plugin_path);
}
-void Browser::ExitTabbedFullscreenModeIfNecessary() {
- if (tab_caused_fullscreen_)
- ToggleFullscreenMode(false);
- else
- NotifyTabOfFullscreenExitIfNecessary();
-}
-
void Browser::UpdatePreferredSize(TabContents* source,
const gfx::Size& pref_size) {
window_->UpdatePreferredSize(source, pref_size);
}
void Browser::RequestToLockMouse(TabContents* tab) {
- // Mouse Lock is only permitted when browser is in tab fullscreen.
- if (!IsFullscreenForTab(tab)) {
- tab->GotResponseToLockMouseRequest(false);
- return;
- }
-
- if (mouse_lock_state_ == MOUSELOCK_ACCEPTED) {
- tab->GotResponseToLockMouseRequest(true);
- return;
- }
-
- switch (GetMouseLockSetting(tab->GetURL())) {
- case CONTENT_SETTING_ALLOW:
- mouse_lock_state_ = MOUSELOCK_ACCEPTED;
- tab->GotResponseToLockMouseRequest(true);
- break;
- case CONTENT_SETTING_BLOCK:
- mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
- tab->GotResponseToLockMouseRequest(false);
- break;
- case CONTENT_SETTING_ASK:
- mouse_lock_state_ = MOUSELOCK_REQUESTED;
- break;
- default:
- NOTREACHED();
- }
- UpdateFullscreenExitBubbleContent();
+ fullscreen_controller_->RequestToLockMouse(tab);
}
void Browser::LostMouseLock() {
- mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
- UpdateFullscreenExitBubbleContent();
+ fullscreen_controller_->LostMouseLock();
}
void Browser::OnAcceptFullscreenPermission(
const GURL& url,
FullscreenExitBubbleType bubble_type) {
- bool mouse_lock = false;
- bool fullscreen = false;
- fullscreen_bubble::PermissionRequestedByType(bubble_type, &fullscreen,
- &mouse_lock);
- DCHECK(fullscreened_tab_);
- DCHECK_NE(tab_fullscreen_accepted_, fullscreen);
-
- HostContentSettingsMap* settings_map =
- profile()->GetHostContentSettingsMap();
- if (mouse_lock) {
- DCHECK_EQ(mouse_lock_state_, MOUSELOCK_REQUESTED);
- settings_map->SetContentSetting(
- ContentSettingsPattern::FromURL(url),
- ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_MOUSELOCK,
- std::string(), CONTENT_SETTING_ALLOW);
- mouse_lock_state_ =
- fullscreened_tab_->tab_contents()->GotResponseToLockMouseRequest(true) ?
- MOUSELOCK_ACCEPTED : MOUSELOCK_NOT_REQUESTED;
- }
- if (!tab_fullscreen_accepted_) {
- settings_map->SetContentSetting(
- ContentSettingsPattern::FromURL(url),
- ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_FULLSCREEN,
- std::string(), CONTENT_SETTING_ALLOW);
- tab_fullscreen_accepted_ = true;
- }
- UpdateFullscreenExitBubbleContent();
+ fullscreen_controller_->OnAcceptFullscreenPermission(url, bubble_type);
}
void Browser::OnDenyFullscreenPermission(FullscreenExitBubbleType bubble_type) {
- bool mouse_lock = false;
- bool fullscreen = false;
- fullscreen_bubble::PermissionRequestedByType(bubble_type, &fullscreen,
- &mouse_lock);
- DCHECK(fullscreened_tab_);
- DCHECK_NE(tab_fullscreen_accepted_, fullscreen);
-
- if (mouse_lock) {
- DCHECK_EQ(mouse_lock_state_, MOUSELOCK_REQUESTED);
- mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
- fullscreened_tab_->tab_contents()->GotResponseToLockMouseRequest(false);
- if (!fullscreen)
- UpdateFullscreenExitBubbleContent();
- }
-
- if (fullscreen)
- ExitTabbedFullscreenModeIfNecessary();
+ fullscreen_controller_->OnDenyFullscreenPermission(bubble_type);
}
-ContentSetting Browser::GetFullscreenSetting(const GURL& url) {
- if (url.SchemeIsFile())
- return CONTENT_SETTING_ALLOW;
-
- HostContentSettingsMap* settings_map = profile()->GetHostContentSettingsMap();
- return settings_map->GetContentSetting(url, url,
- CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string());
-}
-
-ContentSetting Browser::GetMouseLockSetting(const GURL& url) {
- if (url.SchemeIsFile())
- return CONTENT_SETTING_ALLOW;
-
- HostContentSettingsMap* settings_map = profile()->GetHostContentSettingsMap();
- return settings_map->GetContentSetting(url, url,
- CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string());
-}
///////////////////////////////////////////////////////////////////////////////
// Browser, TabContentsWrapperDelegate implementation:
@@ -4364,6 +4135,11 @@ void Browser::Observe(int type,
UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE);
break;
+ case chrome::NOTIFICATION_FULLSCREEN_CHANGED:
+ UpdateCommandsForFullscreenMode(window_->IsFullscreen());
+ UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TOGGLE_FULLSCREEN);
+ break;
+
default:
NOTREACHED() << "Got a notification we didn't register for.";
}
@@ -5503,31 +5279,3 @@ void Browser::OnWindowDidShow() {
}
}
}
-
-FullscreenExitBubbleType Browser::GetFullscreenExitBubbleType() const {
- bool tab_fullscreen_requested =
- fullscreened_tab_ && !tab_fullscreen_accepted_;
- if (!tab_fullscreen_requested && !tab_fullscreen_accepted_) {
- DCHECK_EQ(mouse_lock_state_, MOUSELOCK_NOT_REQUESTED);
- return FEB_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION;
- }
- if (tab_fullscreen_requested) {
- DCHECK_NE(mouse_lock_state_, MOUSELOCK_ACCEPTED);
- return mouse_lock_state_ == MOUSELOCK_REQUESTED ?
- FEB_TYPE_FULLSCREEN_MOUSELOCK_BUTTONS : FEB_TYPE_FULLSCREEN_BUTTONS;
- }
- if (mouse_lock_state_ == MOUSELOCK_REQUESTED)
- return FEB_TYPE_MOUSELOCK_BUTTONS;
- return mouse_lock_state_ == MOUSELOCK_ACCEPTED ?
- FEB_TYPE_FULLSCREEN_MOUSELOCK_EXIT_INSTRUCTION :
- FEB_TYPE_FULLSCREEN_EXIT_INSTRUCTION;
-}
-
-void Browser::UpdateFullscreenExitBubbleContent() {
- GURL url;
- if (fullscreened_tab_)
- url = fullscreened_tab_->tab_contents()->GetURL();
-
- window_->UpdateFullscreenExitBubbleContent(
- url, GetFullscreenExitBubbleType());
-}

Powered by Google App Engine
This is Rietveld 408576698