| <!doctype html> |
| <html> |
| <head> |
| <meta charset=utf-8> |
| <title>RTCRtpScriptTransformer.sendKeyFrameRequest tests</title> |
| <meta name='timeout' content='long'> |
| <script src='/resources/testharness.js'></script> |
| <script src='/resources/testharnessreport.js'></script> |
| <script src=/resources/testdriver.js></script> |
| <script src=/resources/testdriver-vendor.js></script> |
| <script src='../mediacapture-streams/permission-helper.js'></script> |
| </head> |
| <body> |
| <video id='video1' autoplay></video> |
| <video id='video2' autoplay></video> |
| <script src ='routines.js'></script> |
| <script> |
| |
| const sendKeyFrameRequest = (port, opts) => postMethod(port, 'sendKeyFrameRequest', opts); |
| const sendKeyFrameRequestDoesNotThrow = (port, opts) => postMethod(port, 'sendKeyFrameRequestDoesNotThrow', opts); |
| const waitForFrame = port => postMethod(port, 'waitForFrame'); |
| |
| promise_test(async (test) => { |
| const {sender, receiver} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true}); |
| assert_equals(await waitForFrame(receiver.transform.port), 'got frame'); |
| |
| assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success'); |
| |
| assert_equals(await sendKeyFrameRequest(sender.transform.port), 'failure: InvalidStateError'); |
| |
| video1.srcObject = new MediaStream([receiver.track]); |
| await video1.play(); |
| }, 'sendKeyFrameRequest resolves for video receiver, and throws for video sender'); |
| |
| promise_test(async (test) => { |
| const {sender, receiver} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {audio: true}); |
| assert_equals(await waitForFrame(receiver.transform.port), 'got frame'); |
| |
| assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'failure: InvalidStateError'); |
| |
| assert_equals(await waitForFrame(sender.transform.port), 'got frame'); |
| |
| assert_equals(await sendKeyFrameRequest(sender.transform.port), 'failure: InvalidStateError'); |
| |
| video1.srcObject = new MediaStream([receiver.track]); |
| await video1.play(); |
| }, 'sendKeyFrameRequest throws for audio sender/receiver'); |
| |
| promise_test(async (test) => { |
| const [senderTransform] = await createTransforms('script-transform-sendKeyFrameRequest.js'); |
| assert_equals(await sendKeyFrameRequest(senderTransform.port), 'failure: InvalidStateError'); |
| }, 'sendKeyFrameRequest throws for unused transforms'); |
| |
| promise_test(async (test) => { |
| const {sender, receiver} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true}); |
| assert_equals(await waitForFrame(receiver.transform.port), 'got frame'); |
| |
| const receiverTransform = receiver.transform; |
| assert_equals(await sendKeyFrameRequest(receiverTransform.port), 'success'); |
| |
| // TODO: Spec currently says that this will immediately cause the transformer |
| // to stop working. This may change. |
| receiver.transform = null; |
| |
| assert_equals(await sendKeyFrameRequestDoesNotThrow(receiverTransform.port), 'success'); |
| }, 'sendKeyFrameRequest does not throw for unset transforms'); |
| |
| promise_test(async (test) => { |
| const {sender, receiver, senderPc, receiverPc} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true}); |
| assert_equals(await waitForFrame(receiver.transform.port), 'got frame'); |
| |
| assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success'); |
| |
| senderPc.getTransceivers()[0].direction = 'inactive'; |
| await senderPc.setLocalDescription(); |
| await receiverPc.setRemoteDescription(senderPc.localDescription); |
| await receiverPc.setLocalDescription(); |
| await senderPc.setRemoteDescription(receiverPc.localDescription); |
| |
| assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success'); |
| |
| senderPc.getTransceivers()[0].direction = 'sendonly'; |
| await senderPc.setLocalDescription(); |
| await receiverPc.setRemoteDescription(senderPc.localDescription); |
| await receiverPc.setLocalDescription(); |
| await senderPc.setRemoteDescription(receiverPc.localDescription); |
| |
| assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success'); |
| }, 'sendKeyFrameRequest does not reject when the receiver is negotiated inactive, and resumes succeeding when negotiated back to active'); |
| |
| promise_test(async (test) => { |
| const {sender, receiver, senderPc, receiverPc} = await createConnectionWithTransform(test, 'script-transform-sendKeyFrameRequest.js', {video: true}); |
| assert_equals(await waitForFrame(receiver.transform.port), 'got frame'); |
| |
| assert_equals(await sendKeyFrameRequest(receiver.transform.port), 'success'); |
| |
| receiverPc.getTransceivers()[0].stop(); |
| |
| assert_equals(await sendKeyFrameRequestDoesNotThrow(receiver.transform.port), 'success'); |
| }, 'sendKeyFrameRequest does not reject when the receiver is stopped'); |
| |
| // Testing that sendKeyFrameRequest actually results in the sending of keyframe |
| // requests is effectively impossible, because there is no API to expose the |
| // reception of a keyframe request, keyframes are sent regularly anyway, and |
| // the spec allows the receiver to ignore these calls if sending a keyframe |
| // request is 'not deemed appropriate'! sendKeyFrameRequest is at most a |
| // suggestion. |
| |
| </script> |
| </body> |
| </html> |