<!--
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>WebGL2 Origin Restrictions Conformance Tests for OffscreenCanvas</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>
<div id="description"></div>
<div id="console"></div>
<canvas id="canvas"></canvas>
<img id="img" style="display:none;">
<script>
"use strict";
var wtu = WebGLTestUtils;

// Checks if function throws an exception.
function causedException(func) {
  var hadException = false;
  try {
    func();
  } catch(e) {
    hadException = true;
  }
  return hadException;
}

var defaultImgUrl = "https://get.webgl.org/conformance-resources/opengl_logo.jpg";
var localImgUrl = "../../../resources/opengl_logo.jpg";

var imgDomain;
var pageDomain;

function imageLoaded(img) {
  description("This test ensures WebGL2 implementations for OffscreenCanvas follow proper same-origin restrictions.");

  if (!window.OffscreenCanvas) {
    testPassed("No OffscreenCanvas support");
    finishTest();
    return;
  }

  assertMsg(img.width > 0 && img.height > 0, "img was loaded");
  imgDomain = wtu.getBaseDomain(wtu.getHost(img.src));
  pageDomain = wtu.getBaseDomain(window.location.host);
  assertMsg(imgDomain != pageDomain,
            "img domain (" + imgDomain + ") and page domain (" + pageDomain + ") are not the same.");

  function makeTexImage2D(gl, src) {
    return function() {
      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 10, 10, 0, gl.RGBA, gl.UNSIGNED_BYTE, src);
    };
  }

  function makeTexSubImage2D(gl, src) {
    return function() {
      gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 10, 10, gl.RGBA, gl.UNSIGNED_BYTE, src);
    };
  }

  function makeTexImage3D(gl, src) {
    return function() {
      gl.texImage3D(gl.TEXTURE_3D, 0, gl.RGBA, 10, 10, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, src);
    };
  }

  function makeTexSubImage3D(gl, src) {
    return function() {
      gl.texSubImage3D(gl.TEXTURE_3D, 0, 0, 0, 0, 10, 10, 1, gl.RGBA, gl.UNSIGNED_BYTE, src);
    };
  }

  function makeReadPixels(gl) {
    return function() {
      var buf = new Uint8Array(4);
      gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buf);
    };
  }

  var offscreencanvas = new OffscreenCanvas(10, 10);
  var gl = wtu.create3DContext(offscreencanvas, null, 2);

  debug("");
  debug("check that an attempt to upload an image from another origin throws an exception.");
  var tex = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_2D, tex);
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 256, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
  assertMsg(causedException(makeTexImage2D(gl, img)),
            "texImage2D with cross-origin image should throw exception.");
  assertMsg(causedException(makeTexSubImage2D(gl, img)),
            "texSubImage2D with cross-origin image should throw exception.");
  assertMsg(causedException(makeTexImage3D(gl, img)),
            "texImage3D with cross-origin image should throw exception.");
  assertMsg(causedException(makeTexSubImage3D(gl, img)),
            "texSubImage3D with cross-origin image should throw exception.");


  debug("check that readPixels continues to work against this offscreencanvas.");
  assertMsg(!causedException(makeReadPixels(gl)),
            "readPixels should never throw exception -- not possible to dirty origin of WebGL2 canvas.");

  debug("check that an attempt to upload a tainted canvas throws an exception.");
  var canvas = document.getElementById("canvas");
  var ctx2d = canvas.getContext("2d");
  ctx2d.drawImage(img, 0, 0);
  assertMsg(causedException(makeTexImage2D(gl, canvas)),
            "texImage2D with NON origin clean canvas should throw exception.");
  assertMsg(causedException(makeTexSubImage2D(gl, canvas)),
            "texSubImage2D with NON origin clean canvas should throw exception.");
  assertMsg(causedException(makeTexImage3D(gl, canvas)),
            "texImage3D with NON origin clean canvas should throw exception.");
  assertMsg(causedException(makeTexSubImage3D(gl, canvas)),
            "texSubImage3D with NON origin clean canvas should throw exception.");

  debug("check that readPixels continues to work against this offscreencanvas.");
  assertMsg(!causedException(makeReadPixels(gl)),
            "readPixels should never throw exception -- not possible to dirty origin of WebGL2 canvas.");

  // TODO: Should check video.
  // TODO: Should check CORS support.

  finishTest();
}

(async function() {
  const img = document.getElementById('img');
  try {
    await wtu.awaitOrTimeout(wtu.loadCrossOriginImage(img, defaultImgUrl, localImgUrl), 1000);
  } catch (e) {
    testFailed(`Image setup failed (${e}).`);
    finishTest();
    return;
  }
  imageLoaded(img);
})();
</script>
</body>
</html>
