| OLD | NEW |
| 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 <set> | 7 #include <set> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 render_process_id = context.embedder_render_process_id; | 366 render_process_id = context.embedder_render_process_id; |
| 367 render_view_id = context.embedder_render_view_id; | 367 render_view_id = context.embedder_render_view_id; |
| 368 } | 368 } |
| 369 | 369 |
| 370 // Check that the render view type is appropriate, and whether or not we | 370 // Check that the render view type is appropriate, and whether or not we |
| 371 // need to request permission from the user. | 371 // need to request permission from the user. |
| 372 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 372 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 373 base::Bind(&CheckRenderViewType, | 373 base::Bind(&CheckRenderViewType, |
| 374 callback, | 374 callback, |
| 375 render_process_id, | 375 render_process_id, |
| 376 render_view_id, | 376 render_view_id)); |
| 377 !context.requested_by_page_element)); | |
| 378 } | 377 } |
| 379 | 378 |
| 380 content::SpeechRecognitionEventListener* | 379 content::SpeechRecognitionEventListener* |
| 381 ChromeSpeechRecognitionManagerDelegate::GetEventListener() { | 380 ChromeSpeechRecognitionManagerDelegate::GetEventListener() { |
| 382 return this; | 381 return this; |
| 383 } | 382 } |
| 384 | 383 |
| 385 bool ChromeSpeechRecognitionManagerDelegate::FilterProfanities( | 384 bool ChromeSpeechRecognitionManagerDelegate::FilterProfanities( |
| 386 int render_process_id) { | 385 int render_process_id) { |
| 387 content::RenderProcessHost* rph = | 386 content::RenderProcessHost* rph = |
| 388 content::RenderProcessHost::FromID(render_process_id); | 387 content::RenderProcessHost::FromID(render_process_id); |
| 389 if (!rph) // Guard against race conditions on RPH lifetime. | 388 if (!rph) // Guard against race conditions on RPH lifetime. |
| 390 return true; | 389 return true; |
| 391 | 390 |
| 392 return Profile::FromBrowserContext(rph->GetBrowserContext())->GetPrefs()-> | 391 return Profile::FromBrowserContext(rph->GetBrowserContext())->GetPrefs()-> |
| 393 GetBoolean(prefs::kSpeechRecognitionFilterProfanities); | 392 GetBoolean(prefs::kSpeechRecognitionFilterProfanities); |
| 394 } | 393 } |
| 395 | 394 |
| 396 // static. | 395 // static. |
| 397 void ChromeSpeechRecognitionManagerDelegate::CheckRenderViewType( | 396 void ChromeSpeechRecognitionManagerDelegate::CheckRenderViewType( |
| 398 base::Callback<void(bool ask_user, bool is_allowed)> callback, | 397 base::Callback<void(bool ask_user, bool is_allowed)> callback, |
| 399 int render_process_id, | 398 int render_process_id, |
| 400 int render_view_id, | 399 int render_view_id) { |
| 401 bool js_api) { | |
| 402 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 400 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 403 const content::RenderViewHost* render_view_host = | 401 const content::RenderViewHost* render_view_host = |
| 404 content::RenderViewHost::FromID(render_process_id, render_view_id); | 402 content::RenderViewHost::FromID(render_process_id, render_view_id); |
| 405 | 403 |
| 406 bool allowed = false; | 404 bool allowed = false; |
| 407 bool check_permission = false; | 405 bool check_permission = false; |
| 408 | 406 |
| 409 if (!render_view_host) { | 407 if (!render_view_host) { |
| 410 if (!js_api) { | 408 // This happens for extensions. Manifest should be checked for permission. |
| 411 // If there is no render view, we cannot show the speech bubble, so this | 409 allowed = true; |
| 412 // is not allowed. | 410 check_permission = false; |
| 413 allowed = false; | |
| 414 check_permission = false; | |
| 415 } else { | |
| 416 // This happens for extensions. Manifest should be checked for permission. | |
| 417 allowed = true; | |
| 418 check_permission = false; | |
| 419 } | |
| 420 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 411 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 421 base::Bind(callback, check_permission, allowed)); | 412 base::Bind(callback, check_permission, allowed)); |
| 422 return; | 413 return; |
| 423 } | 414 } |
| 424 | 415 |
| 425 WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host); | 416 WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host); |
| 426 | 417 |
| 427 // chrome://app-list/ uses speech recognition. | 418 // chrome://app-list/ uses speech recognition. |
| 428 if (web_contents->GetCommittedWebUI() && | 419 if (web_contents->GetCommittedWebUI() && |
| 429 web_contents->GetLastCommittedURL().spec() == | 420 web_contents->GetLastCommittedURL().spec() == |
| 430 chrome::kChromeUIAppListStartPageURL) { | 421 chrome::kChromeUIAppListStartPageURL) { |
| 431 allowed = true; | 422 allowed = true; |
| 432 check_permission = false; | 423 check_permission = false; |
| 433 } | 424 } |
| 434 | 425 |
| 435 extensions::ViewType view_type = extensions::GetViewType(web_contents); | 426 extensions::ViewType view_type = extensions::GetViewType(web_contents); |
| 436 | 427 |
| 437 // TODO(kalman): Also enable speech bubble for extension popups | |
| 438 // (VIEW_TYPE_EXTENSION_POPUP) once popup-like control UI works properly in | |
| 439 // extensions: http://crbug.com/163851. | |
| 440 // Right now the extension popup closes and dismisses immediately on user | |
| 441 // click. | |
| 442 if (view_type == extensions::VIEW_TYPE_TAB_CONTENTS || | 428 if (view_type == extensions::VIEW_TYPE_TAB_CONTENTS || |
| 443 view_type == extensions::VIEW_TYPE_APP_WINDOW || | 429 view_type == extensions::VIEW_TYPE_APP_WINDOW || |
| 444 view_type == extensions::VIEW_TYPE_VIRTUAL_KEYBOARD || | 430 view_type == extensions::VIEW_TYPE_VIRTUAL_KEYBOARD || |
| 445 // Only allow requests through JavaScript API (|js_api| = true). | 431 view_type == extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { |
| 446 // Requests originating from html element (|js_api| = false) would want | 432 // If it is a tab, we can check for permission. For apps, this means |
| 447 // to show bubble which isn't quite intuitive from a background page. Also | 433 // manifest would be checked for permission. |
| 448 // see todo above about issues with rendering such bubbles from extension | |
| 449 // popups. | |
| 450 (view_type == extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE && | |
| 451 js_api)) { | |
| 452 // If it is a tab, we can show the speech input bubble or check for | |
| 453 // permission. For apps, this means manifest would be checked for | |
| 454 // permission. | |
| 455 | |
| 456 allowed = true; | 434 allowed = true; |
| 457 if (js_api) | 435 check_permission = true; |
| 458 check_permission = true; | |
| 459 } | 436 } |
| 460 | 437 |
| 461 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 438 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 462 base::Bind(callback, check_permission, allowed)); | 439 base::Bind(callback, check_permission, allowed)); |
| 463 } | 440 } |
| 464 | 441 |
| 465 } // namespace speech | 442 } // namespace speech |
| OLD | NEW |