| <!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" width="320" height="320"> | |
| </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"); | |
| canvas.getContext('2d').lineTo(10, 10); | |
| 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"); | |
| 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"); | |
| 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> |