tor-browser

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

compositing-test.js (4172B)


      1 var createCompositingTestFn = (function() {
      2 
      3 const width = 20;
      4 const height = 20;
      5 
      6 function waitForComposite() {
      7  debug('wait for composite');
      8  return new Promise(resolve => wtu.waitForComposite(resolve));
      9 }
     10 
     11 async function testPreserveDrawingBufferFalse(gl, drawFn, clear) {
     12  debug('');
     13  debug(`test preserveDrawingBuffer: false with ${drawFn.name} ${clear ? 'with' : 'without'} clear`);
     14 
     15  if (clear) {
     16    gl.clearColor(0, 0, 0, 0);
     17    gl.clear(gl.COLOR_BUFFER_BIT);
     18  }
     19 
     20  if (drawFn(gl)) {
     21    debug('skipped: extension does not exist');
     22    return;
     23  }
     24 
     25  wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red");
     26 
     27  // enable scissor here, before compositing, to make sure it's correctly
     28  // ignored and restored
     29  const halfWidth = gl.canvas.width / 2;
     30  const halfHeight = gl.canvas.height / 2;
     31  gl.scissor(0, halfHeight, halfWidth, halfHeight);
     32  gl.enable(gl.SCISSOR_TEST);
     33 
     34  await waitForComposite();
     35 
     36  // scissor was set earlier
     37  gl.clearColor(0, 0, 1, 1);
     38  gl.clear(gl.COLOR_BUFFER_BIT);
     39 
     40  wtu.checkCanvasRect(gl, 0, halfHeight, halfWidth, halfHeight, [0, 0, 255, 255],
     41      "cleared corner should be blue, stencil should be preserved");
     42  wtu.checkCanvasRect(gl, 0, 0, halfWidth, halfHeight, [0, 0, 0, 0],
     43      "remainder of buffer should be cleared");
     44 
     45  gl.disable(gl.SCISSOR_TEST);
     46  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors");
     47 }
     48 
     49 async function testPreserveDrawingBufferTrue(gl, drawFn, clear) {
     50  debug('');
     51  debug(`test preserveDrawingBuffer: true with ${drawFn.name} ${clear ? 'with' : 'without'} clear`);
     52 
     53  if (clear) {
     54    gl.clearColor(0, 0, 0, 0);
     55    gl.clear(gl.COLOR_BUFFER_BIT);
     56  }
     57 
     58  const skipTest = drawFn(gl);
     59  if (skipTest) {
     60    debug('skipped: extension does not exist');
     61    return;
     62  }
     63 
     64  wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red");
     65 
     66  await waitForComposite();
     67 
     68  wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red");
     69  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors");
     70 }
     71 
     72 function setupWebGL({
     73    webglVersion,
     74    shadersFn,
     75    attribs,
     76 }) {
     77    const existingCanvases = document.querySelectorAll('canvas');
     78    const canvas = document.createElement('canvas');
     79    canvas.width = width;
     80    canvas.height = height;
     81    canvas.style.display = 'block';
     82    canvas.style.position = 'fixed';
     83    canvas.style.left = `${existingCanvases.length * 25}px`;
     84    canvas.style.top = '0';
     85    // The canvas needs to be visible or the test will fail.
     86    document.body.insertBefore(canvas, [...existingCanvases].pop());
     87    const gl = wtu.create3DContext(canvas, attribs, webglVersion);
     88    if (!gl) {
     89      testFailed('WebGL context creation failed');
     90      return gl;
     91    }
     92 
     93    const shaders = shadersFn(gl);
     94    const program = wtu.setupProgram(gl, shaders, ["position"]);
     95    if (!program) {
     96      debug(`program failed to compile: ${wtu.getLastError()}`);
     97    }
     98    const positionBuf = gl.createBuffer();
     99    gl.bindBuffer(gl.ARRAY_BUFFER, positionBuf);
    100    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
    101      -1, -1,
    102       1, -1,
    103      -1,  1,
    104      -1,  1,
    105       1, -1,
    106       1,  1,
    107    ]), gl.STATIC_DRAW);
    108    gl.enableVertexAttribArray(0);
    109    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
    110    const indexBuf = gl.createBuffer();
    111    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuf);
    112    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array([0, 1, 2, 3, 4, 5]), gl.STATIC_DRAW);
    113    return gl;
    114 }
    115 
    116 function createCompositingTestFn(options) {
    117  const glPreserveDrawingBufferFalse = setupWebGL({
    118    ...options,
    119    attribs: {antialias: false},
    120  });
    121  const glPreserveDrawingBufferTrue = setupWebGL({
    122    ...options,
    123    attribs: {antialias: false, preserveDrawingBuffer: true},
    124  });
    125  return async function(drawFn) {
    126    debug('---');
    127    await testPreserveDrawingBufferFalse(glPreserveDrawingBufferFalse, drawFn, false);
    128    await testPreserveDrawingBufferFalse(glPreserveDrawingBufferFalse, drawFn, true);
    129 
    130    await testPreserveDrawingBufferTrue(glPreserveDrawingBufferTrue, drawFn, false);
    131    await testPreserveDrawingBufferTrue(glPreserveDrawingBufferTrue, drawFn, true);
    132  };
    133 }
    134 
    135 return createCompositingTestFn;
    136 }());