summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authorafakhry <afakhry@chromium.org>2015-11-16 13:43:08 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-16 21:44:12 +0000
commit049217061cbe1c5bfcda950cab2a054725678c73 (patch)
treec7af1c393078d54af1eb87e1eb0c40dd853d5a9b /ash
parent5f56df573df3e6c2bf6ced027be8c02884ca944f (diff)
downloadchromium_src-049217061cbe1c5bfcda950cab2a054725678c73.zip
chromium_src-049217061cbe1c5bfcda950cab2a054725678c73.tar.gz
chromium_src-049217061cbe1c5bfcda950cab2a054725678c73.tar.bz2
Fix KeyboardOverlayView not closing by pressing any cancelling key.
KeyboardOverlayView::IsCancelingKeyEvent() is given a KeyEvent instead of an accelerator, and the comparison is done expecting exact equality of the KeyEvent's flags and the cancelling shortcut flags. Any non-modifier flags generated on the KeyEvent will make the comparison fail and hence the Keyboard Overlay gets stuck. We fix this by masking out all non-key-modifier flags before we do the comparison. BUG=535008 TEST=ash_unittests --gtest_filter=KeyboardOverlayViewTest.* Review URL: https://codereview.chromium.org/1434843002 Cr-Commit-Position: refs/heads/master@{#359926}
Diffstat (limited to 'ash')
-rw-r--r--ash/content/keyboard_overlay/keyboard_overlay_view.cc7
-rw-r--r--ash/content/keyboard_overlay/keyboard_overlay_view.h2
-rw-r--r--ash/content/keyboard_overlay/keyboard_overlay_view_unittest.cc21
3 files changed, 28 insertions, 2 deletions
diff --git a/ash/content/keyboard_overlay/keyboard_overlay_view.cc b/ash/content/keyboard_overlay/keyboard_overlay_view.cc
index 9673df2..e0a547d 100644
--- a/ash/content/keyboard_overlay/keyboard_overlay_view.cc
+++ b/ash/content/keyboard_overlay/keyboard_overlay_view.cc
@@ -26,6 +26,7 @@ const ash::KeyboardOverlayView::KeyEventData kCancelKeys[] = {
{ui::VKEY_HELP, ui::EF_NONE},
{ui::VKEY_F14, ui::EF_NONE},
};
+
}
namespace ash {
@@ -47,8 +48,10 @@ void KeyboardOverlayView::Cancel() {
bool KeyboardOverlayView::IsCancelingKeyEvent(ui::KeyEvent* event) {
if (event->type() != ui::ET_KEY_PRESSED)
return false;
- // Ignore the caps lock state.
- const int flags = (event->flags() & ~ui::EF_CAPS_LOCK_DOWN);
+
+ // Ignore the non-modifiers flags in order to treat it the same way
+ // Accelerators are generated and compared. crbug.com/535008.
+ const int flags = ui::Accelerator::MaskOutKeyEventFlags(event->flags());
for (size_t i = 0; i < arraysize(kCancelKeys); ++i) {
if ((kCancelKeys[i].key_code == event->key_code()) &&
(kCancelKeys[i].flags == flags))
diff --git a/ash/content/keyboard_overlay/keyboard_overlay_view.h b/ash/content/keyboard_overlay/keyboard_overlay_view.h
index 99d0354..5d8c1af 100644
--- a/ash/content/keyboard_overlay/keyboard_overlay_view.h
+++ b/ash/content/keyboard_overlay/keyboard_overlay_view.h
@@ -52,6 +52,8 @@ class ASH_WITH_CONTENT_EXPORT KeyboardOverlayView
private:
FRIEND_TEST_ALL_PREFIXES(KeyboardOverlayViewTest, OpenAcceleratorsClose);
+ FRIEND_TEST_ALL_PREFIXES(KeyboardOverlayViewTest,
+ TestCancelingKeysWithNonModifierFlags);
FRIEND_TEST_ALL_PREFIXES(KeyboardOverlayViewTest, NoRedundantCancelingKeys);
// Overridden from views::WidgetDelegate:
diff --git a/ash/content/keyboard_overlay/keyboard_overlay_view_unittest.cc b/ash/content/keyboard_overlay/keyboard_overlay_view_unittest.cc
index 62cdde7..ef5159e 100644
--- a/ash/content/keyboard_overlay/keyboard_overlay_view_unittest.cc
+++ b/ash/content/keyboard_overlay/keyboard_overlay_view_unittest.cc
@@ -41,6 +41,27 @@ TEST_F(KeyboardOverlayViewTest, OpenAcceleratorsClose) {
}
}
+// Test modifiers that might exist in a KeyEvent but they shouldn't be
+// considered in an accelerator comparison to determine if a KeyEvent is a
+// canceling key.
+TEST_F(KeyboardOverlayViewTest, TestCancelingKeysWithNonModifierFlags) {
+ ui::test::TestWebDialogDelegate delegate(GURL("chrome://keyboardoverlay"));
+ KeyboardOverlayView view(
+ ShellContentState::GetInstance()->GetActiveBrowserContext(), &delegate,
+ new ui::test::TestWebContentsHandler);
+
+ const int kNonModifierFlags = ui::EF_IS_REPEAT | ui::EF_IME_FABRICATED_KEY |
+ ui::EF_NUM_LOCK_DOWN | ui::EF_IS_SYNTHESIZED;
+
+ std::vector<KeyboardOverlayView::KeyEventData> canceling_keys;
+ KeyboardOverlayView::GetCancelingKeysForTesting(&canceling_keys);
+ for (const auto& key_data : canceling_keys) {
+ ui::KeyEvent key_event(ui::ET_KEY_PRESSED, key_data.key_code,
+ key_data.flags | kNonModifierFlags);
+ EXPECT_TRUE(view.IsCancelingKeyEvent(&key_event));
+ }
+}
+
// Verifies that there are no redunduant keys in the canceling keys.
TEST_F(KeyboardOverlayViewTest, NoRedundantCancelingKeys) {
std::vector<KeyboardOverlayView::KeyEventData> open_keys;