Standard gamepad mapping for GameControllerGamepads
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Feb 2020 22:38:22 +0000 (22:38 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Feb 2020 22:38:22 +0000 (22:38 +0000)
https://bugs.webkit.org/show_bug.cgi?id=206033

Patch by James Howard <jameshoward@mac.com> on 2020-02-10
Reviewed by Dean Jackson.
Source/WebCore:

Extend PlatformGamepad to add a field for the gamepad mapping.
The mapping defines the order and interpretation of the axes and
buttons vectors, and is passed along to users of the Gamepad
API[1].

Letting PlatformGamepad subclassers define their mapping is the
natural place for this functionality. The PlatformGamepad
already defines the order of the axes and buttons and
PlatformGamepad subclassers may know something about the
physical layout of the gamepad they represent.

This change modifies the GameControllerGamepad subclass of
PlatformGamepad to set the mapping to "standard" when a
GCExtendedGamepad is detected, and to bind the axes and buttons
appropriately. Previously, the buttons and axes were bound
arbitrarily, and in some cases incompletely. While that wasn't a
bug per se, because with the mapping set to the empty string an
implementation is free to provide any interpretation of the
gamepad elements it likes, it was certainly less useful than the
"standard" mapping.

[1] https://www.w3.org/TR/gamepad/#remapping

* Modules/gamepad/Gamepad.cpp:
(WebCore::Gamepad::Gamepad):
* platform/gamepad/PlatformGamepad.h:
(WebCore::PlatformGamepad::mapping const):
* platform/gamepad/cocoa/GameControllerGamepad.mm:
(WebCore::GameControllerGamepad::setupAsExtendedGamepad):
* testing/MockGamepad.cpp:
(WebCore::MockGamepad::MockGamepad):
(WebCore::MockGamepad::updateDetails):
* testing/MockGamepad.h:
* testing/MockGamepadProvider.cpp:
(WebCore::MockGamepadProvider::setMockGamepadDetails):
* testing/MockGamepadProvider.h:
* testing/js/WebCoreTestSupport.cpp:
(WebCoreTestSupport::setMockGamepadDetails):
* testing/js/WebCoreTestSupport.h:

Source/WebKit:

Make the mapping as provided by PlatformGamepad
available in UIGamepad, and pass it along to
GamepadData so it can be correctly reflected
in the Gamepad API.

* Shared/Gamepad/GamepadData.cpp:
(WebKit::GamepadData::GamepadData):
(WebKit::GamepadData::encode const):
(WebKit::GamepadData::decode):
* Shared/Gamepad/GamepadData.h:
(WebKit::GamepadData::mapping const):
* UIProcess/Gamepad/UIGamepad.cpp:
(WebKit::UIGamepad::UIGamepad):
(WebKit::UIGamepad::fullGamepadData const):
* UIProcess/Gamepad/UIGamepad.h:
* WebProcess/Gamepad/WebGamepad.cpp:
(WebKit::WebGamepad::WebGamepad):

Tools:

* WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
* WebKitTestRunner/InjectedBundle/TestRunner.cpp:
(WTR::TestRunner::setMockGamepadDetails):
* WebKitTestRunner/InjectedBundle/TestRunner.h:
* WebKitTestRunner/TestInvocation.cpp:
(WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):

LayoutTests:

* gamepad/gamepad-polling-access-expected.txt:
* gamepad/gamepad-polling-access.html:
* gamepad/gamepad-timestamp.html:
* gamepad/gamepad-visibility-1.html:

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

27 files changed:
LayoutTests/ChangeLog
LayoutTests/gamepad/gamepad-polling-access-expected.txt
LayoutTests/gamepad/gamepad-polling-access.html
LayoutTests/gamepad/gamepad-timestamp.html
LayoutTests/gamepad/gamepad-visibility-1.html
Source/WTF/wtf/PlatformHave.h
Source/WebCore/ChangeLog
Source/WebCore/Modules/gamepad/Gamepad.cpp
Source/WebCore/platform/gamepad/PlatformGamepad.h
Source/WebCore/platform/gamepad/cocoa/GameControllerGamepad.mm
Source/WebCore/testing/MockGamepad.cpp
Source/WebCore/testing/MockGamepad.h
Source/WebCore/testing/MockGamepadProvider.cpp
Source/WebCore/testing/MockGamepadProvider.h
Source/WebCore/testing/js/WebCoreTestSupport.cpp
Source/WebCore/testing/js/WebCoreTestSupport.h
Source/WebKit/ChangeLog
Source/WebKit/Shared/Gamepad/GamepadData.cpp
Source/WebKit/Shared/Gamepad/GamepadData.h
Source/WebKit/UIProcess/Gamepad/UIGamepad.cpp
Source/WebKit/UIProcess/Gamepad/UIGamepad.h
Source/WebKit/WebProcess/Gamepad/WebGamepad.cpp
Tools/ChangeLog
Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp
Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
Tools/WebKitTestRunner/TestInvocation.cpp

index de1961d..9ef6aa4 100644 (file)
@@ -1,3 +1,15 @@
+2020-02-10  James Howard  <jameshoward@mac.com>
+
+        Standard gamepad mapping for GameControllerGamepads
+        https://bugs.webkit.org/show_bug.cgi?id=206033
+
+        Reviewed by Dean Jackson.
+
+        * gamepad/gamepad-polling-access-expected.txt:
+        * gamepad/gamepad-polling-access.html:
+        * gamepad/gamepad-timestamp.html:
+        * gamepad/gamepad-visibility-1.html:
+
 2020-02-10  Jason Lawrence  <lawrence.j@apple.com>
 
         [ Mac Debug wk2 ] imported/w3c/web-platform-tests/fetch/api/request/destination/fetch-destination-worker.https.html is flaky crashing.
index 52b6bb5..9c28f8d 100644 (file)
@@ -4,202 +4,242 @@ Connecting gamepad:
 [object Gamepad]
 Name: 0
 Index: 0
+Mapping: 
 Axes: 
 Buttons: 
 Connecting gamepad:
 [object Gamepad],[object Gamepad]
 Name: 1
 Index: 1
+Mapping: 
 Axes: 0
 Buttons: false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad]
 Name: 2
 Index: 2
