<!--

/*
** Copyright (c) 2012 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/

-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebGL required buffer clear behaviour test</title>
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../resources/js-test-pre.js"></script>
<script src="../resources/webgl-test.js"> </script>
<script src="../resources/webgl-test-utils.js"> </script>
<style type="text/css">
body {
    height: 3000px;
}
</style>
<script type="text/javascript">

var iter = 0;
var gl1;

var wtu = WebGLTestUtils;

function timer() {
    if (iter == 0) {
      function init(gl) {
          gl.clearColor(1, 0, 0, 1);
          gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);

          // enable scissor here, before compositing, to make sure it's correctly
          // ignored and restored
          gl.scissor(0, 10, 10, 10);
          gl.enable(gl.SCISSOR_TEST);
      }
      init(gl1);
    } else if (iter == 1) {
        // some random hacky stuff to make sure that we get a compositing step
        window.scrollBy(0, 10);
        window.scrollBy(0, -10);
    } else if (iter == 2) {
        function clear(gl) {
            // scissor was set earlier
            gl.clearColor(0, 0, 1, 1);
            gl.clear(gl.COLOR_BUFFER_BIT);

            wtu.checkCanvasRect(gl, 0, 10, 10, 10, [0, 0, 255, 255], "cleared corner should be blue, stencil should be preserved");
            wtu.checkCanvasRect(gl, 0, 0, 10, 10, [0, 0, 0, 0], "remainder of buffer should be cleared");
        }
        clear(gl1);

        finishTest();
        return;
    }

    iter++;
    setTimeout(timer, 500);
}

function go() {
    description("This test ensures WebGL implementations correctly clear the drawing buffer on composite if preserveDrawingBuffer is false.");

    debug("");

    gl1 = wtu.create3DContext("c");
    if (!gl1) {
        finishTest();
        return;
    }

    shouldBeTrue("gl1 != null");
    shouldBeTrue('gl1.getContextAttributes().preserveDrawingBuffer == false');

    setTimeout(timer, 500);
}

window.addEventListener("load", go, false);

var successfullyParsed = true;
</script>
</head>
<body>
<!-- Important to put the canvas at the top so that it's always visible even in the test suite runner.
     Otherwise it just doesn't get composited in Firefox. -->
<canvas width="20" height="20" style="border: 1px solid blue;" id="c"></canvas>
<div id="description"></div>
<div id="console"></div>
</body>
</html>
