diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2019-01-28 13:23:25 -0800 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2019-01-29 11:37:00 -0800 |
commit | 8b0719a6f2dd9cfefa33ddd10800399cd59f36e5 (patch) | |
tree | 75ce0c0669265205634b4ae8d1b5930f2770de10 /components/script/dom | |
parent | eee183d7f4dc38194e77200d655a40c00a02e5c3 (diff) | |
download | servo-8b0719a6f2dd9cfefa33ddd10800399cd59f36e5.tar.gz servo-8b0719a6f2dd9cfefa33ddd10800399cd59f36e5.zip |
Add MediaDevices::GetUserMedia
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/bindings/trace.rs | 3 | ||||
-rw-r--r-- | components/script/dom/mediadevices.rs | 31 | ||||
-rw-r--r-- | components/script/dom/mediastream.rs | 13 | ||||
-rw-r--r-- | components/script/dom/navigator.rs | 3 | ||||
-rw-r--r-- | components/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<MediaFrameRenderer>); 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<Promise> { + 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<Box<BackendMediaStream>>, } impl MediaStream { - pub fn new_inherited() -> MediaStream { + pub fn new_inherited(tracks: Vec<Box<BackendMediaStream>>) -> MediaStream { MediaStream { eventtarget: EventTarget::new_inherited(), + tracks, } } - pub fn new(global: &GlobalScope) -> DomRoot<MediaStream> { + pub fn new(global: &GlobalScope, tracks: Vec<Box<BackendMediaStream>>) -> DomRoot<MediaStream> { 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<MediaDevices> { - 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<MediaStream> getUserMedia(optional MediaStreamConstraints constraints); + Promise<MediaStream> getUserMedia(optional MediaStreamConstraints constraints); }; |