blob: 32cbff5d98586840ab9c37a1e1e05f262560848e [file] [log] [blame]
<!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>