aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2020-07-02 17:35:51 +0200
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2020-07-10 13:18:26 +0200
commitc0fb6c8d2359b7fde937e18d058243bc22c43168 (patch)
treebf4f51566412277f97e6d834b27f86075a1a8f45
parent9f26be6ac0feb96032877ac2791216e24228f27f (diff)
downloadservo-c0fb6c8d2359b7fde937e18d058243bc22c43168.tar.gz
servo-c0fb6c8d2359b7fde937e18d058243bc22c43168.zip
Implement MediaDevices.enumerateDevices()
-rw-r--r--Cargo.lock24
-rw-r--r--components/script/dom/mediadeviceinfo.rs85
-rw-r--r--components/script/dom/mediadevices.rs40
-rw-r--r--components/script/dom/mod.rs1
-rw-r--r--components/script/dom/webidls/MediaDeviceInfo.webidl21
-rw-r--r--components/script/dom/webidls/MediaDevices.webidl2
6 files changed, 159 insertions, 14 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 117f1ff7214..f74b0b86ba9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5077,7 +5077,7 @@ dependencies = [
[[package]]
name = "servo-media"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"servo-media-audio",
"servo-media-player",
@@ -5089,7 +5089,7 @@ dependencies = [
[[package]]
name = "servo-media-audio"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"boxfnonce",
"byte-slice-cast",
@@ -5111,7 +5111,7 @@ dependencies = [
[[package]]
name = "servo-media-dummy"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"boxfnonce",
"ipc-channel",
@@ -5126,7 +5126,7 @@ dependencies = [
[[package]]
name = "servo-media-gstreamer"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"boxfnonce",
"byte-slice-cast",
@@ -5162,7 +5162,7 @@ dependencies = [
[[package]]
name = "servo-media-gstreamer-render"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"gstreamer",
"gstreamer-video",
@@ -5172,7 +5172,7 @@ dependencies = [
[[package]]
name = "servo-media-gstreamer-render-android"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"glib",
"gstreamer",
@@ -5185,7 +5185,7 @@ dependencies = [
[[package]]
name = "servo-media-gstreamer-render-unix"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"glib",
"gstreamer",
@@ -5198,7 +5198,7 @@ dependencies = [
[[package]]
name = "servo-media-player"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"ipc-channel",
"serde",
@@ -5210,7 +5210,7 @@ dependencies = [
[[package]]
name = "servo-media-streams"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"lazy_static",
"uuid",
@@ -5219,12 +5219,12 @@ dependencies = [
[[package]]
name = "servo-media-traits"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
[[package]]
name = "servo-media-webrtc"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"boxfnonce",
"lazy_static",
@@ -5302,7 +5302,7 @@ dependencies = [
[[package]]
name = "servo_media_derive"
version = "0.1.0"
-source = "git+https://github.com/servo/media#eabe28e6df6170e4e36ef3d3fd48e1b592ef4964"
+source = "git+https://github.com/servo/media#7b0794d552207012131052be2da896e22174791b"
dependencies = [
"proc-macro2 1.0.17",
"quote 1.0.2",
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 {