[iOS] No DOM keypress event emitted for cursor key commands when non-editable element...
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 18 Mar 2019 17:59:50 +0000 (17:59 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 18 Mar 2019 17:59:50 +0000 (17:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=195626
<rdar://problem/48810626>

Reviewed by Wenson Hsieh.

Source/WebKit:

Following the UIKit fix <rdar://problem/47333786> WebKit will be asked whether it can perform some
more actions, including cursor movements and more editing actions. All such actions are only applicable
to editable elements. By responding NO to UIKit for such actions when we are not in an editable element
we avoid the need to do such bookkeeping ourselves as UIKit will forward our response back to us
on return from -handleKeyTextCommandForCurrentEvent, called from -[WKContentView _interpretKeyEvent].
WebKit is then in a position to try to handle the event or in the case of all standard text editing
key commands at the time of writing (e.g. Control + a) tell WebCore that it did not handle the event
so that WebCore can continue the DOM key event dispatch algorithm. For standard text editing key
commands, such as Control + a, we will emit a DOM keypress event for the 'a'.

* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView canPerformAction:withSender:]):

LayoutTests:

Add some tests. These tests depend on UIKit work.

* fast/events/ios/key-events-control-expected.txt: Added.
* fast/events/ios/key-events-control.html: Copied from LayoutTests/fast/events/ios/key-events-meta-alt-combinations.html.
* fast/events/ios/key-events-meta-expected.txt: Added.
* fast/events/ios/key-events-meta.html: Copied from LayoutTests/fast/events/ios/key-events-meta-alt-combinations.html.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@243082 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/events/ios/key-events-control-expected.txt [new file with mode: 0644]
LayoutTests/fast/events/ios/key-events-control.html [new file with mode: 0644]
LayoutTests/fast/events/ios/key-events-meta-expected.txt [new file with mode: 0644]
LayoutTests/fast/events/ios/key-events-meta.html [new file with mode: 0644]
Source/WebKit/ChangeLog
Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm

index d64c77e..621f52a 100644 (file)
@@ -1,5 +1,20 @@
 2019-03-18  Daniel Bates  <dabates@apple.com>
 
+        [iOS] No DOM keypress event emitted for cursor key commands when non-editable element is focused
+        https://bugs.webkit.org/show_bug.cgi?id=195626
+        <rdar://problem/48810626>
+
+        Reviewed by Wenson Hsieh.
+
+        Add some tests. These tests depend on UIKit work.
+
+        * fast/events/ios/key-events-control-expected.txt: Added.
+        * fast/events/ios/key-events-control.html: Copied from LayoutTests/fast/events/ios/key-events-meta-alt-combinations.html.
+        * fast/events/ios/key-events-meta-expected.txt: Added.
+        * fast/events/ios/key-events-meta.html: Copied from LayoutTests/fast/events/ios/key-events-meta-alt-combinations.html.
+
+2019-03-18  Daniel Bates  <dabates@apple.com>
+
         Fix bad substitution made in r241282
 
         Revert substitution of "computeSubsets(modifierKeys)" back to "modiferKeySubsetsToTest" so
