| <!doctype html> |
| <html> |
| <head> |
| <title>MediaRecorder Error</title> |
| <link rel="help" href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#mediarecorder"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| </head> |
| <body> |
| <canvas id="canvas"> |
| </canvas> |
| <script> |
| function createAudioStream() { |
| let ac = new AudioContext(); |
| let osc = ac.createOscillator(); |
| let dest = ac.createMediaStreamDestination(); |
| osc.connect(dest); |
| return dest.stream; |
| } |
| |
| function createVideoStream() { |
| let canvas = document.getElementById("canvas"); |
| return canvas.captureStream(); |
| } |
| |
| async_test(t => { |
| let video = createVideoStream(); |
| let audio = createAudioStream(); |
| let recorder = new MediaRecorder(video); |
| recorder.onerror = t.step_func(mediaRecorderErrorEvent => { |
| assert_true(mediaRecorderErrorEvent instanceof MediaRecorderErrorEvent, 'the type of event should be MediaRecorderErrorEvent'); |
| assert_equals(mediaRecorderErrorEvent.error.name, 'UnknownError', 'the type of error should be UnknownError when track has been added or removed'); |
| assert_true(mediaRecorderErrorEvent.isTrusted, 'isTrusted should be true when the event is created by C++'); |
| assert_equals(recorder.state, "inactive", "MediaRecorder has been stopped after adding a track to stream"); |
| t.done(); |
| }); |
| recorder.start(); |
| assert_equals(recorder.state, "recording", "MediaRecorder has been started successfully"); |
| video.addTrack(audio.getAudioTracks()[0]); |
| t.step_timeout(() => { |
| assert_unreached("error event is not fired after 2 seconds"); |
| }, 2000); |
| }, "MediaRecorder will stop recording when any of track is added and error event will be fired", { timeout: 10000 }); |
| |
| async_test(t => { |
| let video = createVideoStream(); |
| let recorder = new MediaRecorder(video); |
| recorder.onerror = t.step_func(mediaRecorderErrorEvent => { |
| assert_true(mediaRecorderErrorEvent instanceof MediaRecorderErrorEvent, 'the type of event should be MediaRecorderErrorEvent'); |
| assert_equals(mediaRecorderErrorEvent.error.name, 'UnknownError', 'the type of error should be UnknownError when track has been added or removed'); |
| assert_true(mediaRecorderErrorEvent.isTrusted, 'isTrusted should be true when the event is created by C++'); |
| assert_equals(recorder.state, "inactive", "MediaRecorder has been stopped after removing a track from stream"); |
| t.done(); |
| }); |
| recorder.start(); |
| assert_equals(recorder.state, "recording", "MediaRecorder has been started successfully"); |
| video.removeTrack(video.getVideoTracks()[0]); |
| t.step_timeout(() => { |
| assert_unreached("error event is not fired after 2 seconds"); |
| }, 2000); |
| }, "MediaRecorder will stop recording when any of track is removed and error event will be fired", { timeout: 10000 }); |
| |
| test(t => { |
| let video = createVideoStream(); |
| let recorder = new MediaRecorder(video); |
| recorder.start(); |
| assert_equals(recorder.state, "recording", "MediaRecorder has been started successfully"); |
| assert_throws("InvalidStateError", function() { |
| recorder.start(); |
| }); |
| }, "MediaRecorder cannot start recording when MediaRecorder' state is not inactive and an InvalidStateError should be thrown"); |
| </script> |
| </body> |
| </html> |