OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/command_line.h" | 6 #include "base/command_line.h" |
7 #include "base/file_path.h" | 7 #include "base/file_path.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
10 #include "base/synchronization/waitable_event.h" | 10 #include "base/synchronization/waitable_event.h" |
11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
12 #include "chrome/browser/ui/browser.h" | 12 #include "chrome/browser/ui/browser.h" |
13 #include "chrome/test/base/in_process_browser_test.h" | 13 #include "chrome/test/base/in_process_browser_test.h" |
14 #include "chrome/test/base/ui_test_utils.h" | 14 #include "chrome/test/base/ui_test_utils.h" |
15 #include "content/browser/renderer_host/render_view_host_impl.h" | 15 #include "content/browser/renderer_host/render_view_host_impl.h" |
16 #include "content/browser/speech/input_tag_speech_dispatcher_host.h" | 16 #include "content/browser/speech/input_tag_speech_dispatcher_host.h" |
17 #include "content/browser/speech/speech_recognition_manager_impl.h" | |
18 #include "content/browser/web_contents/web_contents_impl.h" | 17 #include "content/browser/web_contents/web_contents_impl.h" |
19 #include "content/public/browser/notification_types.h" | 18 #include "content/public/browser/notification_types.h" |
| 19 #include "content/public/browser/speech_recognition_manager.h" |
20 #include "content/public/browser/speech_recognition_session_config.h" | 20 #include "content/public/browser/speech_recognition_session_config.h" |
21 #include "content/public/browser/speech_recognition_session_context.h" | 21 #include "content/public/browser/speech_recognition_session_context.h" |
22 #include "content/public/common/content_switches.h" | 22 #include "content/public/common/content_switches.h" |
23 #include "content/public/common/speech_recognition_error.h" | 23 #include "content/public/common/speech_recognition_error.h" |
24 #include "content/public/common/speech_recognition_result.h" | 24 #include "content/public/common/speech_recognition_result.h" |
25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" | 25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
26 | 26 |
27 using content::SpeechRecognitionEventListener; | 27 using content::SpeechRecognitionEventListener; |
| 28 using content::SpeechRecognitionSessionConfig; |
28 using content::SpeechRecognitionSessionContext; | 29 using content::SpeechRecognitionSessionContext; |
29 using content::NavigationController; | 30 using content::NavigationController; |
30 using content::WebContents; | 31 using content::WebContents; |
31 | 32 |
32 namespace speech { | 33 namespace speech { |
33 class FakeSpeechRecognitionManager; | 34 class FakeSpeechRecognitionManager; |
34 } | 35 } |
35 | 36 |
36 namespace speech { | 37 namespace speech { |
37 | 38 |
38 const char kTestResult[] = "Pictures of the moon"; | 39 const char kTestResult[] = "Pictures of the moon"; |
39 | 40 |
40 class FakeSpeechRecognitionManager : public SpeechRecognitionManagerImpl { | 41 class FakeSpeechRecognitionManager : public content::SpeechRecognitionManager { |
41 public: | 42 public: |
42 FakeSpeechRecognitionManager() | 43 FakeSpeechRecognitionManager() |
43 : session_id_(0), | 44 : session_id_(0), |
44 listener_(NULL), | 45 listener_(NULL), |
45 did_cancel_all_(false), | 46 did_cancel_all_(false), |
46 should_send_fake_response_(true), | 47 should_send_fake_response_(true), |
47 recognition_started_event_(false, false) { | 48 recognition_started_event_(false, false) { |
48 } | 49 } |
49 | 50 |
50 std::string grammar() { | 51 std::string grammar() { |
(...skipping 19 matching lines...) Expand all Loading... |
70 // SpeechRecognitionManager methods. | 71 // SpeechRecognitionManager methods. |
71 virtual int CreateSession( | 72 virtual int CreateSession( |
72 const content::SpeechRecognitionSessionConfig& config) OVERRIDE { | 73 const content::SpeechRecognitionSessionConfig& config) OVERRIDE { |
73 VLOG(1) << "FAKE CreateSession invoked."; | 74 VLOG(1) << "FAKE CreateSession invoked."; |
74 EXPECT_EQ(0, session_id_); | 75 EXPECT_EQ(0, session_id_); |
75 EXPECT_EQ(NULL, listener_); | 76 EXPECT_EQ(NULL, listener_); |
76 listener_ = config.event_listener; | 77 listener_ = config.event_listener; |
77 if (config.grammars.size() > 0) | 78 if (config.grammars.size() > 0) |
78 grammar_ = config.grammars[0].url; | 79 grammar_ = config.grammars[0].url; |
79 session_ctx_ = config.initial_context; | 80 session_ctx_ = config.initial_context; |
| 81 session_config_ = config; |
80 session_id_ = 1; | 82 session_id_ = 1; |
81 return session_id_; | 83 return session_id_; |
82 } | 84 } |
83 | 85 |
84 virtual void StartSession(int session_id) OVERRIDE { | 86 virtual void StartSession(int session_id) OVERRIDE { |
85 VLOG(1) << "FAKE StartSession invoked."; | 87 VLOG(1) << "FAKE StartSession invoked."; |
86 EXPECT_EQ(session_id, session_id_); | 88 EXPECT_EQ(session_id, session_id_); |
87 EXPECT_TRUE(listener_ != NULL); | 89 EXPECT_TRUE(listener_ != NULL); |
88 | 90 |
89 if (should_send_fake_response_) { | 91 if (should_send_fake_response_) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 virtual void ShowAudioInputSettings() OVERRIDE {} | 131 virtual void ShowAudioInputSettings() OVERRIDE {} |
130 | 132 |
131 virtual int LookupSessionByContext( | 133 virtual int LookupSessionByContext( |
132 base::Callback<bool( | 134 base::Callback<bool( |
133 const content::SpeechRecognitionSessionContext&)> matcher) | 135 const content::SpeechRecognitionSessionContext&)> matcher) |
134 const OVERRIDE { | 136 const OVERRIDE { |
135 bool matched = matcher.Run(session_ctx_); | 137 bool matched = matcher.Run(session_ctx_); |
136 return matched ? session_id_ : 0; | 138 return matched ? session_id_ : 0; |
137 } | 139 } |
138 | 140 |
| 141 virtual const SpeechRecognitionSessionConfig& GetSessionConfig( |
| 142 int session_id) const OVERRIDE { |
| 143 EXPECT_EQ(session_id, session_id_); |
| 144 return session_config_; |
| 145 } |
| 146 |
139 virtual content::SpeechRecognitionSessionContext GetSessionContext( | 147 virtual content::SpeechRecognitionSessionContext GetSessionContext( |
140 int session_id) const OVERRIDE { | 148 int session_id) const OVERRIDE { |
141 EXPECT_EQ(session_id, session_id_); | 149 EXPECT_EQ(session_id, session_id_); |
142 return session_ctx_; | 150 return session_ctx_; |
143 } | 151 } |
144 | 152 |
145 private: | 153 private: |
146 void SetFakeRecognitionResult() { | 154 void SetFakeRecognitionResult() { |
147 if (session_id_) { // Do a check in case we were cancelled.. | 155 if (session_id_) { // Do a check in case we were cancelled.. |
148 VLOG(1) << "Setting fake recognition result."; | 156 VLOG(1) << "Setting fake recognition result."; |
149 listener_->OnAudioEnd(session_id_); | 157 listener_->OnAudioEnd(session_id_); |
150 content::SpeechRecognitionResult results; | 158 content::SpeechRecognitionResult results; |
151 results.hypotheses.push_back(content::SpeechRecognitionHypothesis( | 159 results.hypotheses.push_back(content::SpeechRecognitionHypothesis( |
152 ASCIIToUTF16(kTestResult), 1.0)); | 160 ASCIIToUTF16(kTestResult), 1.0)); |
153 listener_->OnRecognitionResult(session_id_, results); | 161 listener_->OnRecognitionResult(session_id_, results); |
154 listener_->OnRecognitionEnd(session_id_); | 162 listener_->OnRecognitionEnd(session_id_); |
155 session_id_ = 0; | 163 session_id_ = 0; |
156 listener_ = NULL; | 164 listener_ = NULL; |
157 VLOG(1) << "Finished setting fake recognition result."; | 165 VLOG(1) << "Finished setting fake recognition result."; |
158 } | 166 } |
159 } | 167 } |
160 | 168 |
161 int session_id_; | 169 int session_id_; |
162 SpeechRecognitionEventListener* listener_; | 170 SpeechRecognitionEventListener* listener_; |
| 171 SpeechRecognitionSessionConfig session_config_; |
163 SpeechRecognitionSessionContext session_ctx_; | 172 SpeechRecognitionSessionContext session_ctx_; |
164 std::string grammar_; | 173 std::string grammar_; |
165 bool did_cancel_all_; | 174 bool did_cancel_all_; |
166 bool should_send_fake_response_; | 175 bool should_send_fake_response_; |
167 base::WaitableEvent recognition_started_event_; | 176 base::WaitableEvent recognition_started_event_; |
168 }; | 177 }; |
169 | 178 |
170 class SpeechRecognitionBrowserTest : public InProcessBrowserTest { | 179 class SpeechRecognitionBrowserTest : public InProcessBrowserTest { |
171 public: | 180 public: |
172 // InProcessBrowserTest methods | 181 // InProcessBrowserTest methods |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 EXPECT_EQ("pass", browser()->GetSelectedWebContents()->GetURL().ref()); | 228 EXPECT_EQ("pass", browser()->GetSelectedWebContents()->GetURL().ref()); |
220 } | 229 } |
221 | 230 |
222 // InProcessBrowserTest methods. | 231 // InProcessBrowserTest methods. |
223 virtual void SetUpInProcessBrowserTestFixture() { | 232 virtual void SetUpInProcessBrowserTestFixture() { |
224 fake_speech_recognition_manager_.set_should_send_fake_response(true); | 233 fake_speech_recognition_manager_.set_should_send_fake_response(true); |
225 speech_recognition_manager_ = &fake_speech_recognition_manager_; | 234 speech_recognition_manager_ = &fake_speech_recognition_manager_; |
226 | 235 |
227 // Inject the fake manager factory so that the test result is returned to | 236 // Inject the fake manager factory so that the test result is returned to |
228 // the web page. | 237 // the web page. |
229 InputTagSpeechDispatcherHost::set_manager(speech_recognition_manager_); | 238 InputTagSpeechDispatcherHost::SetManagerForTests( |
| 239 speech_recognition_manager_); |
230 } | 240 } |
231 | 241 |
232 virtual void TearDownInProcessBrowserTestFixture() { | 242 virtual void TearDownInProcessBrowserTestFixture() { |
233 speech_recognition_manager_ = NULL; | 243 speech_recognition_manager_ = NULL; |
234 } | 244 } |
235 | 245 |
236 FakeSpeechRecognitionManager fake_speech_recognition_manager_; | 246 FakeSpeechRecognitionManager fake_speech_recognition_manager_; |
237 | 247 |
238 // This is used by the static |fakeManager|, and it is a pointer rather than a | 248 // This is used by the static |fakeManager|, and it is a pointer rather than a |
239 // direct instance per the style guide. | 249 // direct instance per the style guide. |
240 static SpeechRecognitionManagerImpl* speech_recognition_manager_; | 250 static content::SpeechRecognitionManager* speech_recognition_manager_; |
241 }; | 251 }; |
242 | 252 |
243 SpeechRecognitionManagerImpl* | 253 content::SpeechRecognitionManager* |
244 SpeechRecognitionBrowserTest::speech_recognition_manager_ = NULL; | 254 SpeechRecognitionBrowserTest::speech_recognition_manager_ = NULL; |
245 | 255 |
246 // TODO(satish): Once this flakiness has been fixed, add a second test here to | 256 // TODO(satish): Once this flakiness has been fixed, add a second test here to |
247 // check for sending many clicks in succession to the speech button and verify | 257 // check for sending many clicks in succession to the speech button and verify |
248 // that it doesn't cause any crash but works as expected. This should act as the | 258 // that it doesn't cause any crash but works as expected. This should act as the |
249 // test for http://crbug.com/59173 | 259 // test for http://crbug.com/59173 |
250 // | 260 // |
251 // TODO(satish): Similar to above, once this flakiness has been fixed add | 261 // TODO(satish): Similar to above, once this flakiness has been fixed add |
252 // another test here to check that when speech recognition is in progress and | 262 // another test here to check that when speech recognition is in progress and |
253 // a renderer crashes, we get a call to | 263 // a renderer crashes, we get a call to |
(...skipping 21 matching lines...) Expand all Loading... |
275 | 285 |
276 // Make the renderer crash. This should trigger | 286 // Make the renderer crash. This should trigger |
277 // InputTagSpeechDispatcherHost to cancel all pending sessions. | 287 // InputTagSpeechDispatcherHost to cancel all pending sessions. |
278 GURL test_url("about:crash"); | 288 GURL test_url("about:crash"); |
279 ui_test_utils::NavigateToURL(browser(), test_url); | 289 ui_test_utils::NavigateToURL(browser(), test_url); |
280 | 290 |
281 EXPECT_TRUE(fake_speech_recognition_manager_.did_cancel_all()); | 291 EXPECT_TRUE(fake_speech_recognition_manager_.did_cancel_all()); |
282 } | 292 } |
283 | 293 |
284 } // namespace speech | 294 } // namespace speech |
OLD | NEW |