Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!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 = "Calling end during an input callback stops processing at the right time";
let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
let gl = null;
function requestImmersiveSession() {
return new Promise((resolve, reject) => {
navigator.xr.test.simulateUserActivation(() => {
navigator.xr.requestSession('immersive-vr').then((session) => {
session.updateRenderState({
baseLayer: new XRWebGLLayer(session, gl)
});
resolve(session);
}, (err) => {
reject(err);
});
});
});
}
let testFunction = function(session, fakeDeviceController, t, sessionObjects) {
gl = sessionObjects.gl;
// helper method to send a click and then request a dummy animation frame to
// ensure that the click propagates. We're doing everything in these tests
// from event watchers, we just need to trigger the add/click to make the
// event listeners callback.
function sendClick(session) {
let input_source = fakeDeviceController.simulateInputSourceConnection({
handedness: "right",
targetRayMode: "tracked-pointer",
pointerOrigin: VALID_POINTER_TRANSFORM,
profiles: [],
selectionClicked: true
});
requestSkipAnimationFrame(session, () => {});
}
function sessionEndTest(endEvent, eventOrder) {
return requestImmersiveSession().then((session) => {
let eventWatcher = new EventWatcher(t, session,
["inputsourceschange", "selectstart", "select", "selectend", "end"]);
let eventPromise = eventWatcher.wait_for(eventOrder);
session.addEventListener(endEvent, ()=> {
session.end();
}, false);
sendClick(session);
return eventPromise;
});
}
// End our first session, just for simplicity, then make end session calls
// during each of our input events, and ensure that events stop processing
// and no crashes occur from calling end inside the event callbacks.
return session.end().then(() => {
return sessionEndTest("inputsourceschange", ["inputsourceschange", "end"]);
}).then(() => {
return sessionEndTest("selectstart", ["inputsourceschange", "selectstart", "selectend", "end"]);
}).then(() => {
return sessionEndTest("select", ["inputsourceschange", "selectstart", "select", "selectend", "end"]);
}).then(() => {
return sessionEndTest("selectend", ["inputsourceschange", "selectstart", "select", "selectend", "end"]);
});
};
xr_session_promise_test(
testName, testFunction, fakeDeviceInitParams, 'immersive-vr');
</script>