<!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> let immersiveTestName = "XRFrame methods throw exceptions outside of the " + "requestAnimationFrame callback for immersive sessions"; let nonImmersiveTestName = "XRFrame methods throw exceptions outside of the " + "requestAnimationFrame callback for non-immersive sessions"; let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; let testFunction = (testSession, testController, t) => new Promise((resolve) => { let staleFrame = null; let currentReferenceSpace = null; let currentViewerSpace = null; function onFrame(time, xrFrame) { t.step(() => { assert_true(xrFrame instanceof XRFrame); }); staleFrame = xrFrame; step_timeout(afterFrame, 0); } function afterFrame() { t.step(() => { // Attempting to call a method on the frame outside the callback that // originally provided it should cause it to throw an exception. assert_throws_dom('InvalidStateError', () => staleFrame.getViewerPose(currentReferenceSpace)); assert_throws_dom('InvalidStateError', () => staleFrame.getPose(currentViewerSpace, currentReferenceSpace)); }); // Test does not complete until the this function has executed. resolve(); } testSession.requestReferenceSpace('viewer').then((viewerSpace) => { currentViewerSpace = viewerSpace; testSession.requestReferenceSpace('local').then((referenceSpace) => { currentReferenceSpace = referenceSpace; testSession.requestAnimationFrame(onFrame); }); }); }); xr_session_promise_test(immersiveTestName, testFunction, fakeDeviceInitParams, 'immersive-vr'); xr_session_promise_test(nonImmersiveTestName, testFunction, fakeDeviceInitParams, 'inline', { 'requiredFeatures': ['local'] }); </script> </body>