Chromium Code Reviews| Index: content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm |
| diff --git a/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm b/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e622e1732aad627f16e96d4c70743fb44986d522 |
| --- /dev/null |
| +++ b/content/browser/renderer_host/input/web_input_event_builders_mac_unittest.mm |
| @@ -0,0 +1,162 @@ |
| +// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
|
Alexei Svitkine (slow)
2015/09/14 17:14:43
No (c)
dtapuska
2015/09/14 18:31:21
Done.
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#import <Cocoa/Cocoa.h> |
| +#include <gtest/gtest.h> |
|
Alexei Svitkine (slow)
2015/09/14 17:14:43
Can this be #include "testing/gtest/include/gtest/
dtapuska
2015/09/14 18:31:21
Done.
|
| + |
| +#include "content/browser/renderer_host/input/web_input_event_builders_mac.h" |
|
Alexei Svitkine (slow)
2015/09/14 17:14:43
This should be the first include.
dtapuska
2015/09/14 18:31:21
Done.
|
| +#include "ui/events/keycodes/keyboard_codes.h" |
| + |
| +using blink::WebKeyboardEvent; |
| +using blink::WebInputEvent; |
| +using content::WebKeyboardEventBuilder; |
| + |
| +namespace { |
| + |
| +struct KeyMappingEntry { |
| + int mac_key_code; |
| + unichar character; |
| + int windows_key_code; |
| +}; |
| + |
| +struct ModifierKey { |
| + int mac_key_code; |
| + int left_or_right_mask; |
| + int non_specific_mask; |
| +}; |
| + |
| +// Modifier keys, grouped into left/right pairs. |
| +const ModifierKey kModifierKeys[] = { |
| + {56, 1 << 1, NSShiftKeyMask}, // Left Shift |
| + {60, 1 << 2, NSShiftKeyMask}, // Right Shift |
| + {55, 1 << 3, NSCommandKeyMask}, // Left Command |
| + {54, 1 << 4, NSCommandKeyMask}, // Right Command |
| + {58, 1 << 5, NSAlternateKeyMask}, // Left Alt |
| + {61, 1 << 6, NSAlternateKeyMask}, // Right Alt |
| + {59, 1 << 0, NSControlKeyMask}, // Left Control |
| + {62, 1 << 13, NSControlKeyMask}, // Right Control |
| +}; |
| + |
| +NSEvent* BuildFakeKeyEvent(NSUInteger key_code, |
| + unichar character, |
| + NSUInteger modifier_flags, |
| + NSEventType event_type) { |
| + NSString* string = [NSString stringWithCharacters:&character length:1]; |
| + return [NSEvent keyEventWithType:event_type |
| + location:NSZeroPoint |
| + modifierFlags:modifier_flags |
| + timestamp:0.0 |
| + windowNumber:0 |
| + context:nil |
| + characters:string |
| + charactersIgnoringModifiers:string |
| + isARepeat:NO |
| + keyCode:key_code]; |
| +} |
| + |
| +} // namespace |
| + |
| +// Test that arrow keys don't have numpad modifier set. |
| +TEST(WebInputEventBuilderMacTest, ArrowKeyNumPad) { |
| + // Left |
| + NSEvent* mac_event = BuildFakeKeyEvent(0x7B, NSLeftArrowFunctionKey, |
| + NSNumericPadKeyMask, NSKeyDown); |
| + WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(0, web_event.modifiers); |
| + |
| + // Right |
| + mac_event = BuildFakeKeyEvent(0x7C, NSRightArrowFunctionKey, |
| + NSNumericPadKeyMask, NSKeyDown); |
| + web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(0, web_event.modifiers); |
| + |
| + // Down |
| + mac_event = BuildFakeKeyEvent(0x7D, NSDownArrowFunctionKey, |
| + NSNumericPadKeyMask, NSKeyDown); |
| + web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(0, web_event.modifiers); |
| + |
| + // Up |
| + mac_event = BuildFakeKeyEvent(0x7E, NSUpArrowFunctionKey, NSNumericPadKeyMask, |
| + NSKeyDown); |
| + web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(0, web_event.modifiers); |
| +} |
| + |
| +// Test that numpad keys get mapped correctly. |
| +TEST(WebInputEventBuilderMacTest, NumPadMapping) { |
| + KeyMappingEntry table[] = { |
| + {65, '.', ui::VKEY_DECIMAL}, |
| + {67, '*', ui::VKEY_MULTIPLY}, |
| + {69, '+', ui::VKEY_ADD}, |
| + {71, NSClearLineFunctionKey, ui::VKEY_CLEAR}, |
| + {75, '/', ui::VKEY_DIVIDE}, |
| + {76, 3, ui::VKEY_RETURN}, |
| + {78, '-', ui::VKEY_SUBTRACT}, |
| + {81, '=', ui::VKEY_OEM_PLUS}, |
| + {82, '0', ui::VKEY_0}, |
| + {83, '1', ui::VKEY_1}, |
| + {84, '2', ui::VKEY_2}, |
| + {85, '3', ui::VKEY_3}, |
| + {86, '4', ui::VKEY_4}, |
| + {87, '5', ui::VKEY_5}, |
| + {88, '6', ui::VKEY_6}, |
| + {89, '7', ui::VKEY_7}, |
| + {91, '8', ui::VKEY_8}, |
| + {92, '9', ui::VKEY_9}, |
| + }; |
| + |
| + for (size_t i = 0; i < arraysize(table); ++i) { |
| + NSEvent* mac_event = BuildFakeKeyEvent(table[i].mac_key_code, |
| + table[i].character, 0, NSKeyDown); |
| + WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(table[i].windows_key_code, web_event.windowsKeyCode); |
| + } |
| +} |
| + |
| +// Test that left- and right-hand modifier keys are interpreted correctly when |
| +// pressed simultaneously. |
| +TEST(WebInputEventFactoryTestMac, SimultaneousModifierKeys) { |
| + for (size_t i = 0; i < arraysize(kModifierKeys) / 2; ++i) { |
| + const ModifierKey& left = kModifierKeys[2 * i]; |
| + const ModifierKey& right = kModifierKeys[2 * i + 1]; |
| + // Press the left key. |
| + NSEvent* mac_event = BuildFakeKeyEvent( |
| + left.mac_key_code, 0, left.left_or_right_mask | left.non_specific_mask, |
| + NSFlagsChanged); |
| + WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(WebInputEvent::RawKeyDown, web_event.type); |
| + // Press the right key |
| + mac_event = |
| + BuildFakeKeyEvent(right.mac_key_code, 0, |
| + left.left_or_right_mask | right.left_or_right_mask | |
| + left.non_specific_mask, |
| + NSFlagsChanged); |
| + web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(WebInputEvent::RawKeyDown, web_event.type); |
| + // Release the right key |
| + mac_event = BuildFakeKeyEvent( |
| + right.mac_key_code, 0, left.left_or_right_mask | left.non_specific_mask, |
| + NSFlagsChanged); |
| + // Release the left key |
| + mac_event = BuildFakeKeyEvent(left.mac_key_code, 0, 0, NSFlagsChanged); |
| + web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(WebInputEvent::KeyUp, web_event.type); |
| + } |
| +} |
| + |
| +// Test that individual modifier keys are still reported correctly, even if the |
| +// undocumented left- or right-hand flags are not set. |
| +TEST(WebInputEventBuilderMacTest, MissingUndocumentedModifierFlags) { |
| + for (size_t i = 0; i < arraysize(kModifierKeys); ++i) { |
| + const ModifierKey& key = kModifierKeys[i]; |
| + NSEvent* mac_event = BuildFakeKeyEvent( |
| + key.mac_key_code, 0, key.non_specific_mask, NSFlagsChanged); |
| + WebKeyboardEvent web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(WebInputEvent::RawKeyDown, web_event.type); |
| + mac_event = BuildFakeKeyEvent(key.mac_key_code, 0, 0, NSFlagsChanged); |
| + web_event = WebKeyboardEventBuilder::Build(mac_event); |
| + EXPECT_EQ(WebInputEvent::KeyUp, web_event.type); |
| + } |
| +} |