| 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 63689f0e5467e41c7536f05cc80d279435746bb7..8a19dcb6233ce77722a234ebf197b1b13937cca6 100644
 | 
| --- a/ui/events/keycodes/dom4/keycode_converter.cc
 | 
| +++ b/ui/events/keycodes/dom4/keycode_converter.cc
 | 
| @@ -4,23 +4,45 @@
 | 
|  
 | 
|  #include "ui/events/keycodes/dom4/keycode_converter.h"
 | 
|  
 | 
| +#include "ui/events/keycodes/dom3/dom_code.h"
 | 
| +#include "ui/events/keycodes/dom3/dom_key.h"
 | 
| +
 | 
|  namespace ui {
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| +// Table of USB codes (equivalent to DomCode values), native scan codes,
 | 
| +// and DOM Level 3 |code| strings.
 | 
|  #if defined(OS_WIN)
 | 
| -#define USB_KEYMAP(usb, xkb, win, mac, code) {usb, win, code}
 | 
| +#define USB_KEYMAP(usb, xkb, win, mac, code, id) {usb, win, code}
 | 
|  #elif defined(OS_LINUX)
 | 
| -#define USB_KEYMAP(usb, xkb, win, mac, code) {usb, xkb, code}
 | 
| +#define USB_KEYMAP(usb, xkb, win, mac, code, id) {usb, xkb, code}
 | 
|  #elif defined(OS_MACOSX)
 | 
| -#define USB_KEYMAP(usb, xkb, win, mac, code) {usb, mac, code}
 | 
| +#define USB_KEYMAP(usb, xkb, win, mac, code, id) {usb, mac, code}
 | 
|  #else
 | 
| -#define USB_KEYMAP(usb, xkb, win, mac, code) {usb, 0, code}
 | 
| +#define USB_KEYMAP(usb, xkb, win, mac, code, id) {usb, 0, code}
 | 
|  #endif
 | 
| +#define USB_KEYMAP_DECLARATION const KeycodeMapEntry usb_keycode_map[] =
 | 
|  #include "ui/events/keycodes/dom4/keycode_converter_data.h"
 | 
| +#undef USB_KEYMAP
 | 
| +#undef USB_KEYMAP_DECLARATION
 | 
|  
 | 
|  const size_t kKeycodeMapEntries = arraysize(usb_keycode_map);
 | 
|  
 | 
| +// Table of DomKey enum values and DOM Level 3 |key| strings.
 | 
| +struct DomKeyMapEntry {
 | 
| +  DomKey dom_key;
 | 
| +  const char* string;
 | 
| +};
 | 
| +
 | 
| +#define DOM_KEY_MAP(key, id) {DomKey::id, key}
 | 
| +#define DOM_KEY_MAP_DECLARATION const DomKeyMapEntry dom_key_map[] =
 | 
| +#include "ui/events/keycodes/dom3/dom_key_data.h"
 | 
| +#undef DOM_KEY_MAP
 | 
| +#undef DOM_KEY_MAP_DECLARATION
 | 
| +
 | 
| +const size_t kDomKeyMapEntries = arraysize(dom_key_map);
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  // static
 | 
| @@ -34,6 +56,13 @@ const KeycodeMapEntry* KeycodeConverter::GetKeycodeMapForTest() {
 | 
|  }
 | 
|  
 | 
|  // static
 | 
| +const char* KeycodeConverter::DomKeyStringForTest(size_t index) {
 | 
| +  if (index >= kDomKeyMapEntries)
 | 
| +    return nullptr;
 | 
| +  return dom_key_map[index].string;
 | 
| +}
 | 
| +
 | 
| +// static
 | 
|  uint16_t KeycodeConverter::InvalidNativeKeycode() {
 | 
|    return usb_keycode_map[0].native_keycode;
 | 
|  }
 | 
| @@ -56,6 +85,18 @@ const char* KeycodeConverter::NativeKeycodeToCode(uint16_t native_keycode) {
 | 
|  }
 | 
|  
 | 
|  // static
 | 
| +DomCode KeycodeConverter::NativeKeycodeToDomCode(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 static_cast<DomCode>(usb_keycode_map[i].usb_keycode);
 | 
| +      break;
 | 
| +    }
 | 
| +  }
 | 
| +  return DomCode::NONE;
 | 
| +}
 | 
| +
 | 
| +// static
 | 
|  uint16_t KeycodeConverter::CodeToNativeKeycode(const char* code) {
 | 
|    if (!code ||
 | 
|        strcmp(code, InvalidKeyboardEventCode()) == 0) {
 | 
| @@ -71,6 +112,59 @@ uint16_t KeycodeConverter::CodeToNativeKeycode(const char* code) {
 | 
|    return InvalidNativeKeycode();
 | 
|  }
 | 
|  
 | 
| +// static
 | 
| +uint16_t KeycodeConverter::DomCodeToNativeKeycode(DomCode code) {
 | 
| +  if (code == DomCode::NONE)
 | 
| +    return InvalidNativeKeycode();
 | 
| +  for (size_t i = 0; i < kKeycodeMapEntries; ++i) {
 | 
| +    if (usb_keycode_map[i].usb_keycode == static_cast<uint32_t>(code))
 | 
| +      return usb_keycode_map[i].native_keycode;
 | 
| +  }
 | 
| +  return InvalidNativeKeycode();
 | 
| +}
 | 
| +
 | 
| +// static
 | 
| +DomCode KeycodeConverter::CodeStringToDomCode(const char* code) {
 | 
| +  if (!code ||
 | 
| +      strcmp(code, InvalidKeyboardEventCode()) == 0) {
 | 
| +    return DomCode::NONE;
 | 
| +  }
 | 
| +  for (size_t i = 0; i < kKeycodeMapEntries; ++i) {
 | 
| +    if (usb_keycode_map[i].code &&
 | 
| +        strcmp(usb_keycode_map[i].code, code) == 0) {
 | 
| +      return static_cast<DomCode>(usb_keycode_map[i].usb_keycode);
 | 
| +    }
 | 
| +  }
 | 
| +  return DomCode::NONE;
 | 
| +}
 | 
| +
 | 
| +// static
 | 
| +const char* KeycodeConverter::DomCodeToCodeString(DomCode dom_code) {
 | 
| +  return UsbKeycodeToCode(static_cast<uint32_t>(dom_code));
 | 
| +}
 | 
| +
 | 
| +// static
 | 
| +DomKey KeycodeConverter::KeyStringToDomKey(const char* key) {
 | 
| +  if (!key || !*key)
 | 
| +    return DomKey::NONE;
 | 
| +  for (size_t i = 0; i < kDomKeyMapEntries; ++i) {
 | 
| +    if (dom_key_map[i].string &&
 | 
| +        strcmp(dom_key_map[i].string, key) == 0) {
 | 
| +      return dom_key_map[i].dom_key;
 | 
| +    }
 | 
| +  }
 | 
| +  return DomKey::NONE;
 | 
| +}
 | 
| +
 | 
| +// static
 | 
| +const char* KeycodeConverter::DomKeyToKeyString(DomKey dom_key) {
 | 
| +  for (size_t i = 0; i < kDomKeyMapEntries; ++i) {
 | 
| +    if (dom_key_map[i].dom_key == dom_key)
 | 
| +      return dom_key_map[i].string;
 | 
| +  }
 | 
| +  return nullptr;
 | 
| +}
 | 
| +
 | 
|  // USB keycodes
 | 
|  // Note that USB keycodes are not part of any web standard.
 | 
|  // Please don't use USB keycodes in new code.
 | 
| 
 |