| 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];
|
| + 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]);
|
| }
|
|
|