Commit d76633d9 authored by Zach Helfinstein's avatar Zach Helfinstein Committed by Commit Bot

Stop dictation text update when ChromeVox enabled

Also add tests for Dictation

Bug: 866521
Change-Id: I551b97cdc9d7f0374985438b94c538c45daddf52
Reviewed-on: https://chromium-review.googlesource.com/1152514Reviewed-by: default avatarDavid Tseng <dtseng@chromium.org>
Reviewed-by: default avatarKatie Dektar <katie@chromium.org>
Commit-Queue: Zach Helfinstein <zhelfins@chromium.org>
Cr-Commit-Position: refs/heads/master@{#579478}
parent 3634f3e8
......@@ -30,7 +30,6 @@
#include "ui/base/ime/chromeos/input_method_manager.h"
class Browser;
class DictationChromeos;
class Profile;
namespace gfx {
......@@ -40,6 +39,7 @@ class Rect;
namespace chromeos {
class AccessibilityExtensionLoader;
class DictationChromeos;
class SelectToSpeakEventHandler;
class SwitchAccessEventHandler;
......@@ -438,6 +438,7 @@ class AccessibilityManager
base::WeakPtrFactory<AccessibilityManager> weak_ptr_factory_;
friend class DictationTest;
DISALLOW_COPY_AND_ASSIGN(AccessibilityManager);
};
......
......@@ -19,6 +19,8 @@
#include "ui/base/ime/ime_bridge.h"
#include "ui/base/ime/ime_input_context_handler_interface.h"
namespace chromeos {
namespace {
const char kDefaultProfileLocale[] = "en-US";
......@@ -59,8 +61,13 @@ bool DictationChromeos::OnToggleDictation() {
void DictationChromeos::OnSpeechResult(const base::string16& query,
bool is_final) {
composition_->text = query;
if (!is_final) {
composition_->text = query;
// If ChromeVox is enabled, we don't want to show intermediate results
if (AccessibilityManager::Get()->IsSpokenFeedbackEnabled())
return;
if (input_context_)
input_context_->UpdateCompositionText(*composition_, 0, true);
return;
......@@ -109,3 +116,5 @@ void DictationChromeos::DictationOff() {
details);
speech_recognizer_.reset();
}
} // namespace chromeos
......@@ -21,6 +21,8 @@ class IMEInputContextHandlerInterface;
class Profile;
class SpeechRecognizer;
namespace chromeos {
// Provides global dictation (type what you speak) on Chrome OS.
class DictationChromeos : public SpeechRecognizerDelegate,
ui::IMEBridgeObserver {
......@@ -43,7 +45,7 @@ class DictationChromeos : public SpeechRecognizerDelegate,
// IMEBridgeObserver
void OnRequestSwitchEngine() override;
// Saves current dictation state and stops listening.
// Saves current dictation result and stops listening.
void DictationOff();
std::unique_ptr<SpeechRecognizer> speech_recognizer_;
......@@ -54,7 +56,10 @@ class DictationChromeos : public SpeechRecognizerDelegate,
base::WeakPtrFactory<DictationChromeos> weak_ptr_factory_;
friend class DictationTest;
DISALLOW_COPY_AND_ASSIGN(DictationChromeos);
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_DICTATION_CHROMEOS_H_
// 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 "base/strings/utf_string_conversions.h"
#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#include "chrome/browser/chromeos/accessibility/dictation_chromeos.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "ui/base/ime/ime_bridge.h"
#include "ui/base/ime/mock_ime_input_context_handler.h"
namespace chromeos {
namespace {
const char kFirstSpeechResult[] = "help";
const char kSecondSpeechResult[] = "help oh";
const char kFinalSpeechResult[] = "hello world";
} // namespace
class DictationTest : public InProcessBrowserTest {
protected:
DictationTest() {
input_context_handler_.reset(new ui::MockIMEInputContextHandler());
empty_composition_text_ =
ui::MockIMEInputContextHandler::UpdateCompositionTextArg()
.composition_text;
}
~DictationTest() override = default;
void SetUpOnMainThread() override {
ui::IMEBridge::Get()->SetInputContextHandler(input_context_handler_.get());
}
AccessibilityManager* GetManager() { return AccessibilityManager::Get(); }
void EnableChromeVox() { GetManager()->EnableSpokenFeedback(true); }
void SendSpeechResult(const char* result, bool is_final) {
GetManager()->dictation_->OnSpeechResult(base::ASCIIToUTF16(result),
is_final);
}
ui::CompositionText GetLastCompositionText() {
return input_context_handler_->last_update_composition_arg()
.composition_text;
}
std::unique_ptr<ui::MockIMEInputContextHandler> input_context_handler_;
ui::CompositionText empty_composition_text_;
};
IN_PROC_BROWSER_TEST_F(DictationTest, RecognitionEnds) {
AccessibilityManager* manager = GetManager();
manager->ToggleDictation();
EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text);
SendSpeechResult(kFirstSpeechResult, false /* is_final */);
EXPECT_EQ(base::ASCIIToUTF16(kFirstSpeechResult),
GetLastCompositionText().text);
SendSpeechResult(kSecondSpeechResult, false /* is_final */);
EXPECT_EQ(base::ASCIIToUTF16(kSecondSpeechResult),
GetLastCompositionText().text);
SendSpeechResult(kFinalSpeechResult, true /* is_final */);
EXPECT_EQ(1, input_context_handler_->commit_text_call_count());
EXPECT_EQ(kFinalSpeechResult, input_context_handler_->last_commit_text());
}
IN_PROC_BROWSER_TEST_F(DictationTest, RecognitionEndsWithChromeVoxEnabled) {
AccessibilityManager* manager = GetManager();
EnableChromeVox();
EXPECT_TRUE(manager->IsSpokenFeedbackEnabled());
manager->ToggleDictation();
EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text);
SendSpeechResult(kFirstSpeechResult, false /* is_final */);
EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text);
SendSpeechResult(kSecondSpeechResult, false /* is_final */);
EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text);
SendSpeechResult(kFinalSpeechResult, true /* is_final */);
EXPECT_EQ(1, input_context_handler_->commit_text_call_count());
EXPECT_EQ(kFinalSpeechResult, input_context_handler_->last_commit_text());
}
IN_PROC_BROWSER_TEST_F(DictationTest, UserEndsDictation) {
AccessibilityManager* manager = GetManager();
manager->ToggleDictation();
EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text);
SendSpeechResult(kFinalSpeechResult, false /* is_final */);
EXPECT_EQ(base::ASCIIToUTF16(kFinalSpeechResult),
GetLastCompositionText().text);
manager->ToggleDictation();
EXPECT_EQ(1, input_context_handler_->commit_text_call_count());
EXPECT_EQ(kFinalSpeechResult, input_context_handler_->last_commit_text());
}
IN_PROC_BROWSER_TEST_F(DictationTest, UserEndsDictationWhenChromeVoxEnabled) {
AccessibilityManager* manager = GetManager();
EnableChromeVox();
EXPECT_TRUE(manager->IsSpokenFeedbackEnabled());
manager->ToggleDictation();
EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text);
SendSpeechResult(kFinalSpeechResult, false /* is_final */);
EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text);
manager->ToggleDictation();
EXPECT_EQ(1, input_context_handler_->commit_text_call_count());
EXPECT_EQ(kFinalSpeechResult, input_context_handler_->last_commit_text());
}
} // namespace chromeos
......@@ -4953,6 +4953,7 @@ if (!is_android) {
if (is_chromeos) {
sources += [
"../browser/chromeos/accessibility/dictation_chromeos_browsertest.cc",
"../browser/chromeos/accessibility/magnification_controller_browsertest.cc",
"../browser/chromeos/accessibility/select_to_speak_browsertest.cc",
"../browser/chromeos/accessibility/spoken_feedback_browsertest.cc",
......
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