1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/shell/renderer/test_runner/MockWebSpeechRecognizer.h"
7 #include "base/logging.h"
8 #include "content/shell/renderer/test_runner/WebTestDelegate.h"
9 #include "third_party/WebKit/public/web/WebSpeechRecognitionResult.h"
10 #include "third_party/WebKit/public/web/WebSpeechRecognizerClient.h"
12 using namespace blink
;
15 namespace WebTestRunner
{
19 // Task class for calling a client function that does not take any parameters.
20 typedef void (WebSpeechRecognizerClient::*ClientFunctionPointer
)(const WebSpeechRecognitionHandle
&);
21 class ClientCallTask
: public MockWebSpeechRecognizer::Task
{
23 ClientCallTask(MockWebSpeechRecognizer
* mock
, ClientFunctionPointer function
)
24 : MockWebSpeechRecognizer::Task(mock
)
25 , m_function(function
)
29 virtual void run() OVERRIDE
{ (m_recognizer
->client()->*m_function
)(m_recognizer
->handle()); }
32 ClientFunctionPointer m_function
;
35 // Task for delivering a result event.
36 class ResultTask
: public MockWebSpeechRecognizer::Task
{
38 ResultTask(MockWebSpeechRecognizer
* mock
, const WebString transcript
, float confidence
)
39 : MockWebSpeechRecognizer::Task(mock
)
40 , m_transcript(transcript
)
41 , m_confidence(confidence
)
45 virtual void run() OVERRIDE
47 WebVector
<WebString
> transcripts(static_cast<size_t>(1));
48 WebVector
<float> confidences(static_cast<size_t>(1));
49 transcripts
[0] = m_transcript
;
50 confidences
[0] = m_confidence
;
51 WebVector
<WebSpeechRecognitionResult
> finalResults(static_cast<size_t>(1));
52 WebVector
<WebSpeechRecognitionResult
> interimResults
;
53 finalResults
[0].assign(transcripts
, confidences
, true);
55 m_recognizer
->client()->didReceiveResults(m_recognizer
->handle(), finalResults
, interimResults
);
59 WebString m_transcript
;
63 // Task for delivering a nomatch event.
64 class NoMatchTask
: public MockWebSpeechRecognizer::Task
{
66 NoMatchTask(MockWebSpeechRecognizer
* mock
) : MockWebSpeechRecognizer::Task(mock
) { }
67 virtual void run() OVERRIDE
{ m_recognizer
->client()->didReceiveNoMatch(m_recognizer
->handle(), WebSpeechRecognitionResult()); }
70 // Task for delivering an error event.
71 class ErrorTask
: public MockWebSpeechRecognizer::Task
{
73 ErrorTask(MockWebSpeechRecognizer
* mock
, WebSpeechRecognizerClient::ErrorCode code
, const WebString
& message
)
74 : MockWebSpeechRecognizer::Task(mock
)
80 virtual void run() OVERRIDE
{ m_recognizer
->client()->didReceiveError(m_recognizer
->handle(), m_message
, m_code
); }
83 WebSpeechRecognizerClient::ErrorCode m_code
;
89 MockWebSpeechRecognizer::MockWebSpeechRecognizer()
91 , m_taskQueueRunning(false)
96 MockWebSpeechRecognizer::~MockWebSpeechRecognizer()
101 void MockWebSpeechRecognizer::setDelegate(WebTestDelegate
* delegate
)
103 m_delegate
= delegate
;
106 void MockWebSpeechRecognizer::start(const WebSpeechRecognitionHandle
& handle
, const WebSpeechRecognitionParams
& params
, WebSpeechRecognizerClient
* client
)
108 m_wasAborted
= false;
112 m_taskQueue
.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didStart
));
113 m_taskQueue
.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didStartAudio
));
114 m_taskQueue
.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didStartSound
));
116 if (!m_mockTranscripts
.empty()) {
117 DCHECK_EQ(m_mockTranscripts
.size(), m_mockConfidences
.size());
119 for (size_t i
= 0; i
< m_mockTranscripts
.size(); ++i
)
120 m_taskQueue
.push_back(new ResultTask(this, m_mockTranscripts
[i
], m_mockConfidences
[i
]));
122 m_mockTranscripts
.clear();
123 m_mockConfidences
.clear();
125 m_taskQueue
.push_back(new NoMatchTask(this));
127 m_taskQueue
.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEndSound
));
128 m_taskQueue
.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEndAudio
));
129 m_taskQueue
.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd
));
134 void MockWebSpeechRecognizer::stop(const WebSpeechRecognitionHandle
& handle
, WebSpeechRecognizerClient
* client
)
143 void MockWebSpeechRecognizer::abort(const WebSpeechRecognitionHandle
& handle
, WebSpeechRecognizerClient
* client
)
150 m_taskQueue
.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd
));
154 void MockWebSpeechRecognizer::addMockResult(const WebString
& transcript
, float confidence
)
156 m_mockTranscripts
.push_back(transcript
);
157 m_mockConfidences
.push_back(confidence
);
160 void MockWebSpeechRecognizer::setError(const WebString
& error
, const WebString
& message
)
162 WebSpeechRecognizerClient::ErrorCode code
;
163 if (error
== "OtherError")
164 code
= WebSpeechRecognizerClient::OtherError
;
165 else if (error
== "NoSpeechError")
166 code
= WebSpeechRecognizerClient::NoSpeechError
;
167 else if (error
== "AbortedError")
168 code
= WebSpeechRecognizerClient::AbortedError
;
169 else if (error
== "AudioCaptureError")
170 code
= WebSpeechRecognizerClient::AudioCaptureError
;
171 else if (error
== "NetworkError")
172 code
= WebSpeechRecognizerClient::NetworkError
;
173 else if (error
== "NotAllowedError")
174 code
= WebSpeechRecognizerClient::NotAllowedError
;
175 else if (error
== "ServiceNotAllowedError")
176 code
= WebSpeechRecognizerClient::ServiceNotAllowedError
;
177 else if (error
== "BadGrammarError")
178 code
= WebSpeechRecognizerClient::BadGrammarError
;
179 else if (error
== "LanguageNotSupportedError")
180 code
= WebSpeechRecognizerClient::LanguageNotSupportedError
;
185 m_taskQueue
.push_back(new ErrorTask(this, code
, message
));
186 m_taskQueue
.push_back(new ClientCallTask(this, &WebSpeechRecognizerClient::didEnd
));
190 void MockWebSpeechRecognizer::startTaskQueue()
192 if (m_taskQueueRunning
)
194 m_delegate
->postTask(new StepTask(this));
195 m_taskQueueRunning
= true;
198 void MockWebSpeechRecognizer::clearTaskQueue()
200 while (!m_taskQueue
.empty()) {
201 delete m_taskQueue
.front();
202 m_taskQueue
.pop_front();
204 m_taskQueueRunning
= false;
207 void MockWebSpeechRecognizer::StepTask::runIfValid()
209 if (m_object
->m_taskQueue
.empty()) {
210 m_object
->m_taskQueueRunning
= false;
214 Task
* task
= m_object
->m_taskQueue
.front();
215 m_object
->m_taskQueue
.pop_front();
219 if (m_object
->m_taskQueue
.empty()) {
220 m_object
->m_taskQueueRunning
= false;
224 m_object
->m_delegate
->postTask(new StepTask(m_object
));