<!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 testNoDevice(t, gl) {
      assert_false(gl.getContextAttributes().xrCompatible);
      return promise_rejects_dom(t, "InvalidStateError", gl.makeXRCompatible());
    }

    xr_promise_test("Creating a webgl context with no device",
      testNoDevice, null, 'webgl');

    xr_promise_test("Creating a webgl2 context with no device",
      testNoDevice, null, 'webgl2');

    function testOffscreenCanvas(canvas, glContextType) {
      let gl = canvas.getContext('webgl');

      return gl.makeXRCompatible().then(() => {
        assert_true(gl.getContextAttributes().xrCompatible);
      });
    }

    function testXrCompatible(t, gl) {
      return navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE)
        .then( (controller) => {
          return gl.makeXRCompatible();
        }).then( () => {
          assert_true(gl.getContextAttributes().xrCompatible);

          return testOffscreenCanvas(document.createElement('canvas'), 'webgl');
        }).then( () => {
          return testOffscreenCanvas(document.createElement('canvas'), 'webgl2');
        }).then( () => {
          return testOffscreenCanvas(new OffscreenCanvas(1, 1), 'webgl');
        }).then( () => {
          return testOffscreenCanvas(new OffscreenCanvas(1, 1), 'webgl2');
      });
    }

    xr_promise_test("An XR-compatible webgl context can be created",
      testXrCompatible, null, 'webgl');

    xr_promise_test("An XR-compatible webgl2 context can be created",
      testXrCompatible, null, 'webgl2');

  </script>
</body>
