diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 11 | ||||
-rw-r--r-- | components/script/dom/mediadevices.rs | 68 | ||||
-rw-r--r-- | components/script/dom/webidls/MediaDevices.webidl | 84 |
3 files changed, 115 insertions, 48 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index dea6e104213..fe88275bf20 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -747,7 +747,15 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, for memberType in type.unroll().flatMemberTypes if memberType.isDictionary() ] - if dictionaries: + if defaultValue and not isinstance(defaultValue, IDLNullValue): + tag = defaultValue.type.tag() + if tag is IDLType.Tags.bool: + default = "%s::Boolean(%s)" % ( + union_native_type(type), + "true" if defaultValue.value else "false") + else: + raise("We don't currently support default values that aren't null or boolean") + elif dictionaries: if defaultValue: assert isinstance(defaultValue, IDLNullValue) dictionary, = dictionaries @@ -2379,6 +2387,7 @@ def UnionTypes(descriptors, dictionaries, callbacks, typedefs, config): 'crate::dom::bindings::conversions::root_from_handlevalue', 'std::ptr::NonNull', 'crate::dom::bindings::mozmap::MozMap', + 'crate::dom::bindings::num::Finite', 'crate::dom::bindings::root::DomRoot', 'crate::dom::bindings::str::ByteString', 'crate::dom::bindings::str::DOMString', diff --git a/components/script/dom/mediadevices.rs b/components/script/dom/mediadevices.rs index 60b99c7fb23..b89762c3779 100644 --- a/components/script/dom/mediadevices.rs +++ b/components/script/dom/mediadevices.rs @@ -4,6 +4,9 @@ use crate::dom::bindings::codegen::Bindings::MediaDevicesBinding::MediaStreamConstraints; use crate::dom::bindings::codegen::Bindings::MediaDevicesBinding::{self, MediaDevicesMethods}; +use crate::dom::bindings::codegen::UnionTypes::BooleanOrMediaTrackConstraints; +use crate::dom::bindings::codegen::UnionTypes::ClampedUnsignedLongOrConstrainULongRange as ConstrainULong; +use crate::dom::bindings::codegen::UnionTypes::DoubleOrConstrainDoubleRange as ConstrainDouble; use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::DomRoot; @@ -12,6 +15,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::mediastream::MediaStream; use crate::dom::promise::Promise; use dom_struct::dom_struct; +use servo_media::streams::capture::{Constrain, ConstrainRange, MediaTrackConstraintSet}; use servo_media::ServoMedia; use std::rc::Rc; @@ -42,13 +46,13 @@ impl MediaDevicesMethods for MediaDevices { 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(Default::default()) { + if let Some(constraints) = convert_constraints(&constraints.audio) { + if let Some(audio) = media.create_audioinput_stream(constraints) { tracks.push(audio) } } - if constraints.video { - if let Some(video) = media.create_videoinput_stream(Default::default()) { + if let Some(constraints) = convert_constraints(&constraints.video) { + if let Some(video) = media.create_videoinput_stream(constraints) { tracks.push(video) } } @@ -57,3 +61,59 @@ impl MediaDevicesMethods for MediaDevices { p } } + +fn convert_constraints(js: &BooleanOrMediaTrackConstraints) -> Option<MediaTrackConstraintSet> { + match js { + BooleanOrMediaTrackConstraints::Boolean(false) => None, + BooleanOrMediaTrackConstraints::Boolean(true) => Some(Default::default()), + BooleanOrMediaTrackConstraints::MediaTrackConstraints(ref c) => { + Some(MediaTrackConstraintSet { + height: convert_culong(&c.parent.height), + width: convert_culong(&c.parent.width), + aspect: convert_cdouble(&c.parent.aspectRatio), + frame_rate: convert_cdouble(&c.parent.frameRate), + sample_rate: convert_culong(&c.parent.sampleRate), + }) + }, + } +} + +fn convert_culong(js: &ConstrainULong) -> Option<Constrain<u32>> { + match js { + ConstrainULong::ClampedUnsignedLong(val) => Some(Constrain::Value(*val)), + ConstrainULong::ConstrainULongRange(ref range) => { + if range.parent.min.is_some() || range.parent.max.is_some() { + Some(Constrain::Range(ConstrainRange { + min: range.parent.min, + max: range.parent.max, + ideal: range.ideal, + })) + } else if let Some(exact) = range.exact { + Some(Constrain::Value(exact)) + } else { + // the unspecified case is treated as all three being none + None + } + }, + } +} + +fn convert_cdouble(js: &ConstrainDouble) -> Option<Constrain<f64>> { + match js { + ConstrainDouble::Double(val) => Some(Constrain::Value(**val)), + ConstrainDouble::ConstrainDoubleRange(ref range) => { + if range.parent.min.is_some() || range.parent.max.is_some() { + Some(Constrain::Range(ConstrainRange { + min: range.parent.min.map(|x| *x), + max: range.parent.max.map(|x| *x), + ideal: range.ideal.map(|x| *x), + })) + } else if let Some(exact) = range.exact { + Some(Constrain::Value(*exact)) + } else { + // the unspecified case is treated as all three being none + None + } + }, + } +} diff --git a/components/script/dom/webidls/MediaDevices.webidl b/components/script/dom/webidls/MediaDevices.webidl index 7fa30e0b916..866e1e964d0 100644 --- a/components/script/dom/webidls/MediaDevices.webidl +++ b/components/script/dom/webidls/MediaDevices.webidl @@ -23,31 +23,29 @@ partial interface MediaDevices { dictionary MediaStreamConstraints { - // (boolean or MediaTrackConstraints) video = false; - // (boolean or MediaTrackConstraints) audio = false; - boolean video = false; - boolean audio = false; + (boolean or MediaTrackConstraints) video = false; + (boolean or MediaTrackConstraints) audio = false; }; -// dictionary DoubleRange { -// double max; -// double min; -// }; +dictionary DoubleRange { + double max; + double min; +}; -// dictionary ConstrainDoubleRange : DoubleRange { -// double exact; -// double ideal; -// }; +dictionary ConstrainDoubleRange : DoubleRange { + double exact; + double ideal; +}; -// dictionary ULongRange { -// [Clamp] unsigned long max; -// [Clamp] unsigned long min; -// }; +dictionary ULongRange { + [Clamp] unsigned long max; + [Clamp] unsigned long min; +}; -// dictionary ConstrainULongRange : ULongRange { -// [Clamp] unsigned long exact; -// [Clamp] unsigned long ideal; -// }; +dictionary ConstrainULongRange : ULongRange { + [Clamp] unsigned long exact; + [Clamp] unsigned long ideal; +}; // dictionary ConstrainBooleanParameters { // boolean exact; @@ -59,30 +57,30 @@ dictionary MediaStreamConstraints { // (DOMString or sequence<DOMString>) ideal; // }; -// dictionary MediaTrackConstraints : MediaTrackConstraintSet { -// sequence<MediaTrackConstraintSet> advanced; -// }; +dictionary MediaTrackConstraints : MediaTrackConstraintSet { + sequence<MediaTrackConstraintSet> advanced; +}; -// typedef ([Clamp] unsigned long or ConstrainULongRange) ConstrainULong; -// typedef (double or ConstrainDoubleRange) ConstrainDouble; +typedef ([Clamp] unsigned long or ConstrainULongRange) ConstrainULong; +typedef (double or ConstrainDoubleRange) ConstrainDouble; // typedef (boolean or ConstrainBooleanParameters) ConstrainBoolean; // typedef (DOMString or sequence<DOMString> or ConstrainDOMStringParameters) ConstrainDOMString; -// dictionary MediaTrackConstraintSet { -// ConstrainULong width; -// ConstrainULong height; -// ConstrainDouble aspectRatio; -// ConstrainDouble frameRate; -// ConstrainDOMString facingMode; -// ConstrainDOMString resizeMode; -// ConstrainDouble volume; -// ConstrainULong sampleRate; -// ConstrainULong sampleSize; -// ConstrainBoolean echoCancellation; -// ConstrainBoolean autoGainControl; -// ConstrainBoolean noiseSuppression; -// ConstrainDouble latency; -// ConstrainULong channelCount; -// ConstrainDOMString deviceId; -// ConstrainDOMString groupId; -// }; +dictionary MediaTrackConstraintSet { + ConstrainULong width; + ConstrainULong height; + ConstrainDouble aspectRatio; + ConstrainDouble frameRate; + // ConstrainDOMString facingMode; + // ConstrainDOMString resizeMode; + // ConstrainDouble volume; + ConstrainULong sampleRate; + // ConstrainULong sampleSize; + // ConstrainBoolean echoCancellation; + // ConstrainBoolean autoGainControl; + // ConstrainBoolean noiseSuppression; + // ConstrainDouble latency; + // ConstrainULong channelCount; + // ConstrainDOMString deviceId; + // ConstrainDOMString groupId; +}; |