Title: [236271] trunk
Revision
236271
Author
dba...@webkit.org
Date
2018-09-20 11:20:02 -0700 (Thu, 20 Sep 2018)

Log Message

[iOS] Support testing more hardware special keys
https://bugs.webkit.org/show_bug.cgi?id=189793

Reviewed by Simon Fraser.

Tools:

* TestRunnerShared/spi/IOKitSPI.h: Add more SPI constants.
* WebKitTestRunner/ios/HIDEventGenerator.mm:
(keyCodeForDOMFunctionKey): Extracted out logic from hidUsageCodeForCharacter() to return the
key code for the F1, F2, ..., F12 keys and extended the code to compute the key code for the
F13, F14, ..., F24 keys.
(hidUsageCodeForCharacter): Modified to call keyCodeForDOMFunctionKey().

LayoutTests:

For now, many of the DOM keydown and keyup events for special hardware keys are wrong.
We will fix this up in a subsequent commit(s).

* fast/events/ios/keydown-keyup-special-keys-in-non-editable-element-expected.txt: Added.
* fast/events/ios/keydown-keyup-special-keys-in-non-editable-element.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (236270 => 236271)


--- trunk/LayoutTests/ChangeLog	2018-09-20 18:07:39 UTC (rev 236270)
+++ trunk/LayoutTests/ChangeLog	2018-09-20 18:20:02 UTC (rev 236271)
@@ -1,3 +1,16 @@
+2018-09-20  Daniel Bates  <daba...@apple.com>
+
+        [iOS] Support testing more hardware special keys
+        https://bugs.webkit.org/show_bug.cgi?id=189793
+
+        Reviewed by Simon Fraser.
+
+        For now, many of the DOM keydown and keyup events for special hardware keys are wrong.
+        We will fix this up in a subsequent commit(s).
+
+        * fast/events/ios/keydown-keyup-special-keys-in-non-editable-element-expected.txt: Added.
+        * fast/events/ios/keydown-keyup-special-keys-in-non-editable-element.html: Added.
+
 2018-09-20  Per Arne Vollan  <pvol...@apple.com>
 
         [WebVTT] Update the parser according to the new region syntax.

Added: trunk/LayoutTests/fast/events/ios/keydown-keyup-special-keys-in-non-editable-element-expected.txt (0 => 236271)


--- trunk/LayoutTests/fast/events/ios/keydown-keyup-special-keys-in-non-editable-element-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/ios/keydown-keyup-special-keys-in-non-editable-element-expected.txt	2018-09-20 18:20:02 UTC (rev 236271)
@@ -0,0 +1,90 @@
+This tests that DOM keydown and keyup events are dispatched to a non-editable <body> on iOS when pressing special keys on a hardware keyboard. To run this test manually, verify that two messages are emitted when you press the following keys: ↑, ↓, ←, →, Delete, End, Enter, Escape, Home, Insert, left Alt, left ⌘ Command, left Ctrl, left ⇧ Shift, Page Down, Page Up, Return, right Alt, right ⌘ Command, right Ctrl, right ⇧ Shift, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24.
+
+type: keydown, key: ArrowUp, code: ArrowUp, keyIdentifier: Up, keyCode: 38, charCode: 0, keyCode: 38, which: 38
+type: keyup, key: ArrowUp, code: ArrowUp, keyIdentifier: Up, keyCode: 38, charCode: 0, keyCode: 38, which: 38
+type: keyup, key: ArrowDown, code: ArrowDown, keyIdentifier: Down, keyCode: 40, charCode: 0, keyCode: 40, which: 40
+type: keydown, key: ArrowLeft, code: ArrowLeft, keyIdentifier: Left, keyCode: 37, charCode: 0, keyCode: 37, which: 37
+type: keyup, key: ArrowLeft, code: ArrowLeft, keyIdentifier: Left, keyCode: 37, charCode: 0, keyCode: 37, which: 37
+type: keyup, key: ArrowRight, code: ArrowRight, keyIdentifier: Right, keyCode: 39, charCode: 0, keyCode: 39, which: 39
+type: keydown, key: Backspace, code: Backspace, keyIdentifier: U+0008, keyCode: 8, charCode: 0, keyCode: 8, which: 8
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0004, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Enter, code: Enter, keyIdentifier: Enter, keyCode: 13, charCode: 0, keyCode: 13, which: 13
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: UIKeyInputEscape, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: UIKeyInputEscape, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0001, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: UIKeyInputPageDown, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: UIKeyInputPageDown, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: UIKeyInputPageUp, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Enter, code: Enter, keyIdentifier: Enter, keyCode: 13, charCode: 0, keyCode: 13, which: 13
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0010, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: , code: Unidentified, keyIdentifier: U+0005, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keydown, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+type: keyup, key: Dead, code: Unidentified, keyIdentifier: Unidentified, keyCode: 0, charCode: 0, keyCode: 0, which: 0
+