+Mapping: 
 Axes: 0,0
 Buttons: false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 3
 Index: 3
+Mapping: 
 Axes: 0,0,0
 Buttons: false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 4
 Index: 4
+Mapping: 
 Axes: 0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 5
 Index: 5
+Mapping: 
 Axes: 0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 6
 Index: 6
+Mapping: 
 Axes: 0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 7
 Index: 7
+Mapping: 
 Axes: 0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 8
 Index: 8
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 9
 Index: 9
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 10
 Index: 10
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 11
 Index: 11
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 12
 Index: 12
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 13
 Index: 13
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 14
 Index: 14
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 15
 Index: 15
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 16
 Index: 16
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 17
 Index: 17
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 18
 Index: 18
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Connecting gamepad:
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 19
 Index: 19
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Verifying there are 20 connected gamepads in the set of all gamepads
 [object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad],[object Gamepad]
 Name: 0
 Index: 0
+Mapping: 
 Axes: 
 Buttons: 
 Name: 1
 Index: 1
+Mapping: 
 Axes: 0
 Buttons: false-0 
 Name: 2
 Index: 2
+Mapping: 
 Axes: 0,0
 Buttons: false-0 false-0 
 Name: 3
 Index: 3
+Mapping: 
 Axes: 0,0,0
 Buttons: false-0 false-0 false-0 
 Name: 4
 Index: 4
+Mapping: 
 Axes: 0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 
 Name: 5
 Index: 5
+Mapping: 
 Axes: 0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 
 Name: 6
 Index: 6
+Mapping: 
 Axes: 0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 7
 Index: 7
+Mapping: 
 Axes: 0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 8
 Index: 8
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 9
 Index: 9
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 10
 Index: 10
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 11
 Index: 11
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 12
 Index: 12
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 13
 Index: 13
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 14
 Index: 14
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 15
 Index: 15
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0
 Name: 16
 Index: 16
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 17
 Index: 17
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 18
 Index: 18
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Name: 19
 Index: 19
+Mapping: 
 Axes: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 Buttons: false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 false-0 
 Disconnecting gamepads in reverse order, making sure gamepads array remains as expected
@@ -248,6 +288,7 @@ Connecting gamepad:
 ,,,,,,,,,,[object Gamepad],,,,,,,,,
 Name: Awesome Joystick 5000
 Index: 10
+Mapping: standard
 Axes: 0.7,-0.9,1,-1
-Buttons: true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 
+Buttons: true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 true-1 
 
