script/dom/webrtc/
rtcicecandidate.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use dom_struct::dom_struct;
6use js::rust::HandleObject;
7
8use crate::dom::bindings::codegen::Bindings::RTCIceCandidateBinding::{
9    RTCIceCandidateInit, RTCIceCandidateMethods,
10};
11use crate::dom::bindings::error::{Error, Fallible};
12use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto};
13use crate::dom::bindings::root::DomRoot;
14use crate::dom::bindings::str::DOMString;
15use crate::dom::window::Window;
16use crate::script_runtime::CanGc;
17
18#[dom_struct]
19pub(crate) struct RTCIceCandidate {
20    reflector: Reflector,
21    candidate: DOMString,
22    sdp_m_id: Option<DOMString>,
23    sdp_m_line_index: Option<u16>,
24    username_fragment: Option<DOMString>,
25}
26
27impl RTCIceCandidate {
28    pub(crate) fn new_inherited(
29        candidate: DOMString,
30        sdp_m_id: Option<DOMString>,
31        sdp_m_line_index: Option<u16>,
32        username_fragment: Option<DOMString>,
33    ) -> RTCIceCandidate {
34        RTCIceCandidate {
35            reflector: Reflector::new(),
36            candidate,
37            sdp_m_id,
38            sdp_m_line_index,
39            username_fragment,
40        }
41    }
42
43    pub(crate) fn new(
44        window: &Window,
45        candidate: DOMString,
46        sdp_m_id: Option<DOMString>,
47        sdp_m_line_index: Option<u16>,
48        username_fragment: Option<DOMString>,
49        can_gc: CanGc,
50    ) -> DomRoot<RTCIceCandidate> {
51        Self::new_with_proto(
52            window,
53            None,
54            candidate,
55            sdp_m_id,
56            sdp_m_line_index,
57            username_fragment,
58            can_gc,
59        )
60    }
61
62    fn new_with_proto(
63        window: &Window,
64        proto: Option<HandleObject>,
65        candidate: DOMString,
66        sdp_m_id: Option<DOMString>,
67        sdp_m_line_index: Option<u16>,
68        username_fragment: Option<DOMString>,
69        can_gc: CanGc,
70    ) -> DomRoot<RTCIceCandidate> {
71        reflect_dom_object_with_proto(
72            Box::new(RTCIceCandidate::new_inherited(
73                candidate,
74                sdp_m_id,
75                sdp_m_line_index,
76                username_fragment,
77            )),
78            window,
79            proto,
80            can_gc,
81        )
82    }
83}
84
85impl RTCIceCandidateMethods<crate::DomTypeHolder> for RTCIceCandidate {
86    /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-constructor>
87    fn Constructor(
88        window: &Window,
89        proto: Option<HandleObject>,
90        can_gc: CanGc,
91        config: &RTCIceCandidateInit,
92    ) -> Fallible<DomRoot<RTCIceCandidate>> {
93        if config.sdpMid.is_none() && config.sdpMLineIndex.is_none() {
94            return Err(Error::Type(
95                "one of sdpMid and sdpMLineIndex must be set".to_string(),
96            ));
97        }
98        Ok(RTCIceCandidate::new_with_proto(
99            window,
100            proto,
101            config.candidate.clone(),
102            config.sdpMid.clone(),
103            config.sdpMLineIndex,
104            config.usernameFragment.clone(),
105            can_gc,
106        ))
107    }
108
109    /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-candidate>
110    fn Candidate(&self) -> DOMString {
111        self.candidate.clone()
112    }
113
114    /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-sdpmid>
115    fn GetSdpMid(&self) -> Option<DOMString> {
116        self.sdp_m_id.clone()
117    }
118
119    /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-sdpmlineindex>
120    fn GetSdpMLineIndex(&self) -> Option<u16> {
121        self.sdp_m_line_index
122    }
123
124    /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-usernamefragment>
125    fn GetUsernameFragment(&self) -> Option<DOMString> {
126        self.username_fragment.clone()
127    }
128
129    /// <https://w3c.github.io/webrtc-pc/#dom-rtcicecandidate-tojson>
130    fn ToJSON(&self) -> RTCIceCandidateInit {
131        RTCIceCandidateInit {
132            candidate: self.candidate.clone(),
133            sdpMid: self.sdp_m_id.clone(),
134            sdpMLineIndex: self.sdp_m_line_index,
135            usernameFragment: self.username_fragment.clone(),
136        }
137    }
138}