Index: content/browser/speech/speech_input_manager.cc |
diff --git a/content/browser/speech/speech_input_manager.cc b/content/browser/speech/speech_input_manager.cc |
index b597c2290905a1247b49a4acedc28c5e80aa27bb..97fb0aafd845b6c2a80f384a46bb0947b7722896 100644 |
--- a/content/browser/speech/speech_input_manager.cc |
+++ b/content/browser/speech/speech_input_manager.cc |
@@ -5,14 +5,52 @@ |
#include "content/browser/speech/speech_input_manager.h" |
#include "base/bind.h" |
+#include "content/browser/renderer_host/render_view_host.h" |
+#include "content/browser/renderer_host/render_view_host_delegate.h" |
#include "content/browser/speech/speech_input_preferences.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/common/view_types.h" |
#include "media/audio/audio_manager.h" |
using content::BrowserThread; |
namespace speech_input { |
+struct SpeechInputManager::SpeechInputParams { |
+ SpeechInputParams(Delegate* delegate, |
+ int caller_id, |
+ int render_process_id, |
+ int render_view_id, |
+ const gfx::Rect& element_rect, |
+ const std::string& language, |
+ const std::string& grammar, |
+ const std::string& origin_url, |
+ net::URLRequestContextGetter* context_getter, |
+ SpeechInputPreferences* speech_input_prefs) |
+ : delegate(delegate), |
+ caller_id(caller_id), |
+ render_process_id(render_process_id), |
+ render_view_id(render_view_id), |
+ element_rect(element_rect), |
+ language(language), |
+ grammar(grammar), |
+ origin_url(origin_url), |
+ context_getter(context_getter), |
+ speech_input_prefs(speech_input_prefs) { |
+ } |
+ |
+ Delegate* delegate; |
+ int caller_id; |
+ int render_process_id; |
+ int render_view_id; |
+ gfx::Rect element_rect; |
+ std::string language; |
+ std::string grammar; |
+ std::string origin_url; |
+ net::URLRequestContextGetter* context_getter; |
+ SpeechInputPreferences* speech_input_prefs; |
+}; |
+ |
SpeechInputManager::SpeechInputManager() |
: can_report_metrics_(false), |
recording_caller_id_(0) { |
@@ -58,21 +96,55 @@ void SpeechInputManager::StartRecognition( |
const std::string& origin_url, |
net::URLRequestContextGetter* context_getter, |
SpeechInputPreferences* speech_input_prefs) { |
- DCHECK(!HasPendingRequest(caller_id)); |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&SpeechInputManager::CheckForExtensionPopup, |
+ base::Unretained(this), SpeechInputParams(delegate, caller_id, |
+ render_process_id, render_view_id, element_rect, language, grammar, |
+ origin_url, context_getter, speech_input_prefs))); |
+} |
+ |
+void SpeechInputManager::CheckForExtensionPopup( |
Satish
2011/11/15 13:03:53
can we rename this to CheckRenderViewTypeAndStartR
Leandro Graciá Gil
2011/11/16 00:42:01
Done.
|
+ const SpeechInputParams& params) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ RenderViewHost* render_view_host = RenderViewHost::FromID( |
+ params.render_process_id, params.render_view_id); |
+ if (!render_view_host || !render_view_host->delegate()) |
+ return; |
+ |
+ // For privacy reasons, prevent from start recording if the speech input |
Satish
2011/11/15 13:03:53
this comment is vague, suggest describing in detai
Leandro Graciá Gil
2011/11/16 00:42:01
Done.
|
+ // bubble won't be able to show. It will fail for any delegate type other |
+ // than TabContents, like extension popups. |
+ if (render_view_host->delegate()->GetRenderViewType() == |
+ content::VIEW_TYPE_TAB_CONTENTS) { |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, FROM_HERE, |
+ base::Bind(&SpeechInputManager::ProceedStartingRecognition, |
+ base::Unretained(this), params)); |
+ } |
+} |
+ |
+void SpeechInputManager::ProceedStartingRecognition( |
+ const SpeechInputParams& params) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ DCHECK(!HasPendingRequest(params.caller_id)); |
ShowRecognitionRequested( |
- caller_id, render_process_id, render_view_id, element_rect); |
+ params.caller_id, params.render_process_id, params.render_view_id, |
+ params.element_rect); |
GetRequestInfo(&can_report_metrics_, &request_info_); |
- SpeechInputRequest* request = &requests_[caller_id]; |
- request->delegate = delegate; |
+ SpeechInputRequest* request = &requests_[params.caller_id]; |
+ request->delegate = params.delegate; |
request->recognizer = new SpeechRecognizer( |
- this, caller_id, language, grammar, context_getter, |
- speech_input_prefs->filter_profanities(), |
- request_info_, can_report_metrics_ ? origin_url : ""); |
+ this, params.caller_id, params.language, params.grammar, |
+ params.context_getter, params.speech_input_prefs->filter_profanities(), |
+ request_info_, can_report_metrics_ ? params.origin_url : ""); |
request->is_active = false; |
- StartRecognitionForRequest(caller_id); |
+ StartRecognitionForRequest(params.caller_id); |
} |
void SpeechInputManager::StartRecognitionForRequest(int caller_id) { |
@@ -119,7 +191,10 @@ void SpeechInputManager::CancelAllRequestsWithDelegate( |
} |
void SpeechInputManager::StopRecording(int caller_id) { |
- DCHECK(HasPendingRequest(caller_id)); |
+ // No pending requests on extension popups. |
+ if (!HasPendingRequest(caller_id)) |
+ return; |
+ |
requests_[caller_id].recognizer->StopRecording(); |
} |