diff --git a/LayoutTests/fast/events/ios/key-events-control-expected.txt b/LayoutTests/fast/events/ios/key-events-control-expected.txt
new file mode 100644 (file)
index 0000000..4240c54
--- /dev/null
@@ -0,0 +1,290 @@
+This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Control + X. Must be run in WebKitTestRunner.
+
+
+Test Control + a:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: a, code: KeyA, keyIdentifier: , keyCode: 1, charCode: 1, keyCode: 1, which: 1, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + b:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: b, code: KeyB, keyIdentifier: , keyCode: 2, charCode: 2, keyCode: 2, which: 2, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + c:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: c, code: KeyC, keyIdentifier: , keyCode: 13, charCode: 13, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + d:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: d, code: KeyD, keyIdentifier: , keyCode: 4, charCode: 4, keyCode: 4, which: 4, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + f:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: f, code: KeyF, keyIdentifier: , keyCode: 6, charCode: 6, keyCode: 6, which: 6, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + g:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: g, code: KeyG, keyIdentifier: , keyCode: 7, charCode: 7, keyCode: 7, which: 7, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + h:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 8, charCode: 0, keyCode: 8, which: 8, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: h, code: KeyH, keyIdentifier: , keyCode: 8, charCode: 8, keyCode: 8, which: 8, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 8, charCode: 0, keyCode: 8, which: 8, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + j:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: j, code: KeyJ, keyIdentifier: , keyCode: 10, charCode: 10, keyCode: 10, which: 10, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + k:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: k, code: KeyK, keyIdentifier: , keyCode: 11, charCode: 11, keyCode: 11, which: 11, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + l:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: l, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: l, code: KeyL, keyIdentifier: , keyCode: 12, charCode: 12, keyCode: 12, which: 12, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: l, code: KeyL, keyIdentifier: U+004C, keyCode: 76, charCode: 0, keyCode: 76, which: 76, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + m:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: m, code: KeyM, keyIdentifier: , keyCode: 13, charCode: 13, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 13, charCode: 0, keyCode: 13, which: 13, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + o:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: o, code: KeyO, keyIdentifier: , keyCode: 15, charCode: 15, keyCode: 15, which: 15, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + p:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: p, code: KeyP, keyIdentifier: , keyCode: 16, charCode: 16, keyCode: 16, which: 16, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + q:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: q, code: KeyQ, keyIdentifier: , keyCode: 17, charCode: 17, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + r:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: r, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: r, code: KeyR, keyIdentifier: , keyCode: 18, charCode: 18, keyCode: 18, which: 18, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: r, code: KeyR, keyIdentifier: U+0052, keyCode: 82, charCode: 0, keyCode: 82, which: 82, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + s:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: s, code: KeyS, keyIdentifier: , keyCode: 19, charCode: 19, keyCode: 19, which: 19, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + t:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: t, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: t, code: KeyT, keyIdentifier: , keyCode: 20, charCode: 20, keyCode: 20, which: 20, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: t, code: KeyT, keyIdentifier: U+0054, keyCode: 84, charCode: 0, keyCode: 84, which: 84, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + v:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: v, code: KeyV, keyIdentifier: , keyCode: 22, charCode: 22, keyCode: 22, which: 22, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + w:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: w, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: w, code: KeyW, keyIdentifier: , keyCode: 23, charCode: 23, keyCode: 23, which: 23, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: w, code: KeyW, keyIdentifier: U+0057, keyCode: 87, charCode: 0, keyCode: 87, which: 87, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + x:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: x, code: KeyX, keyIdentifier: , keyCode: 24, charCode: 24, keyCode: 24, which: 24, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + y:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: y, code: KeyY, keyIdentifier: , keyCode: 25, charCode: 25, keyCode: 25, which: 25, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + z:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: z, code: KeyZ, keyIdentifier: , keyCode: 26, charCode: 26, keyCode: 26, which: 26, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + 0:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 0, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 0, code: Digit0, keyIdentifier: , keyCode: 48, charCode: 48, keyCode: 48, which: 48, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: 0, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + 1:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 1, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 1, code: Digit1, keyIdentifier: , keyCode: 49, charCode: 49, keyCode: 49, which: 49, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: 1, code: Digit1, keyIdentifier: U+0031, keyCode: 49, charCode: 0, keyCode: 49, which: 49, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + 2:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 2, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 2, code: Digit2, keyIdentifier: , keyCode: 50, charCode: 50, keyCode: 50, which: 50, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: 2, code: Digit2, keyIdentifier: U+0032, keyCode: 50, charCode: 0, keyCode: 50, which: 50, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + 3:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 3, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 3, code: Digit3, keyIdentifier: , keyCode: 51, charCode: 51, keyCode: 51, which: 51, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: 3, code: Digit3, keyIdentifier: U+0033, keyCode: 51, charCode: 0, keyCode: 51, which: 51, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + 4:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 4, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 4, code: Digit4, keyIdentifier: , keyCode: 52, charCode: 52, keyCode: 52, which: 52, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: 4, code: Digit4, keyIdentifier: U+0034, keyCode: 52, charCode: 0, keyCode: 52, which: 52, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + 5:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 5, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 5, code: Digit5, keyIdentifier: , keyCode: 53, charCode: 53, keyCode: 53, which: 53, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: 5, code: Digit5, keyIdentifier: U+0035, keyCode: 53, charCode: 0, keyCode: 53, which: 53, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + 6:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 6, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 6, code: Digit6, keyIdentifier: , keyCode: 54, charCode: 54, keyCode: 54, which: 54, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: 6, code: Digit6, keyIdentifier: U+0036, keyCode: 54, charCode: 0, keyCode: 54, which: 54, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + 7:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 7, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 7, code: Digit7, keyIdentifier: , keyCode: 55, charCode: 55, keyCode: 55, which: 55, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: 7, code: Digit7, keyIdentifier: U+0037, keyCode: 55, charCode: 0, keyCode: 55, which: 55, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + 8:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 8, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 8, code: Digit8, keyIdentifier: , keyCode: 56, charCode: 56, keyCode: 56, which: 56, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: 8, code: Digit8, keyIdentifier: U+0038, keyCode: 56, charCode: 0, keyCode: 56, which: 56, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + 9:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 9, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 9, code: Digit9, keyIdentifier: , keyCode: 57, charCode: 57, keyCode: 57, which: 57, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: 9, code: Digit9, keyIdentifier: U+0039, keyCode: 57, charCode: 0, keyCode: 57, which: 57, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + -:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: -, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: -, code: Minus, keyIdentifier: , keyCode: 31, charCode: 31, keyCode: 31, which: 31, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: -, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + =:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: =, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: =, code: Equal, keyIdentifier: , keyCode: 61, charCode: 61, keyCode: 61, which: 61, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: =, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + [:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: [, code: BracketLeft, keyIdentifier: U+005B, keyCode: 27, charCode: 0, keyCode: 27, which: 27, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: [, code: BracketLeft, keyIdentifier: , keyCode: 27, charCode: 27, keyCode: 27, which: 27, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: [, code: BracketLeft, keyIdentifier: U+005B, keyCode: 27, charCode: 0, keyCode: 27, which: 27, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + ]:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: ], code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: ], code: BracketRight, keyIdentifier: , keyCode: 29, charCode: 29, keyCode: 29, which: 29, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: ], code: BracketRight, keyIdentifier: U+005D, keyCode: 221, charCode: 0, keyCode: 221, which: 221, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + ;:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: ;, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: ;, code: Semicolon, keyIdentifier: , keyCode: 59, charCode: 59, keyCode: 59, which: 59, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: ;, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + ':
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: ', code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: ', code: Quote, keyIdentifier: , keyCode: 39, charCode: 39, keyCode: 39, which: 39, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: ', code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + ,:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: ,, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: ,, code: Comma, keyIdentifier: , keyCode: 44, charCode: 44, keyCode: 44, which: 44, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: ,, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + .:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: ., code: Period, keyIdentifier: , keyCode: 46, charCode: 46, keyCode: 46, which: 46, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Control + /:
+type: keydown, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: /, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: /, code: Slash, keyIdentifier: , keyCode: 47, charCode: 47, keyCode: 47, which: 47, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: /, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: false, ctrlKey: true, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Control, code: ControlLeft, keyIdentifier: Control, keyCode: 17, charCode: 0, keyCode: 17, which: 17, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
diff --git a/LayoutTests/fast/events/ios/key-events-control.html b/LayoutTests/fast/events/ios/key-events-control.html
new file mode 100644 (file)
index 0000000..a94a41a
--- /dev/null
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../../resources/ui-helper.js"></script>
+<script src="../resources/compute-subsets.js"></script>
+<script src="resources/key-tester.js"></script>
+<script>
+const modiferKeySubsetsToTest = computeSubsets(["ctrlKey"]);
+for (const k of keysExcludingDeadAndSkippedKeys) {
+    for (const modifiers of modiferKeySubsetsToTest)
+        tests.push(new KeyCommand(k, modifiers));
+}
+</script>
+</head>
+<body>
+<p>This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form <key>Control<key> + <key>X</key>. Must be run in WebKitTestRunner.</p>
+<pre id="console"></pre>
+</body>
+</html>
diff --git a/LayoutTests/fast/events/ios/key-events-meta-expected.txt b/LayoutTests/fast/events/ios/key-events-meta-expected.txt
new file mode 100644 (file)
index 0000000..f60191a
--- /dev/null
@@ -0,0 +1,159 @@
+This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form Command + X. Must be run in WebKitTestRunner.
+
+
+Test Command + a:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: a, code: KeyA, keyIdentifier: U+0041, keyCode: 65, charCode: 0, keyCode: 65, which: 65, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: a, code: KeyA, keyIdentifier: , keyCode: 97, charCode: 97, keyCode: 97, which: 97, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + b:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: b, code: KeyB, keyIdentifier: U+0042, keyCode: 66, charCode: 0, keyCode: 66, which: 66, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: b, code: KeyB, keyIdentifier: , keyCode: 98, charCode: 98, keyCode: 98, which: 98, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + c:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: c, code: KeyC, keyIdentifier: U+0043, keyCode: 67, charCode: 0, keyCode: 67, which: 67, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: c, code: KeyC, keyIdentifier: , keyCode: 99, charCode: 99, keyCode: 99, which: 99, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + d:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: d, code: KeyD, keyIdentifier: U+0044, keyCode: 68, charCode: 0, keyCode: 68, which: 68, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: d, code: KeyD, keyIdentifier: , keyCode: 100, charCode: 100, keyCode: 100, which: 100, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + f:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: f, code: KeyF, keyIdentifier: U+0046, keyCode: 70, charCode: 0, keyCode: 70, which: 70, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: f, code: KeyF, keyIdentifier: , keyCode: 102, charCode: 102, keyCode: 102, which: 102, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + g:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: g, code: KeyG, keyIdentifier: U+0047, keyCode: 71, charCode: 0, keyCode: 71, which: 71, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: g, code: KeyG, keyIdentifier: , keyCode: 103, charCode: 103, keyCode: 103, which: 103, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + h:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: h, code: KeyH, keyIdentifier: U+0048, keyCode: 72, charCode: 0, keyCode: 72, which: 72, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: h, code: KeyH, keyIdentifier: , keyCode: 104, charCode: 104, keyCode: 104, which: 104, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + j:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: j, code: KeyJ, keyIdentifier: U+004A, keyCode: 74, charCode: 0, keyCode: 74, which: 74, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: j, code: KeyJ, keyIdentifier: , keyCode: 106, charCode: 106, keyCode: 106, which: 106, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + k:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: k, code: KeyK, keyIdentifier: U+004B, keyCode: 75, charCode: 0, keyCode: 75, which: 75, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: k, code: KeyK, keyIdentifier: , keyCode: 107, charCode: 107, keyCode: 107, which: 107, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + m:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: m, code: KeyM, keyIdentifier: U+004D, keyCode: 77, charCode: 0, keyCode: 77, which: 77, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: m, code: KeyM, keyIdentifier: , keyCode: 109, charCode: 109, keyCode: 109, which: 109, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + o:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: o, code: KeyO, keyIdentifier: U+004F, keyCode: 79, charCode: 0, keyCode: 79, which: 79, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: o, code: KeyO, keyIdentifier: , keyCode: 111, charCode: 111, keyCode: 111, which: 111, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + p:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: p, code: KeyP, keyIdentifier: U+0050, keyCode: 80, charCode: 0, keyCode: 80, which: 80, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: p, code: KeyP, keyIdentifier: , keyCode: 112, charCode: 112, keyCode: 112, which: 112, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + q:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: q, code: KeyQ, keyIdentifier: U+0051, keyCode: 81, charCode: 0, keyCode: 81, which: 81, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: q, code: KeyQ, keyIdentifier: , keyCode: 113, charCode: 113, keyCode: 113, which: 113, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + s:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: s, code: KeyS, keyIdentifier: U+0053, keyCode: 83, charCode: 0, keyCode: 83, which: 83, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: s, code: KeyS, keyIdentifier: , keyCode: 115, charCode: 115, keyCode: 115, which: 115, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + v:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: v, code: KeyV, keyIdentifier: U+0056, keyCode: 86, charCode: 0, keyCode: 86, which: 86, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: v, code: KeyV, keyIdentifier: , keyCode: 118, charCode: 118, keyCode: 118, which: 118, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + x:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: x, code: KeyX, keyIdentifier: U+0058, keyCode: 88, charCode: 0, keyCode: 88, which: 88, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: x, code: KeyX, keyIdentifier: , keyCode: 120, charCode: 120, keyCode: 120, which: 120, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + y:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: y, code: KeyY, keyIdentifier: U+0059, keyCode: 89, charCode: 0, keyCode: 89, which: 89, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: y, code: KeyY, keyIdentifier: , keyCode: 121, charCode: 121, keyCode: 121, which: 121, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + z:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: z, code: KeyZ, keyIdentifier: U+005A, keyCode: 90, charCode: 0, keyCode: 90, which: 90, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + 0:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: 0, code: Digit0, keyIdentifier: U+0030, keyCode: 48, charCode: 0, keyCode: 48, which: 48, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: 0, code: Digit0, keyIdentifier: , keyCode: 48, charCode: 48, keyCode: 48, which: 48, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + -:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: -, code: Minus, keyIdentifier: U+002D, keyCode: 189, charCode: 0, keyCode: 189, which: 189, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: -, code: Minus, keyIdentifier: , keyCode: 45, charCode: 45, keyCode: 45, which: 45, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + =:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: =, code: Equal, keyIdentifier: U+003D, keyCode: 187, charCode: 0, keyCode: 187, which: 187, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: =, code: Equal, keyIdentifier: , keyCode: 61, charCode: 61, keyCode: 61, which: 61, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + ;:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: ;, code: Semicolon, keyIdentifier: U+003B, keyCode: 186, charCode: 0, keyCode: 186, which: 186, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: ;, code: Semicolon, keyIdentifier: , keyCode: 59, charCode: 59, keyCode: 59, which: 59, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + ':
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: ', code: Quote, keyIdentifier: U+0027, keyCode: 222, charCode: 0, keyCode: 222, which: 222, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: ', code: Quote, keyIdentifier: , keyCode: 39, charCode: 39, keyCode: 39, which: 39, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + ,:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: ,, code: Comma, keyIdentifier: U+002C, keyCode: 188, charCode: 0, keyCode: 188, which: 188, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: ,, code: Comma, keyIdentifier: , keyCode: 44, charCode: 44, keyCode: 44, which: 44, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + .:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: ., code: Period, keyIdentifier: , keyCode: 46, charCode: 46, keyCode: 46, which: 46, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: ., code: Period, keyIdentifier: U+002E, keyCode: 190, charCode: 0, keyCode: 190, which: 190, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
+Test Command + /:
+type: keydown, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 1, keyLocation: 1
+type: keydown, key: /, code: Slash, keyIdentifier: U+002F, keyCode: 191, charCode: 0, keyCode: 191, which: 191, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keypress, key: /, code: Slash, keyIdentifier: , keyCode: 47, charCode: 47, keyCode: 47, which: 47, altKey: false, ctrlKey: false, metaKey: true, shiftKey: false, location: 0, keyLocation: 0
+type: keyup, key: Meta, code: MetaLeft, keyIdentifier: Meta, keyCode: 91, charCode: 0, keyCode: 91, which: 91, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, location: 1, keyLocation: 1
+
diff --git a/LayoutTests/fast/events/ios/key-events-meta.html b/LayoutTests/fast/events/ios/key-events-meta.html
new file mode 100644 (file)
index 0000000..a85bea6
--- /dev/null
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../../resources/ui-helper.js"></script>
+<script src="../resources/compute-subsets.js"></script>
+<script src="resources/key-tester.js"></script>
+<script>
+const modiferKeySubsetsToTest = computeSubsets(["metaKey"]);
+for (const k of keysExcludingDeadAndSkippedKeys) {
+    for (const modifiers of modiferKeySubsetsToTest)
+        tests.push(new KeyCommand(k, modifiers));
+}
+</script>
+</head>
+<body>
+<p>This logs DOM keydown, keyup, keypress events that are dispatched when pressing key commands of the form <key>Command<key> + <key>X</key>. Must be run in WebKitTestRunner.</p>
+<pre id="console"></pre>
+</body>
+</html>
index 1460219..ceb9ea0 100644 (file)
@@ -1,3 +1,24 @@
+2019-03-18  Daniel Bates  <dabates@apple.com>
+
+        [iOS] No DOM keypress event emitted for cursor key commands when non-editable element is focused
+        https://bugs.webkit.org/show_bug.cgi?id=195626
+        <rdar://problem/48810626>
+
+        Reviewed by Wenson Hsieh.
+
+        Following the UIKit fix <rdar://problem/47333786> WebKit will be asked whether it can perform some
+        more actions, including cursor movements and more editing actions. All such actions are only applicable
+        to editable elements. By responding NO to UIKit for such actions when we are not in an editable element
+        we avoid the need to do such bookkeeping ourselves as UIKit will forward our response back to us
+        on return from -handleKeyTextCommandForCurrentEvent, called from -[WKContentView _interpretKeyEvent].
+        WebKit is then in a position to try to handle the event or in the case of all standard text editing
+        key commands at the time of writing (e.g. Control + a) tell WebCore that it did not handle the event
+        so that WebCore can continue the DOM key event dispatch algorithm. For standard text editing key
+        commands, such as Control + a, we will emit a DOM keypress event for the 'a'.
+
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView canPerformAction:withSender:]):
+
 2019-03-18  Adrian Perez de Castro  <aperez@igalia.com>
 
         [WPE] Bump public API to wpe-1.0
