commit 23c25817adec45a2a1ff80a9749ac5bbb85dcdb1
parent 12379e41a7355ae839fb82db6b29a12a6d5883a6
Author: youennf <youennf@users.noreply.github.com>
Date: Fri, 19 Dec 2025 09:31:36 +0000
Bug 1991140 [wpt PR 55100] - Limit the events fired by a stopped MediaRecorder in case of change of track states, a=testonly
Automatic update from web-platform-tests
Limit the events fired by a stopped MediaRecorder in case of change of track states (#55100)
* Limit the events fired by a stopped MediaRecorder in case of change of track states
Export of WebKit PR, see https://bugs.webkit.org/show_bug.cgi?id=299601
* Use stop as end signal
--
wpt-commits: dfd8cd1a74cff749fd5af750dce63f3fcbc8d8f1
wpt-pr: 55100
Diffstat:
1 file changed, 68 insertions(+), 0 deletions(-)
diff --git a/testing/web-platform/tests/mediacapture-record/MediaRecorder-stop.html b/testing/web-platform/tests/mediacapture-record/MediaRecorder-stop.html
@@ -220,6 +220,74 @@
assertSequenceIn(events, ["start", "dataavailable", "stop"]);
}, "MediaRecorder will fire only start and stop events in a basic recording flow.");
+ promise_test(async t => {
+ const {stream} = createFlowingAudioVideoStream(t);
+ const audioTrack = stream.getAudioTracks()[0];
+ const videoTrack = stream.getVideoTracks()[0];
+ t.add_cleanup(() => {
+ audioTrack.stop();
+ videoTrack.stop();
+ });
+ const recorder = new MediaRecorder(stream);
+
+ let resolve;
+ const promise = new Promise((resolve_, reject) => {
+ resolve = resolve_;
+ t.step_timeout(() => reject("stop event time out"), 2000);
+ });
+
+ let events = [];
+ recorder.onstart = () => events.push("start");
+ recorder.onstop = () => {
+ events.push("stop");
+ resolve();
+ }
+ recorder.onerror = () => events.push("error");
+ recorder.ondataavailable = ()=> events.push("data");
+
+ recorder.start();
+ await new Promise(resolve => t.step_timeout(resolve, 0));
+
+ stream.removeTrack(stream.getAudioTracks()[0]);
+ recorder.stop();
+ await promise;
+ assert_array_equals(events, ["start", "data", "stop"]);
+ }, "MediaRecorder will not fire an error event if a recorder is stopped synchronously after a track is removed");
+
+ promise_test(async t => {
+ const {stream} = createFlowingAudioVideoStream(t);
+ const audioTrack = stream.getAudioTracks()[0];
+ const videoTrack = stream.getVideoTracks()[0];
+ t.add_cleanup(() => {
+ audioTrack.stop();
+ videoTrack.stop();
+ });
+ const recorder = new MediaRecorder(stream);
+
+ let resolve;
+ const promise = new Promise((resolve_, reject) => {
+ resolve = resolve_;
+ t.step_timeout(() => reject("stop event time out"), 2000);
+ });
+
+ let events = [];
+ recorder.onstart = ()=> events.push("start");
+ recorder.onstop = () => {
+ events.push("stop");
+ resolve();
+ }
+ recorder.onerror = ()=> events.push("error");
+ recorder.ondataavailable = ()=> events.push("data");
+
+ recorder.start();
+ await new Promise(resolve => t.step_timeout(resolve, 0));
+
+ audioTrack.stop();
+ videoTrack.stop();
+ recorder.stop();
+ await promise;
+ assert_array_equals(events, ["start", "data", "stop"]);
+ }, "MediaRecorder will not fire an error event if a recorder is stopped synchronously after all tracks are ended");
</script>
</body>
</html>