diff options
-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 |