Index: ui/events/keycodes/platform_key_map_win.cc |
diff --git a/ui/events/keycodes/platform_key_map_win.cc b/ui/events/keycodes/platform_key_map_win.cc |
index 593e386936dd4167f21ca08105d0024186715185..da447d2cf0d6512f41d1f2c4d4afbc7fd18278a5 100644 |
--- a/ui/events/keycodes/platform_key_map_win.cc |
+++ b/ui/events/keycodes/platform_key_map_win.cc |
@@ -209,15 +209,41 @@ DomKey LanguageSpecificOemKeyboardCodeToDomKey(KeyboardCode key_code, |
default: |
return DomKey::NONE; |
} |
+ } else if (primary_language == LANG_JAPANESE) { |
+ switch (key_code) { |
+ // VKEY_KANA isn't generated by any modern layouts but is a listed value |
+ // that third-party apps might synthesize, so we handle it anyway. |
+ case VKEY_KANA: |
+ case VKEY_ATTN: |
+ return DomKey::KANA_MODE; |
+ case VKEY_KANJI: |
+ return DomKey::KANJI_MODE; |
+ case VKEY_OEM_ATTN: |
+ return DomKey::ALPHANUMERIC; |
+ case VKEY_OEM_FINISH: |
+ return DomKey::KATAKANA; |
+ case VKEY_OEM_COPY: |
+ return DomKey::HIRAGANA; |
+ case VKEY_DBE_SBCSCHAR: |
+ return DomKey::HANKAKU; |
+ case VKEY_DBE_DBCSCHAR: |
+ return DomKey::ZENKAKU; |
+ case VKEY_OEM_BACKTAB: |
+ return DomKey::ROMAJI; |
+ default: |
+ return DomKey::NONE; |
+ } |
} |
- // TODO(chongz): Handle Japanese keyboard layout keys 0xF0..0xF5, VKEY_KANA, |
- // VKEY_KANJI. |
- // https://crbug.com/612694 |
return DomKey::NONE; |
} |
DomKey NonPrintableKeyboardCodeToDomKey(KeyboardCode key_code, HKL layout) { |
- // 1. Most |key_codes| have the same meaning regardless of |layout|. |
+ // 1. Check if |key_code| has a |layout|-specific meaning. |
+ const DomKey key = LanguageSpecificOemKeyboardCodeToDomKey(key_code, layout); |
+ if (key != DomKey::NONE) |
+ return key; |
+ |
+ // 2. Most |key_codes| have the same meaning regardless of |layout|. |
const NonPrintableKeyEntry* result = std::lower_bound( |
std::begin(kNonPrintableKeyMap), std::end(kNonPrintableKeyMap), key_code, |
[](const NonPrintableKeyEntry& entry, KeyboardCode needle) { |
@@ -225,8 +251,8 @@ DomKey NonPrintableKeyboardCodeToDomKey(KeyboardCode key_code, HKL layout) { |
}); |
if (result != std::end(kNonPrintableKeyMap) && result->key_code == key_code) |
return result->dom_key; |
- // 2. Look up a |layout|-specific meaning for |key_code|. |
- return LanguageSpecificOemKeyboardCodeToDomKey(key_code, layout); |
+ |
+ return DomKey::NONE; |
} |
void CleanupKeyMapTls(void* data) { |
@@ -280,11 +306,12 @@ DomKey PlatformKeyMap::DomKeyFromKeyboardCodeImpl(KeyboardCode key_code, |
if (it != printable_keycode_to_key_.end()) { |
key = it->second; |
if (key != DomKey::NONE) |
- break; |
+ return key; |
} |
} |
- return key; |
+ // Return DomKey::UNIDENTIFIED to prevent US layout fall-back. |
+ return DomKey::UNIDENTIFIED; |
} |
// static |