Fix construction of destination node (#6)

* Fix comparison of audiocontexts

* Fix comparison

* Fix destination node construction
This commit is contained in:
Manish Goregaokar 2018-07-10 00:34:11 -07:00 committed by Fernando Jiménez Moreno
parent 6ac4b4b8e0
commit 723f1b0582
2 changed files with 14 additions and 13 deletions

View file

@ -69,6 +69,7 @@ impl AudioNodeMethods for AudioNode {
destination: &AudioNode,
output: u32,
input: u32) -> Fallible<DomRoot<AudioNode>> {
if self.context != destination.context {
return Err(Error::InvalidAccess);
}

View file

@ -22,7 +22,7 @@ use dom::bindings::inheritance::Castable;
use dom::bindings::num::Finite;
use dom::bindings::refcounted::Trusted;
use dom::bindings::reflector::DomObject;
use dom::bindings::root::DomRoot;
use dom::bindings::root::{DomRoot, MutNullableDom};
use dom::domexception::{DOMErrorName, DOMException};
use dom::eventtarget::EventTarget;
use dom::gainnode::GainNode;
@ -65,7 +65,7 @@ pub struct BaseAudioContext {
#[ignore_malloc_size_of = "servo_media"]
audio_context_impl: Rc<AudioContext>,
/// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-destination
destination: Option<DomRoot<AudioDestinationNode>>,
destination: MutNullableDom<AudioDestinationNode>,
/// Resume promises which are soon to be fulfilled by a queued task.
#[ignore_malloc_size_of = "promises are hard"]
in_flight_resume_promises_queue: DomRefCell<VecDeque<(Box<[Rc<Promise>]>, ErrorResult)>>,
@ -87,7 +87,7 @@ pub struct BaseAudioContext {
impl BaseAudioContext {
#[allow(unrooted_must_root)]
pub fn new_inherited(
global: &GlobalScope,
_: &GlobalScope,
options: BaseAudioContextOptions,
) -> BaseAudioContext {
let options = match options {
@ -97,10 +97,10 @@ impl BaseAudioContext {
let sample_rate = options.sample_rate;
let mut context = BaseAudioContext {
let context = BaseAudioContext {
eventtarget: EventTarget::new_inherited(),
audio_context_impl: Rc::new(ServoMedia::get().unwrap().create_audio_context(options.into())),
destination: None,
destination: Default::default(),
in_flight_resume_promises_queue: Default::default(),
pending_resume_promises: Default::default(),
decode_resolvers: Default::default(),
@ -108,13 +108,6 @@ impl BaseAudioContext {
state: Cell::new(AudioContextState::Suspended),
};
let mut options = AudioNodeOptions::empty();
options.channelCount = Some(2);
options.channelCountMode = Some(ChannelCountMode::Explicit);
options.channelInterpretation = Some(ChannelInterpretation::Speakers);
context.destination = Some(AudioDestinationNode::new(global, &context, &options));
context
}
@ -280,7 +273,14 @@ impl BaseAudioContextMethods for BaseAudioContext {
/// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-destination
fn Destination(&self) -> DomRoot<AudioDestinationNode> {
DomRoot::from_ref(self.destination.as_ref().unwrap())
let global = self.global();
self.destination.or_init(|| {
let mut options = AudioNodeOptions::empty();
options.channelCount = Some(2);
options.channelCountMode = Some(ChannelCountMode::Explicit);
options.channelInterpretation = Some(ChannelInterpretation::Speakers);
AudioDestinationNode::new(&global, self, &options)
})
}
/// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-onstatechange