RTCPeerConnection-insertable-streams-worker.https.html (7689B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>RTCPeerConnection Insertable Streams - Worker</title> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 <script src=/resources/testdriver.js></script> 8 <script src=/resources/testdriver-vendor.js></script> 9 <script src='../../mediacapture-streams/permission-helper.js'></script> 10 <script src="../../webrtc/RTCPeerConnection-helper.js"></script> 11 <script src="./RTCPeerConnection-insertable-streams.js"></script> 12 <script src="./helper.js"></script> 13 </head> 14 <body> 15 <script> 16 promise_test(async t => { 17 const caller = new RTCPeerConnection({encodedInsertableStreams:true}); 18 t.add_cleanup(() => caller.close()); 19 const callee = new RTCPeerConnection(); 20 t.add_cleanup(() => callee.close()); 21 22 // Video is used in a later test, so we ask for both permissions 23 await setMediaPermission(); 24 const stream = await navigator.mediaDevices.getUserMedia({audio:true}); 25 const track = stream.getTracks()[0]; 26 t.add_cleanup(() => track.stop()); 27 28 const sender = caller.addTrack(track) 29 const senderStreams = sender.createEncodedStreams(); 30 31 const senderWorker = new Worker('RTCPeerConnection-sender-worker-single-frame.js') 32 t.add_cleanup(() => senderWorker.terminate()); 33 senderWorker.postMessage( 34 {readableStream: senderStreams.readable}, 35 [senderStreams.readable]); 36 37 let expectedFrameData = null; 38 let verifiedFrameData = false; 39 let numVerifiedFrames = 0; 40 const onmessagePromise = new Promise(resolve => { 41 senderWorker.onmessage = t.step_func(message => { 42 if (!(message.data instanceof RTCEncodedAudioFrame)) { 43 // This is the first message sent from the Worker to the test. 44 // It contains an object (not an RTCEncodedAudioFrame) with the same 45 // fields as the RTCEncodedAudioFrame to be sent in follow-up messages. 46 // These serve as expected values to validate that the 47 // RTCEncodedAudioFrame is sent correctly back to the test in the next 48 // message. 49 expectedFrameData = message.data; 50 } else { 51 // This is the frame sent by the Worker after reading it from the 52 // readable stream. The Worker sends it twice after sending the 53 // verification message. 54 assert_equals(message.data.type, expectedFrameData.type); 55 assert_equals(message.data.timestamp, expectedFrameData.timestamp); 56 assert_true(areArrayBuffersEqual(message.data.data, expectedFrameData.data)); 57 if (++numVerifiedFrames == 2) 58 resolve(); 59 } 60 }); 61 }); 62 63 exchangeIceCandidates(caller, callee); 64 await exchangeOfferAnswer(caller, callee); 65 66 return onmessagePromise; 67 }, 'RTCRtpSender readable stream transferred to a Worker and the Worker sends an RTCEncodedAudioFrame back'); 68 69 promise_test(async t => { 70 const caller = new RTCPeerConnection({encodedInsertableStreams:true}); 71 t.add_cleanup(() => caller.close()); 72 const callee = new RTCPeerConnection(); 73 t.add_cleanup(() => callee.close()); 74 75 const stream = await navigator.mediaDevices.getUserMedia({video:true}); 76 const videoTrack = stream.getVideoTracks()[0]; 77 t.add_cleanup(() => videoTrack.stop()); 78 79 const videoSender = caller.addTrack(videoTrack) 80 const senderStreams = videoSender.createEncodedStreams(); 81 82 const senderWorker = new Worker('RTCPeerConnection-sender-worker-single-frame.js') 83 t.add_cleanup(() => senderWorker.terminate()); 84 senderWorker.postMessage( 85 {readableStream: senderStreams.readable}, 86 [senderStreams.readable]); 87 88 let expectedFrameData = null; 89 let verifiedFrameData = false; 90 let numVerifiedFrames = 0; 91 const onmessagePromise = new Promise(resolve => { 92 senderWorker.onmessage = t.step_func(message => { 93 if (!(message.data instanceof RTCEncodedVideoFrame)) { 94 // This is the first message sent from the Worker to the test. 95 // It contains an object (not an RTCEncodedVideoFrame) with the same 96 // fields as the RTCEncodedVideoFrame to be sent in follow-up messages. 97 // These serve as expected values to validate that the 98 // RTCEncodedVideoFrame is sent correctly back to the test in the next 99 // message. 100 expectedFrameData = message.data; 101 } else { 102 // This is the frame sent by the Worker after reading it from the 103 // readable stream. The Worker sends it twice after sending the 104 // verification message. 105 assert_equals(message.data.type, expectedFrameData.type); 106 assert_equals(message.data.timestamp, expectedFrameData.timestamp); 107 assert_true(areArrayBuffersEqual(message.data.data, expectedFrameData.data)); 108 assert_equals(message.data.getMetadata().synchronizationSource, expectedFrameData.metadata.synchronizationSource); 109 if (++numVerifiedFrames == 2) 110 resolve(); 111 } 112 }); 113 }); 114 115 exchangeIceCandidates(caller, callee); 116 await exchangeOfferAnswer(caller, callee); 117 118 return onmessagePromise; 119 }, 'RTCRtpSender readable stream transferred to a Worker and the Worker sends an RTCEncodedVideoFrame back'); 120 121 promise_test(async t => { 122 const caller = new RTCPeerConnection({encodedInsertableStreams:true}); 123 t.add_cleanup(() => caller.close()); 124 const callee = new RTCPeerConnection(); 125 t.add_cleanup(() => callee.close()); 126 127 const stream = await navigator.mediaDevices.getUserMedia({video:true}); 128 const videoTrack = stream.getVideoTracks()[0]; 129 t.add_cleanup(() => videoTrack.stop()); 130 131 const videoSender = caller.addTrack(videoTrack) 132 const senderStreams = videoSender.createEncodedStreams(); 133 134 const senderWorker = new Worker('RTCPeerConnection-worker-transform.js') 135 t.add_cleanup(() => senderWorker.terminate()); 136 senderWorker.postMessage( 137 { 138 readableStream: senderStreams.readable, 139 writableStream: senderStreams.writable, 140 insertError: true 141 }, 142 [senderStreams.readable, senderStreams.writable]); 143 144 const onmessagePromise = new Promise(resolve => { 145 senderWorker.onmessage = t.step_func(message => { 146 assert_false(message.data.success); 147 assert_true(message.data.error instanceof TypeError); 148 resolve(); 149 }); 150 }); 151 152 exchangeIceCandidates(caller, callee); 153 await exchangeOfferAnswer(caller, callee); 154 155 return onmessagePromise; 156 }, 'Video RTCRtpSender insertable streams transferred to a worker, which tries to write an invalid frame'); 157 158 promise_test(async t => { 159 const caller = new RTCPeerConnection({encodedInsertableStreams:true}); 160 t.add_cleanup(() => caller.close()); 161 const callee = new RTCPeerConnection(); 162 t.add_cleanup(() => callee.close()); 163 164 const stream = await navigator.mediaDevices.getUserMedia({audio:true}); 165 const audioTrack = stream.getAudioTracks()[0]; 166 t.add_cleanup(() => audioTrack.stop()); 167 168 const audioSender = caller.addTrack(audioTrack) 169 const senderStreams = audioSender.createEncodedStreams(); 170 171 const senderWorker = new Worker('RTCPeerConnection-worker-transform.js') 172 t.add_cleanup(() => senderWorker.terminate()); 173 senderWorker.postMessage( 174 { 175 readableStream: senderStreams.readable, 176 writableStream: senderStreams.writable, 177 insertError: true 178 }, 179 [senderStreams.readable, senderStreams.writable]); 180 181 const onmessagePromise = new Promise(resolve => { 182 senderWorker.onmessage = t.step_func(message => { 183 assert_false(message.data.success); 184 assert_true(message.data.error instanceof TypeError); 185 resolve(); 186 }); 187 }); 188 189 exchangeIceCandidates(caller, callee); 190 await exchangeOfferAnswer(caller, callee); 191 192 return onmessagePromise; 193 }, 'Audio RTCRtpSender insertable streams transferred to a worker, which tries to write an invalid frame'); 194 195 </script> 196 </body> 197 </html>