diff --git a/components/script/dom/baseaudiocontext.rs b/components/script/dom/baseaudiocontext.rs index 915f60a8e33..9513a0b22d1 100644 --- a/components/script/dom/baseaudiocontext.rs +++ b/components/script/dom/baseaudiocontext.rs @@ -331,7 +331,7 @@ impl BaseAudioContextMethods for BaseAudioContext { } /// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createpanner - fn CreatePanner(&self) -> DomRoot { + fn CreatePanner(&self) -> Fallible> { PannerNode::new(&self.global().as_window(), &self, &PannerOptions::empty()) } diff --git a/components/script/dom/pannernode.rs b/components/script/dom/pannernode.rs index 089de7c1ec4..7f1909cdb50 100644 --- a/components/script/dom/pannernode.rs +++ b/components/script/dom/pannernode.rs @@ -51,10 +51,18 @@ impl PannerNode { window: &Window, context: &BaseAudioContext, options: &PannerOptions, - ) -> PannerNode { + ) -> Fallible { + let count = options.parent.channelCount.unwrap_or(2); + let mode = options.parent.channelCountMode.unwrap_or(ChannelCountMode::Clamped_max); + if mode == ChannelCountMode::Max { + return Err(Error::NotSupported) + } + if count > 2 { + return Err(Error::NotSupported) + } let mut node_options = AudioNodeOptions::empty(); - node_options.channelCount = Some(2); - node_options.channelCountMode = Some(ChannelCountMode::Clamped_max); + node_options.channelCount = Some(count); + node_options.channelCountMode = Some(mode); node_options.channelInterpretation = Some(ChannelInterpretation::Speakers); let options = options.into(); let node = AudioNode::new_inherited( @@ -125,7 +133,7 @@ impl PannerNode { f32::MIN, // min value f32::MAX, // max value ); - PannerNode { + Ok(PannerNode { node, position_x: Dom::from_ref(&position_x), position_y: Dom::from_ref(&position_y), @@ -141,7 +149,7 @@ impl PannerNode { cone_inner_angle: Cell::new(options.cone_inner_angle), cone_outer_angle: Cell::new(options.cone_outer_angle), cone_outer_gain: Cell::new(options.cone_outer_gain), - } + }) } #[allow(unrooted_must_root)] @@ -149,9 +157,9 @@ impl PannerNode { window: &Window, context: &BaseAudioContext, options: &PannerOptions, - ) -> DomRoot { - let node = PannerNode::new_inherited(window, context, options); - reflect_dom_object(Box::new(node), window, PannerNodeBinding::Wrap) + ) -> Fallible> { + let node = PannerNode::new_inherited(window, context, options)?; + Ok(reflect_dom_object(Box::new(node), window, PannerNodeBinding::Wrap)) } pub fn Constructor( @@ -159,7 +167,7 @@ impl PannerNode { context: &BaseAudioContext, options: &PannerOptions, ) -> Fallible> { - Ok(PannerNode::new(window, context, options)) + PannerNode::new(window, context, options) } } diff --git a/components/script/dom/webidls/BaseAudioContext.webidl b/components/script/dom/webidls/BaseAudioContext.webidl index 4669d81c6e1..f00ec373667 100644 --- a/components/script/dom/webidls/BaseAudioContext.webidl +++ b/components/script/dom/webidls/BaseAudioContext.webidl @@ -42,7 +42,7 @@ interface BaseAudioContext : EventTarget { // IIRFilterNode createIIRFilter(sequence feedforward, // sequence feedback); // WaveShaperNode createWaveShaper(); - PannerNode createPanner(); + [Throws] PannerNode createPanner(); // StereoPannerNode createStereoPanner(); // ConvolverNode createConvolver(); // ChannelSplitterNode createChannelSplitter(optional unsigned long numberOfOutputs = 6);