4ac3d6d50bf17b682f4932bb0ea3aaafeefc903f
[WebKit-https.git] / LayoutTests / http / wpt / mediarecorder / MediaRecorder-dataavailable.html
1 <!doctype html>
2 <html>
3 <head>
4     <title>MediaRecorder Dataavailable</title>
5     <link rel="help" href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#mediarecorder">
6     <script src="/resources/testharness.js"></script>
7     <script src="/resources/testharnessreport.js"></script>
8 </head>
9 <body>
10 <canvas id="canvas" width="200" height="200">
11 </canvas>
12 <script>
13     var context;
14
15     if (window.internals)
16         internals.setCustomPrivateRecorderCreator();
17
18     function createVideoStream() {
19         const canvas = document.getElementById("canvas");
20         context = canvas.getContext('2d');
21         return canvas.captureStream();
22     }
23
24     function drawSomethingOnCanvas() {
25         context.fillStyle = "red";
26         context.fillRect(0, 0, 10, 10);
27     }
28
29     function dataAvailableAssertions(blobEvent) {
30         assert_true(blobEvent instanceof BlobEvent, 'the type of event should be BlobEvent');
31         assert_equals(blobEvent.type, 'dataavailable', 'the event type should be dataavailable');
32         assert_true(blobEvent.isTrusted, 'isTrusted should be true when the event is created by C++');
33         assert_true(blobEvent.data instanceof Blob, 'the type of data should be Blob');
34         assert_true(blobEvent.data.size > 0, 'the blob should contain some buffers');
35     }
36
37     async_test(t => {
38         const video = createVideoStream();
39         const recorder = new MediaRecorder(video);
40
41         recorder.ondataavailable = t.step_func(blobEvent => {
42             dataAvailableAssertions(blobEvent);
43             t.done();
44         });
45         recorder.start();
46         assert_equals(recorder.state, 'recording', 'MediaRecorder has been started successfully');
47         drawSomethingOnCanvas();
48         setTimeout(() => {
49             recorder.stop();
50         }, 1000)
51     }, 'MediaRecorder will fire a dataavailable event with a blob data for a video-only stream when stop() is called');
52
53     async_test(t => {
54         const ac = new AudioContext();
55         const osc = ac.createOscillator();
56         const dest = ac.createMediaStreamDestination();
57         const audio = dest.stream;
58         osc.connect(dest);
59         const recorder = new MediaRecorder(audio);
60
61         recorder.ondataavailable = t.step_func(blobEvent => {
62             dataAvailableAssertions(blobEvent);
63             t.done();
64         });
65         recorder.start();
66         osc.start();
67         assert_equals(recorder.state, 'recording', 'MediaRecorder has been started successfully');
68         setTimeout(() => {
69             recorder.stop();
70             osc.stop();
71         }, 1000);
72     }, 'MediaRecorder will fire a dataavailable event with a blob data for a audio-only stream when stop() is called');
73
74     async_test(t => {
75         const ac = new AudioContext();
76         const osc = ac.createOscillator();
77         const dest = ac.createMediaStreamDestination();
78         const audio = dest.stream;
79         osc.connect(dest);
80
81         const video = createVideoStream();
82         assert_equals(video.getAudioTracks().length, 0, "video mediastream starts with no audio track");
83         assert_equals(audio.getAudioTracks().length, 1, "audio mediastream starts with one audio track");
84         video.addTrack(audio.getAudioTracks()[0]);
85         assert_equals(video.getAudioTracks().length, 1, "video mediastream starts with one audio track");
86         const recorder = new MediaRecorder(video);
87
88         recorder.ondataavailable = t.step_func(blobEvent => {
89             dataAvailableAssertions(blobEvent);
90             t.done();
91         });
92         recorder.start();
93         osc.start();
94         drawSomethingOnCanvas();
95         assert_equals(recorder.state, 'recording', 'MediaRecorder has been started successfully');
96         setTimeout(() => {
97             recorder.stop();
98             osc.stop();
99         }, 1000);
100     }, 'MediaRecorder will fire a dataavailable event with a blob data for a video-audio stream when stop() is called');
101
102 </script>
103 </body>
104 </html>