[chromium] move most of the remaining mocks to TestRunner library
[WebKit-https.git] / Tools / DumpRenderTree / chromium / TestRunner / src / MockWebSpeechInputController.cpp
1 /*
2  * Copyright (C) 2012 Google 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "MockWebSpeechInputController.h"
28
29 #include "WebSpeechInputListener.h"
30 #include "WebTestDelegate.h"
31 #include <public/WebCString.h>
32 #include <public/WebVector.h>
33
34 #if ENABLE_INPUT_SPEECH
35
36 using namespace WebKit;
37 using namespace std;
38
39 namespace WebTestRunner {
40
41 namespace {
42
43 WebSpeechInputResultArray makeRectResult(const WebRect& rect)
44 {
45     char buffer[100];
46     snprintf(buffer, sizeof(buffer), "%d,%d,%d,%d", rect.x, rect.y, rect.width, rect.height);
47
48     WebSpeechInputResult res;
49     res.assign(WebString::fromUTF8(static_cast<const char*>(buffer)), 1.0);
50
51     WebSpeechInputResultArray results;
52     results.assign(&res, 1);
53     return results;
54 }
55
56 }
57
58 MockWebSpeechInputController::MockWebSpeechInputController(WebSpeechInputListener* listener)
59     : m_listener(listener)
60     , m_speechTask(0)
61     , m_recording(false)
62     , m_requestId(-1)
63     , m_dumpRect(false)
64     , m_delegate(0)
65 {
66 }
67
68 MockWebSpeechInputController::~MockWebSpeechInputController()
69 {
70 }
71
72 void MockWebSpeechInputController::setDelegate(WebTestDelegate* delegate)
73 {
74     m_delegate = delegate;
75 }
76
77 void MockWebSpeechInputController::addMockRecognitionResult(const WebString& result, double confidence, const WebString& language)
78 {
79     WebSpeechInputResult res;
80     res.assign(result, confidence);
81
82     if (language.isEmpty())
83         m_resultsForEmptyLanguage.push_back(res);
84     else {
85         string langString = language.utf8();
86         if (m_recognitionResults.find(langString) == m_recognitionResults.end())
87             m_recognitionResults[langString] = vector<WebSpeechInputResult>();
88         m_recognitionResults[langString].push_back(res);
89     }
90 }
91
92 void MockWebSpeechInputController::setDumpRect(bool dumpRect)
93 {
94     m_dumpRect = dumpRect;
95 }
96
97 void MockWebSpeechInputController::clearResults()
98 {
99     m_resultsForEmptyLanguage.clear();
100     m_recognitionResults.clear();
101     m_dumpRect = false;
102 }
103
104 bool MockWebSpeechInputController::startRecognition(int requestId, const WebRect& elementRect, const WebString& language, const WebString& grammar, const WebSecurityOrigin& origin)
105 {
106     if (m_speechTask)
107         return false;
108
109     m_requestId = requestId;
110     m_requestRect = elementRect;
111     m_recording = true;
112     m_language = language.utf8();
113
114     m_speechTask = new SpeechTask(this);
115     m_delegate->postTask(m_speechTask);
116
117     return true;
118 }
119
120 void MockWebSpeechInputController::cancelRecognition(int requestId)
121 {
122     if (m_speechTask) {
123         WEBKIT_ASSERT(requestId == m_requestId);
124
125         m_speechTask->stop();
126         m_recording = false;
127         m_listener->didCompleteRecognition(m_requestId);
128         m_requestId = 0;
129     }
130 }
131
132 void MockWebSpeechInputController::stopRecording(int requestId)
133 {
134     WEBKIT_ASSERT(requestId == m_requestId);
135     if (m_speechTask && m_recording) {
136         m_speechTask->stop();
137         speechTaskFired();
138     }
139 }
140
141 void MockWebSpeechInputController::speechTaskFired()
142 {
143     if (m_recording) {
144         m_recording = false;
145         m_listener->didCompleteRecording(m_requestId);
146
147         m_speechTask = new SpeechTask(this);
148         m_delegate->postTask(m_speechTask);
149     } else {
150         bool noResultsFound = false;
151         // We take a copy of the requestId here so that if scripts destroyed the input element
152         // inside one of the callbacks below, we'll still know what this session's requestId was.
153         int requestId = m_requestId;
154         m_requestId = 0;
155
156         if (m_dumpRect) {
157             m_listener->setRecognitionResult(requestId, makeRectResult(m_requestRect));
158         } else if (m_language.empty()) {
159             // Empty language case must be handled separately to avoid problems with HashMap and empty keys.
160             if (!m_resultsForEmptyLanguage.empty())
161                 m_listener->setRecognitionResult(requestId, m_resultsForEmptyLanguage);
162             else
163                 noResultsFound = true;
164         } else {
165             if (m_recognitionResults.find(m_language) != m_recognitionResults.end())
166                 m_listener->setRecognitionResult(requestId, m_recognitionResults[m_language]);
167             else
168                 noResultsFound = true;
169         }
170
171         if (noResultsFound) {
172             // Can't avoid setting a result even if no result was set for the given language.
173             // This would avoid generating the events used to check the results and the test would timeout.
174             string error("error: no result found for language '");
175             error.append(m_language);
176             error.append("'");
177
178             WebSpeechInputResult res;
179             res.assign(WebString::fromUTF8(error), 1.0);
180
181             vector<WebSpeechInputResult> results;
182             results.push_back(res);
183
184             m_listener->setRecognitionResult(requestId, results);
185         }
186     }
187 }
188
189 MockWebSpeechInputController::SpeechTask::SpeechTask(MockWebSpeechInputController* mock)
190     : WebMethodTask<MockWebSpeechInputController>::WebMethodTask(mock)
191 {
192 }
193
194 void MockWebSpeechInputController::SpeechTask::stop()
195 {
196     m_object->m_speechTask = 0;
197     cancel();
198     delete this;
199 }
200
201 void MockWebSpeechInputController::SpeechTask::runIfValid()
202 {
203     m_object->m_speechTask = 0;
204     m_object->speechTaskFired();
205 }
206
207 }
208
209 #endif