aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/rtcpeerconnection.rs26
-rw-r--r--components/script/dom/webidls/RTCPeerConnection.webidl12
2 files changed, 37 insertions, 1 deletions
diff --git a/components/script/dom/rtcpeerconnection.rs b/components/script/dom/rtcpeerconnection.rs
index 3e8cb8eba43..9ec1940bbb3 100644
--- a/components/script/dom/rtcpeerconnection.rs
+++ b/components/script/dom/rtcpeerconnection.rs
@@ -26,10 +26,12 @@ use crate::dom::event::{Event, EventBubbles, EventCancelable};
use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope;
use crate::dom::mediastream::MediaStream;
+use crate::dom::mediastreamtrack::MediaStreamTrack;
use crate::dom::promise::Promise;
use crate::dom::rtcicecandidate::RTCIceCandidate;
use crate::dom::rtcpeerconnectioniceevent::RTCPeerConnectionIceEvent;
use crate::dom::rtcsessiondescription::RTCSessionDescription;
+use crate::dom::rtctrackevent::RTCTrackEvent;
use crate::dom::window::Window;
use crate::task::TaskCanceller;
use crate::task_source::networking::NetworkingTaskSource;
@@ -129,7 +131,17 @@ impl WebRtcSignaller for RTCSignaller {
);
}
- fn on_add_stream(&self, _: &MediaStreamId, _: MediaStreamType) {}
+ fn on_add_stream(&self, id: &MediaStreamId, ty: MediaStreamType) {
+ let this = self.trusted.clone();
+ let id = *id;
+ let _ = self.task_source.queue_with_canceller(
+ task!(on_add_stream: move || {
+ let this = this.root();
+ this.on_add_stream(id, ty);
+ }),
+ &self.canceller,
+ );
+ }
fn close(&self) {
// do nothing
@@ -239,6 +251,15 @@ impl RTCPeerConnection {
event.upcast::<Event>().fire(self.upcast());
}
+ fn on_add_stream(&self, id: MediaStreamId, ty: MediaStreamType) {
+ if self.closed.get() {
+ return;
+ }
+ let track = MediaStreamTrack::new(&self.global(), id, ty);
+ let event = RTCTrackEvent::new(&self.global(), atom!("track"), false, false, &track);
+ event.upcast::<Event>().fire(self.upcast());
+ }
+
/// https://www.w3.org/TR/webrtc/#update-ice-gathering-state
fn update_gathering_state(&self, state: GatheringState) {
// step 1
@@ -400,6 +421,9 @@ impl RTCPeerConnectionMethods for RTCPeerConnection {
/// https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-icecandidate
event_handler!(icecandidate, GetOnicecandidate, SetOnicecandidate);
+ /// https://www.w3.org/TR/webrtc/#dom-rtcpeerconnection-ontrack
+ event_handler!(track, GetOntrack, SetOntrack);
+
/// https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnection-iceconnectionstatechange
event_handler!(
iceconnectionstatechange,
diff --git a/components/script/dom/webidls/RTCPeerConnection.webidl b/components/script/dom/webidls/RTCPeerConnection.webidl
index 0f00f3b5b95..58cb7301ea3 100644
--- a/components/script/dom/webidls/RTCPeerConnection.webidl
+++ b/components/script/dom/webidls/RTCPeerConnection.webidl
@@ -114,3 +114,15 @@ enum RTCSignalingState {
"have-remote-pranswer",
"closed"
};
+
+partial interface RTCPeerConnection {
+ // sequence<RTCRtpSender> getSenders();
+ // sequence<RTCRtpReceiver> getReceivers();
+ // sequence<RTCRtpTransceiver> getTransceivers();
+ // RTCRtpSender addTrack(MediaStreamTrack track,
+ // MediaStream... streams);
+ // void removeTrack(RTCRtpSender sender);
+ // RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
+ // optional RTCRtpTransceiverInit init);
+ attribute EventHandler ontrack;
+};