Commit d240d8dd authored by Tim Volodine's avatar Tim Volodine Committed by Commit Bot

[Android WebView] Implement missing code for Speech Recognition API

Provide the necessary bits in order to make WebSpeech API
work in Android WebView. In particular the Android WebView
specific speech recognition delegate and related code is
added in this CL.

BUG=487255
TEST=https://www.google.com/intl/en/chrome/demos/speech.html

TBR=dmazzoni@chromium.org

Change-Id: I9ed3f03d86955e16df2e026ccdf3a0f155231a9a
Reviewed-on: https://chromium-review.googlesource.com/c/1181573
Commit-Queue: Tim Volodine <timvolodine@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#606127}
parent 1be2ac8d
...@@ -551,6 +551,8 @@ source_set("common") { ...@@ -551,6 +551,8 @@ source_set("common") {
"browser/aw_safe_browsing_whitelist_manager.h", "browser/aw_safe_browsing_whitelist_manager.h",
"browser/aw_settings.cc", "browser/aw_settings.cc",
"browser/aw_settings.h", "browser/aw_settings.h",
"browser/aw_speech_recognition_manager_delegate.cc",
"browser/aw_speech_recognition_manager_delegate.h",
"browser/aw_ssl_host_state_delegate.cc", "browser/aw_ssl_host_state_delegate.cc",
"browser/aw_ssl_host_state_delegate.h", "browser/aw_ssl_host_state_delegate.h",
"browser/aw_url_checker_delegate_impl.cc", "browser/aw_url_checker_delegate_impl.cc",
......
...@@ -69,5 +69,7 @@ include_rules = [ ...@@ -69,5 +69,7 @@ include_rules = [
# Interface required for in-process input event handling. # Interface required for in-process input event handling.
"+third_party/blink/public/web/WebCompositorInputHandler.h", "+third_party/blink/public/web/WebCompositorInputHandler.h",
# For find-in-page # For find-in-page
"+third_party/blink/public/mojom/frame" "+third_party/blink/public/mojom/frame",
# Required for the Web Speech API.
"+third_party/blink/public/mojom/speech"
] ]
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "android_webview/browser/aw_proxying_url_loader_factory.h" #include "android_webview/browser/aw_proxying_url_loader_factory.h"
#include "android_webview/browser/aw_quota_permission_context.h" #include "android_webview/browser/aw_quota_permission_context.h"
#include "android_webview/browser/aw_settings.h" #include "android_webview/browser/aw_settings.h"
#include "android_webview/browser/aw_speech_recognition_manager_delegate.h"
#include "android_webview/browser/aw_url_checker_delegate_impl.h" #include "android_webview/browser/aw_url_checker_delegate_impl.h"
#include "android_webview/browser/aw_web_contents_view_delegate.h" #include "android_webview/browser/aw_web_contents_view_delegate.h"
#include "android_webview/browser/net/aw_url_request_context_getter.h" #include "android_webview/browser/net/aw_url_request_context_getter.h"
...@@ -839,6 +840,11 @@ bool AwContentBrowserClient::WillCreateURLLoaderFactory( ...@@ -839,6 +840,11 @@ bool AwContentBrowserClient::WillCreateURLLoaderFactory(
return true; return true;
} }
content::SpeechRecognitionManagerDelegate*
AwContentBrowserClient::CreateSpeechRecognitionManagerDelegate() {
return new AwSpeechRecognitionManagerDelegate();
}
// static // static
void AwContentBrowserClient::DisableCreatingTaskScheduler() { void AwContentBrowserClient::DisableCreatingTaskScheduler() {
g_should_create_task_scheduler = false; g_should_create_task_scheduler = false;
......
...@@ -216,6 +216,9 @@ class AwContentBrowserClient : public content::ContentBrowserClient { ...@@ -216,6 +216,9 @@ class AwContentBrowserClient : public content::ContentBrowserClient {
return aw_feature_list_creator_; return aw_feature_list_creator_;
} }
content::SpeechRecognitionManagerDelegate*
CreateSpeechRecognitionManagerDelegate() override;
static void DisableCreatingTaskScheduler(); static void DisableCreatingTaskScheduler();
private: private:
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "android_webview/browser/aw_speech_recognition_manager_delegate.h"
#include <string>
#include "base/bind.h"
#include "base/macros.h"
#include "base/task/post_task.h"
#include "base/threading/thread_restrictions.h"
#include "build/build_config.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/speech_recognition_manager.h"
#include "content/public/browser/speech_recognition_session_context.h"
#include "content/public/browser/web_contents.h"
#include "third_party/blink/public/mojom/speech/speech_recognition_error.mojom.h"
#include "third_party/blink/public/mojom/speech/speech_recognition_result.mojom.h"
using content::BrowserThread;
namespace android_webview {
AwSpeechRecognitionManagerDelegate::AwSpeechRecognitionManagerDelegate() {}
AwSpeechRecognitionManagerDelegate::~AwSpeechRecognitionManagerDelegate() {}
void AwSpeechRecognitionManagerDelegate::OnRecognitionStart(int session_id) {}
void AwSpeechRecognitionManagerDelegate::OnAudioStart(int session_id) {}
void AwSpeechRecognitionManagerDelegate::OnEnvironmentEstimationComplete(
int session_id) {}
void AwSpeechRecognitionManagerDelegate::OnSoundStart(int session_id) {}
void AwSpeechRecognitionManagerDelegate::OnSoundEnd(int session_id) {}
void AwSpeechRecognitionManagerDelegate::OnAudioEnd(int session_id) {}
void AwSpeechRecognitionManagerDelegate::OnRecognitionResults(
int session_id,
const std::vector<blink::mojom::SpeechRecognitionResultPtr>& result) {}
void AwSpeechRecognitionManagerDelegate::OnRecognitionError(
int session_id,
const blink::mojom::SpeechRecognitionError& error) {}
void AwSpeechRecognitionManagerDelegate::OnAudioLevelsChange(
int session_id,
float volume,
float noise_volume) {}
void AwSpeechRecognitionManagerDelegate::OnRecognitionEnd(int session_id) {}
void AwSpeechRecognitionManagerDelegate::CheckRecognitionIsAllowed(
int session_id,
base::OnceCallback<void(bool ask_user, bool is_allowed)> callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
const content::SpeechRecognitionSessionContext& context =
content::SpeechRecognitionManager::GetInstance()->GetSessionContext(
session_id);
// Make sure that initiators (extensions/web pages) properly set the
// |render_process_id| field, which is needed later to retrieve the profile.
DCHECK_NE(context.render_process_id, 0);
int render_process_id = context.render_process_id;
int render_frame_id = context.render_frame_id;
if (context.embedder_render_process_id) {
// If this is a request originated from a guest, we need to re-route the
// permission check through the embedder (app).
render_process_id = context.embedder_render_process_id;
render_frame_id = context.embedder_render_frame_id;
}
// Check that the render frame type is appropriate, and whether or not we
// need to request permission from the user.
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(&CheckRenderFrameType, std::move(callback),
render_process_id, render_frame_id));
}
content::SpeechRecognitionEventListener*
AwSpeechRecognitionManagerDelegate::GetEventListener() {
return this;
}
bool AwSpeechRecognitionManagerDelegate::FilterProfanities(
int render_process_id) {
// TODO: to confirm whether this setting is relevant for android,
// https://crbug.com/876801.
return false;
}
// static.
void AwSpeechRecognitionManagerDelegate::CheckRenderFrameType(
base::OnceCallback<void(bool ask_user, bool is_allowed)> callback,
int render_process_id,
int render_frame_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
// Regular tab contents.
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::IO},
base::BindOnce(std::move(callback), true /* check_permission */,
true /* allowed */));
}
} // namespace android_webview
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ANDROID_WEBVIEW_BROWSER_AW_SPEECH_RECOGNITION_MANAGER_DELEGATE_H_
#define ANDROID_WEBVIEW_BROWSER_AW_SPEECH_RECOGNITION_MANAGER_DELEGATE_H_
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "content/public/browser/speech_recognition_event_listener.h"
#include "content/public/browser/speech_recognition_manager_delegate.h"
#include "content/public/browser/speech_recognition_session_config.h"
namespace android_webview {
// Android WebView implementation of the SpeechRecognitionManagerDelgate
// interface.
class AwSpeechRecognitionManagerDelegate
: public content::SpeechRecognitionManagerDelegate,
public content::SpeechRecognitionEventListener {
public:
AwSpeechRecognitionManagerDelegate();
~AwSpeechRecognitionManagerDelegate() override;
protected:
// SpeechRecognitionEventListener methods.
void OnRecognitionStart(int session_id) override;
void OnAudioStart(int session_id) override;
void OnEnvironmentEstimationComplete(int session_id) override;
void OnSoundStart(int session_id) override;
void OnSoundEnd(int session_id) override;
void OnAudioEnd(int session_id) override;
void OnRecognitionEnd(int session_id) override;
void OnRecognitionResults(
int session_id,
const std::vector<blink::mojom::SpeechRecognitionResultPtr>& result)
override;
void OnRecognitionError(
int session_id,
const blink::mojom::SpeechRecognitionError& error) override;
void OnAudioLevelsChange(int session_id,
float volume,
float noise_volume) override;
// SpeechRecognitionManagerDelegate methods.
void CheckRecognitionIsAllowed(
int session_id,
base::OnceCallback<void(bool ask_user, bool is_allowed)> callback)
override;
content::SpeechRecognitionEventListener* GetEventListener() override;
bool FilterProfanities(int render_process_id) override;
private:
// Checks for VIEW_TYPE_TAB_CONTENTS host in the UI thread and notifies back
// the result in the IO thread through |callback|.
static void CheckRenderFrameType(
base::OnceCallback<void(bool ask_user, bool is_allowed)> callback,
int render_process_id,
int render_frame_id);
DISALLOW_COPY_AND_ASSIGN(AwSpeechRecognitionManagerDelegate);
};
} // namespace android_webview
#endif // ANDROID_WEBVIEW_BROWSER_AW_SPEECH_RECOGNITION_MANAGER_DELEGATE_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment