tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

xrLayerInit.https.html (6739B)


      1 <!doctype html>
      2 <title>Tests for errors with invalid XRLayerInit parameters.</title>
      3 <link rel="help" href="https://immersive-web.github.io/layers/#dom-xrwebglbinding-createquadlayer">
      4 <script src="/resources/testharness.js"></script>
      5 <script src="/resources/testharnessreport.js"></script>
      6 <script src="../resources/webxr_util.js"></script>
      7 <script src="../resources/webxr_test_constants.js"></script>
      8 <script src="./xr_layer_promise_test.js"></script>
      9 
     10 <canvas id="webgl-canvas"></canvas>
     11 
     12 <script>
     13  function testCommonXRLayerInitErrors(createLayerFn, valid_init, t, gl) {
     14    const is_webgl2 = gl instanceof WebGL2RenderingContext;
     15    return new Promise((resolve, reject) => {
     16      const max_texture_size = gl.getParameter(gl.MAX_TEXTURE_SIZE);
     17      if (!is_webgl2) {
     18        // Check an exception on webgl2 color formats.
     19        t.step(() => {
     20          [
     21            0x8058, // GL_RGBA8
     22            0x8051, // GL_RGB8
     23            0x8C41, // GL_SRGB8
     24            0x8C43  // GL_SRGB8_ALPHA8
     25          ].forEach((colorFormat) => {
     26            let invalid_color_format = Object.assign({}, valid_init, { colorFormat });
     27            assert_throws_js(TypeError, () => createLayerFn(invalid_color_format), "colorFormat for webgl2 only");
     28          });
     29        });
     30      }
     31 
     32      t.step(() => {
     33        // viewPixelWidth and viewPixelHeight must be greater than 0.
     34        let invalid_pixel_width = Object.assign({}, valid_init, { viewPixelWidth: 0 });
     35        assert_throws_js(TypeError, () => createLayerFn(invalid_pixel_width), "viewPixelWidth is 0");
     36      });
     37 
     38      t.step(() => {
     39        let invalid_pixel_height = Object.assign({}, valid_init, { viewPixelHeight: 0 });
     40        assert_throws_js(TypeError, () => createLayerFn(invalid_pixel_height), "viewPixelHeight is 0");
     41      });
     42 
     43      // viewPixelWidth and viewPixelHeight must not be too large.
     44      t.step(() => {
     45        let large_pixel_width = Object.assign({}, valid_init, { viewPixelWidth: max_texture_size + 1 });
     46        assert_throws_js(TypeError, () => createLayerFn(large_pixel_width), "viewPixelWidth is too large");
     47      });
     48 
     49      t.step(() => {
     50        let large_pixel_height = Object.assign({}, valid_init, { viewPixelHeight: max_texture_size + 1 });
     51        assert_throws_js(TypeError, () => createLayerFn(large_pixel_height), "viewPixelHeight is too large");
     52      });
     53    });
     54  };
     55 
     56  function testXRLayerInitTextureArrayErrors(createLayerFn, valid_init, t, gl) {
     57    const is_webgl2 = gl instanceof WebGL2RenderingContext;
     58    return new Promise((resolve, reject) => {
     59      let texture_array = Object.assign({}, valid_init, { textureType: 'texture-array', layout: 'stereo' });
     60      if (is_webgl2) {
     61        const layer = createLayerFn(texture_array);
     62        // 'stereo' layout should be supported with 'texture-array'.
     63        assert_equals(layer.layout, 'stereo', "layout is not expected");
     64      } else {
     65          // Check an exception on texture-array.
     66        t.step(() => {
     67          // texture-array is not supported for webgl.
     68          assert_throws_js(TypeError, () => createLayerFn(texture_array), "texture-array for webgl2 only");
     69        });
     70      }
     71    });
     72  }
     73 
     74  function testXRLayerInitTransformErrors(createLayerFn, valid_init, t) {
     75    return new Promise((resolve, reject) => {
     76      t.step(() => {
     77        // Check an exception for invalid transform object.
     78        let invalid_transform = Object.assign({}, valid_init, { transform: { x: 0, y: 0, z: 0 } });
     79        assert_throws_js(TypeError, () => createLayerFn(invalid_transform), "Invalid transform object");
     80      });
     81    });
     82  }
     83 
     84  function testXRLayerInitLayoutErrors(createLayerFn, valid_init, t, is_cube) {
     85    return new Promise((resolve, reject) => {
     86      t.step(() => {
     87        // 'default' is invalid for all layers.
     88        const default_layout = Object.assign({}, valid_init, { layout: 'default' });
     89        assert_throws_js(TypeError, () => createLayerFn(default_layout), "layout is 'default'");
     90 
     91        const stereo_layout = Object.assign({}, valid_init, { layout: 'stereo' });
     92        if (is_cube) {
     93          // We don't support 'stereo' layout for cube layers.
     94          assert_throws_js(TypeError, () => createLayerFn(stereo_layout), "layout is 'stereo'");
     95        } else {
     96          // It should end up as 'stereo-left-right' when 'texture-array' is not used.
     97          const layer = createLayerFn(stereo_layout);
     98          const layout = layer.layout;
     99          assert_equals(layout, 'stereo-left-right', "layout is not expected");
    100        }
    101        resolve();
    102      });
    103    });
    104  };
    105 
    106  function testCompositionLayer(xrSession, deviceController, t, { gl, xrBinding, xrSpace }) {
    107    const valid_init = {
    108      space: xrSpace,
    109      viewPixelWidth: 1024,
    110      viewPixelHeight: 1024
    111    };
    112    const create_quad_layer = xrBinding.createQuadLayer.bind(xrBinding);
    113    const create_cylinder_layer = xrBinding.createCylinderLayer.bind(xrBinding);
    114    const create_equirect_layer = xrBinding.createEquirectLayer.bind(xrBinding);
    115    const create_cube_layer = xrBinding.createCubeLayer.bind(xrBinding);
    116 
    117    return Promise.resolve()
    118      // Quad layer.
    119      .then(testCommonXRLayerInitErrors(create_quad_layer, valid_init, t, gl))
    120      .then(testXRLayerInitTextureArrayErrors(create_quad_layer, valid_init, t, gl))
    121      .then(testXRLayerInitTransformErrors(create_quad_layer, valid_init, t))
    122      .then(testXRLayerInitLayoutErrors(create_quad_layer, valid_init, t, false /*is_cube*/))
    123      // Cylinder layer.
    124      .then(testCommonXRLayerInitErrors(create_cylinder_layer, valid_init, t, gl))
    125      .then(testXRLayerInitTextureArrayErrors(create_cylinder_layer, valid_init, t, gl))
    126      .then(testXRLayerInitTransformErrors(create_cylinder_layer, valid_init, t))
    127      .then(testXRLayerInitLayoutErrors(create_cylinder_layer, valid_init, t, false /*is_cube*/))
    128      // Equirect layer.
    129      .then(testCommonXRLayerInitErrors(create_equirect_layer, valid_init, t, gl))
    130      .then(testXRLayerInitTextureArrayErrors(create_equirect_layer, valid_init, t, gl))
    131      .then(testXRLayerInitTransformErrors(create_equirect_layer, valid_init, t))
    132      .then(testXRLayerInitLayoutErrors(create_equirect_layer, valid_init, t, false /*is_cube*/))
    133      // Cube layer.
    134      .then(testCommonXRLayerInitErrors(create_cube_layer, valid_init, t, gl))
    135      .then(testXRLayerInitLayoutErrors(create_cube_layer, valid_init, t, true /*is_cube*/));
    136  }
    137 
    138  // This method tests XRLayerInit parameters, which are common to the Quad,Cylinder and Equirect layers.
    139  xr_layer_promise_test("Ensure XrWebGLBinding's create layer methods throw the appropriate errors.",
    140    testCompositionLayer, TRACKED_IMMERSIVE_DEVICE, 'immersive-vr', { requiredFeatures: ['layers'] });
    141 </script>