diff options
author | hbono@chromium.org <hbono@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-24 07:19:48 +0000 |
---|---|---|
committer | hbono@chromium.org <hbono@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-24 07:19:48 +0000 |
commit | 33bfdcd50dfc47eefb45950ce0d00fdff5b03f7e (patch) | |
tree | 756779ff7cbdad680c7af630b7339d325798289b | |
parent | 4623008bc617720e7d4166582387bee26707fd83 (diff) | |
download | chromium_src-33bfdcd50dfc47eefb45950ce0d00fdff5b03f7e.zip chromium_src-33bfdcd50dfc47eefb45950ce0d00fdff5b03f7e.tar.gz chromium_src-33bfdcd50dfc47eefb45950ce0d00fdff5b03f7e.tar.bz2 |
A quick fix for Issue 45091.
This change checks the states of ctrl and shift keys when proceesing acclerators to prevent FocusManager from consuming ctrl+alt keys and shift+alt keys. Windows sends SC_KEYMENU commands not only when we type only an alt key but also when we type ctrl+alt keys and shift+alt keys, both are used for changing input languages and keyboard layouts. To prevent these keys from being accidentally consumed by FocusManager, we check the states of these keys and send them to FocusManager.
BUG=45091
TEST=interactive_ui_tests.exe --gtest_filter=KeyboardAccessTest.TestShiftAltMenuKeyboardAccess.
Review URL: http://codereview.chromium.org/3318022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@60433 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/test/interactive_ui/keyboard_access_uitest.cc | 25 | ||||
-rw-r--r-- | views/window/window_win.cc | 6 |
2 files changed, 25 insertions, 6 deletions
diff --git a/chrome/test/interactive_ui/keyboard_access_uitest.cc b/chrome/test/interactive_ui/keyboard_access_uitest.cc index a8ee85d..8fb0f98 100644 --- a/chrome/test/interactive_ui/keyboard_access_uitest.cc +++ b/chrome/test/interactive_ui/keyboard_access_uitest.cc @@ -31,12 +31,13 @@ class KeyboardAccessTest : public UITest { // // If alternate_key_sequence is true, use "Alt" instead of "F10" to // open the menu bar, and "Down" instead of "Enter" to open a menu. - void TestMenuKeyboardAccess(bool alternate_key_sequence); + void TestMenuKeyboardAccess(bool alternate_key_sequence, int modifiers); DISALLOW_COPY_AND_ASSIGN(KeyboardAccessTest); }; -void KeyboardAccessTest::TestMenuKeyboardAccess(bool alternate_key_sequence) { +void KeyboardAccessTest::TestMenuKeyboardAccess(bool alternate_key_sequence, + int modifiers) { scoped_refptr<BrowserProxy> browser = automation()->GetBrowserWindow(0); ASSERT_TRUE(browser.get()); scoped_refptr<WindowProxy> window = browser->GetWindow(); @@ -66,7 +67,17 @@ void KeyboardAccessTest::TestMenuKeyboardAccess(bool alternate_key_sequence) { // menu key there. menu_key = app::VKEY_MENU; #endif - ASSERT_TRUE(window->SimulateOSKeyPress(menu_key, 0)); + ASSERT_TRUE(window->SimulateOSKeyPress(menu_key, modifiers)); + + if (modifiers) { + // Verify Chrome does not move the view focus. We should not move the view + // focus when typing a menu key with modifier keys, such as shift keys or + // control keys. + int new_view_id = -1; + ASSERT_TRUE(window->GetFocusedViewID(&new_view_id)); + ASSERT_EQ(original_view_id, new_view_id); + return; + } int new_view_id = -1; ASSERT_TRUE(window->WaitForFocusedViewIDToChange( @@ -95,11 +106,15 @@ void KeyboardAccessTest::TestMenuKeyboardAccess(bool alternate_key_sequence) { } TEST_F(KeyboardAccessTest, TestMenuKeyboardAccess) { - TestMenuKeyboardAccess(false); + TestMenuKeyboardAccess(false, 0); } TEST_F(KeyboardAccessTest, TestAltMenuKeyboardAccess) { - TestMenuKeyboardAccess(true); + TestMenuKeyboardAccess(true, 0); +} + +TEST_F(KeyboardAccessTest, TestShiftAltMenuKeyboardAccess) { + TestMenuKeyboardAccess(true, views::Event::EF_SHIFT_DOWN); } // Fails, http://crbug.com/50760. diff --git a/views/window/window_win.cc b/views/window/window_win.cc index 6aa5224..c81fe27 100644 --- a/views/window/window_win.cc +++ b/views/window/window_win.cc @@ -1121,8 +1121,12 @@ void WindowWin::OnSysCommand(UINT notification_code, CPoint click) { // Handle SC_KEYMENU, which means that the user has pressed the ALT // key and released it, so we should focus the menu bar. if ((notification_code & sc_mask) == SC_KEYMENU && click.x == 0) { + // Retrieve the status of shift and control keys to prevent consuming + // shift+alt keys, which are used by Windows to change input languages. Accelerator accelerator(app::KeyboardCodeForWindowsKeyCode(VK_MENU), - false, false, false); + !!(GetKeyState(VK_SHIFT) & 0x8000), + !!(GetKeyState(VK_CONTROL) & 0x8000), + false); GetFocusManager()->ProcessAccelerator(accelerator); return; } |