| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title></title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| </head> | |
| <body> | |
| <p> | |
| This test requires a gamepad device to be connected. Please interact with | |
| the gamepad for it to be recognized. The "Trigger rumble!" button will be | |
| enabled after that. | |
| </p> | |
| <p> | |
| After pressing the "Trigger rumble!" button below, you should expect to | |
| feel a localized vibration in both triggers of all connected | |
| trigger-rumble compatible gamepads for one second. | |
| </p> | |
| <p> | |
| Please press the "Confirm effect has played" button to conclude | |
| the test. | |
| </p> | |
| <button id="play_trigger_rumble_button" disabled>No trigger-rumble gamepads detected</button> | |
| <button id="confirm_effect_button" disabled>Confirm effect has played</button> | |
| <script> | |
| async_test(t => { | |
| let connectedTriggerRumbleGamepads = {}; | |
| playEffectButton = document.getElementById('play_trigger_rumble_button'); | |
| function isTriggerRumbleSupported(gamepad) { | |
| return gamepad.vibrationActuator.effects.includes('trigger-rumble'); | |
| } | |
| window.addEventListener('gamepadconnected', (e) => { | |
| if (!e.gamepad || !e.gamepad.vibrationActuator || !e.gamepad.vibrationActuator.effects) { | |
| return; | |
| } | |
| if (isTriggerRumbleSupported(e.gamepad)) { | |
| connectedTriggerRumbleGamepads[e.gamepad.index] = e.gamepad; | |
| if (playEffectButton.disabled) { | |
| playEffectButton.disabled = false; | |
| playEffectButton.innerText = 'Trigger rumble!' | |
| } | |
| } | |
| }); | |
| window.addEventListener('gamepaddisconnected', (e) => { | |
| delete connectedTriggerRumbleGamepads[e.gamepad.index]; | |
| let anyTriggerRumbleGamepad = false; | |
| for (let index in connectedTriggerRumbleGamepads){ | |
| const gamepad = connectedTriggerRumbleGamepads[index]; | |
| if (!gamepad || !gamepad.vibrationActuator || !gamepad.vibrationActuator.effects) { | |
| continue; | |
| } | |
| if (isTriggerRumbleSupported(gamepad)){ | |
| anyTriggerRumbleGamepad = true; | |
| break; | |
| } | |
| } | |
| if (!anyTriggerRumbleGamepad && !playEffectButton.disabled) { | |
| playEffectButton.disabled = true; | |
| playEffectButton.innerText = "No trigger-rumble gamepads detected"; | |
| } | |
| }); | |
| playEffectButton.addEventListener("click", () => { | |
| let gamepads = navigator.getGamepads(); | |
| for (const gamepad of gamepads) { | |
| if (gamepad && isTriggerRumbleSupported(gamepad)) { | |
| gamepad.vibrationActuator.playEffect("trigger-rumble", { | |
| duration: 1000, | |
| leftTrigger: 1.0, | |
| rightTrigger: 1.0, | |
| }); | |
| } | |
| } | |
| const confirmButton = document.getElementById("confirm_effect_button"); | |
| if (confirmButton.disabled) { | |
| confirmButton.disabled = false; | |
| } | |
| confirmButton.addEventListener('click', () => { | |
| t.done(); | |
| }); | |
| }); | |
| }, "Gamepads with trigger-rumble capabilities should have the triggers' motors activated."); | |
| </script> | |
| </body> | |
| </html> |