blob: 6179d7f25fc6bf530ec7520b4a0b40e011cdf152 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="../../resources/platform-helper.js"></script>
</head>
<body onload="start()">
<p id="description"></p>
<div id="console"></div>
<video controls width="680" height="360"></video>
<canvas width="680" height="360"></canvas>
<script>
let canvas;
let context;
let mediaStream;
let video;
let buffer;
let timeout;
function updateWatchdog()
{
if (timeout)
clearTimeout(timeout);
timeout = setTimeout(() => {
console.log("Test took too long, timing out!");
finishJSTest();
}, 30000);
}
function canvasShouldBeBlack()
{
return !mediaStream.getVideoTracks()[0].enabled;
}
function attempt(numberOfTries, call, callback)
{
if (numberOfTries <= 0) {
testFailed('Pixel check did not succeed after multiple tries.');
return;
}
let attemptSucceeded = call();
if (attemptSucceeded) {
testPassed(canvasShouldBeBlack() ? 'pixel was black.' : 'pixel was white.');
callback();
return;
}
setTimeout(() => { attempt(--numberOfTries, call, callback); }, 50);
}
function repeatWithVideoPlayingAndFinishTest()
{
if (video.paused) {
debug('<br> ===== play video =====');
evalAndLog('video.play()');
beginTestRound();
} else {
debug('');
video.pause();
if (timeout)
clearTimeout(timeout);
finishJSTest();
}
}
function reenableTrack()
{
mediaStream.getVideoTracks()[0].enabled = true;
updateWatchdog();
debug(`<br> === video track reenabled, should render current frame ===`);
// The video is not guaranteed to render non-black frames before the canvas is drawn to and the pixels are checked.
// A timeout is used to ensure that the pixel check is done after the video renders non-black frames.
attempt(10, checkPixels, repeatWithVideoPlayingAndFinishTest);
}
function checkPixels()
{
context.clearRect(0, 0, canvas.width, canvas.height);
buffer = context.getImageData(30, 242, 1, 1).data;
if (!isPixelTransparent(buffer))
testFailed('pixel was not transparent after clearing canvas.');
context.drawImage(video, 0, 0, canvas.width, canvas.height);
buffer = context.getImageData(30, 242, 1, 1).data;
if (!canvasShouldBeBlack())
return isPixelWhite(buffer);
else
return isPixelBlack(buffer);
}
function disableAllTracks()
{
mediaStream.getVideoTracks()[0].enabled = false;
updateWatchdog();
debug('<br> === all video tracks disabled ===');
// The video is not guaranteed to render black frames before the canvas is drawn to and the pixels are checked.
// A timeout is used to ensure that the pixel check is done after the video renders black frames.
attempt(10, checkPixels, reenableTrack);
}
function beginTestRound()
{
updateWatchdog();
debug('<br> === beginning round of pixel tests ===');
attempt(10, checkPixels, disableAllTracks);
}
function canplay()
{
canvas = document.querySelector('canvas');
context = canvas.getContext('2d');
beginTestRound();
}
function start()
{
description("Tests that re-enabling a video MediaStreamTrack when all tracks were previously disabled causes captured media to display.");
if (window.testRunner)
testRunner.setUserMediaPermission(true);
video = document.querySelector('video');
video.addEventListener('canplay', canplay);
updateWatchdog();
navigator.mediaDevices.getUserMedia({ video : true })
.then((stream) => {
mediaStream = stream;
testPassed('mediaDevices.getUserMedia generated a stream successfully.');
evalAndLog('video.srcObject = mediaStream');
});
}
window.jsTestIsAsync = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>