blob: ea1bf82adb35d59618c79b8199aa22897015f28c [file] [log] [blame]
<!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>
<canvas />
<script>
xr_promise_test(
"Validate isSessionSupported behavior without xr-spatial-tracking policy",
(t) => {
// Inline should never reject.
return navigator.xr.isSessionSupported("inline").then((supported) => {
t.step(() => {
assert_true(supported,
"inline should always be supported, even without feature policy");
});
// It shouldn't matter that there's no device connected, the SecurityError
// should reject first.
return promise_rejects(t, "SecurityError",
navigator.xr.isSessionSupported("immersive-vr"),
"Immersive isSessionSupported should reject");
});
});
xr_promise_test(
"Validate requestSession behavior without xr-spatial-tracking policy",
(t) => {
return navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE)
.then(() => {
return new Promise((resolve, reject) => {
navigator.xr.test.simulateUserActivation(() => {
// Technically the first "requestSession" doesn't need either the device
// or the activation, but this makes the test code a little cleaner since
// the others do, as lacking user activation or a valid backing device
// should also cause the session to reject. In order to guarantee that
// we're seeing the rejection we want, we eliminate those as possibilities.
resolve(Promise.all([
navigator.xr.requestSession("inline").then(session => session.end()),
promise_rejects(t, "NotSupportedError",
navigator.xr.requestSession("inline", { requiredFeatures: ["local"] }),
"Inline with features should reject without feature policy"),
promise_rejects(t, "NotSupportedError",
navigator.xr.requestSession("immersive-vr"),
"Immersive-vr should reject without feature policy")
]));
});
});
});
});
xr_promise_test(
"Validate devicechange event behavior without xr-spatial-tracking policy",
(t) => {
navigator.xr.addEventListener("devicechange", () => {
t.step(() => { assert_unreached("devicechange should not fire"); });
})
// We need to yield a short time to ensure that any event registration has
// propagated, as this can take some time.
// Note that device connection is not guaranteed to fire per the spec, if it's
// the first connection, but disconnect definitely should.
t.step_timeout(() => {
navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE)
.then((testDeviceController) => {
return testDeviceController.disconnect();
});
}, 100);
// Wait an even longer time before finishing the test, so that if the event
// were to fire, it would've by now.
return new Promise((resolve) => {
t.step_timeout(() => { resolve(); }, 2000);
});
});
</script>