blob: f960ae2e3bc0775e54b85c29fbf1b30709e24b45 [file] [log] [blame]
<!DOCTYPE html>
<html>
<body>
<canvas id="canvas" width=100 height=100></div>
<script src="../../resources/js-test-pre.js"></script>
<script>
window.jsTestIsAsync = true;
if (window.internals)
internals.settings.setAnimatedImageDebugCanvasDrawingEnabled(true);
var imageData;
function loadImage(src) {
return new Promise(resolve => {
let image = new Image;
image.src = src;
return image.decode().then(() => { resolve(image); });
});
}
async function testImage(image, colors, frameRate)
{
let canvas = document.getElementById('canvas');
var previousValue = null;
while (colors.length) {
let color = colors.shift();
previousValue = await shouldBecome(image, canvas, color, previousValue, frameRate);
}
}
function shouldBecome(image, canvas, color, previousValue, frameRate)
{
return new Promise(resolve => {
let referenceData = colorToImageData(color);
var test = () => {
let context = canvas.getContext('2d');
context.drawImage(image, 0, 0, canvas.width, canvas.height);
let imageData = context.getImageData(0, 0, 1, 1).data;
if (arraysAreApproximatelyEqual(imageData, referenceData, 2)) {
testPassed(`Image eventually became ${ color }`);
resolve(imageData);
return;
}
if (previousValue && !arraysAreApproximatelyEqual(imageData, previousValue, 2)) {
testFailed(`Image changed to an unexpected value (was ${ imageData.toString() }, expected ${ color })`);
resolve(imageData);
return;
}
setTimeout(test, 1000 / frameRate);
};
test();
});
}
function colorToImageData(color)
{
let canvas = document.createElement('canvas');
canvas.width = 1;
canvas.height = 1;
let context = canvas.getContext('2d');
context.fillStyle = color;
context.fillRect(0, 0, 1, 1);
return context.getImageData(0, 0, 1, 1).data;
}
function arraysAreApproximatelyEqual(test, target, tolerance)
{
if (test.length != target.length)
return false;
for (let i = 0; i < test.length; ++i) {
if (Math.abs(test[i] - target[i]) > tolerance)
return false;
}
return true;
}
function endTest() {
finishJSTest();
if (window.testRunner)
testRunner.notifyDone();
}
description('Test that an mp4 media file loaded as an image can be painted in a canvas.')
loadImage("resources/animated-red-green-blue.mp4").then(image => {
testImage(image, ['red', 'green', 'blue', 'red', 'green', 'blue', 'red'], 100).then(endTest, endTest);
});
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>