blob: 6c56bbff807630c7612ddfd93c43f74317e56411 [file] [log] [blame]
<pre id="console"></pre>
<script>
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
log = function(msg)
{
document.getElementById('console').appendChild(document.createTextNode(msg + "\n"));
}
testTexImage2D = function(gl, source, description)
{
description = "Calling texImage2D() with a tainted " + description;
try {
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
log("FAIL: " + description + " was allowed");
} catch (e) {
log("PASS: " + description + " was not allowed: Threw error: " + e + ".");
}
}
testReadPixels = function(gl, description)
{
description = "Calling readPixels() on a canvas where tainting was attempted by a " + description;
try {
var pixels = new Uint8Array(4);
gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
log("PASS: " + description + " was allowed.");
} catch (e) {
log("FAIL: " + description + " was not allowed - Threw error: " + e + ".");
}
}
testToDataURL = function(canvas, description)
{
description = "Calling toDataURL() on a canvas where tainting was attempted by a " + description;
try {
var dataURL = canvas.toDataURL();
log("PASS: " + description + " was allowed.");
} catch (e) {
log("FAIL: " + description + " was not allowed - Threw error: " + e + ".");
}
}
test = function(canvas, description)
{
testReadPixels(canvas.getContext("experimental-webgl"), description);
testToDataURL(canvas, description);
}
var image = new Image();
image.onload = function() {
var canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;
var gl = canvas.getContext("experimental-webgl");
// Control tests
log("Untainted canvas:");
try {
var pixels = new Uint8Array(4);
gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
log("PASS: Calling readPixels() from an untainted canvas was allowed.");
} catch (e) {
log("FAIL: Calling readPixels() from an untainted canvas was not allowed: Threw error: " + e + ".");
}
try {
var dataURL = canvas.toDataURL();
log("PASS: Calling toDataURL() on an untainted canvas was allowed.");
} catch (e) {
log("FAIL: Calling toDataURL() on an untainted canvas was not allowed: Threw error: " + e + ".");
}
log("\n");
log("Tainted canvas:");
// Test reading from a canvas after uploading a remote image as a texture
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
testTexImage2D(gl, image, "image");
test(canvas, "remote image");
var dirtyCanvas = canvas;
// Now test reading from a canvas after drawing a tainted canvas onto it
var dirtyCanvas = document.createElement("canvas");
dirtyCanvas.width = 100;
dirtyCanvas.height = 100;
var dirtyContext = dirtyCanvas.getContext("2d");
dirtyContext.drawImage(image, 0, 0, 100, 100);
testTexImage2D(gl, dirtyCanvas, "canvas");
test(canvas, "tainted canvas");
if (window.testRunner)
testRunner.notifyDone();
}
// Notice that we forget to set the image.crossOrigin property!
image.src = "http://localhost:8000/security/resources/abe-allow-star.php";
</script>