Added: trunk/LayoutTests/fast/events/ios/keydown-keyup-special-keys-in-non-editable-element.html (0 => 236271)


--- trunk/LayoutTests/fast/events/ios/keydown-keyup-special-keys-in-non-editable-element.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/ios/keydown-keyup-special-keys-in-non-editable-element.html	2018-09-20 18:20:02 UTC (rev 236271)
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta name="viewport" content="width=device-width">
+<meta charset="utf8">
+<script src=""
+<script>
+if (window.testRunner) {
+    testRunner.dumpAsText();
+    testRunner.waitUntilDone();
+}
+</script>
+</head>
+<body _onkeydown_="handleKeyDown(event)" _onkeyup_="handleKeyUp(event)">
+<p>This tests that DOM keydown and keyup events are dispatched to a non-editable &lt;body&gt; on iOS when pressing special keys on a hardware keyboard. To run this test manually, verify that two messages are emitted when you press the following keys: <kbd>↑</kbd>, <kbd>↓</kbd>, <kbd>←</kbd>, <kbd>→</kbd>, <kbd>Delete</kbd>, <kbd>End</kbd>, <kbd>Enter</kbd>, <kbd>Escape</kbd>, <kbd>Home</kbd>, <kbd>Insert</kbd>, left <kbd>Alt</kbd>, left <kbd>⌘ Command</kbd>, left <kbd>Ctrl</kbd>, left <kbd>⇧ Shift</kbd>, <kbd>Page Down</kbd>, <kbd>Page Up</kbd>, <kbd>Return</kbd>, right <kbd>Alt</kbd>, right <kbd>⌘ Command</kbd>, right <kbd>Ctrl</kbd>, right <kbd>⇧ Shift</kbd>, <kbd>F1</kbd>, <kbd>F2</
 kbd>, <kbd>F3</kbd>, <kbd>F4</kbd>, <kbd>F5</kbd>, <kbd>F6</kbd>, <kbd>F7</kbd>, <kbd>F8</kbd>, <kbd>F9</kbd>, <kbd>F10</kbd>, <kbd>F11</kbd>, <kbd>F12</kbd>, <kbd>F13</kbd>, <kbd>F14</kbd>, <kbd>F15</kbd>, <kbd>F16</kbd>, <kbd>F17</kbd>, <kbd>F18</kbd>, <kbd>F19</kbd>, <kbd>F20</kbd>, <kbd>F21</kbd>, <kbd>F22</kbd>, <kbd>F23</kbd>, <kbd>F24</kbd>.
