From 8b0719a6f2dd9cfefa33ddd10800399cd59f36e5 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Mon, 28 Jan 2019 13:23:25 -0800 Subject: [PATCH] Add MediaDevices::GetUserMedia --- components/script/dom/bindings/trace.rs | 3 +- components/script/dom/mediadevices.rs | 31 +++++++++++++++++-- components/script/dom/mediastream.rs | 13 ++++---- components/script/dom/navigator.rs | 3 +- .../script/dom/webidls/MediaDevices.webidl | 2 +- 5 files changed, 40 insertions(+), 12 deletions(-) diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index c128b6d9154..3e20fab1dcf 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -101,7 +101,7 @@ use servo_media::audio::graph::NodeId; use servo_media::audio::panner_node::{DistanceModel, PanningModel}; use servo_media::audio::param::ParamType; use servo_media::player::Player; -use servo_media::webrtc::WebRtcController; +use servo_media::webrtc::{MediaStream as BackendMediaStream, WebRtcController}; use servo_media::Backend; use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl}; use smallvec::SmallVec; @@ -485,6 +485,7 @@ unsafe_no_jsmanaged_fields!(NodeId); unsafe_no_jsmanaged_fields!(AnalysisEngine, DistanceModel, PanningModel, ParamType); unsafe_no_jsmanaged_fields!(dyn Player); unsafe_no_jsmanaged_fields!(WebRtcController); +unsafe_no_jsmanaged_fields!(dyn BackendMediaStream); unsafe_no_jsmanaged_fields!(Mutex); unsafe_no_jsmanaged_fields!(RenderApiSender); unsafe_no_jsmanaged_fields!(ResourceFetchTiming); diff --git a/components/script/dom/mediadevices.rs b/components/script/dom/mediadevices.rs index 5897ad576eb..e018087a86c 100644 --- a/components/script/dom/mediadevices.rs +++ b/components/script/dom/mediadevices.rs @@ -2,15 +2,18 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use crate::dom::bindings::codegen::Bindings::MediaDevicesBinding; -use crate::dom::bindings::error::Fallible; +use crate::dom::bindings::codegen::Bindings::MediaDevicesBinding::MediaStreamConstraints; +use crate::dom::bindings::codegen::Bindings::MediaDevicesBinding::{self, MediaDevicesMethods}; use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::DomRoot; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; -use crate::dom::window::Window; +use crate::dom::mediastream::MediaStream; +use crate::dom::promise::Promise; use dom_struct::dom_struct; +use servo_media::ServoMedia; +use std::rc::Rc; #[dom_struct] pub struct MediaDevices { @@ -32,3 +35,25 @@ impl MediaDevices { ) } } + +impl MediaDevicesMethods for MediaDevices { + /// https://w3c.github.io/mediacapture-main/#dom-mediadevices-getusermedia + fn GetUserMedia(&self, constraints: &MediaStreamConstraints) -> Rc { + let p = Promise::new(&self.global()); + let media = ServoMedia::get().unwrap(); + let mut tracks = vec![]; + if constraints.audio { + if let Some(audio) = media.create_audioinput_stream() { + tracks.push(audio) + } + } + if constraints.video { + if let Some(video) = media.create_videoinput_stream() { + tracks.push(video) + } + } + let stream = MediaStream::new(&self.global(), tracks); + p.resolve_native(&stream); + p + } +} diff --git a/components/script/dom/mediastream.rs b/components/script/dom/mediastream.rs index 2641a9929bb..a5bfb0c183d 100644 --- a/components/script/dom/mediastream.rs +++ b/components/script/dom/mediastream.rs @@ -3,30 +3,31 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::codegen::Bindings::MediaStreamBinding; -use crate::dom::bindings::error::Fallible; use crate::dom::bindings::reflector::reflect_dom_object; -use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::DomRoot; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; -use crate::dom::window::Window; use dom_struct::dom_struct; +use servo_media::webrtc::MediaStream as BackendMediaStream; #[dom_struct] pub struct MediaStream { eventtarget: EventTarget, + #[ignore_malloc_size_of = "defined in servo-media"] + tracks: Vec>, } impl MediaStream { - pub fn new_inherited() -> MediaStream { + pub fn new_inherited(tracks: Vec>) -> MediaStream { MediaStream { eventtarget: EventTarget::new_inherited(), + tracks, } } - pub fn new(global: &GlobalScope) -> DomRoot { + pub fn new(global: &GlobalScope, tracks: Vec>) -> DomRoot { reflect_dom_object( - Box::new(MediaStream::new_inherited()), + Box::new(MediaStream::new_inherited(tracks)), global, MediaStreamBinding::Wrap, ) diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs index 49d7646b3c8..03899baf97e 100644 --- a/components/script/dom/navigator.rs +++ b/components/script/dom/navigator.rs @@ -167,6 +167,7 @@ impl NavigatorMethods for Navigator { /// https://w3c.github.io/mediacapture-main/#dom-navigator-mediadevices fn MediaDevices(&self) -> DomRoot { - self.mediadevices.or_init(|| MediaDevices::new(&self.global())) + self.mediadevices + .or_init(|| MediaDevices::new(&self.global())) } } diff --git a/components/script/dom/webidls/MediaDevices.webidl b/components/script/dom/webidls/MediaDevices.webidl index da877bde267..7fa30e0b916 100644 --- a/components/script/dom/webidls/MediaDevices.webidl +++ b/components/script/dom/webidls/MediaDevices.webidl @@ -18,7 +18,7 @@ partial interface Navigator { partial interface MediaDevices { // MediaTrackSupportedConstraints getSupportedConstraints(); - // Promise getUserMedia(optional MediaStreamConstraints constraints); + Promise getUserMedia(optional MediaStreamConstraints constraints); };