CARVIEW |
UI Events KeyboardEvent code Implementation Report
More details about this document
- This version:
- https://w3c.github.io/uievents-code/impl-report.html
- Issue Tracking:
- GitHub
- Editor:
- Gary Kacmarcik (Google)
Copyright © 2023 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Abstract
This document reports on implementations of the [UIEvents-Code] specification.
Status of this document
This section describes the status of this document at the time of its publication. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at https://www.w3.org/TR/.
This document was published by the Web Applications Working Group as an Editors Draft. This document is intended to become a W3C Recommendation.
This document was published by the Web Applications Working Group as a Working Draft. Feedback and comments on this specification are welcome. Please use GitHub issues Historical discussions can be found in the public-webapps@w3.org archives.
Publication as an Editors Draft does not imply endorsement by W3C and its Members. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This document was produced by a group operating under the W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
This document is governed by the 2 November 2021 W3C Process Document.
1. Introduction
The [UIEvents-Code] specification defines the set of values that are valid for use
in the code
attribute.
This document summarizes the current implementation status of the code
attribute and its values.
The following versions of each user agents were tested:
-
Google Chrome 60.0.3112.113 (Windows 10, OS X 10.12.2, Ubuntu)
-
Mozilla Firefox 55.0 (Windows 10, OS X 10.12.2, Ubuntu)
-
Microsoft Edge 83.0.478.58 (Windows 10)
-
Apple Safari 13.1.1 (OS X 10.14.6)
2. Methodology
Because there is no automated way to test these key press events (expecially considering that international keyboard are often required), these tests were all performed manually.
Manual tests were performed by visiting the domeeventviewer.com/key-event-viewer.html test page and examining the "code" column after pressing the key being tested. To test keys (like "IntlBackslash") that are only present on keyboards for certain locales, this requires using a keyboard that contains the key being tested.
For purposes of this report, Chrome, Firefox and Safari are considered independent implementations.
3. Results
3.1. Summary
Manual tests for all 112 required values of the code
attribute Pass in at least 2 independent implementations.
The Candidate Recommendation exit criteria are therefore fulfilled.
In addition, the specification describes 60 optional values that may be used to support multimedia or legacy keyboards. Of these, manual tests confirm that 9 of these Pass in at least 2 independent implementations.
3.2. Raw Results
The following tables present the result of the manual tests.
Entries marked "Pass" generate the expected value when the corresponding key is pressed.
Entries marked "Fail" generate some value other than the expected value when the corresponding key is pressed. Wherever possible, a Note is included that provides more information about the failure.
Entries marked with a "?" have not been tested, typically because devices with that key were not available (for example, because keyboards with those keys are not supported on that platform).
Entries marked with "N/A" are not currently testable, typically because the devices with that key do not generate separate keyboard events. E.g., FnLock.
3.2.1. code
Attribute
The code
attribute (defined in [UIEvents]) is present in all
browsers tested.
KeyboardEvent attribute
| Windows | macOS | Linux | Notes | |||||
---|---|---|---|---|---|---|---|---|---|
Chrome | Firefox | Edge | Chrome | Firefox | Safari | Chrome | Firefox | ||
code
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass |
3.2.2. Required code
Values
This section lists the test results for the basic set of code
attribute values that a conforming implementation must support.
code attribute value | Windows | macOS | Linux | Notes | |||||
---|---|---|---|---|---|---|---|---|---|
Chrome | Firefox | Edge | Chrome | Firefox | Safari | Chrome | Firefox | ||
Alphanumeric Section - Writing System Keys | |||||||||
"Backquote"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Backslash"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"BracketLeft"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"BracketRight"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Comma"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Digit0"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Digit1"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Digit2"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Digit3"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Digit4"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Digit5"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Digit6"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Digit7"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Digit8"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Digit9"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Equal"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"IntlBackslash"
| Pass | Pass | Pass | Pass | Pass | Fail | Pass | Pass | Safari swaps IntlBackslash with Backquote on keyboards that support IntlBackslash |
"IntlRo"
| Pass | Pass | Pass | ? | ? | ? | ? | ? | |
"IntlYen"
| Pass | Pass | Pass | ? | ? | ? | ? | ? | |
"KeyA"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyB"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyC"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyD"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyE"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyF"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyG"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyH"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyI"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyJ"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyK"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyL"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyM"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyN"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyO"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyP"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyQ"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyR"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyS"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyT"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyU"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyV"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyW"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyX"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyY"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"KeyZ"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Minus"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Period"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Quote"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Semicolon"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Slash"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
Alphanumeric Section - Functional Keys | |||||||||
"AltLeft"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"AltRight"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Backspace"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"CapsLock"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"ContextMenu"
| Pass | Pass | Pass | Pass | Pass | Fail | Pass | Pass | Safari returns "Unidentified" |
"ControlLeft"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"ControlRight"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Enter"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"MetaLeft"
| Pass | Fail | Pass | Pass | Fail | Pass | Pass | Fail | Firefox returns "OSLeft" |
"MetaRight"
| Pass | Fail | Pass | Pass | Fail | Pass | Pass | Fail | Firefox returns "OSRight" |
"ShiftLeft"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"ShiftRight"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Space"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Tab"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Convert"
| Pass | Pass | Pass | ? | ? | ? | ? | ? | |
"KanaMode"
| Pass | Pass | Pass | ? | ? | ? | ? | ? | |
"NonConvert"
| Pass | Pass | Pass | ? | ? | ? | ? | ? | |
Control Pad Section | |||||||||
"Delete"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"End"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Home"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"Insert"
| Pass | Pass | Pass | Pass | Pass | Fail | Pass | Pass | Safari returns "Help" |
"PageDown"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"PageUp"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
Arrow Pad Section | |||||||||
"ArrowDown"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"ArrowLeft"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"ArrowRight"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"ArrowUp"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
Numpad Section | |||||||||
"NumLock"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"Numpad0"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"Numpad1"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"Numpad2"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"Numpad3"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"Numpad4"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"Numpad5"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"Numpad6"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"Numpad7"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"Numpad8"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"Numpad9"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"NumpadAdd"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"NumpadDecimal"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"NumpadDivide"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"NumpadEnter"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"NumpadMultiply"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
"NumpadSubtract"
| Pass | ? | Pass | Pass | Pass | Pass | Pass | Pass | |
Function Section | |||||||||
"Escape"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F1"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F2"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F3"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F4"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F5"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F6"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F7"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F8"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F9"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F10"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass | |
"F11"
| Pass | Pass | Pass | Pass | ? | ? | Pass | ? | macOS & Ubuntu enter fullscreen; Chrome requires KeyboardLock |
"F12"
| Pass | Pass | Pass | Pass | Pass | Pass | ? | ? | |
"PrintScreen"
| Pass | Pass | Pass | Fail | Fail | Fail | ? | ? | macOS returns "F13"; Ubuntu takes screenshot |
"ScrollLock"
| Pass | Pass | Pass | ? | ? | ? | Pass | Pass | macOS decreases brightness |
"Pause"
| Pass | Pass | Pass | ? | ? | ? | Pass | Pass | macOS increases brightness |
Special Values | |||||||||
"Unidentified"
| Pass | Pass | Pass | Pass | Pass | Pass | Pass | Pass |
3.2.3. Optional code
Values
This section lists the test results for the set of code
attribute values that a conforming implementation may use to support special
keyboards (such as multimedia or legacy keyboards).
code attribute value | Windows | macOS | Linux | Notes | |||||
---|---|---|---|---|---|---|---|---|---|
Chrome | Firefox | Edge | Chrome | Firefox | Safari | Chrome | Firefox | ||
Media Keys | |||||||||
"BrowserBack"
| Pass | Pass | Pass | Fail | Fail | Fail | Pass | ? | Handled by OS (Chrome requires KeyboardLock) |
"BrowserFavorites"
| Pass | Pass | Pass | Fail | Fail | Fail | Pass | ? | Handled by OS (Chrome requires KeyboardLock) |
"BrowserForward"
| Pass | Pass | Pass | Fail | Fail | Fail | Pass | ? | Handled by OS (Chrome requires KeyboardLock) |
"BrowserHome"
| Pass | ? | Pass | Fail | Fail | Fail | Pass | ? | Handled by OS (Chrome requires KeyboardLock) |
"BrowserRefresh"
| ? | ? | Fail | ? | ? | ? | ? | ? | |
"BrowserSearch"
| Fail | ? | Fail | Fail | Fail | Fail | Fail | Fail | |
"BrowserStop"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Eject"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"LaunchApp1"
| ? | ? | ? | Fail | Fail | Fail | ? | ? | |
"LaunchApp2"
| ? | ? | ? | Fail | Fail | Fail | ? | ? | |
"LaunchMail"
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | Handled by OS |
"MediaPlayPause"
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | Handled by OS |
"MediaSelect"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"MediaStop"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"MediaTrackNext"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"MediaTrackPrevious"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Power"
| ? | ? | ? | Fail | ? | ? | ? | ? | |
"Sleep"
| ? | ? | ? | Fail | ? | ? | ? | ? | |
"AudioVolumeDown"
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | Handled by OS |
"AudioVolumeMute"
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | Handled by OS |
"AudioVolumeUp"
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | Handled by OS |
"WakeUp"
| ? | ? | ? | Fail | ? | ? | ? | ? | |
Alphanumeric Section - Functional Keys | |||||||||
"Lang1"
| ? | ? | ? | Fail | Pass | Fail | Pass | Pass | Safari returns KanaMode |
"Lang2"
| ? | ? | ? | Fail | Pass | Pass | Pass | Pass | |
"Lang3"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Lang4"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Lang5"
| ? | ? | ? | ? | ? | ? | ? | ? | |
Numpad Section | |||||||||
"NumpadBackspace"
| Fail | Fail | Fail | Fail | ? | ? | Fail | Fail | Chrome/Firefox/Safari return "Backspace" |
"NumpadClear"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"NumpadClearEntry"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"NumpadComma"
| ? | ? | ? | ? | ? | ? | ? | ? | Need to test with Brazilian keyboard. |
"NumpadEqual"
| Pass | ? | Pass | Pass | ? | ? | Pass | Pass | |
"NumpadHash"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"NumpadMemoryAdd"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"NumpadMemoryClear"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"NumpadMemoryRecall"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"NumpadMemoryStore"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"NumpadMemorySubtract"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"NumpadParenLeft"
| Pass | ? | ? | Fail | ? | ? | Pass | Pass | |
"NumpadParenRight"
| Pass | ? | ? | Fail | ? | ? | Pass | Pass | |
"NumpadStar"
| ? | ? | ? | ? | ? | ? | ? | ? | |
Function Section | |||||||||
"Fn"
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | |
"FnLock"
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | |
Legacy, Non-Standard and Special Keys | |||||||||
"Hyper"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Super"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Turbo"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Abort"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Resume"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Suspend"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Again"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Copy"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Cut"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Find"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Open"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Paste"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Props"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Select"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Undo"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Hiragana"
| ? | ? | ? | ? | ? | ? | ? | ? | |
"Katakana"
| ? | ? | ? | ? | ? | ? | ? | ? |
Conformance
Document conventions
Conformance requirements are expressed with a combination of descriptive assertions and RFC 2119 terminology. The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in the normative parts of this document are to be interpreted as described in RFC 2119. However, for readability, these words do not appear in all uppercase letters in this specification.
All of the text of this specification is normative except sections explicitly marked as non-normative, examples, and notes. [RFC2119]
Examples in this specification are introduced with the words “for example”
or are set apart from the normative text
with class="example"
,
like this:
Informative notes begin with the word “Note”
and are set apart from the normative text
with class="note"
,
like this:
Note, this is an informative note.
Conformant Algorithms
Requirements phrased in the imperative as part of algorithms (such as "strip any leading space characters" or "return false and abort these steps") are to be interpreted with the meaning of the key word ("must", "should", "may", etc) used in introducing the algorithm.
Conformance requirements phrased as algorithms or specific steps can be implemented in any manner, so long as the end result is equivalent. In particular, the algorithms defined in this specification are intended to be easy to understand and are not intended to be performant. Implementers are encouraged to optimize.
Index
Terms defined by reference
-
[UIEvents] defines the following terms:
- KeyboardEvent
- code
-
[UIEvents-Code] defines the following terms:
- code attribute value
References
Normative References
- [RFC2119]
- S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
- [UIEvents]
- Gary Kacmarcik; Travis Leithead. UI Events. URL: https://w3c.github.io/uievents/
- [UIEvents-Code]
- Gary Kacmarcik; Travis Leithead. UI Events KeyboardEvent code Values. URL: https://w3c.github.io/uievents-code/