Chromium Code Reviews| Index: ui/base/test/ui_controls_internal_win.cc |
| diff --git a/ui/base/test/ui_controls_internal_win.cc b/ui/base/test/ui_controls_internal_win.cc |
| index ade37c9375840cb879cb213f184ecc652d2e5cd7..c508ffcea92dcb46bf89306bc1eb6e08125ae0ef 100644 |
| --- a/ui/base/test/ui_controls_internal_win.cc |
| +++ b/ui/base/test/ui_controls_internal_win.cc |
| @@ -139,14 +139,38 @@ void InputDispatcher::NotifyTask() { |
| // Private functions ---------------------------------------------------------- |
| +// Whether scan code should be used for |key|. |
| +// When sending keyboard events by SendInput() function, Windows does not |
| +// "smartly" add scan code if virtual key-code is used. So these key events |
| +// won't have scan code or DOM UI Event code string. |
| +// But we cannot blindly send all events with scan code. For some layout |
| +// dependent keys, the Windows may not translate them to what they used to be, |
| +// because the test cases are usually running in headless environment with |
| +// default keyboard layout. So fall back to use virtual key code for these keys. |
| +bool ShouldSendThroughScanCode(ui::KeyboardCode key) { |
| + const DWORD native_code = ui::WindowsKeyCodeForKeyboardCode(key); |
| + const DWORD scan_code = MapVirtualKey(native_code, MAPVK_VK_TO_VSC); |
| + return native_code == MapVirtualKey(scan_code, MAPVK_VSC_TO_VK); |
| +} |
| + |
| // Populate the INPUT structure with the appropriate keyboard event |
| // parameters required by SendInput |
| bool FillKeyboardInput(ui::KeyboardCode key, INPUT* input, bool key_up) { |
| memset(input, 0, sizeof(INPUT)); |
| input->type = INPUT_KEYBOARD; |
| input->ki.wVk = ui::WindowsKeyCodeForKeyboardCode(key); |
| - input->ki.dwFlags = key_up ? KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP : |
| - KEYEVENTF_EXTENDEDKEY; |
| + if (ShouldSendThroughScanCode(key)) { |
| + input->ki.wScan = MapVirtualKey(input->ki.wVk, MAPVK_VK_TO_VSC); |
| + // When KEYEVENTF_SCANCODE is used, ki.wVk is ignored, so we do not need to |
| + // clear it. |
| + input->ki.dwFlags = KEYEVENTF_SCANCODE; |
| + if ((input->ki.wScan & 0xFF00) != 0) { |
| + input->ki.dwFlags |= KEYEVENTF_EXTENDEDKEY; |
| + } |
| + } |
| + if (key_up) { |
|
sky
2017/06/21 14:56:04
no {}
Hzj_jie
2017/06/21 18:18:03
Done.
|
| + input->ki.dwFlags |= KEYEVENTF_KEYUP; |
| + } |
| return true; |
| } |