4 <script type=
"application/javascript" src=
"mediaStreamPlayback.js"></script>
8 <iframe id=
"iframe" srcdoc=
"
9 <script type='application/javascript'>
10 document.gUM = (constraints, success, failure) =>
11 navigator.mediaDevices.getUserMedia(constraints).then(success, failure);
14 <script type=
"application/javascript">
18 title:
"getUserMedia MediaStreamTrack 'ended' event on navigating",
23 let iframe = document.getElementById(
"iframe");
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))
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.
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))
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));
46 stream.getTracks().forEach(t =
>
47 is(t.readyState,
"live",
48 "Non-ended track should have readyState 'live'"));
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'")));