aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/rtcdatachannel.rs
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2020-06-11 16:58:02 +0200
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2020-06-29 16:53:48 +0200
commitf855fbb60411ff598b54d292ba34435b4903eacd (patch)
tree6f4a2d1dfe563fa2d29c3824d68c0a62e55f8652 /components/script/dom/rtcdatachannel.rs
parent7db485aeb22ea9dffa122c5ab3ff1ccc4659ece5 (diff)
downloadservo-f855fbb60411ff598b54d292ba34435b4903eacd.tar.gz
servo-f855fbb60411ff598b54d292ba34435b4903eacd.zip
Allow sending binary messages
Diffstat (limited to 'components/script/dom/rtcdatachannel.rs')
-rw-r--r--components/script/dom/rtcdatachannel.rs54
1 files changed, 45 insertions, 9 deletions
diff --git a/components/script/dom/rtcdatachannel.rs b/components/script/dom/rtcdatachannel.rs
index 75d8d48ccd8..ea2452dbc5e 100644
--- a/components/script/dom/rtcdatachannel.rs
+++ b/components/script/dom/rtcdatachannel.rs
@@ -7,10 +7,12 @@ use crate::dom::bindings::codegen::Bindings::RTCDataChannelBinding::RTCDataChann
use crate::dom::bindings::codegen::Bindings::RTCDataChannelBinding::RTCDataChannelMethods;
use crate::dom::bindings::codegen::Bindings::RTCDataChannelBinding::RTCDataChannelState;
use crate::dom::bindings::codegen::Bindings::RTCErrorBinding::{RTCErrorDetailType, RTCErrorInit};
+use crate::dom::bindings::error::{Error, Fallible};
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::{DOMString, USVString};
+use crate::dom::blob::Blob;
use crate::dom::event::{Event, EventBubbles, EventCancelable};
use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope;
@@ -22,6 +24,8 @@ use dom_struct::dom_struct;
use js::conversions::ToJSValConvertible;
use js::jsapi::JSAutoRealm;
use js::jsval::UndefinedValue;
+use js::rust::CustomAutoRooterGuard;
+use js::typedarray::{ArrayBuffer, ArrayBufferView};
use servo_media::webrtc::{
DataChannelId, DataChannelInit, DataChannelMessage, DataChannelState, WebRtcError,
};
@@ -180,6 +184,29 @@ impl RTCDataChannel {
};
*self.ready_state.borrow_mut() = state.into();
}
+
+ fn send(&self, source: &SendSource) -> Fallible<()> {
+ if *self.ready_state.borrow() != RTCDataChannelState::Open {
+ return Err(Error::InvalidState);
+ }
+
+ let message = match source {
+ SendSource::String(string) => DataChannelMessage::Text(string.0.clone()),
+ SendSource::Blob(blob) => {
+ DataChannelMessage::Binary(blob.get_bytes().unwrap_or(vec![]))
+ },
+ SendSource::ArrayBuffer(array) => DataChannelMessage::Binary(array.to_vec()),
+ SendSource::ArrayBufferView(array) => DataChannelMessage::Binary(array.to_vec()),
+ };
+
+ let controller = self.peer_connection.get_webrtc_controller().borrow();
+ controller
+ .as_ref()
+ .unwrap()
+ .send_data_channel_message(&self.servo_media_id, message);
+
+ Ok(())
+ }
}
impl Drop for RTCDataChannel {
@@ -189,6 +216,13 @@ impl Drop for RTCDataChannel {
}
}
+enum SendSource<'a, 'b> {
+ String(&'a USVString),
+ Blob(&'a Blob),
+ ArrayBuffer(CustomAutoRooterGuard<'b, ArrayBuffer>),
+ ArrayBufferView(CustomAutoRooterGuard<'b, ArrayBufferView>),
+}
+
impl RTCDataChannelMethods for RTCDataChannel {
// https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-onopen
event_handler!(open, GetOnopen, SetOnopen);
@@ -265,22 +299,24 @@ impl RTCDataChannelMethods for RTCDataChannel {
// fn SetBinaryType(&self, value: DOMString) -> ();
// https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-send
- fn Send(&self, data: USVString) {
- let controller = self.peer_connection.get_webrtc_controller().borrow();
- controller
- .as_ref()
- .unwrap()
- .send_data_channel_message(&self.servo_media_id, DataChannelMessage::Text(data.0));
+ fn Send(&self, data: USVString) -> Fallible<()> {
+ self.send(&SendSource::String(&data))
}
// https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-send!overload-1
- // fn Send_(&self, data: &Blob) -> () {}
+ fn Send_(&self, data: &Blob) -> Fallible<()> {
+ self.send(&SendSource::Blob(data))
+ }
// https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-send!overload-2
- // fn Send__(&self, data: CustomAutoRooterGuard<ArrayBuffer>) -> () {}
+ fn Send__(&self, data: CustomAutoRooterGuard<ArrayBuffer>) -> Fallible<()> {
+ self.send(&SendSource::ArrayBuffer(data))
+ }
// https://www.w3.org/TR/webrtc/#dom-rtcdatachannel-send!overload-3
- // fn Send___(&self, data: CustomAutoRooterGuard<ArrayBufferView>) -> () {}
+ fn Send___(&self, data: CustomAutoRooterGuard<ArrayBufferView>) -> Fallible<()> {
+ self.send(&SendSource::ArrayBufferView(data))
+ }
}
impl From<&RTCDataChannelInit> for DataChannelInit {