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

<script>
xr_promise_test("Ensure that XRWebGLLayer's constructor throws appropriate errors",
  (t) => {
  let webglCanvas = document.getElementsByTagName('canvas')[0];
  let glAttributes = {
    alpha: false,
    antialias: false,
    xrCompatible: false,
  };
  let gl = webglCanvas.getContext('webgl', glAttributes);
  return navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE)
    .then(() => {
      return navigator.xr.requestSession('inline')
        .then((session) => {
          try {
            let webglLayerIncompatible = new XRWebGLLayer(session, gl);
          } catch (err) {
            assert_unreached("Inline XRWebGLLayers should not fail when created with a context that is not XRCompatible");
          }
        });
    })
    .then(() => {
      return new Promise((resolve) => {
        navigator.xr.test.simulateUserActivation(() => {
          navigator.xr.requestSession('immersive-vr')
          .then((session) => {
            t.step_func(() => {
              try {
                let webglLayerIncompatible = new XRWebGLLayer(session, gl);
                assert_unreached("XRWebGLLayer should fail when created with a context that is not XRCompatible")
              } catch (err) {
                assert_equals(err.name, "InvalidStateError");
              }
            })

            gl.makeXRCompatible();

            try {
              let webglLayerGood = new XRWebGLLayer(session, gl);
            } catch (err) {
              reject("XRWebGLLayer should not fail with valid arguments");
            }

            let lose_context_ext = gl.getExtension('WEBGL_lose_context');

            webglCanvas.addEventListener('webglcontextlost', (ev) => {
              ev.preventDefault();

              try {
                let webglLayerBadContext = new XRWebGLLayer(session, gl);
                reject("XRWebGLLayer should fail when created with a lost context");
              } catch (err) {
                assert_equals(err.name, 'InvalidStateError');
                t.step_timeout(() => { lose_context_ext.restoreContext(); }, 100);
              }
            });

            webglCanvas.addEventListener('webglcontextrestored', (ev) => {
              resolve(session.end().then(() => {
                try {
                  let webglLayerBadSession = new XRWebGLLayer(session, gl);
                  assert_unreached("XRWebGLLayer should fail when created with an ended session");
                } catch (err) {
                  assert_equals(err.name, 'InvalidStateError');
                }
              }));
            });

            lose_context_ext.loseContext();
          });
        });
      });
    });
});

</script>
