Bug 1257328 - Limit SpeechSynthesisUtterance attribute values to spec ranges. r=smaug draft
authorEitan Isaacson <eitan@monotonous.org>
Wed, 16 Mar 2016 15:04:17 -0700
changeset 341665 14d8bc9bef084aae7822d42d39bd596714cf9a9c
parent 340999 341344bdec8f10bf50646cd6ef2355361435cbf6
child 516439 349aac392a94a90fb1cced2c019f5598ed517e4e
push id13265
push userbmo:eitan@monotonous.org
push dateThu, 17 Mar 2016 16:34:06 +0000
reviewerssmaug
bugs1257328
milestone48.0a1
Bug 1257328 - Limit SpeechSynthesisUtterance attribute values to spec ranges. r=smaug MozReview-Commit-ID: CbF91OvCf2G
dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp
dom/media/webspeech/synth/test/file_setup.html
--- a/dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp
+++ b/dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp
@@ -8,16 +8,18 @@
 #include "nsCycleCollectionParticipant.h"
 #include "nsGkAtoms.h"
 
 #include "mozilla/dom/SpeechSynthesisEvent.h"
 #include "mozilla/dom/SpeechSynthesisUtteranceBinding.h"
 #include "SpeechSynthesisUtterance.h"
 #include "SpeechSynthesisVoice.h"
 
+#include <stdlib.h>
+
 namespace mozilla {
 namespace dom {
 
 NS_IMPL_CYCLE_COLLECTION_INHERITED(SpeechSynthesisUtterance,
                                    DOMEventTargetHelper, mVoice);
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(SpeechSynthesisUtterance)
 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
@@ -115,41 +117,41 @@ float
 SpeechSynthesisUtterance::Volume() const
 {
   return mVolume;
 }
 
 void
 SpeechSynthesisUtterance::SetVolume(float aVolume)
 {
-  mVolume = aVolume;
+  mVolume = std::max<float>(std::min<float>(aVolume, 1), 0);
 }
 
 float
 SpeechSynthesisUtterance::Rate() const
 {
   return mRate;
 }
 
 void
 SpeechSynthesisUtterance::SetRate(float aRate)
 {
-  mRate = aRate;
+  mRate = std::max<float>(std::min<float>(aRate, 10), 0.1);
 }
 
 float
 SpeechSynthesisUtterance::Pitch() const
 {
   return mPitch;
 }
 
 void
 SpeechSynthesisUtterance::SetPitch(float aPitch)
 {
-  mPitch = aPitch;
+  mPitch = std::max<float>(std::min<float>(aPitch, 2), 0);
 }
 
 void
 SpeechSynthesisUtterance::GetChosenVoiceURI(nsString& aResult) const
 {
   aResult = mChosenVoiceURI;
 }
 
--- a/dom/media/webspeech/synth/test/file_setup.html
+++ b/dom/media/webspeech/synth/test/file_setup.html
@@ -43,16 +43,34 @@ ssu.lang = "he-IL";
 ssu.volume = 0.5;
 ssu.rate = 2.0;
 ssu.pitch = 1.5;
 is(ssu.lang, "he-IL", "SpeechSynthesisUtterance.lang is correct");
 is(ssu.volume, 0.5,  "SpeechSynthesisUtterance.volume is correct");
 is(ssu.rate, 2.0,  "SpeechSynthesisUtterance.rate is correct");
 is(ssu.pitch, 1.5,  "SpeechSynthesisUtterance.pitch is correct");
 
+// Assign a rate that is out of bounds
+ssu.rate = 20;
+is(ssu.rate, 10, "SpeechSynthesisUtterance.rate enforces max of 10");
+ssu.rate = 0;
+is(ssu.rate.toPrecision(1), "0.1", "SpeechSynthesisUtterance.rate enforces min of 0.1");
+
+// Assign a volume which is out of bounds
+ssu.volume = 2;
+is(ssu.volume, 1, "SpeechSynthesisUtterance.volume enforces max of 1");
+ssu.volume = -1;
+is(ssu.volume, 0, "SpeechSynthesisUtterance.volume enforces min of 0");
+
+// Assign a pitch which is out of bounds
+ssu.pitch = 2.1;
+is(ssu.pitch, 2, "SpeechSynthesisUtterance.pitch enforces max of 2");
+ssu.pitch = -1;
+is(ssu.pitch, 0, "SpeechSynthesisUtterance.pitch enforces min of 0");
+
 // Test for singleton instance hanging off of window.
 ok(speechSynthesis, "speechSynthesis exists in global scope");
 is(typeof speechSynthesis, "object", "speechSynthesis instance is an object");
 is(typeof speechSynthesis.speak, "function", "speechSynthesis.speak is a function");
 is(typeof speechSynthesis.cancel, "function", "speechSynthesis.cancel is a function");
 is(typeof speechSynthesis.pause, "function", "speechSynthesis.pause is a function");
 is(typeof speechSynthesis.resume, "function", "speechSynthesis.resume is a function");
 is(typeof speechSynthesis.getVoices, "function", "speechSynthesis.getVoices is a function");