146 lines
4.3 KiB
HTML
146 lines
4.3 KiB
HTML
<!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> |