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