| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 1 | <!doctype html> |
| 2 | <meta charset=utf-8> |
| 3 | <title>RTCRtpParameters transactionId</title> |
| 4 | <script src="/resources/testharness.js"></script> |
| 5 | <script src="/resources/testharnessreport.js"></script> |
| 6 | <script src="dictionary-helper.js"></script> |
| 7 | <script src="RTCRtpParameters-helper.js"></script> |
| 8 | <script> |
| 9 | 'use strict'; |
| 10 | |
| 11 | // Test is based on the following editor draft: |
| 12 | // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html |
| 13 | |
| 14 | // The following helper functions are called from RTCRtpParameters-helper.js: |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 15 | // doOfferAnswerExchange |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 16 | // validateSenderRtpParameters |
| 17 | |
| 18 | /* |
| 19 | 5.1. RTCPeerConnection Interface Extensions |
| 20 | partial interface RTCPeerConnection { |
| 21 | RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind, |
| 22 | optional RTCRtpTransceiverInit init); |
| 23 | ... |
| 24 | }; |
| 25 | |
| 26 | dictionary RTCRtpTransceiverInit { |
| 27 | RTCRtpTransceiverDirection direction = "sendrecv"; |
| 28 | sequence<MediaStream> streams; |
| 29 | sequence<RTCRtpEncodingParameters> sendEncodings; |
| 30 | }; |
| 31 | |
| 32 | addTransceiver |
| 33 | 2. If the dictionary argument is present, and it has a sendEncodings member, |
| 34 | let sendEncodings be that list of RTCRtpEncodingParameters objects, or an |
| 35 | empty list otherwise. |
| 36 | 7. Create an RTCRtpSender with track, streams and sendEncodings and let |
| 37 | sender be the result. |
| 38 | |
| 39 | 5.2. RTCRtpSender Interface |
| 40 | interface RTCRtpSender { |
| 41 | Promise<void> setParameters(optional RTCRtpParameters parameters); |
| 42 | RTCRtpParameters getParameters(); |
| 43 | }; |
| 44 | |
| 45 | dictionary RTCRtpParameters { |
| 46 | DOMString transactionId; |
| 47 | sequence<RTCRtpEncodingParameters> encodings; |
| 48 | sequence<RTCRtpHeaderExtensionParameters> headerExtensions; |
| 49 | RTCRtcpParameters rtcp; |
| 50 | sequence<RTCRtpCodecParameters> codecs; |
| 51 | RTCDegradationPreference degradationPreference; |
| 52 | }; |
| 53 | |
| 54 | getParameters |
| 55 | - transactionId is set to a new unique identifier, used to match this |
| 56 | getParameters call to a setParameters call that may occur later. |
| 57 | */ |
| 58 | |
| 59 | /* |
| 60 | 5.2. getParameters |
| 61 | - transactionId is set to a new unique identifier, used to match this |
| 62 | getParameters call to a setParameters call that may occur later. |
| 63 | */ |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 64 | promise_test(async t => { |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 65 | const pc = new RTCPeerConnection(); |
| Philipp Hancke | fb60c65 | 2019-05-20 07:39:18 | [diff] [blame] | 66 | t.add_cleanup(() => pc.close()); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 67 | const { sender } = pc.addTransceiver('audio'); |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 68 | await doOfferAnswerExchange(t, pc); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 69 | |
| 70 | const param1 = sender.getParameters(); |
| 71 | const param2 = sender.getParameters(); |
| 72 | |
| 73 | validateSenderRtpParameters(param1); |
| 74 | validateSenderRtpParameters(param2); |
| 75 | |
| 76 | assert_not_equals(param1.transactionId, param2.transactionId); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 77 | }, `sender.getParameters() should return different transaction IDs for each call`); |
| 78 | |
| 79 | /* |
| 80 | 5.2. setParameters |
| 81 | 7. If parameters.encodings.length is different from N, or if any parameter |
| 82 | in the parameters argument, marked as a Read-only parameter, has a value |
| 83 | that is different from the corresponding parameter value returned from |
| 84 | sender.getParameters(), abort these steps and return a promise rejected |
| 85 | with a newly created InvalidModificationError. Note that this also applies |
| 86 | to transactionId. |
| 87 | */ |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 88 | promise_test(async t => { |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 89 | const pc = new RTCPeerConnection(); |
| Philipp Hancke | 1622a02 | 2018-06-11 10:00:53 | [diff] [blame] | 90 | t.add_cleanup(() => pc.close()); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 91 | const { sender } = pc.addTransceiver('audio'); |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 92 | await doOfferAnswerExchange(t, pc); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 93 | |
| 94 | const param = sender.getParameters(); |
| 95 | validateSenderRtpParameters(param); |
| 96 | |
| 97 | const { transactionId } = param; |
| 98 | param.transactionId = `${transactionId}-modified`; |
| 99 | |
| 100 | return promise_rejects(t, 'InvalidModificationError', |
| 101 | sender.setParameters(param)); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 102 | }, `sender.setParameters() with transaction ID different from last getParameters() should reject with InvalidModificationError`); |
| 103 | |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 104 | promise_test(async t => { |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 105 | const pc = new RTCPeerConnection(); |
| Philipp Hancke | 1622a02 | 2018-06-11 10:00:53 | [diff] [blame] | 106 | t.add_cleanup(() => pc.close()); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 107 | const { sender } = pc.addTransceiver('audio'); |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 108 | await doOfferAnswerExchange(t, pc); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 109 | |
| 110 | const param = sender.getParameters(); |
| 111 | validateSenderRtpParameters(param); |
| 112 | |
| 113 | param.transactionId = undefined; |
| 114 | |
| Boris Zbarsky | ab733fd | 2020-02-04 21:19:03 | [diff] [blame] | 115 | return promise_rejects_js(t, TypeError, |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 116 | sender.setParameters(param)); |
| Florent Castelli | 7efb0ab | 2018-08-06 16:11:39 | [diff] [blame] | 117 | }, `sender.setParameters() with transaction ID unset should reject with TypeError`); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 118 | |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 119 | promise_test(async t => { |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 120 | const pc = new RTCPeerConnection(); |
| Philipp Hancke | 1622a02 | 2018-06-11 10:00:53 | [diff] [blame] | 121 | t.add_cleanup(() => pc.close()); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 122 | const { sender } = pc.addTransceiver('audio'); |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 123 | await doOfferAnswerExchange(t, pc); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 124 | |
| 125 | const param = sender.getParameters(); |
| 126 | validateSenderRtpParameters(param); |
| 127 | |
| 128 | return sender.setParameters(param) |
| 129 | .then(() => |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 130 | promise_rejects(t, 'InvalidStateError', |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 131 | sender.setParameters(param))); |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 132 | }, `setParameters() twice with the same parameters should reject with InvalidStateError`); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 133 | |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 134 | promise_test(async t => { |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 135 | const pc = new RTCPeerConnection(); |
| Philipp Hancke | 1622a02 | 2018-06-11 10:00:53 | [diff] [blame] | 136 | t.add_cleanup(() => pc.close()); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 137 | const { sender } = pc.addTransceiver('audio'); |
| Henrik Boström | 36fb033 | 2018-06-29 09:09:04 | [diff] [blame] | 138 | await doOfferAnswerExchange(t, pc); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 139 | |
| 140 | const param1 = sender.getParameters(); |
| 141 | const param2 = sender.getParameters(); |
| 142 | |
| 143 | validateSenderRtpParameters(param1); |
| 144 | validateSenderRtpParameters(param2); |
| 145 | |
| 146 | assert_not_equals(param1.transactionId, param2.transactionId); |
| 147 | |
| 148 | return promise_rejects(t, 'InvalidModificationError', |
| 149 | sender.setParameters(param1)); |
| Soares Chen | 172fe9d | 2017-07-18 09:30:18 | [diff] [blame] | 150 | }, `setParameters() with parameters older than last getParameters() should reject with InvalidModificationError`); |
| 151 | |
| 152 | </script> |