fune/dom/media/tests/mochitest/test_getUserMedia_GC_MediaStream.html
Razvan Maries 717d9a23ba Backed out 2 changesets (bug 1665713) for Lint failure on NetworkPreparationChromeScript.js. CLOSED TREE
Backed out changeset e926364f5d4f (bug 1665713)
Backed out changeset ad03f6f54321 (bug 1665713)
2020-09-24 22:59:53 +03:00

59 lines
1.8 KiB
HTML

<!DOCTYPE HTML>
<html>
<head>
<script type="application/javascript" src="mediaStreamPlayback.js"></script>
</head>
<body>
<pre id="test">
<script type="application/javascript">
"use strict";
createHTML({
title: "MediaStreams can be garbage collected",
bug: "1407542"
});
let SpecialStream = SpecialPowers.wrap(MediaStream);
async function testGC(stream, numCopies, copy) {
let startStreams = await SpecialStream.countUnderlyingStreams();
let copies = new Array(numCopies).fill(0).map(() => copy(stream));
ok(await SpecialStream.countUnderlyingStreams() > startStreams,
"MediaStreamTrack constructor creates more underlying streams");
copies = [];
await new Promise(r => SpecialPowers.exactGC(r));
is(await SpecialStream.countUnderlyingStreams(), startStreams,
"MediaStreamTracks should have been collected");
}
runTest(async () => {
// We do not need LoopbackTone because it is not used
// and creates extra streams that affect the result
DISABLE_LOOPBACK_TONE = true;
let gUMStream = await getUserMedia({video: true});
info("Testing GC of track-array constructor with cloned tracks");
await testGC(gUMStream, 10, s => new MediaStream(s.getTracks().map(t => t.clone())));
info("Testing GC of empty constructor plus addTrack with cloned tracks");
await testGC(gUMStream, 10, s => {
let s2 = new MediaStream();
s.getTracks().forEach(t => s2.addTrack(t.clone()));
return s2;
});
info("Testing GC of cloned stream");
await testGC(gUMStream, 10, s => s.clone());
info("Testing GC of gUM stream");
gUMStream = null;
await new Promise(r => SpecialPowers.exactGC(r));
is(await SpecialStream.countUnderlyingStreams(), 0,
"Original gUM stream should be collectable");
});
</script>
</pre>
</body>
</html>