diff options
Diffstat (limited to 'content/browser')
8 files changed, 117 insertions, 133 deletions
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc index 7817d3e..fba20f8 100644 --- a/content/browser/download/download_manager_impl_unittest.cc +++ b/content/browser/download/download_manager_impl_unittest.cc @@ -404,8 +404,6 @@ class MockBrowserContext : public BrowserContext { MOCK_METHOD0(GetDownloadManagerDelegate, DownloadManagerDelegate*()); MOCK_METHOD0(GetGeolocationPermissionContext, GeolocationPermissionContext* ()); - MOCK_METHOD0(GetSpeechRecognitionPreferences, - SpeechRecognitionPreferences* ()); MOCK_METHOD0(GetSpecialStoragePolicy, quota::SpecialStoragePolicy*()); }; diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 7bd9337..3162e8e 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc @@ -651,12 +651,10 @@ void RenderProcessHostImpl::CreateMessageFilters() { #endif #if defined(ENABLE_INPUT_SPEECH) channel_->AddFilter(new InputTagSpeechDispatcherHost( - IsGuest(), GetID(), storage_partition_impl_->GetURLRequestContext(), - browser_context->GetSpeechRecognitionPreferences())); + IsGuest(), GetID(), storage_partition_impl_->GetURLRequestContext())); #endif channel_->AddFilter(new SpeechRecognitionDispatcherHost( - GetID(), storage_partition_impl_->GetURLRequestContext(), - browser_context->GetSpeechRecognitionPreferences())); + GetID(), storage_partition_impl_->GetURLRequestContext())); channel_->AddFilter(new FileAPIMessageFilter( GetID(), storage_partition_impl_->GetURLRequestContext(), diff --git a/content/browser/speech/input_tag_speech_dispatcher_host.cc b/content/browser/speech/input_tag_speech_dispatcher_host.cc index 8c4acdb..4a3af54 100644 --- a/content/browser/speech/input_tag_speech_dispatcher_host.cc +++ b/content/browser/speech/input_tag_speech_dispatcher_host.cc @@ -8,10 +8,10 @@ #include "base/lazy_instance.h" #include "content/browser/browser_plugin/browser_plugin_guest.h" #include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/browser/speech/speech_recognition_manager_impl.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/common/speech_recognition_messages.h" -#include "content/public/browser/speech_recognition_manager.h" -#include "content/public/browser/speech_recognition_preferences.h" +#include "content/public/browser/speech_recognition_manager_delegate.h" #include "content/public/browser/speech_recognition_session_config.h" #include "content/public/browser/speech_recognition_session_context.h" @@ -24,23 +24,17 @@ namespace content { InputTagSpeechDispatcherHost::InputTagSpeechDispatcherHost( bool guest, int render_process_id, - net::URLRequestContextGetter* url_request_context_getter, - SpeechRecognitionPreferences* recognition_preferences) + net::URLRequestContextGetter* url_request_context_getter) : guest_(guest), render_process_id_(render_process_id), - url_request_context_getter_(url_request_context_getter), - recognition_preferences_(recognition_preferences) { + url_request_context_getter_(url_request_context_getter) { // Do not add any non-trivial initialization here, instead do it lazily when - // required (e.g. see the method |manager()|) or add an Init() method. + // required (e.g. see the method |SpeechRecognitionManager::GetInstance()|) or + // add an Init() method. } InputTagSpeechDispatcherHost::~InputTagSpeechDispatcherHost() { - if (SpeechRecognitionManager* sr_manager = manager()) - sr_manager->AbortAllSessionsForListener(this); -} - -SpeechRecognitionManager* InputTagSpeechDispatcherHost::manager() { - return SpeechRecognitionManager::GetInstance(); + SpeechRecognitionManager::GetInstance()->AbortAllSessionsForListener(this); } bool InputTagSpeechDispatcherHost::OnMessageReceived( @@ -59,20 +53,15 @@ bool InputTagSpeechDispatcherHost::OnMessageReceived( return handled; } -void InputTagSpeechDispatcherHost::OnStartRecognition( - const InputTagSpeechHostMsg_StartRecognition_Params& params) { - if (guest_ && !BrowserThread::CurrentlyOn(BrowserThread::UI)) { - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::Bind( - &InputTagSpeechDispatcherHost::OnStartRecognition, - this, - params)); - return; - } - - DCHECK(!guest_ || BrowserThread::CurrentlyOn(BrowserThread::UI)); +void InputTagSpeechDispatcherHost::OverrideThreadForMessage( + const IPC::Message& message, + BrowserThread::ID* thread) { + if (message.type() == InputTagSpeechHostMsg_StartRecognition::ID) + *thread = BrowserThread::UI; +} +void InputTagSpeechDispatcherHost::OnStartRecognition( + const InputTagSpeechHostMsg_StartRecognition_Params& params) { InputTagSpeechHostMsg_StartRecognition_Params input_params(params); int render_process_id = render_process_id_; // The chrome layer is mostly oblivious to BrowserPlugin guests and so it @@ -93,25 +82,28 @@ void InputTagSpeechDispatcherHost::OnStartRecognition( input_params.render_view_id = guest->embedder_web_contents()->GetRoutingID(); } - - if (guest_) { - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - base::Bind( - &InputTagSpeechDispatcherHost::StartRecognitionOnIO, - this, - render_process_id, - guest_render_view_id, - input_params)); - } else { - StartRecognitionOnIO(render_process_id, guest_render_view_id, params); - } + bool filter_profanities = + SpeechRecognitionManagerImpl::GetInstance() && + SpeechRecognitionManagerImpl::GetInstance()->delegate() && + SpeechRecognitionManagerImpl::GetInstance()->delegate()-> + FilterProfanities(render_process_id_); + + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::Bind( + &InputTagSpeechDispatcherHost::StartRecognitionOnIO, + this, + render_process_id, + guest_render_view_id, + input_params, + filter_profanities)); } void InputTagSpeechDispatcherHost::StartRecognitionOnIO( int render_process_id, int guest_render_view_id, - const InputTagSpeechHostMsg_StartRecognition_Params& params) { + const InputTagSpeechHostMsg_StartRecognition_Params& params, + bool filter_profanities) { SpeechRecognitionSessionContext context; context.render_process_id = render_process_id; context.render_view_id = params.render_view_id; @@ -128,40 +120,37 @@ void InputTagSpeechDispatcherHost::StartRecognitionOnIO( config.origin_url = params.origin_url; config.initial_context = context; config.url_request_context_getter = url_request_context_getter_.get(); - if (recognition_preferences_.get()) { - config.filter_profanities = recognition_preferences_->FilterProfanities(); - } else { - config.filter_profanities = false; - } + config.filter_profanities = filter_profanities; config.event_listener = this; - int session_id = manager()->CreateSession(config); + int session_id = SpeechRecognitionManager::GetInstance()->CreateSession( + config); DCHECK_NE(session_id, SpeechRecognitionManager::kSessionIDInvalid); - manager()->StartSession(session_id); + SpeechRecognitionManager::GetInstance()->StartSession(session_id); } void InputTagSpeechDispatcherHost::OnCancelRecognition(int render_view_id, int request_id) { - int session_id = manager()->GetSession(render_process_id_, - render_view_id, - request_id); + int session_id = SpeechRecognitionManager::GetInstance()->GetSession( + render_process_id_, render_view_id, request_id); // The renderer might provide an invalid |request_id| if the session was not // started as expected, e.g., due to unsatisfied security requirements. if (session_id != SpeechRecognitionManager::kSessionIDInvalid) - manager()->AbortSession(session_id); + SpeechRecognitionManager::GetInstance()->AbortSession(session_id); } void InputTagSpeechDispatcherHost::OnStopRecording(int render_view_id, int request_id) { - int session_id = manager()->GetSession(render_process_id_, - render_view_id, - request_id); + int session_id = SpeechRecognitionManager::GetInstance()->GetSession( + render_process_id_, render_view_id, request_id); // The renderer might provide an invalid |request_id| if the session was not // started as expected, e.g., due to unsatisfied security requirements. - if (session_id != SpeechRecognitionManager::kSessionIDInvalid) - manager()->StopAudioCaptureForSession(session_id); + if (session_id != SpeechRecognitionManager::kSessionIDInvalid) { + SpeechRecognitionManager::GetInstance()->StopAudioCaptureForSession( + session_id); + } } // -------- SpeechRecognitionEventListener interface implementation ----------- @@ -171,7 +160,7 @@ void InputTagSpeechDispatcherHost::OnRecognitionResults( DVLOG(1) << "InputTagSpeechDispatcherHost::OnRecognitionResults enter"; const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); int render_view_id = context.guest_render_view_id ? context.guest_render_view_id : context.render_view_id; @@ -186,7 +175,7 @@ void InputTagSpeechDispatcherHost::OnAudioEnd(int session_id) { DVLOG(1) << "InputTagSpeechDispatcherHost::OnAudioEnd enter"; const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); int render_view_id = context.guest_render_view_id ? context.guest_render_view_id : context.render_view_id; Send(new InputTagSpeechMsg_RecordingComplete(render_view_id, @@ -197,7 +186,7 @@ void InputTagSpeechDispatcherHost::OnAudioEnd(int session_id) { void InputTagSpeechDispatcherHost::OnRecognitionEnd(int session_id) { DVLOG(1) << "InputTagSpeechDispatcherHost::OnRecognitionEnd enter"; const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); int render_view_id = context.guest_render_view_id ? context.guest_render_view_id : context.render_view_id; Send(new InputTagSpeechMsg_RecognitionComplete(render_view_id, diff --git a/content/browser/speech/input_tag_speech_dispatcher_host.h b/content/browser/speech/input_tag_speech_dispatcher_host.h index 5593ac6..cb0bf3b 100644 --- a/content/browser/speech/input_tag_speech_dispatcher_host.h +++ b/content/browser/speech/input_tag_speech_dispatcher_host.h @@ -18,7 +18,6 @@ struct InputTagSpeechHostMsg_StartRecognition_Params; namespace content { class SpeechRecognitionManager; -class SpeechRecognitionPreferences; // InputTagSpeechDispatcherHost is a delegate for Speech API messages used by // RenderMessageFilter. Basically it acts as a proxy, relaying the events coming @@ -31,8 +30,7 @@ class CONTENT_EXPORT InputTagSpeechDispatcherHost InputTagSpeechDispatcherHost( bool guest, int render_process_id, - net::URLRequestContextGetter* url_request_context_getter, - SpeechRecognitionPreferences* recognition_preferences); + net::URLRequestContextGetter* url_request_context_getter); // SpeechRecognitionEventListener methods. virtual void OnRecognitionStart(int session_id) OVERRIDE; @@ -55,6 +53,9 @@ class CONTENT_EXPORT InputTagSpeechDispatcherHost // BrowserMessageFilter implementation. virtual bool OnMessageReceived(const IPC::Message& message, bool* message_was_ok) OVERRIDE; + virtual void OverrideThreadForMessage( + const IPC::Message& message, + BrowserThread::ID* thread) OVERRIDE; private: virtual ~InputTagSpeechDispatcherHost(); @@ -67,15 +68,12 @@ class CONTENT_EXPORT InputTagSpeechDispatcherHost void StartRecognitionOnIO( int render_process_id, int guest_render_view_id, - const InputTagSpeechHostMsg_StartRecognition_Params& params); - // Returns the speech recognition manager to forward events to, creating one - // if needed. - SpeechRecognitionManager* manager(); + const InputTagSpeechHostMsg_StartRecognition_Params& params, + bool filter_profanities); bool guest_; int render_process_id_; scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; - scoped_refptr<SpeechRecognitionPreferences> recognition_preferences_; DISALLOW_COPY_AND_ASSIGN(InputTagSpeechDispatcherHost); }; diff --git a/content/browser/speech/speech_recognition_browsertest.cc b/content/browser/speech/speech_recognition_browsertest.cc index 8c7eaae..9c9c823 100644 --- a/content/browser/speech/speech_recognition_browsertest.cc +++ b/content/browser/speech/speech_recognition_browsertest.cc @@ -54,7 +54,7 @@ class SpeechRecognitionBrowserTest : public ContentBrowserTest { web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event); mouse_event.type = WebKit::WebInputEvent::MouseUp; web_contents->GetRenderViewHost()->ForwardMouseEvent(mouse_event); - fake_speech_recognition_manager_.recognition_started_event().Wait(); + fake_speech_recognition_manager_.WaitForRecognitionStarted(); // We should wait for a navigation event, raised by the test page JS code // upon the onwebkitspeechchange event, in all cases except when the diff --git a/content/browser/speech/speech_recognition_dispatcher_host.cc b/content/browser/speech/speech_recognition_dispatcher_host.cc index 7f20ca4..e506675 100644 --- a/content/browser/speech/speech_recognition_dispatcher_host.cc +++ b/content/browser/speech/speech_recognition_dispatcher_host.cc @@ -7,42 +7,27 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/lazy_instance.h" +#include "content/browser/speech/speech_recognition_manager_impl.h" #include "content/common/speech_recognition_messages.h" -#include "content/public/browser/speech_recognition_manager.h" -#include "content/public/browser/speech_recognition_preferences.h" +#include "content/public/browser/speech_recognition_manager_delegate.h" #include "content/public/browser/speech_recognition_session_config.h" #include "content/public/browser/speech_recognition_session_context.h" #include "content/public/common/content_switches.h" namespace content { -SpeechRecognitionManager* SpeechRecognitionDispatcherHost::manager_for_tests_; - -void SpeechRecognitionDispatcherHost::SetManagerForTests( - SpeechRecognitionManager* manager) { - manager_for_tests_ = manager; -} SpeechRecognitionDispatcherHost::SpeechRecognitionDispatcherHost( int render_process_id, - net::URLRequestContextGetter* context_getter, - SpeechRecognitionPreferences* recognition_preferences) + net::URLRequestContextGetter* context_getter) : render_process_id_(render_process_id), - context_getter_(context_getter), - recognition_preferences_(recognition_preferences) { + context_getter_(context_getter) { // Do not add any non-trivial initialization here, instead do it lazily when - // required (e.g. see the method |manager()|) or add an Init() method. + // required (e.g. see the method |SpeechRecognitionManager::GetInstance()|) or + // add an Init() method. } SpeechRecognitionDispatcherHost::~SpeechRecognitionDispatcherHost() { - if (SpeechRecognitionManager* sr_manager = manager()) - sr_manager->AbortAllSessionsForListener(this); -} - -SpeechRecognitionManager* SpeechRecognitionDispatcherHost::manager() { - if (manager_for_tests_) - return manager_for_tests_; - - return SpeechRecognitionManager::GetInstance(); + SpeechRecognitionManager::GetInstance()->AbortAllSessionsForListener(this); } bool SpeechRecognitionDispatcherHost::OnMessageReceived( @@ -61,9 +46,31 @@ bool SpeechRecognitionDispatcherHost::OnMessageReceived( return handled; } +void SpeechRecognitionDispatcherHost::OverrideThreadForMessage( + const IPC::Message& message, + BrowserThread::ID* thread) { + if (message.type() == SpeechRecognitionHostMsg_StartRequest::ID) + *thread = BrowserThread::UI; +} + void SpeechRecognitionDispatcherHost::OnStartRequest( const SpeechRecognitionHostMsg_StartRequest_Params& params) { - + bool filter_profanities = + SpeechRecognitionManagerImpl::GetInstance() && + SpeechRecognitionManagerImpl::GetInstance()->delegate() && + SpeechRecognitionManagerImpl::GetInstance()->delegate()-> + FilterProfanities(render_process_id_); + + BrowserThread::PostTask( + BrowserThread::IO, + FROM_HERE, + base::Bind(&SpeechRecognitionDispatcherHost::OnStartRequestOnIO, + this, params, filter_profanities)); +} + +void SpeechRecognitionDispatcherHost::OnStartRequestOnIO( + const SpeechRecognitionHostMsg_StartRequest_Params& params, + bool filter_profanities) { SpeechRecognitionSessionContext context; context.context_name = params.origin_url; context.render_process_id = render_process_id_; @@ -79,84 +86,81 @@ void SpeechRecognitionDispatcherHost::OnStartRequest( config.origin_url = params.origin_url; config.initial_context = context; config.url_request_context_getter = context_getter_.get(); - if (recognition_preferences_.get()) { - config.filter_profanities = recognition_preferences_->FilterProfanities(); - } else { - config.filter_profanities = false; - } + config.filter_profanities = filter_profanities; config.continuous = params.continuous; config.interim_results = params.interim_results; config.event_listener = this; - int session_id = manager()->CreateSession(config); + int session_id = SpeechRecognitionManager::GetInstance()->CreateSession( + config); DCHECK_NE(session_id, SpeechRecognitionManager::kSessionIDInvalid); - manager()->StartSession(session_id); + SpeechRecognitionManager::GetInstance()->StartSession(session_id); } void SpeechRecognitionDispatcherHost::OnAbortRequest(int render_view_id, int request_id) { - int session_id = manager()->GetSession(render_process_id_, - render_view_id, - request_id); + int session_id = SpeechRecognitionManager::GetInstance()->GetSession( + render_process_id_, render_view_id, request_id); // The renderer might provide an invalid |request_id| if the session was not // started as expected, e.g., due to unsatisfied security requirements. if (session_id != SpeechRecognitionManager::kSessionIDInvalid) - manager()->AbortSession(session_id); + SpeechRecognitionManager::GetInstance()->AbortSession(session_id); } void SpeechRecognitionDispatcherHost::OnStopCaptureRequest( int render_view_id, int request_id) { - int session_id = manager()->GetSession(render_process_id_, - render_view_id, - request_id); + int session_id = SpeechRecognitionManager::GetInstance()->GetSession( + render_process_id_, render_view_id, request_id); // The renderer might provide an invalid |request_id| if the session was not // started as expected, e.g., due to unsatisfied security requirements. - if (session_id != SpeechRecognitionManager::kSessionIDInvalid) - manager()->StopAudioCaptureForSession(session_id); + if (session_id != SpeechRecognitionManager::kSessionIDInvalid) { + SpeechRecognitionManager::GetInstance()->StopAudioCaptureForSession( + session_id); + } } // -------- SpeechRecognitionEventListener interface implementation ----------- void SpeechRecognitionDispatcherHost::OnRecognitionStart(int session_id) { const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); Send(new SpeechRecognitionMsg_Started(context.render_view_id, context.request_id)); } void SpeechRecognitionDispatcherHost::OnAudioStart(int session_id) { const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); Send(new SpeechRecognitionMsg_AudioStarted(context.render_view_id, context.request_id)); } void SpeechRecognitionDispatcherHost::OnSoundStart(int session_id) { const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); Send(new SpeechRecognitionMsg_SoundStarted(context.render_view_id, context.request_id)); } void SpeechRecognitionDispatcherHost::OnSoundEnd(int session_id) { const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); Send(new SpeechRecognitionMsg_SoundEnded(context.render_view_id, context.request_id)); } void SpeechRecognitionDispatcherHost::OnAudioEnd(int session_id) { const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); Send(new SpeechRecognitionMsg_AudioEnded(context.render_view_id, context.request_id)); } void SpeechRecognitionDispatcherHost::OnRecognitionEnd(int session_id) { const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); Send(new SpeechRecognitionMsg_Ended(context.render_view_id, context.request_id)); } @@ -165,7 +169,7 @@ void SpeechRecognitionDispatcherHost::OnRecognitionResults( int session_id, const SpeechRecognitionResults& results) { const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); Send(new SpeechRecognitionMsg_ResultRetrieved(context.render_view_id, context.request_id, results)); @@ -175,7 +179,7 @@ void SpeechRecognitionDispatcherHost::OnRecognitionError( int session_id, const SpeechRecognitionError& error) { const SpeechRecognitionSessionContext& context = - manager()->GetSessionContext(session_id); + SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); Send(new SpeechRecognitionMsg_ErrorOccurred(context.render_view_id, context.request_id, error)); diff --git a/content/browser/speech/speech_recognition_dispatcher_host.h b/content/browser/speech/speech_recognition_dispatcher_host.h index dea822d..1bc12a1 100644 --- a/content/browser/speech/speech_recognition_dispatcher_host.h +++ b/content/browser/speech/speech_recognition_dispatcher_host.h @@ -16,7 +16,6 @@ struct SpeechRecognitionHostMsg_StartRequest_Params; namespace content { class SpeechRecognitionManager; -class SpeechRecognitionPreferences; struct SpeechRecognitionResult; // SpeechRecognitionDispatcherHost is a delegate for Speech API messages used by @@ -29,8 +28,7 @@ class CONTENT_EXPORT SpeechRecognitionDispatcherHost public: SpeechRecognitionDispatcherHost( int render_process_id, - net::URLRequestContextGetter* context_getter, - SpeechRecognitionPreferences* recognition_preferences); + net::URLRequestContextGetter* context_getter); // SpeechRecognitionEventListener methods. virtual void OnRecognitionStart(int session_id) OVERRIDE; @@ -53,26 +51,23 @@ class CONTENT_EXPORT SpeechRecognitionDispatcherHost // BrowserMessageFilter implementation. virtual bool OnMessageReceived(const IPC::Message& message, bool* message_was_ok) OVERRIDE; - - // Singleton manager setter useful for tests. - static void SetManagerForTests(SpeechRecognitionManager* manager); + virtual void OverrideThreadForMessage( + const IPC::Message& message, + BrowserThread::ID* thread) OVERRIDE; private: virtual ~SpeechRecognitionDispatcherHost(); void OnStartRequest( const SpeechRecognitionHostMsg_StartRequest_Params& params); + void OnStartRequestOnIO( + const SpeechRecognitionHostMsg_StartRequest_Params& params, + bool filter_profanities); void OnAbortRequest(int render_view_id, int request_id); void OnStopCaptureRequest(int render_view_id, int request_id); - // Returns the speech recognition manager to forward requests to. - SpeechRecognitionManager* manager(); - int render_process_id_; scoped_refptr<net::URLRequestContextGetter> context_getter_; - scoped_refptr<SpeechRecognitionPreferences> recognition_preferences_; - - static SpeechRecognitionManager* manager_for_tests_; DISALLOW_COPY_AND_ASSIGN(SpeechRecognitionDispatcherHost); }; diff --git a/content/browser/speech/speech_recognition_manager_impl.h b/content/browser/speech/speech_recognition_manager_impl.h index bf86ac1..0432570 100644 --- a/content/browser/speech/speech_recognition_manager_impl.h +++ b/content/browser/speech/speech_recognition_manager_impl.h @@ -93,6 +93,8 @@ class CONTENT_EXPORT SpeechRecognitionManagerImpl : virtual void OnAudioLevelsChange(int session_id, float volume, float noise_volume) OVERRIDE; + SpeechRecognitionManagerDelegate* delegate() const { return delegate_.get(); } + protected: // BrowserMainLoop is the only one allowed to istantiate and free us. friend class BrowserMainLoop; |