<!--

/*
** Copyright (c) 2013 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">
<script src="resources/desktop-gl-constants.js" type="text/javascript"></script>
<script src="../../../resources/js-test.js"></script>
<script src="resources/webgl-test.js"></script>
<script src="resources/webgl-test-utils.js"></script>
<script src="resources/tex-image-and-sub-image-2d-with-video.js"></script>
<script>
"use strict";

// As a workaround for https://bugs.webkit.org/show_bug.cgi?id=87448, this code needs to
// be run from an inline script in a main resource.
window.jsTestIsAsync = true;
if (window.testRunner)
    testRunner.waitUntilDone();

function testPrologue(gl) {
    var ext = null;

    if (!(ext = gl.getExtension("OES_texture_half_float"))) {
        testPassed("No OES_texture_half_float support -- this is legal");
        return false;
    }

    // Required by the test harness.
    gl.HALF_FLOAT_OES = ext.HALF_FLOAT_OES;

    testPassed("Successfully enabled OES_texture_half_float extension");
    return true;
}
</script>
</head>
<body onload='generateTest("RGBA", "HALF_FLOAT_OES", testPrologue)()'>
<canvas id="example" width="32" height="32"></canvas>
<div id="description"></div>
<div id="console"></div>
<video width="640" height="228" id="vid" controls>
  <source src="resources/red-green.mp4"  type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"' />
  <source src="resources/red-green.webmvp8.webm" type='video/webm; codecs="vp8, vorbis"' />
  <source src="resources/red-green.theora.ogv"  type='video/ogg; codecs="theora, vorbis"' />
</video>
</body>
</html>
