diff options
author | yzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-18 04:25:55 +0000 |
---|---|---|
committer | yzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-18 04:25:55 +0000 |
commit | 5ef8e376b54fe7c38dcf3bae8219b3cabae7597c (patch) | |
tree | 81a33f2f841883e0311862843a3ad7eb77344a6c /chrome | |
parent | 1e18b494aa66ba8e099ce46a823291267f7b7646 (diff) | |
download | chromium_src-5ef8e376b54fe7c38dcf3bae8219b3cabae7597c.zip chromium_src-5ef8e376b54fe7c38dcf3bae8219b3cabae7597c.tar.gz chromium_src-5ef8e376b54fe7c38dcf3bae8219b3cabae7597c.tar.bz2 |
Show mouse lock request and status in fullscreen bubble infobar.
This CL handles the (platform-independent) state transition.
BUG=95136,100266
TEST=None
Review URL: http://codereview.chromium.org/8274022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@106027 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/ui/browser.cc | 182 | ||||
-rw-r--r-- | chrome/browser/ui/browser.h | 30 | ||||
-rw-r--r-- | chrome/browser/ui/browser_browsertest.cc | 38 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm | 5 | ||||
-rw-r--r-- | chrome/browser/ui/fullscreen_exit_bubble.cc | 8 | ||||
-rw-r--r-- | chrome/browser/ui/tab_contents/tab_contents_wrapper.cc | 3 |
6 files changed, 216 insertions, 50 deletions
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 4e3b9f3..482cad2 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc @@ -290,6 +290,8 @@ Browser::Browser(Type type, Profile* profile) 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, NotificationService::AllSources()); @@ -1669,23 +1671,15 @@ void Browser::ToggleFullscreenMode(bool for_tab) { UserMetrics::RecordAction(UserMetricsAction("ToggleFullscreen")); GURL url; - bool ask_permission = false; if (for_tab) { url = GetSelectedTabContents()->GetURL(); - ask_permission = !url.SchemeIsFile() && - (GetFullscreenSetting(url) == CONTENT_SETTING_ASK); + tab_fullscreen_accepted_ = entering_fullscreen && + GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW; } - if (entering_fullscreen) { - FullscreenExitBubbleType type = - FEB_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION; - if (for_tab) { - type = ask_permission ? FEB_TYPE_FULLSCREEN_BUTTONS : - FEB_TYPE_FULLSCREEN_EXIT_INSTRUCTION; - } - window_->EnterFullscreen(url, type); - } else { + 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 @@ -1702,8 +1696,15 @@ void Browser::ToggleFullscreenMode(bool for_tab) { 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(); } #if defined(OS_MACOSX) @@ -1713,8 +1714,7 @@ void Browser::TogglePresentationMode(bool for_tab) { bool ask_permission = false; if (for_tab) { url = GetSelectedTabContents()->GetURL(); - ask_permission = !url.SchemeIsFile() && - (GetFullscreenSetting(url) == CONTENT_SETTING_ASK); + ask_permission = GetFullscreenSetting(url) != CONTENT_SETTING_ALLOW; } if (entering_fullscreen) { FullscreenExitBubbleType type = @@ -3832,30 +3832,49 @@ void Browser::ToggleFullscreenModeForTab(TabContents* tab, 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); - bool in_correct_mode_for_tab_fullscreen; + if (!in_browser_or_tab_fullscreen_mode) { + tab_caused_fullscreen_ = true; #if defined(OS_MACOSX) - in_correct_mode_for_tab_fullscreen = window_->InPresentationMode(); + TogglePresentationMode(true); #else - in_correct_mode_for_tab_fullscreen = window_->IsFullscreen(); + ToggleFullscreenMode(true); #endif - if (!in_correct_mode_for_tab_fullscreen) - tab_caused_fullscreen_ = true; - } - - if (tab_caused_fullscreen_) { + } 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); + TogglePresentationMode(true); #else - ToggleFullscreenMode(true); + ToggleFullscreenMode(true); #endif - } else if (!enter_fullscreen) { - // 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(); + } 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(); + } + } } } @@ -3930,20 +3949,77 @@ void Browser::UpdatePreferredSize(TabContents* source, window_->UpdatePreferredSize(source, pref_size); } -void Browser::OnAcceptFullscreenPermission(const GURL& url) { - HostContentSettingsMap* settings_map = profile()->GetHostContentSettingsMap(); +void Browser::RequestToLockMouse(TabContents* tab) { + if (!IsFullscreenForTab(tab)) { + tab->GotResponseToLockMouseRequest(false); + return; + } + + if (mouse_lock_state_ == MOUSELOCK_ACCEPTED) { + tab->GotResponseToLockMouseRequest(true); + } else { + mouse_lock_state_ = MOUSELOCK_REQUESTED; + UpdateFullscreenExitBubbleContent(); + } +} - settings_map->SetContentSetting( - ContentSettingsPattern::FromString(url.host()), - ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_FULLSCREEN, - std::string(), CONTENT_SETTING_ALLOW); +void Browser::LostMouseLock() { + mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; + UpdateFullscreenExitBubbleContent(); } -void Browser::OnDenyFullscreenPermission() { - ExitTabbedFullscreenModeIfNecessary(); +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); + + if (mouse_lock) { + DCHECK_EQ(mouse_lock_state_, MOUSELOCK_REQUESTED); + mouse_lock_state_ = + fullscreened_tab_->tab_contents()->GotResponseToLockMouseRequest(true) ? + MOUSELOCK_ACCEPTED : MOUSELOCK_NOT_REQUESTED; + } + if (!tab_fullscreen_accepted_) { + HostContentSettingsMap* settings_map = + profile()->GetHostContentSettingsMap(); + settings_map->SetContentSetting( + ContentSettingsPattern::FromString(url.host()), + ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_FULLSCREEN, + std::string(), CONTENT_SETTING_ALLOW); + tab_fullscreen_accepted_ = true; + } + UpdateFullscreenExitBubbleContent(); +} + +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(); } 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()); @@ -5380,3 +5456,31 @@ 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()); +} diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index 26a9ad4..cb5b348 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h @@ -34,6 +34,7 @@ #include "chrome/browser/ui/bookmarks/bookmark_tab_helper_delegate.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/constrained_window_tab_helper_delegate.h" +#include "chrome/browser/ui/fullscreen_exit_bubble_type.h" #include "chrome/browser/ui/search_engines/search_engine_tab_helper_delegate.h" #include "chrome/browser/ui/shell_dialogs.h" #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h" @@ -815,8 +816,9 @@ class Browser : public TabHandlerDelegate, virtual void TabStripEmpty(); // Fullscreen permission infobar callbacks. - void OnAcceptFullscreenPermission(const GURL& url); - void OnDenyFullscreenPermission(); + void OnAcceptFullscreenPermission(const GURL& url, + FullscreenExitBubbleType bubble_type); + void OnDenyFullscreenPermission(FullscreenExitBubbleType bubble_type); ContentSetting GetFullscreenSetting(const GURL& url); // Figure out if there are tabs that have beforeunload handlers. @@ -849,6 +851,7 @@ class Browser : public TabHandlerDelegate, FRIEND_TEST_ALL_PREFIXES(BrowserTest, AppIdSwitch); FRIEND_TEST_ALL_PREFIXES(BrowserTest, TestNewTabExitsFullscreen); FRIEND_TEST_ALL_PREFIXES(BrowserTest, TestTabExitsItselfFromFullscreen); + FRIEND_TEST_ALL_PREFIXES(BrowserTest, TestFullscreenBubbleMouseLockState); FRIEND_TEST_ALL_PREFIXES(BrowserTest, TabEntersPresentationModeFromWindowed); FRIEND_TEST_ALL_PREFIXES(BrowserInitTest, OpenAppShortcutNoPref); FRIEND_TEST_ALL_PREFIXES(BrowserInitTest, OpenAppShortcutWindowPref); @@ -886,6 +889,15 @@ class Browser : public TabHandlerDelegate, BOOKMARK_BAR_STATE_CHANGE_TOGGLE_FULLSCREEN, }; + enum MouseLockState { + MOUSELOCK_NOT_REQUESTED, + // The page requests to lock the mouse and the user hasn't responded to the + // request. + MOUSELOCK_REQUESTED, + // Mouse lock has been allowed by the user. + MOUSELOCK_ACCEPTED + }; + // Overridden from TabContentsDelegate: // Deprecated. Please use two-argument variant. // TODO(adriansc): Remove this method once refactoring changed all call sites. @@ -990,6 +1002,9 @@ class Browser : public TabHandlerDelegate, virtual void CrashedPlugin(TabContents* tab, const FilePath& plugin_path) OVERRIDE; + virtual void RequestToLockMouse(TabContents* tab) OVERRIDE; + virtual void LostMouseLock() OVERRIDE; + // Overridden from TabContentsWrapperDelegate: virtual void OnDidGetApplicationInfo(TabContentsWrapper* source, int32 page_id) OVERRIDE; @@ -1261,6 +1276,12 @@ class Browser : public TabHandlerDelegate, // Notifies the tab that it has been forced out of fullscreen mode. void NotifyTabOfFullscreenExit(); + // Determines what should be shown in the fullscreen exit bubble. + FullscreenExitBubbleType GetFullscreenExitBubbleType() const; + + // Updates the content of the fullscreen exit bubble. + void UpdateFullscreenExitBubbleContent(); + // Data members ///////////////////////////////////////////////////////////// NotificationRegistrar registrar_; @@ -1407,6 +1428,11 @@ class Browser : public TabHandlerDelegate, // True if the current tab entered fullscreen mode via webkitRequestFullScreen bool tab_caused_fullscreen_; + // True if tab fullscreen has been allowed, either by settings or by user + // clicking the allow button on the fullscreen infobar. + bool tab_fullscreen_accepted_; + + MouseLockState mouse_lock_state_; // True if the browser window has been shown at least once. bool window_has_shown_; diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc index c3b67a6..e367859 100644 --- a/chrome/browser/ui/browser_browsertest.cc +++ b/chrome/browser/ui/browser_browsertest.cc @@ -29,6 +29,7 @@ #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/fullscreen_exit_bubble_type.h" #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/chrome_switches.h" @@ -875,6 +876,43 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_TestTabExitsItselfFromFullscreen) { } } +#if defined(OS_LINUX) +// http://crbug.com/100680. +#define MAYBE_TestFullscreenBubbleMouseLockState \ + FAILS_TestFullscreenBubbleMouseLockState +#else +#define MAYBE_TestFullscreenBubbleMouseLockState \ + TestFullscreenBubbleMouseLockState +#endif + +IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_TestFullscreenBubbleMouseLockState) { + ASSERT_TRUE(test_server()->Start()); + + AddTabAtIndex(0, GURL(chrome::kAboutBlankURL), + content::PAGE_TRANSITION_TYPED); + + TabContents* fullscreen_tab = browser()->GetSelectedTabContents(); + + { + ui_test_utils::WindowedNotificationObserver fullscreen_observer( + chrome::NOTIFICATION_FULLSCREEN_CHANGED, + NotificationService::AllSources()); + browser()->ToggleFullscreenModeForTab(fullscreen_tab, true); + fullscreen_observer.Wait(); + ASSERT_TRUE(browser()->window()->IsFullscreen()); + } + + browser()->RequestToLockMouse(fullscreen_tab); + FullscreenExitBubbleType type = browser()->GetFullscreenExitBubbleType(); + bool mouse_lock = false; + fullscreen_bubble::PermissionRequestedByType(type, NULL, &mouse_lock); + ASSERT_TRUE(mouse_lock); + + browser()->OnAcceptFullscreenPermission(fullscreen_tab->GetURL(), type); + type = browser()->GetFullscreenExitBubbleType(); + ASSERT_FALSE(fullscreen_bubble::ShowButtonsForType(type)); +} + #if defined(OS_MACOSX) // http://crbug.com/100467 IN_PROC_BROWSER_TEST_F( diff --git a/chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm b/chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm index 3970237..bdbfcd2 100644 --- a/chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm +++ b/chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm @@ -17,6 +17,7 @@ #import "chrome/browser/ui/cocoa/hyperlink_text_view.h" #import "chrome/browser/ui/cocoa/info_bubble_view.h" #import "chrome/browser/ui/cocoa/info_bubble_window.h" +#include "chrome/browser/ui/fullscreen_exit_bubble_type.h" #include "grit/generated_resources.h" #include "third_party/GTM/AppKit/GTMUILocalizerAndLayoutTweaker.h" #import "third_party/GTM/AppKit/GTMNSAnimation+Duration.h" @@ -84,14 +85,14 @@ const float kHideDuration = 0.7; DCHECK(fullscreen_bubble::ShowButtonsForType(bubbleType_)); browser_->OnAcceptFullscreenPermission( - url_ /*, bubbleType_*/); // TODO(yzshen) + url_, bubbleType_); [self showButtons:NO]; [self hideSoon]; } - (void)deny:(id)sender { DCHECK(fullscreen_bubble::ShowButtonsForType(bubbleType_)); - browser_->OnDenyFullscreenPermission(/* bubbleType_ */); // TODO(yzshen) + browser_->OnDenyFullscreenPermission(bubbleType_); [self hideSoon]; } diff --git a/chrome/browser/ui/fullscreen_exit_bubble.cc b/chrome/browser/ui/fullscreen_exit_bubble.cc index 111189e..e32fca4 100644 --- a/chrome/browser/ui/fullscreen_exit_bubble.cc +++ b/chrome/browser/ui/fullscreen_exit_bubble.cc @@ -104,15 +104,11 @@ void FullscreenExitBubble::ToggleFullscreen() { } void FullscreenExitBubble::Accept() { - // TODO(yzshen): Pass bubble_type_ to OnAcceptFullscreenPermission() once it - // accepts it. - browser_->OnAcceptFullscreenPermission(url_); + browser_->OnAcceptFullscreenPermission(url_, bubble_type_); } void FullscreenExitBubble::Cancel() { - // TODO(yzshen): Pass bubble_type_ to OnDenyFullscreenPermission() once it - // accepts it. - browser_->OnDenyFullscreenPermission(); + browser_->OnDenyFullscreenPermission(bubble_type_); } string16 FullscreenExitBubble::GetCurrentMessageText() const { diff --git a/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc b/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc index ef1f800..6b1a709 100644 --- a/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc +++ b/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc @@ -675,5 +675,6 @@ void TabContentsWrapper::UpdateSafebrowsingDetectionHost() { } void TabContentsWrapper::ExitFullscreenMode() { - tab_contents()->render_view_host()->ExitFullscreen(); + if (tab_contents() && render_view_host()) + tab_contents()->render_view_host()->ExitFullscreen(); } |