| <!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> |