index 646d219..8dcd2a5 100644 (file)
@@ -36,6 +36,7 @@ function logGamepad(gp)
 {
     log("Name: " + gp.id);
     log("Index: " + gp.index);
+    log("Mapping: " + gp.mapping);
     log("Axes: " + gp.axes);
     
     var buttonString = "";
@@ -53,7 +54,7 @@ function* testSteps() {
     log("Initial gamepads length: " + navigator.getGamepads().length);
     log("Connecting 20 different gamepads");
     for (var i = 0; i < 20; ++i) {
-        testRunner.setMockGamepadDetails(i, i, i, i);
+        testRunner.setMockGamepadDetails(i, i, "", i, i);
         testRunner.connectMockGamepad(i);
         yield;
     }
@@ -73,12 +74,12 @@ function* testSteps() {
 
     log("Checking non-zero'ed details for a gamepad");
 
-    testRunner.setMockGamepadDetails(10, "Awesome Joystick 5000", 4, 20);
+    testRunner.setMockGamepadDetails(10, "Awesome Joystick 5000", "standard", 4, 16);
     testRunner.setMockGamepadAxisValue(10, 0, 0.7);
     testRunner.setMockGamepadAxisValue(10, 1, -0.9);
     testRunner.setMockGamepadAxisValue(10, 2, 1.0);
     testRunner.setMockGamepadAxisValue(10, 3, -1.0);
-    for (var i = 0; i < 20; ++i)
+    for (var i = 0; i < 16; ++i)
         testRunner.setMockGamepadButtonValue(10, i, 1.0);
         
     testRunner.connectMockGamepad(10);
index 49edcec..0b4c011 100644 (file)
@@ -72,13 +72,13 @@ function handleGamepadConnect()
 function runTest() {
     addEventListener("gamepadconnected", handleGamepadConnect);
 
-    testRunner.setMockGamepadDetails(0, "Test Joystick", 2, 2);
+    testRunner.setMockGamepadDetails(0, "Test Joystick", "", 2, 2);
     testRunner.setMockGamepadAxisValue(0, 0, 0.7);
     testRunner.setMockGamepadAxisValue(0, 1, -1.0);
     testRunner.setMockGamepadButtonValue(0, 0, 1.0);
     testRunner.setMockGamepadButtonValue(0, 1, 1.0);
     testRunner.connectMockGamepad(0);
-    testRunner.setMockGamepadDetails(1, "Test Joystick 2", 2, 2);
+    testRunner.setMockGamepadDetails(1, "Test Joystick 2", "", 2, 2);
     testRunner.setMockGamepadAxisValue(1, 0, 0.7);
     testRunner.setMockGamepadAxisValue(1, 1, -1.0);
     testRunner.setMockGamepadButtonValue(1, 0, 1.0);
index 8d54389..07963ef 100644 (file)
@@ -41,7 +41,7 @@ function runTest() {
 
     // Connecting the gamepad and changing axis values should *not* make it visible.
     // Only button presses should expose it.
-    testRunner.setMockGamepadDetails(0, "Test Joystick", 2, 2);
+    testRunner.setMockGamepadDetails(0, "Test Joystick", "", 2, 2);
     testRunner.connectMockGamepad(0);
     testRunner.setMockGamepadAxisValue(0, 0, 0.7);
     testRunner.setMockGamepadAxisValue(0, 1, -1.0);
index 9b7a8ac..d24b85e 100644 (file)
 #if PLATFORM(WATCHOS) || PLATFORM(APPLETV) || (PLATFORM(IOS_FAMILY) && !(defined __has_include && __has_include(<CoreFoundation/CFPriv.h>)))
 #define HAVE_NSPROGRESS_PUBLISHING_SPI 1
 #endif
+
+#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101500) || (PLATFORM(IOS_FAMILY) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 130000)
+#define HAVE_GCEXTENDEDGAMEPAD_BUTTONS_OPTIONS_MENU 1
+#endif
+
+#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101400) || (PLATFORM(IOS_FAMILY))
+#define HAVE_GCEXTENDEDGAMEPAD_BUTTONS_THUMBSTICK 1
+#endif
index b4c27c0..5a2c11b 100644 (file)
@@ -1,3 +1,50 @@
+2020-02-10  James Howard  <jameshoward@mac.com>
+
+        Standard gamepad mapping for GameControllerGamepads
+        https://bugs.webkit.org/show_bug.cgi?id=206033
+
+        Reviewed by Dean Jackson.
+
+        Extend PlatformGamepad to add a field for the gamepad mapping.
+        The mapping defines the order and interpretation of the axes and
+        buttons vectors, and is passed along to users of the Gamepad
+        API[1].
+
+        Letting PlatformGamepad subclassers define their mapping is the
+        natural place for this functionality. The PlatformGamepad
+        already defines the order of the axes and buttons and
+        PlatformGamepad subclassers may know something about the
+        physical layout of the gamepad they represent.
+
+        This change modifies the GameControllerGamepad subclass of
+        PlatformGamepad to set the mapping to "standard" when a
+        GCExtendedGamepad is detected, and to bind the axes and buttons
+        appropriately. Previously, the buttons and axes were bound
+        arbitrarily, and in some cases incompletely. While that wasn't a
+        bug per se, because with the mapping set to the empty string an
+        implementation is free to provide any interpretation of the
+        gamepad elements it likes, it was certainly less useful than the
+        "standard" mapping.
+
+        [1] https://www.w3.org/TR/gamepad/#remapping
+
+        * Modules/gamepad/Gamepad.cpp:
+        (WebCore::Gamepad::Gamepad):
+        * platform/gamepad/PlatformGamepad.h:
+        (WebCore::PlatformGamepad::mapping const):
+        * platform/gamepad/cocoa/GameControllerGamepad.mm:
+        (WebCore::GameControllerGamepad::setupAsExtendedGamepad):
+        * testing/MockGamepad.cpp:
+        (WebCore::MockGamepad::MockGamepad):
+        (WebCore::MockGamepad::updateDetails):
+        * testing/MockGamepad.h:
+        * testing/MockGamepadProvider.cpp:
+        (WebCore::MockGamepadProvider::setMockGamepadDetails):
+        * testing/MockGamepadProvider.h:
+        * testing/js/WebCoreTestSupport.cpp:
+        (WebCoreTestSupport::setMockGamepadDetails):
+        * testing/js/WebCoreTestSupport.h:
+
 2020-02-07  Ryosuke Niwa  <rniwa@webkit.org>
 
         Don't update selection when calling setSelectionRange on a disconnected input element
index 965195d..1c1adeb 100644 (file)
@@ -39,6 +39,7 @@ Gamepad::Gamepad(const PlatformGamepad& platformGamepad)
     , m_index(platformGamepad.index())
     , m_connected(true)
     , m_timestamp(platformGamepad.lastUpdateTime())
+    , m_mapping(platformGamepad.mapping())
     , m_axes(platformGamepad.axisValues().size(), 0.0)
 {
     unsigned buttonCount = platformGamepad.buttonValues().size();
index 60c4cb3..75cc9ef 100644 (file)
@@ -39,6 +39,7 @@ public:
     virtual ~PlatformGamepad() = default;
 
     const String& id() const { return m_id; }
+    const String& mapping() const { return m_mapping; }
     unsigned index() const { return m_index; }
     MonotonicTime lastUpdateTime() const { return m_lastUpdateTime; }
     MonotonicTime connectTime() const { return m_connectTime; }
@@ -52,6 +53,7 @@ protected:
     }
 
     String m_id;
+    String m_mapping;
     unsigned m_index;
     MonotonicTime m_lastUpdateTime;
     MonotonicTime m_connectTime;
index 394a170..c0df211 100644 (file)
@@ -58,6 +58,7 @@ void GameControllerGamepad::setupAsExtendedGamepad()
     ASSERT(m_extendedGamepad);
 
     m_id = makeString(String(m_gcController.get().vendorName), " Extended Gamepad"_s);
+    m_mapping = String("standard");
 
     m_extendedGamepad.get().valueChangedHandler = ^(GCExtendedGamepad *, GCControllerElement *) {
         m_lastUpdateTime = MonotonicTime::now();
@@ -65,82 +66,70 @@ void GameControllerGamepad::setupAsExtendedGamepad()
         m_hadButtonPresses = false;
     };
 
-    m_buttonValues.resize(8);
-    m_buttonValues[0] = m_extendedGamepad.get().buttonA.value;
-    m_buttonValues[1] = m_extendedGamepad.get().buttonB.value;
-    m_buttonValues[2] = m_extendedGamepad.get().buttonX.value;
-    m_buttonValues[3] = m_extendedGamepad.get().buttonY.value;
-    m_buttonValues[4] = m_extendedGamepad.get().leftShoulder.value;
-    m_buttonValues[5] = m_extendedGamepad.get().rightShoulder.value;
-    m_buttonValues[6] = m_extendedGamepad.get().leftTrigger.value;
-    m_buttonValues[7] = m_extendedGamepad.get().rightTrigger.value;
-
-    m_axisValues.resize(6);
+    m_buttonValues.resize(16);
+
+    auto bindButton = ^(GCControllerButtonInput *button, size_t idx) {
+        m_buttonValues[idx] = button.value;
+        button.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
+            m_buttonValues[idx] = value;
+            if (pressed)
+                m_hadButtonPresses = true;
+        };
+    };
+
+    // Button Pad
+    bindButton(m_extendedGamepad.get().buttonA, 0);
+    bindButton(m_extendedGamepad.get().buttonB, 1);
+    bindButton(m_extendedGamepad.get().buttonX, 2);
+    bindButton(m_extendedGamepad.get().buttonY, 3);
+
+    // Shoulders, Triggers
+    bindButton(m_extendedGamepad.get().leftShoulder, 4);
+    bindButton(m_extendedGamepad.get().rightShoulder, 5);
+    bindButton(m_extendedGamepad.get().leftTrigger, 6);
+    bindButton(m_extendedGamepad.get().rightTrigger, 7);
+
+    // D Pad
+    bindButton(m_extendedGamepad.get().dpad.up, 12);
+    bindButton(m_extendedGamepad.get().dpad.down, 13);
+    bindButton(m_extendedGamepad.get().dpad.left, 14);
+    bindButton(m_extendedGamepad.get().dpad.right, 15);
+
+    // Select, Start
+#if HAVE(GCEXTENDEDGAMEPAD_BUTTONS_OPTIONS_MENU)
+    bindButton(m_extendedGamepad.get().buttonOptions, 8);
+    bindButton(m_extendedGamepad.get().buttonMenu, 9);
+#endif
+
+    // L3, R3
+#if HAVE(GCEXTENDEDGAMEPAD_BUTTONS_THUMBSTICK)
+    // Thumbstick buttons are only in macOS 10.14.1 / iOS 12.1
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunguarded-availability"
+    if ([m_extendedGamepad.get() respondsToSelector:@selector(leftThumbstickButton)]) {
+        bindButton(m_extendedGamepad.get().leftThumbstickButton, 10);
+        bindButton(m_extendedGamepad.get().rightThumbstickButton, 11);
+    }
+#pragma clang diagnostic pop
+#endif
+
+    m_axisValues.resize(4);
     m_axisValues[0] = m_extendedGamepad.get().leftThumbstick.xAxis.value;
-    m_axisValues[1] = m_extendedGamepad.get().leftThumbstick.yAxis.value;
+    m_axisValues[1] = -m_extendedGamepad.get().leftThumbstick.yAxis.value;
     m_axisValues[2] = m_extendedGamepad.get().rightThumbstick.xAxis.value;
-    m_axisValues[3] = m_extendedGamepad.get().rightThumbstick.yAxis.value;
-    m_axisValues[4] = m_extendedGamepad.get().dpad.xAxis.value;
-    m_axisValues[5] = m_extendedGamepad.get().dpad.yAxis.value;
-
-    m_extendedGamepad.get().buttonA.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
-        m_buttonValues[0] = value;
-        if (pressed)
-            m_hadButtonPresses = true;
-    };
-    m_extendedGamepad.get().buttonB.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
-        m_buttonValues[1] = value;
-        if (pressed)
-            m_hadButtonPresses = true;
-    };
-    m_extendedGamepad.get().buttonX.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
-        m_buttonValues[2] = value;
-        if (pressed)
-            m_hadButtonPresses = true;
-    };
-    m_extendedGamepad.get().buttonY.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
-        m_buttonValues[3] = value;
-        if (pressed)
-            m_hadButtonPresses = true;
-    };
-    m_extendedGamepad.get().leftShoulder.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
-        m_buttonValues[4] = value;
-        if (pressed)
-            m_hadButtonPresses = true;
-    };
-    m_extendedGamepad.get().rightShoulder.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
-        m_buttonValues[5] = value;
-        if (pressed)
-            m_hadButtonPresses = true;
-    };
-    m_extendedGamepad.get().leftTrigger.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
-        m_buttonValues[6] = value;
-        if (pressed)
-            m_hadButtonPresses = true;
-    };
-    m_extendedGamepad.get().rightTrigger.valueChangedHandler = ^(GCControllerButtonInput *, float value, BOOL pressed) {
-        m_buttonValues[7] = value;
-        if (pressed)
-            m_hadButtonPresses = true;
-    };
+    m_axisValues[3] = -m_extendedGamepad.get().rightThumbstick.yAxis.value;
 
     m_extendedGamepad.get().leftThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
         m_axisValues[0] = value;
     };
     m_extendedGamepad.get().leftThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
