diff options
author | afakhry <afakhry@chromium.org> | 2015-12-10 15:55:46 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-10 23:57:27 +0000 |
commit | c23ea2a280fd3bb8201ffacc72d5ac762c998553 (patch) | |
tree | f4c97537ccd6c537cf633f4b40f913f167e03e34 /ash | |
parent | 1068b607d535ad851e5f63a256ad1b39cf468f35 (diff) | |
download | chromium_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.cc | 5 | ||||
-rw-r--r-- | ash/accelerators/accelerator_filter_unittest.cc | 38 |
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 |