diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/tests/mochitest/gamepad/test_gamepad_extensions_iframe.html | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/tests/mochitest/gamepad/test_gamepad_extensions_iframe.html')
-rw-r--r-- | dom/tests/mochitest/gamepad/test_gamepad_extensions_iframe.html | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/dom/tests/mochitest/gamepad/test_gamepad_extensions_iframe.html b/dom/tests/mochitest/gamepad/test_gamepad_extensions_iframe.html new file mode 100644 index 0000000000..6db4b85bb6 --- /dev/null +++ b/dom/tests/mochitest/gamepad/test_gamepad_extensions_iframe.html @@ -0,0 +1,179 @@ +<!-- Any copyright is dedicated to the Public Domain. + - http://creativecommons.org/publicdomain/zero/1.0/ --> +<!DOCTYPE HTML> +<html> +<head> + <title>Test gamepad</title> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> +</head> +<body> +<script type="text/javascript" src="mock_gamepad.js"></script> +<script class="testbody" type="text/javascript"> +let ok = window.parent.ok; +let is = window.parent.is; +let SimpleTest = window.parent.SimpleTest; +let SpecialPowers = window.parent.SpecialPowers; + +var tests = [ + poseadd, + posecheck, + touchadd, + touchcheck, + haptictest // Keep haptictest at the last because it will test removing gamepad from the service. +]; +var gamepad_index = 0; +var testNum = 0; +var poseOrient = new Float32Array([-0.203, -0.235, 0.740, -0.596]); +var posePos = new Float32Array([-0.0233, -0.707, -0.763]); +var poseAngVel = new Float32Array([-0.0008, 0.00147, 0.001]); +var poseAngAcc = new Float32Array([-0.494, 0.476, -0.241]); +var poseLinVel = new Float32Array([0.003,0.024,-0.068]); +var poseLinAcc = new Float32Array([-1.211,21.427,-2.348]); +var touchData = [{touchId: 0, surfaceId: 0, pos: new Float32Array([-0.5, 0.5]), surf: new Float32Array([100, 100])}, + {touchId: 1, surfaceId: 0, pos: new Float32Array([-0.1, 1.0]), surf: new Float32Array([100, 100])}]; + +window.addEventListener("gamepadconnected", connecthandler); +window.addEventListener("gamepadbuttondown", function() { + // Wait to ensure that all frames received the button press as well. + SpecialPowers.executeSoon(async ()=> { + await tests[testNum++]() + }); +}); + +async function pressButton() { + await GamepadService.newButtonEvent(gamepad_index, 0, true, true); + await GamepadService.newButtonEvent(gamepad_index, 0, false, false); +} + +async function startTest() { + await SpecialPowers.pushPrefEnv({ "set": [ + ["dom.gamepad.extensions.enabled", true], + ["dom.gamepad.extensions.lightindicator", true], + ["dom.gamepad.extensions.multitouch", true]] }); + // Add a gamepad + gamepad_index = await GamepadService.addGamepad("test gamepad", // id + GamepadService.standardMapping, + GamepadService.leftHand, + 4, + 2, + 1, + 1, + 2); + + // Simulate button events on the gamepad we added + await pressButton(); + +} + +function connecthandler(e) { + ok(e.gamepad.timestamp <= performance.now(), + "gamepad.timestamp should less than or equal to performance.now()"); + is(e.gamepad.index, 0, "correct gamepad index"); + is(e.gamepad.id, "test gamepad", "correct gamepad name"); + is(e.gamepad.mapping, "standard", "standard mapping"); + is(e.gamepad.hand, "left", "left hand"); + is(e.gamepad.buttons.length, 4, "correct number of buttons"); + is(e.gamepad.axes.length, 2, "correct number of axes"); + is(e.gamepad.hapticActuators.length, 1, "correct number of haptics"); + is(e.gamepad.lightIndicators.length, 1, "correct number of light indicators"); + is(e.gamepad.touchEvents.length, 2, "correct number of touches"); +} + +function checkValueInFloat32Array(array1, array2) { + if (array1.length != array2.length) { + return false; + } + var index = 0; + while (index < array2.length) { + if (array1[index] != array2[index]) { + return false; + } + ++index; + } + return true; +} + +async function poseadd() { + await GamepadService.newPoseMove(gamepad_index, poseOrient, + posePos, poseAngVel, poseAngAcc, + poseLinVel, poseLinAcc); + await pressButton(); +} + +async function posecheck() { + var gamepads = navigator.getGamepads(); + var pose = gamepads[0].pose; + is(gamepads[0].pose.hasOrientation, true, + "correct gamepadPose hasOrientation"); + is(gamepads[0].pose.hasPosition, true, + "correct gamepadPose hasPosition"); + is(checkValueInFloat32Array(pose.orientation, poseOrient), true, + "correct gamepadPose orientation"); + is(checkValueInFloat32Array(pose.position, posePos), true, + "correct gamepadPose position"); + is(checkValueInFloat32Array(pose.angularVelocity, poseAngVel), true, + "correct gamepadPose angularVelocity"); + is(checkValueInFloat32Array(pose.angularAcceleration, poseAngAcc), true, + "correct gamepadPose angularAcceleration"); + is(checkValueInFloat32Array(pose.linearVelocity, poseLinVel), true, + "correct gamepadPose linearVelocity"); + is(checkValueInFloat32Array(pose.linearAcceleration, poseLinAcc), true, + "correct gamepadPose linearAcceleration"); + await pressButton(); +} + +function setFrameVisible(f, visible) { + SpecialPowers.wrap(f.contentWindow).browsingContext.isActive = visible; +} + +function haptictest() { + var gamepads = navigator.getGamepads(); + var hapticActuators = gamepads[0].hapticActuators[0]; + hapticActuators.pulse(1, 100).then(async function(result) { + is(result, true, "gamepad hapticActuators test success."); + await GamepadService.removeGamepad(gamepad_index); + SimpleTest.finish(); + }); + // When page is background, we should stop our haptics and still + // can get the promise. + var f1 = document.getElementById('f1'); + setFrameVisible(f1, false); +} + +async function touchadd() { + for(var count = 0; count < touchData.length; count++) { + const touch = touchData[count]; + await GamepadService.newTouch(gamepad_index, count, touch.touchId, + touch.surfaceId, touch.pos, + touch.surf); + } + await pressButton(); +} + +async function touchcheck() { + var gamepads = navigator.getGamepads(); + var touches = gamepads[0].touchEvents; + + is(touches.length, 2, " number of touches"); + + var count = 0; + touches.forEach(function(touch) { + is(touch.touchId, touchData[count].touchId, + "correct GamepadTouch touchId"); + is(touch.surfaceId, touchData[count].surfaceId, + "correct GamepadTouch surfaceId"); + is(checkValueInFloat32Array(touch.position, touchData[count].pos), true, + "correct touch position"); + is(checkValueInFloat32Array(touch.surfaceDimensions, touchData[count].surf), true, + "correct touch surfaceDimensions"); + + ++count; + }); + + await pressButton(); +} + +</script> +<iframe id="f1" src="gamepad_frame_state.html" onload="runGamepadTest(startTest)"></iframe> +</body> +</html> |