| 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 18 matching lines...) Expand all Loading... |
| 69 | 70 |
| 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 grammar_ = config.grammar; | 78 grammar_ = config.grammar; |
| 78 session_ctx_ = config.initial_context; | 79 session_ctx_ = config.initial_context; |
| 80 session_config_ = config; |
| 79 session_id_ = 1; | 81 session_id_ = 1; |
| 80 return session_id_; | 82 return session_id_; |
| 81 } | 83 } |
| 82 | 84 |
| 83 virtual void StartSession(int session_id) OVERRIDE { | 85 virtual void StartSession(int session_id) OVERRIDE { |
| 84 VLOG(1) << "FAKE StartSession invoked."; | 86 VLOG(1) << "FAKE StartSession invoked."; |
| 85 EXPECT_EQ(session_id, session_id_); | 87 EXPECT_EQ(session_id, session_id_); |
| 86 EXPECT_TRUE(listener_ != NULL); | 88 EXPECT_TRUE(listener_ != NULL); |
| 87 | 89 |
| 88 if (should_send_fake_response_) { | 90 if (should_send_fake_response_) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 virtual void ShowAudioInputSettings() OVERRIDE {} | 130 virtual void ShowAudioInputSettings() OVERRIDE {} |
| 129 | 131 |
| 130 virtual int LookupSessionByContext( | 132 virtual int LookupSessionByContext( |
| 131 base::Callback<bool( | 133 base::Callback<bool( |
| 132 const content::SpeechRecognitionSessionContext&)> matcher) | 134 const content::SpeechRecognitionSessionContext&)> matcher) |
| 133 const OVERRIDE { | 135 const OVERRIDE { |
| 134 bool matched = matcher.Run(session_ctx_); | 136 bool matched = matcher.Run(session_ctx_); |
| 135 return matched ? session_id_ : 0; | 137 return matched ? session_id_ : 0; |
| 136 } | 138 } |
| 137 | 139 |
| 140 virtual const SpeechRecognitionSessionConfig& GetSessionConfig( |
| 141 int session_id) const OVERRIDE { |
| 142 EXPECT_EQ(session_id, session_id_); |
| 143 return session_config_; |
| 144 } |
| 145 |
| 138 virtual content::SpeechRecognitionSessionContext GetSessionContext( | 146 virtual content::SpeechRecognitionSessionContext GetSessionContext( |
| 139 int session_id) const OVERRIDE { | 147 int session_id) const OVERRIDE { |
| 140 EXPECT_EQ(session_id, session_id_); | 148 EXPECT_EQ(session_id, session_id_); |
| 141 return session_ctx_; | 149 return session_ctx_; |
| 142 } | 150 } |
| 143 | 151 |
| 144 private: | 152 private: |
| 145 void SetFakeRecognitionResult() { | 153 void SetFakeRecognitionResult() { |
| 146 if (session_id_) { // Do a check in case we were cancelled.. | 154 if (session_id_) { // Do a check in case we were cancelled.. |
| 147 VLOG(1) << "Setting fake recognition result."; | 155 VLOG(1) << "Setting fake recognition result."; |
| 148 listener_->OnAudioEnd(session_id_); | 156 listener_->OnAudioEnd(session_id_); |
| 149 content::SpeechRecognitionResult results; | 157 content::SpeechRecognitionResult results; |
| 150 results.hypotheses.push_back(content::SpeechRecognitionHypothesis( | 158 results.hypotheses.push_back(content::SpeechRecognitionHypothesis( |
| 151 ASCIIToUTF16(kTestResult), 1.0)); | 159 ASCIIToUTF16(kTestResult), 1.0)); |
| 152 listener_->OnRecognitionResult(session_id_, results); | 160 listener_->OnRecognitionResult(session_id_, results); |
| 153 listener_->OnRecognitionEnd(session_id_); | 161 listener_->OnRecognitionEnd(session_id_); |
| 154 session_id_ = 0; | 162 session_id_ = 0; |
| 155 listener_ = NULL; | 163 listener_ = NULL; |
| 156 VLOG(1) << "Finished setting fake recognition result."; | 164 VLOG(1) << "Finished setting fake recognition result."; |
| 157 } | 165 } |
| 158 } | 166 } |
| 159 | 167 |
| 160 int session_id_; | 168 int session_id_; |
| 161 SpeechRecognitionEventListener* listener_; | 169 SpeechRecognitionEventListener* listener_; |
| 170 SpeechRecognitionSessionConfig session_config_; |
| 162 SpeechRecognitionSessionContext session_ctx_; | 171 SpeechRecognitionSessionContext session_ctx_; |
| 163 std::string grammar_; | 172 std::string grammar_; |
| 164 bool did_cancel_all_; | 173 bool did_cancel_all_; |
| 165 bool should_send_fake_response_; | 174 bool should_send_fake_response_; |
| 166 base::WaitableEvent recognition_started_event_; | 175 base::WaitableEvent recognition_started_event_; |
| 167 }; | 176 }; |
| 168 | 177 |
| 169 class SpeechRecognitionBrowserTest : public InProcessBrowserTest { | 178 class SpeechRecognitionBrowserTest : public InProcessBrowserTest { |
| 170 public: | 179 public: |
| 171 // InProcessBrowserTest methods | 180 // InProcessBrowserTest methods |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 EXPECT_EQ("pass", browser()->GetSelectedWebContents()->GetURL().ref()); | 227 EXPECT_EQ("pass", browser()->GetSelectedWebContents()->GetURL().ref()); |
| 219 } | 228 } |
| 220 | 229 |
| 221 // InProcessBrowserTest methods. | 230 // InProcessBrowserTest methods. |
| 222 virtual void SetUpInProcessBrowserTestFixture() { | 231 virtual void SetUpInProcessBrowserTestFixture() { |
| 223 fake_speech_recognition_manager_.set_should_send_fake_response(true); | 232 fake_speech_recognition_manager_.set_should_send_fake_response(true); |
| 224 speech_recognition_manager_ = &fake_speech_recognition_manager_; | 233 speech_recognition_manager_ = &fake_speech_recognition_manager_; |
| 225 | 234 |
| 226 // Inject the fake manager factory so that the test result is returned to | 235 // Inject the fake manager factory so that the test result is returned to |
| 227 // the web page. | 236 // the web page. |
| 228 InputTagSpeechDispatcherHost::set_manager(speech_recognition_manager_); | 237 InputTagSpeechDispatcherHost::set_manager_for_tests( |
| 238 speech_recognition_manager_); |
| 229 } | 239 } |
| 230 | 240 |
| 231 virtual void TearDownInProcessBrowserTestFixture() { | 241 virtual void TearDownInProcessBrowserTestFixture() { |
| 232 speech_recognition_manager_ = NULL; | 242 speech_recognition_manager_ = NULL; |
| 233 } | 243 } |
| 234 | 244 |
| 235 FakeSpeechRecognitionManager fake_speech_recognition_manager_; | 245 FakeSpeechRecognitionManager fake_speech_recognition_manager_; |
| 236 | 246 |
| 237 // This is used by the static |fakeManager|, and it is a pointer rather than a | 247 // This is used by the static |fakeManager|, and it is a pointer rather than a |
| 238 // direct instance per the style guide. | 248 // direct instance per the style guide. |
| 239 static SpeechRecognitionManagerImpl* speech_recognition_manager_; | 249 static content::SpeechRecognitionManager* speech_recognition_manager_; |
| 240 }; | 250 }; |
| 241 | 251 |
| 242 SpeechRecognitionManagerImpl* | 252 content::SpeechRecognitionManager* |
| 243 SpeechRecognitionBrowserTest::speech_recognition_manager_ = NULL; | 253 SpeechRecognitionBrowserTest::speech_recognition_manager_ = NULL; |
| 244 | 254 |
| 245 // TODO(satish): Once this flakiness has been fixed, add a second test here to | 255 // TODO(satish): Once this flakiness has been fixed, add a second test here to |
| 246 // check for sending many clicks in succession to the speech button and verify | 256 // check for sending many clicks in succession to the speech button and verify |
| 247 // that it doesn't cause any crash but works as expected. This should act as the | 257 // that it doesn't cause any crash but works as expected. This should act as the |
| 248 // test for http://crbug.com/59173 | 258 // test for http://crbug.com/59173 |
| 249 // | 259 // |
| 250 // TODO(satish): Similar to above, once this flakiness has been fixed add | 260 // TODO(satish): Similar to above, once this flakiness has been fixed add |
| 251 // another test here to check that when speech recognition is in progress and | 261 // another test here to check that when speech recognition is in progress and |
| 252 // a renderer crashes, we get a call to | 262 // a renderer crashes, we get a call to |
| (...skipping 21 matching lines...) Expand all Loading... |
| 274 | 284 |
| 275 // Make the renderer crash. This should trigger | 285 // Make the renderer crash. This should trigger |
| 276 // InputTagSpeechDispatcherHost to cancel all pending sessions. | 286 // InputTagSpeechDispatcherHost to cancel all pending sessions. |
| 277 GURL test_url("about:crash"); | 287 GURL test_url("about:crash"); |
| 278 ui_test_utils::NavigateToURL(browser(), test_url); | 288 ui_test_utils::NavigateToURL(browser(), test_url); |
| 279 | 289 |
| 280 EXPECT_TRUE(fake_speech_recognition_manager_.did_cancel_all()); | 290 EXPECT_TRUE(fake_speech_recognition_manager_.did_cancel_all()); |
| 281 } | 291 } |
| 282 | 292 |
| 283 } // namespace speech | 293 } // namespace speech |
| OLD | NEW |