File: RTCPeerConnection-setRemoteDescription.html

package info (click to toggle)
thunderbird 1%3A60.9.0-1~deb9u1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,339,492 kB
  • sloc: cpp: 5,457,040; ansic: 2,360,385; python: 596,167; asm: 340,963; java: 326,296; xml: 258,830; sh: 84,445; makefile: 23,705; perl: 17,317; objc: 3,768; yacc: 1,766; ada: 1,681; lex: 1,364; pascal: 1,264; cs: 879; exp: 527; php: 436; lisp: 258; ruby: 153; awk: 152; sed: 53; csh: 27
file content (130 lines) | stat: -rw-r--r-- 4,369 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<!doctype html>
<meta charset=utf-8>
<title>RTCPeerConnection.prototype.setRemoteDescription</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/20170605/webrtc.html

  // The following helper functions are called from RTCPeerConnection-helper.js:
  //   generateOffer()
  //   generateAnswer()
  //   assert_session_desc_not_equals()
  //   assert_session_desc_equals()
  //   test_state_change_event()

  /*
    4.3.2.  Interface Definition
      [Constructor(optional RTCConfiguration configuration)]
      interface RTCPeerConnection : EventTarget {
        Promise<void>                      setRemoteDescription(
            RTCSessionDescriptionInit description);

        readonly attribute RTCSessionDescription? remoteDescription;
        readonly attribute RTCSessionDescription? currentRemoteDescription;
        readonly attribute RTCSessionDescription? pendingRemoteDescription;
        ...
      };

    4.6.2.  RTCSessionDescription Class
      dictionary RTCSessionDescriptionInit {
        required RTCSdpType type;
                 DOMString  sdp = "";
      };

    4.6.1.  RTCSdpType
      enum RTCSdpType {
        "offer",
        "pranswer",
        "answer",
        "rollback"
      };
   */

  /*
    4.6.1.  enum RTCSdpType
   */
  promise_test(t => {
    const pc = new RTCPeerConnection();

    // SDP is validated after WebIDL validation
    return promise_rejects(t, new TypeError(),
      pc.setRemoteDescription({
        type: 'bogus',
        sdp: 'bogus'
      }));
  }, 'setRemoteDescription with invalid type and invalid SDP should reject with TypeError');

  promise_test(t => {
    const pc = new RTCPeerConnection();

    // SDP is validated after validating type
    return promise_rejects(t, 'InvalidStateError',
      pc.setRemoteDescription({
        type: 'answer',
        sdp: 'invalid'
      }));
  }, 'setRemoteDescription() with invalid SDP and stable state should reject with InvalidStateError');

  /* Operations after returning to stable state */

  promise_test(t => {
    const pc = new RTCPeerConnection();
    const pc2 = new RTCPeerConnection();

    test_state_change_event(t, pc,
      ['have-remote-offer', 'stable', 'have-remote-offer']);

    return pc2.createOffer({ offerToReceiveAudio: true })
    .then(offer1 =>
      pc.setRemoteDescription(offer1)
      .then(() => pc.createAnswer())
      .then(answer => pc.setLocalDescription(answer))
      .then(() => pc2.createOffer({ offerToReceiveVideo: true }))
      .then(offer2 => {
        return pc.setRemoteDescription(offer2)
        .then(() => {
          assert_equals(pc.signalingState, 'have-remote-offer');
          assert_session_desc_not_equals(offer1, offer2);
          assert_session_desc_equals(pc.remoteDescription, offer2);
          assert_session_desc_equals(pc.currentRemoteDescription, offer1);
          assert_session_desc_equals(pc.pendingRemoteDescription, offer2);
        });
      }));
  }, 'Calling setRemoteDescription() again after one round of remote-offer/local-answer should succeed');

  promise_test(t => {
    const pc = new RTCPeerConnection();

    test_state_change_event(t, pc,
       ['have-local-offer', 'stable', 'have-remote-offer']);

    return pc.createOffer({ offerToReceiveAudio: true })
    .then(offer =>
      pc.setLocalDescription(offer)
      .then(() => generateAnswer(offer)))
    .then(answer =>
      pc.setRemoteDescription(answer)
      .then(() => generateOffer({ pc, data: true }))
      .then(offer =>
        pc.setRemoteDescription(offer)
        .then(() => {
          assert_equals(pc.signalingState, 'have-remote-offer');
          assert_session_desc_equals(pc.remoteDescription, offer);
          assert_session_desc_equals(pc.currentRemoteDescription, answer);
          assert_session_desc_equals(pc.pendingRemoteDescription, offer);
        })));
  }, 'Switching role from offerer to answerer after going back to stable state should succeed');

  /*
    TODO
    4.3.2.  setRemoteDescription
      - If an a=identity attribute is present in the session description, the browser
        validates the identity assertion.
   */

</script>