diff --git a/components/script/dom/audiobuffersourcenode.rs b/components/script/dom/audiobuffersourcenode.rs index b534acead44..85ece3be5d9 100644 --- a/components/script/dom/audiobuffersourcenode.rs +++ b/components/script/dom/audiobuffersourcenode.rs @@ -29,6 +29,7 @@ use std::f32; pub struct AudioBufferSourceNode { source_node: AudioScheduledSourceNode, buffer: MutNullableDom, + buffer_set: Cell, playback_rate: Dom, detune: Dom, loop_enabled: Cell, @@ -75,6 +76,7 @@ impl AudioBufferSourceNode { let node = AudioBufferSourceNode { source_node, buffer: Default::default(), + buffer_set: Cell::new(false), playback_rate: Dom::from_ref(&playback_rate), detune: Dom::from_ref(&detune), loop_enabled: Cell::new(options.loop_), @@ -122,12 +124,19 @@ impl AudioBufferSourceNodeMethods for AudioBufferSourceNode { // https://webaudio.github.io/web-audio-api/#dom-audiobuffersourcenode-buffer fn SetBuffer(&self, new_buffer: Option<&AudioBuffer>) -> Fallible<()> { - if new_buffer.is_some() && self.buffer.get().is_some() { - return Err(Error::InvalidState); + if new_buffer.is_some() { + if self.buffer_set.get() { + // Step 2. + return Err(Error::InvalidState); + } + // Step 3. + self.buffer_set.set(true); } + // Step 4. self.buffer.set(new_buffer); + // Step 5. if self.source_node.started() { if let Some(buffer) = self.buffer.get() { let buffer = buffer.acquire_contents();