|  | <!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> |