diff options
Diffstat (limited to 'dom/canvas/test/webgl-conf/checkout/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html')
-rw-r--r-- | dom/canvas/test/webgl-conf/checkout/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html b/dom/canvas/test/webgl-conf/checkout/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html new file mode 100644 index 0000000000..2c6a118cc1 --- /dev/null +++ b/dom/canvas/test/webgl-conf/checkout/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html @@ -0,0 +1,146 @@ +<!-- +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> |