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

Side by Side Diff: chrome/browser/speech/chrome_speech_recognition_manager_delegate.cc

Issue 10377082: SpeechInputExtensionManager now interface with SpeechRecognitionManagerDelegate (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Hans review + fixes. Created 8 years, 7 months 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 | Annotate | Revision Log
OLDNEW
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 "chrome/browser/speech/chrome_speech_recognition_manager_delegate.h" 5 #include "chrome/browser/speech/chrome_speech_recognition_manager_delegate.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/synchronization/lock.h" 10 #include "base/synchronization/lock.h"
11 #include "base/threading/thread_restrictions.h" 11 #include "base/threading/thread_restrictions.h"
12 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
13 #include "chrome/browser/browser_process.h" 13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/prefs/pref_service.h" 14 #include "chrome/browser/prefs/pref_service.h"
15 #include "chrome/browser/profiles/profile_manager.h" 15 #include "chrome/browser/profiles/profile_manager.h"
16 #include "chrome/browser/speech/speech_recognition_tray_icon_controller.h"
16 #include "chrome/browser/tab_contents/tab_util.h" 17 #include "chrome/browser/tab_contents/tab_util.h"
17 #include "chrome/common/chrome_view_type.h" 18 #include "chrome/common/chrome_view_type.h"
18 #include "chrome/common/pref_names.h" 19 #include "chrome/common/pref_names.h"
19 #include "content/public/browser/browser_thread.h" 20 #include "content/public/browser/browser_thread.h"
20 #include "content/public/browser/render_view_host.h" 21 #include "content/public/browser/render_view_host.h"
21 #include "content/public/browser/render_view_host_delegate.h" 22 #include "content/public/browser/render_view_host_delegate.h"
22 #include "content/public/browser/resource_context.h" 23 #include "content/public/browser/resource_context.h"
23 #include "content/public/browser/speech_recognition_manager.h" 24 #include "content/public/browser/speech_recognition_manager.h"
24 #include "content/public/browser/speech_recognition_session_config.h" 25 #include "content/public/browser/speech_recognition_session_config.h"
25 #include "content/public/browser/speech_recognition_session_context.h" 26 #include "content/public/browser/speech_recognition_session_context.h"
26 #include "content/public/common/speech_recognition_error.h" 27 #include "content/public/common/speech_recognition_error.h"
27 #include "content/public/common/speech_recognition_result.h" 28 #include "content/public/common/speech_recognition_result.h"
28 #include "grit/generated_resources.h" 29 #include "grit/generated_resources.h"
29 #include "net/url_request/url_request_context_getter.h" 30 #include "net/url_request/url_request_context_getter.h"
30 #include "ui/base/l10n/l10n_util.h" 31 #include "ui/base/l10n/l10n_util.h"
31 32
32 #if defined(OS_WIN) 33 #if defined(OS_WIN)
33 #include "chrome/installer/util/wmi.h" 34 #include "chrome/installer/util/wmi.h"
34 #endif 35 #endif
35 36
36 using content::BrowserThread; 37 using content::BrowserThread;
37 using content::SpeechRecognitionManager; 38 using content::SpeechRecognitionManager;
39 using content::SpeechRecognitionSessionContext;
38 40
39 namespace { 41 namespace {
40 const int kNoActiveBubble = 42 const int kNoActiveBubble =
41 content::SpeechRecognitionManager::kSessionIDInvalid; 43 content::SpeechRecognitionManager::kSessionIDInvalid;
44
45 bool RequiresBubble(int session_id) {
46 return SpeechRecognitionManager::GetInstance()->
47 GetSessionContext(session_id).use_bubble_on_element;
48 }
49
50 bool RequiresTrayIcon(int session_id) {
51 return !RequiresBubble(session_id);
52 }
42 } // namespace 53 } // namespace
43 54
44 namespace speech { 55 namespace speech {
45 56
46 // Asynchronously fetches the PC and audio hardware/driver info if 57 // Asynchronously fetches the PC and audio hardware/driver info if
47 // the user has opted into UMA. This information is sent with speech input 58 // the user has opted into UMA. This information is sent with speech input
48 // requests to the server for identifying and improving quality issues with 59 // requests to the server for identifying and improving quality issues with
49 // specific device configurations. 60 // specific device configurations.
50 class ChromeSpeechRecognitionManagerDelegate::OptionalRequestInfo 61 class ChromeSpeechRecognitionManagerDelegate::OptionalRequestInfo
51 : public base::RefCountedThreadSafe<OptionalRequestInfo> { 62 : public base::RefCountedThreadSafe<OptionalRequestInfo> {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 ~OptionalRequestInfo() {} 111 ~OptionalRequestInfo() {}
101 112
102 base::Lock lock_; 113 base::Lock lock_;
103 std::string value_; 114 std::string value_;
104 bool can_report_metrics_; 115 bool can_report_metrics_;
105 116
106 DISALLOW_COPY_AND_ASSIGN(OptionalRequestInfo); 117 DISALLOW_COPY_AND_ASSIGN(OptionalRequestInfo);
107 }; 118 };
108 119
109 ChromeSpeechRecognitionManagerDelegate::ChromeSpeechRecognitionManagerDelegate() 120 ChromeSpeechRecognitionManagerDelegate::ChromeSpeechRecognitionManagerDelegate()
110 : bubble_controller_(new SpeechRecognitionBubbleController( 121 : active_bubble_session_id_(kNoActiveBubble) {
111 ALLOW_THIS_IN_INITIALIZER_LIST(this))),
112 active_bubble_session_id_(kNoActiveBubble) {
113 } 122 }
114 123
115 ChromeSpeechRecognitionManagerDelegate:: 124 ChromeSpeechRecognitionManagerDelegate::
116 ~ChromeSpeechRecognitionManagerDelegate() { 125 ~ChromeSpeechRecognitionManagerDelegate() {
126 if (tray_icon_controller_.get())
127 tray_icon_controller_->Hide();
128 if (active_bubble_session_id_ != kNoActiveBubble) {
129 DCHECK(bubble_controller_.get());
130 bubble_controller_->CloseBubble(active_bubble_session_id_);
131 }
117 } 132 }
118 133
119 void ChromeSpeechRecognitionManagerDelegate::InfoBubbleButtonClicked( 134 void ChromeSpeechRecognitionManagerDelegate::InfoBubbleButtonClicked(
120 int session_id, SpeechRecognitionBubble::Button button) { 135 int session_id, SpeechRecognitionBubble::Button button) {
121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 136 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
122 DCHECK_EQ(active_bubble_session_id_, session_id); 137 DCHECK_EQ(active_bubble_session_id_, session_id);
123 138
139 // Note, the session might have been destroyed, therefore avoid calls to the
140 // manager which imply its existance (e.g., GetSessionContext()).
141
124 if (button == SpeechRecognitionBubble::BUTTON_CANCEL) { 142 if (button == SpeechRecognitionBubble::BUTTON_CANCEL) {
125 bubble_controller_->CloseBubble(session_id); 143 BubbleController()->CloseBubble(session_id);
126 last_session_config_.reset(); 144 last_session_config_.reset();
127 active_bubble_session_id_ = kNoActiveBubble; 145 active_bubble_session_id_ = kNoActiveBubble;
128 146
129 // We can safely call AbortSession even if the session has already ended, 147 // We can safely call AbortSession even if the session has already ended,
130 // the manager's public methods are reliable and will handle it properly. 148 // the manager's public methods are reliable and will handle it properly.
131 SpeechRecognitionManager::GetInstance()->AbortSession(session_id); 149 SpeechRecognitionManager::GetInstance()->AbortSession(session_id);
132 } else if (button == SpeechRecognitionBubble::BUTTON_TRY_AGAIN) { 150 } else if (button == SpeechRecognitionBubble::BUTTON_TRY_AGAIN) {
133 bubble_controller_->CloseBubble(session_id); 151 BubbleController()->CloseBubble(session_id);
134 active_bubble_session_id_ = kNoActiveBubble; 152 active_bubble_session_id_ = kNoActiveBubble;
135 RestartLastSession(); 153 RestartLastSession();
136 } 154 }
137 } 155 }
138 156
139 void ChromeSpeechRecognitionManagerDelegate::InfoBubbleFocusChanged( 157 void ChromeSpeechRecognitionManagerDelegate::InfoBubbleFocusChanged(
140 int session_id) { 158 int session_id) {
141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 159 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
142 DCHECK_EQ(active_bubble_session_id_, session_id); 160 DCHECK_EQ(active_bubble_session_id_, session_id);
143 161
144 bubble_controller_->CloseBubble(session_id); 162 // Note, the session might have been destroyed (see InfoBubbleButtonClicked).
Satish 2012/05/20 21:40:26 Yes the session might have been destroyed, so what
Primiano Tucci (use gerrit) 2012/05/21 16:03:13 Done.
163
164 BubbleController()->CloseBubble(session_id);
145 last_session_config_.reset(); 165 last_session_config_.reset();
146 active_bubble_session_id_ = kNoActiveBubble; 166 active_bubble_session_id_ = kNoActiveBubble;
147 167
148 // If the user clicks outside the bubble while capturing audio we abort the 168 // If the user clicks outside the bubble while capturing audio we abort the
149 // session. Otherwise, i.e. audio capture is ended and we are just waiting for 169 // session. Otherwise, i.e. audio capture is ended and we are just waiting for
150 // results, this activity is carried silently in background. 170 // results, this activity is carried silently in background.
151 if (SpeechRecognitionManager::GetInstance()->IsCapturingAudio()) 171 if (SpeechRecognitionManager::GetInstance()->IsCapturingAudio())
152 SpeechRecognitionManager::GetInstance()->AbortSession(session_id); 172 SpeechRecognitionManager::GetInstance()->AbortSession(session_id);
153 } 173 }
154 174
155 void ChromeSpeechRecognitionManagerDelegate::RestartLastSession() { 175 void ChromeSpeechRecognitionManagerDelegate::RestartLastSession() {
156 DCHECK(last_session_config_.get()); 176 DCHECK(last_session_config_.get());
157 SpeechRecognitionManager* manager = SpeechRecognitionManager::GetInstance(); 177 SpeechRecognitionManager* manager = SpeechRecognitionManager::GetInstance();
158 const int new_session_id = manager->CreateSession(*last_session_config_); 178 const int new_session_id = manager->CreateSession(*last_session_config_);
159 DCHECK_NE(new_session_id, kNoActiveBubble); 179 DCHECK_NE(new_session_id, kNoActiveBubble);
160 last_session_config_.reset(); 180 last_session_config_.reset();
161 manager->StartSession(new_session_id); 181 manager->StartSession(new_session_id);
162 } 182 }
163 183
164 void ChromeSpeechRecognitionManagerDelegate::OnRecognitionStart( 184 void ChromeSpeechRecognitionManagerDelegate::OnRecognitionStart(
165 int session_id) { 185 int session_id) {
166 // Copy the configuration of the session (for the "try again" button). 186 SpeechRecognitionManager* manager = SpeechRecognitionManager::GetInstance();
167 last_session_config_.reset(new content::SpeechRecognitionSessionConfig( 187 const content::SpeechRecognitionSessionContext& context =
168 SpeechRecognitionManager::GetInstance()->GetSessionConfig(session_id))); 188 manager->GetSessionContext(session_id);
169 189
170 // Create and show the bubble. 190 if (RequiresBubble(session_id)) {
171 DCHECK_EQ(active_bubble_session_id_, kNoActiveBubble); 191 // Copy the configuration of the session (for the "try again" button).
172 active_bubble_session_id_ = session_id; 192 last_session_config_.reset(new content::SpeechRecognitionSessionConfig(
173 const content::SpeechRecognitionSessionContext& context = 193 manager->GetSessionConfig(session_id)));
174 SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); 194
175 bubble_controller_->CreateBubble(session_id, 195 // Create and show the bubble.
176 context.render_process_id, 196 DCHECK_EQ(active_bubble_session_id_, kNoActiveBubble);
177 context.render_view_id, 197 active_bubble_session_id_ = session_id;
178 context.element_rect); 198 BubbleController()->CreateBubble(session_id,
179 // TODO(primiano) Why not create directly the bubble in warmup mode? 199 context.render_process_id,
180 bubble_controller_->SetBubbleWarmUpMode(session_id); 200 context.render_view_id,
201 context.element_rect);
202
203 // TODO(primiano) Why not creating directly the bubble in warmup mode?
204 BubbleController()->SetBubbleWarmUpMode(session_id);
205 } else if (RequiresTrayIcon(session_id)) {
206 TrayIconController()->Show(context.context_name,
207 context.show_security_balloon);
208 }
181 } 209 }
182 210
183 void ChromeSpeechRecognitionManagerDelegate::OnAudioStart(int session_id) { 211 void ChromeSpeechRecognitionManagerDelegate::OnAudioStart(int session_id) {
184 bubble_controller_->SetBubbleRecordingMode(session_id); 212 if (RequiresBubble(session_id))
213 BubbleController()->SetBubbleRecordingMode(session_id);
185 } 214 }
186 215
187 void ChromeSpeechRecognitionManagerDelegate::OnEnvironmentEstimationComplete( 216 void ChromeSpeechRecognitionManagerDelegate::OnEnvironmentEstimationComplete(
188 int session_id) { 217 int session_id) {
189 } 218 }
190 219
191 void ChromeSpeechRecognitionManagerDelegate::OnSoundStart(int session_id) { 220 void ChromeSpeechRecognitionManagerDelegate::OnSoundStart(int session_id) {
192 } 221 }
193 222
194 void ChromeSpeechRecognitionManagerDelegate::OnSoundEnd(int session_id) { 223 void ChromeSpeechRecognitionManagerDelegate::OnSoundEnd(int session_id) {
195 } 224 }
196 225
197 void ChromeSpeechRecognitionManagerDelegate::OnAudioEnd(int session_id) { 226 void ChromeSpeechRecognitionManagerDelegate::OnAudioEnd(int session_id) {
198 // OnAudioEnd can be also raised after an abort, when the bubble has already 227 // OnAudioEnd can be also raised after an abort, when the bubble has already
199 // been closed. 228 // been closed.
200 if (active_bubble_session_id_ == session_id) 229 if (RequiresBubble(session_id) && active_bubble_session_id_ == session_id)
201 bubble_controller_->SetBubbleRecognizingMode(session_id); 230 BubbleController()->SetBubbleRecognizingMode(session_id);
202 } 231 }
203 232
204 void ChromeSpeechRecognitionManagerDelegate::OnRecognitionResult( 233 void ChromeSpeechRecognitionManagerDelegate::OnRecognitionResult(
205 int session_id, const content::SpeechRecognitionResult& result) { 234 int session_id, const content::SpeechRecognitionResult& result) {
206 // A result can be dispatched when the bubble is not visible anymore (e.g., 235 // A result can be dispatched when the bubble is not visible anymore (e.g.,
207 // lost focus while waiting for a result, thus continuing in background). 236 // lost focus while waiting for a result, thus continuing in background).
208 if (active_bubble_session_id_ == session_id) { 237 if (RequiresBubble(session_id) && active_bubble_session_id_ == session_id) {
209 bubble_controller_->CloseBubble(session_id); 238 BubbleController()->CloseBubble(session_id);
210 last_session_config_.reset(); 239 last_session_config_.reset();
211 active_bubble_session_id_ = kNoActiveBubble; 240 active_bubble_session_id_ = kNoActiveBubble;
212 } 241 }
213 } 242 }
214 243
215 void ChromeSpeechRecognitionManagerDelegate::OnRecognitionError( 244 void ChromeSpeechRecognitionManagerDelegate::OnRecognitionError(
216 int session_id, const content::SpeechRecognitionError& error) { 245 int session_id, const content::SpeechRecognitionError& error) {
217 // An error can be dispatched when the bubble is not visible anymore. 246 // An error can be dispatched when the bubble is not visible anymore.
218 if (active_bubble_session_id_ != session_id) 247 if (active_bubble_session_id_ != session_id)
219 return; 248 return;
249 DCHECK(RequiresBubble(session_id));
220 250
221 int error_message_id = 0; 251 int error_message_id = 0;
222 switch (error.code) { 252 switch (error.code) {
223 case content::SPEECH_RECOGNITION_ERROR_AUDIO: 253 case content::SPEECH_RECOGNITION_ERROR_AUDIO:
224 switch (error.details) { 254 switch (error.details) {
225 case content::SPEECH_AUDIO_ERROR_DETAILS_NO_MIC: 255 case content::SPEECH_AUDIO_ERROR_DETAILS_NO_MIC:
226 error_message_id = IDS_SPEECH_INPUT_NO_MIC; 256 error_message_id = IDS_SPEECH_INPUT_NO_MIC;
227 break; 257 break;
228 case content::SPEECH_AUDIO_ERROR_DETAILS_IN_USE: 258 case content::SPEECH_AUDIO_ERROR_DETAILS_IN_USE:
229 error_message_id = IDS_SPEECH_INPUT_MIC_IN_USE; 259 error_message_id = IDS_SPEECH_INPUT_MIC_IN_USE;
(...skipping 12 matching lines...) Expand all
242 case content::SPEECH_RECOGNITION_ERROR_NO_MATCH: 272 case content::SPEECH_RECOGNITION_ERROR_NO_MATCH:
243 error_message_id = IDS_SPEECH_INPUT_NO_RESULTS; 273 error_message_id = IDS_SPEECH_INPUT_NO_RESULTS;
244 break; 274 break;
245 case content::SPEECH_RECOGNITION_ERROR_NETWORK: 275 case content::SPEECH_RECOGNITION_ERROR_NETWORK:
246 error_message_id = IDS_SPEECH_INPUT_NET_ERROR; 276 error_message_id = IDS_SPEECH_INPUT_NET_ERROR;
247 break; 277 break;
248 default: 278 default:
249 NOTREACHED() << "unknown error " << error.code; 279 NOTREACHED() << "unknown error " << error.code;
250 return; 280 return;
251 } 281 }
252 bubble_controller_->SetBubbleMessage( 282 BubbleController()->SetBubbleMessage(
253 session_id, l10n_util::GetStringUTF16(error_message_id)); 283 session_id, l10n_util::GetStringUTF16(error_message_id));
254 } 284 }
255 285
256 void ChromeSpeechRecognitionManagerDelegate::OnAudioLevelsChange( 286 void ChromeSpeechRecognitionManagerDelegate::OnAudioLevelsChange(
257 int session_id, float volume, float noise_volume) { 287 int session_id, float volume, float noise_volume) {
258 if (active_bubble_session_id_ == session_id) 288 if (active_bubble_session_id_ == session_id) {
259 bubble_controller_->SetBubbleInputVolume(session_id, volume, noise_volume); 289 DCHECK(RequiresBubble(session_id));
290 BubbleController()->SetBubbleInputVolume(session_id, volume, noise_volume);
291 } else if (RequiresTrayIcon(session_id)) {
292 TrayIconController()->SetVUMeterVolume(volume);
293 }
260 } 294 }
261 295
262 void ChromeSpeechRecognitionManagerDelegate::OnRecognitionEnd(int session_id) { 296 void ChromeSpeechRecognitionManagerDelegate::OnRecognitionEnd(int session_id) {
297 if (RequiresTrayIcon(session_id))
Satish 2012/05/20 21:40:26 are there race conditions where one session with t
Primiano Tucci (use gerrit) 2012/05/21 16:03:13 Yes, it was wrong. Now the tray icon is shown only
298 TrayIconController()->Hide();
299 // No need to remove the bubble here, since:
Satish 2012/05/20 21:40:26 it isn't clear that the following are actually eit
Primiano Tucci (use gerrit) 2012/05/21 16:03:13 Done.
300 // - A previous OnRecognitionResult event already closed the bubble.
301 // - An error occurred, so the bubble is showing the error and will be closed
302 // when it will lose focus (by InfoBubbleFocusChanged()).
303 // - The bubble lost focus or the user pressed the Cancel button, thus it has
304 // been closed by InfoBubbleFocusChanged(), which triggered an AbortSession.
263 } 305 }
264 306
265 void ChromeSpeechRecognitionManagerDelegate::GetDiagnosticInformation( 307 void ChromeSpeechRecognitionManagerDelegate::GetDiagnosticInformation(
266 bool* can_report_metrics, 308 bool* can_report_metrics,
267 std::string* hardware_info) { 309 std::string* hardware_info) {
268 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 310 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
269 if (!optional_request_info_.get()) { 311 if (!optional_request_info_.get()) {
270 optional_request_info_ = new OptionalRequestInfo(); 312 optional_request_info_ = new OptionalRequestInfo();
271 // Since hardware info is optional with speech input requests, we start an 313 // Since hardware info is optional with speech input requests, we start an
272 // asynchronous fetch here and move on with recording audio. This first 314 // asynchronous fetch here and move on with recording audio. This first
273 // speech input request would send an empty string for hardware info and 315 // speech input request would send an empty string for hardware info and
274 // subsequent requests may have the hardware info available if the fetch 316 // subsequent requests may have the hardware info available if the fetch
275 // completed before them. This way we don't end up stalling the user with 317 // completed before them. This way we don't end up stalling the user with
276 // a long wait and disk seeks when they click on a UI element and start 318 // a long wait and disk seeks when they click on a UI element and start
277 // speaking. 319 // speaking.
278 optional_request_info_->Refresh(); 320 optional_request_info_->Refresh();
279 } 321 }
280 *can_report_metrics = optional_request_info_->can_report_metrics(); 322 *can_report_metrics = optional_request_info_->can_report_metrics();
281 *hardware_info = optional_request_info_->value(); 323 *hardware_info = optional_request_info_->value();
282 } 324 }
283 325
284 void ChromeSpeechRecognitionManagerDelegate::CheckRecognitionIsAllowed( 326 void ChromeSpeechRecognitionManagerDelegate::CheckRecognitionIsAllowed(
285 int session_id, 327 int session_id,
286 base::Callback<void(int session_id, bool is_allowed)> callback) { 328 base::Callback<void(int session_id, bool is_allowed)> callback) {
287 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 329 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
330
331 // We don't need any particular check for sessions not using a bubble. In such
332 // cases, we just notify it to the manager (calling-back synchronously, since
333 // we remain in the IO thread).
334 if (RequiresTrayIcon(session_id)) {
335 callback.Run(session_id, true /* is_allowed */);
336 return;
337 }
338
339 // Sessions using bubbles, conversely, need a check on the renderer view type.
340 // The check must be performed in the UI thread. We defer it posting to
341 // CheckRenderViewType, which will issue the callback on our behalf.
288 const content::SpeechRecognitionSessionContext& context = 342 const content::SpeechRecognitionSessionContext& context =
289 SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id); 343 SpeechRecognitionManager::GetInstance()->GetSessionContext(session_id);
290
291 // The check must be performed in the UI thread. We defer it posting to
292 // CheckRenderViewType, which will issue the callback on our behalf.
293 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 344 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
294 base::Bind(&CheckRenderViewType, 345 base::Bind(&CheckRenderViewType,
295 session_id, 346 session_id,
296 callback, 347 callback,
297 context.render_process_id, 348 context.render_process_id,
298 context.render_view_id)); 349 context.render_view_id));
299 } 350 }
300 351
301 content::SpeechRecognitionEventListener* 352 content::SpeechRecognitionEventListener*
302 ChromeSpeechRecognitionManagerDelegate::GetEventListener() { 353 ChromeSpeechRecognitionManagerDelegate::GetEventListener() {
(...skipping 17 matching lines...) Expand all
320 // speech input extension API should be used instead. 371 // speech input extension API should be used instead.
321 372
322 const bool allowed = (render_view_host != NULL && 373 const bool allowed = (render_view_host != NULL &&
323 render_view_host->GetDelegate() != NULL && 374 render_view_host->GetDelegate() != NULL &&
324 render_view_host->GetDelegate()->GetRenderViewType() == 375 render_view_host->GetDelegate()->GetRenderViewType() ==
325 chrome::VIEW_TYPE_TAB_CONTENTS); 376 chrome::VIEW_TYPE_TAB_CONTENTS);
326 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 377 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
327 base::Bind(callback, session_id, allowed)); 378 base::Bind(callback, session_id, allowed));
328 } 379 }
329 380
381 SpeechRecognitionBubbleController*
382 ChromeSpeechRecognitionManagerDelegate::BubbleController() {
383 if (!bubble_controller_.get())
384 bubble_controller_ = new SpeechRecognitionBubbleController(this);
385 return bubble_controller_.get();
386 }
387
388 SpeechRecognitionTrayIconController*
389 ChromeSpeechRecognitionManagerDelegate::TrayIconController() {
390 if (!tray_icon_controller_.get())
391 tray_icon_controller_ = new SpeechRecognitionTrayIconController();
392 return tray_icon_controller_.get();
393 }
394
395
330 } // namespace speech 396 } // namespace speech
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698