Index: content/browser/speech/speech_recognition_manager_impl.cc |
diff --git a/content/browser/speech/speech_recognition_manager_impl.cc b/content/browser/speech/speech_recognition_manager_impl.cc |
index 7a0d5c814104717152dd983d5494f704fc31f756..e1c329815aa86e9bd4f2244087c9ed7e04f93e54 100644 |
--- a/content/browser/speech/speech_recognition_manager_impl.cc |
+++ b/content/browser/speech/speech_recognition_manager_impl.cc |
@@ -20,7 +20,6 @@ |
#include "media/audio/audio_manager.h" |
using base::Callback; |
-using base::Unretained; |
using content::BrowserMainLoop; |
using content::BrowserThread; |
using content::SpeechRecognitionError; |
@@ -45,7 +44,6 @@ speech::SpeechRecognitionManagerImpl* g_speech_recognition_manager_impl; |
namespace speech { |
SpeechRecognitionManagerImpl* SpeechRecognitionManagerImpl::GetInstance() { |
- DCHECK(g_speech_recognition_manager_impl); |
return g_speech_recognition_manager_impl; |
} |
@@ -119,7 +117,7 @@ void SpeechRecognitionManagerImpl::StartSession(int session_id) { |
delegate_->CheckRecognitionIsAllowed( |
session_id, |
base::Bind(&SpeechRecognitionManagerImpl::RecognitionAllowedCallback, |
- Unretained(this))); |
+ this->AsWeakPtr())); |
} |
void SpeechRecognitionManagerImpl::RecognitionAllowedCallback(int session_id, |
@@ -129,7 +127,7 @@ void SpeechRecognitionManagerImpl::RecognitionAllowedCallback(int session_id, |
if (is_allowed) { |
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, |
- Unretained(this), session_id, EVENT_START)); |
+ this->AsWeakPtr(), session_id, EVENT_START)); |
} else { |
sessions_.erase(session_id); |
} |
@@ -141,8 +139,8 @@ void SpeechRecognitionManagerImpl::AbortSession(int session_id) { |
return; |
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
- base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, Unretained(this), |
- session_id, EVENT_ABORT)); |
+ base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, |
+ this->AsWeakPtr(), session_id, EVENT_ABORT)); |
} |
void SpeechRecognitionManagerImpl::StopAudioCaptureForSession(int session_id) { |
@@ -151,8 +149,8 @@ void SpeechRecognitionManagerImpl::StopAudioCaptureForSession(int session_id) { |
return; |
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
- base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, Unretained(this), |
- session_id, EVENT_STOP_CAPTURE)); |
+ base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, |
+ this->AsWeakPtr(), session_id, EVENT_STOP_CAPTURE)); |
} |
// Here begins the SpeechRecognitionEventListener interface implementation, |
@@ -230,8 +228,8 @@ void SpeechRecognitionManagerImpl::OnAudioEnd(int session_id) { |
if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
listener->OnAudioEnd(session_id); |
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
- base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, Unretained(this), |
- session_id, EVENT_AUDIO_ENDED)); |
+ base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, |
+ this->AsWeakPtr(), session_id, EVENT_AUDIO_ENDED)); |
} |
void SpeechRecognitionManagerImpl::OnRecognitionResult( |
@@ -280,8 +278,8 @@ void SpeechRecognitionManagerImpl::OnRecognitionEnd(int session_id) { |
if (SpeechRecognitionEventListener* listener = GetListener(session_id)) |
listener->OnRecognitionEnd(session_id); |
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
- base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, Unretained(this), |
- session_id, EVENT_RECOGNITION_ENDED)); |
+ base::Bind(&SpeechRecognitionManagerImpl::DispatchEvent, |
+ this->AsWeakPtr(), session_id, EVENT_RECOGNITION_ENDED)); |
} |
// TODO(primiano) After CL2: if we see that both InputTagDispatcherHost and |
@@ -327,6 +325,12 @@ void SpeechRecognitionManagerImpl::AbortAllSessionsForListener( |
void SpeechRecognitionManagerImpl::DispatchEvent(int session_id, |
FSMEvent event) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ // There are some corner cases in which the session might be deleted (due to |
+ // an EndRecognition event) between a request (e.g. Abort) and its dispatch. |
+ if (!SessionExists(session_id)) |
+ return; |
+ |
const Session& session = GetSession(session_id); |
FSMState session_state = GetSessionState(session_id); |
DCHECK_LE(session_state, SESSION_STATE_MAX_VALUE); |
@@ -506,7 +510,7 @@ void SpeechRecognitionManagerImpl::ShowAudioInputSettings() { |
BrowserThread::PostTask( |
BrowserThread::FILE, FROM_HERE, |
base::Bind(&SpeechRecognitionManagerImpl::ShowAudioInputSettings, |
- Unretained(this))); |
+ this->AsWeakPtr())); |
return; |
} |