summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authorafakhry <afakhry@chromium.org>2015-12-10 15:55:46 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-10 23:57:27 +0000
commitc23ea2a280fd3bb8201ffacc72d5ac762c998553 (patch)
treef4c97537ccd6c537cf633f4b40f913f167e03e34 /ash
parent1068b607d535ad851e5f63a256ad1b39cf468f35 (diff)
downloadchromium_src-c23ea2a280fd3bb8201ffacc72d5ac762c998553.zip
chromium_src-c23ea2a280fd3bb8201ffacc72d5ac762c998553.tar.gz
chromium_src-c23ea2a280fd3bb8201ffacc72d5ac762c998553.tar.bz2
Make sure Search+<key(s)> are un-interceptable.
On ChromeOS, accelerators using the Search key as a modifier are considered system accelerators, and they cannot be intercepted by apps or sites. R=oshima@chromium.org BUG=567294 Review URL: https://codereview.chromium.org/1502993004 Cr-Commit-Position: refs/heads/master@{#364533}
Diffstat (limited to 'ash')
-rw-r--r--ash/accelerators/accelerator_delegate.cc5
-rw-r--r--ash/accelerators/accelerator_filter_unittest.cc38
2 files changed, 43 insertions, 0 deletions
diff --git a/ash/accelerators/accelerator_delegate.cc b/ash/accelerators/accelerator_delegate.cc
index bcdc75e..e815881 100644
--- a/ash/accelerators/accelerator_delegate.cc
+++ b/ash/accelerators/accelerator_delegate.cc
@@ -51,6 +51,11 @@ bool AcceleratorDelegate::CanConsumeSystemKeys(const ui::KeyEvent& event) {
bool AcceleratorDelegate::ShouldProcessAcceleratorNow(
const ui::KeyEvent& event,
const ui::Accelerator& accelerator) {
+ // On ChromeOS, If the accelerator is Search+<key(s)> then it must never be
+ // intercepted by apps or windows.
+ if (accelerator.IsCmdDown())
+ return true;
+
aura::Window* target = static_cast<aura::Window*>(event.target());
DCHECK(target);
diff --git a/ash/accelerators/accelerator_filter_unittest.cc b/ash/accelerators/accelerator_filter_unittest.cc
index a4e9c29..aebec8d 100644
--- a/ash/accelerators/accelerator_filter_unittest.cc
+++ b/ash/accelerators/accelerator_filter_unittest.cc
@@ -9,11 +9,14 @@
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
#include "ash/test/ash_test_base.h"
+#include "ash/test/ash_test_helper.h"
#include "ash/test/test_screenshot_delegate.h"
+#include "ash/test/test_session_state_delegate.h"
#include "ash/wm/window_state.h"
#include "ash/wm/window_util.h"
#include "base/memory/scoped_ptr.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/aura/client/aura_constants.h"
#include "ui/aura/test/aura_test_base.h"
#include "ui/aura/test/test_windows.h"
#include "ui/aura/window.h"
@@ -132,6 +135,41 @@ TEST_F(AcceleratorFilterTest, CanConsumeSystemKeys) {
filter.OnKeyEvent(&press_volume_up);
EXPECT_FALSE(press_volume_up.stopped_propagation());
}
+
+TEST_F(AcceleratorFilterTest, SearchKeyShortcutsAreAlwaysHandled) {
+ TestSessionStateDelegate* session_state_delegate =
+ AshTestHelper::GetTestSessionStateDelegate();
+ EXPECT_FALSE(session_state_delegate->IsScreenLocked());
+
+ ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
+
+ // We can lock the screen (Search+L) if a window is not present.
+ generator.PressKey(ui::VKEY_L, ui::EF_COMMAND_DOWN);
+ generator.ReleaseKey(ui::VKEY_L, ui::EF_COMMAND_DOWN);
+ EXPECT_TRUE(session_state_delegate->IsScreenLocked());
+ UnblockUserSession();
+ EXPECT_FALSE(session_state_delegate->IsScreenLocked());
+
+ // Search+L is processed when the app_list target visibility is false.
+ Shell::GetInstance()->DismissAppList();
+ EXPECT_FALSE(Shell::GetInstance()->GetAppListTargetVisibility());
+ generator.PressKey(ui::VKEY_L, ui::EF_COMMAND_DOWN);
+ generator.ReleaseKey(ui::VKEY_L, ui::EF_COMMAND_DOWN);
+ EXPECT_TRUE(session_state_delegate->IsScreenLocked());
+ UnblockUserSession();
+ EXPECT_FALSE(session_state_delegate->IsScreenLocked());
+
+ // Search+L is also processed when there is a full screen window.
+ aura::test::TestWindowDelegate window_delegate;
+ scoped_ptr<aura::Window> window(CreateTestWindowInShellWithDelegate(
+ &window_delegate, 0, gfx::Rect(200, 200)));
+ window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
+ generator.PressKey(ui::VKEY_L, ui::EF_COMMAND_DOWN);
+ generator.ReleaseKey(ui::VKEY_L, ui::EF_COMMAND_DOWN);
+ EXPECT_TRUE(session_state_delegate->IsScreenLocked());
+ UnblockUserSession();
+ EXPECT_FALSE(session_state_delegate->IsScreenLocked());
+}
#endif // defined(OS_CHROMEOS)
} // namespace test