Implement Web Speech Synthesis for Chromium
[WebKit-https.git] / Source / WebCore / platform / mock / PlatformSpeechSynthesizerMock.cpp
1 /*
2  * Copyright (C) 2013 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "PlatformSpeechSynthesizerMock.h"
28 #include "PlatformSpeechSynthesisUtterance.h"
29
30 #if ENABLE(SPEECH_SYNTHESIS)
31
32 namespace WebCore {
33
34 PassOwnPtr<PlatformSpeechSynthesizerMock> PlatformSpeechSynthesizerMock::create(PlatformSpeechSynthesizerClient* client)
35 {
36     OwnPtr<PlatformSpeechSynthesizerMock> synthesizer = adoptPtr(new PlatformSpeechSynthesizerMock(client));
37     synthesizer->initializeVoiceList();
38     return synthesizer.release();
39 }
40     
41 PlatformSpeechSynthesizerMock::PlatformSpeechSynthesizerMock(PlatformSpeechSynthesizerClient* client)
42     : PlatformSpeechSynthesizer(client)
43     , m_speakingFinishedTimer(this, &PlatformSpeechSynthesizerMock::speakingFinished)
44 {
45 }
46     
47 PlatformSpeechSynthesizerMock::~PlatformSpeechSynthesizerMock()
48 {
49     m_speakingFinishedTimer.stop();
50 }
51
52 void PlatformSpeechSynthesizerMock::speakingFinished(Timer<PlatformSpeechSynthesizerMock>*)
53 {
54     ASSERT(m_utterance.get());
55     client()->didFinishSpeaking(m_utterance);
56     m_utterance = 0;
57 }
58     
59 void PlatformSpeechSynthesizerMock::initializeVoiceList()
60 {
61     m_voiceList.clear();
62     m_voiceList.append(PlatformSpeechSynthesisVoice::create(String("mock.voice.bruce"), String("bruce"), String("en-US"), true, true));
63     m_voiceList.append(PlatformSpeechSynthesisVoice::create(String("mock.voice.clark"), String("clark"), String("en-US"), true, false));
64     m_voiceList.append(PlatformSpeechSynthesisVoice::create(String("mock.voice.logan"), String("logan"), String("fr-CA"), true, true));
65 }
66
67 void PlatformSpeechSynthesizerMock::speak(PassRefPtr<PlatformSpeechSynthesisUtterance> utterance)
68 {
69     ASSERT(!m_utterance);
70     m_utterance = utterance;
71     client()->didStartSpeaking(m_utterance);
72     
73     // Fire a fake word and then sentence boundary event.
74     client()->boundaryEventOccurred(m_utterance, SpeechWordBoundary, 0);
75     client()->boundaryEventOccurred(m_utterance, SpeechSentenceBoundary, m_utterance->text().length());
76     
77     // Give the fake speech job some time so that pause and other functions have time to be called.
78     m_speakingFinishedTimer.startOneShot(.1);
79 }
80     
81 void PlatformSpeechSynthesizerMock::cancel()
82 {
83     if (!m_utterance)
84         return;
85     
86     m_speakingFinishedTimer.stop();
87     client()->speakingErrorOccurred(m_utterance);
88     m_utterance = 0;
89 }
90
91 void PlatformSpeechSynthesizerMock::pause()
92 {
93     client()->didPauseSpeaking(m_utterance);
94 }
95
96 void PlatformSpeechSynthesizerMock::resume()
97 {
98     client()->didResumeSpeaking(m_utterance);
99 }
100
101     
102 } // namespace WebCore
103
104 #endif // ENABLE(SPEECH_SYNTHESIS)