summaryrefslogtreecommitdiffstats
path: root/dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp')
-rw-r--r--dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp178
1 files changed, 178 insertions, 0 deletions
diff --git a/dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp b/dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp
new file mode 100644
index 000000000..c7d80a5a1
--- /dev/null
+++ b/dom/media/webspeech/synth/SpeechSynthesisUtterance.cpp
@@ -0,0 +1,178 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsCOMPtr.h"
+#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)
+
+NS_IMPL_ADDREF_INHERITED(SpeechSynthesisUtterance, DOMEventTargetHelper)
+NS_IMPL_RELEASE_INHERITED(SpeechSynthesisUtterance, DOMEventTargetHelper)
+
+SpeechSynthesisUtterance::SpeechSynthesisUtterance(nsPIDOMWindowInner* aOwnerWindow,
+ const nsAString& text)
+ : DOMEventTargetHelper(aOwnerWindow)
+ , mText(text)
+ , mVolume(1)
+ , mRate(1)
+ , mPitch(1)
+ , mState(STATE_NONE)
+ , mPaused(false)
+{
+}
+
+SpeechSynthesisUtterance::~SpeechSynthesisUtterance() {}
+
+JSObject*
+SpeechSynthesisUtterance::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+ return SpeechSynthesisUtteranceBinding::Wrap(aCx, this, aGivenProto);
+}
+
+nsISupports*
+SpeechSynthesisUtterance::GetParentObject() const
+{
+ return GetOwner();
+}
+
+already_AddRefed<SpeechSynthesisUtterance>
+SpeechSynthesisUtterance::Constructor(GlobalObject& aGlobal,
+ ErrorResult& aRv)
+{
+ return Constructor(aGlobal, EmptyString(), aRv);
+}
+
+already_AddRefed<SpeechSynthesisUtterance>
+SpeechSynthesisUtterance::Constructor(GlobalObject& aGlobal,
+ const nsAString& aText,
+ ErrorResult& aRv)
+{
+ nsCOMPtr<nsPIDOMWindowInner> win = do_QueryInterface(aGlobal.GetAsSupports());
+
+ if (!win) {
+ aRv.Throw(NS_ERROR_FAILURE);
+ }
+
+ MOZ_ASSERT(win->IsInnerWindow());
+ RefPtr<SpeechSynthesisUtterance> object =
+ new SpeechSynthesisUtterance(win, aText);
+ return object.forget();
+}
+
+void
+SpeechSynthesisUtterance::GetText(nsString& aResult) const
+{
+ aResult = mText;
+}
+
+void
+SpeechSynthesisUtterance::SetText(const nsAString& aText)
+{
+ mText = aText;
+}
+
+void
+SpeechSynthesisUtterance::GetLang(nsString& aResult) const
+{
+ aResult = mLang;
+}
+
+void
+SpeechSynthesisUtterance::SetLang(const nsAString& aLang)
+{
+ mLang = aLang;
+}
+
+SpeechSynthesisVoice*
+SpeechSynthesisUtterance::GetVoice() const
+{
+ return mVoice;
+}
+
+void
+SpeechSynthesisUtterance::SetVoice(SpeechSynthesisVoice* aVoice)
+{
+ mVoice = aVoice;
+}
+
+float
+SpeechSynthesisUtterance::Volume() const
+{
+ return mVolume;
+}
+
+void
+SpeechSynthesisUtterance::SetVolume(float aVolume)
+{
+ mVolume = std::max<float>(std::min<float>(aVolume, 1), 0);
+}
+
+float
+SpeechSynthesisUtterance::Rate() const
+{
+ return mRate;
+}
+
+void
+SpeechSynthesisUtterance::SetRate(float aRate)
+{
+ mRate = std::max<float>(std::min<float>(aRate, 10), 0.1f);
+}
+
+float
+SpeechSynthesisUtterance::Pitch() const
+{
+ return mPitch;
+}
+
+void
+SpeechSynthesisUtterance::SetPitch(float aPitch)
+{
+ mPitch = std::max<float>(std::min<float>(aPitch, 2), 0);
+}
+
+void
+SpeechSynthesisUtterance::GetChosenVoiceURI(nsString& aResult) const
+{
+ aResult = mChosenVoiceURI;
+}
+
+void
+SpeechSynthesisUtterance::DispatchSpeechSynthesisEvent(const nsAString& aEventType,
+ uint32_t aCharIndex,
+ float aElapsedTime,
+ const nsAString& aName)
+{
+ SpeechSynthesisEventInit init;
+ init.mBubbles = false;
+ init.mCancelable = false;
+ init.mUtterance = this;
+ init.mCharIndex = aCharIndex;
+ init.mElapsedTime = aElapsedTime;
+ init.mName = aName;
+
+ RefPtr<SpeechSynthesisEvent> event =
+ SpeechSynthesisEvent::Constructor(this, aEventType, init);
+ DispatchTrustedEvent(event);
+}
+
+} // namespace dom
+} // namespace mozilla