<!--
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>WebGL 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 WebGL 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, gl.RGBA, gl.UNSIGNED_BYTE, src);
    };
  }

  function makeTexSubImage2D(gl, src) {
    return function() {
      gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 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);

  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.");

  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 WebGL 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.");

  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 WebGL 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));
  } catch (e) {
    testFailed(`Image setup failed (${e}).`);
    finishTest();
    return;
  }
  imageLoaded(img);
})();
</script>
</body>
</html>