+</p>
+<pre id="console"></pre>
+<script>
+var remainingKeysToPress = [
+    "upArrow",
+    "downArrow",
+    "leftArrow",
+    "rightArrow",
+    "delete",
+    "end",
+    "enter",
+    "escape",
+    "home",
+    "insert",
+    "leftAlt",
+    "leftCommand",
+    "leftControl",
+    "leftShift",
+    "pageDown",
+    "pageUp",
+    "return",
+    "rightAlt",
+    "rightCommand",
+    "rightControl",
+    "rightShift",
+];
+
+for (let i = 1; i <= 24; ++i)
+    remainingKeysToPress.push("F" + i);
+
+async function nextKeyPress()
+{
+    if (!remainingKeysToPress.length) {
+        if (window.testRunner)
+            testRunner.notifyDone();
+        return;
+    }
+    let nextKey = remainingKeysToPress.shift();
+    UIHelper.typeCharacter(nextKey);
+}
+
+function handleKeyDown(event)
+{
+    logKeyEvent(event);
+}
+
+function handleKeyUp(event)
+{
+    logKeyEvent(event);
+    nextKeyPress();
+}
+
+function log(message)
+{
+    document.getElementById("console").appendChild(document.createTextNode(message + "\n"));
+}
+
+function logKeyEvent(event)
+{
+    let pieces = [];
+    for (let propertyName of ["type", "key", "code", "keyIdentifier", "keyCode", "charCode", "keyCode", "which"])
+        pieces.push(`${propertyName}: ${event[propertyName]}`);
+    log(pieces.join(", "));
+}
+
+function runTest()
+{
+    if (!window.testRunner)
+        return;
+    nextKeyPress();
+}
+
+runTest();
+</script>
+</body>
+</html>
\ No newline at end of file

Modified: trunk/Tools/ChangeLog (236270 => 236271)


--- trunk/Tools/ChangeLog	2018-09-20 18:07:39 UTC (rev 236270)
+++ trunk/Tools/ChangeLog	2018-09-20 18:20:02 UTC (rev 236271)
@@ -1,3 +1,17 @@
+2018-09-20  Daniel Bates  <daba...@apple.com>
+
+        [iOS] Support testing more hardware special keys
+        https://bugs.webkit.org/show_bug.cgi?id=189793
+
+        Reviewed by Simon Fraser.
+
+        * TestRunnerShared/spi/IOKitSPI.h: Add more SPI constants.
+        * WebKitTestRunner/ios/HIDEventGenerator.mm:
+        (keyCodeForDOMFunctionKey): Extracted out logic from hidUsageCodeForCharacter() to return the
+        key code for the F1, F2, ..., F12 keys and extended the code to compute the key code for the
+        F13, F14, ..., F24 keys.
+        (hidUsageCodeForCharacter): Modified to call keyCodeForDOMFunctionKey().
+
 2018-09-20  Michael Catanzaro  <mcatanz...@igalia.com>
 
         Unreviewed, remove accidentally-committed debugging changes from flatpakutils script

Modified: trunk/Tools/TestRunnerShared/spi/IOKitSPI.h (236270 => 236271)


--- trunk/Tools/TestRunnerShared/spi/IOKitSPI.h	2018-09-20 18:07:39 UTC (rev 236270)
+++ trunk/Tools/TestRunnerShared/spi/IOKitSPI.h	2018-09-20 18:20:02 UTC (rev 236271)
@@ -186,16 +186,27 @@
     kHIDUsage_KeyboardPeriod = 0x37,
     kHIDUsage_KeyboardSlash = 0x38,
     kHIDUsage_KeyboardF1 = 0x3A,
+    kHIDUsage_KeyboardPrintScreen = 0x46,
+    kHIDUsage_KeyboardInsert = 0x49,
     kHIDUsage_KeyboardHome = 0x4A,
     kHIDUsage_KeyboardPageUp = 0x4B,
+    kHIDUsage_KeyboardDeleteForward = 0x4C,
     kHIDUsage_KeyboardEnd = 0x4D,
+    kHIDUsage_KeyboardPageDown = 0x4E,
     kHIDUsage_KeyboardRightArrow = 0x4F,
     kHIDUsage_KeyboardLeftArrow = 0x50,
     kHIDUsage_KeyboardDownArrow = 0x51,
     kHIDUsage_KeyboardUpArrow = 0x52,
+    kHIDUsage_KeyboardF13 = 0x68,
+    kHIDUsage_KeyboardMenu = 0x76,
     kHIDUsage_KeyboardLeftControl = 0xE0,
     kHIDUsage_KeyboardLeftShift = 0xE1,
