<!DOCTYPE HTML>

<!-- READ BEFORE UPDATING:
If this test is updated make sure to increment the "revision" value of the
associated test in content/test/gpu/gpu_tests/pixel_test_pages.py. This will ensure
that the baseline images are regenerated on the next run.
-->

<html>
<head>
<title>OffscreenCanvas 2d commit flow on main thread: Two Canvases</title>
<style type="text/css">
.nomargin {
  margin: 0px auto;
}
</style>
</head>
<body onload="main()">
<div style="position:relative; width:600px; height:300px; background-color:white">
</div>
<div id="container" style="position:absolute; top:0px; left:0px">
<canvas id="canvas1" width="300" height="300" class="nomargin"></canvas>
<canvas id="canvas2" width="300" height="300" class="nomargin"></canvas>
</div>
<script>
/* This pixel test checks the following:
    1. Whether submission of frames for multiple canvases happen about the same
       time for OffscreenCanvas.commit() that are invoked in the same JS task.
    2. Whether overdraw frame in one animation loop is handled well.
    3. Whether the drawn 2d image is position upright in commit().
    4. Drawing to OffscreenCanvas without commit() has no rendering results.

    Correct end result of this test: The left canvas shows a seven-spike skyblue
    star on the top-left corner of a green background and the right canvas shows
    a sky-blue fill.
*/

var g_swapsBeforeAck = 15;
var g_asyncCallbackNumber = 2;

function getOffscreenContext(htmlCanvasId) {
  return document.getElementById(htmlCanvasId).transferControlToOffscreen().getContext("2d");
}

function startTest() {
  var ctx1 = getOffscreenContext("canvas1");
  var ctx2 = getOffscreenContext("canvas2");

  ctx1.fillStyle = "green";
  ctx1.fillRect(0, 0, 300, 300);
  // The promise returned by this ctx1.commit() must be resolved at
  // about the same time as the other ctx2.commit() below as they are in the
  // same JS task.
  ctx1.commit().then(function() {
    ctx2.fillRect(0, 0, 300, 300);
    // This ctx2.commit() must happen after the other ctx2.commit() below.
    ctx2.commit();
    if (--g_asyncCallbackNumber == 0) waitForFinish();
  });

  function drawStar(ctx, cx, cy, spikes, outerRadius, innerRadius) {
    var rot = Math.PI / 2 * 3;
    var x = cx;
    var y = cy;
    var step = Math.PI / spikes;

    ctx.beginPath();
    ctx.moveTo(cx, cy - outerRadius);
    for (i = 0; i < spikes; i++) {
      x = cx + Math.cos(rot) * outerRadius;
      y = cy + Math.sin(rot) * outerRadius;
      ctx.lineTo(x, y);
      rot += step;

      x = cx + Math.cos(rot) * innerRadius;
      y = cy + Math.sin(rot) * innerRadius;
      ctx.lineTo(x, y);
      rot += step;
    }
    ctx.lineTo(cx, cy - outerRadius);
    ctx.closePath();
    ctx.lineWidth = 5;
    ctx.strokeStyle = 'black';
    ctx.stroke();
    ctx.fillStyle = 'skyblue';
    ctx.fill();
  }

  // Do something complex to ctx2.
  ctx2.fillStyle = "blue";
  ctx2.fillRect(0, 0, 300, 300);
  drawStar(ctx2, 150, 150, 25, 80, 60);
  // This ctx2.commit() must be resolved at about the same time as the first
  // ctx1.commit() above because they are in the same JS task, no matter how
  // complex the drawing operation is.
  ctx2.commit().then(function() {
    drawStar(ctx1, 100, 100, 7, 80, 30);
    ctx1.commit();

    // The following fill is never committed
    ctx1.fillStyle = "red";
    ctx1.fillRect(0, 0, 200, 200);
    if (--g_asyncCallbackNumber == 0) waitForFinish();
  });

}

function main() {
  startTest();
}

function waitForFinish()
{
  if (g_swapsBeforeAck == 0) {
    domAutomationController.setAutomationId(1);
    domAutomationController.send("SUCCESS");
  } else {
    g_swapsBeforeAck--;
    document.getElementById('container').style.zIndex = g_swapsBeforeAck + 1;
    requestAnimationFrame(waitForFinish);
  }
}

</script>
</body>
</html>
