| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> |
| 6 |
| 5 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 6 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 7 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 8 #include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h" | 10 #include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "ui/events/event.h" | 12 #include "ui/events/event.h" |
| 11 #include "ui/events/test/events_test_utils_x11.h" | |
| 12 | |
| 13 #include <X11/keysym.h> | |
| 14 #include <X11/XF86keysym.h> | |
| 15 #include <X11/Xlib.h> | |
| 16 | 13 |
| 17 namespace chromeos { | 14 namespace chromeos { |
| 18 | 15 |
| 19 class KeyboardDrivenEventRewriterTest : public testing::Test { | 16 class KeyboardDrivenEventRewriterTest : public testing::Test { |
| 20 public: | 17 public: |
| 21 KeyboardDrivenEventRewriterTest() | 18 KeyboardDrivenEventRewriterTest() {} |
| 22 : display_(gfx::GetXDisplay()), | |
| 23 keycode_a_(XKeysymToKeycode(display_, XK_a)), | |
| 24 keycode_up_(XKeysymToKeycode(display_, XK_Up)), | |
| 25 keycode_down_(XKeysymToKeycode(display_, XK_Down)), | |
| 26 keycode_left_(XKeysymToKeycode(display_, XK_Left)), | |
| 27 keycode_right_(XKeysymToKeycode(display_, XK_Right)), | |
| 28 keycode_return_(XKeysymToKeycode(display_, XK_Return)), | |
| 29 keycode_f6_(XKeysymToKeycode(display_, XK_F6)) { | |
| 30 } | |
| 31 | 19 |
| 32 virtual ~KeyboardDrivenEventRewriterTest() {} | 20 virtual ~KeyboardDrivenEventRewriterTest() {} |
| 33 | 21 |
| 34 protected: | 22 protected: |
| 35 std::string GetRewrittenEventAsString(ui::KeyboardCode ui_keycode, | 23 std::string GetRewrittenEventAsString(ui::KeyboardCode ui_keycode, |
| 36 int ui_flags, | 24 int ui_flags, |
| 37 ui::EventType ui_type, | 25 ui::EventType ui_type) { |
| 38 KeyCode x_keycode, | 26 ui::KeyEvent keyevent(ui_type, ui_keycode, ui_flags, false); |
| 39 unsigned int x_state) { | 27 scoped_ptr<ui::Event> rewritten_event; |
| 40 ui::ScopedXI2Event xev; | 28 ui::EventRewriteStatus status = |
| 41 xev.InitKeyEvent(ui_type, ui_keycode, ui_flags); | 29 rewriter_.RewriteForTesting(keyevent, &rewritten_event); |
| 42 XEvent* xevent = xev; | 30 return base::StringPrintf( |
| 43 xevent->xkey.keycode = x_keycode; | 31 "ui_flags=%d status=%d", |
| 44 xevent->xkey.state = x_state; | 32 rewritten_event ? rewritten_event->flags() : keyevent.flags(), |
| 45 bool changed = rewriter_.RewriteForTesting(xevent); | 33 status); |
| 46 ui::KeyEvent keyevent(xev, false /* is_char */); | |
| 47 return base::StringPrintf("ui_flags=%d x_state=%u changed=%d", | |
| 48 keyevent.flags(), | |
| 49 xevent->xkey.state, | |
| 50 changed); | |
| 51 } | 34 } |
| 52 | 35 |
| 53 std::string GetExpectedResultAsString(int ui_flags, | 36 std::string GetExpectedResultAsString(int ui_flags, |
| 54 unsigned int x_state, | 37 ui::EventRewriteStatus status) { |
| 55 bool changed) { | 38 return base::StringPrintf("ui_flags=%d status=%u", ui_flags, status); |
| 56 return base::StringPrintf( | |
| 57 "ui_flags=%d x_state=%u changed=%d", ui_flags, x_state, changed); | |
| 58 } | 39 } |
| 59 | 40 |
| 60 XDisplay* display_; | |
| 61 const KeyCode keycode_a_; | |
| 62 const KeyCode keycode_up_; | |
| 63 const KeyCode keycode_down_; | |
| 64 const KeyCode keycode_left_; | |
| 65 const KeyCode keycode_right_; | |
| 66 const KeyCode keycode_return_; | |
| 67 const KeyCode keycode_f6_; | |
| 68 | |
| 69 KeyboardDrivenEventRewriter rewriter_; | 41 KeyboardDrivenEventRewriter rewriter_; |
| 70 | 42 |
| 71 private: | 43 private: |
| 72 DISALLOW_COPY_AND_ASSIGN(KeyboardDrivenEventRewriterTest); | 44 DISALLOW_COPY_AND_ASSIGN(KeyboardDrivenEventRewriterTest); |
| 73 }; | 45 }; |
| 74 | 46 |
| 75 TEST_F(KeyboardDrivenEventRewriterTest, PassThrough) { | 47 TEST_F(KeyboardDrivenEventRewriterTest, PassThrough) { |
| 76 struct { | 48 struct { |
| 77 ui::KeyboardCode ui_keycode; | 49 ui::KeyboardCode ui_keycode; |
| 78 int ui_flags; | 50 int ui_flags; |
| 79 KeyCode x_keycode; | |
| 80 unsigned int x_state; | |
| 81 } kTests[] = { | 51 } kTests[] = { |
| 82 { ui::VKEY_A, ui::EF_NONE, keycode_a_, 0 }, | 52 { ui::VKEY_A, ui::EF_NONE }, |
| 83 { ui::VKEY_A, ui::EF_CONTROL_DOWN, keycode_a_, ControlMask }, | 53 { ui::VKEY_A, ui::EF_CONTROL_DOWN }, |
| 84 { ui::VKEY_A, ui::EF_ALT_DOWN, keycode_a_, Mod1Mask }, | 54 { ui::VKEY_A, ui::EF_ALT_DOWN }, |
| 85 { ui::VKEY_A, ui::EF_SHIFT_DOWN, keycode_a_, ShiftMask }, | 55 { ui::VKEY_A, ui::EF_SHIFT_DOWN }, |
| 86 { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 56 { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
| 87 keycode_a_, ControlMask | Mod1Mask }, | 57 { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN }, |
| 88 { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN, | |
| 89 keycode_a_, ControlMask | Mod1Mask | ShiftMask }, | |
| 90 | 58 |
| 91 { ui::VKEY_LEFT, ui::EF_NONE, keycode_left_, 0 }, | 59 { ui::VKEY_LEFT, ui::EF_NONE }, |
| 92 { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN, keycode_left_, ControlMask }, | 60 { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN }, |
| 93 { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 61 { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
| 94 keycode_left_, ControlMask | Mod1Mask }, | |
| 95 | 62 |
| 96 { ui::VKEY_RIGHT, ui::EF_NONE, keycode_right_, 0 }, | 63 { ui::VKEY_RIGHT, ui::EF_NONE }, |
| 97 { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN, keycode_right_, ControlMask }, | 64 { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN }, |
| 98 { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 65 { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
| 99 keycode_right_, ControlMask | Mod1Mask }, | |
| 100 | 66 |
| 101 { ui::VKEY_UP, ui::EF_NONE, keycode_up_, 0 }, | 67 { ui::VKEY_UP, ui::EF_NONE }, |
| 102 { ui::VKEY_UP, ui::EF_CONTROL_DOWN, keycode_up_, ControlMask }, | 68 { ui::VKEY_UP, ui::EF_CONTROL_DOWN }, |
| 103 { ui::VKEY_UP, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 69 { ui::VKEY_UP, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
| 104 keycode_up_, ControlMask | Mod1Mask }, | |
| 105 | 70 |
| 106 { ui::VKEY_DOWN, ui::EF_NONE, keycode_down_, 0 }, | 71 { ui::VKEY_DOWN, ui::EF_NONE }, |
| 107 { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN, keycode_down_, ControlMask }, | 72 { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN }, |
| 108 { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 73 { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
| 109 keycode_down_, ControlMask | Mod1Mask }, | |
| 110 | 74 |
| 111 { ui::VKEY_RETURN, ui::EF_NONE, keycode_return_, 0 }, | 75 { ui::VKEY_RETURN, ui::EF_NONE }, |
| 112 { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN, keycode_return_, ControlMask }, | 76 { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN }, |
| 113 { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 77 { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
| 114 keycode_return_, ControlMask | Mod1Mask }, | |
| 115 }; | 78 }; |
| 116 | 79 |
| 117 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { | 80 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { |
| 118 EXPECT_EQ(GetExpectedResultAsString(kTests[i].ui_flags, | 81 EXPECT_EQ(GetExpectedResultAsString(kTests[i].ui_flags, |
| 119 kTests[i].x_state, | 82 ui::EVENT_REWRITE_CONTINUE), |
| 120 false), | |
| 121 GetRewrittenEventAsString(kTests[i].ui_keycode, | 83 GetRewrittenEventAsString(kTests[i].ui_keycode, |
| 122 kTests[i].ui_flags, | 84 kTests[i].ui_flags, |
| 123 ui::ET_KEY_PRESSED, | 85 ui::ET_KEY_PRESSED)) |
| 124 kTests[i].x_keycode, | |
| 125 kTests[i].x_state)) | |
| 126 << "Test case " << i; | 86 << "Test case " << i; |
| 127 } | 87 } |
| 128 } | 88 } |
| 129 | 89 |
| 130 TEST_F(KeyboardDrivenEventRewriterTest, Rewrite) { | 90 TEST_F(KeyboardDrivenEventRewriterTest, Rewrite) { |
| 131 const int kModifierMask = ui::EF_SHIFT_DOWN; | 91 const int kModifierMask = ui::EF_SHIFT_DOWN; |
| 132 const unsigned int kXState = ShiftMask; | |
| 133 | 92 |
| 134 struct { | 93 struct { |
| 135 ui::KeyboardCode ui_keycode; | 94 ui::KeyboardCode ui_keycode; |
| 136 int ui_flags; | 95 int ui_flags; |
| 137 KeyCode x_keycode; | |
| 138 unsigned int x_state; | |
| 139 } kTests[] = { | 96 } kTests[] = { |
| 140 { ui::VKEY_LEFT, kModifierMask, keycode_left_, kXState }, | 97 { ui::VKEY_LEFT, kModifierMask }, |
| 141 { ui::VKEY_RIGHT, kModifierMask, keycode_right_, kXState }, | 98 { ui::VKEY_RIGHT, kModifierMask }, |
| 142 { ui::VKEY_UP, kModifierMask, keycode_up_, kXState }, | 99 { ui::VKEY_UP, kModifierMask }, |
| 143 { ui::VKEY_DOWN, kModifierMask, keycode_down_, kXState }, | 100 { ui::VKEY_DOWN, kModifierMask }, |
| 144 { ui::VKEY_RETURN, kModifierMask, keycode_return_, kXState }, | 101 { ui::VKEY_RETURN, kModifierMask }, |
| 145 { ui::VKEY_F6, kModifierMask, keycode_f6_, kXState }, | 102 { ui::VKEY_F6, kModifierMask }, |
| 146 }; | 103 }; |
| 147 | 104 |
| 148 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { | 105 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { |
| 149 EXPECT_EQ(GetExpectedResultAsString(ui::EF_NONE, 0, true), | 106 EXPECT_EQ(GetExpectedResultAsString(ui::EF_NONE, |
| 107 ui::EVENT_REWRITE_REWRITTEN), |
| 150 GetRewrittenEventAsString(kTests[i].ui_keycode, | 108 GetRewrittenEventAsString(kTests[i].ui_keycode, |
| 151 kTests[i].ui_flags, | 109 kTests[i].ui_flags, |
| 152 ui::ET_KEY_PRESSED, | 110 ui::ET_KEY_PRESSED)) |
| 153 kTests[i].x_keycode, | |
| 154 kTests[i].x_state)) | |
| 155 << "Test case " << i; | 111 << "Test case " << i; |
| 156 } | 112 } |
| 157 } | 113 } |
| 158 | 114 |
| 159 } // namespace chromeos | 115 } // namespace chromeos |
| OLD | NEW |