Auto merge of #21506 - ferjm:webaudio.wpts, r=Manishearth

Fix some WebAudio WPTs

- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] There are tests for these changes

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21506)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-09-25 13:21:37 -04:00 committed by GitHub
commit 9ee8890a72
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 1584 additions and 1812 deletions

View file

@ -29,6 +29,7 @@ use std::f32;
pub struct AudioBufferSourceNode {
source_node: AudioScheduledSourceNode,
buffer: MutNullableDom<AudioBuffer>,
buffer_set: Cell<bool>,
playback_rate: Dom<AudioParam>,
detune: Dom<AudioParam>,
loop_enabled: Cell<bool>,
@ -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();
@ -191,10 +200,6 @@ impl AudioBufferSourceNodeMethods for AudioBufferSourceNode {
offset: Option<Finite<f64>>,
duration: Option<Finite<f64>>,
) -> Fallible<()> {
if *when < 0. {
return Err(Error::Range("'when' must be a positive value".to_owned()));
}
if let Some(offset) = offset {
if *offset < 0. {
return Err(Error::Range("'offset' must be a positive value".to_owned()));

View file

@ -59,6 +59,10 @@ impl AudioScheduledSourceNodeMethods for AudioScheduledSourceNode {
// https://webaudio.github.io/web-audio-api/#dom-audioscheduledsourcenode-start
fn Start(&self, when: Finite<f64>) -> Fallible<()> {
if *when < 0. {
return Err(Error::Range("'when' must be a positive value".to_owned()));
}
if self.started.get() || self.stopped.get() {
return Err(Error::InvalidState);
}
@ -99,6 +103,10 @@ impl AudioScheduledSourceNodeMethods for AudioScheduledSourceNode {
// https://webaudio.github.io/web-audio-api/#dom-audioscheduledsourcenode-stop
fn Stop(&self, when: Finite<f64>) -> Fallible<()> {
if *when < 0. {
return Err(Error::Range("'when' must be a positive value".to_owned()));
}
if !self.started.get() {
return Err(Error::InvalidState);
}