diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2020-07-02 17:35:51 +0200 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2020-07-10 13:18:26 +0200 |
commit | c0fb6c8d2359b7fde937e18d058243bc22c43168 (patch) | |
tree | bf4f51566412277f97e6d834b27f86075a1a8f45 /components/script/dom | |
parent | 9f26be6ac0feb96032877ac2791216e24228f27f (diff) | |
download | servo-c0fb6c8d2359b7fde937e18d058243bc22c43168.tar.gz servo-c0fb6c8d2359b7fde937e18d058243bc22c43168.zip |
Implement MediaDevices.enumerateDevices()
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/mediadeviceinfo.rs | 85 | ||||
-rw-r--r-- | components/script/dom/mediadevices.rs | 40 | ||||
-rw-r--r-- | components/script/dom/mod.rs | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/MediaDeviceInfo.webidl | 21 | ||||
-rw-r--r-- | components/script/dom/webidls/MediaDevices.webidl | 2 |
5 files changed, 147 insertions, 2 deletions
diff --git a/components/script/dom/mediadeviceinfo.rs b/components/script/dom/mediadeviceinfo.rs new file mode 100644 index 00000000000..29d63027952 --- /dev/null +++ b/components/script/dom/mediadeviceinfo.rs @@ -0,0 +1,85 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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::MediaDeviceInfoBinding::MediaDeviceInfoMethods; +use crate::dom::bindings::codegen::Bindings::MediaDeviceInfoBinding::MediaDeviceKind; +use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::str::DOMString; +use crate::dom::globalscope::GlobalScope; +use dom_struct::dom_struct; +use servo_media::streams::device_monitor::MediaDeviceKind as ServoMediaDeviceKind; + +#[dom_struct] +pub struct MediaDeviceInfo { + reflector_: Reflector, + device_id: DOMString, + kind: MediaDeviceKind, + label: DOMString, + group_id: DOMString, +} + +impl MediaDeviceInfo { + fn new_inherited( + device_id: &str, + kind: MediaDeviceKind, + label: &str, + group_id: &str, + ) -> MediaDeviceInfo { + MediaDeviceInfo { + reflector_: Reflector::new(), + device_id: DOMString::from(device_id), + kind, + label: DOMString::from(label), + group_id: DOMString::from(group_id), + } + } + + pub fn new( + global: &GlobalScope, + device_id: &str, + kind: MediaDeviceKind, + label: &str, + group_id: &str, + ) -> DomRoot<MediaDeviceInfo> { + reflect_dom_object( + Box::new(MediaDeviceInfo::new_inherited( + device_id, kind, label, group_id, + )), + global, + ) + } +} + +impl MediaDeviceInfoMethods for MediaDeviceInfo { + /// https://w3c.github.io/mediacapture-main/#dom-mediadeviceinfo-deviceid + fn DeviceId(&self) -> DOMString { + self.device_id.clone() + } + + /// https://w3c.github.io/mediacapture-main/#dom-mediadeviceinfo-kind + fn Kind(&self) -> MediaDeviceKind { + self.kind + } + + /// https://w3c.github.io/mediacapture-main/#dom-mediadeviceinfo-label + fn Label(&self) -> DOMString { + self.label.clone() + } + + /// https://w3c.github.io/mediacapture-main/#dom-mediadeviceinfo-groupid + fn GroupId(&self) -> DOMString { + self.group_id.clone() + } +} + +impl From<ServoMediaDeviceKind> for MediaDeviceKind { + fn from(kind: ServoMediaDeviceKind) -> MediaDeviceKind { + match kind { + ServoMediaDeviceKind::AudioInput => MediaDeviceKind::Audioinput, + ServoMediaDeviceKind::AudioOutput => MediaDeviceKind::Audiooutput, + ServoMediaDeviceKind::VideoInput => MediaDeviceKind::Videoinput, + } + } +} diff --git a/components/script/dom/mediadevices.rs b/components/script/dom/mediadevices.rs index 1352cf4b128..b1f00a154be 100644 --- a/components/script/dom/mediadevices.rs +++ b/components/script/dom/mediadevices.rs @@ -12,10 +12,11 @@ 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::mediadeviceinfo::MediaDeviceInfo; use crate::dom::mediastream::MediaStream; use crate::dom::mediastreamtrack::MediaStreamTrack; use crate::dom::promise::Promise; -use crate::realms::InRealm; +use crate::realms::{AlreadyInRealm, InRealm}; use dom_struct::dom_struct; use servo_media::streams::capture::{Constrain, ConstrainRange, MediaTrackConstraintSet}; use servo_media::streams::MediaStreamType; @@ -62,6 +63,43 @@ impl MediaDevicesMethods for MediaDevices { p.resolve_native(&stream); p } + + /// https://w3c.github.io/mediacapture-main/#dom-mediadevices-enumeratedevices + fn EnumerateDevices(&self) -> Rc<Promise> { + // Step 1. + let global = self.global(); + let in_realm_proof = AlreadyInRealm::assert(&global); + let p = Promise::new_in_current_realm(&global, InRealm::Already(&in_realm_proof)); + + // Step 2. + // XXX These steps should be run in parallel. + // XXX Steps 2.1 - 2.4 + + // Step 2.5 + let media = ServoMedia::get().unwrap(); + let device_monitor = media.get_device_monitor(); + let result_list = match device_monitor.enumerate_devices() { + Ok(devices) => devices + .iter() + .map(|device| { + // XXX The media backend has no way to group devices yet. + MediaDeviceInfo::new( + &self.global(), + &device.device_id, + device.kind.into(), + &device.label, + "", + ) + }) + .collect(), + Err(_) => Vec::new(), + }; + + p.resolve_native(&result_list); + + // Step 3. + p + } } fn convert_constraints(js: &BooleanOrMediaTrackConstraints) -> Option<MediaTrackConstraintSet> { diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index 33a6d9e1bdc..7508838c15d 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -425,6 +425,7 @@ pub mod imagedata; pub mod inputevent; pub mod keyboardevent; pub mod location; +pub mod mediadeviceinfo; pub mod mediadevices; pub mod mediaelementaudiosourcenode; pub mod mediaerror; diff --git a/components/script/dom/webidls/MediaDeviceInfo.webidl b/components/script/dom/webidls/MediaDeviceInfo.webidl new file mode 100644 index 00000000000..ab24f8046f9 --- /dev/null +++ b/components/script/dom/webidls/MediaDeviceInfo.webidl @@ -0,0 +1,21 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + + // https://w3c.github.io/mediacapture-main/#device-info + +[Exposed=Window, +SecureContext, Pref="dom.webrtc.enabled"] +interface MediaDeviceInfo { + readonly attribute DOMString deviceId; + readonly attribute MediaDeviceKind kind; + readonly attribute DOMString label; + readonly attribute DOMString groupId; + [Default] object toJSON(); +}; + +enum MediaDeviceKind { + "audioinput", + "audiooutput", + "videoinput" +}; diff --git a/components/script/dom/webidls/MediaDevices.webidl b/components/script/dom/webidls/MediaDevices.webidl index 0d9c3b9e98b..53e6c3599a4 100644 --- a/components/script/dom/webidls/MediaDevices.webidl +++ b/components/script/dom/webidls/MediaDevices.webidl @@ -8,7 +8,7 @@ SecureContext, Pref="dom.webrtc.enabled"] interface MediaDevices : EventTarget { // attribute EventHandler ondevicechange; - // Promise<sequence<MediaDeviceInfo>> enumerateDevices(); + Promise<sequence<MediaDeviceInfo>> enumerateDevices(); }; partial interface Navigator { |