| 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 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 void ChromeSpeechRecognitionManagerDelegate::CheckRenderViewType( | 377 void ChromeSpeechRecognitionManagerDelegate::CheckRenderViewType( |
| 378 base::Callback<void(bool ask_user, bool is_allowed)> callback, | 378 base::Callback<void(bool ask_user, bool is_allowed)> callback, |
| 379 int render_process_id, | 379 int render_process_id, |
| 380 int render_view_id, | 380 int render_view_id, |
| 381 bool js_api) { | 381 bool js_api) { |
| 382 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 382 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 383 const content::RenderViewHost* render_view_host = | 383 const content::RenderViewHost* render_view_host = |
| 384 content::RenderViewHost::FromID(render_process_id, render_view_id); | 384 content::RenderViewHost::FromID(render_process_id, render_view_id); |
| 385 | 385 |
| 386 bool allowed = false; | 386 bool allowed = false; |
| 387 bool ask_permission = false; | 387 bool check_permission = false; |
| 388 | 388 |
| 389 if (!render_view_host) { | 389 if (!render_view_host) { |
| 390 if (!js_api) { | 390 if (!js_api) { |
| 391 // If there is no render view, we cannot show the speech bubble, so this | 391 // If there is no render view, we cannot show the speech bubble, so this |
| 392 // is not allowed. | 392 // is not allowed. |
| 393 allowed = false; | 393 allowed = false; |
| 394 ask_permission = false; | 394 check_permission = false; |
| 395 } else { | 395 } else { |
| 396 // This happens for extensions. Manifest should be checked for permission. | 396 // This happens for extensions. Manifest should be checked for permission. |
| 397 allowed = true; | 397 allowed = true; |
| 398 ask_permission = false; | 398 check_permission = false; |
| 399 } | 399 } |
| 400 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 400 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 401 base::Bind(callback, ask_permission, allowed)); | 401 base::Bind(callback, check_permission, allowed)); |
| 402 return; | 402 return; |
| 403 } | 403 } |
| 404 | 404 |
| 405 WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host); | 405 WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host); |
| 406 extensions::ViewType view_type = extensions::GetViewType(web_contents); | 406 extensions::ViewType view_type = extensions::GetViewType(web_contents); |
| 407 | 407 |
| 408 // TODO(kalman): Also enable speech bubble for extension popups | 408 // TODO(kalman): Also enable speech bubble for extension popups |
| 409 // (VIEW_TYPE_EXTENSION_POPUP) once popup-like control UI works properly in | 409 // (VIEW_TYPE_EXTENSION_POPUP) once popup-like control UI works properly in |
| 410 // extensions: http://crbug.com/163851. | 410 // extensions: http://crbug.com/163851. |
| 411 // Right now the extension popup closes and dismisses immediately on user | 411 // Right now the extension popup closes and dismisses immediately on user |
| 412 // click. | 412 // click. |
| 413 if (view_type == extensions::VIEW_TYPE_TAB_CONTENTS || | 413 if (view_type == extensions::VIEW_TYPE_TAB_CONTENTS || |
| 414 view_type == extensions::VIEW_TYPE_APP_SHELL || | 414 view_type == extensions::VIEW_TYPE_APP_SHELL || |
| 415 view_type == extensions::VIEW_TYPE_VIRTUAL_KEYBOARD) { | 415 view_type == extensions::VIEW_TYPE_VIRTUAL_KEYBOARD || |
| 416 // If it is a tab, we can show the speech input bubble or ask for | 416 // Only allow requests through JavaScript API (|js_api| = true). |
| 417 // Requests originating from html element (|js_api| = false) would want |
| 418 // to show bubble which isn't quite intuitive from a background page. Also |
| 419 // see todo above about issues with rendering such bubbles from extension |
| 420 // popups. |
| 421 (view_type == extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE && |
| 422 js_api)) { |
| 423 // If it is a tab, we can show the speech input bubble or check for |
| 424 // permission. For apps, this means manifest would be checked for |
| 417 // permission. | 425 // permission. |
| 418 | 426 |
| 419 allowed = true; | 427 allowed = true; |
| 420 if (js_api) | 428 if (js_api) |
| 421 ask_permission = true; | 429 check_permission = true; |
| 422 } | 430 } |
| 423 | 431 |
| 424 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 432 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 425 base::Bind(callback, ask_permission, allowed)); | 433 base::Bind(callback, check_permission, allowed)); |
| 426 } | 434 } |
| 427 | 435 |
| 428 } // namespace speech | 436 } // namespace speech |
| OLD | NEW |