Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!DOCTYPE html>
<body>
<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>
function testFunctionGenerator(createSessionFromEventCallback) {
return function(session, testDeviceController, t) {
let done = false;
function createSession() {
return new Promise((resolve) => {
navigator.xr.requestSession("immersive-vr")
.then((new_session) => {
// The test framework ensures that the created session ends,
// but will not do cleanup for this session, so if it gets
// created, we need to ensure that it gets cleaned up.
return new_session.end();
}).then(() => {
done = true;
resolve();
}).catch((err) => {
// Only one catch is needed for the whole promise chain.
// If ending the new session throws, it's fine to fail as
// we'd otherwise end up in a bad state.
t.step(() => {
assert_unreached("Session creation should not throw: " + err);
});
});
});
}
function onSessionEnd() {
if (createSessionFromEventCallback) {
createSession();
}
}
session.addEventListener("end", onSessionEnd, false);
// We need to simulate the user activation before we call end as
// otherwise (depending on the implementation) it can interfere with
// the scheduling of the dispatched event/promise, and make session
// creation succeed even when there may be bugs preventing it from
// doing so in real scenarios.
navigator.xr.test.simulateUserActivation(() => {
session.end().then(() => {
if (!createSessionFromEventCallback) {
createSession();
}
});
});
return t.step_wait(() => done);
};
}
xr_session_promise_test("Create new session in OnSessionEnded event",
testFunctionGenerator(/*createSessionFromEventCallback=*/true),
TRACKED_IMMERSIVE_DEVICE, 'immersive-vr');
xr_session_promise_test("Create mew session in end promise",
testFunctionGenerator(/*createSessionFromEventCallback=*/false),
TRACKED_IMMERSIVE_DEVICE, 'immersive-vr');
</script>
</body>