<!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 testName = "Test that getReflectionCubeMap returns or throws appropriately without a reflection map.";

    let testFunction = (session, controller, t, sessionObjects) => new Promise((resolve) => {
        let debug = xr_debug.bind(this, 'testFunction');
        let lightProbe1 = null;
        let binding1 = new XRWebGLBinding(session, sessionObjects.gl);

      // Request a default lightProbe
      session.requestLightProbe({reflectionFormat: session.preferredReflectionFormat }).then((probe) => {
        // Stash and end session.
        lightProbe1 = probe;

        debug("Querying first pair");
        t.step(() => {
          assert_equals(
            binding1.getReflectionCubeMap(lightProbe1),
            null,
            "Active binding and light probe shouldn't throw when requesting cube map");
        });

        return session.end();
      }).then(() => {
        // Need to request a new session.
        navigator.xr.test.simulateUserActivation( () => {
          navigator.xr.requestSession('immersive-ar', { 'requiredFeatures': ['light-estimation'] })
          .then((newSession) => {
            let newBinding = new XRWebGLBinding(newSession, sessionObjects.gl);
            newSession.requestLightProbe({ reflectionFormat: newSession.preferredReflectionFormat }).then((newProbe) => {
              t.step(() => {
                debug("Querying second pair");
                assert_equals(
                  newBinding.getReflectionCubeMap(newProbe),
                  null,
                  "Newly created binding and light probe shouldn't throw");

                debug("Querying old pair");
                assert_throws_dom(
                  "InvalidStateError",
                  () => binding1.getReflectionCubeMap(lightProbe1),
                  "Binding created with an ended session should throw InvalidStateError");
                debug("Querying mismatched pair");
                assert_throws_dom(
                  "InvalidStateError",
                  () => newBinding.getReflectionCubeMap(lightProbe1),
                  "Querying binding with a probe with a different backing session should throw InvalidStateError");
              });
              debug("losing context");

              // Trigger a context loss and verify that we are unable to get the reflectionCubeMap.
              let lose_context_ext = sessionObjects.gl.getExtension('WEBGL_lose_context');

              sessionObjects.gl.canvas.addEventListener('webglcontextlost', (ev) => {
                ev.preventDefault();

                t.step(() => {
                  assert_throws_dom(
                    "InvalidStateError",
                    () => newBinding.getReflectionCubeMap(newProbe),
                    "Querying for reflection cube map on a binding with context loss should throw InvalidStateError");
                });

                resolve(newSession.end());
              });

              lose_context_ext.loseContext();
            }); // Request second light probe
          }); // Request second session
        }); // SimulateUserActivation
      }); // .then on session end
    }); // testFunction

    xr_session_promise_test(
      testName,
      testFunction,
      IMMERSIVE_AR_DEVICE,
      'immersive-ar',
      {'requiredFeatures': ['light-estimation']});

  </script>
</body>
