Chromium Code Reviews| Index: ui/events/keycodes/keyboard_code_conversion_mac.mm |
| diff --git a/ui/events/keycodes/keyboard_code_conversion_mac.mm b/ui/events/keycodes/keyboard_code_conversion_mac.mm |
| index f435f4ed2b966d19a8524ccc2fe63ef61c93c91f..bfc7e725a99412da8ed0d75c52389ee446bf8df5 100644 |
| --- a/ui/events/keycodes/keyboard_code_conversion_mac.mm |
| +++ b/ui/events/keycodes/keyboard_code_conversion_mac.mm |
| @@ -746,8 +746,22 @@ DomKey DomKeyFromNSEvent(NSEvent* event) { |
| // doesn't. |
| if ([event type] == NSKeyDown || [event type] == NSKeyUp) { |
| NSString* characters = [event characters]; |
| - if ([characters length] > 0) |
| - return DomKeyFromCharCode([characters characterAtIndex:0]); |
| + if ([characters length] > 0) { |
| + unichar dom_key_char = |
| + [characters characterAtIndex:[characters length] - 1]; |
|
chongz
2016/02/17 22:54:05
Use last character because e.g. On French keyboard
|
| + if ([event modifierFlags] != 0 && std::iscntrl(dom_key_char)) { |
| + // According to spec if the key combination produces a non-printable |
| + // character, the key value should be the character without modifiers. |
| + // See https://w3c.github.io/uievents/#keys-guidelines |
| + NSString* unmodified_characters = [event charactersIgnoringModifiers]; |
| + if ([unmodified_characters length] > 0) { |
| + unichar unmodified_char = [unmodified_characters |
| + characterAtIndex:[unmodified_characters length] - 1]; |
| + dom_key_char = unmodified_char; |
| + } |
| + } |
| + return DomKeyFromCharCode(dom_key_char); |
| + } |
| } |
| return DomKeyFromKeyCode([event keyCode]); |
| } |