chromium/third_party/blink/web_tests/compositing/webgl/webgl-copy-image.html

<!-- This is a test for crbug.com/392765, in which Copy image for
     WebGL elements were crashing. Must be run with the threaded
     compositor enabled. -->
<head>
<script src="../../resources/js-test.js"></script>
<script>

function main()
{
  if (!window.testRunner) {
    testFailed("Requires window.testRunner");
  } else {
    testRunner.waitUntilDone();
    testRunner.dumpAsText();
    window.requestAnimationFrame(initTest);
  }
}

var tolerance = 1;

function initTest() {
  var canvas = document.getElementById("c");
  var gl = canvas.getContext("webgl");
  if (!gl) {
    testFailed("Test requires WebGL");
    testRunner.notifyDone();
    return;
  }

  gl.clearColor(1, 0, 0, 1);
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

  window.requestAnimationFrame(runTest);
}

function runTest() {
  try {
    testRunner.copyImageThen(50, 50, completionCallback);
  } catch (e) {
    debug('error in runTest');
    debug(e);
    testRunner.notifyDone();
  }
}

var pixel;
function fetchPixelAt(x, y, width, height, snapshot) {
  var data = new Uint8Array(snapshot);
  pixel = [
    data[4 * (width * y + x) + 0],
    data[4 * (width * y + x) + 1],
    data[4 * (width * y + x) + 2],
    data[4 * (width * y + x) + 3]
  ];
}

function completionCallback(width, height, snapshot) {
  try {
    fetchPixelAt(50, 50, width, height, snapshot);
    shouldBeCloseTo('pixel[0]', 255, tolerance);
    shouldBeCloseTo('pixel[1]', 0, tolerance);
    shouldBeCloseTo('pixel[2]', 0, tolerance);
  } catch (e) {
    debug('error in completionCallback');
    debug(e);
    testRunner.notifyDone();
    return;
  }
  testRunner.notifyDone();
}

main();
</script>
</head>
<body>
<canvas id="c" width="200" height="200" class="nomargin"></canvas>
<div id="console"></div>
</body>