Bug 1512175 - Adapt mochitests to spec compliant mime type handling. r=jib

Differential Revision: https://phabricator.services.mozilla.com/D17812

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Andreas Pehrson 2019-10-03 22:10:11 +00:00
parent 5619da0f25
commit d522cadd73
11 changed files with 59 additions and 99 deletions

View File

@ -9,65 +9,33 @@
<body>
<pre id="test">
<script class="testbody" type="text/javascript">
function startTest() {
// the expect sequence should be
// 1. onerror
// 2. ondataavailable
// 3. onstop
var callbackStep = 0;
var stream = new AudioContext().createMediaStreamDestination().stream;
var mediaRecorder = new MediaRecorder(stream);
mediaRecorder.onerror = function (e) {
is(callbackStep, 0, 'should fired onstop callback');
is(e.error.name, 'UnknownError', 'error name should be UnknownError');
ok(e.error.stack.includes('test_mediarecorder_creation_fail.html'),
'Events fired from onerror should include an error with a stack trace indicating ' +
'an error in this test');
is(mediaRecorder.mimeType, '', 'mimetype should be empty');
is(mediaRecorder.state, 'inactive', 'state is inactive');
info('onerror callback fired');
callbackStep = 1;
};
mediaRecorder.onwarning = function () {
ok(false, 'Unexpected onwarning callback fired');
};
mediaRecorder.onstop = function () {
info('onstop callback fired');
is(mediaRecorder.state, 'inactive', 'state should be inactive');
is(callbackStep, 2, 'should fired onstop callback');
SimpleTest.finish();
};
// This handler fires every 250ms to generate a blob.
mediaRecorder.ondataavailable = function (evt) {
info('ondataavailable callback fired');
is(callbackStep, 1, 'should fired ondataavailable callback');
is(evt.data.size, 0, 'data size should be zero');
ok(evt instanceof BlobEvent,
'Events fired from ondataavailable should be BlobEvent');
is(evt.data.type, '', 'encoder start fail, blob mimeType should be empty');
callbackStep = 2;
};
// Start recording
mediaRecorder.start(250);
is(mediaRecorder.state, 'recording', 'Media recorder should be recording');
is(mediaRecorder.stream, stream,
'Media recorder stream = element stream at the start of recording');
function testThrows(stream, options) {
try {
new MediaRecorder(stream, options);
return false;
} catch {
return true;
}
}
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({
"set": [
(async () => {
SimpleTest.waitForExplicitFinish();
await SpecialPowers.pushPrefEnv({set: [
["media.ogg.enabled", false],
["media.encoder.webm.enabled", false],
],
}, startTest);
]});
const stream = new AudioContext().createMediaStreamDestination().stream;
ok(testThrows(stream, {mimeType: "audio/ogg"}),
"Creating an ogg recorder without ogg support throws");
ok(testThrows(stream, {mimeType: "audio/webm"}),
"Creating a webm recorder without webm support throws");
ok(testThrows(stream, {mimeType: "video/webm"}),
"Creating a webm recorder without webm support throws");
ok(testThrows(stream, {mimeType: "apa/bepa"}),
"Creating a recorder for a bogus mime type throws");
ok(testThrows(stream, {}),
"Creating a default recorder without any container support throws");
SimpleTest.finish();
})();
</script>
</pre>
</body>

View File

@ -20,9 +20,9 @@ async function startTest() {
// also do general checks on mimetype support for audio-only
ok(MediaRecorder.isTypeSupported("audio/ogg"),
'Should support audio/ogg');
ok(MediaRecorder.isTypeSupported('audio/ogg; codecs="opus"'),
ok(MediaRecorder.isTypeSupported('audio/ogg; codecs=opus'),
'Should support audio/ogg+opus');
ok(!MediaRecorder.isTypeSupported('audio/ogg; codecs="foobar"'),
ok(!MediaRecorder.isTypeSupported('audio/ogg; codecs=foobar'),
'Should not support audio/ogg + unknown_codec');
ok(MediaRecorder.isTypeSupported("video/webm"),
'Should support video/webm');
@ -31,7 +31,7 @@ async function startTest() {
try {
await setupGetUserMediaTestPrefs();
const expectedMimeType = 'video/webm; codecs="vp8,opus"';
const expectedMimeType = 'video/webm; codecs="vp8, opus"';
const stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
const [audioTrack] = stream.getAudioTracks();

View File

@ -26,7 +26,7 @@ function startTest() {
var stopTriggered = false;
var onstopTriggered = false;
dest.channelCount = 4;
var expectedMimeType = 'audio/ogg';
var expectedMimeType = 'audio/ogg; codecs=opus';
var totalBlobSize = 0;
source.channelCountMode = 'explicit';
source.connect(dest);
@ -51,15 +51,13 @@ function startTest() {
SimpleTest.finish();
};
mMediaRecorder.ondataavailable = function (e) {
if (mMediaRecorder.state == 'recording') {
ok(e.data.size > 0, 'check blob has data');
}
ok(e.data.size > 0, 'check blob has data');
totalBlobSize += e.data.size;
ok(totalBlobSize > 0, 'check the totalBlobSize');
is(e.data.type, expectedMimeType, 'blob should have expected mimetype');
is(mMediaRecorder.mimeType, expectedMimeType, 'recorder should have expected mimetype');
if (!stopTriggered) {
is(mMediaRecorder.mimeType, expectedMimeType, 'recorder should have expected mimetype');
mMediaRecorder.stop();
is(mMediaRecorder.mimeType, '', 'recorder should have reset its mimetype');
stopTriggered = true;
} else if (onstopTriggered) {
ok(false, 'ondataavailable should come before onstop event');

View File

@ -45,7 +45,8 @@ function startTest() {
};
mMediaRecorder.ondataavailable = function (e) {
if (mMediaRecorder.state == 'recording') {
is('audio/ogg', mMediaRecorder.mimeType, "check the record mimetype return " + mMediaRecorder.mimeType);
is(mMediaRecorder.mimeType, 'audio/ogg; codecs=opus', 'Expected MediaRecorder mimetype');
is(e.data.type, 'audio/ogg; codecs=opus', 'Expected Blob mimetype');
ok(e.data.size > 0, 'check blob has data');
mMediaRecorder.stop();
}

View File

@ -52,6 +52,7 @@ function setUpSource(contextType, nodeType) {
async function testRecord(source, mimeType) {
const isOffline = source.context instanceof OfflineAudioContext;
const recorder = new MediaRecorder(source, 0, {mimeType});
const extendedMimeType = `${mimeType || "audio/ogg"}; codecs=opus`;
is(recorder.mimeType, mimeType, "Mime type is set");
recorder.onwarning = () => ok(false, "should not fire onwarning");
@ -62,16 +63,14 @@ async function testRecord(source, mimeType) {
recorder.start(1000);
is("recording", recorder.state, "state should become recording after calling start()");
is(recorder.mimeType, extendedMimeType, "Mime type is fully defined");
const chunks = [];
let {data} = await new Promise(r => recorder.ondataavailable = r);
if (!isOffline) {
is(recorder.state, "recording", "Expected to still be recording");
}
is(data.type, recorder.mimeType, "Blob has recorder mimetype");
if (mimeType != "") {
is(data.type, mimeType, "Blob has given mimetype");
}
is(data.type, extendedMimeType, "Blob has fully defined mimetype");
isnot(data.size, 0, "should get data and its length should be > 0");
chunks.push(data);
@ -92,7 +91,7 @@ async function testRecord(source, mimeType) {
return new Blob(chunks, {type: chunks[0].type});
}
addLoadEvent(async function() {
addLoadEvent(async () => {
const src = setUpSource();
let didThrow = false;
try {
@ -102,7 +101,7 @@ addLoadEvent(async function() {
}
ok(didThrow, "MediaRecorder(AudioNode) should be hidden behind a pref");
await SpecialPowers.pushPrefEnv({"set": [
await SpecialPowers.pushPrefEnv({set: [
["media.recorder.audio_node.enabled", true],
]});

View File

@ -26,6 +26,7 @@ function startTest(test, token) {
element.stream = element.mozCaptureStream();
mMediaRecorder = new MediaRecorder(element.stream);
is(mMediaRecorder.mimeType, '', 'Expected MediaRecorder mimetype');
mMediaRecorder.onwarning = function() {
ok(false, 'onwarning unexpectedly fired');
};
@ -37,8 +38,8 @@ function startTest(test, token) {
mMediaRecorder.onstart = function() {
info('onstart fired successfully');
hasonstart = true;
// On audio only case, we produce audio/ogg as mimeType.
is('audio/ogg', mMediaRecorder.mimeType, "MediaRecorder mimetype as expected");
is(mMediaRecorder.mimeType, 'audio/ogg; codecs=opus',
"MediaRecorder mimetype as expected");
mMediaRecorder.requestData();
};

View File

@ -18,6 +18,7 @@ async function startTest() {
let stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
let dataAvailableCount = 0;
let onDataAvailableFirst = false;
const expectedMimeType = 'video/webm; codecs="vp8, opus"';
mediaRecorder = new MediaRecorder(stream);
is(mediaRecorder.stream, stream,
@ -44,9 +45,7 @@ async function startTest() {
'Event type should dataavailable');
ok(evt.data.size >= 0,
'Blob data size ' + evt.data.size + ' received is greater than or equal to zero');
is(mediaRecorder.mimeType, evt.data.type,
'Mime type in MediaRecorder and ondataavailable : '
+ mediaRecorder.mimeType + ' == ' + evt.data.type);
is(evt.data.type, expectedMimeType, 'Expected blob mime type');
// We'll stop recording upon the 1st blob being received
if (dataAvailableCount === 1) {
@ -76,6 +75,7 @@ async function startTest() {
mediaRecorder.start(250);
is(mediaRecorder.state, 'recording', 'Media recorder should be recording');
is(mediaRecorder.mimeType, expectedMimeType, 'Expected mime type');
} catch (err) {
ok(false, 'Unexpected error fired with: ' + err);
SimpleTest.finish();

View File

@ -19,7 +19,7 @@ var manager = new MediaTestManager;
*/
function startTest(test, token) {
var element = document.createElement('audio');
var expectedMimeType = test.type.substring(0, test.type.indexOf(';'));
var expectedMimeType = test.type;
element.token = token;
manager.started(token);
@ -28,7 +28,8 @@ function startTest(test, token) {
element.test = test;
element.stream = element.mozCaptureStreamUntilEnded();
var mediaRecorder = new MediaRecorder(element.stream);
var mediaRecorder =
new MediaRecorder(element.stream, {mimeType: expectedMimeType});
var onStopFired = false;
var onDataAvailableFired = false;
@ -73,19 +74,11 @@ function startTest(test, token) {
// The initialization of encoder can be cancelled.
// On some platforms, the stop method may run after media stream track
// available, so the blob can contain the header data.
if (evt.data.size > 0) {
is(evt.data.type, expectedMimeType,
'Blob data received and should have mime type');
is(mediaRecorder.mimeType, expectedMimeType,
'Media Recorder mime type in ondataavailable = ' + expectedMimeType);
} else if (evt.data.size === 0) {
is(mediaRecorder.mimeType, '',
'Blob data mime type is empty');
is(mediaRecorder.mimeType, '',
'Media Recorder mime type in ondataavailable is empty');
} else {
ok(false, 'Blob size can not be negative');
}
is(evt.data.type, expectedMimeType,
'Blob data received and should have mime type');
is(mediaRecorder.mimeType, expectedMimeType,
'Media Recorder mime type in ondataavailable = ' + expectedMimeType);
ok(evt.data.size >= 0, 'Blob size can not be negative');
// onstop should not have fired before ondataavailable
if (onStopFired) {

View File

@ -17,7 +17,7 @@ var manager = new MediaTestManager;
*/
function startTest(test, token) {
var element = document.createElement('audio');
var expectedMimeType = test.type.substring(0, test.type.indexOf(';'));
var expectedMimeType = test.type;
element.token = token;
manager.started(token);
@ -26,7 +26,8 @@ function startTest(test, token) {
element.test = test;
element.stream = element.mozCaptureStreamUntilEnded();
var mediaRecorder = new MediaRecorder(element.stream);
var mediaRecorder =
new MediaRecorder(element.stream, {mimeType: expectedMimeType});
var onStopFired = false;
var onDataAvailableFired = false;

View File

@ -17,9 +17,7 @@ function startTest() {
var recorder = new MediaRecorder(dest.stream);
var stopCount = 0;
var dataavailable = 0;
// mobile device may produce another format, but not landed.
// In audio only case, we should produce opus type.
var expectedMimeType = 'audio/ogg';
var expectedMimeType = 'audio/ogg; codecs=opus';
recorder.onstop = function (e) {
info('onstop fired');
is(recorder.stream, dest.stream,

View File

@ -17,7 +17,7 @@ var manager = new MediaTestManager;
*/
function startTest(test, token) {
var element = document.createElement('audio');
var expectedMimeType = test.type.substring(0, test.type.indexOf(';'));
var expectedMimeType = test.type;
element.token = token;
manager.started(token);
@ -31,7 +31,8 @@ function startTest(test, token) {
element.onloadedmetadata = null;
const stream = element.mozCaptureStream();
const mediaRecorder = new MediaRecorder(stream);
const mediaRecorder =
new MediaRecorder(stream, {mimeType: expectedMimeType});
mediaRecorder.onerror = function () {
ok(false, 'Unexpected onerror callback fired');