-        m_axisValues[1] = value;
+        m_axisValues[1] = -value;
     };
     m_extendedGamepad.get().rightThumbstick.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
         m_axisValues[2] = value;
     };
     m_extendedGamepad.get().rightThumbstick.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
-        m_axisValues[3] = value;
-    };
-    m_extendedGamepad.get().dpad.xAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
-        m_axisValues[4] = value;
-    };
-    m_extendedGamepad.get().dpad.yAxis.valueChangedHandler = ^(GCControllerAxisInput *, float value) {
-        m_axisValues[5] = value;
+        m_axisValues[3] = -value;
     };
 }
 
index abbc6ed..55ff438 100644 (file)
 
 namespace WebCore {
 
-MockGamepad::MockGamepad(unsigned index, const String& gamepadID, unsigned axisCount, unsigned buttonCount)
+MockGamepad::MockGamepad(unsigned index, const String& gamepadID, const String& mapping, unsigned axisCount, unsigned buttonCount)
     : PlatformGamepad(index)
 {
     m_connectTime = m_lastUpdateTime = MonotonicTime::now();
-    updateDetails(gamepadID, axisCount, buttonCount);
+    updateDetails(gamepadID, mapping, axisCount, buttonCount);
 }
 
-void MockGamepad::updateDetails(const String& gamepadID, unsigned axisCount, unsigned buttonCount)
+void MockGamepad::updateDetails(const String& gamepadID, const String& mapping, unsigned axisCount, unsigned buttonCount)
 {
     m_id = gamepadID;
+    m_mapping = mapping;
     m_axisValues = Vector<double>(axisCount, 0.0);
     m_buttonValues = Vector<double>(buttonCount, 0.0);
     m_lastUpdateTime = MonotonicTime::now();
index 728f7d2..dda9104 100644 (file)
@@ -33,12 +33,12 @@ namespace WebCore {
 
 class MockGamepad : public PlatformGamepad {
 public:
-    MockGamepad(unsigned index, const String& gamepadID, unsigned axisCount, unsigned buttonCount);
+    MockGamepad(unsigned index, const String& gamepadID, const String& mapping, unsigned axisCount, unsigned buttonCount);
 
     const Vector<double>& axisValues() const final { return m_axisValues; }
     const Vector<double>& buttonValues() const final { return m_buttonValues; }
 
-    void updateDetails(const String& gamepadID, unsigned axisCount, unsigned buttonCount);
+    void updateDetails(const String& gamepadID, const String& mapping, unsigned axisCount, unsigned buttonCount);
     bool setAxisValue(unsigned index, double value);
     bool setButtonValue(unsigned index, double value);
 
index d40ded1..6150f52 100644 (file)
@@ -55,15 +55,15 @@ void MockGamepadProvider::stopMonitoringGamepads(GamepadProviderClient& client)
     m_clients.remove(&client);
 }
 
-void MockGamepadProvider::setMockGamepadDetails(unsigned index, const String& gamepadID, unsigned axisCount, unsigned buttonCount)
+void MockGamepadProvider::setMockGamepadDetails(unsigned index, const String& gamepadID, const String& mapping, unsigned axisCount, unsigned buttonCount)
 {
     if (index >= m_mockGamepadVector.size())
         m_mockGamepadVector.resize(index + 1);
 
     if (m_mockGamepadVector[index])
-        m_mockGamepadVector[index]->updateDetails(gamepadID, axisCount, buttonCount);
+        m_mockGamepadVector[index]->updateDetails(gamepadID, mapping, axisCount, buttonCount);
     else
-        m_mockGamepadVector[index] = makeUnique<MockGamepad>(index, gamepadID, axisCount, buttonCount);
+        m_mockGamepadVector[index] = makeUnique<MockGamepad>(index, gamepadID, mapping, axisCount, buttonCount);
 }
 
 bool MockGamepadProvider::connectMockGamepad(unsigned index)
index 40419b9..da776ed 100644 (file)
@@ -44,7 +44,7 @@ public:
     const Vector<PlatformGamepad*>& platformGamepads() final { return m_connectedGamepadVector; }
     bool isMockGamepadProvider() const final { return true; }
 
-    void setMockGamepadDetails(unsigned index, const String& gamepadID, unsigned axisCount, unsigned buttonCount);
+    void setMockGamepadDetails(unsigned index, const String& gamepadID, const String& mapping, unsigned axisCount, unsigned buttonCount);
     bool setMockGamepadAxisValue(unsigned index, unsigned axisIndex, double value);
     bool setMockGamepadButtonValue(unsigned index, unsigned buttonIndex, double value);
     bool connectMockGamepad(unsigned index);
index 466fa42..6061a96 100644 (file)
@@ -164,13 +164,14 @@ void disconnectMockGamepad(unsigned gamepadIndex)
 #endif
 }
 
-void setMockGamepadDetails(unsigned gamepadIndex, const WTF::String& gamepadID, unsigned axisCount, unsigned buttonCount)
+void setMockGamepadDetails(unsigned gamepadIndex, const WTF::String& gamepadID, const WTF::String& mapping, unsigned axisCount, unsigned buttonCount)
 {
 #if ENABLE(GAMEPAD)
-    MockGamepadProvider::singleton().setMockGamepadDetails(gamepadIndex, gamepadID, axisCount, buttonCount);
+    MockGamepadProvider::singleton().setMockGamepadDetails(gamepadIndex, gamepadID, mapping, axisCount, buttonCount);
 #else
     UNUSED_PARAM(gamepadIndex);
     UNUSED_PARAM(gamepadID);
+    UNUSED_PARAM(mapping);
     UNUSED_PARAM(axisCount);
     UNUSED_PARAM(buttonCount);
 #endif
index bb71f01..79aefef 100644 (file)
@@ -58,7 +58,7 @@ void setAllowsAnySSLCertificate(bool) TEST_SUPPORT_EXPORT;
 void installMockGamepadProvider() TEST_SUPPORT_EXPORT;
 void connectMockGamepad(unsigned index) TEST_SUPPORT_EXPORT;
 void disconnectMockGamepad(unsigned index) TEST_SUPPORT_EXPORT;
-void setMockGamepadDetails(unsigned index, const WTF::String& gamepadID, unsigned axisCount, unsigned buttonCount) TEST_SUPPORT_EXPORT;
+void setMockGamepadDetails(unsigned index, const WTF::String& gamepadID, const WTF::String& mapping, unsigned axisCount, unsigned buttonCount) TEST_SUPPORT_EXPORT;
 void setMockGamepadAxisValue(unsigned index, unsigned axisIndex, double value) TEST_SUPPORT_EXPORT;
 void setMockGamepadButtonValue(unsigned index, unsigned buttonIndex, double value) TEST_SUPPORT_EXPORT;
 
index a326622..ab95f9e 100644 (file)
@@ -1,3 +1,28 @@
+2020-02-10  James Howard  <jameshoward@mac.com>
+
+        Standard gamepad mapping for GameControllerGamepads
+        https://bugs.webkit.org/show_bug.cgi?id=206033
+
+        Reviewed by Dean Jackson.
+        
+        Make the mapping as provided by PlatformGamepad
+        available in UIGamepad, and pass it along to
+        GamepadData so it can be correctly reflected
+        in the Gamepad API.
+
+        * Shared/Gamepad/GamepadData.cpp:
+        (WebKit::GamepadData::GamepadData):
+        (WebKit::GamepadData::encode const):
+        (WebKit::GamepadData::decode):
+        * Shared/Gamepad/GamepadData.h:
+        (WebKit::GamepadData::mapping const):
+        * UIProcess/Gamepad/UIGamepad.cpp:
+        (WebKit::UIGamepad::UIGamepad):
+        (WebKit::UIGamepad::fullGamepadData const):
+        * UIProcess/Gamepad/UIGamepad.h:
+        * WebProcess/Gamepad/WebGamepad.cpp:
+        (WebKit::WebGamepad::WebGamepad):
+
 2020-02-10  Daniel Bates  <dabates@apple.com>
 
         Disallow setting base URL to a data or JavaScript URL
index f9ba49d..3d74019 100644 (file)
@@ -41,9 +41,10 @@ GamepadData::GamepadData(unsigned index, const Vector<double>& axisValues, const
 {
 }
 
-GamepadData::GamepadData(unsigned index, const String& id, const Vector<double>& axisValues, const Vector<double>& buttonValues, MonotonicTime lastUpdateTime)
+GamepadData::GamepadData(unsigned index, const String& id, const String& mapping, const Vector<double>& axisValues, const Vector<double>& buttonValues, MonotonicTime lastUpdateTime)
     : m_index(index)
     , m_id(id)
+    , m_mapping(mapping)
     , m_axisValues(axisValues)
     , m_buttonValues(buttonValues)
     , m_lastUpdateTime(lastUpdateTime)
@@ -56,7 +57,7 @@ void GamepadData::encode(IPC::Encoder& encoder) const
     if (m_isNull)
         return;
 
-    encoder << m_index << m_id << m_axisValues << m_buttonValues << m_lastUpdateTime;
+    encoder << m_index << m_id << m_mapping << m_axisValues << m_buttonValues << m_lastUpdateTime;
 }
 
 Optional<GamepadData> GamepadData::decode(IPC::Decoder& decoder)
@@ -74,6 +75,9 @@ Optional<GamepadData> GamepadData::decode(IPC::Decoder& decoder)
     if (!decoder.decode(data.m_id))
         return WTF::nullopt;
 
+    if (!decoder.decode(data.m_mapping))
+        return WTF::nullopt;
+
     if (!decoder.decode(data.m_axisValues))
         return WTF::nullopt;
 
index 7e7e622..7e16a89 100644 (file)
@@ -46,7 +46,7 @@ public:
     }
 
     GamepadData(unsigned index, const Vector<double>& axisValues, const Vector<double>& buttonValues, MonotonicTime lastUpdateTime);
-    GamepadData(unsigned index, const String& id, const Vector<double>& axisValues, const Vector<double>& buttonValues, MonotonicTime lastUpdateTime);
+    GamepadData(unsigned index, const String& id, const String& mapping, const Vector<double>& axisValues, const Vector<double>& buttonValues, MonotonicTime lastUpdateTime);
 
     void encode(IPC::Encoder&) const;
     static Optional<GamepadData> decode(IPC::Decoder&);
@@ -56,12 +56,14 @@ public:
     MonotonicTime lastUpdateTime() const { return m_lastUpdateTime; }
     unsigned index() const { return m_index; }
     const String& id() const { return m_id; }
+    const String& mapping() const { return m_mapping; }
     const Vector<double>& axisValues() const { return m_axisValues; }
     const Vector<double>& buttonValues() const { return m_buttonValues; }
 
 private:
     unsigned m_index;
     String m_id;
+    String m_mapping;
     Vector<double> m_axisValues;
     Vector<double> m_buttonValues;
     MonotonicTime m_lastUpdateTime;
index bca1c92..baee97a 100644 (file)
@@ -37,6 +37,7 @@ using namespace WebCore;
 UIGamepad::UIGamepad(WebCore::PlatformGamepad& platformGamepad)
     : m_index(platformGamepad.index())
     , m_id(platformGamepad.id())
+    , m_mapping(platformGamepad.mapping())
     , m_lastUpdateTime(platformGamepad.lastUpdateTime())
 {
     m_axisValues.resize(platformGamepad.axisValues().size());
@@ -63,7 +64,7 @@ GamepadData UIGamepad::condensedGamepadData() const
 
 GamepadData UIGamepad::fullGamepadData() const
 {
-    return { m_index, m_id, m_axisValues, m_buttonValues, m_lastUpdateTime };
+    return { m_index, m_id, m_mapping, m_axisValues, m_buttonValues, m_lastUpdateTime };
 }
 
 
index b029150..db76d27 100644 (file)
@@ -54,6 +54,7 @@ public:
 private:
     unsigned m_index;
     String m_id;
+    String m_mapping;
     Vector<double> m_axisValues;
     Vector<double> m_buttonValues;
     MonotonicTime m_lastUpdateTime;
index 80c9790..a43f04a 100644 (file)
@@ -40,6 +40,7 @@ WebGamepad::WebGamepad(const GamepadData& gamepadData)
     LOG(Gamepad, "Connecting WebGamepad %u", gamepadData.index());
 
     m_id = gamepadData.id();
+    m_mapping = gamepadData.mapping();
     m_axisValues.resize(gamepadData.axisValues().size());
     m_buttonValues.resize(gamepadData.buttonValues().size());
 
index f8fd403..1cabfc2 100644 (file)
@@ -1,3 +1,17 @@
+2020-02-10  James Howard  <jameshoward@mac.com>
+
+        Standard gamepad mapping for GameControllerGamepads
+        https://bugs.webkit.org/show_bug.cgi?id=206033
+
+        Reviewed by Dean Jackson.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
+        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
+        (WTR::TestRunner::setMockGamepadDetails):
+        * WebKitTestRunner/InjectedBundle/TestRunner.h:
+        * WebKitTestRunner/TestInvocation.cpp:
+        (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):
+
 2020-02-10  Aakash Jain  <aakash_jain@apple.com>
 
         [ews] Display flaky layout test names in build summary
index 9e53b5b..160c2e9 100644 (file)
@@ -285,7 +285,7 @@ interface TestRunner {
     void installCustomMenuAction(DOMString name, boolean dismissesAutomatically, object callback);
 
     // Gamepad
-    void setMockGamepadDetails(unsigned long index, DOMString id, unsigned long axisCount, unsigned long buttonCount);
+    void setMockGamepadDetails(unsigned long index, DOMString id, DOMString mapping, unsigned long axisCount, unsigned long buttonCount);
     void setMockGamepadAxisValue(unsigned long index, unsigned long axisIndex, double value);
     void setMockGamepadButtonValue(unsigned long index, unsigned long buttonIndex, double value);
     void connectMockGamepad(unsigned long index);
index 5e759ab..24569c9 100644 (file)
@@ -2450,7 +2450,7 @@ void TestRunner::disconnectMockGamepad(unsigned index)
     WKBundlePostSynchronousMessage(InjectedBundle::singleton().bundle(), messageName.get(), messageBody.get(), nullptr);
 }
 
-void TestRunner::setMockGamepadDetails(unsigned index, JSStringRef gamepadID, unsigned axisCount, unsigned buttonCount)
+void TestRunner::setMockGamepadDetails(unsigned index, JSStringRef gamepadID, JSStringRef mapping, unsigned axisCount, unsigned buttonCount)
 {
     Vector<WKRetainPtr<WKStringRef>> keys;
     Vector<WKRetainPtr<WKTypeRef>> values;
@@ -2458,6 +2458,9 @@ void TestRunner::setMockGamepadDetails(unsigned index, JSStringRef gamepadID, un
     keys.append(adoptWK(WKStringCreateWithUTF8CString("GamepadID")));
     values.append(toWK(gamepadID));
 
+    keys.append(adoptWK(WKStringCreateWithUTF8CString("Mapping")));
+    values.append(toWK(mapping));
+
     keys.append(adoptWK(WKStringCreateWithUTF8CString("GamepadIndex")));
     values.append(adoptWK(WKUInt64Create(index)));
 
@@ -2551,7 +2554,7 @@ void TestRunner::disconnectMockGamepad(unsigned)
 {
 }
 
-void TestRunner::setMockGamepadDetails(unsigned, JSStringRef, unsigned, unsigned)
+void TestRunner::setMockGamepadDetails(unsigned, JSStringRef, JSStringRef, unsigned, unsigned)
 {
 }
 
index 955dd0f..c3c1045 100644 (file)
@@ -375,7 +375,7 @@ public:
     // Gamepads
     void connectMockGamepad(unsigned index);
     void disconnectMockGamepad(unsigned index);
-    void setMockGamepadDetails(unsigned index, JSStringRef gamepadID, unsigned axisCount, unsigned buttonCount);
+    void setMockGamepadDetails(unsigned index, JSStringRef gamepadID, JSStringRef mapping, unsigned axisCount, unsigned buttonCount);
     void setMockGamepadAxisValue(unsigned index, unsigned axisIndex, double value);
     void setMockGamepadButtonValue(unsigned index, unsigned buttonIndex, double value);
     
index fd5f2e9..29b99f8 100644 (file)
@@ -1029,15 +1029,17 @@ WKRetainPtr<WKTypeRef> TestInvocation::didReceiveSynchronousMessageFromInjectedB
         WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody);
         WKRetainPtr<WKStringRef> gamepadIndexKey = adoptWK(WKStringCreateWithUTF8CString("GamepadIndex"));
         WKRetainPtr<WKStringRef> gamepadIDKey = adoptWK(WKStringCreateWithUTF8CString("GamepadID"));
+        WKRetainPtr<WKStringRef> mappingKey = adoptWK(WKStringCreateWithUTF8CString("Mapping"));
         WKRetainPtr<WKStringRef> axisCountKey = adoptWK(WKStringCreateWithUTF8CString("AxisCount"));
         WKRetainPtr<WKStringRef> buttonCountKey = adoptWK(WKStringCreateWithUTF8CString("ButtonCount"));
 
         WKUInt64Ref gamepadIndex = static_cast<WKUInt64Ref>(WKDictionaryGetItemForKey(messageBodyDictionary, gamepadIndexKey.get()));
         WKStringRef gamepadID = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, gamepadIDKey.get()));
+        WKStringRef mapping = static_cast<WKStringRef>(WKDictionaryGetItemForKey(messageBodyDictionary, mappingKey.get()));
         WKUInt64Ref axisCount = static_cast<WKUInt64Ref>(WKDictionaryGetItemForKey(messageBodyDictionary, axisCountKey.get()));
         WKUInt64Ref buttonCount = static_cast<WKUInt64Ref>(WKDictionaryGetItemForKey(messageBodyDictionary, buttonCountKey.get()));
 
-        WebCoreTestSupport::setMockGamepadDetails(WKUInt64GetValue(gamepadIndex), toWTFString(gamepadID), WKUInt64GetValue(axisCount), WKUInt64GetValue(buttonCount));
+        WebCoreTestSupport::setMockGamepadDetails(WKUInt64GetValue(gamepadIndex), toWTFString(gamepadID), toWTFString(mapping), WKUInt64GetValue(axisCount), WKUInt64GetValue(buttonCount));
         return nullptr;
     }