| <!doctype html> |
| <meta charset=utf-8> |
| <title>RTCRtpTransceiver.prototype.setDirection</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="RTCPeerConnection-helper.js"></script> |
| <script> |
| 'use strict'; |
| |
| // Test is based on the following editor draft: |
| // https://rawgit.com/w3c/webrtc-pc/cc8d80f455b86c8041d63bceb8b457f45c72aa89/webrtc.html |
| |
| // The following helper functions are called from RTCPeerConnection-helper.js: |
| // generateAnswer |
| |
| /* |
| 5.4. RTCRtpTransceiver Interface |
| interface RTCRtpTransceiver { |
| readonly attribute RTCRtpTransceiverDirection direction; |
| readonly attribute RTCRtpTransceiverDirection? currentDirection; |
| void setDirection(RTCRtpTransceiverDirection direction); |
| ... |
| }; |
| */ |
| |
| /* |
| 5.4. setDirection |
| 4. Set transceiver's [[Direction]] slot to newDirection. |
| */ |
| test(t => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('audio'); |
| assert_equals(transceiver.direction, 'sendrecv'); |
| assert_equals(transceiver.currentDirection, null); |
| |
| transceiver.setDirection('recvonly'); |
| assert_equals(transceiver.direction, 'recvonly'); |
| assert_equals(transceiver.currentDirection, null, |
| 'Expect transceiver.currentDirection to not change'); |
| |
| }, 'setDirection should change transceiver.direction'); |
| |
| /* |
| 5.4. setDirection |
| 3. If newDirection is equal to transceiver's [[Direction]] slot, abort |
| these steps. |
| */ |
| test(t => { |
| const pc = new RTCPeerConnection(); |
| const transceiver = pc.addTransceiver('audio', { direction: 'sendonly' }); |
| assert_equals(transceiver.direction, 'sendonly'); |
| transceiver.setDirection('sendonly'); |
| assert_equals(transceiver.direction, 'sendonly'); |
| |
| }, 'setDirection with same direction should have no effect'); |
| |
| promise_test(t => { |
| const pc = new RTCPeerConnection(); |
| t.add_cleanup(() => pc.close()); |
| const transceiver = pc.addTransceiver('audio', { direction: 'recvonly' }); |
| assert_equals(transceiver.direction, 'recvonly'); |
| assert_equals(transceiver.currentDirection, null); |
| |
| return pc.createOffer() |
| .then(offer => |
| pc.setLocalDescription(offer) |
| .then(() => generateAnswer(offer))) |
| .then(answer => pc.setRemoteDescription(answer)) |
| .then(() => { |
| assert_equals(transceiver.currentDirection, 'recvonly'); |
| transceiver.setDirection('sendrecv'); |
| assert_equals(transceiver.direction, 'sendrecv'); |
| assert_equals(transceiver.currentDirection, 'recvonly'); |
| }); |
| }, 'setDirection should change transceiver.direction independent of transceiver.currentDirection'); |
| |
| /* |
| TODO |
| Calls to setDirection() do not take effect immediately. Instead, future calls |
| to createOffer and createAnswer mark the corresponding media description as |
| sendrecv, sendonly, recvonly or inactive as defined in [JSEP] (section 5.2.2. |
| and section 5.3.2.). |
| |
| Tested in RTCPeerConnection-onnegotiationneeded.html |
| 5.4. setDirection |
| 6. Update the negotiation-needed flag for connection. |
| |
| Coverage Report |
| Tested 6 |
| Not Tested 1 |
| Untestable 0 |
| Total 7 |
| */ |
| |
| </script> |