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,
public:
explicit ChromeVoxDeferredLoader(AccessibilityManager* manager)
: manager_(manager) {
Profile* profile = manager_->profile();
if (profile->HasOffTheRecordProfile())
profile = profile->GetOffTheRecordProfile();
std::vector<content::VoiceData> voices;
content::TtsController::GetInstance()->GetVoices(profile, &voices);
if (voices.empty())
content::TtsController::GetInstance()->AddVoicesChangedDelegate(this);
else
timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(500), this,
&ChromeVoxDeferredLoader::OnTimer);
if (IsGoogleTtsVoiceAvailable())
SendWarmupUtterance();
else
content::TtsController::GetInstance()->AddVoicesChangedDelegate(this);
}
~ChromeVoxDeferredLoader() override {
......@@ -236,12 +234,7 @@ class ChromeVoxDeferredLoader : public content::UtteranceEventDelegate,
// content::VoicesChangedDelegate:
void OnVoicesChanged() override {
Profile* profile = manager_->profile();
if (profile->HasOffTheRecordProfile())
profile = profile->GetOffTheRecordProfile();
std::vector<content::VoiceData> voices;
content::TtsController::GetInstance()->GetVoices(profile, &voices);
if (!voices.empty()) {
if (IsGoogleTtsVoiceAvailable()) {
content::TtsController::GetInstance()->RemoveVoicesChangedDelegate(this);
SendWarmupUtterance();
}
......@@ -254,13 +247,26 @@ class ChromeVoxDeferredLoader : public content::UtteranceEventDelegate,
std::unique_ptr<content::TtsUtterance> utterance =
content::TtsUtterance::Create(profile);
utterance->SetEventDelegate(this);
utterance->SetEngineId(extension_misc::kGoogleSpeechSynthesisExtensionId);
content::TtsController::GetInstance()->SpeakOrEnqueue(std::move(utterance));
timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(500), this,
&ChromeVoxDeferredLoader::OnTimer);
}
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_;
int tick_count_ = 0;
base::RepeatingTimer timer_;
......
......@@ -6,6 +6,7 @@
#include "base/strings/pattern.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/tts_controller.h"
......@@ -58,6 +59,7 @@ void SpeechMonitor::GetVoices(std::vector<content::VoiceData>* out_voices) {
content::VoiceData& voice = out_voices->back();
voice.native = true;
voice.name = "SpeechMonitor";
voice.engine_id = extension_misc::kGoogleSpeechSynthesisExtensionId;
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