script-transform-sendKeyFrameRequest.https.html (5236B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset=utf-8> 5 <title>RTCRtpScriptTransformer.sendKeyFrameRequest tests</title> 6 <meta name='timeout' content='long'> 7 <script src='/resources/testharness.js'></script> 8 <script src='/resources/testharnessreport.js'></script> 9 <script src=/resources/testdriver.js></script> 10 <script src=/resources/testdriver-vendor.js></script> 11 <script src='../mediacapture-streams/permission-helper.js'></script> 12 </head> 13 <body> 14 <video id='video1' autoplay></video> 15 <video id='video2' autoplay></video> 16 <script src ='routines.js'></script> 17 <script> 18 19 const sendKeyFrameRequest = (port, opts) => postMethod(port, 'sendKeyFrameRequest', opts); 20 const sendKeyFrameRequestDoesNotThrow = (port, opts) => postMethod(port, 'sendKeyFrameRequestDoesNotThrow', opts); 21 const waitForFrame = port => postMethod(port, 'waitForFrame'); 22 23 promise_test(async (test) => { 24 const {sender, receiver} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true}); 25 assert_equals(await waitForFrame(receiver.transform.port), 'got frame'); 26 27 assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success'); 28 29 assert_equals(await sendKeyFrameRequest(sender.transform.port), 'failure: InvalidStateError'); 30 31 video1.srcObject = new MediaStream([receiver.track]); 32 await video1.play(); 33 }, 'sendKeyFrameRequest resolves for video receiver, and throws for video sender'); 34 35 promise_test(async (test) => { 36 const {sender, receiver} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {audio: true}); 37 assert_equals(await waitForFrame(receiver.transform.port), 'got frame'); 38 39 assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'failure: InvalidStateError'); 40 41 assert_equals(await waitForFrame(sender.transform.port), 'got frame'); 42 43 assert_equals(await sendKeyFrameRequest(sender.transform.port), 'failure: InvalidStateError'); 44 45 video1.srcObject = new MediaStream([receiver.track]); 46 await video1.play(); 47 }, 'sendKeyFrameRequest throws for audio sender/receiver'); 48 49 promise_test(async (test) => { 50 const [senderTransform] = await createTransforms('script-transform-sendKeyFrameRequest.js'); 51 assert_equals(await sendKeyFrameRequest(senderTransform.port), 'failure: InvalidStateError'); 52 }, 'sendKeyFrameRequest throws for unused transforms'); 53 54 promise_test(async (test) => { 55 const {sender, receiver} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true}); 56 assert_equals(await waitForFrame(receiver.transform.port), 'got frame'); 57 58 const receiverTransform = receiver.transform; 59 assert_equals(await sendKeyFrameRequest(receiverTransform.port), 'success'); 60 61 // TODO: Spec currently says that this will immediately cause the transformer 62 // to stop working. This may change. 63 receiver.transform = null; 64 65 assert_equals(await sendKeyFrameRequestDoesNotThrow(receiverTransform.port), 'success'); 66 }, 'sendKeyFrameRequest does not throw for unset transforms'); 67 68 promise_test(async (test) => { 69 const {sender, receiver, senderPc, receiverPc} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true}); 70 assert_equals(await waitForFrame(receiver.transform.port), 'got frame'); 71 72 assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success'); 73 74 senderPc.getTransceivers()[0].direction = 'inactive'; 75 await senderPc.setLocalDescription(); 76 await receiverPc.setRemoteDescription(senderPc.localDescription); 77 await receiverPc.setLocalDescription(); 78 await senderPc.setRemoteDescription(receiverPc.localDescription); 79 80 assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success'); 81 82 senderPc.getTransceivers()[0].direction = 'sendonly'; 83 await senderPc.setLocalDescription(); 84 await receiverPc.setRemoteDescription(senderPc.localDescription); 85 await receiverPc.setLocalDescription(); 86 await senderPc.setRemoteDescription(receiverPc.localDescription); 87 88 assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success'); 89 }, 'sendKeyFrameRequest does not reject when the receiver is negotiated inactive, and resumes succeeding when negotiated back to active'); 90 91 promise_test(async (test) => { 92 const {sender, receiver, senderPc, receiverPc} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true}); 93 assert_equals(await waitForFrame(receiver.transform.port), 'got frame'); 94 95 assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success'); 96 97 receiverPc.getTransceivers()[0].stop(); 98 99 assert_equals(await sendKeyFrameRequestDoesNotThrow(receiver.transform.port), 'success'); 100 }, 'sendKeyFrameRequest does not reject when the receiver is stopped'); 101 102 // Testing that sendKeyFrameRequest actually results in the sending of keyframe 103 // requests is effectively impossible, because there is no API to expose the 104 // reception of a keyframe request, keyframes are sent regularly anyway, and 105 // the spec allows the receiver to ignore these calls if sending a keyframe 106 // request is 'not deemed appropriate'! sendKeyFrameRequest is at most a 107 // suggestion. 108 109 </script> 110 </body> 111 </html>