95 lines
No EOL
3.3 KiB
HTML
95 lines
No EOL
3.3 KiB
HTML
<!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> |