Source code

Revision control

Copy as Markdown

Other Tools

'use strict';
// A test function that runs the common steps for requesting an XR session.
// After the session is created, it is initialize the XRWebGLBinding
// and local XRSpace objects for the session. These components are essential
// for tests involving WebXR layers.
function xr_layer_promise_test(
name, func, fakeDeviceInit, sessionMode, sessionInit, properties,
glcontextPropertiesParam) {
const glcontextProperties = (glcontextPropertiesParam) ? glcontextPropertiesParam : {};
function runTest(t, glContext) {
let testSession;
let testDeviceController;
let sessionObjects = {gl: glContext};
// Ensure that any pending sessions are ended when done. This needs to
// use a cleanup function to ensure proper sequencing. If this were
// done in a .then() for the success case, a test that expected
// failure would already be marked done at the time that runs, and the
// shutdown would interfere with the next test which may have started.
t.add_cleanup(async () => {
// If a session was created, end it.
if (testSession) {
await testSession.end().catch(() => {});
}
});
return navigator.xr.test.simulateDeviceConnection(fakeDeviceInit)
.then((controller) => {
testDeviceController = controller;
return sessionObjects.gl.makeXRCompatible();
})
.then(() => new Promise((resolve, reject) => {
// Perform the session request in a user gesture.
xr_debug(name, 'simulateUserActivation');
navigator.xr.test.simulateUserActivation(() => {
xr_debug(name, 'document.hasFocus()=' + document.hasFocus());
navigator.xr.requestSession(sessionMode, sessionInit || {})
.then(async (session) => {
xr_debug(name, 'session start');
testSession = session;
session.mode = sessionMode;
session.sessionInit = sessionInit;
// This method creates test specific session objects.
sessionObjects.xrBinding = new XRWebGLBinding(session, sessionObjects.gl);
// Request a 'local' reference space which is required for layers creation.
sessionObjects.xrSpace = await session.requestReferenceSpace('local');
if (!sessionObjects.xrSpace) {
reject("Local space is required for layers test.");
return;
}
xr_debug(name, 'session.visibilityState=' + session.visibilityState);
try {
resolve(func(session, testDeviceController, t, sessionObjects));
} catch(err) {
reject("Test function failed with: " + err);
}
})
.catch((err) => {
xr_debug(name, 'error: ' + err);
reject(
'Session with params ' +
JSON.stringify(sessionMode) +
' was rejected on device ' +
JSON.stringify(fakeDeviceInit) +
' with error: ' + err);
});
});
}));
}
xr_promise_test(
name + ' - webgl',
runTest,
properties,
'webgl',
{alpha: false, antialias: false, ...glcontextProperties}
);
xr_promise_test(
name + ' - webgl2',
runTest,
properties,
'webgl2',
{alpha: false, antialias: false, ...glcontextProperties}
);
}