| 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());
|
| -}
|
|
|