index 27d48d4..557f3e3 100644 (file)
@@ -2771,6 +2771,16 @@ WEBCORE_COMMAND_FOR_WEBVIEW(pasteAndMatchStyle);
     if (_domPasteRequestHandler)
         return action == @selector(paste:);
 
+    // These are UIKit IPI selectors. We don't want to forward them to the web view.
+    auto editorState = _page->editorState();
+    if (action == @selector(_deleteByWord) || action == @selector(_deleteForwardAndNotify:) || action == @selector(_deleteToEndOfParagraph) || action == @selector(_deleteToStartOfLine)
+        || action == @selector(_moveDown:withHistory:) || action == @selector(_moveLeft:withHistory:) || action == @selector(_moveRight:withHistory:)
+        || action == @selector(_moveToEndOfDocument:withHistory:) || action == @selector(_moveToEndOfLine:withHistory:) || action == @selector(_moveToEndOfParagraph:withHistory:)
+        || action == @selector(_moveToEndOfWord:withHistory:) || action == @selector(_moveToStartOfDocument:withHistory:) || action == @selector(_moveToStartOfLine:withHistory:)
+        || action == @selector(_moveToStartOfParagraph:withHistory:) || action == @selector(_moveToStartOfWord:withHistory:) || action == @selector(_moveUp:withHistory:)
+        || action == @selector(_transpose))
+        return editorState.isContentEditable;
+
     return [_webView canPerformAction:action withSender:sender];
 }