diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2020-06-11 11:27:58 +0200 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2020-06-29 16:53:48 +0200 |
commit | 9d456d5d17aebe0c3aae988f6450f9af51573c30 (patch) | |
tree | 5be84d0e4c809d2275c1c42238b103cf866b277d /components/script/dom/rtcpeerconnection.rs | |
parent | 960b010d300503befa9c4469d0ee055908dba923 (diff) | |
download | servo-9d456d5d17aebe0c3aae988f6450f9af51573c30.tar.gz servo-9d456d5d17aebe0c3aae988f6450f9af51573c30.zip |
Use data channel ids
Diffstat (limited to 'components/script/dom/rtcpeerconnection.rs')
-rw-r--r-- | components/script/dom/rtcpeerconnection.rs | 90 |
1 files changed, 72 insertions, 18 deletions
diff --git a/components/script/dom/rtcpeerconnection.rs b/components/script/dom/rtcpeerconnection.rs index 2e568c7a971..1ec1cc4e337 100644 --- a/components/script/dom/rtcpeerconnection.rs +++ b/components/script/dom/rtcpeerconnection.rs @@ -20,7 +20,7 @@ use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::{Trusted, TrustedPromise}; use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::reflector::DomObject; -use crate::dom::bindings::root::{DomRoot, MutNullableDom}; +use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; use crate::dom::bindings::str::USVString; use crate::dom::event::{Event, EventBubbles, EventCancelable}; use crate::dom::eventtarget::EventTarget; @@ -44,12 +44,14 @@ use dom_struct::dom_struct; use servo_media::streams::registry::MediaStreamId; use servo_media::streams::MediaStreamType; use servo_media::webrtc::{ - BundlePolicy, GatheringState, IceCandidate, IceConnectionState, SdpType, SessionDescription, - SignalingState, WebRtcController, WebRtcDataChannelBackend, WebRtcSignaller, + BundlePolicy, DataChannelEvent, DataChannelId, GatheringState, IceCandidate, + IceConnectionState, SdpType, SessionDescription, SignalingState, WebRtcController, + WebRtcSignaller, }; use servo_media::ServoMedia; use std::cell::Cell; +use std::collections::HashMap; use std::rc::Rc; #[dom_struct] @@ -70,6 +72,8 @@ pub struct RTCPeerConnection { gathering_state: Cell<RTCIceGatheringState>, ice_connection_state: Cell<RTCIceConnectionState>, signaling_state: Cell<RTCSignalingState>, + #[ignore_malloc_size_of = "defined in servo-media"] + data_channels: DomRefCell<HashMap<DataChannelId, Dom<RTCDataChannel>>>, } struct RTCSignaller { @@ -146,13 +150,18 @@ impl WebRtcSignaller for RTCSignaller { ); } - fn on_data_channel(&self, channel: Box<dyn WebRtcDataChannelBackend>) { + fn on_data_channel_event( + &self, + channel: DataChannelId, + event: DataChannelEvent, + _: &WebRtcController, + ) { // XXX(ferjm) get label and options from channel properties. let this = self.trusted.clone(); let _ = self.task_source.queue_with_canceller( - task!(on_data_channel: move || { + task!(on_data_channel_event: move || { let this = this.root(); - this.on_data_channel(channel); + this.on_data_channel_event(channel, event); }), &self.canceller, ); @@ -160,6 +169,7 @@ impl WebRtcSignaller for RTCSignaller { fn close(&self) { // do nothing + // XXX(ferjm) close all data channels. } } @@ -177,6 +187,7 @@ impl RTCPeerConnection { gathering_state: Cell::new(RTCIceGatheringState::New), ice_connection_state: Cell::new(RTCIceConnectionState::New), signaling_state: Cell::new(RTCSignalingState::Stable), + data_channels: DomRefCell::new(HashMap::new()), } } @@ -215,6 +226,10 @@ impl RTCPeerConnection { Ok(RTCPeerConnection::new(&window.global(), config)) } + pub fn get_webrtc_controller(&self) -> &DomRefCell<Option<WebRtcController>> { + &self.controller + } + fn make_signaller(&self) -> Box<dyn WebRtcSignaller> { let trusted = Trusted::new(self); let (task_source, canceller) = self @@ -272,22 +287,61 @@ impl RTCPeerConnection { event.upcast::<Event>().fire(self.upcast()); } - fn on_data_channel(&self, channel: Box<dyn WebRtcDataChannelBackend>) { + fn on_data_channel_event(&self, channel_id: DataChannelId, event: DataChannelEvent) { if self.closed.get() { return; } - let channel = RTCDataChannel::new( - &self.global(), - &self.controller, - USVString::from("".to_owned()), - &RTCDataChannelInit::empty(), - Some(channel), - ); + match event { + DataChannelEvent::NewChannel => { + let channel = RTCDataChannel::new( + &self.global(), + &self, + USVString::from("".to_owned()), + &RTCDataChannelInit::empty(), + Some(channel_id), + ); - let event = - RTCDataChannelEvent::new(&self.global(), atom!("datachannel"), false, false, &channel); - event.upcast::<Event>().fire(self.upcast()); + self.register_data_channel(channel_id, &channel); + + let event = RTCDataChannelEvent::new( + &self.global(), + atom!("datachannel"), + false, + false, + &channel, + ); + event.upcast::<Event>().fire(self.upcast()); + }, + _ => { + if let Some(ref channel) = self.data_channels.borrow().get(&channel_id) { + match event { + DataChannelEvent::Open => channel.on_open(), + DataChannelEvent::Close => channel.on_close(), + DataChannelEvent::Error(error) => channel.on_error(error), + DataChannelEvent::OnMessage(message) => channel.on_message(message), + _ => unreachable!(), + } + } else { + debug_assert!(false, "Got an event for an unregistered data channel"); + } + }, + }; + } + + pub fn register_data_channel(&self, id: DataChannelId, channel: &RTCDataChannel) { + if self + .data_channels + .borrow_mut() + .insert(id, Dom::from_ref(channel)) + .is_none() + { + debug_assert!(false, "Could not register data channel"); + } + } + + pub fn unregister_data_channel(&self, id: &DataChannelId) { + self.data_channels.borrow_mut().remove(&id); } /// https://www.w3.org/TR/webrtc/#update-ice-gathering-state @@ -677,7 +731,7 @@ impl RTCPeerConnectionMethods for RTCPeerConnection { label: USVString, init: &RTCDataChannelInit, ) -> DomRoot<RTCDataChannel> { - RTCDataChannel::new(&self.global(), &self.controller, label, init, None) + RTCDataChannel::new(&self.global(), &self, label, init, None) } } |