Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Unified Diff: chrome/browser/ui/ash/event_rewriter_unittest.cc

Issue 11417144: Use rewriting to make ChromeOS keyboard F<number> keys produce extended keycodes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: forlanding3 Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/ash/event_rewriter.cc ('k') | chrome/browser/ui/ash/volume_controller_chromeos.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/ash/event_rewriter_unittest.cc
diff --git a/chrome/browser/ui/ash/event_rewriter_unittest.cc b/chrome/browser/ui/ash/event_rewriter_unittest.cc
index 518c1ca7fadc60081808dc5363e4bf2c1ca4e7f3..efcdd5cd7817a3fa18840a39bb1c2840c367d7b6 100644
--- a/chrome/browser/ui/ash/event_rewriter_unittest.cc
+++ b/chrome/browser/ui/ash/event_rewriter_unittest.cc
@@ -117,6 +117,45 @@ class EventRewriterTest : public testing::Test {
keycode_home_(XKeysymToKeycode(display_, XK_Home)),
keycode_end_(XKeysymToKeycode(display_, XK_End)),
keycode_launch7_(XKeysymToKeycode(display_, XF86XK_Launch7)),
+ keycode_f1_(XKeysymToKeycode(display_, XK_F1)),
+ keycode_f2_(XKeysymToKeycode(display_, XK_F2)),
+ keycode_f3_(XKeysymToKeycode(display_, XK_F3)),
+ keycode_f4_(XKeysymToKeycode(display_, XK_F4)),
+ keycode_f5_(XKeysymToKeycode(display_, XK_F5)),
+ keycode_f6_(XKeysymToKeycode(display_, XK_F6)),
+ keycode_f7_(XKeysymToKeycode(display_, XK_F7)),
+ keycode_f8_(XKeysymToKeycode(display_, XK_F8)),
+ keycode_f9_(XKeysymToKeycode(display_, XK_F9)),
+ keycode_f10_(XKeysymToKeycode(display_, XK_F10)),
+ keycode_f11_(XKeysymToKeycode(display_, XK_F11)),
+ keycode_f12_(XKeysymToKeycode(display_, XK_F12)),
+ keycode_browser_back_(XKeysymToKeycode(display_, XF86XK_Back)),
+ keycode_browser_forward_(XKeysymToKeycode(display_, XF86XK_Forward)),
+ keycode_browser_refresh_(XKeysymToKeycode(display_, XF86XK_Reload)),
+ keycode_media_launch_app1_(XKeysymToKeycode(display_, XF86XK_LaunchA)),
+ keycode_media_launch_app2_(XKeysymToKeycode(display_, XF86XK_LaunchB)),
+ keycode_brightness_down_(XKeysymToKeycode(
+ display_, XF86XK_MonBrightnessDown)),
+ keycode_brightness_up_(XKeysymToKeycode(
+ display_, XF86XK_MonBrightnessUp)),
+ keycode_volume_mute_(XKeysymToKeycode(display_, XF86XK_AudioMute)),
+ keycode_volume_down_(XKeysymToKeycode(
+ display_, XF86XK_AudioLowerVolume)),
+ keycode_volume_up_(XKeysymToKeycode(
+ display_, XF86XK_AudioRaiseVolume)),
+ keycode_power_(XKeysymToKeycode(display_, XF86XK_PowerOff)),
+ keycode_1_(XKeysymToKeycode(display_, XK_1)),
+ keycode_2_(XKeysymToKeycode(display_, XK_2)),
+ keycode_3_(XKeysymToKeycode(display_, XK_3)),
+ keycode_4_(XKeysymToKeycode(display_, XK_4)),
+ keycode_5_(XKeysymToKeycode(display_, XK_5)),
+ keycode_6_(XKeysymToKeycode(display_, XK_6)),
+ keycode_7_(XKeysymToKeycode(display_, XK_7)),
+ keycode_8_(XKeysymToKeycode(display_, XK_8)),
+ keycode_9_(XKeysymToKeycode(display_, XK_9)),
+ keycode_0_(XKeysymToKeycode(display_, XK_0)),
+ keycode_minus_(XKeysymToKeycode(display_, XK_minus)),
+ keycode_equal_(XKeysymToKeycode(display_, XK_equal)),
input_method_manager_mock_(NULL) {
}
virtual ~EventRewriterTest() {}
@@ -183,6 +222,41 @@ class EventRewriterTest : public testing::Test {
const KeyCode keycode_home_;
const KeyCode keycode_end_;
const KeyCode keycode_launch7_; // F16
+ const KeyCode keycode_f1_;
+ const KeyCode keycode_f2_;
+ const KeyCode keycode_f3_;
+ const KeyCode keycode_f4_;
+ const KeyCode keycode_f5_;
+ const KeyCode keycode_f6_;
+ const KeyCode keycode_f7_;
+ const KeyCode keycode_f8_;
+ const KeyCode keycode_f9_;
+ const KeyCode keycode_f10_;
+ const KeyCode keycode_f11_;
+ const KeyCode keycode_f12_;
+ const KeyCode keycode_browser_back_;
+ const KeyCode keycode_browser_forward_;
+ const KeyCode keycode_browser_refresh_;
+ const KeyCode keycode_media_launch_app1_;
+ const KeyCode keycode_media_launch_app2_;
+ const KeyCode keycode_brightness_down_;
+ const KeyCode keycode_brightness_up_;
+ const KeyCode keycode_volume_mute_;
+ const KeyCode keycode_volume_down_;
+ const KeyCode keycode_volume_up_;
+ const KeyCode keycode_power_;
+ const KeyCode keycode_1_;
+ const KeyCode keycode_2_;
+ const KeyCode keycode_3_;
+ const KeyCode keycode_4_;
+ const KeyCode keycode_5_;
+ const KeyCode keycode_6_;
+ const KeyCode keycode_7_;
+ const KeyCode keycode_8_;
+ const KeyCode keycode_9_;
+ const KeyCode keycode_0_;
+ const KeyCode keycode_minus_;
+ const KeyCode keycode_equal_;
chromeos::ScopedMockUserManagerEnabler user_manager_mock_;
chromeos::input_method::MockInputMethodManager* input_method_manager_mock_;
};
@@ -1686,108 +1760,185 @@ TEST_F(EventRewriterTest, TestRewriteBackspaceAndArrowKeys) {
EventRewriter rewriter;
rewriter.set_pref_service_for_testing(&prefs);
- // Alt+Backspace -> Delete
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DELETE,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_delete_,
- 0U,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_BACK,
- ui::EF_ALT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_backspace_,
- Mod1Mask));
-
- // Ctrl+Alt+Backspace -> Ctrl+Delete
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DELETE,
- ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_delete_,
- ControlMask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_BACK,
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_backspace_,
- Mod1Mask | ControlMask));
-
- // Alt+Up -> Prior
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_PRIOR,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_prior_,
- 0U,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_UP,
- ui::EF_ALT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_up_,
- Mod1Mask));
-
- // Alt+Down -> Next
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NEXT,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_next_,
- 0U,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_DOWN,
- ui::EF_ALT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_down_,
- Mod1Mask));
+ // On non-chromebooks, the keyboard doesn't need to be remapped.
+
+ struct {
+ ui::KeyboardCode input;
+ KeyCode input_native;
+ unsigned int input_mods;
+ unsigned int input_native_mods;
+ ui::KeyboardCode output;
+ KeyCode output_native;
+ unsigned int output_mods;
+ unsigned int output_native_mods;
+ } default_tests[] = {
+ { ui::VKEY_BACK, keycode_backspace_,
+ ui::EF_ALT_DOWN, Mod1Mask,
+ ui::VKEY_BACK, keycode_backspace_,
+ ui::EF_ALT_DOWN, Mod1Mask, },
+ { ui::VKEY_UP, keycode_up_,
+ ui::EF_ALT_DOWN, Mod1Mask,
+ ui::VKEY_UP, keycode_up_,
+ ui::EF_ALT_DOWN, Mod1Mask, },
+ { ui::VKEY_UP, keycode_up_,
+ ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
+ ui::VKEY_UP, keycode_up_,
+ ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, },
+ { ui::VKEY_DOWN, keycode_down_,
+ ui::EF_ALT_DOWN, Mod1Mask,
+ ui::VKEY_DOWN, keycode_down_,
+ ui::EF_ALT_DOWN, Mod1Mask, },
+ { ui::VKEY_LEFT, keycode_left_, 0, 0,
+ ui::VKEY_LEFT, keycode_left_, 0, 0 },
+ { ui::VKEY_RIGHT, keycode_right_, 0, 0,
+ ui::VKEY_RIGHT, keycode_right_, 0, 0 }
+ };
+
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(default_tests); ++i) {
+ EXPECT_EQ(GetExpectedResultAsString(default_tests[i].output,
+ default_tests[i].output_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].output_native,
+ default_tests[i].output_native_mods,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ default_tests[i].input,
+ default_tests[i].input_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].input_native,
+ default_tests[i].input_native_mods));
+
+ // Search key as a modifier does not change the outcome.
+ EXPECT_EQ(GetExpectedResultAsString(default_tests[i].output,
+ default_tests[i].output_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].output_native,
+ Mod4Mask |
+ default_tests[i].output_native_mods,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ default_tests[i].input,
+ default_tests[i].input_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].input_native,
+ Mod4Mask |
+ default_tests[i].input_native_mods));
+ }
- // Ctrl+Alt+Up -> Home
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_HOME,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_home_,
- 0U,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_UP,
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_up_,
- Mod1Mask | ControlMask));
+ // On a chromebook, an external keyboard doesn't need to be remapped.
+ const CommandLine original_cl(*CommandLine::ForCurrentProcess());
+ CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+ switches::kHasChromeOSKeyboard, "");
- // Ctrl+Alt+Down -> End
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_end_,
- 0U,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_DOWN,
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_down_,
- Mod1Mask | ControlMask));
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(default_tests); ++i) {
+ EXPECT_EQ(GetExpectedResultAsString(default_tests[i].output,
+ default_tests[i].output_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].output_native,
+ default_tests[i].output_native_mods,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ default_tests[i].input,
+ default_tests[i].input_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].input_native,
+ default_tests[i].input_native_mods));
+
+ // Search key as a modifier does not change the outcome.
+ EXPECT_EQ(GetExpectedResultAsString(default_tests[i].output,
+ default_tests[i].output_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].output_native,
+ Mod4Mask |
+ default_tests[i].output_native_mods,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ default_tests[i].input,
+ default_tests[i].input_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].input_native,
+ Mod4Mask |
+ default_tests[i].input_native_mods));
+ }
- // Shift+Ctrl+Alt+Down -> Shift+End
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END,
- ui::EF_SHIFT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_end_,
- ShiftMask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_DOWN,
- ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN |
- ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_down_,
- ShiftMask | Mod1Mask | ControlMask));
+ // The internal chromebook keybaord should be remapped.
+ rewriter.set_force_chromeos_keyboard_for_testing(true);
+
+ struct {
+ ui::KeyboardCode input;
+ KeyCode input_native;
+ unsigned int input_mods;
+ unsigned int input_native_mods;
+ ui::KeyboardCode output;
+ KeyCode output_native;
+ unsigned int output_mods;
+ unsigned int output_native_mods;
+ } chromeos_tests[] = {
+ // Alt+Backspace -> Delete
+ { ui::VKEY_BACK, keycode_backspace_,
+ ui::EF_ALT_DOWN, Mod1Mask,
+ ui::VKEY_DELETE, keycode_delete_,
+ 0, 0, },
+ // Control+Alt+Backspace -> Control+Delete
+ { ui::VKEY_BACK, keycode_backspace_,
+ ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
+ ui::VKEY_DELETE, keycode_delete_,
+ ui::EF_CONTROL_DOWN, ControlMask, },
+ // Alt+Up -> Prior
+ { ui::VKEY_UP, keycode_up_,
+ ui::EF_ALT_DOWN, Mod1Mask,
+ ui::VKEY_PRIOR, keycode_prior_,
+ 0, 0, },
+ // Alt+Down -> Next
+ { ui::VKEY_DOWN, keycode_down_,
+ ui::EF_ALT_DOWN, Mod1Mask,
+ ui::VKEY_NEXT, keycode_next_,
+ 0, 0, },
+ // Ctrl+Alt+Up -> Home
+ { ui::VKEY_UP, keycode_up_,
+ ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
+ ui::VKEY_HOME, keycode_home_,
+ 0, 0, },
+ // Ctrl+Alt+Down -> End
+ { ui::VKEY_DOWN, keycode_down_,
+ ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
+ ui::VKEY_END, keycode_end_,
+ 0, 0, }
+ };
+
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) {
+ EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output,
+ chromeos_tests[i].output_mods,
+ ui::ET_KEY_PRESSED,
+ chromeos_tests[i].output_native,
+ chromeos_tests[i].output_native_mods,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ chromeos_tests[i].input,
+ chromeos_tests[i].input_mods,
+ ui::ET_KEY_PRESSED,
+ chromeos_tests[i].input_native,
+ chromeos_tests[i].input_native_mods));
+
+ // Search key as a modifier does not change the outcome.
+ EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output,
+ chromeos_tests[i].output_mods,
+ ui::ET_KEY_PRESSED,
+ chromeos_tests[i].output_native,
+ Mod4Mask |
+ chromeos_tests[i].output_native_mods,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ chromeos_tests[i].input,
+ chromeos_tests[i].input_mods,
+ ui::ET_KEY_PRESSED,
+ chromeos_tests[i].input_native,
+ Mod4Mask |
+ chromeos_tests[i].input_native_mods));
+ }
// Make Search key act like a Function key for accessing extended key
// bindings.
- const CommandLine original_cl(*CommandLine::ForCurrentProcess());
CommandLine::ForCurrentProcess()->AppendSwitchASCII(
switches::kEnableChromebookFunctionKey, "");
BooleanPrefMember search_key_as_function_key;
@@ -1795,206 +1946,436 @@ TEST_F(EventRewriterTest, TestRewriteBackspaceAndArrowKeys) {
&prefs, NULL);
search_key_as_function_key.SetValue(true);
- // Alt+Backspace -> Alt+Backspace
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_BACK,
- ui::EF_ALT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_backspace_,
- Mod1Mask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_BACK,
- ui::EF_ALT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_backspace_,
- Mod1Mask));
-
- // Search+Backspace -> Delete
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DELETE,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_delete_,
- 0U,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_BACK,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_backspace_,
- Mod4Mask));
-
- // Ctrl+Search+Backspace -> Ctrl+Delete
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DELETE,
- ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_delete_,
- ControlMask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_BACK,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_backspace_,
- Mod4Mask | ControlMask));
- // Alt+Search+Backspace -> Alt+Delete
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DELETE,
- ui::EF_ALT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_delete_,
- Mod1Mask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_BACK,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_backspace_,
- Mod4Mask | Mod1Mask));
+ // An external keyboard should still not be remapped.
+ rewriter.set_force_chromeos_keyboard_for_testing(false);
+
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(default_tests); ++i) {
+ EXPECT_EQ(GetExpectedResultAsString(default_tests[i].output,
+ default_tests[i].output_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].output_native,
+ default_tests[i].output_native_mods,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ default_tests[i].input,
+ default_tests[i].input_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].input_native,
+ default_tests[i].input_native_mods));
+
+ // Search key as a modifier does not change the outcome.
+ EXPECT_EQ(GetExpectedResultAsString(default_tests[i].output,
+ default_tests[i].output_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].output_native,
+ Mod4Mask |
+ default_tests[i].output_native_mods,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ default_tests[i].input,
+ default_tests[i].input_mods,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].input_native,
+ Mod4Mask |
+ default_tests[i].input_native_mods));
+ }
- // Alt+Up -> Alt+Up
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UP,
- ui::EF_ALT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_up_,
- Mod1Mask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_UP,
- ui::EF_ALT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_up_,
- Mod1Mask));
+ // The ChromeOS keyboard should be remapped with Search key modifiers.
+ rewriter.set_force_chromeos_keyboard_for_testing(true);
+
+ struct {
+ ui::KeyboardCode input;
+ KeyCode input_native;
+ unsigned int input_mods;
+ unsigned int input_native_mods;
+ ui::KeyboardCode output;
+ KeyCode output_native;
+ unsigned int output_mods;
+ unsigned int output_native_mods;
+ } search_tests[] = {
+ { ui::VKEY_BACK, keycode_backspace_,
+ ui::EF_ALT_DOWN, Mod1Mask,
+ ui::VKEY_BACK, keycode_backspace_,
+ ui::EF_ALT_DOWN, Mod1Mask, },
+ { ui::VKEY_UP, keycode_up_,
+ ui::EF_ALT_DOWN, Mod1Mask,
+ ui::VKEY_UP, keycode_up_,
+ ui::EF_ALT_DOWN, Mod1Mask, },
+ { ui::VKEY_UP, keycode_up_,
+ ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
+ ui::VKEY_UP, keycode_up_,
+ ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, },
+ { ui::VKEY_DOWN, keycode_down_,
+ ui::EF_ALT_DOWN, Mod1Mask,
+ ui::VKEY_DOWN, keycode_down_,
+ ui::EF_ALT_DOWN, Mod1Mask, },
+ { ui::VKEY_LEFT, keycode_left_, 0, 0,
+ ui::VKEY_LEFT, keycode_left_, 0, 0 },
+ { ui::VKEY_RIGHT, keycode_right_, 0, 0,
+ ui::VKEY_RIGHT, keycode_right_, 0, 0 },
+
+ // Search+Backspace -> Delete
+ { ui::VKEY_BACK, keycode_backspace_,
+ 0, Mod4Mask,
+ ui::VKEY_DELETE, keycode_delete_,
+ 0, 0, },
+ // Alt+Search+Backspace -> Alt+Delete
+ { ui::VKEY_BACK, keycode_backspace_,
+ ui::EF_ALT_DOWN, Mod4Mask | Mod1Mask,
+ ui::VKEY_DELETE, keycode_delete_,
+ ui::EF_ALT_DOWN, Mod1Mask, },
+ // Search+Up -> Prior
+ { ui::VKEY_UP, keycode_up_,
+ 0, Mod4Mask,
+ ui::VKEY_PRIOR, keycode_prior_,
+ 0, 0, },
+ // Search+Down -> Next
+ { ui::VKEY_DOWN, keycode_down_,
+ 0, Mod4Mask,
+ ui::VKEY_NEXT, keycode_next_,
+ 0, 0, },
+ // Search+Left -> Home
+ { ui::VKEY_LEFT, keycode_left_,
+ 0, Mod4Mask,
+ ui::VKEY_HOME, keycode_home_,
+ 0, 0, },
+ // Control+Search+Left -> Home
+ { ui::VKEY_LEFT, keycode_left_,
+ ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask,
+ ui::VKEY_HOME, keycode_home_,
+ ui::EF_CONTROL_DOWN, ControlMask },
+ // Search+Right -> End
+ { ui::VKEY_RIGHT, keycode_right_,
+ 0, Mod4Mask,
+ ui::VKEY_END, keycode_end_,
+ 0, 0, },
+ // Control+Search+Right -> End
+ { ui::VKEY_RIGHT, keycode_right_,
+ ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask,
+ ui::VKEY_END, keycode_end_,
+ ui::EF_CONTROL_DOWN, ControlMask }
+ };
+
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(search_tests); ++i) {
+ EXPECT_EQ(GetExpectedResultAsString(search_tests[i].output,
+ search_tests[i].output_mods,
+ ui::ET_KEY_PRESSED,
+ search_tests[i].output_native,
+ search_tests[i].output_native_mods,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ search_tests[i].input,
+ search_tests[i].input_mods,
+ ui::ET_KEY_PRESSED,
+ search_tests[i].input_native,
+ search_tests[i].input_native_mods));
+ }
- // Search+Up -> Prior
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_PRIOR,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_prior_,
- 0U,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_UP,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_up_,
- Mod4Mask));
+ *CommandLine::ForCurrentProcess() = original_cl;
+}
- // Alt+Down -> Alt+Down
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DOWN,
- ui::EF_ALT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_down_,
- Mod1Mask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_DOWN,
- ui::EF_ALT_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_down_,
- Mod1Mask));
+TEST_F(EventRewriterTest, TestRewriteFunctionKeys) {
+ const CommandLine original_cl(*CommandLine::ForCurrentProcess());
+ TestingPrefService prefs;
+ chromeos::Preferences::RegisterUserPrefs(&prefs);
+ EventRewriter rewriter;
+ rewriter.set_pref_service_for_testing(&prefs);
- // Search+Down -> Next
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NEXT,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_next_,
- 0U,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_DOWN,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_down_,
- Mod4Mask));
+ // When not on a chromebook, F<numbers> are not rewritten.
+
+ struct {
+ ui::KeyboardCode input;
+ KeyCode input_native;
+ ui::KeyboardCode output;
+ KeyCode output_native;
+ } default_tests[] = {
+ { ui::VKEY_F1, keycode_f1_, ui::VKEY_F1, keycode_f1_, },
+ { ui::VKEY_F2, keycode_f2_, ui::VKEY_F2, keycode_f2_, },
+ { ui::VKEY_F3, keycode_f3_, ui::VKEY_F3, keycode_f3_, },
+ { ui::VKEY_F4, keycode_f4_, ui::VKEY_F4, keycode_f4_, },
+ { ui::VKEY_F5, keycode_f5_, ui::VKEY_F5, keycode_f5_, },
+ { ui::VKEY_F6, keycode_f6_, ui::VKEY_F6, keycode_f6_, },
+ { ui::VKEY_F7, keycode_f7_, ui::VKEY_F7, keycode_f7_, },
+ { ui::VKEY_F8, keycode_f8_, ui::VKEY_F8, keycode_f8_, },
+ { ui::VKEY_F9, keycode_f9_, ui::VKEY_F9, keycode_f9_, },
+ { ui::VKEY_F10, keycode_f10_, ui::VKEY_F10, keycode_f10_, },
+ { ui::VKEY_F11, keycode_f11_, ui::VKEY_F11, keycode_f11_, },
+ { ui::VKEY_F12, keycode_f12_, ui::VKEY_F12, keycode_f12_, },
+ { ui::VKEY_1, keycode_1_, ui::VKEY_1, keycode_1_, },
+ { ui::VKEY_2, keycode_2_, ui::VKEY_2, keycode_2_, },
+ { ui::VKEY_3, keycode_3_, ui::VKEY_3, keycode_3_, },
+ { ui::VKEY_4, keycode_4_, ui::VKEY_4, keycode_4_, },
+ { ui::VKEY_5, keycode_5_, ui::VKEY_5, keycode_5_, },
+ { ui::VKEY_6, keycode_6_, ui::VKEY_6, keycode_6_, },
+ { ui::VKEY_7, keycode_7_, ui::VKEY_7, keycode_7_, },
+ { ui::VKEY_8, keycode_8_, ui::VKEY_8, keycode_8_, },
+ { ui::VKEY_9, keycode_9_, ui::VKEY_9, keycode_9_, },
+ { ui::VKEY_0, keycode_0_, ui::VKEY_0, keycode_0_, },
+ { ui::VKEY_OEM_MINUS, keycode_minus_, ui::VKEY_OEM_MINUS, keycode_minus_, },
+ { ui::VKEY_OEM_PLUS, keycode_equal_, ui::VKEY_OEM_PLUS, keycode_equal_, },
+ };
+
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(default_tests); ++i) {
+ EXPECT_EQ(GetExpectedResultAsString(default_tests[i].output,
+ 0,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].output_native,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ default_tests[i].input,
+ 0,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].input_native,
+ 0));
+
+ // Search key as a modifier does not change the outcome.
+ EXPECT_EQ(GetExpectedResultAsString(default_tests[i].output,
+ 0,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].output_native,
+ Mod4Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ default_tests[i].input,
+ 0,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].input_native,
+ Mod4Mask));
+ }
- // Ctrl+Alt+Up -> Ctrl+Alt+Up
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UP,
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_up_,
- Mod1Mask | ControlMask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_UP,
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_up_,
- Mod1Mask | ControlMask));
+ // When on a Chromebook, but on the external keyboard, F<numbers> are not
+ // rewritten.
+ CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+ switches::kHasChromeOSKeyboard, "");
- // Search+Left -> Home
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_HOME,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_home_,
- 0U,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_LEFT,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_left_,
- Mod4Mask));
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(default_tests); ++i) {
+ EXPECT_EQ(GetExpectedResultAsString(default_tests[i].output,
+ 0,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].output_native,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ default_tests[i].input,
+ 0,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].input_native,
+ 0));
+
+ // Search key as a modifier does not change the outcome.
+ EXPECT_EQ(GetExpectedResultAsString(default_tests[i].output,
+ 0,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].output_native,
+ Mod4Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ default_tests[i].input,
+ 0,
+ ui::ET_KEY_PRESSED,
+ default_tests[i].input_native,
+ Mod4Mask));
+ }
- // Ctrl+Alt+Down -> Ctrl+Alt+Down
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DOWN,
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_down_,
- Mod1Mask | ControlMask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_DOWN,
- ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_down_,
- Mod1Mask | ControlMask));
+ // When on a chromebook keyboard, F<number> keys do special stuff.
+ rewriter.set_force_chromeos_keyboard_for_testing(true);
+
+ struct {
+ ui::KeyboardCode input;
+ KeyCode input_native;
+ ui::KeyboardCode output;
+ KeyCode output_native;
+ } chromeos_tests[] = {
+ { // F1 -> Back
+ ui::VKEY_F1, keycode_f1_,
+ ui::VKEY_BROWSER_BACK, keycode_browser_back_
+ },
+ { // F2 -> Forward
+ ui::VKEY_F2, keycode_f2_,
+ ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_
+ },
+ { // F3 -> Refresh
+ ui::VKEY_F3, keycode_f3_,
+ ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_
+ },
+ { // F4 -> Launch App 2
+ ui::VKEY_F4, keycode_f4_,
+ ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_
+ },
+ { // F5 -> Launch App 1
+ ui::VKEY_F5, keycode_f5_,
+ ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_
+ },
+ { // F6 -> Brightness down
+ ui::VKEY_F6, keycode_f6_,
+ ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_
+ },
+ { // F7 -> Brightness up
+ ui::VKEY_F7, keycode_f7_,
+ ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_
+ },
+ { // F8 -> Volume Mute
+ ui::VKEY_F8, keycode_f8_,
+ ui::VKEY_VOLUME_MUTE, keycode_volume_mute_
+ },
+ { // F9 -> Volume Down
+ ui::VKEY_F9, keycode_f9_,
+ ui::VKEY_VOLUME_DOWN, keycode_volume_down_
+ },
+ { // F10 -> Volume Up
+ ui::VKEY_F10, keycode_f10_,
+ ui::VKEY_VOLUME_UP, keycode_volume_up_
+ },
+ { // F11 -> F11
+ ui::VKEY_F11, keycode_f11_,
+ ui::VKEY_F11, keycode_f11_
+ },
+ { // F12 -> F12
+ ui::VKEY_F12, keycode_f12_,
+ ui::VKEY_F12, keycode_f12_,
+ },
+ // The number row should not be rewritten.
+ { ui::VKEY_1, keycode_1_, ui::VKEY_1, keycode_1_, },
+ { ui::VKEY_2, keycode_2_, ui::VKEY_2, keycode_2_, },
+ { ui::VKEY_3, keycode_3_, ui::VKEY_3, keycode_3_, },
+ { ui::VKEY_4, keycode_4_, ui::VKEY_4, keycode_4_, },
+ { ui::VKEY_5, keycode_5_, ui::VKEY_5, keycode_5_, },
+ { ui::VKEY_6, keycode_6_, ui::VKEY_6, keycode_6_, },
+ { ui::VKEY_7, keycode_7_, ui::VKEY_7, keycode_7_, },
+ { ui::VKEY_8, keycode_8_, ui::VKEY_8, keycode_8_, },
+ { ui::VKEY_9, keycode_9_, ui::VKEY_9, keycode_9_, },
+ { ui::VKEY_0, keycode_0_, ui::VKEY_0, keycode_0_, },
+ { ui::VKEY_OEM_MINUS, keycode_minus_, ui::VKEY_OEM_MINUS, keycode_minus_, },
+ { ui::VKEY_OEM_PLUS, keycode_equal_, ui::VKEY_OEM_PLUS, keycode_equal_, },
+ };
+
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) {
+ EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output,
+ 0,
+ ui::ET_KEY_PRESSED,
+ chromeos_tests[i].output_native,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ chromeos_tests[i].input,
+ 0,
+ ui::ET_KEY_PRESSED,
+ chromeos_tests[i].input_native,
+ 0));
+
+ // Search key as a modifier does not change the outcome.
+ EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output,
+ 0,
+ ui::ET_KEY_PRESSED,
+ chromeos_tests[i].output_native,
+ Mod4Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ chromeos_tests[i].input,
+ 0,
+ ui::ET_KEY_PRESSED,
+ chromeos_tests[i].input_native,
+ Mod4Mask));
+ }
- // Search+Right -> End
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_end_,
- 0U,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_RIGHT,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_right_,
- Mod4Mask));
+ // Make Search key act like a Function key for accessing extended key
+ // bindings. Now Search key as a modifier will make the number row
+ // act like the F<number> row.
+ CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+ switches::kEnableChromebookFunctionKey, "");
+ BooleanPrefMember search_key_as_function_key;
+ search_key_as_function_key.Init(prefs::kLanguageSearchKeyActsAsFunctionKey,
+ &prefs, NULL);
+ search_key_as_function_key.SetValue(true);
- // Ctrl+Search+Left -> Control+Home
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_HOME,
- ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_home_,
- ControlMask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_LEFT,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_left_,
- Mod4Mask | ControlMask));
+ // Without a Search key modifier, the results should be the same as before.
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) {
+ EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output,
+ 0,
+ ui::ET_KEY_PRESSED,
+ chromeos_tests[i].output_native,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ chromeos_tests[i].input,
+ 0,
+ ui::ET_KEY_PRESSED,
+ chromeos_tests[i].input_native,
+ 0));
+ }
- // Ctrl+Search+Right -> Control+End
- EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END,
- ui::EF_CONTROL_DOWN,
- ui::ET_KEY_PRESSED,
- keycode_end_,
- ControlMask,
- KeyPress),
- GetRewrittenEventAsString(&rewriter,
- ui::VKEY_RIGHT,
- 0,
- ui::ET_KEY_PRESSED,
- keycode_right_,
- Mod4Mask | ControlMask));
+ struct {
+ ui::KeyboardCode input;
+ KeyCode input_native;
+ ui::KeyboardCode output;
+ KeyCode output_native;
+ } search_key_tests[] = {
+ // The number row should be rewritten as the F<number> row.
+ { ui::VKEY_1, keycode_1_, ui::VKEY_F1, keycode_f1_, },
+ { ui::VKEY_2, keycode_2_, ui::VKEY_F2, keycode_f2_, },
+ { ui::VKEY_3, keycode_3_, ui::VKEY_F3, keycode_f3_, },
+ { ui::VKEY_4, keycode_4_, ui::VKEY_F4, keycode_f4_, },
+ { ui::VKEY_5, keycode_5_, ui::VKEY_F5, keycode_f5_, },
+ { ui::VKEY_6, keycode_6_, ui::VKEY_F6, keycode_f6_, },
+ { ui::VKEY_7, keycode_7_, ui::VKEY_F7, keycode_f7_, },
+ { ui::VKEY_8, keycode_8_, ui::VKEY_F8, keycode_f8_, },
+ { ui::VKEY_9, keycode_9_, ui::VKEY_F9, keycode_f9_, },
+ { ui::VKEY_0, keycode_0_, ui::VKEY_F10, keycode_f10_, },
+ { ui::VKEY_OEM_MINUS, keycode_minus_, ui::VKEY_F11, keycode_f11_, },
+ { ui::VKEY_OEM_PLUS, keycode_equal_, ui::VKEY_F12, keycode_f12_, },
+ };
+
+ // But with a Search key as a modifier, we should have new rewrite rules now.
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(search_key_tests); ++i) {
+ EXPECT_EQ(GetExpectedResultAsString(search_key_tests[i].output,
+ 0,
+ ui::ET_KEY_PRESSED,
+ search_key_tests[i].output_native,
+ 0,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ search_key_tests[i].input,
+ 0,
+ ui::ET_KEY_PRESSED,
+ search_key_tests[i].input_native,
+ Mod4Mask));
+
+ // Other modifiers should be preserved.
+ EXPECT_EQ(GetExpectedResultAsString(search_key_tests[i].output,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ search_key_tests[i].output_native,
+ Mod1Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ search_key_tests[i].input,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ search_key_tests[i].input_native,
+ Mod4Mask | Mod1Mask));
+
+ EXPECT_EQ(GetExpectedResultAsString(search_key_tests[i].output,
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ search_key_tests[i].output_native,
+ ControlMask | Mod1Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ search_key_tests[i].input,
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ search_key_tests[i].input_native,
+ Mod4Mask | ControlMask | Mod1Mask));
+ }
*CommandLine::ForCurrentProcess() = original_cl;
}
TEST_F(EventRewriterTest, TestRewriteBackspaceAndArrowKeysWithSearchRemapped) {
+ const CommandLine original_cl(*CommandLine::ForCurrentProcess());
+
// Remap Search to Control.
TestingPrefService prefs;
chromeos::Preferences::RegisterUserPrefs(&prefs);
@@ -2005,6 +2386,10 @@ TEST_F(EventRewriterTest, TestRewriteBackspaceAndArrowKeysWithSearchRemapped) {
EventRewriter rewriter;
rewriter.set_pref_service_for_testing(&prefs);
+ CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+ switches::kHasChromeOSKeyboard, "");
+ rewriter.set_force_chromeos_keyboard_for_testing(true);
+
// Alt+Search+Down -> End
EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END,
0,
@@ -2032,6 +2417,8 @@ TEST_F(EventRewriterTest, TestRewriteBackspaceAndArrowKeysWithSearchRemapped) {
ui::ET_KEY_PRESSED,
keycode_down_,
ShiftMask | Mod1Mask | Mod4Mask));
+
+ *CommandLine::ForCurrentProcess() = original_cl;
}
TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
« no previous file with comments | « chrome/browser/ui/ash/event_rewriter.cc ('k') | chrome/browser/ui/ash/volume_controller_chromeos.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698