Move charCode / keyCode / which attributes from UIEvent to KeyboardEvent
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 16 Dec 2016 01:29:23 +0000 (01:29 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 16 Dec 2016 01:29:23 +0000 (01:29 +0000)
https://bugs.webkit.org/show_bug.cgi?id=165904

Reviewed by Sam Weinig.

LayoutTests/imported/w3c:

Rebaseline W3C test now that one more check is passing.

* web-platform-tests/dom/events/Event-subclasses-constructors-expected.txt:

Source/WebCore:

Move 'charCode' / 'keyCode' attributes from UIEvent to KeyboardEvent and add
'which' to KeyboardEvent to match the specification:
- https://w3c.github.io/uievents/#legacy-interface-KeyboardEvent

We keep a 'which' attribute on UIEvent even though the specification does
not say we should because Firefox and Chrome have 'which' on UIEvent still.

Specification:
- 'charCode' / 'keyCode' / 'which' on KeyboardEvent only

Firefox:
- 'charCode' / 'keyCode' on KeyboardEvent only
- 'which' on UIEvent only

Chrome:
- 'charCode' / 'keyCode' / 'which' on KeyboardEvent
- 'which' on UIEvent as well

Old WebKit behavior:
- 'charCode' / 'keyCode' / 'which' on UIEvent only

New WebKit behavior:
- 'charCode' / 'keyCode' / 'which' on KeyboardEvent
- 'which' on UIEvent as well

Our new behavior is identical to Chrome, much closer to the specification,
and closer to Firefox as well.

No new tests, updated / rebaselined existing tests.

* dom/KeyboardEvent.cpp:
(WebCore::KeyboardEvent::KeyboardEvent):
(WebCore::KeyboardEvent::keyCode):
(WebCore::KeyboardEvent::charCode):
(WebCore::KeyboardEvent::which):
* dom/KeyboardEvent.h:
* dom/KeyboardEvent.idl:
* dom/MouseEvent.cpp:
(WebCore::MouseEvent::which):
* dom/UIEvent.cpp:
* dom/UIEvent.h:
* dom/UIEvent.idl:

Source/WebKit/mac:

Update ObjC bindings so they keep building.

* DOM/DOMUIEvent.mm:
(-[DOMUIEvent keyCode]):
(-[DOMUIEvent charCode]):

LayoutTests:

Extend existing testing.

* fast/events/arrow-keys-on-body-expected.txt:
* fast/events/arrow-keys-on-body.html:
* fast/events/key-events-in-input-button-expected.txt:
* fast/events/key-events-in-input-button.html:
* fast/events/key-events-in-input-text-expected.txt:
* fast/events/key-events-in-input-text.html:

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

22 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/events/arrow-keys-on-body-expected.txt
LayoutTests/fast/events/arrow-keys-on-body.html
LayoutTests/fast/events/init-events-expected.txt
LayoutTests/fast/events/key-events-in-input-button-expected.txt
LayoutTests/fast/events/key-events-in-input-button.html
LayoutTests/fast/events/key-events-in-input-text-expected.txt
LayoutTests/fast/events/key-events-in-input-text.html
LayoutTests/fast/events/script-tests/init-events.js
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/dom/events/Event-subclasses-constructors-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/dom/KeyboardEvent.cpp
Source/WebCore/dom/KeyboardEvent.h
Source/WebCore/dom/KeyboardEvent.idl
Source/WebCore/dom/MouseEvent.cpp
Source/WebCore/dom/UIEvent.cpp
Source/WebCore/dom/UIEvent.h
Source/WebCore/dom/UIEvent.idl
Source/WebKit/mac/ChangeLog
Source/WebKit/mac/DOM/DOMUIEvent.mm
Source/WebKit2/WebProcess/InjectedBundle/API/gtk/DOM/WebKitDOMUIEvent.cpp

index c3daf7f..56fffb1 100644 (file)
@@ -1,3 +1,19 @@
+2016-12-15  Chris Dumez  <cdumez@apple.com>
+
+        Move charCode / keyCode / which attributes from UIEvent to KeyboardEvent
+        https://bugs.webkit.org/show_bug.cgi?id=165904
+
+        Reviewed by Sam Weinig.
+
+        Extend existing testing.
+
+        * fast/events/arrow-keys-on-body-expected.txt:
+        * fast/events/arrow-keys-on-body.html:
+        * fast/events/key-events-in-input-button-expected.txt:
+        * fast/events/key-events-in-input-button.html:
+        * fast/events/key-events-in-input-text-expected.txt:
+        * fast/events/key-events-in-input-text.html:
+
 2016-12-15  Megan Gardner  <megan_gardner@apple.com>
 
         Add coordinate space to event streams and streamline tests
index 5d5db1d..3183692 100644 (file)
@@ -2,7 +2,7 @@ Test that arrow keys do not dispatch keypress events even if there is no default
 
 To test manually, press arrow keys and verify that no keypress events are logged.
 
-target - type - ctrlKey,altKey,shiftKey,metaKey - key - code - keyIdentifier - location - keyCode - charCode
-BODY - keydown - false,false,false,false - ArrowLeft - ArrowLeft - Left - DOM_KEY_LOCATION_STANDARD - 37 - 0
-BODY - keyup - false,false,false,false - ArrowLeft - ArrowLeft - Left - DOM_KEY_LOCATION_STANDARD - 37 - 0
+target - type - ctrlKey,altKey,shiftKey,metaKey - key - code - keyIdentifier - location - keyCode - charCode - keyCode - which
+BODY - keydown - false,false,false,false - ArrowLeft - ArrowLeft - Left - DOM_KEY_LOCATION_STANDARD - 37 - 0 - 37 - 37
+BODY - keyup - false,false,false,false - ArrowLeft - ArrowLeft - Left - DOM_KEY_LOCATION_STANDARD - 37 - 0 - 37 - 37
 
index efd42b7..a0d6faf 100644 (file)
@@ -45,7 +45,9 @@ function eventInfo(event, where) {
             + ' - ' + event.keyIdentifier
             + ' - ' + (event.location === undefined ? "undefined" : locationName(event.location))
             + ' - ' + event.keyCode
-            + ' - ' + event.charCode;
+            + ' - ' + event.charCode
+            + ' - ' + event.keyCode
+            + ' - ' + event.which;
 
     } catch (ex) {
         alert(ex);
@@ -57,7 +59,9 @@ log("target - type - " + ["ctrlKey", "altKey", "shiftKey", "metaKey"]
         + ' - ' + "keyIdentifier"
         + ' - ' + "location"
         + ' - ' + "keyCode"
-        + ' - ' + "charCode");
+        + ' - ' + "charCode"
+        + ' - ' + "keyCode"
+        + ' - ' + "which");
 
 if (window.testRunner) {
     testRunner.dumpAsText();
index 8734f63..68e1c97 100644 (file)
@@ -86,8 +86,8 @@ PASS testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004,
 PASS testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, document').fromElement is document
 PASS testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').toElement is null
 PASS testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').dataTransfer is null
-PASS testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').keyCode is 0
-PASS testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').charCode is 0
+PASS 'keyCode' in testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null') is false
+PASS 'charCode' in testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null') is false
 PASS testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').layerX is 1004
 PASS testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').layerY is 1005
 PASS testInitEvent('Mouse', '"a", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').pageX is 1004
@@ -133,8 +133,8 @@ PASS testInitEvent('Text', '"a", false, false, null, "b"').view is null
 PASS testInitEvent('Text', '"a", false, false, window, "b"').data is 'b'
 PASS testInitEvent('Text', '"a", false, false, window, null').data is 'null'
 PASS testInitEvent('Text', '"a", false, false, window, "b"').detail is 0
-PASS testInitEvent('Text', '"a", false, false, window, "b"').keyCode is 0
-PASS testInitEvent('Text', '"a", false, false, window, "b"').charCode is 0
+PASS 'keyCode' in testInitEvent('Text', '"a", false, false, window, "b"') is false
+PASS 'charCode' in testInitEvent('Text', '"a", false, false, window, "b"') is false
 PASS testInitEvent('Text', '"a", false, false, window, "b"').layerX is 0
 PASS testInitEvent('Text', '"a", false, false, window, "b"').layerY is 0
 PASS testInitEvent('Text', '"a", false, false, window, "b"').pageX is 0
@@ -149,8 +149,8 @@ PASS testInitEvent('UI', '"a", false, true, window, 1001').cancelable is true
 PASS testInitEvent('UI', '"a", false, false, window, 1001').view is window
 PASS testInitEvent('UI', '"a", false, false, null, 1001').view is null
 PASS testInitEvent('UI', '"a", false, false, window, 1001').detail is 1001
-PASS testInitEvent('UI', '"a", false, false, window, 1001').keyCode is 0
-PASS testInitEvent('UI', '"a", false, false, window, 1001').charCode is 0
+PASS 'keyCode' in testInitEvent('UI', '"a", false, false, window, 1001') is false
+PASS 'charCode' in testInitEvent('UI', '"a", false, false, window, 1001') is false
 PASS testInitEvent('UI', '"a", false, false, window, 1001').layerX is 0
 PASS testInitEvent('UI', '"a", false, false, window, 1001').layerY is 0
 PASS testInitEvent('UI', '"a", false, false, window, 1001').pageX is 0
index 3935998..ecc7142 100644 (file)
@@ -1,19 +1,19 @@
 To test manually, press keys and compare results to other browsers.
 
 
-target - type - ctrlKey,altKey,shiftKey,metaKey - key - code - keyIdentifier - keyCode - charCode
+target - type - ctrlKey,altKey,shiftKey,metaKey - key - code - keyIdentifier - keyCode - charCode - which
 Space:
-INPUT - keydown - false,false,false,false - - Space - U+0020 - 32 - 0
-INPUT - keypress - false,false,false,false - - Space - - 32 - 32
-INPUT - keyup - false,false,false,false - - Space - U+0020 - 32 - 0
+INPUT - keydown - false,false,false,false - - Space - U+0020 - 32 - 0 - 32
+INPUT - keypress - false,false,false,false - - Space - - 32 - 32 - 32
+INPUT - keyup - false,false,false,false - - Space - U+0020 - 32 - 0 - 32
 INPUT - click
 Enter:
-INPUT - keydown - false,false,false,false - Enter - Enter - Enter - 13 - 0
-INPUT - keypress - false,false,false,false - Enter - Enter - - 13 - 13
+INPUT - keydown - false,false,false,false - Enter - Enter - Enter - 13 - 0 - 13
+INPUT - keypress - false,false,false,false - Enter - Enter - - 13 - 13 - 13
 INPUT - click
-INPUT - keyup - false,false,false,false - Enter - Enter - Enter - 13 - 0
+INPUT - keyup - false,false,false,false - Enter - Enter - Enter - 13 - 0 - 13
 A:
-INPUT - keydown - false,false,true,false - A - KeyA - U+0041 - 65 - 0
-INPUT - keypress - false,false,true,false - A - KeyA - - 65 - 65
-INPUT - keyup - false,false,true,false - A - KeyA - U+0041 - 65 - 0
+INPUT - keydown - false,false,true,false - A - KeyA - U+0041 - 65 - 0 - 65
+INPUT - keypress - false,false,true,false - A - KeyA - - 65 - 65 - 65
+INPUT - keyup - false,false,true,false - A - KeyA - U+0041 - 65 - 0 - 65
 
index 4a1f319..f06fd13 100644 (file)
@@ -27,7 +27,8 @@ function eventInfo(event, where) {
             + ' - ' + event.code
             + ' - ' + event.keyIdentifier
             + ' - ' + event.keyCode
-            + ' - ' + event.charCode;
+            + ' - ' + event.charCode
+            + ' - ' + event.which;
     else if (event.type == "mousedown" || event.type == "click" || event.type == "mouseup")
         return (where ? "(" + where + ") " : "") + target.tagName + " - " + event.type;
 
@@ -40,7 +41,8 @@ log("target - type - " + ["ctrlKey", "altKey", "shiftKey", "metaKey"]
         + ' - ' + "code"
         + ' - ' + "keyIdentifier"
         + ' - ' + "keyCode"
-        + ' - ' + "charCode");
+        + ' - ' + "charCode"
+        + ' - ' + "which");
 
 if (document.getElementsByTagName("input")[0].addEventListener)
     document.getElementsByTagName("input")[0].addEventListener('textInput', function(e) {log(eventInfo(e));}, false);
index d891b6a..28d5767 100644 (file)
@@ -1,18 +1,18 @@
 To test manually, press keys and compare results to other browsers.
 
   
-target - type - ctrlKey,altKey,shiftKey,metaKey - key - code - keyIdentifier - keyCode - charCode
+target - type - ctrlKey,altKey,shiftKey,metaKey - key - code - keyIdentifier - keyCode - charCode - which
 Space:
-INPUT - keydown - false,false,false,false - - Space - U+0020 - 32 - 0. Value: "".
-INPUT - keypress - false,false,false,false - - Space - - 32 - 32. Value: "".
+INPUT - keydown - false,false,false,false - - Space - U+0020 - 32 - 0 - 32. Value: "".
+INPUT - keypress - false,false,false,false - - Space - - 32 - 32 - 32. Value: "".
 INPUT - textInput - . Value: "".
-INPUT - keyup - false,false,false,false - - Space - U+0020 - 32 - 0. Value: " ".
+INPUT - keyup - false,false,false,false - - Space - U+0020 - 32 - 0 - 32. Value: " ".
 Backspace:
-INPUT - keydown - false,false,false,false - Backspace - Backspace - U+0008 - 8 - 0. Value: " ".
-INPUT - keyup - false,false,false,false - Backspace - Backspace - U+0008 - 8 - 0. Value: "".
+INPUT - keydown - false,false,false,false - Backspace - Backspace - U+0008 - 8 - 0 - 8. Value: " ".
+INPUT - keyup - false,false,false,false - Backspace - Backspace - U+0008 - 8 - 0 - 8. Value: "".
 Left Arrow:
-INPUT - keydown - false,false,false,false - ArrowLeft - ArrowLeft - Left - 37 - 0. Value: "".
-INPUT - keyup - false,false,false,false - ArrowLeft - ArrowLeft - Left - 37 - 0. Value: "".
+INPUT - keydown - false,false,false,false - ArrowLeft - ArrowLeft - Left - 37 - 0 - 37. Value: "".
+INPUT - keyup - false,false,false,false - ArrowLeft - ArrowLeft - Left - 37 - 0 - 37. Value: "".
 Tab:
-INPUT - keydown - false,false,false,false - Tab - Tab - U+0009 - 9 - 0. Value: "".
+INPUT - keydown - false,false,false,false - Tab - Tab - U+0009 - 9 - 0 - 9. Value: "".
 
index 022563f..7283543 100644 (file)
@@ -30,6 +30,7 @@ function eventInfo(event, where) {
             + ' - ' + event.keyIdentifier
             + ' - ' + event.keyCode
             + ' - ' + event.charCode
+            + ' - ' + event.which
             + '. Value: "' + target.value + '".';
     else if (event.type == "mousedown" || event.type == "click" || event.type == "mouseup")
         return (where ? "(" + where + ") " : "") + target.tagName + " - " + event.type
@@ -44,7 +45,8 @@ log("target - type - " + ["ctrlKey", "altKey", "shiftKey", "metaKey"]
         + ' - ' + "code"
         + ' - ' + "keyIdentifier"
         + ' - ' + "keyCode"
-        + ' - ' + "charCode");
+        + ' - ' + "charCode"
+        + ' - ' + "which");
 
 if (document.getElementsByTagName("input")[0].addEventListener)
     document.getElementsByTagName("input")[0].addEventListener('textInput', function(e) {log(eventInfo(e));}, false);
index 5aa6c33..b2aceab 100644 (file)
@@ -106,8 +106,8 @@ shouldBe("testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003,
 shouldBe("testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, document').fromElement", "document");
 shouldBe("testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').toElement", "null");
 shouldBe("testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').dataTransfer", "null");
-shouldBe("testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').keyCode", "0");
-shouldBe("testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').charCode", "0");
+shouldBeFalse("'keyCode' in testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null')");
+shouldBeFalse("'charCode' in testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null')");
 shouldBe("testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').layerX", "1004");
 shouldBe("testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').layerY", "1005");
 shouldBe("testInitEvent('Mouse', '\"a\", false, false, window, 1001, 1002, 1003, 1004, 1005, false, false, false, false, 1006, null').pageX", "1004");
@@ -156,8 +156,8 @@ shouldBe("testInitEvent('Text', '\"a\", false, false, null, \"b\"').view", "null
 shouldBe("testInitEvent('Text', '\"a\", false, false, window, \"b\"').data", "'b'");
 shouldBe("testInitEvent('Text', '\"a\", false, false, window, null').data", "'null'");
 shouldBe("testInitEvent('Text', '\"a\", false, false, window, \"b\"').detail", "0");
-shouldBe("testInitEvent('Text', '\"a\", false, false, window, \"b\"').keyCode", "0");
-shouldBe("testInitEvent('Text', '\"a\", false, false, window, \"b\"').charCode", "0");
+shouldBeFalse("'keyCode' in testInitEvent('Text', '\"a\", false, false, window, \"b\"')");
+shouldBeFalse("'charCode' in testInitEvent('Text', '\"a\", false, false, window, \"b\"')");
 shouldBe("testInitEvent('Text', '\"a\", false, false, window, \"b\"').layerX", "0");
 shouldBe("testInitEvent('Text', '\"a\", false, false, window, \"b\"').layerY", "0");
 shouldBe("testInitEvent('Text', '\"a\", false, false, window, \"b\"').pageX", "0");
@@ -173,8 +173,8 @@ shouldBe("testInitEvent('UI', '\"a\", false, true, window, 1001').cancelable", "
 shouldBe("testInitEvent('UI', '\"a\", false, false, window, 1001').view", "window");
 shouldBe("testInitEvent('UI', '\"a\", false, false, null, 1001').view", "null");
 shouldBe("testInitEvent('UI', '\"a\", false, false, window, 1001').detail", "1001");
-shouldBe("testInitEvent('UI', '\"a\", false, false, window, 1001').keyCode", "0");
-shouldBe("testInitEvent('UI', '\"a\", false, false, window, 1001').charCode", "0");
+shouldBeFalse("'keyCode' in testInitEvent('UI', '\"a\", false, false, window, 1001')");
+shouldBeFalse("'charCode' in testInitEvent('UI', '\"a\", false, false, window, 1001')");
 shouldBe("testInitEvent('UI', '\"a\", false, false, window, 1001').layerX", "0");
 shouldBe("testInitEvent('UI', '\"a\", false, false, window, 1001').layerY", "0");
 shouldBe("testInitEvent('UI', '\"a\", false, false, window, 1001').pageX", "0");
index cafe718..87a6878 100644 (file)
@@ -1,3 +1,14 @@
+2016-12-15  Chris Dumez  <cdumez@apple.com>
+
+        Move charCode / keyCode / which attributes from UIEvent to KeyboardEvent
+        https://bugs.webkit.org/show_bug.cgi?id=165904
+
+        Reviewed by Sam Weinig.
+
+        Rebaseline W3C test now that one more check is passing.
+
+        * web-platform-tests/dom/events/Event-subclasses-constructors-expected.txt:
+
 2016-12-15  Youenn Fablet  <youenn@apple.com>
 
         Sync web-platform-tests up to revision a4c2b37
index 06a4394..d5814ac 100644 (file)
@@ -34,7 +34,7 @@ PASS KeyboardEvent constructor (undefined argument)
 PASS KeyboardEvent constructor (null argument) 
 PASS KeyboardEvent constructor (empty argument) 
 PASS KeyboardEvent constructor (argument with default values) 
-FAIL KeyboardEvent constructor (argument with non-default values) assert_equals: The value of the charCode property should be 7 expected 7 but got 0
+PASS KeyboardEvent constructor (argument with non-default values) 
 PASS CompositionEvent constructor (no argument) 
 PASS CompositionEvent constructor (undefined argument) 
 PASS CompositionEvent constructor (null argument) 
index 28561bf..c9c14e8 100644 (file)
@@ -1,3 +1,53 @@
+2016-12-15  Chris Dumez  <cdumez@apple.com>
+
+        Move charCode / keyCode / which attributes from UIEvent to KeyboardEvent
+        https://bugs.webkit.org/show_bug.cgi?id=165904
+
+        Reviewed by Sam Weinig.
+
+        Move 'charCode' / 'keyCode' attributes from UIEvent to KeyboardEvent and add
+        'which' to KeyboardEvent to match the specification:
+        - https://w3c.github.io/uievents/#legacy-interface-KeyboardEvent
+
+        We keep a 'which' attribute on UIEvent even though the specification does
+        not say we should because Firefox and Chrome have 'which' on UIEvent still.
+
+        Specification:
+        - 'charCode' / 'keyCode' / 'which' on KeyboardEvent only
+
+        Firefox:
+        - 'charCode' / 'keyCode' on KeyboardEvent only
+        - 'which' on UIEvent only
+
+        Chrome:
+        - 'charCode' / 'keyCode' / 'which' on KeyboardEvent
+        - 'which' on UIEvent as well
+
+        Old WebKit behavior:
+        - 'charCode' / 'keyCode' / 'which' on UIEvent only
+
+        New WebKit behavior:
+        - 'charCode' / 'keyCode' / 'which' on KeyboardEvent
+        - 'which' on UIEvent as well
+
+        Our new behavior is identical to Chrome, much closer to the specification,
+        and closer to Firefox as well.
+
+        No new tests, updated / rebaselined existing tests.
+
+        * dom/KeyboardEvent.cpp:
+        (WebCore::KeyboardEvent::KeyboardEvent):
+        (WebCore::KeyboardEvent::keyCode):
+        (WebCore::KeyboardEvent::charCode):
+        (WebCore::KeyboardEvent::which):
+        * dom/KeyboardEvent.h:
+        * dom/KeyboardEvent.idl:
+        * dom/MouseEvent.cpp:
+        (WebCore::MouseEvent::which):
+        * dom/UIEvent.cpp:
+        * dom/UIEvent.h:
+        * dom/UIEvent.idl:
+
 2016-12-15  Brady Eidson  <beidson@apple.com>
 
         IndexedDB: Add an "IDBCursorRecord" struct.
index 422394b..2bd931f 100644 (file)
@@ -137,6 +137,9 @@ KeyboardEvent::KeyboardEvent(const AtomicString& eventType, const Init& initiali
     , m_location(initializer.keyLocation ? *initializer.keyLocation : initializer.location)
     , m_repeat(initializer.repeat)
     , m_isComposing(initializer.isComposing)
+    , m_charCode(initializer.charCode)
+    , m_keyCode(initializer.keyCode)
+    , m_which(initializer.which)
 #if PLATFORM(COCOA)
     , m_handledByInputMethod(false)
 #endif
@@ -185,6 +188,9 @@ bool KeyboardEvent::getModifierState(const String& keyIdentifier) const
 
 int KeyboardEvent::keyCode() const
 {
+    if (m_keyCode)
+        return m_keyCode.value();
+
     // IE: virtual key code for keyup/keydown, character code for keypress
     // Firefox: virtual key code for keyup/keydown, zero for keypress
     // We match IE.
@@ -198,6 +204,9 @@ int KeyboardEvent::keyCode() const
 
 int KeyboardEvent::charCode() const
 {
+    if (m_charCode)
+        return m_charCode.value();
+
     // IE: not supported
     // Firefox: 0 for keydown/keyup events, character code for keypress
     // We match Firefox, unless in backward compatibility mode, where we always return the character code.
@@ -225,6 +234,8 @@ int KeyboardEvent::which() const
 {
     // Netscape's "which" returns a virtual key code for keydown and keyup, and a character code for keypress.
     // That's exactly what IE's "keyCode" returns. So they are the same for keyboard events.
+    if (m_which)
+        return m_which.value();
     return keyCode();
 }
 
index b6ddde3..d17b5f6 100644 (file)
@@ -63,6 +63,9 @@ public:
         // Legacy.
         String keyIdentifier;
         std::optional<unsigned> keyLocation;
+        unsigned charCode;
+        unsigned keyCode;
+        unsigned which;
     };
 
     static Ref<KeyboardEvent> create(const AtomicString& type, const Init& initializer, IsTrusted isTrusted = IsTrusted::No)
@@ -98,8 +101,8 @@ public:
     
     const PlatformKeyboardEvent* keyEvent() const { return m_keyEvent.get(); }
 
-    WEBCORE_EXPORT int keyCode() const final; // key code for keydown and keyup, character for keypress
-    WEBCORE_EXPORT int charCode() const final; // character code for keypress, 0 for keydown and keyup
+    WEBCORE_EXPORT int keyCode() const; // key code for keydown and keyup, character for keypress
+    WEBCORE_EXPORT int charCode() const; // character code for keypress, 0 for keydown and keyup
 
     EventInterface eventInterface() const final;
     bool isKeyboardEvent() const final;
@@ -134,6 +137,9 @@ private:
     unsigned m_location { DOM_KEY_LOCATION_STANDARD };
     bool m_repeat { false };
     bool m_isComposing { false };
+    std::optional<unsigned> m_charCode;
+    std::optional<unsigned> m_keyCode;
+    std::optional<unsigned> m_which;
 
 #if PLATFORM(COCOA)
     // Commands that were sent by AppKit when interpreting the event. Doesn't include input method commands.
index 5101b0c..757c077 100644 (file)
@@ -45,6 +45,9 @@
     readonly attribute DOMString keyIdentifier;
     [ImplementedAs=location] readonly attribute unsigned long keyLocation;
     readonly attribute boolean altGraphKey;
+    readonly attribute unsigned long charCode;
+    readonly attribute unsigned long keyCode;
+    readonly attribute unsigned long which;
 
     // FIXME: this does not match the version in the DOM spec.
     // FIXME: Using "undefined" as default parameter value is wrong.
@@ -64,4 +67,7 @@ dictionary KeyboardEventInit : EventModifierInit {
     // attributes we still support on KeyboardEvent for backward compatibility.
     DOMString keyIdentifier = "";
     unsigned long keyLocation;
+    unsigned long charCode = 0;
+    unsigned long keyCode = 0;
+    unsigned long which = 0;
 };
index 94c4c61..a4f3227 100644 (file)
@@ -195,7 +195,7 @@ bool MouseEvent::canTriggerActivationBehavior(const Event& event)
 int MouseEvent::which() const
 {
     // For the DOM, the return values for left, middle and right mouse buttons are 0, 1, 2, respectively.
-    // For the Netscape "which" property, the return values for left, middle and right mouse buttons are 1, 2, 3, respectively. 
+    // For the Netscape "which" property, the return values for left, middle and right mouse buttons are 1, 2, 3, respectively.
     // So we must add 1.
     if (!m_buttonDown)
         return 0;
index 1c170f7..4cb2239 100644 (file)
@@ -78,16 +78,6 @@ EventInterface UIEvent::eventInterface() const
     return UIEventInterfaceType;
 }
 
-int UIEvent::keyCode() const
-{
-    return 0;
-}
-
-int UIEvent::charCode() const
-{
-    return 0;
-}
-
 int UIEvent::layerX()
 {
     return 0;
index 92b9c35..973d73e 100644 (file)
@@ -55,9 +55,6 @@ public:
 
     EventInterface eventInterface() const override;
 
-    virtual int keyCode() const;
-    virtual int charCode() const;
-
     virtual int layerX();
     virtual int layerY();
 
index c451df4..87b3915 100644 (file)
     // FIXME: Using "undefined" as default parameter value is wrong.
     void initUIEvent(optional DOMString type = "undefined", optional boolean canBubble = false, optional boolean cancelable = false, optional DOMWindow? view = null, optional long detail = 0);
 
-    readonly attribute long keyCode;
-    readonly attribute long charCode;
     readonly attribute long layerX;
     readonly attribute long layerY;
     readonly attribute long pageX;
     readonly attribute long pageY;
+
+    // FIXME: This should be on KeyboardEvent only as per the specification but Firefox and Chrome
+    // still have this attribute on UIEvent as of December 2016.
     readonly attribute long which;
 };
index 1ec7719..27ebb22 100644 (file)
@@ -1,3 +1,16 @@
+2016-12-15  Chris Dumez  <cdumez@apple.com>
+
+        Move charCode / keyCode / which attributes from UIEvent to KeyboardEvent
+        https://bugs.webkit.org/show_bug.cgi?id=165904
+
+        Reviewed by Sam Weinig.
+
+        Update ObjC bindings so they keep building.
+
+        * DOM/DOMUIEvent.mm:
+        (-[DOMUIEvent keyCode]):
+        (-[DOMUIEvent charCode]):
+
 2016-12-15  Andreas Kling  <akling@apple.com>
 
         Always clear RenderLayer backing stores when going into page cache.
index 318193a..a464dac 100644 (file)
 #import "DOMAbstractViewInternal.h"
 #import "DOMEventInternal.h"
 #import "DOMNodeInternal.h"
-#import <WebCore/DOMWindow.h>
 #import "ExceptionHandlers.h"
+#import <WebCore/DOMWindow.h>
 #import <WebCore/JSMainThreadExecState.h>
+#import <WebCore/KeyboardEvent.h>
 #import <WebCore/ThreadCheck.h>
 #import <WebCore/UIEvent.h>
 #import <WebCore/URL.h>
 - (int)keyCode
 {
     WebCore::JSMainThreadNullState state;
-    return IMPL->keyCode();
+    if (is<WebCore::KeyboardEvent>(*IMPL))
+        return downcast<WebCore::KeyboardEvent>(*IMPL).keyCode();
+    return 0;
 }
 
 - (int)charCode
 {
     WebCore::JSMainThreadNullState state;
-    return IMPL->charCode();
+    if (is<WebCore::KeyboardEvent>(*IMPL))
+        return downcast<WebCore::KeyboardEvent>(*IMPL).charCode();
+    return 0;
 }
 
 - (int)layerX
index 01040ab..bf32a87 100644 (file)
@@ -26,6 +26,7 @@
 #include <WebCore/ExceptionCode.h>
 #include <WebCore/ExceptionCodeDescription.h>
 #include <WebCore/JSMainThreadExecState.h>
+#include <WebCore/KeyboardEvent.h>
 #include "WebKitDOMDOMWindowPrivate.h"
 #include "WebKitDOMEventPrivate.h"
 #include "WebKitDOMPrivate.h"
@@ -229,7 +230,7 @@ glong webkit_dom_ui_event_get_key_code(WebKitDOMUIEvent* self)
     WebCore::JSMainThreadNullState state;
     g_return_val_if_fail(WEBKIT_DOM_IS_UI_EVENT(self), 0);
     WebCore::UIEvent* item = WebKit::core(self);
-    glong result = item->keyCode();
+    glong result = is<WebCore::KeyboardEvent>(*item) ? downcast<WebCore::KeyboardEvent>(*item).keyCode() : 0;
     return result;
 }
 
@@ -238,7 +239,7 @@ glong webkit_dom_ui_event_get_char_code(WebKitDOMUIEvent* self)
     WebCore::JSMainThreadNullState state;
     g_return_val_if_fail(WEBKIT_DOM_IS_UI_EVENT(self), 0);
     WebCore::UIEvent* item = WebKit::core(self);
-    glong result = item->charCode();
+    glong result = is<WebCore::KeyboardEvent>(*item) ? downcast<WebCore::KeyboardEvent>(*item).charCode() : 0;
     return result;
 }