0

Get rid of DomKey::Constant<...>::Character/Dead

As mentioned in the comment, this construct can now be replaced
with constexpr functions.

BUG=b:324930404
TEST=events_unittests

Change-Id: I39d36a07dcdd30ef87e02b29580d46fd19ddb959
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5314181
Reviewed-by: Hidehiko Abe <hidehiko@chromium.org>
Reviewed-by: Zentaro Kavanagh <zentaro@chromium.org>
Commit-Queue: Satoru Takabayashi <satorux@chromium.org>
Reviewed-by: Wez <wez@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1318412}
This commit is contained in:
Satoru Takabayashi
2024-06-24 03:23:27 +00:00
committed by Chromium LUCI CQ
parent e6e4b9c777
commit 750034dab4
11 changed files with 399 additions and 433 deletions

@ -174,10 +174,10 @@ template <ui::DomCode code,
ui::KeyboardCode keycode,
char shifted_key = key>
using TestCharKey = TestKey<code,
ui::DomKey::Constant<key>::Character,
ui::DomKey::FromCharacter(key),
keycode,
ui::EF_NONE,
ui::DomKey::Constant<shifted_key>::Character>;
ui::DomKey::FromCharacter(shifted_key)>;
// Modifier keys.
using KeyLShift = TestKey<ui::DomCode::SHIFT_LEFT,

