881c16894f732098ba8e303749b8fa279c2e8b7b
[gecko.git] / test_getUserMedia_trackEnded.html
blob881c16894f732098ba8e303749b8fa279c2e8b7b
1 <!DOCTYPE HTML>
2 <html>
3 <head>
4 <script type="application/javascript" src="mediaStreamPlayback.js"></script>
5 </head>
6 <body>
7 <pre id="test">
8 <iframe id="iframe" srcdoc="
9 <script type='application/javascript'>
10 document.gUM = (constraints, success, failure) =>
11 navigator.mediaDevices.getUserMedia(constraints).then(success, failure);
12 </script>">
13 </iframe>
14 <script type="application/javascript">
15 "use strict";
17 createHTML({
18 title: "getUserMedia MediaStreamTrack 'ended' event on navigating",
19 bug: "1208373",
20 });
22 runTest(() => {
23 let iframe = document.getElementById("iframe");
24 let stream;
25 // We're passing callbacks into a method in the iframe here, because
26 // a Promise created in the iframe is unusable after the iframe has
27 // navigated away (see bug 1269400 for details).
28 return new Promise((resolve, reject) =>
29 iframe.contentDocument.gUM({audio: true, video: true}, resolve, reject))
30 .then(s => {
31 // We're cloning a stream containing identical tracks (an original
32 // and its clone) to test that ended works both for originals
33 // clones when they're both owned by the same MediaStream.
34 // (Bug 1274221)
35 stream = new MediaStream([].concat(s.getTracks(), s.getTracks())
36 .map(t => t.clone())).clone();
37 var allTracksEnded = Promise.all(stream.getTracks().map(t => {
38 info("Set up ended handler for track " + t.id);
39 return haveEvent(t, "ended", wait(5000))
40 .then(event => {
41 info("ended handler invoked for track " + t.id);
42 is(event.target, t, "Target should be correct");
43 }, e => e ? Promise.reject(e)
44 : ok(false, "ended event never raised for track " + t.id));
45 }));
46 stream.getTracks().forEach(t =>
47 is(t.readyState, "live",
48 "Non-ended track should have readyState 'live'"));
49 iframe.srcdoc = "";
50 info("iframe has been reset. Waiting for tracks to end.");
51 return allTracksEnded;
53 .then(() => stream.getTracks().forEach(t =>
54 is(t.readyState, "ended",
55 "Ended track should have readyState 'ended'")));
56 });
57 </script>
58 </pre>
59 </body>
60 </html>