aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2019-04-25 15:22:26 -0700
committerManish Goregaokar <manishsmail@gmail.com>2019-04-25 16:00:11 -0700
commit8a8a9f7135d76daafac07a010c3feb6787dc3532 (patch)
treeadad09f673eca57158015ae066d798b79b839838 /components/script/dom
parent54f54d194df1911d1dd35a82dd87331853f985a3 (diff)
downloadservo-8a8a9f7135d76daafac07a010c3feb6787dc3532.tar.gz
servo-8a8a9f7135d76daafac07a010c3feb6787dc3532.zip
Add input validation for AudioParam methods
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/audioparam.rs77
-rw-r--r--components/script/dom/webidls/AudioParam.webidl12
2 files changed, 71 insertions, 18 deletions
diff --git a/components/script/dom/audioparam.rs b/components/script/dom/audioparam.rs
index c024b88bae3..08ab6f32d10 100644
--- a/components/script/dom/audioparam.rs
+++ b/components/script/dom/audioparam.rs
@@ -7,6 +7,7 @@ use crate::dom::bindings::codegen::Bindings::AudioParamBinding;
use crate::dom::bindings::codegen::Bindings::AudioParamBinding::{
AudioParamMethods, AutomationRate,
};
+use crate::dom::bindings::error::{Error, Fallible};
use crate::dom::bindings::num::Finite;
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot};
@@ -142,12 +143,22 @@ impl AudioParamMethods for AudioParam {
}
// https://webaudio.github.io/web-audio-api/#dom-audioparam-setvalueattime
- fn SetValueAtTime(&self, value: Finite<f32>, start_time: Finite<f64>) -> DomRoot<AudioParam> {
+ fn SetValueAtTime(
+ &self,
+ value: Finite<f32>,
+ start_time: Finite<f64>,
+ ) -> Fallible<DomRoot<AudioParam>> {
+ if *start_time < 0. {
+ return Err(Error::Range(format!(
+ "start time {} should not be negative",
+ *start_time
+ )));
+ }
self.message_node(AudioNodeMessage::SetParam(
self.param,
UserAutomationEvent::SetValueAtTime(*value, *start_time),
));
- DomRoot::from_ref(self)
+ Ok(DomRoot::from_ref(self))
}
// https://webaudio.github.io/web-audio-api/#dom-audioparam-linearramptovalueattime
@@ -155,12 +166,18 @@ impl AudioParamMethods for AudioParam {
&self,
value: Finite<f32>,
end_time: Finite<f64>,
- ) -> DomRoot<AudioParam> {
+ ) -> Fallible<DomRoot<AudioParam>> {
+ if *end_time < 0. {
+ return Err(Error::Range(format!(
+ "end time {} should not be negative",
+ *end_time
+ )));
+ }
self.message_node(AudioNodeMessage::SetParam(
self.param,
UserAutomationEvent::RampToValueAtTime(RampKind::Linear, *value, *end_time),
));
- DomRoot::from_ref(self)
+ Ok(DomRoot::from_ref(self))
}
// https://webaudio.github.io/web-audio-api/#dom-audioparam-exponentialramptovalueattime
@@ -168,12 +185,24 @@ impl AudioParamMethods for AudioParam {
&self,
value: Finite<f32>,
end_time: Finite<f64>,
- ) -> DomRoot<AudioParam> {
+ ) -> Fallible<DomRoot<AudioParam>> {
+ if *end_time < 0. {
+ return Err(Error::Range(format!(
+ "end time {} should not be negative",
+ *end_time
+ )));
+ }
+ if *value == 0. {
+ return Err(Error::Range(format!(
+ "target value {} should not be 0",
+ *value
+ )));
+ }
self.message_node(AudioNodeMessage::SetParam(
self.param,
UserAutomationEvent::RampToValueAtTime(RampKind::Exponential, *value, *end_time),
));
- DomRoot::from_ref(self)
+ Ok(DomRoot::from_ref(self))
}
// https://webaudio.github.io/web-audio-api/#dom-audioparam-settargetattime
@@ -182,30 +211,54 @@ impl AudioParamMethods for AudioParam {
target: Finite<f32>,
start_time: Finite<f64>,
time_constant: Finite<f32>,
- ) -> DomRoot<AudioParam> {
+ ) -> Fallible<DomRoot<AudioParam>> {
+ if *start_time < 0. {
+ return Err(Error::Range(format!(
+ "start time {} should not be negative",
+ *start_time
+ )));
+ }
+ if *time_constant < 0. {
+ return Err(Error::Range(format!(
+ "time constant {} should not be negative",
+ *time_constant
+ )));
+ }
self.message_node(AudioNodeMessage::SetParam(
self.param,
UserAutomationEvent::SetTargetAtTime(*target, *start_time, (*time_constant).into()),
));
- DomRoot::from_ref(self)
+ Ok(DomRoot::from_ref(self))
}
// https://webaudio.github.io/web-audio-api/#dom-audioparam-cancelscheduledvalues
- fn CancelScheduledValues(&self, cancel_time: Finite<f64>) -> DomRoot<AudioParam> {
+ fn CancelScheduledValues(&self, cancel_time: Finite<f64>) -> Fallible<DomRoot<AudioParam>> {
+ if *cancel_time < 0. {
+ return Err(Error::Range(format!(
+ "cancel time {} should not be negative",
+ *cancel_time
+ )));
+ }
self.message_node(AudioNodeMessage::SetParam(
self.param,
UserAutomationEvent::CancelScheduledValues(*cancel_time),
));
- DomRoot::from_ref(self)
+ Ok(DomRoot::from_ref(self))
}
// https://webaudio.github.io/web-audio-api/#dom-audioparam-cancelandholdattime
- fn CancelAndHoldAtTime(&self, cancel_time: Finite<f64>) -> DomRoot<AudioParam> {
+ fn CancelAndHoldAtTime(&self, cancel_time: Finite<f64>) -> Fallible<DomRoot<AudioParam>> {
+ if *cancel_time < 0. {
+ return Err(Error::Range(format!(
+ "cancel time {} should not be negative",
+ *cancel_time
+ )));
+ }
self.message_node(AudioNodeMessage::SetParam(
self.param,
UserAutomationEvent::CancelAndHoldAtTime(*cancel_time),
));
- DomRoot::from_ref(self)
+ Ok(DomRoot::from_ref(self))
}
}
diff --git a/components/script/dom/webidls/AudioParam.webidl b/components/script/dom/webidls/AudioParam.webidl
index 47df206b79d..f191a6848f3 100644
--- a/components/script/dom/webidls/AudioParam.webidl
+++ b/components/script/dom/webidls/AudioParam.webidl
@@ -18,15 +18,15 @@ interface AudioParam {
readonly attribute float defaultValue;
readonly attribute float minValue;
readonly attribute float maxValue;
- AudioParam setValueAtTime(float value, double startTime);
- AudioParam linearRampToValueAtTime(float value, double endTime);
- AudioParam exponentialRampToValueAtTime(float value, double endTime);
- AudioParam setTargetAtTime(float target,
+ [Throws] AudioParam setValueAtTime(float value, double startTime);
+ [Throws] AudioParam linearRampToValueAtTime(float value, double endTime);
+ [Throws] AudioParam exponentialRampToValueAtTime(float value, double endTime);
+ [Throws] AudioParam setTargetAtTime(float target,
double startTime,
float timeConstant);
// AudioParam setValueCurveAtTime(sequence<float> values,
// double startTime,
// double duration);
- AudioParam cancelScheduledValues(double cancelTime);
- AudioParam cancelAndHoldAtTime(double cancelTime);
+ [Throws] AudioParam cancelScheduledValues(double cancelTime);
+ [Throws] AudioParam cancelAndHoldAtTime(double cancelTime);
};