fune/dom/media/test/test_streams_element_capture.html
Narcis Beleuzu e3df66c4e8 Backed out 14 changesets (bug 1860492) for mda failure on test_closing_connections
Backed out changeset 9b8435c1c982 (bug 1860492)
Backed out changeset 08603e5ea8a0 (bug 1860492)
Backed out changeset 93086bc64d37 (bug 1860492)
Backed out changeset f8cbb9933469 (bug 1860492)
Backed out changeset f5e2a92235f1 (bug 1860492)
Backed out changeset 0038d6d54690 (bug 1860492)
Backed out changeset 24a1fb93d4a8 (bug 1860492)
Backed out changeset c2c11ee3f79f (bug 1860492)
Backed out changeset 9983c1ddee85 (bug 1860492)
Backed out changeset b9286e049dea (bug 1860492)
Backed out changeset d1d98783c88d (bug 1860492)
Backed out changeset 22dd17861e80 (bug 1860492)
Backed out changeset 7d823668fba7 (bug 1860492)
Backed out changeset 024863677345 (bug 1860492)
2024-04-04 01:43:26 +03:00

125 lines
3.8 KiB
HTML

<!DOCTYPE HTML>
<html>
<head>
<title>Test that a MediaStream captured from one element plays back in another</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
<script type="text/javascript" src="manifest.js"></script>
</head>
<body>
<pre id="test">
<script class="testbody" type="text/javascript">
const manager = new MediaTestManager();
function checkDrawImage(vout, msg) {
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");
ctx.drawImage(vout, 0, 0);
const imgData = ctx.getImageData(0, 0, 1, 1);
is(imgData.data[3], 255, msg);
}
function maybeTodoGreaterThanOrEqual(a, b, msg) {
const isExpected = a >= b;
(isExpected ? ok : todo)(
isExpected,
`Got ${a}, expected at least ${b}; ${msg}`
);
}
async function startTest(test, token) {
manager.started(token);
const v = document.createElement('video');
const vout = document.createElement('video');
v.token = token;
v.id = "MediaDecoder";
vout.id = "MediaStream";
document.body.appendChild(vout);
// Log events for debugging.
const events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata",
"loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort",
"waiting", "pause"];
function logEvent(e) {
Log(token, `${e.target.id} got ${e.type}`);
}
for (const e of events) {
v.addEventListener(e, logEvent);
vout.addEventListener(e, logEvent);
};
v.src = test.name;
v.preload = 'metadata';
await new Promise(r => v.onloadedmetadata = r);
const stream = v.mozCaptureStreamUntilEnded();
vout.srcObject = stream;
is(vout.srcObject, stream,
`${token} set output element .srcObject correctly`);
isnot(stream.getTracks().length, 0, `${token} results in some tracks`);
const hadVideoTracks = stream.getVideoTracks().length >= 1;
// Wait for the resource fetch algorithm to have run, so that the media
// element is hooked up to the MediaStream and ready to go. If we don't do
// this, we're not guaranteed to render the very first video frame, which
// can make this test fail the drawImage test when a video resource only
// contains one frame.
await new Promise(r => vout.onloadstart = r);
v.play();
vout.play();
await Promise.race([
Promise.all([
new Promise(r => vout.onended = r),
new Promise(r => v.onended = r),
]),
new Promise((res, rej) => vout.onerror = () => rej(new Error(vout.error.message))),
new Promise((res, rej) => v.onerror = () => rej(new Error(v.error.message))),
]);
let duration = test.duration;
if (typeof(test.contentDuration) == "number") {
duration = test.contentDuration;
}
if (duration) {
// Unexpected results are tracked in bug 1839502
maybeTodoGreaterThanOrEqual(vout.currentTime, duration,
`${token} current time at end`);
}
is(vout.readyState, vout.HAVE_CURRENT_DATA,
`${token} checking readyState`);
ok(vout.ended, `${token} checking playback has ended`);
if (hadVideoTracks) {
ok(test.type.match(/^video/), `${token} is a video resource`);
checkDrawImage(vout, `${token} checking video frame pixel has been drawn`);
}
vout.remove();
removeNodeAndSource(v);
}
(async () => {
SimpleTest.requestCompleteLog();
SimpleTest.waitForExplicitFinish();
await SpecialPowers.pushPrefEnv(
{ "set": [
["privacy.reduceTimerPrecision", false],
]});
let tests = gPlayTests;
// Filter out bug1377278.webm due to bug 1541401.
tests = tests.filter(t => !t.name.includes("1377278"));
manager.runTests(tests, async (test, token) => {
try {
await startTest(test, token);
} catch(e) {
ok(false, `Caught exception for ${token}: ${e}`);
}
manager.finished(token);
});
})();
</script>
</pre>
</body>
</html>