| <!DOCTYPE html> |
| <script src=../../resources/testharness.js></script> |
| <script src=../../resources/testharnessreport.js></script> |
| <script> |
| |
| // This test verifies we can successfully create a MediaRecorder and |
| // get data from a MediaStream with it. |
| |
| 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); |
| } |
| }; |
| |
| const makeEmptyDataTest = function(value, expected) { |
| async_test(function(test) { |
| const recorderOnDataAvailable = test.step_func_done(function(event) { |
| assert_equals(event.data.size, 0, 'Recorded data size should be == 0'); |
| assert_not_equals(event.timecode, NaN, 'timecode'); |
| }); |
| |
| const recorderOnStop = |
| test.step_func(function() { assert_unreached('Recording stopped.'); }); |
| |
| const recorderOnError = |
| test.step_func(function() { assert_unreached('Recording error.'); }); |
| |
| const gotStream = test.step_func(function(stream) { |
| checkStreamTracks(stream, value['video'], value['audio']); |
| |
| var recorder = new MediaRecorder(stream); |
| |
| assert_throws_dom("InvalidStateError", |
| function() { recorder.requestData(); }, |
| "recorder throws InvalidStateError if requestData() " + |
| "while state is not 'recording'"); |
| |
| recorder.ondataavailable = recorderOnDataAvailable; |
| recorder.onstop = recorderOnStop; |
| 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); |
| }, "MediaRecorder requestData causes blobs without contained data to " + |
| `trigger ondataavailable after start (${JSON.stringify(value)})`); |
| } |
| |
| const makeNonEmptyDataTest = function(value, expected) { |
| promise_test(async function(test) { |
| const recorderOnDataAvailable = test.step_func_done(function(event) { |
| assert_greater_than(event.data.size, 0, |
| 'Recorded data size should be > 0'); |
| assert_equals(event.data.type, value['mimeType']); |
| }); |
| |
| const gotStream = test.step_func(async function(stream) { |
| checkStreamTracks(stream, value['video'], value['audio']); |
| var recorder = new MediaRecorder(stream); |
| recorder.ondataavailable = recorderOnDataAvailable; |
| const onstartPromise = new Promise(r => recorder.onstart = r); |
| recorder.start(); |
| await onstartPromise; |
| recorder.requestData(); |
| }); |
| |
| const onError = test.unreached_func('Error creating MediaStream.'); |
| navigator.webkitGetUserMedia(value, gotStream, onError); |
| }, "MediaRecorder requestData causes blobs with contained " + |
| `trigger ondataavailable after onstart (${JSON.stringify(value)})`); |
| } |
| |
| generate_tests(makeEmptyDataTest, |
| [["empty-video-only", |
| {video: true, audio: false, mimeType: "video/webm;codecs=vp8"}], |
| ["empty-audio-only", |
| {video: false, audio: true, mimeType: "audio/webm;codecs=opus"}], |
| ["empty-audio-video", |
| {video: true, audio: true, mimeType: "video/webm;codecs=vp8,opus"}]]); |
| |
| generate_tests(makeNonEmptyDataTest, |
| [["nonempty-video-only", |
| {video: true, audio: false, mimeType: "video/webm;codecs=vp8"}], |
| ["nonempty-audio-only", |
| {video: false, audio: true, mimeType: "audio/webm;codecs=opus"}], |
| ["nonempty-audio-video", |
| {video: true, audio: true, mimeType: "video/webm;codecs=vp8,opus"}]]); |
| |
| </script> |