Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(140)

Side by Side Diff: content/browser/speech/speech_recognition_manager_impl.cc

Issue 636863003: Make SpeechRecognition per RenderFrame instead of per RenderView. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanups Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 "content/browser/speech/speech_recognition_manager_impl.h" 5 #include "content/browser/speech/speech_recognition_manager_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "content/browser/browser_main_loop.h" 8 #include "content/browser/browser_main_loop.h"
9 #include "content/browser/renderer_host/media/media_stream_manager.h" 9 #include "content/browser/renderer_host/media/media_stream_manager.h"
10 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h" 10 #include "content/browser/renderer_host/media/media_stream_ui_proxy.h"
11 #include "content/browser/speech/google_one_shot_remote_engine.h" 11 #include "content/browser/speech/google_one_shot_remote_engine.h"
12 #include "content/browser/speech/google_streaming_remote_engine.h" 12 #include "content/browser/speech/google_streaming_remote_engine.h"
13 #include "content/browser/speech/speech_recognition_engine.h" 13 #include "content/browser/speech/speech_recognition_engine.h"
14 #include "content/browser/speech/speech_recognizer_impl.h" 14 #include "content/browser/speech/speech_recognizer_impl.h"
15 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
16 #include "content/public/browser/content_browser_client.h" 16 #include "content/public/browser/content_browser_client.h"
17 #include "content/public/browser/render_frame_host.h"
18 #include "content/public/browser/render_process_host.h"
17 #include "content/public/browser/resource_context.h" 19 #include "content/public/browser/resource_context.h"
18 #include "content/public/browser/speech_recognition_event_listener.h" 20 #include "content/public/browser/speech_recognition_event_listener.h"
19 #include "content/public/browser/speech_recognition_manager_delegate.h" 21 #include "content/public/browser/speech_recognition_manager_delegate.h"
20 #include "content/public/browser/speech_recognition_session_config.h" 22 #include "content/public/browser/speech_recognition_session_config.h"
21 #include "content/public/browser/speech_recognition_session_context.h" 23 #include "content/public/browser/speech_recognition_session_context.h"
22 #include "content/public/common/speech_recognition_error.h" 24 #include "content/public/common/speech_recognition_error.h"
23 #include "content/public/common/speech_recognition_result.h" 25 #include "content/public/common/speech_recognition_result.h"
24 #include "media/audio/audio_manager.h" 26 #include "media/audio/audio_manager.h"
25 #include "media/audio/audio_manager_base.h" 27 #include "media/audio/audio_manager_base.h"
26 28
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 SessionsTable::iterator iter = sessions_.find(session_id); 190 SessionsTable::iterator iter = sessions_.find(session_id);
189 DCHECK(iter != sessions_.end()); 191 DCHECK(iter != sessions_.end());
190 Session* session = iter->second; 192 Session* session = iter->second;
191 193
192 if (session->abort_requested) 194 if (session->abort_requested)
193 return; 195 return;
194 196
195 if (ask_user) { 197 if (ask_user) {
196 SpeechRecognitionSessionContext& context = session->context; 198 SpeechRecognitionSessionContext& context = session->context;
197 context.label = media_stream_manager_->MakeMediaAccessRequest( 199 context.label = media_stream_manager_->MakeMediaAccessRequest(
198 context.render_process_id, 200 context.render_frame_host->GetProcess()->GetID(),
199 context.render_frame_id, 201 context.render_frame_host->GetRoutingID(),
200 context.request_id, 202 context.request_id,
201 StreamOptions(true, false), 203 StreamOptions(true, false),
202 GURL(context.context_name), 204 GURL(context.context_name),
203 base::Bind( 205 base::Bind(
204 &SpeechRecognitionManagerImpl::MediaRequestPermissionCallback, 206 &SpeechRecognitionManagerImpl::MediaRequestPermissionCallback,
205 weak_factory_.GetWeakPtr(), session_id)); 207 weak_factory_.GetWeakPtr(), session_id));
206 return; 208 return;
207 } 209 }
208 210
209 if (is_allowed) { 211 if (is_allowed) {
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 listener->OnRecognitionEnd(session_id); 426 listener->OnRecognitionEnd(session_id);
425 base::MessageLoop::current()->PostTask( 427 base::MessageLoop::current()->PostTask(
426 FROM_HERE, 428 FROM_HERE,
427 base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, 429 base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent,
428 weak_factory_.GetWeakPtr(), 430 weak_factory_.GetWeakPtr(),
429 session_id, 431 session_id,
430 EVENT_RECOGNITION_ENDED)); 432 EVENT_RECOGNITION_ENDED));
431 } 433 }
432 434
433 int SpeechRecognitionManagerImpl::GetSession( 435 int SpeechRecognitionManagerImpl::GetSession(
434 int render_process_id, int render_view_id, int request_id) const { 436 RenderFrameHost* render_frame_host, int request_id) const {
435 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 437 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
436 SessionsTable::const_iterator iter; 438 SessionsTable::const_iterator iter;
437 for(iter = sessions_.begin(); iter != sessions_.end(); ++iter) { 439 for(iter = sessions_.begin(); iter != sessions_.end(); ++iter) {
438 const int session_id = iter->first; 440 const int session_id = iter->first;
439 const SpeechRecognitionSessionContext& context = iter->second->context; 441 const SpeechRecognitionSessionContext& context = iter->second->context;
440 if (context.render_process_id == render_process_id && 442 if (context.render_frame_host == render_frame_host &&
441 context.render_view_id == render_view_id &&
442 context.request_id == request_id) { 443 context.request_id == request_id) {
443 return session_id; 444 return session_id;
444 } 445 }
445 } 446 }
446 return kSessionIDInvalid; 447 return kSessionIDInvalid;
447 } 448 }
448 449
449 SpeechRecognitionSessionContext 450 SpeechRecognitionSessionContext
450 SpeechRecognitionManagerImpl::GetSessionContext(int session_id) const { 451 SpeechRecognitionManagerImpl::GetSessionContext(int session_id) const {
451 return GetSession(session_id)->context; 452 return GetSession(session_id)->context;
452 } 453 }
453 454
454 void SpeechRecognitionManagerImpl::AbortAllSessionsForRenderProcess( 455 void SpeechRecognitionManagerImpl::AbortAllSessionsForRenderFrame(
455 int render_process_id) { 456 RenderFrameHost* render_frame_host) {
456 // This method gracefully destroys sessions for the listener. However, since 457 DCHECK(render_frame_host);
457 // the listener itself is likely to be destroyed after this call, we avoid 458 DCHECK_CURRENTLY_ON(BrowserThread::IO);
458 // dispatching further events to it, marking the |listener_is_active| flag. 459
459 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
460 for (SessionsTable::iterator it = sessions_.begin(); it != sessions_.end(); 460 for (SessionsTable::iterator it = sessions_.begin(); it != sessions_.end();
461 ++it) { 461 ++it) {
462 Session* session = it->second; 462 Session* session = it->second;
463 if (session->context.render_process_id == render_process_id) { 463 if (session->context.render_frame_host == render_frame_host)
464 AbortSession(session->id); 464 AbortSession(session->id);
465 session->listener_is_active = false;
466 }
467 } 465 }
468 } 466 }
469 467
470 void SpeechRecognitionManagerImpl::AbortAllSessionsForRenderView(
471 int render_process_id,
472 int render_view_id) {
473 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
474 for (SessionsTable::iterator it = sessions_.begin(); it != sessions_.end();
475 ++it) {
476 Session* session = it->second;
477 if (session->context.render_process_id == render_process_id &&
478 session->context.render_view_id == render_view_id) {
479 AbortSession(session->id);
480 }
481 }
482 }
483
484 // ----------------------- Core FSM implementation --------------------------- 468 // ----------------------- Core FSM implementation ---------------------------
485 void SpeechRecognitionManagerImpl::DispatchEvent(int session_id, 469 void SpeechRecognitionManagerImpl::DispatchEvent(int session_id,
486 FSMEvent event) { 470 FSMEvent event) {
487 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 471 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
488 472
489 // There are some corner cases in which the session might be deleted (due to 473 // There are some corner cases in which the session might be deleted (due to
490 // an EndRecognition event) between a request (e.g. Abort) and its dispatch. 474 // an EndRecognition event) between a request (e.g. Abort) and its dispatch.
491 if (!SessionExists(session_id)) 475 if (!SessionExists(session_id))
492 return; 476 return;
493 477
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 SpeechRecognitionManagerImpl::Session::Session() 675 SpeechRecognitionManagerImpl::Session::Session()
692 : id(kSessionIDInvalid), 676 : id(kSessionIDInvalid),
693 abort_requested(false), 677 abort_requested(false),
694 listener_is_active(true) { 678 listener_is_active(true) {
695 } 679 }
696 680
697 SpeechRecognitionManagerImpl::Session::~Session() { 681 SpeechRecognitionManagerImpl::Session::~Session() {
698 } 682 }
699 683
700 } // namespace content 684 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698