-    kHIDUsage_KeyboardLeftAlt = 0xE2
+    kHIDUsage_KeyboardLeftAlt = 0xE2,
+    kHIDUsage_KeyboardLeftGUI = 0xE3,
+    kHIDUsage_KeyboardRightControl = 0xE4,
+    kHIDUsage_KeyboardRightShift = 0xE5,
+    kHIDUsage_KeyboardRightAlt = 0xE6,
+    kHIDUsage_KeyboardRightGUI = 0xE7,
 };
 
 WTF_EXTERN_C_END

Modified: trunk/Tools/WebKitTestRunner/ios/HIDEventGenerator.mm (236270 => 236271)


--- trunk/Tools/WebKitTestRunner/ios/HIDEventGenerator.mm	2018-09-20 18:07:39 UTC (rev 236270)
+++ trunk/Tools/WebKitTestRunner/ios/HIDEventGenerator.mm	2018-09-20 18:20:02 UTC (rev 236271)
@@ -32,6 +32,7 @@
 #import <mach/mach_time.h>
 #import <wtf/Assertions.h>
 #import <wtf/BlockPtr.h>
+#import <wtf/Optional.h>
 #import <wtf/RetainPtr.h>
 #import <wtf/SoftLinking.h>
 
@@ -825,6 +826,22 @@
     return false;
 }
 
+static std::optional<uint32_t> keyCodeForDOMFunctionKey(NSString *key)
+{
+    // Compare the input string with the function-key names defined by the DOM spec (i.e. "F1",...,"F24").
+    // If the input string is a function-key name, set its key code. On iOS the key codes for the first 12
+    // function keys are disjoint from the key codes of the last 12 function keys.
+    for (int i = 1; i <= 12; ++i) {
+        if ([key isEqualToString:[NSString stringWithFormat:@"F%d", i]])
+            return kHIDUsage_KeyboardF1 + i - 1;
+    }
+    for (int i = 13; i <= 24; ++i) {
+        if ([key isEqualToString:[NSString stringWithFormat:@"F%d", i]])
+            return kHIDUsage_KeyboardF13 + i - 1;
+    }
+    return std::nullopt;
+}
+
 static inline uint32_t hidUsageCodeForCharacter(NSString *key)
 {
     const int uppercaseAlphabeticOffset = 'A' - kHIDUsage_KeyboardA;
@@ -907,11 +924,20 @@
             return kHIDUsage_KeyboardSpacebar;
         }
     }
-    const int functionKeyOffset = kHIDUsage_KeyboardF1;
-    for (int functionKeyIndex = 1; functionKeyIndex <= 12; ++functionKeyIndex) {
-        if ([key isEqualToString:[NSString stringWithFormat:@"F%d", functionKeyIndex]])
-            return functionKeyOffset + functionKeyIndex - 1;
-    }
+
+    if (auto keyCode = keyCodeForDOMFunctionKey(key))
+        return *keyCode;
+
+    if ([key isEqualToString:@"pageUp"])
+        return kHIDUsage_KeyboardPageUp;
+    if ([key isEqualToString:@"pageDown"])
+        return kHIDUsage_KeyboardPageDown;
+    if ([key isEqualToString:@"home"])
+        return kHIDUsage_KeyboardHome;
+    if ([key isEqualToString:@"insert"])
+        return kHIDUsage_KeyboardInsert;
+    if ([key isEqualToString:@"end"])
+        return kHIDUsage_KeyboardEnd;
     if ([key isEqualToString:@"escape"])
         return kHIDUsage_KeyboardEscape;
     if ([key isEqualToString:@"return"] || [key isEqualToString:@"enter"])
@@ -926,6 +952,10 @@
         return kHIDUsage_KeyboardDownArrow;
     if ([key isEqualToString:@"delete"])
         return kHIDUsage_KeyboardDeleteOrBackspace;
+    if ([key isEqualToString:@"leftCommand"])
+        return kHIDUsage_KeyboardLeftGUI;
+    if ([key isEqualToString:@"rightCommand"])
+        return kHIDUsage_KeyboardRightGUI;
     // The simulator keyboard interprets both left and right modifier keys using the left version of the usage code.
     if ([key isEqualToString:@"leftControl"] || [key isEqualToString:@"rightControl"])
         return kHIDUsage_KeyboardLeftControl;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to