Index: ui/events/keycodes/dom4/keycode_converter.cc |
diff --git a/ui/events/keycodes/dom4/keycode_converter.cc b/ui/events/keycodes/dom4/keycode_converter.cc |
index b7958dd0db19e93ed6785f721b16538445170cf6..7b9650fb7082920c9890292cdf057ff82a11f7b2 100644 |
--- a/ui/events/keycodes/dom4/keycode_converter.cc |
+++ b/ui/events/keycodes/dom4/keycode_converter.cc |
@@ -4,10 +4,25 @@ |
#include "ui/events/keycodes/dom4/keycode_converter.h" |
+#include "base/logging.h" |
+ |
namespace ui { |
namespace { |
+template<typename T> |
+struct DomKeyCodeEntry { |
+ const char *string; |
+ T enumeration; |
+}; |
+ |
+#include "ui/events/keycodes/dom4/domcode.h" |
+#include "ui/events/keycodes/dom4/domcode_string.h" |
+#include "ui/events/keycodes/dom4/domcode_table.h" |
+#include "ui/events/keycodes/dom4/domkey.h" |
+#include "ui/events/keycodes/dom4/domkey_string.h" |
+#include "ui/events/keycodes/dom4/domkey_table.h" |
+ |
#if defined(OS_WIN) |
#define USB_KEYMAP(usb, xkb, win, mac, code) {usb, win, code} |
#elif defined(OS_LINUX) |
@@ -17,9 +32,13 @@ namespace { |
#else |
#define USB_KEYMAP(usb, xkb, win, mac, code) {usb, 0, code} |
#endif |
-#include "ui/events/keycodes/dom4/keycode_converter_data.h" |
+#include "ui/events/keycodes/dom4/native_code_data.h" |
const size_t kKeycodeMapEntries = arraysize(usb_keycode_map); |
+const size_t kDomCodeStringTableEntries = arraysize(dom_code_string); |
+const size_t kDomCodeTableEntries = arraysize(dom_code_table); |
+const size_t kDomKeyStringTableEntries = arraysize(dom_key_string); |
+const size_t kDomKeyTableEntries = arraysize(dom_key_table); |
} // namespace |
@@ -34,43 +53,82 @@ const KeycodeMapEntry* KeycodeConverter::GetKeycodeMapForTest() { |
} |
// static |
+size_t KeycodeConverter::NumDomCodeStringEntriesForTest() { |
+ return kDomCodeStringTableEntries; |
+} |
+ |
+// static |
+const char* const* KeycodeConverter::DomCodeStringTableForTest() { |
+ return dom_code_string; |
+} |
+ |
+// static |
+size_t KeycodeConverter::NumDomKeyStringEntriesForTest() { |
+ return kDomKeyStringTableEntries; |
+} |
+ |
+// static |
+const char* const* KeycodeConverter::DomKeyStringTableForTest() { |
+ return dom_key_string; |
+} |
+ |
+// static |
uint16_t KeycodeConverter::InvalidNativeKeycode() { |
return usb_keycode_map[0].native_keycode; |
} |
// static |
const char* KeycodeConverter::InvalidKeyboardEventCode() { |
- return "Unidentified"; |
+ return dom_code_string[static_cast<size_t>(ui::DOM_CODE_UNIDENTIFIED)]; |
} |
// static |
-const char* KeycodeConverter::NativeKeycodeToCode(uint16_t native_keycode) { |
- for (size_t i = 0; i < kKeycodeMapEntries; ++i) { |
- if (usb_keycode_map[i].native_keycode == native_keycode) { |
- if (usb_keycode_map[i].code != NULL) |
- return usb_keycode_map[i].code; |
- break; |
+const char* KeycodeConverter::DomCodeToCodeString(DomCode dom_code) { |
+ size_t code = static_cast<size_t>(dom_code); |
+ DCHECK_LT(code, kDomCodeStringTableEntries); |
+ DCHECK_NE(dom_code_string[code], static_cast<const char*>(nullptr)); |
+ return dom_code_string[code]; |
+} |
+ |
+// static |
+DomCode KeycodeConverter::CodeStringToDomCode(const char* code) { |
+ if (code) { |
+ for (size_t i = 0; i < kDomCodeTableEntries; ++i) { |
+ if (strcmp(code, dom_code_table[i].string) == 0) |
+ return dom_code_table[i].enumeration; |
} |
} |
- return InvalidKeyboardEventCode(); |
+ return DOM_CODE_NONE; |
} |
// static |
-uint16_t KeycodeConverter::CodeToNativeKeycode(const char* code) { |
- if (!code || |
- strcmp(code, InvalidKeyboardEventCode()) == 0) { |
- return InvalidNativeKeycode(); |
+DomCode KeycodeConverter::NativeKeycodeToDomCode(uint16_t native_keycode) { |
+ for (size_t i = 0; i < kKeycodeMapEntries; ++i) { |
+ if (usb_keycode_map[i].native_keycode == native_keycode) |
+ return usb_keycode_map[i].code; |
} |
+ return DOM_CODE_NONE; |
+} |
+// static |
+uint16_t KeycodeConverter::DomCodeToNativeKeycode(DomCode code) { |
for (size_t i = 0; i < kKeycodeMapEntries; ++i) { |
- if (usb_keycode_map[i].code && |
- strcmp(usb_keycode_map[i].code, code) == 0) { |
+ if (usb_keycode_map[i].code == code) |
return usb_keycode_map[i].native_keycode; |
- } |
} |
return InvalidNativeKeycode(); |
} |
+// static |
+const char* KeycodeConverter::NativeKeycodeToCode(uint16_t native_keycode) { |
+ return DomCodeToCodeString(NativeKeycodeToDomCode(native_keycode)); |
+} |
+ |
+// static |
+uint16_t KeycodeConverter::CodeToNativeKeycode(const char* code_string) { |
+ return DomCodeToNativeKeycode(CodeStringToDomCode(code_string)); |
+} |
+ |
// USB keycodes |
// Note that USB keycodes are not part of any web standard. |
// Please don't use USB keycodes in new code. |
@@ -110,25 +168,39 @@ uint32_t KeycodeConverter::NativeKeycodeToUsbKeycode(uint16_t native_keycode) { |
const char* KeycodeConverter::UsbKeycodeToCode(uint32_t usb_keycode) { |
for (size_t i = 0; i < kKeycodeMapEntries; ++i) { |
if (usb_keycode_map[i].usb_keycode == usb_keycode) |
- return usb_keycode_map[i].code; |
+ return DomCodeToCodeString(usb_keycode_map[i].code); |
} |
return InvalidKeyboardEventCode(); |
} |
// static |
-uint32_t KeycodeConverter::CodeToUsbKeycode(const char* code) { |
- if (!code || |
- strcmp(code, InvalidKeyboardEventCode()) == 0) { |
- return InvalidUsbKeycode(); |
- } |
- |
+uint32_t KeycodeConverter::CodeToUsbKeycode(const char* code_string) { |
+ DomCode code = CodeStringToDomCode(code_string); |
for (size_t i = 0; i < kKeycodeMapEntries; ++i) { |
- if (usb_keycode_map[i].code && |
- strcmp(usb_keycode_map[i].code, code) == 0) { |
+ if (usb_keycode_map[i].code == code) { |
return usb_keycode_map[i].usb_keycode; |
} |
} |
return InvalidUsbKeycode(); |
} |
+// static |
+const char* KeycodeConverter::DomKeyToKeyString(DomKey dom_key) { |
+ size_t key = static_cast<size_t>(dom_key); |
+ DCHECK_LT(key, kDomKeyStringTableEntries); |
+ DCHECK_NE(dom_key_string[key], static_cast<const char*>(nullptr)); |
+ return dom_key_string[key]; |
+} |
+ |
+// static |
+DomKey KeycodeConverter::KeyStringToDomKey(const char* key) { |
+ if (key) { |
+ for (size_t i = 0; i < kDomKeyTableEntries; ++i) { |
+ if (strcmp(key, dom_key_table[i].string) == 0) |
+ return dom_key_table[i].enumeration; |
+ } |
+ } |
+ return DOM_KEY_NONE; |
+} |
+ |
} // namespace ui |