commit 02f62b103e97ac3e3f9cfd3ee747de5f7d5a8e54
parent 5dafdf8873c60bd49d3d905bdb44654502177409
Author: Karl Tomlinson <karlt+@karlt.net>
Date: Wed, 19 Nov 2025 18:49:02 +0000
Bug 1692675 - Wait for "dataavailable" event before stopping MediaRecorder r=pehrsons
Previously, calling stop() on "start" would sometimes produce "dataavailable"
with no frames, which would not produce the expected red color.
This also showed up as bug 1692389 and bug 1692913.
Differential Revision: https://phabricator.services.mozilla.com/D273171
Diffstat:
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/dom/ipc/tests/test_temporaryfile_stream.html b/dom/ipc/tests/test_temporaryfile_stream.html
@@ -20,10 +20,11 @@ function startTest() {
// eslint-disable-next-line no-undef
var helper = new CaptureStreamTestHelper2D(100, 100);
helper.drawColor(canvas, helper.red);
+ // Draw repeatedly to speed up delivery of the first "dataavailable" event.
+ let drawing =
+ helper.startDrawing(helper.drawColor.bind(helper, canvas, helper.red));
- var stream = canvas.captureStream(0);
-
- var blob;
+ var stream = canvas.captureStream();
let mediaRecorder = new MediaRecorder(stream);
is(mediaRecorder.stream, stream,
@@ -33,20 +34,21 @@ function startTest() {
mediaRecorder.onerror = () => ok(false, "Recording failed");
- mediaRecorder.ondataavailable = ev => {
- is(blob, undefined, "Should only get one dataavailable event");
- blob = ev.data;
- };
-
mediaRecorder.onstart = () => {
info("Got 'start' event");
- // We just want one frame encoded, to see that the recorder produces something readable.
- mediaRecorder.stop();
};
mediaRecorder.onstop = () => {
info("Got 'stop' event");
- ok(blob, "Should have gotten a data blob");
+ }
+
+ mediaRecorder.ondataavailable = ev => {
+ info("Got 'dataavailable' event");
+ // We just want one frame encoded, to see that the recorder produces something readable.
+ mediaRecorder.stop();
+ mediaRecorder.ondataavailable = null;
+ drawing.stop();
+
var xhr = new XMLHttpRequest();
xhr.open("POST", "blob_verify.sjs", true);
xhr.onload = () => {
@@ -69,10 +71,10 @@ function startTest() {
SimpleTest.finish();
};
xhr.responseType = "blob";
- xhr.send(blob);
+ xhr.send(ev.data);
};
- mediaRecorder.start();
+ mediaRecorder.start(1);
is(mediaRecorder.state, "recording", "Media recorder should be recording");
}