Commit 0e893e92 authored by amistry's avatar amistry Committed by Commit bot

Eliminate the launcher speech recognizer's dependency on the start page WebContents.

This affects the speech recognition with V2 hotwording enabled.

Review URL: https://codereview.chromium.org/797493002

Cr-Commit-Position: refs/heads/master@{#308304}
parent 3d8aa088
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include "content/public/browser/speech_recognition_event_listener.h" #include "content/public/browser/speech_recognition_event_listener.h"
#include "content/public/browser/speech_recognition_manager.h" #include "content/public/browser/speech_recognition_manager.h"
#include "content/public/browser/speech_recognition_session_config.h" #include "content/public/browser/speech_recognition_session_config.h"
#include "content/public/browser/web_contents.h" #include "content/public/common/child_process_host.h"
#include "content/public/common/speech_recognition_error.h" #include "content/public/common/speech_recognition_error.h"
#include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_context_getter.h"
#include "ui/app_list/speech_ui_model_observer.h" #include "ui/app_list/speech_ui_model_observer.h"
...@@ -43,8 +43,7 @@ class SpeechRecognizer::EventListener ...@@ -43,8 +43,7 @@ class SpeechRecognizer::EventListener
net::URLRequestContextGetter* url_request_context_getter, net::URLRequestContextGetter* url_request_context_getter,
const std::string& locale); const std::string& locale);
void StartOnIOThread(int render_process_id, void StartOnIOThread(const std::string& auth_scope,
const std::string& auth_scope,
const std::string& auth_token); const std::string& auth_token);
void StopOnIOThread(); void StopOnIOThread();
...@@ -107,7 +106,6 @@ SpeechRecognizer::EventListener::~EventListener() { ...@@ -107,7 +106,6 @@ SpeechRecognizer::EventListener::~EventListener() {
} }
void SpeechRecognizer::EventListener::StartOnIOThread( void SpeechRecognizer::EventListener::StartOnIOThread(
int render_process_id,
const std::string& auth_scope, const std::string& auth_scope,
const std::string& auth_token) { const std::string& auth_token) {
DCHECK_CURRENTLY_ON(content::BrowserThread::IO); DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
...@@ -123,7 +121,10 @@ void SpeechRecognizer::EventListener::StartOnIOThread( ...@@ -123,7 +121,10 @@ void SpeechRecognizer::EventListener::StartOnIOThread(
config.filter_profanities = true; config.filter_profanities = true;
config.url_request_context_getter = url_request_context_getter_; config.url_request_context_getter = url_request_context_getter_;
config.event_listener = weak_factory_.GetWeakPtr(); config.event_listener = weak_factory_.GetWeakPtr();
config.initial_context.render_process_id = render_process_id; // kInvalidUniqueID is not a valid render process, so the speech permission
// check allows the request through.
config.initial_context.render_process_id =
content::ChildProcessHost::kInvalidUniqueID;
config.auth_scope = auth_scope; config.auth_scope = auth_scope;
config.auth_token = auth_token; config.auth_token = auth_token;
...@@ -269,15 +270,6 @@ SpeechRecognizer::~SpeechRecognizer() { ...@@ -269,15 +270,6 @@ SpeechRecognizer::~SpeechRecognizer() {
void SpeechRecognizer::Start() { void SpeechRecognizer::Start() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
// The speech recognizer checks to see if the request is allowed by looking
// up the renderer process. A renderer containing the app-list is hard-coded
// to be allowed.
if (!delegate_)
return;
content::WebContents* contents = delegate_->GetSpeechContents();
if (!contents)
return;
std::string auth_scope; std::string auth_scope;
std::string auth_token; std::string auth_token;
delegate_->GetSpeechAuthParameters(&auth_scope, &auth_token); delegate_->GetSpeechAuthParameters(&auth_scope, &auth_token);
...@@ -287,7 +279,6 @@ void SpeechRecognizer::Start() { ...@@ -287,7 +279,6 @@ void SpeechRecognizer::Start() {
FROM_HERE, FROM_HERE,
base::Bind(&SpeechRecognizer::EventListener::StartOnIOThread, base::Bind(&SpeechRecognizer::EventListener::StartOnIOThread,
speech_event_listener_, speech_event_listener_,
contents->GetRenderProcessHost()->GetID(),
auth_scope, auth_scope,
auth_token)); auth_token));
} }
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/test/fake_speech_recognition_manager.h" #include "content/public/test/fake_speech_recognition_manager.h"
#include "content/public/test/web_contents_tester.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -36,7 +35,6 @@ class MockSpeechRecognizerDelegate : public SpeechRecognizerDelegate { ...@@ -36,7 +35,6 @@ class MockSpeechRecognizerDelegate : public SpeechRecognizerDelegate {
MOCK_METHOD2(OnSpeechResult, void(const base::string16&, bool)); MOCK_METHOD2(OnSpeechResult, void(const base::string16&, bool));
MOCK_METHOD1(OnSpeechSoundLevelChanged, void(int16_t)); MOCK_METHOD1(OnSpeechSoundLevelChanged, void(int16_t));
MOCK_METHOD1(OnSpeechRecognitionStateChanged, void(SpeechRecognitionState)); MOCK_METHOD1(OnSpeechRecognitionStateChanged, void(SpeechRecognitionState));
MOCK_METHOD0(GetSpeechContents, content::WebContents*());
MOCK_METHOD2(GetSpeechAuthParameters, void(std::string*, std::string*)); MOCK_METHOD2(GetSpeechAuthParameters, void(std::string*, std::string*));
private: private:
...@@ -56,14 +54,9 @@ class AppListSpeechRecognizerBrowserTest : public InProcessBrowserTest { ...@@ -56,14 +54,9 @@ class AppListSpeechRecognizerBrowserTest : public InProcessBrowserTest {
content::SpeechRecognitionManager::SetManagerForTesting( content::SpeechRecognitionManager::SetManagerForTesting(
fake_speech_recognition_manager_.get()); fake_speech_recognition_manager_.get());
mock_speech_delegate_.reset(new MockSpeechRecognizerDelegate()); mock_speech_delegate_.reset(new MockSpeechRecognizerDelegate());
test_contents_.reset(content::WebContentsTester::CreateTestWebContents(
browser()->profile(), NULL));
} }
void TearDownOnMainThread() override { void TearDownOnMainThread() override {
// This puts stuff on the IO loop which needs to be executed.
test_contents_.reset();
// Poor-person's way of ensuring IO loop is idle. // Poor-person's way of ensuring IO loop is idle.
auto io_loop = content::BrowserThread::UnsafeGetMessageLoopForThread( auto io_loop = content::BrowserThread::UnsafeGetMessageLoopForThread(
content::BrowserThread::IO); content::BrowserThread::IO);
...@@ -80,7 +73,6 @@ class AppListSpeechRecognizerBrowserTest : public InProcessBrowserTest { ...@@ -80,7 +73,6 @@ class AppListSpeechRecognizerBrowserTest : public InProcessBrowserTest {
scoped_ptr<content::FakeSpeechRecognitionManager> scoped_ptr<content::FakeSpeechRecognitionManager>
fake_speech_recognition_manager_; fake_speech_recognition_manager_;
scoped_ptr<MockSpeechRecognizerDelegate> mock_speech_delegate_; scoped_ptr<MockSpeechRecognizerDelegate> mock_speech_delegate_;
scoped_ptr<content::WebContents> test_contents_;
private: private:
DISALLOW_COPY_AND_ASSIGN(AppListSpeechRecognizerBrowserTest); DISALLOW_COPY_AND_ASSIGN(AppListSpeechRecognizerBrowserTest);
...@@ -92,8 +84,6 @@ IN_PROC_BROWSER_TEST_F(AppListSpeechRecognizerBrowserTest, RecognizeSpeech) { ...@@ -92,8 +84,6 @@ IN_PROC_BROWSER_TEST_F(AppListSpeechRecognizerBrowserTest, RecognizeSpeech) {
"en"); "en");
base::RunLoop run_loop; base::RunLoop run_loop;
EXPECT_CALL(*mock_speech_delegate_, GetSpeechContents())
.WillOnce(Return(test_contents_.get()));
EXPECT_CALL(*mock_speech_delegate_, EXPECT_CALL(*mock_speech_delegate_,
OnSpeechResult(base::ASCIIToUTF16("Pictures of the moon"), true)); OnSpeechResult(base::ASCIIToUTF16("Pictures of the moon"), true));
EXPECT_CALL(*mock_speech_delegate_, EXPECT_CALL(*mock_speech_delegate_,
......
...@@ -33,11 +33,6 @@ class SpeechRecognizerDelegate { ...@@ -33,11 +33,6 @@ class SpeechRecognizerDelegate {
virtual void OnSpeechRecognitionStateChanged( virtual void OnSpeechRecognitionStateChanged(
SpeechRecognitionState new_state) = 0; SpeechRecognitionState new_state) = 0;
// Return a WebContents that is whitelisted to use the speech recognizer.
// TODO(amistry): This is an implementation detail that shouldn't be
// necessary. Somehow, eliminate this dependency.
virtual content::WebContents* GetSpeechContents() = 0;
// Get the OAuth2 scope and token to pass to the speech recognizer. Does not // Get the OAuth2 scope and token to pass to the speech recognizer. Does not
// modify the arguments if no auth token is available or allowed. // modify the arguments if no auth token is available or allowed.
virtual void GetSpeechAuthParameters(std::string* auth_scope, virtual void GetSpeechAuthParameters(std::string* auth_scope,
......
...@@ -224,16 +224,11 @@ void StartPageService::AppListHidden() { ...@@ -224,16 +224,11 @@ void StartPageService::AppListHidden() {
void StartPageService::ToggleSpeechRecognition() { void StartPageService::ToggleSpeechRecognition() {
DCHECK(contents_); DCHECK(contents_);
speech_button_toggled_manually_ = true; speech_button_toggled_manually_ = true;
if (!contents_->GetWebUI())
return;
if (!webui_finished_loading_) {
pending_webui_callbacks_.push_back(
base::Bind(&StartPageService::ToggleSpeechRecognition,
base::Unretained(this)));
return;
}
// Speech recognition under V2 hotwording does not depend in any way on the
// start page web contents. Do this code path first to make this explicit and
// easier to identify what code needs to be deleted when V2 hotwording is
// stable.
if (HotwordService::IsExperimentalHotwordingEnabled()) { if (HotwordService::IsExperimentalHotwordingEnabled()) {
if (!speech_recognizer_) { if (!speech_recognizer_) {
std::string profile_locale; std::string profile_locale;
...@@ -254,6 +249,16 @@ void StartPageService::ToggleSpeechRecognition() { ...@@ -254,6 +249,16 @@ void StartPageService::ToggleSpeechRecognition() {
return; return;
} }
if (!contents_->GetWebUI())
return;
if (!webui_finished_loading_) {
pending_webui_callbacks_.push_back(
base::Bind(&StartPageService::ToggleSpeechRecognition,
base::Unretained(this)));
return;
}
contents_->GetWebUI()->CallJavascriptFunction( contents_->GetWebUI()->CallJavascriptFunction(
"appList.startPage.toggleSpeechRecognition"); "appList.startPage.toggleSpeechRecognition");
} }
...@@ -342,10 +347,6 @@ void StartPageService::OnSpeechRecognitionStateChanged( ...@@ -342,10 +347,6 @@ void StartPageService::OnSpeechRecognitionStateChanged(
OnSpeechRecognitionStateChanged(new_state)); OnSpeechRecognitionStateChanged(new_state));
} }
content::WebContents* StartPageService::GetSpeechContents() {
return GetSpeechRecognitionContents();
}
void StartPageService::GetSpeechAuthParameters(std::string* auth_scope, void StartPageService::GetSpeechAuthParameters(std::string* auth_scope,
std::string* auth_token) { std::string* auth_token) {
if (HotwordService::IsExperimentalHotwordingEnabled()) { if (HotwordService::IsExperimentalHotwordingEnabled()) {
......
...@@ -72,7 +72,6 @@ class StartPageService : public KeyedService, ...@@ -72,7 +72,6 @@ class StartPageService : public KeyedService,
void OnSpeechSoundLevelChanged(int16_t level) override; void OnSpeechSoundLevelChanged(int16_t level) override;
void OnSpeechRecognitionStateChanged( void OnSpeechRecognitionStateChanged(
SpeechRecognitionState new_state) override; SpeechRecognitionState new_state) override;
content::WebContents* GetSpeechContents() override;
void GetSpeechAuthParameters(std::string* auth_scope, void GetSpeechAuthParameters(std::string* auth_scope,
std::string* auth_token) override; std::string* auth_token) override;
......
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