mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-22 17:55:50 +00:00
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:
parent
5619da0f25
commit
d522cadd73
@ -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>
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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');
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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],
|
||||
]});
|
||||
|
||||
|
@ -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();
|
||||
};
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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');
|
||||
|
Loading…
Reference in New Issue
Block a user