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