<script>

if (window.testRunner)
    window.testRunner.dumpAsText();

window.addEventListener("load", function () {
    let width = 5000;
    let height = 5000;
    let canvas = document.querySelector("canvas");
    canvas.width = width;
    canvas.height = height;
    canvas.style.width = width + 'px';
    canvas.style.height = height + 'px';
    let gl = canvas.getContext("webgl");
    let program = gl.createProgram();
    let buffer = gl.createBuffer();
    let vertices = new Float32Array([-1, -1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1]);
    let draw = function() {
        gl.viewport(0, 0, width, height);
        gl.drawArrays(gl.TRIANGLES, 0, 6);
    };
    let compileShader = function(kind, source) {
        let shader = gl.createShader(kind);
        gl.shaderSource(shader, source);
        gl.compileShader(shader);
        gl.attachShader(program, shader);
    };
    compileShader(gl.VERTEX_SHADER, "attribute vec4 v; void main() { gl_Position = v; }");
    compileShader(gl.FRAGMENT_SHADER, `precision mediump float;
      void main() {
        vec2 v = gl_FragCoord.xy;
        v = fract(v*0.5);
        gl_FragColor = vec4(v,0,1);
      }`);
    gl.linkProgram(program);
    gl.useProgram(program);
    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
    gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
    gl.enableVertexAttribArray(0);
    draw();

    let original = document.getElementById("original");
    original.textContent = `${gl.drawingBufferWidth} x ${gl.drawingBufferHeight}`;

    width = 5001;
    height = 5001;
    canvas.width = width;
    canvas.height = height;
    canvas.style.width = width + 'px';
    canvas.style.height = height + 'px';
    draw();

    let resized = document.getElementById("resized");
    resized.textContent = `${gl.drawingBufferWidth} x ${gl.drawingBufferHeight}`;
}, false);
</script>
<p>Original drawing buffer: <span id="original"></span></p>
<p>Resized drawing buffer: <span id="resized"></span></p>
<canvas></canvas>
