blob: 3c8df0ecca71807fca33b6d9aca5a9aef059da1f [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../resources/js-test-pre.js"></script>
</head>
<body>
<canvas id="sourceCanvas" width="100" height="100"></canvas>
<canvas id="dataURLSynchronousCanvas" width="100" height="100"></canvas>
<canvas id="dataURLAsynchronousCanvas" width="100" height="100"></canvas>
<canvas id="sameDomainSynchronousCanvas" width="100" height="100"></canvas>
<canvas id="sameDomainAsynchronousCanvas" width="100" height="100"></canvas>
<canvas id="crossDomainSynchronousCanvas" width="100" height="100"></canvas>
<canvas id="crossDomainAsynchronousCanvas" width="100" height="100"></canvas>
<script>
function drawCanvasBackground(id, color) {
var canvas = document.getElementById(id);
var context = canvas.getContext("2d");
context.fillStyle = color;
context.fillRect(0, 0, 100, 100);
return context;
}
function incrementLoadedImagesCount() {
if (typeof incrementLoadedImagesCount.counter == 'undefined')
incrementLoadedImagesCount.counter = 0;
if (++incrementLoadedImagesCount.counter == 4)
finishJSTest();
}
function drawAndGetImageDataSynchronous(id, imageSrc, shouldTaint) {
var context = drawCanvasBackground(id, '#f00'); // red
var image = new Image();
image.src = imageSrc;
context.drawImage(image, 0, 0);
try {
var pixels = new Uint32Array(context.getImageData(0, 0, 1, 1).data.buffer);
if (pixels[0] == 0xFF0000FF)
debug(shouldTaint ? "Tainting works correctly." : "Tainting works incorrectly.");
else
debug(shouldTaint ? "Tainting works incorrectly." : "Tainting works correctly.");
}
catch (error) {
debug(shouldTaint ? "Tainting works correctly." : "Tainting works incorrectly.");
}
incrementLoadedImagesCount();
}
function drawAndGetImageDataAsynchronous(canvasId, imageSrc, shouldTaint) {
var context = drawCanvasBackground(canvasId, '#f00'); // red
var image = new Image();
image.onload = function() {
context.drawImage(image, 0, 0);
try {
var pixels = new Uint32Array(context.getImageData(0, 0, 1, 1).data.buffer);
debug(shouldTaint ? "Tainting works incorrectly." : "Tainting works correctly.");
}
catch (error) {
debug(shouldTaint ? "Tainting works correctly." : "Tainting works incorrectly.");
}
incrementLoadedImagesCount();
}
image.src = imageSrc;
}
window.jsTestIsAsync = true;
drawCanvasBackground("sourceCanvas", '#0f0'); // green
// The dataURL and same-domain images should not be tainted. We should always be
// able to get the image data regardless whether it is drawn or not. But because
// we ask for the image data right after we load the image, we do not know the
// pixels values. So the synchronous case can't be tested.
drawAndGetImageDataAsynchronous("dataURLAsynchronousCanvas", sourceCanvas.toDataURL(), false);
drawAndGetImageDataAsynchronous("sameDomainAsynchronousCanvas", "http://127.0.0.1:8000/canvas/resources/100x100-lime-rect.svg", false);
// Cross domain image load should taint the canvas. The image should not be drawn
// so the synchronous case can be tested since we know the canvas pixel value.
drawAndGetImageDataSynchronous("crossDomainSynchronousCanvas", "http://localhost:8000/canvas/resources/100x100-lime-rect.svg", true);
drawAndGetImageDataAsynchronous("crossDomainAsynchronousCanvas", "http://localhost:8000/canvas/resources/100x100-lime-rect.svg", true);
</script>
<script src="../resources/js-test-post.js"></script>
</body>
</html>