OLD | NEW |
---|---|
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/events/keycodes/platform_key_map_win.h" | 5 #include "ui/events/keycodes/platform_key_map_win.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/strings/string16.h" | 8 #include "base/strings/string16.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 #include "ui/events/event_constants.h" | 10 #include "ui/events/event_constants.h" |
11 #include "ui/events/keycodes/dom/dom_code.h" | 11 #include "ui/events/keycodes/dom/dom_code.h" |
12 #include "ui/events/keycodes/dom/dom_key.h" | 12 #include "ui/events/keycodes/dom/dom_key.h" |
13 #include "ui/events/keycodes/dom/keycode_converter.h" | 13 #include "ui/events/keycodes/dom/keycode_converter.h" |
14 #include "ui/events/keycodes/dom_us_layout_data.h" | 14 #include "ui/events/keycodes/dom_us_layout_data.h" |
15 | 15 |
16 namespace ui { | 16 namespace ui { |
17 | 17 |
18 namespace { | 18 namespace { |
19 | 19 |
20 enum Layout { | 20 enum Layout { |
21 LAYOUT_US, | 21 LAYOUT_US, |
22 LAYOUT_FR, | 22 LAYOUT_FR, |
23 LAYOUT_KR, | 23 LAYOUT_KR, |
24 LAYOUT_JP, | |
24 }; | 25 }; |
25 | 26 |
26 // |LoadKeyboardLayout()| ensures the locale to be loaded into the system | 27 // |LoadKeyboardLayout()| ensures the locale to be loaded into the system |
27 // (Similar to temporarily adding a locale in Control Panel), otherwise | 28 // (Similar to temporarily adding a locale in Control Panel), otherwise |
28 // |ToUnicodeEx()| will fall-back to the default locale. | 29 // |ToUnicodeEx()| will fall-back to the default locale. |
29 // See MSDN LoadKeyboardLayout(): | 30 // See MSDN LoadKeyboardLayout(): |
30 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646305(v=vs.85).as px | 31 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646305(v=vs.85).as px |
31 // And language constants and strings: | 32 // And language constants and strings: |
32 // https://msdn.microsoft.com/en-us/library/windows/desktop/dd318693(v=vs.85).as px | 33 // https://msdn.microsoft.com/en-us/library/windows/desktop/dd318693(v=vs.85).as px |
33 HKL GetInputLocale(Layout layout) { | 34 HKL GetInputLocale(Layout layout) { |
34 switch (layout) { | 35 switch (layout) { |
35 case LAYOUT_US: | 36 case LAYOUT_US: |
36 return ::LoadKeyboardLayout(L"00000409", KLF_ACTIVATE); | 37 return ::LoadKeyboardLayout(L"00000409", KLF_ACTIVATE); |
37 case LAYOUT_FR: | 38 case LAYOUT_FR: |
38 return ::LoadKeyboardLayout(L"0000040c", KLF_ACTIVATE); | 39 return ::LoadKeyboardLayout(L"0000040c", KLF_ACTIVATE); |
39 case LAYOUT_KR: | 40 case LAYOUT_KR: |
40 // |LoadKeyboardLayout(L"00000412", KLF_ACTIVATE)| returns the correct | 41 // |LoadKeyboardLayout(L"00000412", KLF_ACTIVATE)| returns the correct |
41 // Korean locale, but it will fail on DrMemory tests. | 42 // Korean locale, but it will fail on DrMemory tests. |
42 // See https://crbug.com/612736#c6 | 43 // See https://crbug.com/612736#c6 |
43 // However we could bypass it since we are only testing non-printable keys | 44 // However we could bypass it since we are only testing non-printable keys |
44 // on Korean locale. | 45 // on Korean locale. |
45 // (This issue only happens on Korean and Japanese). | 46 // (This issue only happens on Korean and Japanese). |
46 return reinterpret_cast<HKL>(0x04120412); | 47 return reinterpret_cast<HKL>(0x04120412); |
48 case LAYOUT_JP: | |
49 return reinterpret_cast<HKL>(0x04110411); | |
Wez
2016/07/07 18:25:51
LoadKeyboardLayout doesn't work here?
chongz
2016/07/07 22:18:09
Yes |LoadKeyboardLayout()| won't pass DrMemory tes
Wez
2016/07/08 23:34:07
OK, what I was missing is that we just pull the "p
| |
47 default: | 50 default: |
48 return 0; | 51 return 0; |
49 } | 52 } |
50 } | 53 } |
51 | 54 |
52 struct TestKey { | 55 struct TestKey { |
53 KeyboardCode key_code; | 56 KeyboardCode key_code; |
54 const char* normal; | 57 const char* normal; |
55 const char* shift; | 58 const char* shift; |
56 const char* capslock; | 59 const char* capslock; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
107 EXPECT_STREQ(test_case.altgr_capslock, | 110 EXPECT_STREQ(test_case.altgr_capslock, |
108 KeycodeConverter::DomKeyToKeyString( | 111 KeycodeConverter::DomKeyToKeyString( |
109 keymap.DomKeyFromKeyboardCodeImpl( | 112 keymap.DomKeyFromKeyboardCodeImpl( |
110 key_code, EF_ALTGR_DOWN | EF_CAPS_LOCK_ON)) | 113 key_code, EF_ALTGR_DOWN | EF_CAPS_LOCK_ON)) |
111 .c_str()) | 114 .c_str()) |
112 << label; | 115 << label; |
113 } | 116 } |
114 | 117 |
115 DomKey DomKeyFromKeyboardCodeImpl(const PlatformKeyMap& keymap, | 118 DomKey DomKeyFromKeyboardCodeImpl(const PlatformKeyMap& keymap, |
116 KeyboardCode key_code, | 119 KeyboardCode key_code, |
117 int flags) { | 120 int flags) { |
Wez
2016/07/07 18:25:51
What's the point of this "helper"? It just seems t
chongz
2016/07/07 22:18:09
Because |PlatformKeyMap::DomKeyFromKeyboardCodeImp
Wez
2016/07/08 23:34:07
Acknowledged.
| |
118 return keymap.DomKeyFromKeyboardCodeImpl(key_code, flags); | 121 return keymap.DomKeyFromKeyboardCodeImpl(key_code, flags); |
119 } | 122 } |
120 | 123 |
121 private: | 124 private: |
122 DISALLOW_COPY_AND_ASSIGN(PlatformKeyMapTest); | 125 DISALLOW_COPY_AND_ASSIGN(PlatformKeyMapTest); |
123 }; | 126 }; |
124 | 127 |
125 TEST_F(PlatformKeyMapTest, USLayout) { | 128 TEST_F(PlatformKeyMapTest, USLayout) { |
126 HKL layout = GetInputLocale(LAYOUT_US); | 129 HKL layout = GetInputLocale(LAYOUT_US); |
127 PlatformKeyMap keymap(layout); | 130 PlatformKeyMap keymap(layout); |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
312 KeyboardCode key_code; | 315 KeyboardCode key_code; |
313 DomKey key; | 316 DomKey key; |
314 } kKoreanTestCases[] = { | 317 } kKoreanTestCases[] = { |
315 {VKEY_HANGUL, DomKey::HANGUL_MODE}, {VKEY_HANJA, DomKey::HANJA_MODE}, | 318 {VKEY_HANGUL, DomKey::HANGUL_MODE}, {VKEY_HANJA, DomKey::HANJA_MODE}, |
316 }; | 319 }; |
317 | 320 |
318 // US English should not return values for these keys. | 321 // US English should not return values for these keys. |
319 HKL us_layout = GetInputLocale(LAYOUT_US); | 322 HKL us_layout = GetInputLocale(LAYOUT_US); |
320 PlatformKeyMap us_keymap(us_layout); | 323 PlatformKeyMap us_keymap(us_layout); |
321 for (const auto& test_case : kKoreanTestCases) { | 324 for (const auto& test_case : kKoreanTestCases) { |
322 EXPECT_EQ(DomKey::NONE, DomKeyFromKeyboardCodeImpl( | 325 EXPECT_EQ(DomKey::UNIDENTIFIED, DomKeyFromKeyboardCodeImpl( |
323 us_keymap, test_case.key_code, EF_NONE)) | 326 us_keymap, test_case.key_code, EF_NONE)) |
324 << test_case.key_code; | 327 << test_case.key_code; |
325 } | 328 } |
326 | 329 |
327 // Korean layout should return specific DomKey. | 330 // Korean layout should return specific DomKey. |
328 HKL ko_layout = GetInputLocale(LAYOUT_KR); | 331 HKL ko_layout = GetInputLocale(LAYOUT_KR); |
329 PlatformKeyMap ko_keymap(ko_layout); | 332 PlatformKeyMap ko_keymap(ko_layout); |
330 for (const auto& test_case : kKoreanTestCases) { | 333 for (const auto& test_case : kKoreanTestCases) { |
331 EXPECT_EQ(test_case.key, DomKeyFromKeyboardCodeImpl( | 334 EXPECT_EQ(test_case.key, DomKeyFromKeyboardCodeImpl( |
332 ko_keymap, test_case.key_code, EF_NONE)) | 335 ko_keymap, test_case.key_code, EF_NONE)) |
333 << test_case.key_code; | 336 << test_case.key_code; |
334 } | 337 } |
335 } | 338 } |
336 | 339 |
340 TEST_F(PlatformKeyMapTest, JapaneseSpecificKeys) { | |
341 const struct TestCase { | |
342 KeyboardCode key_code; | |
343 DomKey jp_key; | |
344 DomKey us_key; | |
345 } kJapaneseTestCases[] = { | |
346 {VKEY_KANA, DomKey::KANA_MODE, DomKey::UNIDENTIFIED}, | |
347 {VKEY_KANJI, DomKey::KANJI_MODE, DomKey::UNIDENTIFIED}, | |
348 {VKEY_OEM_ATTN, DomKey::ALPHANUMERIC, DomKey::UNIDENTIFIED}, | |
349 {VKEY_OEM_FINISH, DomKey::KATAKANA, DomKey::UNIDENTIFIED}, | |
350 {VKEY_OEM_COPY, DomKey::HIRAGANA, DomKey::UNIDENTIFIED}, | |
351 {VKEY_DBE_SBCSCHAR, DomKey::HANKAKU, DomKey::UNIDENTIFIED}, | |
352 {VKEY_DBE_DBCSCHAR, DomKey::ZENKAKU, DomKey::UNIDENTIFIED}, | |
353 {VKEY_OEM_BACKTAB, DomKey::ROMAJI, DomKey::UNIDENTIFIED}, | |
354 {VKEY_ATTN, DomKey::KANA_MODE, DomKey::ATTN}, | |
355 }; | |
356 | |
357 // US English should not return values for these keys. | |
358 HKL us_layout = GetInputLocale(LAYOUT_US); | |
359 PlatformKeyMap us_keymap(us_layout); | |
Wez
2016/07/07 18:25:51
nit: Here and elsewhere, I think it's OK to pass t
chongz
2016/07/07 22:18:09
Done. Except one place for DomCode=>Key testing.
| |
360 for (const auto& test_case : kJapaneseTestCases) { | |
Wez
2016/07/07 18:25:51
Suggest folding these two loops into one, for clar
chongz
2016/07/07 22:18:09
Done.
| |
361 EXPECT_EQ(test_case.us_key, DomKeyFromKeyboardCodeImpl( | |
362 us_keymap, test_case.key_code, EF_NONE)) | |
363 << test_case.key_code; | |
364 } | |
365 | |
366 // Japanese layout should return specific DomKey. | |
367 HKL jp_layout = GetInputLocale(LAYOUT_JP); | |
368 PlatformKeyMap ko_keymap(jp_layout); | |
Wez
2016/07/07 18:25:51
jp_keymap?
chongz
2016/07/07 22:18:09
Done.
| |
369 for (const auto& test_case : kJapaneseTestCases) { | |
370 EXPECT_EQ(test_case.jp_key, DomKeyFromKeyboardCodeImpl( | |
371 ko_keymap, test_case.key_code, EF_NONE)) | |
372 << test_case.key_code; | |
373 } | |
374 } | |
375 | |
337 } // namespace ui | 376 } // namespace ui |
OLD | NEW |