Disable browser key reservation in fullscreen mode
In intent to implement https://goo.gl/4tJ32G, we decided to deliver browser
shortcuts to the websites, so a web page can provide almost consistent user
experience as a native application. To ensure there is no security risk, a
simple and safe approach is to allow websites to capture browser reserved
keyboard combinations in full screen mode only.
This does not apply to the keys to exit fullscreen (F11) or exit the
application (ESC).
BUG=680809
Review-Url: https://codereview.chromium.org/2636013002
Cr-Commit-Position: refs/heads/master@{#449896}
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index 0d947e9..09699ec 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -88,18 +88,6 @@
using content::NavigationController;
using content::WebContents;
-namespace {
-
-enum WindowState {
- // Not in fullscreen mode.
- WINDOW_STATE_NOT_FULLSCREEN,
-
- // Fullscreen mode, occupying the whole screen.
- WINDOW_STATE_FULLSCREEN,
-};
-
-} // namespace
-
namespace chrome {
///////////////////////////////////////////////////////////////////////////////
@@ -199,8 +187,23 @@
}
#endif
- if (window()->IsFullscreen() && command_id == IDC_FULLSCREEN)
- return true;
+ const bool is_tab_or_window_command =
+ command_id == IDC_CLOSE_TAB ||
+ command_id == IDC_CLOSE_WINDOW ||
+ command_id == IDC_NEW_INCOGNITO_WINDOW ||
+ command_id == IDC_NEW_TAB ||
+ command_id == IDC_NEW_WINDOW ||
+ command_id == IDC_RESTORE_TAB ||
+ command_id == IDC_SELECT_NEXT_TAB ||
+ command_id == IDC_SELECT_PREVIOUS_TAB;
+ if (window()->IsFullscreen()) {
+ // In fullscreen, all commands except for IDC_FULLSCREEN and IDC_EXIT should
+ // be delivered to the web page. See https://goo.gl/4tJ32G.
+ if (command_id == IDC_FULLSCREEN)
+ return true;
+ if (is_tab_or_window_command)
+ return false;
+ }
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
// If this key was registered by the user as a content editing hotkey, then
@@ -211,15 +214,7 @@
return false;
#endif
- return command_id == IDC_CLOSE_TAB ||
- command_id == IDC_CLOSE_WINDOW ||
- command_id == IDC_NEW_INCOGNITO_WINDOW ||
- command_id == IDC_NEW_TAB ||
- command_id == IDC_NEW_WINDOW ||
- command_id == IDC_RESTORE_TAB ||
- command_id == IDC_SELECT_NEXT_TAB ||
- command_id == IDC_SELECT_PREVIOUS_TAB ||
- command_id == IDC_EXIT;
+ return is_tab_or_window_command || command_id == IDC_EXIT;
}
void BrowserCommandController::SetBlockCommandExecution(bool block) {
@@ -1020,13 +1015,9 @@
}
void BrowserCommandController::UpdateCommandsForFullscreenMode() {
- WindowState window_state = WINDOW_STATE_NOT_FULLSCREEN;
- if (window() && window()->IsFullscreen()) {
- window_state = WINDOW_STATE_FULLSCREEN;
- }
- bool show_main_ui = IsShowingMainUI();
- bool main_not_fullscreen =
- show_main_ui && window_state == WINDOW_STATE_NOT_FULLSCREEN;
+ const bool is_fullscreen = window() && window()->IsFullscreen();
+ const bool show_main_ui = IsShowingMainUI();
+ const bool main_not_fullscreen = show_main_ui && !is_fullscreen;
// Navigation commands
command_updater_.UpdateCommandEnabled(IDC_OPEN_CURRENT_URL, show_main_ui);
@@ -1034,8 +1025,7 @@
// Window management commands
command_updater_.UpdateCommandEnabled(
IDC_SHOW_AS_TAB,
- !browser_->is_type_tabbed() &&
- window_state == WINDOW_STATE_NOT_FULLSCREEN);
+ !browser_->is_type_tabbed() && !is_fullscreen);
// Focus various bits of UI
command_updater_.UpdateCommandEnabled(IDC_FOCUS_TOOLBAR, show_main_ui);
@@ -1077,19 +1067,29 @@
if (base::debug::IsProfilingSupported())
command_updater_.UpdateCommandEnabled(IDC_PROFILING_ENABLED, show_main_ui);
- bool fullscreen_enabled = true;
#if !defined(OS_MACOSX)
- if (window_state == WINDOW_STATE_NOT_FULLSCREEN &&
- !profile()->GetPrefs()->GetBoolean(prefs::kFullscreenAllowed)) {
- // Disable toggling into fullscreen mode if disallowed by pref.
- fullscreen_enabled = false;
- }
+ // Disable toggling into fullscreen mode if disallowed by pref.
+ const bool fullscreen_enabled = is_fullscreen ||
+ profile()->GetPrefs()->GetBoolean(prefs::kFullscreenAllowed);
+#else
+ const bool fullscreen_enabled = true;
#endif
command_updater_.UpdateCommandEnabled(IDC_FULLSCREEN, fullscreen_enabled);
command_updater_.UpdateCommandEnabled(IDC_TOGGLE_FULLSCREEN_TOOLBAR,
fullscreen_enabled);
+ command_updater_.UpdateCommandEnabled(IDC_CLOSE_TAB, !is_fullscreen);
+ command_updater_.UpdateCommandEnabled(IDC_CLOSE_WINDOW, !is_fullscreen);
+ command_updater_.UpdateCommandEnabled(IDC_NEW_INCOGNITO_WINDOW,
+ !is_fullscreen);
+ command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, !is_fullscreen);
+ command_updater_.UpdateCommandEnabled(IDC_NEW_WINDOW, !is_fullscreen);
+ command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB, !is_fullscreen);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, !is_fullscreen);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_PREVIOUS_TAB,
+ !is_fullscreen);
+
UpdateCommandsForBookmarkBar();
}
diff --git a/chrome/browser/ui/browser_command_controller_unittest.cc b/chrome/browser/ui/browser_command_controller_unittest.cc
index 46198da7..22a62f7f 100644
--- a/chrome/browser/ui/browser_command_controller_unittest.cc
+++ b/chrome/browser/ui/browser_command_controller_unittest.cc
@@ -359,6 +359,17 @@
EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_VIEW_PASSWORDS));
EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_ABOUT));
EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_APP_MENU));
+
+ // In fullscreen, only the exit fullscreen commands are reserved. All other
+ // shortcuts are unreserved. See https://goo.gl/4tJ32G.
+ EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_CLOSE_TAB));
+ EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_CLOSE_WINDOW));
+ EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_NEW_INCOGNITO_WINDOW));
+ EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_NEW_TAB));
+ EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_NEW_WINDOW));
+ EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SELECT_NEXT_TAB));
+ EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SELECT_PREVIOUS_TAB));
+ EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_EXIT));
EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
// Exit fullscreen.
@@ -384,6 +395,14 @@
EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_VIEW_PASSWORDS));
EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ABOUT));
EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_SHOW_APP_MENU));
+ EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_CLOSE_TAB));
+ EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_CLOSE_WINDOW));
+ EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_NEW_INCOGNITO_WINDOW));
+ EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_NEW_TAB));
+ EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_NEW_WINDOW));
+ EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_SELECT_NEXT_TAB));
+ EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_SELECT_PREVIOUS_TAB));
+ EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_EXIT));
EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
// Guest Profiles disallow some options.