1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webxr_util.js"></script>
<script src="resources/webxr_test_constants.js"></script>
<script>
let testName = "XRInputSources primary input presses properly fires off the "
+ "right events";
let watcherDone = new Event("watcherdone");
let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
let xrViewerSpace = null;
let testFunction = function(session, fakeDeviceController, t) {
let eventWatcher = new EventWatcher(
t, session, ["squeezestart", "squeeze", "squeezeend", "watcherdone"]);
let eventPromise = eventWatcher.wait_for(
["squeezestart", "squeeze", "squeezeend", "watcherdone"]);
function tryCallingFrameMethods(frame) {
t.step(() => {
// Frame is active but not an animation frame, so calling getPose is
// allowed while getViewerPose is not.
assert_throws_dom('InvalidStateError', () => frame.getViewerPose(currentReferenceSpace));
let pose = frame.getPose(xrViewerSpace, currentReferenceSpace);
assert_not_equals(pose, null);
assert_true(pose instanceof XRPose);
assert_false(pose instanceof XRViewerPose);
});
}
function onSessionSqueezeStart(event) {
t.step( () => {
let input_sources = session.inputSources;
assert_equals(event.frame.session, session);
assert_equals(event.inputSource, input_sources[0]);
validateSameObject(event);
tryCallingFrameMethods(event.frame);
});
}
function onSessionSqueezeEnd(event) {
t.step( () => {
let input_sources = session.inputSources;
assert_equals(event.frame.session, session);
assert_equals(event.inputSource, input_sources[0]);
validateSameObject(event);
tryCallingFrameMethods(event.frame);
});
session.dispatchEvent(watcherDone);
}
function onSessionSqueeze(event) {
t.step( () => {
let input_sources = session.inputSources;
assert_equals(event.frame.session, session);
assert_equals(event.inputSource, input_sources[0]);
validateSameObject(event);
tryCallingFrameMethods(event.frame);
});
}
// Verifies that the same object is returned each time attributes are accessed
// on an XRInputSourceEvent, as required by the spec.
function validateSameObject(event) {
let frame = event.frame;
let source = event.inputSource;
t.step(() => {
assert_equals(frame, event.frame,
"XRInputSourceEvent.frame returns the same object.");
assert_equals(source, event.inputSource,
"XRInputSourceEvent.inputSource returns the same object.");
});
}
session.addEventListener("squeezestart", onSessionSqueezeStart, false);
session.addEventListener("squeezeend", onSessionSqueezeEnd, false);
session.addEventListener("squeeze", onSessionSqueeze, false);
let pressed_grip_button = {
buttonType: "grip",
pressed: true,
touched: true,
pressedValue: 1.0
};
let unpressed_grip_button = {
buttonType: "grip",
pressed: false,
touched: false,
pressedValue: 0.0
};
let gripController = {
handedness: "none",
targetRayMode: "tracked-pointer",
pointerOrigin: VALID_POINTER_TRANSFORM,
profiles: [],
supportedButtons: [ unpressed_grip_button ]
};
let input_source =
fakeDeviceController.simulateInputSourceConnection(gripController);
let currentReferenceSpace = null;
session.requestReferenceSpace('viewer').then(function(viewerSpace) {
xrViewerSpace = viewerSpace;
session.requestReferenceSpace('local').then((referenceSpace) => {
currentReferenceSpace = referenceSpace;
//Simulate a grip starting then release it a short time later.
requestSkipAnimationFrame(session, (time, xrFrame) => {
input_source.updateButtonState(pressed_grip_button);
session.requestAnimationFrame((time, xrFrame) => {
input_source.updateButtonState(unpressed_grip_button);
session.requestAnimationFrame((time, xrFrame) => {
// Need to process one more frame to allow grip to propegate.
});
});
});
});
});
return eventPromise;
};
xr_session_promise_test(
testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
</script>
|