@ -78,40 +78,40 @@ mojom::KeyEvent GetStaticShortcutAction(mojom::StaticShortcutAction action) {
case mojom::StaticShortcutAction::kMiddleClick:
NOTREACHED_NORETURN();
case mojom::StaticShortcutAction::kCopy:
key_event = mojom::KeyEvent(
ui::VKEY_C, static_cast<int>(ui::DomCode::US_C),
static_cast<int>(ui::DomKey::Constant<'c'>::Character),
ui::EF_CONTROL_DOWN, /*key_display=*/"");
key_event =
mojom::KeyEvent(ui::VKEY_C, static_cast<int>(ui::DomCode::US_C),
static_cast<int>(ui::DomKey::FromCharacter('c')),
ui::EF_CONTROL_DOWN, /*key_display=*/"");
break;
case mojom::StaticShortcutAction::kPaste:
key_event = mojom::KeyEvent(
ui::VKEY_V, static_cast<int>(ui::DomCode::US_V),
static_cast<int>(ui::DomKey::Constant<'v'>::Character),
ui::EF_CONTROL_DOWN, /*key_display=*/"");
key_event =
mojom::KeyEvent(ui::VKEY_V, static_cast<int>(ui::DomCode::US_V),
static_cast<int>(ui::DomKey::FromCharacter('v')),
ui::EF_CONTROL_DOWN, /*key_display=*/"");
break;
case mojom::StaticShortcutAction::kUndo:
key_event = mojom::KeyEvent(
ui::VKEY_Z, static_cast<int>(ui::DomCode::US_Z),
static_cast<int>(ui::DomKey::Constant<'z'>::Character),
ui::EF_CONTROL_DOWN, /*key_display=*/"");
key_event =
mojom::KeyEvent(ui::VKEY_Z, static_cast<int>(ui::DomCode::US_Z),
static_cast<int>(ui::DomKey::FromCharacter('z')),
ui::EF_CONTROL_DOWN, /*key_display=*/"");
break;
case mojom::StaticShortcutAction::kRedo:
key_event = mojom::KeyEvent(
ui::VKEY_Z, static_cast<int>(ui::DomCode::US_Z),
static_cast<int>(ui::DomKey::Constant<'z'>::Character),
static_cast<int>(ui::DomKey::FromCharacter('z')),
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, /*key_display=*/"");
break;
case mojom::StaticShortcutAction::kZoomIn:
key_event = mojom::KeyEvent(
ui::VKEY_OEM_PLUS, static_cast<int>(ui::DomCode::EQUAL),
static_cast<int>(ui::DomKey::Constant<'='>::Character),
ui::EF_CONTROL_DOWN, /*key_display=*/"");
static_cast<int>(ui::DomKey::FromCharacter('=')), ui::EF_CONTROL_DOWN,
/*key_display=*/"");
break;
case mojom::StaticShortcutAction::kZoomOut:
key_event = mojom::KeyEvent(
ui::VKEY_OEM_MINUS, static_cast<int>(ui::DomCode::MINUS),
static_cast<int>(ui::DomKey::Constant<'-'>::Character),
ui::EF_CONTROL_DOWN, /*key_display=*/"");
static_cast<int>(ui::DomKey::FromCharacter('-')), ui::EF_CONTROL_DOWN,
/*key_display=*/"");
break;
case mojom::StaticShortcutAction::kPreviousPage:
key_event = mojom::KeyEvent(ui::VKEY_BROWSER_BACK,

@ -185,10 +185,10 @@ template <ui::DomCode code,
ui::KeyboardCode keycode,
char shifted_key = key>
using TestCharKey = TestKey<code,
ui::DomKey::Constant<key>::Character,
ui::DomKey::FromCharacter(key),
keycode,
ui::EF_NONE,
ui::DomKey::Constant<shifted_key>::Character>;
ui::DomKey::FromCharacter(shifted_key)>;
template <ui::EventFlags changed_button_flag, uint32_t linux_key_code = 0>
struct TestButton {
@ -993,7 +993,7 @@ TEST_F(PeripheralCustomizationEventRewriterTest,
/*name=*/"", mojom::Button::NewVkey(ui::VKEY_0),
mojom::RemappingAction::NewKeyEvent(mojom::KeyEvent::New(
ui::VKEY_OEM_MINUS, static_cast<int>(ui::DomCode::MINUS),
static_cast<int>(ui::DomKey::Constant<'-'>::Character), ui::EF_NONE,
static_cast<int>(ui::DomKey::FromCharacter('-')), ui::EF_NONE,
/*key_display=*/""))));
EXPECT_EQ(KeyMinus::Typed(ui::EF_IS_CUSTOMIZED_FROM_BUTTON),
RunRewriter(KeyDigit0::Typed()));
@ -1003,7 +1003,7 @@ TEST_F(PeripheralCustomizationEventRewriterTest,
layout_engine->SetCustomLookupTableForTesting(de_table);
ash::AcceleratorKeycodeLookupCache::Get()->Clear();
EXPECT_EQ((TestKey<ui::DomCode::MINUS, ui::DomKey::Constant<u'ß'>::Character,
EXPECT_EQ((TestKey<ui::DomCode::MINUS, ui::DomKey::FromCharacter(u'ß'),
ui::VKEY_OEM_4>::Typed(ui::EF_IS_CUSTOMIZED_FROM_BUTTON)),
RunRewriter(KeyDigit0::Typed()));
}
@ -1015,7 +1015,7 @@ TEST_F(PeripheralCustomizationEventRewriterTest,
/*name=*/"", mojom::Button::NewVkey(ui::VKEY_0),
mojom::RemappingAction::NewKeyEvent(mojom::KeyEvent::New(
ui::VKEY_A, static_cast<int>(ui::DomCode::US_A),
static_cast<int>(ui::DomKey::Constant<'a'>::Character), ui::EF_NONE,
static_cast<int>(ui::DomKey::FromCharacter('a')), ui::EF_NONE,
/*key_display=*/""))));
EXPECT_EQ(KeyA::Typed(ui::EF_SHIFT_DOWN | ui::EF_IS_CUSTOMIZED_FROM_BUTTON),
@ -1030,7 +1030,7 @@ TEST_F(PeripheralCustomizationEventRewriterTest,
mojom::Button::NewCustomizableButton(mojom::CustomizableButton::kForward),
mojom::RemappingAction::NewKeyEvent(mojom::KeyEvent::New(
ui::VKEY_A, static_cast<int>(ui::DomCode::US_A),
static_cast<int>(ui::DomKey::Constant<'a'>::Character), ui::EF_NONE,
static_cast<int>(ui::DomKey::FromCharacter('a')), ui::EF_NONE,
/*key_display=*/""))));
EXPECT_EQ(KeyA::Typed(ui::EF_SHIFT_DOWN | ui::EF_IS_CUSTOMIZED_FROM_BUTTON),
@ -1530,22 +1530,20 @@ INSTANTIATE_TEST_SUITE_P(
// KeyEvent rewriting test cases:
// Remap A -> B.
{{GetButton(ui::VKEY_A),
mojom::KeyEvent(
ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::Constant<'b'>::Character),
ui::EF_NONE,
/*key_display=*/"")},
mojom::KeyEvent(ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::FromCharacter('b')),
ui::EF_NONE,
/*key_display=*/"")},
{KeyA::Typed(), KeyB::Typed()}},
// Remap A -> B, Pressing B is no-op.
{{GetButton(ui::VKEY_A),
mojom::KeyEvent(
ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::Constant<'b'>::Character),
ui::EF_NONE,
/*key_display=*/"")},
mojom::KeyEvent(ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::FromCharacter('b')),
ui::EF_NONE,
/*key_display=*/"")},
{KeyB::Typed(), KeyB::Typed()}},
// Remap CTRL -> ALT.
@ -1569,12 +1567,11 @@ INSTANTIATE_TEST_SUITE_P(
// Remap A -> CTRL + SHIFT + B.
{{GetButton(ui::VKEY_A),
mojom::KeyEvent(
ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::Constant<'b'>::Character),
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
/*key_display=*/"")},
mojom::KeyEvent(ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::FromCharacter('b')),
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
/*key_display=*/"")},
{KeyA::Typed(),
std::vector<TestEventVariant>{
KeyLControl::Pressed(), KeyLShift::Pressed(ui::EF_CONTROL_DOWN),
@ -1586,12 +1583,11 @@ INSTANTIATE_TEST_SUITE_P(
// MouseEvent rewriting test cases:
// Remap Middle -> CTRL + SHIFT + B.
{{GetButton(mojom::CustomizableButton::kMiddle),
mojom::KeyEvent(
ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::Constant<'b'>::Character),
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
/*key_display=*/"")},
mojom::KeyEvent(ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::FromCharacter('b')),
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
/*key_display=*/"")},
{ButtonMiddle::Typed(),
std::vector<TestEventVariant>{
KeyLControl::Pressed(), KeyLShift::Pressed(ui::EF_CONTROL_DOWN),
@ -1602,12 +1598,11 @@ INSTANTIATE_TEST_SUITE_P(
// Remap Middle -> CTRL + SHIFT + B with ALT down.
{{GetButton(mojom::CustomizableButton::kMiddle),
mojom::KeyEvent(
ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::Constant<'b'>::Character),
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
/*key_display=*/"")},
mojom::KeyEvent(ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::FromCharacter('b')),
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
/*key_display=*/"")},
{ButtonMiddle::Typed(ui::EF_ALT_DOWN),
std::vector<TestEventVariant>{
KeyLControl::Pressed(ui::EF_ALT_DOWN),
@ -1630,24 +1625,22 @@ INSTANTIATE_TEST_SUITE_P(
// Remap Middle -> B and check left mouse button is a no-op.
{{GetButton(mojom::CustomizableButton::kMiddle),
mojom::KeyEvent(
ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::Constant<'b'>::Character),
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
/*key_display=*/"")},
mojom::KeyEvent(ui::VKEY_B,
static_cast<int>(ui::DomCode::US_B),
static_cast<int>(ui::DomKey::FromCharacter('b')),
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN,
/*key_display=*/"")},
{ButtonLeft::Typed(ui::EF_ALT_DOWN),
ButtonLeft::Typed(ui::EF_ALT_DOWN)}},
// Scroll Wheel tests:
{{GetButton(mojom::CustomizableButton::kScrollLeft),
mojom::KeyEvent(
ui::VKEY_Z,
static_cast<int>(ui::DomCode::US_Z),
static_cast<int>(ui::DomKey::Constant<'z'>::Character),
ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN |
ui::EF_ALT_DOWN,
/*key_display=*/"")},
mojom::KeyEvent(ui::VKEY_Z,
static_cast<int>(ui::DomCode::US_Z),
static_cast<int>(ui::DomKey::FromCharacter('z')),
ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN |
ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
/*key_display=*/"")},
{ScrollLeft::Typed(),
std::vector<TestEventVariant>{
KeyLMeta::Pressed(), KeyLControl::Pressed(ui::EF_COMMAND_DOWN),
@ -1665,12 +1658,11 @@ INSTANTIATE_TEST_SUITE_P(
KeyLMeta::Released()}}},
{{GetButton(mojom::CustomizableButton::kScrollLeft),
mojom::KeyEvent(
ui::VKEY_Z,
static_cast<int>(ui::DomCode::US_Z),
static_cast<int>(ui::DomKey::Constant<'z'>::Character),
ui::EF_COMMAND_DOWN,
/*key_display=*/"")},
mojom::KeyEvent(ui::VKEY_Z,
static_cast<int>(ui::DomCode::US_Z),
static_cast<int>(ui::DomKey::FromCharacter('z')),
ui::EF_COMMAND_DOWN,
/*key_display=*/"")},
{ScrollLeft::Typed(),
std::vector<TestEventVariant>{
KeyLMeta::Pressed(), KeyZ::Pressed(ui::EF_COMMAND_DOWN),

@ -300,10 +300,10 @@ template <ui::DomCode code,
ui::KeyboardCode keycode,
char shifted_key = key>
using TestCharKey = TestKey<code,
ui::DomKey::Constant<key>::Character,
ui::DomKey::FromCharacter(key),
keycode,
ui::EF_NONE,
ui::DomKey::Constant<shifted_key>::Character>;
ui::DomKey::FromCharacter(shifted_key)>;
using KeyUnknown =
TestKey<ui::DomCode::NONE, ui::DomKey::UNIDENTIFIED, ui::VKEY_UNKNOWN>;
@ -1224,21 +1224,20 @@ TEST_P(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN));
// Press Shift+Ctrl+Alt+Search+B. Confirm the event is not rewritten.
EXPECT_EQ(
KeyB::Typed(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
ui::EF_COMMAND_DOWN),
RunRewriter(
// In this case, SHIFT modifier will be set on pressing B,
// thus we should use capital 'B' as DomKey, which the current
// factory does not support.
// Modifier flags will be annotated to TestKeyEvents inside
// RunRewriter.
{TestKeyEvent{ui::ET_KEY_PRESSED, ui::DomCode::US_B,
ui::DomKey::Constant<'B'>::Character, ui::VKEY_B},
TestKeyEvent{ui::ET_KEY_RELEASED, ui::DomCode::US_B,
ui::DomKey::Constant<'B'>::Character, ui::VKEY_B}},
ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
ui::EF_COMMAND_DOWN));
EXPECT_EQ(KeyB::Typed(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN),
RunRewriter(
// In this case, SHIFT modifier will be set on pressing B,
// thus we should use capital 'B' as DomKey, which the current
// factory does not support.
// Modifier flags will be annotated to TestKeyEvents inside
// RunRewriter.
{TestKeyEvent{ui::ET_KEY_PRESSED, ui::DomCode::US_B,
ui::DomKey::FromCharacter('B'), ui::VKEY_B},
TestKeyEvent{ui::ET_KEY_RELEASED, ui::DomCode::US_B,
ui::DomKey::FromCharacter('B'), ui::VKEY_B}},
ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
ui::EF_COMMAND_DOWN));
}
}

@ -184,7 +184,7 @@ TEST_F(AcceleratorManagerTest, PositionalShortcuts_AllEqual) {
const Accelerator accelerator(VKEY_OEM_6, EF_CONTROL_DOWN);
manager.Register({accelerator}, AcceleratorManager::kNormalPriority, &target);
KeyEvent event(ui::ET_KEY_PRESSED, VKEY_OEM_6, ui::DomCode::BRACKET_RIGHT,
ui::EF_CONTROL_DOWN, ui::DomKey::Constant<']'>::Character,
ui::EF_CONTROL_DOWN, ui::DomKey::FromCharacter(']'),
base::TimeTicks());
const Accelerator trigger(event);
EXPECT_TRUE(manager.IsRegistered(trigger));
@ -207,7 +207,7 @@ TEST_F(AcceleratorManagerTest, PositionalShortcuts_MatchingDomCode) {
const Accelerator accelerator(VKEY_OEM_6, EF_CONTROL_DOWN);
manager.Register({accelerator}, AcceleratorManager::kNormalPriority, &target);
KeyEvent event(ui::ET_KEY_PRESSED, VKEY_OEM_PLUS, ui::DomCode::BRACKET_RIGHT,
ui::EF_CONTROL_DOWN, ui::DomKey::Constant<']'>::Character,
ui::EF_CONTROL_DOWN, ui::DomKey::FromCharacter(']'),
base::TimeTicks());
const Accelerator trigger(event);
EXPECT_TRUE(manager.IsRegistered(trigger));
@ -231,7 +231,7 @@ TEST_F(AcceleratorManagerTest, PositionalShortcuts_NotMatchingDomCode) {
const Accelerator accelerator(VKEY_OEM_6, EF_CONTROL_DOWN);
manager.Register({accelerator}, AcceleratorManager::kNormalPriority, &target);
KeyEvent event(ui::ET_KEY_PRESSED, VKEY_OEM_6, ui::DomCode::BRACKET_LEFT,
ui::EF_CONTROL_DOWN, ui::DomKey::Constant<']'>::Character,
ui::EF_CONTROL_DOWN, ui::DomKey::FromCharacter(']'),
base::TimeTicks());
const Accelerator trigger(event);
EXPECT_FALSE(manager.IsRegistered(trigger));
@ -255,7 +255,7 @@ TEST_F(AcceleratorManagerTest, PositionalShortcuts_NonPositionalMatch) {
const Accelerator accelerator(VKEY_Z, EF_CONTROL_DOWN);
manager.Register({accelerator}, AcceleratorManager::kNormalPriority, &target);
KeyEvent event(ui::ET_KEY_PRESSED, VKEY_Z, ui::DomCode::US_Y,
ui::EF_CONTROL_DOWN, ui::DomKey::Constant<']'>::Character,
ui::EF_CONTROL_DOWN, ui::DomKey::FromCharacter(']'),
base::TimeTicks());
const Accelerator trigger(event);
EXPECT_TRUE(manager.IsRegistered(trigger));
@ -278,7 +278,7 @@ TEST_F(AcceleratorManagerTest, PositionalShortcuts_NonPositionalNonMatch) {
const Accelerator accelerator(VKEY_Z, EF_CONTROL_DOWN);
manager.Register({accelerator}, AcceleratorManager::kNormalPriority, &target);
KeyEvent event(ui::ET_KEY_PRESSED, VKEY_Y, ui::DomCode::US_Z,
ui::EF_CONTROL_DOWN, ui::DomKey::Constant<']'>::Character,
ui::EF_CONTROL_DOWN, ui::DomKey::FromCharacter(']'),
base::TimeTicks());
const Accelerator trigger(event);
EXPECT_FALSE(manager.IsRegistered(trigger));

@ -1861,39 +1861,29 @@ void EventRewriterAsh::RewriteNumPadKeys(const KeyEvent& key_event,
static const struct NumPadRemapping {
KeyboardCode input_key_code;
MutableKeyState result;
} kNumPadRemappings[] = {{VKEY_DELETE,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'.'>::Character, VKEY_DECIMAL}},
{VKEY_INSERT,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'0'>::Character, VKEY_NUMPAD0}},
{VKEY_END,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'1'>::Character, VKEY_NUMPAD1}},
{VKEY_DOWN,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'2'>::Character, VKEY_NUMPAD2}},
{VKEY_NEXT,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'3'>::Character, VKEY_NUMPAD3}},
{VKEY_LEFT,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'4'>::Character, VKEY_NUMPAD4}},
{VKEY_CLEAR,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'5'>::Character, VKEY_NUMPAD5}},
{VKEY_RIGHT,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'6'>::Character, VKEY_NUMPAD6}},
{VKEY_HOME,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'7'>::Character, VKEY_NUMPAD7}},
{VKEY_UP,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'8'>::Character, VKEY_NUMPAD8}},
{VKEY_PRIOR,
{EF_NONE, DomCode::NONE,
DomKey::Constant<'9'>::Character, VKEY_NUMPAD9}}};
} kNumPadRemappings[] = {
{VKEY_DELETE,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('.'), VKEY_DECIMAL}},
{VKEY_INSERT,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('0'), VKEY_NUMPAD0}},
{VKEY_END,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('1'), VKEY_NUMPAD1}},
{VKEY_DOWN,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('2'), VKEY_NUMPAD2}},
{VKEY_NEXT,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('3'), VKEY_NUMPAD3}},
{VKEY_LEFT,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('4'), VKEY_NUMPAD4}},
{VKEY_CLEAR,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('5'), VKEY_NUMPAD5}},
{VKEY_RIGHT,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('6'), VKEY_NUMPAD6}},
{VKEY_HOME,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('7'), VKEY_NUMPAD7}},
{VKEY_UP,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('8'), VKEY_NUMPAD8}},
{VKEY_PRIOR,
{EF_NONE, DomCode::NONE, DomKey::FromCharacter('9'), VKEY_NUMPAD9}}};
for (const auto& map : kNumPadRemappings) {
if (state->key_code == map.input_key_code) {
if (KeycodeConverter::DomCodeToLocation(state->code) ==

@ -116,7 +116,7 @@ class DomKey {
}
// Obtain the encoded integer representation of the DomKey.
operator Base() const { return value_; }
constexpr operator Base() const { return value_; }
// True if the value is a valid DomKey (which excludes DomKey::NONE and
// integers not following the DomKey format).
@ -146,28 +146,18 @@ class DomKey {
}
// Returns a DomKey for the given Unicode character.
static DomKey FromCharacter(uint32_t character) {
constexpr static DomKey FromCharacter(uint32_t character) {
DCHECK(character <= 0x10FFFF);
return DomKey(TYPE_UNICODE | character);
}
// Returns a dead-key DomKey for the given combining character.
static DomKey DeadKeyFromCombiningCharacter(uint32_t combining_character) {
constexpr static DomKey DeadKeyFromCombiningCharacter(
uint32_t combining_character) {
DCHECK(combining_character <= 0x10FFFF);
return DomKey(TYPE_DEAD | combining_character);
}
// Provide means to generate constant DomKey::Base values, primarily to
// allow conversion tables to be constant, without startup construction.
// In the future (cue the theremin) this can be replaced with constexpr
// functions.
template<Base C> struct Constant {
enum : Base {
Character = TYPE_UNICODE | C,
Dead = TYPE_DEAD | C,
};
};
private:
static bool IsValidValue(Base value) { return (value & TYPE_MASK) != 0; }

@ -47,56 +47,56 @@ DomKey GetKeyFromFullLookupTable(DomCode dom_code) {
// 'complete' keyboard layout. They can also use this to construct a partial
// layout with valid DomKey values for the populated entries.
static base::flat_map<DomCode, DomKey> kFullLookupTable(
{{DomCode::DIGIT0, DomKey::Constant<'0'>::Character},
{DomCode::DIGIT1, DomKey::Constant<'1'>::Character},
{DomCode::DIGIT2, DomKey::Constant<'2'>::Character},
{DomCode::DIGIT3, DomKey::Constant<'3'>::Character},
{DomCode::DIGIT4, DomKey::Constant<'4'>::Character},
{DomCode::DIGIT5, DomKey::Constant<'5'>::Character},
{DomCode::DIGIT6, DomKey::Constant<'6'>::Character},
{DomCode::DIGIT7, DomKey::Constant<'7'>::Character},
{DomCode::DIGIT8, DomKey::Constant<'8'>::Character},
{DomCode::DIGIT9, DomKey::Constant<'9'>::Character},
{DomCode::US_A, DomKey::Constant<'a'>::Character},
{DomCode::US_B, DomKey::Constant<'b'>::Character},
{DomCode::US_C, DomKey::Constant<'c'>::Character},
{DomCode::US_D, DomKey::Constant<'d'>::Character},
{DomCode::US_E, DomKey::Constant<'e'>::Character},
{DomCode::US_F, DomKey::Constant<'f'>::Character},
{DomCode::US_G, DomKey::Constant<'g'>::Character},
{DomCode::US_H, DomKey::Constant<'h'>::Character},
{DomCode::US_I, DomKey::Constant<'i'>::Character},
{DomCode::US_J, DomKey::Constant<'j'>::Character},
{DomCode::US_K, DomKey::Constant<'k'>::Character},
{DomCode::US_L, DomKey::Constant<'l'>::Character},
{DomCode::US_M, DomKey::Constant<'m'>::Character},
{DomCode::US_N, DomKey::Constant<'n'>::Character},
{DomCode::US_O, DomKey::Constant<'o'>::Character},
{DomCode::US_P, DomKey::Constant<'p'>::Character},
{DomCode::US_Q, DomKey::Constant<'q'>::Character},
{DomCode::US_R, DomKey::Constant<'r'>::Character},
{DomCode::US_S, DomKey::Constant<'s'>::Character},
{DomCode::US_T, DomKey::Constant<'t'>::Character},
{DomCode::US_U, DomKey::Constant<'u'>::Character},
{DomCode::US_V, DomKey::Constant<'v'>::Character},
{DomCode::US_W, DomKey::Constant<'w'>::Character},
{DomCode::US_X, DomKey::Constant<'x'>::Character},
{DomCode::US_Y, DomKey::Constant<'y'>::Character},
{DomCode::US_Z, DomKey::Constant<'z'>::Character},
{DomCode::BACKQUOTE, DomKey::Constant<'`'>::Character},
{DomCode::MINUS, DomKey::Constant<'-'>::Character},
{DomCode::EQUAL, DomKey::Constant<'='>::Character},
{DomCode::INTL_YEN, DomKey::Constant<0x00A5>::Dead},
{DomCode::BRACKET_LEFT, DomKey::Constant<'{'>::Character},
{DomCode::BRACKET_RIGHT, DomKey::Constant<'}'>::Character},
{DomCode::BACKSLASH, DomKey::Constant<'\\'>::Character},
{DomCode::SEMICOLON, DomKey::Constant<';'>::Character},
{DomCode::QUOTE, DomKey::Constant<'\''>::Character},
{DomCode::INTL_BACKSLASH, DomKey::Constant<'/'>::Character},
{DomCode::COMMA, DomKey::Constant<','>::Character},
{DomCode::PERIOD, DomKey::Constant<'.'>::Character},
{DomCode::SLASH, DomKey::Constant<'/'>::Character},
{DomCode::INTL_RO, DomKey::Constant<0x308D>::Dead}});
{{DomCode::DIGIT0, DomKey::FromCharacter('0')},
{DomCode::DIGIT1, DomKey::FromCharacter('1')},
{DomCode::DIGIT2, DomKey::FromCharacter('2')},
{DomCode::DIGIT3, DomKey::FromCharacter('3')},
{DomCode::DIGIT4, DomKey::FromCharacter('4')},
{DomCode::DIGIT5, DomKey::FromCharacter('5')},
{DomCode::DIGIT6, DomKey::FromCharacter('6')},
{DomCode::DIGIT7, DomKey::FromCharacter('7')},
{DomCode::DIGIT8, DomKey::FromCharacter('8')},
{DomCode::DIGIT9, DomKey::FromCharacter('9')},
{DomCode::US_A, DomKey::FromCharacter('a')},
{DomCode::US_B, DomKey::FromCharacter('b')},
{DomCode::US_C, DomKey::FromCharacter('c')},
{DomCode::US_D, DomKey::FromCharacter('d')},
{DomCode::US_E, DomKey::FromCharacter('e')},
{DomCode::US_F, DomKey::FromCharacter('f')},
{DomCode::US_G, DomKey::FromCharacter('g')},
{DomCode::US_H, DomKey::FromCharacter('h')},
{DomCode::US_I, DomKey::FromCharacter('i')},
{DomCode::US_J, DomKey::FromCharacter('j')},
{DomCode::US_K, DomKey::FromCharacter('k')},
{DomCode::US_L, DomKey::FromCharacter('l')},
{DomCode::US_M, DomKey::FromCharacter('m')},
{DomCode::US_N, DomKey::FromCharacter('n')},
{DomCode::US_O, DomKey::FromCharacter('o')},
{DomCode::US_P, DomKey::FromCharacter('p')},
{DomCode::US_Q, DomKey::FromCharacter('q')},
{DomCode::US_R, DomKey::FromCharacter('r')},
{DomCode::US_S, DomKey::FromCharacter('s')},
{DomCode::US_T, DomKey::FromCharacter('t')},
{DomCode::US_U, DomKey::FromCharacter('u')},
{DomCode::US_V, DomKey::FromCharacter('v')},
{DomCode::US_W, DomKey::FromCharacter('w')},
{DomCode::US_X, DomKey::FromCharacter('x')},
{DomCode::US_Y, DomKey::FromCharacter('y')},
{DomCode::US_Z, DomKey::FromCharacter('z')},
{DomCode::BACKQUOTE, DomKey::FromCharacter('`')},
{DomCode::MINUS, DomKey::FromCharacter('-')},
{DomCode::EQUAL, DomKey::FromCharacter('=')},
{DomCode::INTL_YEN, DomKey::DeadKeyFromCombiningCharacter(0x00A5)},
{DomCode::BRACKET_LEFT, DomKey::FromCharacter('{')},
{DomCode::BRACKET_RIGHT, DomKey::FromCharacter('}')},
{DomCode::BACKSLASH, DomKey::FromCharacter('\\')},
{DomCode::SEMICOLON, DomKey::FromCharacter(';')},
{DomCode::QUOTE, DomKey::FromCharacter('\'')},
{DomCode::INTL_BACKSLASH, DomKey::FromCharacter('/')},
{DomCode::COMMA, DomKey::FromCharacter(',')},
{DomCode::PERIOD, DomKey::FromCharacter('.')},
{DomCode::SLASH, DomKey::FromCharacter('/')},
{DomCode::INTL_RO, DomKey::DeadKeyFromCombiningCharacter(0x308D)}});
// Ensure the 'full' lookup table contains the same number of elements as the
// writing system table used by the class under test. Ideally this would be a
@ -114,25 +114,25 @@ DomKey GetKeyFromCombiningLayoutTable(DomCode dom_code) {
// Used for testing combining keys in both printable and combining forms.
static base::flat_map<DomCode, DomKey> kCombiningLayoutTable({
// Grave, combining.
{DomCode::DIGIT0, DomKey::Constant<0x0300>::Dead},
{DomCode::DIGIT0, DomKey::DeadKeyFromCombiningCharacter(0x0300)},
// Grave, printable.
{DomCode::DIGIT1, DomKey::Constant<0x0060>::Character},
{DomCode::DIGIT1, DomKey::FromCharacter(0x0060)},
// Acute, combining.
{DomCode::DIGIT2, DomKey::Constant<0x0301>::Dead},
{DomCode::DIGIT2, DomKey::DeadKeyFromCombiningCharacter(0x0301)},
// Acute, printable.
{DomCode::DIGIT3, DomKey::Constant<0x0027>::Character},
{DomCode::DIGIT3, DomKey::FromCharacter(0x0027)},
// Circumflex, combining.
{DomCode::DIGIT4, DomKey::Constant<0x0302>::Dead},
{DomCode::DIGIT4, DomKey::DeadKeyFromCombiningCharacter(0x0302)},
// Circumflex, printable.
{DomCode::DIGIT5, DomKey::Constant<0x005e>::Character},
{DomCode::DIGIT5, DomKey::FromCharacter(0x005e)},
// Tilde, combining.
{DomCode::DIGIT6, DomKey::Constant<0x0303>::Dead},
{DomCode::DIGIT6, DomKey::DeadKeyFromCombiningCharacter(0x0303)},
// Tilde, printable.
{DomCode::DIGIT7, DomKey::Constant<0x007e>::Character},
{DomCode::DIGIT7, DomKey::FromCharacter(0x007e)},
// Diaeresis, combining.
{DomCode::DIGIT8, DomKey::Constant<0x0308>::Dead},
{DomCode::DIGIT8, DomKey::DeadKeyFromCombiningCharacter(0x0308)},
// Diaeresis, printable.
{DomCode::DIGIT9, DomKey::Constant<0x00a8>::Character},
{DomCode::DIGIT9, DomKey::FromCharacter(0x00a8)},
});
if (kCombiningLayoutTable.count(dom_code) == 0)

@ -193,11 +193,10 @@ TEST(KeycodeConverter, DomKey) {
{ui::DomKey::NONE, false, false, false, "?!?", false},
{ui::DomKey::NONE, false, false, false, "\x61\xCC\x81", false},
// Some single Unicode characters.
{ui::DomKey::Constant<'-'>::Character, true, false, true, "-", false},
{ui::DomKey::Constant<'A'>::Character, true, false, true, "A", false},
{ui::DomKey::Constant<0xE1>::Character, true, false, true, "\xC3\xA1",
false},
{ui::DomKey::Constant<0x1F648>::Character, true, false, true,
{ui::DomKey::FromCharacter('-'), true, false, true, "-", false},
{ui::DomKey::FromCharacter('A'), true, false, true, "A", false},
{ui::DomKey::FromCharacter(0xE1), true, false, true, "\xC3\xA1", false},
{ui::DomKey::FromCharacter(0x1F648), true, false, true,
"\xF0\x9F\x99\x88", false},
// Unicode-equivalent named values.
{ui::DomKey::BACKSPACE, true, false, true, "Backspace", true},
@ -210,16 +209,14 @@ TEST(KeycodeConverter, DomKey) {
{ui::DomKey::ENTER, true, false, false, "\r", true},
{ui::DomKey::ESCAPE, true, false, false, "\x1B", true},
{ui::DomKey::DEL, true, false, false, "\x7F", true},
{ui::DomKey::Constant<'\b'>::Character, true, false, true, "Backspace",
true},
{ui::DomKey::Constant<'\t'>::Character, true, false, true, "Tab", true},
{ui::DomKey::Constant<'\r'>::Character, true, false, true, "Enter", true},
{ui::DomKey::Constant<0x1B>::Character, true, false, true, "Escape",
true},
{ui::DomKey::Constant<0x7F>::Character, true, false, true, "Delete",
true},
{ui::DomKey::FromCharacter('\b'), true, false, true, "Backspace", true},
{ui::DomKey::FromCharacter('\t'), true, false, true, "Tab", true},
{ui::DomKey::FromCharacter('\r'), true, false, true, "Enter", true},
{ui::DomKey::FromCharacter(0x1B), true, false, true, "Escape", true},
{ui::DomKey::FromCharacter(0x7F), true, false, true, "Delete", true},
// 'Dead' key.
{ui::DomKey::Constant<0xFFFF>::Dead, false, true, true, "Dead", true},
{ui::DomKey::DeadKeyFromCombiningCharacter(0xFFFF), false, true, true,
"Dead", true},
// Sample non-Unicode key names.
{ui::DomKey::SHIFT, false, false, true, "Shift", true},
{ui::DomKey::F16, false, false, true, "F16", true},

@ -67,83 +67,83 @@ TEST(KeyboardCodeConversion, ControlCharacters) {
Meaning control_key;
} kControlCharacters[] = {
{ui::DomCode::US_A,
{true, ui::DomKey::Constant<0x01>::Character, ui::VKEY_A},
{true, ui::DomKey::Constant<'a'>::Character, ui::VKEY_A}},
{true, ui::DomKey::FromCharacter(0x01), ui::VKEY_A},
{true, ui::DomKey::FromCharacter('a'), ui::VKEY_A}},
{ui::DomCode::US_B,
{true, ui::DomKey::Constant<0x02>::Character, ui::VKEY_B},
{true, ui::DomKey::Constant<'b'>::Character, ui::VKEY_B}},
{true, ui::DomKey::FromCharacter(0x02), ui::VKEY_B},
{true, ui::DomKey::FromCharacter('b'), ui::VKEY_B}},
{ui::DomCode::US_C,
{true, ui::DomKey::Constant<0x03>::Character, ui::VKEY_C},
{true, ui::DomKey::Constant<'c'>::Character, ui::VKEY_C}},
{true, ui::DomKey::FromCharacter(0x03), ui::VKEY_C},
{true, ui::DomKey::FromCharacter('c'), ui::VKEY_C}},
{ui::DomCode::US_D,
{true, ui::DomKey::Constant<0x04>::Character, ui::VKEY_D},
{true, ui::DomKey::Constant<'d'>::Character, ui::VKEY_D}},
{true, ui::DomKey::FromCharacter(0x04), ui::VKEY_D},
{true, ui::DomKey::FromCharacter('d'), ui::VKEY_D}},
{ui::DomCode::US_E,
{true, ui::DomKey::Constant<0x05>::Character, ui::VKEY_E},
{true, ui::DomKey::Constant<'e'>::Character, ui::VKEY_E}},
{true, ui::DomKey::FromCharacter(0x05), ui::VKEY_E},
{true, ui::DomKey::FromCharacter('e'), ui::VKEY_E}},
{ui::DomCode::US_F,
{true, ui::DomKey::Constant<0x06>::Character, ui::VKEY_F},
{true, ui::DomKey::Constant<'f'>::Character, ui::VKEY_F}},
{true, ui::DomKey::FromCharacter(0x06), ui::VKEY_F},
{true, ui::DomKey::FromCharacter('f'), ui::VKEY_F}},
{ui::DomCode::US_G,
{true, ui::DomKey::Constant<0x07>::Character, ui::VKEY_G},
{true, ui::DomKey::Constant<'g'>::Character, ui::VKEY_G}},
{true, ui::DomKey::FromCharacter(0x07), ui::VKEY_G},
{true, ui::DomKey::FromCharacter('g'), ui::VKEY_G}},
{ui::DomCode::US_H,
{true, ui::DomKey::BACKSPACE, ui::VKEY_BACK},
{true, ui::DomKey::Constant<'h'>::Character, ui::VKEY_H}},
{true, ui::DomKey::FromCharacter('h'), ui::VKEY_H}},
{ui::DomCode::US_I,
{true, ui::DomKey::TAB, ui::VKEY_TAB},
{true, ui::DomKey::Constant<'i'>::Character, ui::VKEY_I}},
{true, ui::DomKey::FromCharacter('i'), ui::VKEY_I}},
{ui::DomCode::US_J,
{true, ui::DomKey::Constant<0x0A>::Character, ui::VKEY_J},
{true, ui::DomKey::Constant<'j'>::Character, ui::VKEY_J}},
{true, ui::DomKey::FromCharacter(0x0A), ui::VKEY_J},
{true, ui::DomKey::FromCharacter('j'), ui::VKEY_J}},
{ui::DomCode::US_K,
{true, ui::DomKey::Constant<0x0B>::Character, ui::VKEY_K},
{true, ui::DomKey::Constant<'k'>::Character, ui::VKEY_K}},
{true, ui::DomKey::FromCharacter(0x0B), ui::VKEY_K},
{true, ui::DomKey::FromCharacter('k'), ui::VKEY_K}},
{ui::DomCode::US_L,
{true, ui::DomKey::Constant<0x0C>::Character, ui::VKEY_L},
{true, ui::DomKey::Constant<'l'>::Character, ui::VKEY_L}},
{true, ui::DomKey::FromCharacter(0x0C), ui::VKEY_L},
{true, ui::DomKey::FromCharacter('l'), ui::VKEY_L}},
{ui::DomCode::US_M,
{true, ui::DomKey::ENTER, ui::VKEY_RETURN},
{true, ui::DomKey::Constant<'m'>::Character, ui::VKEY_M}},
{true, ui::DomKey::FromCharacter('m'), ui::VKEY_M}},
{ui::DomCode::US_N,
{true, ui::DomKey::Constant<0x0E>::Character, ui::VKEY_N},
{true, ui::DomKey::Constant<'n'>::Character, ui::VKEY_N}},
{true, ui::DomKey::FromCharacter(0x0E), ui::VKEY_N},
{true, ui::DomKey::FromCharacter('n'), ui::VKEY_N}},
{ui::DomCode::US_O,
{true, ui::DomKey::Constant<0x0F>::Character, ui::VKEY_O},
{true, ui::DomKey::Constant<'o'>::Character, ui::VKEY_O}},
{true, ui::DomKey::FromCharacter(0x0F), ui::VKEY_O},
{true, ui::DomKey::FromCharacter('o'), ui::VKEY_O}},
{ui::DomCode::US_P,
{true, ui::DomKey::Constant<0x10>::Character, ui::VKEY_P},
{true, ui::DomKey::Constant<'p'>::Character, ui::VKEY_P}},
{true, ui::DomKey::FromCharacter(0x10), ui::VKEY_P},
{true, ui::DomKey::FromCharacter('p'), ui::VKEY_P}},
{ui::DomCode::US_Q,
{true, ui::DomKey::Constant<0x11>::Character, ui::VKEY_Q},
{true, ui::DomKey::Constant<'q'>::Character, ui::VKEY_Q}},
{true, ui::DomKey::FromCharacter(0x11), ui::VKEY_Q},
{true, ui::DomKey::FromCharacter('q'), ui::VKEY_Q}},
{ui::DomCode::US_R,
{true, ui::DomKey::Constant<0x12>::Character, ui::VKEY_R},
{true, ui::DomKey::Constant<'r'>::Character, ui::VKEY_R}},
{true, ui::DomKey::FromCharacter(0x12), ui::VKEY_R},
{true, ui::DomKey::FromCharacter('r'), ui::VKEY_R}},
{ui::DomCode::US_S,
{true, ui::DomKey::Constant<0x13>::Character, ui::VKEY_S},
{true, ui::DomKey::Constant<'s'>::Character, ui::VKEY_S}},
{true, ui::DomKey::FromCharacter(0x13), ui::VKEY_S},
{true, ui::DomKey::FromCharacter('s'), ui::VKEY_S}},
{ui::DomCode::US_T,
{true, ui::DomKey::Constant<0x14>::Character, ui::VKEY_T},
{true, ui::DomKey::Constant<'t'>::Character, ui::VKEY_T}},
{true, ui::DomKey::FromCharacter(0x14), ui::VKEY_T},
{true, ui::DomKey::FromCharacter('t'), ui::VKEY_T}},
{ui::DomCode::US_U,
{true, ui::DomKey::Constant<0x15>::Character, ui::VKEY_U},
{true, ui::DomKey::Constant<'u'>::Character, ui::VKEY_U}},
{true, ui::DomKey::FromCharacter(0x15), ui::VKEY_U},
{true, ui::DomKey::FromCharacter('u'), ui::VKEY_U}},
{ui::DomCode::US_V,
{true, ui::DomKey::Constant<0x16>::Character, ui::VKEY_V},
{true, ui::DomKey::Constant<'v'>::Character, ui::VKEY_V}},
{true, ui::DomKey::FromCharacter(0x16), ui::VKEY_V},
{true, ui::DomKey::FromCharacter('v'), ui::VKEY_V}},
{ui::DomCode::US_W,
{true, ui::DomKey::Constant<0x17>::Character, ui::VKEY_W},
{true, ui::DomKey::Constant<'w'>::Character, ui::VKEY_W}},
{true, ui::DomKey::FromCharacter(0x17), ui::VKEY_W},
{true, ui::DomKey::FromCharacter('w'), ui::VKEY_W}},
{ui::DomCode::US_X,
{true, ui::DomKey::Constant<0x18>::Character, ui::VKEY_X},
{true, ui::DomKey::Constant<'x'>::Character, ui::VKEY_X}},
{true, ui::DomKey::FromCharacter(0x18), ui::VKEY_X},
{true, ui::DomKey::FromCharacter('x'), ui::VKEY_X}},
{ui::DomCode::US_Y,
{true, ui::DomKey::Constant<0x19>::Character, ui::VKEY_Y},
{true, ui::DomKey::Constant<'y'>::Character, ui::VKEY_Y}},
{true, ui::DomKey::FromCharacter(0x19), ui::VKEY_Y},
{true, ui::DomKey::FromCharacter('y'), ui::VKEY_Y}},
{ui::DomCode::US_Z,
{true, ui::DomKey::Constant<0x1A>::Character, ui::VKEY_Z},
{true, ui::DomKey::Constant<'z'>::Character, ui::VKEY_Z}},
{true, ui::DomKey::FromCharacter(0x1A), ui::VKEY_Z},
{true, ui::DomKey::FromCharacter('z'), ui::VKEY_Z}},
};
for (const auto& it : kControlCharacters) {
// Verify |DomCodeToControlCharacter()|.
@ -172,39 +172,39 @@ TEST(KeyboardCodeConversion, ControlCharacters) {
} kShiftControlCharacters[] = {
{ui::DomCode::DIGIT2,
{false, ui::DomKey::NONE, ui::VKEY_UNKNOWN},
{true, ui::DomKey::Constant<0>::Character, ui::VKEY_2},
{true, ui::DomKey::Constant<'2'>::Character, ui::VKEY_2},
{true, ui::DomKey::Constant<'@'>::Character, ui::VKEY_2}},
{true, ui::DomKey::FromCharacter(0), ui::VKEY_2},
{true, ui::DomKey::FromCharacter('2'), ui::VKEY_2},
{true, ui::DomKey::FromCharacter('@'), ui::VKEY_2}},
{ui::DomCode::DIGIT6,
{false, ui::DomKey::NONE, ui::VKEY_UNKNOWN},
{true, ui::DomKey::Constant<0x1E>::Character, ui::VKEY_6},
{true, ui::DomKey::Constant<'6'>::Character, ui::VKEY_6},
{true, ui::DomKey::Constant<'^'>::Character, ui::VKEY_6}},
{true, ui::DomKey::FromCharacter(0x1E), ui::VKEY_6},
{true, ui::DomKey::FromCharacter('6'), ui::VKEY_6},
{true, ui::DomKey::FromCharacter('^'), ui::VKEY_6}},
{ui::DomCode::MINUS,
{false, ui::DomKey::NONE, ui::VKEY_UNKNOWN},
{true, ui::DomKey::Constant<0x1F>::Character, ui::VKEY_OEM_MINUS},
{true, ui::DomKey::Constant<'-'>::Character, ui::VKEY_OEM_MINUS},
{true, ui::DomKey::Constant<'_'>::Character, ui::VKEY_OEM_MINUS}},
{true, ui::DomKey::FromCharacter(0x1F), ui::VKEY_OEM_MINUS},
{true, ui::DomKey::FromCharacter('-'), ui::VKEY_OEM_MINUS},
{true, ui::DomKey::FromCharacter('_'), ui::VKEY_OEM_MINUS}},
{ui::DomCode::ENTER,
{true, ui::DomKey::Constant<0x0A>::Character, ui::VKEY_RETURN},
{true, ui::DomKey::FromCharacter(0x0A), ui::VKEY_RETURN},
{false, ui::DomKey::NONE, ui::VKEY_UNKNOWN},
{true, ui::DomKey::ENTER, ui::VKEY_RETURN},
{true, ui::DomKey::ENTER, ui::VKEY_RETURN}},
{ui::DomCode::BRACKET_LEFT,
{true, ui::DomKey::ESCAPE, ui::VKEY_OEM_4},
{false, ui::DomKey::NONE, ui::VKEY_UNKNOWN},
{true, ui::DomKey::Constant<'['>::Character, ui::VKEY_OEM_4},
{true, ui::DomKey::Constant<'{'>::Character, ui::VKEY_OEM_4}},
{true, ui::DomKey::FromCharacter('['), ui::VKEY_OEM_4},
{true, ui::DomKey::FromCharacter('{'), ui::VKEY_OEM_4}},
{ui::DomCode::BACKSLASH,
{true, ui::DomKey::Constant<0x1C>::Character, ui::VKEY_OEM_5},
{true, ui::DomKey::FromCharacter(0x1C), ui::VKEY_OEM_5},
{false, ui::DomKey::NONE, ui::VKEY_UNKNOWN},
{true, ui::DomKey::Constant<'\\'>::Character, ui::VKEY_OEM_5},
{true, ui::DomKey::Constant<'|'>::Character, ui::VKEY_OEM_5}},
{true, ui::DomKey::FromCharacter('\\'), ui::VKEY_OEM_5},
{true, ui::DomKey::FromCharacter('|'), ui::VKEY_OEM_5}},
{ui::DomCode::BRACKET_RIGHT,
{true, ui::DomKey::Constant<0x1D>::Character, ui::VKEY_OEM_6},
{true, ui::DomKey::FromCharacter(0x1D), ui::VKEY_OEM_6},
{false, ui::DomKey::NONE, ui::VKEY_UNKNOWN},
{true, ui::DomKey::Constant<']'>::Character, ui::VKEY_OEM_6},
{true, ui::DomKey::Constant<'}'>::Character, ui::VKEY_OEM_6}},
{true, ui::DomKey::FromCharacter(']'), ui::VKEY_OEM_6},
{true, ui::DomKey::FromCharacter('}'), ui::VKEY_OEM_6}},
};
for (const auto& it : kShiftControlCharacters) {
// Verify |DomCodeToControlCharacter()|.
@ -256,11 +256,11 @@ TEST(KeyboardCodeConversion, ControlCharacters) {
{true, ui::DomKey::META, ui::VKEY_LWIN},
{true, ui::DomKey::META, ui::VKEY_LWIN}},
{ui::DomCode::DIGIT1,
{true, ui::DomKey::Constant<'1'>::Character, ui::VKEY_1},
{true, ui::DomKey::Constant<'!'>::Character, ui::VKEY_1}},
{true, ui::DomKey::FromCharacter('1'), ui::VKEY_1},
{true, ui::DomKey::FromCharacter('!'), ui::VKEY_1}},
{ui::DomCode::EQUAL,
{true, ui::DomKey::Constant<'='>::Character, ui::VKEY_OEM_PLUS},
{true, ui::DomKey::Constant<'+'>::Character, ui::VKEY_OEM_PLUS}},
{true, ui::DomKey::FromCharacter('='), ui::VKEY_OEM_PLUS},
{true, ui::DomKey::FromCharacter('+'), ui::VKEY_OEM_PLUS}},
{ui::DomCode::TAB,
{true, ui::DomKey::TAB, ui::VKEY_TAB},
{true, ui::DomKey::TAB, ui::VKEY_TAB}},
@ -302,215 +302,215 @@ TEST(KeyboardCodeConversion, UsLayout) {
Meaning shift;
} kPrintableUsLayout[] = {
{ui::DomCode::US_A,
{true, ui::DomKey::Constant<'a'>::Character, ui::VKEY_A},
{true, ui::DomKey::Constant<'A'>::Character, ui::VKEY_A}},
{true, ui::DomKey::FromCharacter('a'), ui::VKEY_A},
{true, ui::DomKey::FromCharacter('A'), ui::VKEY_A}},
{ui::DomCode::US_B,
{true, ui::DomKey::Constant<'b'>::Character, ui::VKEY_B},
{true, ui::DomKey::Constant<'B'>::Character, ui::VKEY_B}},
{true, ui::DomKey::FromCharacter('b'), ui::VKEY_B},
{true, ui::DomKey::FromCharacter('B'), ui::VKEY_B}},
{ui::DomCode::US_C,
{true, ui::DomKey::Constant<'c'>::Character, ui::VKEY_C},
{true, ui::DomKey::Constant<'C'>::Character, ui::VKEY_C}},
{true, ui::DomKey::FromCharacter('c'), ui::VKEY_C},
{true, ui::DomKey::FromCharacter('C'), ui::VKEY_C}},
{ui::DomCode::US_D,
{true, ui::DomKey::Constant<'d'>::Character, ui::VKEY_D},
{true, ui::DomKey::Constant<'D'>::Character, ui::VKEY_D}},
{true, ui::DomKey::FromCharacter('d'), ui::VKEY_D},
{true, ui::DomKey::FromCharacter('D'), ui::VKEY_D}},
{ui::DomCode::US_E,
{true, ui::DomKey::Constant<'e'>::Character, ui::VKEY_E},
{true, ui::DomKey::Constant<'E'>::Character, ui::VKEY_E}},
{true, ui::DomKey::FromCharacter('e'), ui::VKEY_E},
{true, ui::DomKey::FromCharacter('E'), ui::VKEY_E}},
{ui::DomCode::US_F,
{true, ui::DomKey::Constant<'f'>::Character, ui::VKEY_F},
{true, ui::DomKey::Constant<'F'>::Character, ui::VKEY_F}},
{true, ui::DomKey::FromCharacter('f'), ui::VKEY_F},
{true, ui::DomKey::FromCharacter('F'), ui::VKEY_F}},
{ui::DomCode::US_G,
{true, ui::DomKey::Constant<'g'>::Character, ui::VKEY_G},
{true, ui::DomKey::Constant<'G'>::Character, ui::VKEY_G}},
{true, ui::DomKey::FromCharacter('g'), ui::VKEY_G},
{true, ui::DomKey::FromCharacter('G'), ui::VKEY_G}},
{ui::DomCode::US_H,
{true, ui::DomKey::Constant<'h'>::Character, ui::VKEY_H},
{true, ui::DomKey::Constant<'H'>::Character, ui::VKEY_H}},
{true, ui::DomKey::FromCharacter('h'), ui::VKEY_H},
{true, ui::DomKey::FromCharacter('H'), ui::VKEY_H}},
{ui::DomCode::US_I,
{true, ui::DomKey::Constant<'i'>::Character, ui::VKEY_I},
{true, ui::DomKey::Constant<'I'>::Character, ui::VKEY_I}},
{true, ui::DomKey::FromCharacter('i'), ui::VKEY_I},
{true, ui::DomKey::FromCharacter('I'), ui::VKEY_I}},
{ui::DomCode::US_J,
{true, ui::DomKey::Constant<'j'>::Character, ui::VKEY_J},
{true, ui::DomKey::Constant<'J'>::Character, ui::VKEY_J}},
{true, ui::DomKey::FromCharacter('j'), ui::VKEY_J},
{true, ui::DomKey::FromCharacter('J'), ui::VKEY_J}},
{ui::DomCode::US_K,
{true, ui::DomKey::Constant<'k'>::Character, ui::VKEY_K},
{true, ui::DomKey::Constant<'K'>::Character, ui::VKEY_K}},
{true, ui::DomKey::FromCharacter('k'), ui::VKEY_K},
{true, ui::DomKey::FromCharacter('K'), ui::VKEY_K}},
{ui::DomCode::US_L,
{true, ui::DomKey::Constant<'l'>::Character, ui::VKEY_L},
{true, ui::DomKey::Constant<'L'>::Character, ui::VKEY_L}},
{true, ui::DomKey::FromCharacter('l'), ui::VKEY_L},
{true, ui::DomKey::FromCharacter('L'), ui::VKEY_L}},
{ui::DomCode::US_M,
{true, ui::DomKey::Constant<'m'>::Character, ui::VKEY_M},
{true, ui::DomKey::Constant<'M'>::Character, ui::VKEY_M}},
{true, ui::DomKey::FromCharacter('m'), ui::VKEY_M},
{true, ui::DomKey::FromCharacter('M'), ui::VKEY_M}},
{ui::DomCode::US_N,
{true, ui::DomKey::Constant<'n'>::Character, ui::VKEY_N},
{true, ui::DomKey::Constant<'N'>::Character, ui::VKEY_N}},
{true, ui::DomKey::FromCharacter('n'), ui::VKEY_N},
{true, ui::DomKey::FromCharacter('N'), ui::VKEY_N}},
{ui::DomCode::US_O,
{true, ui::DomKey::Constant<'o'>::Character, ui::VKEY_O},
{true, ui::DomKey::Constant<'O'>::Character, ui::VKEY_O}},
{true, ui::DomKey::FromCharacter('o'), ui::VKEY_O},
{true, ui::DomKey::FromCharacter('O'), ui::VKEY_O}},
{ui::DomCode::US_P,
{true, ui::DomKey::Constant<'p'>::Character, ui::VKEY_P},
{true, ui::DomKey::Constant<'P'>::Character, ui::VKEY_P}},
{true, ui::DomKey::FromCharacter('p'), ui::VKEY_P},
{true, ui::DomKey::FromCharacter('P'), ui::VKEY_P}},
{ui::DomCode::US_Q,
{true, ui::DomKey::Constant<'q'>::Character, ui::VKEY_Q},
{true, ui::DomKey::Constant<'Q'>::Character, ui::VKEY_Q}},
{true, ui::DomKey::FromCharacter('q'), ui::VKEY_Q},
{true, ui::DomKey::FromCharacter('Q'), ui::VKEY_Q}},
{ui::DomCode::US_R,
{true, ui::DomKey::Constant<'r'>::Character, ui::VKEY_R},
{true, ui::DomKey::Constant<'R'>::Character, ui::VKEY_R}},
{true, ui::DomKey::FromCharacter('r'), ui::VKEY_R},
{true, ui::DomKey::FromCharacter('R'), ui::VKEY_R}},
{ui::DomCode::US_S,
{true, ui::DomKey::Constant<'s'>::Character, ui::VKEY_S},
{true, ui::DomKey::Constant<'S'>::Character, ui::VKEY_S}},
{true, ui::DomKey::FromCharacter('s'), ui::VKEY_S},
{true, ui::DomKey::FromCharacter('S'), ui::VKEY_S}},
{ui::DomCode::US_T,
{true, ui::DomKey::Constant<'t'>::Character, ui::VKEY_T},
{true, ui::DomKey::Constant<'T'>::Character, ui::VKEY_T}},
{true, ui::DomKey::FromCharacter('t'), ui::VKEY_T},
{true, ui::DomKey::FromCharacter('T'), ui::VKEY_T}},
{ui::DomCode::US_U,
{true, ui::DomKey::Constant<'u'>::Character, ui::VKEY_U},
{true, ui::DomKey::Constant<'U'>::Character, ui::VKEY_U}},
{true, ui::DomKey::FromCharacter('u'), ui::VKEY_U},
{true, ui::DomKey::FromCharacter('U'), ui::VKEY_U}},
{ui::DomCode::US_V,
{true, ui::DomKey::Constant<'v'>::Character, ui::VKEY_V},
{true, ui::DomKey::Constant<'V'>::Character, ui::VKEY_V}},
{true, ui::DomKey::FromCharacter('v'), ui::VKEY_V},
{true, ui::DomKey::FromCharacter('V'), ui::VKEY_V}},
{ui::DomCode::US_W,
{true, ui::DomKey::Constant<'w'>::Character, ui::VKEY_W},
{true, ui::DomKey::Constant<'W'>::Character, ui::VKEY_W}},
{true, ui::DomKey::FromCharacter('w'), ui::VKEY_W},
{true, ui::DomKey::FromCharacter('W'), ui::VKEY_W}},
{ui::DomCode::US_X,
{true, ui::DomKey::Constant<'x'>::Character, ui::VKEY_X},
{true, ui::DomKey::Constant<'X'>::Character, ui::VKEY_X}},
{true, ui::DomKey::FromCharacter('x'), ui::VKEY_X},
{true, ui::DomKey::FromCharacter('X'), ui::VKEY_X}},
{ui::DomCode::US_Y,
{true, ui::DomKey::Constant<'y'>::Character, ui::VKEY_Y},
{true, ui::DomKey::Constant<'Y'>::Character, ui::VKEY_Y}},
{true, ui::DomKey::FromCharacter('y'), ui::VKEY_Y},
{true, ui::DomKey::FromCharacter('Y'), ui::VKEY_Y}},
{ui::DomCode::US_Z,
{true, ui::DomKey::Constant<'z'>::Character, ui::VKEY_Z},
{true, ui::DomKey::Constant<'Z'>::Character, ui::VKEY_Z}},
{true, ui::DomKey::FromCharacter('z'), ui::VKEY_Z},
{true, ui::DomKey::FromCharacter('Z'), ui::VKEY_Z}},
{ui::DomCode::DIGIT1,
{true, ui::DomKey::Constant<'1'>::Character, ui::VKEY_1},
{true, ui::DomKey::Constant<'!'>::Character, ui::VKEY_1}},
{true, ui::DomKey::FromCharacter('1'), ui::VKEY_1},
{true, ui::DomKey::FromCharacter('!'), ui::VKEY_1}},
{ui::DomCode::DIGIT2,
{true, ui::DomKey::Constant<'2'>::Character, ui::VKEY_2},
{true, ui::DomKey::Constant<'@'>::Character, ui::VKEY_2}},
{true, ui::DomKey::FromCharacter('2'), ui::VKEY_2},
{true, ui::DomKey::FromCharacter('@'), ui::VKEY_2}},
{ui::DomCode::DIGIT3,
{true, ui::DomKey::Constant<'3'>::Character, ui::VKEY_3},
{true, ui::DomKey::Constant<'#'>::Character, ui::VKEY_3}},
{true, ui::DomKey::FromCharacter('3'), ui::VKEY_3},
{true, ui::DomKey::FromCharacter('#'), ui::VKEY_3}},
{ui::DomCode::DIGIT4,
{true, ui::DomKey::Constant<'4'>::Character, ui::VKEY_4},
{true, ui::DomKey::Constant<'$'>::Character, ui::VKEY_4}},
{true, ui::DomKey::FromCharacter('4'), ui::VKEY_4},
{true, ui::DomKey::FromCharacter('$'), ui::VKEY_4}},
{ui::DomCode::DIGIT5,
{true, ui::DomKey::Constant<'5'>::Character, ui::VKEY_5},
{true, ui::DomKey::Constant<'%'>::Character, ui::VKEY_5}},
{true, ui::DomKey::FromCharacter('5'), ui::VKEY_5},
{true, ui::DomKey::FromCharacter('%'), ui::VKEY_5}},
{ui::DomCode::DIGIT6,
{true, ui::DomKey::Constant<'6'>::Character, ui::VKEY_6},
{true, ui::DomKey::Constant<'^'>::Character, ui::VKEY_6}},
{true, ui::DomKey::FromCharacter('6'), ui::VKEY_6},
{true, ui::DomKey::FromCharacter('^'), ui::VKEY_6}},
{ui::DomCode::DIGIT7,
{true, ui::DomKey::Constant<'7'>::Character, ui::VKEY_7},
{true, ui::DomKey::Constant<'&'>::Character, ui::VKEY_7}},
{true, ui::DomKey::FromCharacter('7'), ui::VKEY_7},
{true, ui::DomKey::FromCharacter('&'), ui::VKEY_7}},
{ui::DomCode::DIGIT8,
{true, ui::DomKey::Constant<'8'>::Character, ui::VKEY_8},
{true, ui::DomKey::Constant<'*'>::Character, ui::VKEY_8}},
{true, ui::DomKey::FromCharacter('8'), ui::VKEY_8},
{true, ui::DomKey::FromCharacter('*'), ui::VKEY_8}},
{ui::DomCode::DIGIT9,
{true, ui::DomKey::Constant<'9'>::Character, ui::VKEY_9},
{true, ui::DomKey::Constant<'('>::Character, ui::VKEY_9}},
{true, ui::DomKey::FromCharacter('9'), ui::VKEY_9},
{true, ui::DomKey::FromCharacter('('), ui::VKEY_9}},
{ui::DomCode::DIGIT0,
{true, ui::DomKey::Constant<'0'>::Character, ui::VKEY_0},
{true, ui::DomKey::Constant<')'>::Character, ui::VKEY_0}},
{true, ui::DomKey::FromCharacter('0'), ui::VKEY_0},
{true, ui::DomKey::FromCharacter(')'), ui::VKEY_0}},
{ui::DomCode::SPACE,
{true, ui::DomKey::Constant<' '>::Character, ui::VKEY_SPACE},
{true, ui::DomKey::Constant<' '>::Character, ui::VKEY_SPACE}},
{true, ui::DomKey::FromCharacter(' '), ui::VKEY_SPACE},
{true, ui::DomKey::FromCharacter(' '), ui::VKEY_SPACE}},
{ui::DomCode::MINUS,
{true, ui::DomKey::Constant<'-'>::Character, ui::VKEY_OEM_MINUS},
{true, ui::DomKey::Constant<'_'>::Character, ui::VKEY_OEM_MINUS}},
{true, ui::DomKey::FromCharacter('-'), ui::VKEY_OEM_MINUS},
{true, ui::DomKey::FromCharacter('_'), ui::VKEY_OEM_MINUS}},
{ui::DomCode::EQUAL,
{true, ui::DomKey::Constant<'='>::Character, ui::VKEY_OEM_PLUS},
{true, ui::DomKey::Constant<'+'>::Character, ui::VKEY_OEM_PLUS}},
{true, ui::DomKey::FromCharacter('='), ui::VKEY_OEM_PLUS},
{true, ui::DomKey::FromCharacter('+'), ui::VKEY_OEM_PLUS}},
{ui::DomCode::BRACKET_LEFT,
{true, ui::DomKey::Constant<'['>::Character, ui::VKEY_OEM_4},
{true, ui::DomKey::Constant<'{'>::Character, ui::VKEY_OEM_4}},
{true, ui::DomKey::FromCharacter('['), ui::VKEY_OEM_4},
{true, ui::DomKey::FromCharacter('{'), ui::VKEY_OEM_4}},
{ui::DomCode::BRACKET_RIGHT,
{true, ui::DomKey::Constant<']'>::Character, ui::VKEY_OEM_6},
{true, ui::DomKey::Constant<'}'>::Character, ui::VKEY_OEM_6}},
{true, ui::DomKey::FromCharacter(']'), ui::VKEY_OEM_6},
{true, ui::DomKey::FromCharacter('}'), ui::VKEY_OEM_6}},
{ui::DomCode::BACKSLASH,
{true, ui::DomKey::Constant<'\\'>::Character, ui::VKEY_OEM_5},
{true, ui::DomKey::Constant<'|'>::Character, ui::VKEY_OEM_5}},
{true, ui::DomKey::FromCharacter('\\'), ui::VKEY_OEM_5},
{true, ui::DomKey::FromCharacter('|'), ui::VKEY_OEM_5}},
{ui::DomCode::SEMICOLON,
{true, ui::DomKey::Constant<';'>::Character, ui::VKEY_OEM_1},
{true, ui::DomKey::Constant<':'>::Character, ui::VKEY_OEM_1}},
{true, ui::DomKey::FromCharacter(';'), ui::VKEY_OEM_1},
{true, ui::DomKey::FromCharacter(':'), ui::VKEY_OEM_1}},
{ui::DomCode::QUOTE,
{true, ui::DomKey::Constant<'\''>::Character, ui::VKEY_OEM_7},
{true, ui::DomKey::Constant<'"'>::Character, ui::VKEY_OEM_7}},
{true, ui::DomKey::FromCharacter('\''), ui::VKEY_OEM_7},
{true, ui::DomKey::FromCharacter('"'), ui::VKEY_OEM_7}},
{ui::DomCode::BACKQUOTE,
{true, ui::DomKey::Constant<'`'>::Character, ui::VKEY_OEM_3},
{true, ui::DomKey::Constant<'~'>::Character, ui::VKEY_OEM_3}},
{true, ui::DomKey::FromCharacter('`'), ui::VKEY_OEM_3},
{true, ui::DomKey::FromCharacter('~'), ui::VKEY_OEM_3}},
{ui::DomCode::COMMA,
{true, ui::DomKey::Constant<','>::Character, ui::VKEY_OEM_COMMA},
{true, ui::DomKey::Constant<'<'>::Character, ui::VKEY_OEM_COMMA}},
{true, ui::DomKey::FromCharacter(','), ui::VKEY_OEM_COMMA},
{true, ui::DomKey::FromCharacter('<'), ui::VKEY_OEM_COMMA}},
{ui::DomCode::PERIOD,
{true, ui::DomKey::Constant<'.'>::Character, ui::VKEY_OEM_PERIOD},
{true, ui::DomKey::Constant<'>'>::Character, ui::VKEY_OEM_PERIOD}},
{true, ui::DomKey::FromCharacter('.'), ui::VKEY_OEM_PERIOD},
{true, ui::DomKey::FromCharacter('>'), ui::VKEY_OEM_PERIOD}},
{ui::DomCode::SLASH,
{true, ui::DomKey::Constant<'/'>::Character, ui::VKEY_OEM_2},
{true, ui::DomKey::Constant<'?'>::Character, ui::VKEY_OEM_2}},
{true, ui::DomKey::FromCharacter('/'), ui::VKEY_OEM_2},
{true, ui::DomKey::FromCharacter('?'), ui::VKEY_OEM_2}},
{ui::DomCode::INTL_BACKSLASH,
{true, ui::DomKey::Constant<'<'>::Character, ui::VKEY_OEM_102},
{true, ui::DomKey::Constant<'>'>::Character, ui::VKEY_OEM_102}},
{true, ui::DomKey::FromCharacter('<'), ui::VKEY_OEM_102},
{true, ui::DomKey::FromCharacter('>'), ui::VKEY_OEM_102}},
{ui::DomCode::INTL_YEN,
{true, ui::DomKey::Constant<0x00A5>::Character, ui::VKEY_OEM_5},
{true, ui::DomKey::Constant<'|'>::Character, ui::VKEY_OEM_5}},
{true, ui::DomKey::FromCharacter(0x00A5), ui::VKEY_OEM_5},
{true, ui::DomKey::FromCharacter('|'), ui::VKEY_OEM_5}},
{ui::DomCode::NUMPAD_DIVIDE,
{true, ui::DomKey::Constant<'/'>::Character, ui::VKEY_DIVIDE},
{true, ui::DomKey::Constant<'/'>::Character, ui::VKEY_DIVIDE}},
{true, ui::DomKey::FromCharacter('/'), ui::VKEY_DIVIDE},
{true, ui::DomKey::FromCharacter('/'), ui::VKEY_DIVIDE}},
{ui::DomCode::NUMPAD_MULTIPLY,
{true, ui::DomKey::Constant<'*'>::Character, ui::VKEY_MULTIPLY},
{true, ui::DomKey::Constant<'*'>::Character, ui::VKEY_MULTIPLY}},
{true, ui::DomKey::FromCharacter('*'), ui::VKEY_MULTIPLY},
{true, ui::DomKey::FromCharacter('*'), ui::VKEY_MULTIPLY}},
{ui::DomCode::NUMPAD_SUBTRACT,
{true, ui::DomKey::Constant<'-'>::Character, ui::VKEY_SUBTRACT},
{true, ui::DomKey::Constant<'-'>::Character, ui::VKEY_SUBTRACT}},
{true, ui::DomKey::FromCharacter('-'), ui::VKEY_SUBTRACT},
{true, ui::DomKey::FromCharacter('-'), ui::VKEY_SUBTRACT}},
{ui::DomCode::NUMPAD_ADD,
{true, ui::DomKey::Constant<'+'>::Character, ui::VKEY_ADD},
{true, ui::DomKey::Constant<'+'>::Character, ui::VKEY_ADD}},
{true, ui::DomKey::FromCharacter('+'), ui::VKEY_ADD},
{true, ui::DomKey::FromCharacter('+'), ui::VKEY_ADD}},
{ui::DomCode::NUMPAD1,
{true, ui::DomKey::Constant<'1'>::Character, ui::VKEY_1},
{true, ui::DomKey::Constant<'1'>::Character, ui::VKEY_1}},
{true, ui::DomKey::FromCharacter('1'), ui::VKEY_1},
{true, ui::DomKey::FromCharacter('1'), ui::VKEY_1}},
{ui::DomCode::NUMPAD2,
{true, ui::DomKey::Constant<'2'>::Character, ui::VKEY_2},
{true, ui::DomKey::Constant<'2'>::Character, ui::VKEY_2}},
{true, ui::DomKey::FromCharacter('2'), ui::VKEY_2},
{true, ui::DomKey::FromCharacter('2'), ui::VKEY_2}},
{ui::DomCode::NUMPAD3,
{true, ui::DomKey::Constant<'3'>::Character, ui::VKEY_3},
{true, ui::DomKey::Constant<'3'>::Character, ui::VKEY_3}},
{true, ui::DomKey::FromCharacter('3'), ui::VKEY_3},
{true, ui::DomKey::FromCharacter('3'), ui::VKEY_3}},
{ui::DomCode::NUMPAD4,
{true, ui::DomKey::Constant<'4'>::Character, ui::VKEY_4},
{true, ui::DomKey::Constant<'4'>::Character, ui::VKEY_4}},
{true, ui::DomKey::FromCharacter('4'), ui::VKEY_4},
{true, ui::DomKey::FromCharacter('4'), ui::VKEY_4}},
{ui::DomCode::NUMPAD5,
{true, ui::DomKey::Constant<'5'>::Character, ui::VKEY_5},
{true, ui::DomKey::Constant<'5'>::Character, ui::VKEY_5}},
{true, ui::DomKey::FromCharacter('5'), ui::VKEY_5},
{true, ui::DomKey::FromCharacter('5'), ui::VKEY_5}},
{ui::DomCode::NUMPAD6,
{true, ui::DomKey::Constant<'6'>::Character, ui::VKEY_6},
{true, ui::DomKey::Constant<'6'>::Character, ui::VKEY_6}},
{true, ui::DomKey::FromCharacter('6'), ui::VKEY_6},
{true, ui::DomKey::FromCharacter('6'), ui::VKEY_6}},
{ui::DomCode::NUMPAD7,
{true, ui::DomKey::Constant<'7'>::Character, ui::VKEY_7},
{true, ui::DomKey::Constant<'7'>::Character, ui::VKEY_7}},
{true, ui::DomKey::FromCharacter('7'), ui::VKEY_7},
{true, ui::DomKey::FromCharacter('7'), ui::VKEY_7}},
{ui::DomCode::NUMPAD8,
{true, ui::DomKey::Constant<'8'>::Character, ui::VKEY_8},
{true, ui::DomKey::Constant<'8'>::Character, ui::VKEY_8}},
{true, ui::DomKey::FromCharacter('8'), ui::VKEY_8},
{true, ui::DomKey::FromCharacter('8'), ui::VKEY_8}},
{ui::DomCode::NUMPAD9,
{true, ui::DomKey::Constant<'9'>::Character, ui::VKEY_9},
{true, ui::DomKey::Constant<'9'>::Character, ui::VKEY_9}},
{true, ui::DomKey::FromCharacter('9'), ui::VKEY_9},
{true, ui::DomKey::FromCharacter('9'), ui::VKEY_9}},
{ui::DomCode::NUMPAD0,
{true, ui::DomKey::Constant<'0'>::Character, ui::VKEY_0},
{true, ui::DomKey::Constant<'0'>::Character, ui::VKEY_0}},
{true, ui::DomKey::FromCharacter('0'), ui::VKEY_0},
{true, ui::DomKey::FromCharacter('0'), ui::VKEY_0}},
{ui::DomCode::NUMPAD_DECIMAL,
{true, ui::DomKey::Constant<'.'>::Character, ui::VKEY_DECIMAL},
{true, ui::DomKey::Constant<'.'>::Character, ui::VKEY_DECIMAL}},
{true, ui::DomKey::FromCharacter('.'), ui::VKEY_DECIMAL},
{true, ui::DomKey::FromCharacter('.'), ui::VKEY_DECIMAL}},
{ui::DomCode::NUMPAD_EQUAL,
{true, ui::DomKey::Constant<'='>::Character, ui::VKEY_UNKNOWN},
{true, ui::DomKey::Constant<'='>::Character, ui::VKEY_UNKNOWN}},
{true, ui::DomKey::FromCharacter('='), ui::VKEY_UNKNOWN},
{true, ui::DomKey::FromCharacter('='), ui::VKEY_UNKNOWN}},
{ui::DomCode::NUMPAD_COMMA,
{true, ui::DomKey::Constant<','>::Character, ui::VKEY_OEM_COMMA},
{true, ui::DomKey::Constant<','>::Character, ui::VKEY_OEM_COMMA}},
{true, ui::DomKey::FromCharacter(','), ui::VKEY_OEM_COMMA},
{true, ui::DomKey::FromCharacter(','), ui::VKEY_OEM_COMMA}},
{ui::DomCode::NUMPAD_PAREN_LEFT,
{true, ui::DomKey::Constant<'('>::Character, ui::VKEY_UNKNOWN},
{true, ui::DomKey::Constant<'('>::Character, ui::VKEY_UNKNOWN}},
{true, ui::DomKey::FromCharacter('('), ui::VKEY_UNKNOWN},
{true, ui::DomKey::FromCharacter('('), ui::VKEY_UNKNOWN}},
{ui::DomCode::NUMPAD_PAREN_RIGHT,
{true, ui::DomKey::Constant<')'>::Character, ui::VKEY_UNKNOWN},
{true, ui::DomKey::Constant<')'>::Character, ui::VKEY_UNKNOWN}},
{true, ui::DomKey::FromCharacter(')'), ui::VKEY_UNKNOWN},
{true, ui::DomKey::FromCharacter(')'), ui::VKEY_UNKNOWN}},
{ui::DomCode::NUMPAD_SIGN_CHANGE,
{true, ui::DomKey::Constant<0xB1>::Character, ui::VKEY_UNKNOWN},
{true, ui::DomKey::Constant<0xB1>::Character, ui::VKEY_UNKNOWN}},
{true, ui::DomKey::FromCharacter(0xB1), ui::VKEY_UNKNOWN},
{true, ui::DomKey::FromCharacter(0xB1), ui::VKEY_UNKNOWN}},
};
for (const auto& it : kPrintableUsLayout) {

@ -187,11 +187,9 @@ void TestLookup(const char* name, KeyboardLayoutEngine* engine) {
KeyboardCode output_keycode;
char16_t output_character;
} kTestCases[] = {
{DomCode::US_A, EF_NONE, DomKey::Constant<'a'>::Character, VKEY_A, 'a'},
{DomCode::US_A, EF_SHIFT_DOWN, DomKey::Constant<'A'>::Character, VKEY_A,
'A'},
{DomCode::US_A, EF_CONTROL_DOWN, DomKey::Constant<'a'>::Character,
VKEY_A, 1},
{DomCode::US_A, EF_NONE, DomKey::FromCharacter('a'), VKEY_A, 'a'},
{DomCode::US_A, EF_SHIFT_DOWN, DomKey::FromCharacter('A'), VKEY_A, 'A'},
{DomCode::US_A, EF_CONTROL_DOWN, DomKey::FromCharacter('a'), VKEY_A, 1},
{DomCode::LAUNCH_ASSISTANT, EF_NONE, DomKey::LAUNCH_ASSISTANT,
VKEY_ASSISTANT, 0},
};