| <!doctype html> | |
| <meta charset=utf-8> | |
| <title>RTCPeerConnection.prototype.createAnswer</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://w3c.github.io/webrtc-pc/archives/20170515/webrtc.html | |
| // The following helper functions are called from RTCPeerConnection-helper.js: | |
| // generateDataChannelOffer() | |
| /* | |
| * 4.3.2. createAnswer() | |
| */ | |
| /* | |
| * 4.1. If connection's remoteDescription is null return a promise rejected with a | |
| * newly created InvalidStateError. | |
| */ | |
| promise_test(t => { | |
| const pc = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc.close()); | |
| return promise_rejects_dom(t, 'InvalidStateError', | |
| pc.createAnswer()); | |
| }, 'createAnswer() with null remoteDescription should reject with InvalidStateError'); | |
| /* | |
| * Final steps to create an answer | |
| * 4. Let answer be a newly created RTCSessionDescriptionInit dictionary with its | |
| * type member initialized to the string "answer" and its sdp member initialized to sdpString. | |
| */ | |
| promise_test(t => { | |
| const pc = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc.close()); | |
| return generateVideoReceiveOnlyOffer(pc) | |
| .then(offer => pc.setRemoteDescription(offer)) | |
| .then(() => pc.createAnswer()) | |
| .then(answer => { | |
| assert_equals(typeof answer, 'object', | |
| 'Expect answer to be plain object dictionary RTCSessionDescriptionInit'); | |
| assert_false(answer instanceof RTCSessionDescription, | |
| 'Expect answer to not be instance of RTCSessionDescription') | |
| }); | |
| }, 'createAnswer() after setting remote description should succeed'); | |
| promise_test(t => { | |
| const pc = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc.close()); | |
| return generateDataChannelOffer(pc) | |
| .then(offer => pc.setRemoteDescription(offer)) | |
| .then(() => { | |
| pc.close(); | |
| return promise_rejects_dom(t, 'InvalidStateError', | |
| pc.createAnswer()); | |
| }); | |
| }, 'createAnswer() when connection is closed reject with InvalidStateError'); | |
| /* | |
| * TODO | |
| * 4.3.2 createAnswer | |
| * 3. If connection is configured with an identity provider, and an | |
| * identity assertion has not yet been generated using said | |
| * identity provider, then begin the identity assertion request | |
| * process if it has not already begun. | |
| * | |
| * Steps to create an answer | |
| * 1. If the need for an identity assertion was identified when | |
| * createAnswer was invoked, wait for the identity assertion | |
| * request process to complete. | |
| * 2. If the identity provider was unable to produce an identity | |
| * assertion, reject p with a newly created NotReadableError | |
| * and abort these steps. | |
| * 3. If connection was not constructed with a set of certificates, | |
| * and one has not yet been generated, wait for it to be generated. | |
| * | |
| * Final steps to create an answer | |
| * 2. If connection was modified in such a way that additional | |
| * inspection of the system state is necessary, then in | |
| * parallel begin the steps to create an answer again, given p, | |
| * and abort these steps. | |
| * | |
| * Non-Testable | |
| * 4.3.2 createAnswer | |
| * Steps to create an answer | |
| * 4. Inspect the system state to determine the currently | |
| * available resources as necessary for generating the answer, | |
| * as described in [JSEP] (section 4.1.7.). | |
| * 5. If this inspection failed for any reason, reject p with a | |
| * newly created OperationError and abort these steps. | |
| * | |
| * Final steps to create an answer | |
| * 3. Given the information that was obtained from previous inspection | |
| * and the current state of connection and its RTCRtpTransceivers, | |
| * generate an SDP answer, sdpString, as described in [JSEP] (section 5.3.). | |
| */ | |
| </script> |