Commit 4fe3a6a4 authored by David Tseng's avatar David Tseng Committed by Commit Bot

Ensure AccessibilityManager::ChromeVoxDeferredLoader's warmup utterance targets Googletts

This fixes an issue where on user accounts with other tts extensions installed, we always get back a reply by waiting for Googletts voices, and targeting Googletts with our warmup utterance.
Without this change, it's possible chromeVoxDeferredLoader waits forever if the engine never sends an event.

TBR=dmazzoni@chromium.org

Test: all flows including login, guest, regular sessions. In each case, with ChromeVox previously loaded, and without ChromeVox previously loaded (i.e. automatically started on session start).
Change-Id: I7abe9556bbd00a432a969f38343e0e8c1f24e94b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2156065Reviewed-by: default avatarDavid Tseng <dtseng@chromium.org>
Commit-Queue: David Tseng <dtseng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#760363}
parent e8ab8653
...@@ -205,15 +205,13 @@ class ChromeVoxDeferredLoader : public content::UtteranceEventDelegate, ...@@ -205,15 +205,13 @@ class ChromeVoxDeferredLoader : public content::UtteranceEventDelegate,
public: public:
explicit ChromeVoxDeferredLoader(AccessibilityManager* manager) explicit ChromeVoxDeferredLoader(AccessibilityManager* manager)
: manager_(manager) { : manager_(manager) {
Profile* profile = manager_->profile(); timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(500), this,
if (profile->HasOffTheRecordProfile()) &ChromeVoxDeferredLoader::OnTimer);
profile = profile->GetOffTheRecordProfile();
std::vector<content::VoiceData> voices; if (IsGoogleTtsVoiceAvailable())
content::TtsController::GetInstance()->GetVoices(profile, &voices);
if (voices.empty())
content::TtsController::GetInstance()->AddVoicesChangedDelegate(this);
else
SendWarmupUtterance(); SendWarmupUtterance();
else
content::TtsController::GetInstance()->AddVoicesChangedDelegate(this);
} }
~ChromeVoxDeferredLoader() override { ~ChromeVoxDeferredLoader() override {
...@@ -236,12 +234,7 @@ class ChromeVoxDeferredLoader : public content::UtteranceEventDelegate, ...@@ -236,12 +234,7 @@ class ChromeVoxDeferredLoader : public content::UtteranceEventDelegate,
// content::VoicesChangedDelegate: // content::VoicesChangedDelegate:
void OnVoicesChanged() override { void OnVoicesChanged() override {
Profile* profile = manager_->profile(); if (IsGoogleTtsVoiceAvailable()) {
if (profile->HasOffTheRecordProfile())
profile = profile->GetOffTheRecordProfile();
std::vector<content::VoiceData> voices;
content::TtsController::GetInstance()->GetVoices(profile, &voices);
if (!voices.empty()) {
content::TtsController::GetInstance()->RemoveVoicesChangedDelegate(this); content::TtsController::GetInstance()->RemoveVoicesChangedDelegate(this);
SendWarmupUtterance(); SendWarmupUtterance();
} }
...@@ -254,13 +247,26 @@ class ChromeVoxDeferredLoader : public content::UtteranceEventDelegate, ...@@ -254,13 +247,26 @@ class ChromeVoxDeferredLoader : public content::UtteranceEventDelegate,
std::unique_ptr<content::TtsUtterance> utterance = std::unique_ptr<content::TtsUtterance> utterance =
content::TtsUtterance::Create(profile); content::TtsUtterance::Create(profile);
utterance->SetEventDelegate(this); utterance->SetEventDelegate(this);
utterance->SetEngineId(extension_misc::kGoogleSpeechSynthesisExtensionId);
content::TtsController::GetInstance()->SpeakOrEnqueue(std::move(utterance)); content::TtsController::GetInstance()->SpeakOrEnqueue(std::move(utterance));
timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(500), this,
&ChromeVoxDeferredLoader::OnTimer);
} }
void OnTimer() { manager_->PlaySpokenFeedbackToggleCountdown(tick_count_++); } void OnTimer() { manager_->PlaySpokenFeedbackToggleCountdown(tick_count_++); }
bool IsGoogleTtsVoiceAvailable() {
Profile* profile = manager_->profile();
if (profile->HasOffTheRecordProfile())
profile = profile->GetOffTheRecordProfile();
std::vector<content::VoiceData> voices;
content::TtsController::GetInstance()->GetVoices(profile, &voices);
for (size_t i = 0; i < voices.size(); i++) {
if (voices[i].engine_id ==
extension_misc::kGoogleSpeechSynthesisExtensionId)
return true;
}
return false;
}
AccessibilityManager* manager_; AccessibilityManager* manager_;
int tick_count_ = 0; int tick_count_ = 0;
base::RepeatingTimer timer_; base::RepeatingTimer timer_;
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "base/strings/pattern.h" #include "base/strings/pattern.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "chrome/common/extensions/extension_constants.h"
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/tts_controller.h" #include "content/public/browser/tts_controller.h"
...@@ -58,6 +59,7 @@ void SpeechMonitor::GetVoices(std::vector<content::VoiceData>* out_voices) { ...@@ -58,6 +59,7 @@ void SpeechMonitor::GetVoices(std::vector<content::VoiceData>* out_voices) {
content::VoiceData& voice = out_voices->back(); content::VoiceData& voice = out_voices->back();
voice.native = true; voice.native = true;
voice.name = "SpeechMonitor"; voice.name = "SpeechMonitor";
voice.engine_id = extension_misc::kGoogleSpeechSynthesisExtensionId;
voice.events.insert(content::TTS_EVENT_END); voice.events.insert(content::TTS_EVENT_END);
} }
......
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