<!--
Copyright (c) 2019 The Khronos Group Inc.
Use of this source code is governed by an MIT-style license that can be
found in the LICENSE.txt file.
-->

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Scissor Rectangle Repeated Rendering Test</title>
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../js/js-test-pre.js"></script>
<script src="../../js/webgl-test-utils.js"> </script>
</head>
<body>
<canvas id="example" width="128" height="128"></canvas>
<div id="description"></div>
<div id="console"></div>
<script>
"use strict";

description();
debug('Regression test for <a href="https://code.google.com/p/chromium/issues/detail?id=778770">Chromium bug 778770</a>');

var wtu = WebGLTestUtils;

// These context creation attributes are significant to reproduce the bug.
var gl = wtu.create3DContext("example", {alpha: false, antialias: false});

// Draw into the upper right quadrant.
var x      = 64;
var y      = 64;
var width  = 64;
var height = 64;

var numRenders = 10;

function render() {
    gl.viewport(x, y, width, height);
    gl.scissor(x, y, width, height);
    gl.enable(gl.SCISSOR_TEST);
    gl.clearColor(0.0, 1.0, 0.0, 1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);

    // If anything but black is ever seen in the un-drawn region of
    // the canvas, the test fails.
    var black = [0, 0, 0, 255];
    wtu.checkCanvasRect(gl, 10, 10, 10, 10, black, "should be black", 1);

    if (--numRenders > 0) {
        window.requestAnimationFrame(render);
    } else {
        finishTest();
    }
}

window.requestAnimationFrame(render);

var successfullyParsed = true;
</script>
</body>
</html>
