summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authoryzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-18 04:25:55 +0000
committeryzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-18 04:25:55 +0000
commit5ef8e376b54fe7c38dcf3bae8219b3cabae7597c (patch)
tree81a33f2f841883e0311862843a3ad7eb77344a6c /chrome
parent1e18b494aa66ba8e099ce46a823291267f7b7646 (diff)
downloadchromium_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.cc182
-rw-r--r--chrome/browser/ui/browser.h30
-rw-r--r--chrome/browser/ui/browser_browsertest.cc38
-rw-r--r--chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm5
-rw-r--r--chrome/browser/ui/fullscreen_exit_bubble.cc8
-rw-r--r--chrome/browser/ui/tab_contents/tab_contents_wrapper.cc3
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();
}