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>
let immersiveTestName = "XRSession requestAnimationFrame must fail if the session has "
+ "no baseLayer for immersive";
let nonImmersiveTestName = "XRSession requestAnimationFrame must fail if the session has "
+ "no baseLayer for non immersive";
let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
let testFunction = (session, controller, t, sessionObjects) => new Promise((resolve, reject) => {
// Clear the base layer that the boilerplate sets. This ensures that the rAF
// won't fire. If the fire *does* fire, it will fail because the baseLayer
// won't match the new baselayer we later create.
baseLayer: null
let gl =;
// Session must have a baseLayer or frame requests will be ignored.
let webglLayer = new XRWebGLLayer(session, gl);
function onEarlyFrame(time, vrFrame) {
// We shouldn't be allowed to reach this callback with no baseLayer
t.step(() => {
assert_equals(session.renderState.baseLayer, webglLayer);
// This callback shouldn't go through, since the session doesn't
// have a baseLayer when this call is made.
let handle = session.requestAnimationFrame(onEarlyFrame);
// Should still give us a valid handle, though.
assert_not_equals(handle, 0);
// Wait for a bit and set the baseLayer.
t.step_timeout(() => {
// Once the base layer is set the previously registered callback should run.
baseLayer: webglLayer
}, 300);
immersiveTestName, testFunction, fakeDeviceInitParams, 'immersive-vr');
nonImmersiveTestName, testFunction, fakeDeviceInitParams, 'inline');