<!DOCTYPE html>
<script src=../../resources/testharness.js></script>
<script src=../../resources/testharnessreport.js></script>
<script>
// This test attempts to save and verify MediaStream data in the
// ondataavailable event handler of MediaRecorder.
var checkStreamTracks = function(stream, has_video, has_audio) {
if (has_video) {
assert_equals(stream.getVideoTracks().length, 1);
assert_equals(stream.getVideoTracks()[0].readyState, 'live');
} else {
assert_equals(stream.getVideoTracks().length, 0);
}
if (has_audio) {
assert_equals(stream.getAudioTracks().length, 1);
assert_equals(stream.getAudioTracks()[0].readyState, 'live');
} else {
assert_equals(stream.getAudioTracks().length, 0);
}
};
var makeAsyncTest = function(value, expected) {
var recorder;
async_test(function(test) {
var lastTimestamp = NaN;
const recorderOnDataAvailable = this.step_func(function(event) {
// TODO(mcasas): Let the test record for a while.
// TODO(mcasas): Consider storing recorded data and playing it back.
if (!isNaN(lastTimestamp)) {
assert_greater_than(event.timecode, lastTimestamp,
"timecode must be increasing");
}
lastTimestamp = event.timecode;
if (recorder.state == "recording") {
recorder.onstop = recorderOnStopExpected;
recorder.stop();
}
});
const recorderOnStopExpected = this.step_func_done();
const recorderOnStopUnexpected = test.unreached_func('Recording stopped.');
const recorderOnError = test.unreached_func('Recording error.');
const gotStream = this.step_func(function(stream) {
checkStreamTracks(stream, value['video'], value['audio']);
recorder = new MediaRecorder(stream);
assert_equals(recorder.state, "inactive");
recorder.ondataavailable = recorderOnDataAvailable;
recorder.onstop = recorderOnStopUnexpected;
recorder.onerror = recorderOnError;
recorder.start();
assert_equals(recorder.state, "recording");
recorder.requestData();
});
const onError = test.unreached_func('Error creating MediaStream.');
navigator.webkitGetUserMedia(value, gotStream, onError);
});
};
generate_tests(makeAsyncTest,
[["video-only", {video: true, audio: false}],
["audio-only", {video: false, audio: true}],
["audio-video", {video: true, audio: true}]]);
</script>