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