aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/rtcpeerconnection.rs
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2019-03-06 12:31:17 +0530
committerManish Goregaokar <manishsmail@gmail.com>2019-03-25 09:04:13 -0700
commitfc25a80892e701742f5167a0c4ea6a92e5730c7b (patch)
tree7b4688c1083bc665c19b810786c50e851e414032 /components/script/dom/rtcpeerconnection.rs
parent209caa418ba3891e8fd5a9cc911a163380894bd5 (diff)
downloadservo-fc25a80892e701742f5167a0c4ea6a92e5730c7b.tar.gz
servo-fc25a80892e701742f5167a0c4ea6a92e5730c7b.zip
Add ICEConnectionState to RTCPeerConnection
Diffstat (limited to 'components/script/dom/rtcpeerconnection.rs')
-rw-r--r--components/script/dom/rtcpeerconnection.rs68
1 files changed, 63 insertions, 5 deletions
diff --git a/components/script/dom/rtcpeerconnection.rs b/components/script/dom/rtcpeerconnection.rs
index 13e58b14038..8e12e2ab012 100644
--- a/components/script/dom/rtcpeerconnection.rs
+++ b/components/script/dom/rtcpeerconnection.rs
@@ -7,7 +7,8 @@ use crate::dom::bindings::codegen::Bindings::RTCIceCandidateBinding::RTCIceCandi
use crate::dom::bindings::codegen::Bindings::RTCPeerConnectionBinding;
use crate::dom::bindings::codegen::Bindings::RTCPeerConnectionBinding::RTCPeerConnectionMethods;
use crate::dom::bindings::codegen::Bindings::RTCPeerConnectionBinding::{
- RTCAnswerOptions, RTCBundlePolicy, RTCConfiguration, RTCIceGatheringState, RTCOfferOptions,
+ RTCAnswerOptions, RTCBundlePolicy, RTCConfiguration, RTCIceConnectionState,
+ RTCIceGatheringState, RTCOfferOptions,
};
use crate::dom::bindings::codegen::Bindings::RTCSessionDescriptionBinding::{
RTCSdpType, RTCSessionDescriptionInit,
@@ -36,8 +37,8 @@ use dom_struct::dom_struct;
use servo_media::streams::MediaStream as BackendMediaStream;
use servo_media::webrtc::{
- BundlePolicy, GatheringState, IceCandidate, SdpType, SessionDescription, WebRtcController,
- WebRtcSignaller,
+ BundlePolicy, GatheringState, IceCandidate, IceConnectionState, SdpType, SessionDescription,
+ WebRtcController, WebRtcSignaller,
};
use servo_media::ServoMedia;
use servo_media_auto::Backend;
@@ -61,6 +62,7 @@ pub struct RTCPeerConnection {
local_description: MutNullableDom<RTCSessionDescription>,
remote_description: MutNullableDom<RTCSessionDescription>,
gathering_state: Cell<RTCIceGatheringState>,
+ ice_connection_state: Cell<RTCIceConnectionState>,
}
struct RTCSignaller {
@@ -103,6 +105,17 @@ impl WebRtcSignaller for RTCSignaller {
);
}
+ fn update_ice_connection_state(&self, state: IceConnectionState) {
+ let this = self.trusted.clone();
+ let _ = self.task_source.queue_with_canceller(
+ task!(update_ice_connection_state: move || {
+ let this = this.root();
+ this.update_ice_connection_state(state);
+ }),
+ &self.canceller,
+ );
+ }
+
fn on_add_stream(&self, _: Box<BackendMediaStream>) {}
fn close(&self) {
@@ -122,6 +135,7 @@ impl RTCPeerConnection {
local_description: Default::default(),
remote_description: Default::default(),
gathering_state: Cell::new(RTCIceGatheringState::New),
+ ice_connection_state: Cell::new(RTCIceConnectionState::New),
}
}
@@ -250,11 +264,30 @@ impl RTCPeerConnection {
);
event.upcast::<Event>().fire(self.upcast());
}
+ }
+
+ /// https://www.w3.org/TR/webrtc/#update-ice-connection-state
+ fn update_ice_connection_state(&self, state: IceConnectionState) {
+ // step 1
+ if self.closed.get() {
+ return;
+ }
+
+ // step 2 (state derivation already done by gstreamer)
+ let state: RTCIceConnectionState = state.into();
+
+ // step 3
+ if state == self.ice_connection_state.get() {
+ return;
+ }
+
+ // step 4
+ self.ice_connection_state.set(state);
// step 5
let event = Event::new(
&self.global(),
- atom!("icegatheringstatechange"),
+ atom!("iceconnectionstatechange"),
EventBubbles::DoesNotBubble,
EventCancelable::NotCancelable,
);
@@ -332,6 +365,13 @@ impl RTCPeerConnectionMethods for RTCPeerConnection {
/// https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-icecandidate
event_handler!(icecandidate, GetOnicecandidate, SetOnicecandidate);
+ /// https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-iceconnectionstatechange
+ event_handler!(
+ iceconnectionstatechange,
+ GetOniceconnectionstatechange,
+ SetOniceconnectionstatechange
+ );
+
/// https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-icegatheringstatechange
event_handler!(
icegatheringstatechange,
@@ -494,6 +534,11 @@ impl RTCPeerConnectionMethods for RTCPeerConnection {
fn IceGatheringState(&self) -> RTCIceGatheringState {
self.gathering_state.get()
}
+
+ /// https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-iceconnectionstate
+ fn IceConnectionState(&self) -> RTCIceConnectionState {
+ self.ice_connection_state.get()
+ }
}
impl From<SessionDescription> for RTCSessionDescriptionInit {
@@ -526,7 +571,6 @@ impl<'a> From<&'a RTCSessionDescriptionInit> for SessionDescription {
}
}
-
impl From<GatheringState> for RTCIceGatheringState {
fn from(state: GatheringState) -> Self {
match state {
@@ -536,3 +580,17 @@ impl From<GatheringState> for RTCIceGatheringState {
}
}
}
+
+impl From<IceConnectionState> for RTCIceConnectionState {
+ fn from(state: IceConnectionState) -> Self {
+ match state {
+ IceConnectionState::New => RTCIceConnectionState::New,
+ IceConnectionState::Checking => RTCIceConnectionState::Checking,
+ IceConnectionState::Connected => RTCIceConnectionState::Connected,
+ IceConnectionState::Completed => RTCIceConnectionState::Completed,
+ IceConnectionState::Disconnected => RTCIceConnectionState::Disconnected,
+ IceConnectionState::Failed => RTCIceConnectionState::Failed,
+ IceConnectionState::Closed => RTCIceConnectionState::Closed,
+ }
+ }
+}