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 @@ ...@@ -30,7 +30,6 @@
#include "ui/base/ime/chromeos/input_method_manager.h" #include "ui/base/ime/chromeos/input_method_manager.h"
class Browser; class Browser;
class DictationChromeos;
class Profile; class Profile;
namespace gfx { namespace gfx {
...@@ -40,6 +39,7 @@ class Rect; ...@@ -40,6 +39,7 @@ class Rect;
namespace chromeos { namespace chromeos {
class AccessibilityExtensionLoader; class AccessibilityExtensionLoader;
class DictationChromeos;
class SelectToSpeakEventHandler; class SelectToSpeakEventHandler;
class SwitchAccessEventHandler; class SwitchAccessEventHandler;
...@@ -438,6 +438,7 @@ class AccessibilityManager ...@@ -438,6 +438,7 @@ class AccessibilityManager
base::WeakPtrFactory<AccessibilityManager> weak_ptr_factory_; base::WeakPtrFactory<AccessibilityManager> weak_ptr_factory_;
friend class DictationTest;
DISALLOW_COPY_AND_ASSIGN(AccessibilityManager); DISALLOW_COPY_AND_ASSIGN(AccessibilityManager);
}; };
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include "ui/base/ime/ime_bridge.h" #include "ui/base/ime/ime_bridge.h"
#include "ui/base/ime/ime_input_context_handler_interface.h" #include "ui/base/ime/ime_input_context_handler_interface.h"
namespace chromeos {
namespace { namespace {
const char kDefaultProfileLocale[] = "en-US"; const char kDefaultProfileLocale[] = "en-US";
...@@ -59,8 +61,13 @@ bool DictationChromeos::OnToggleDictation() { ...@@ -59,8 +61,13 @@ bool DictationChromeos::OnToggleDictation() {
void DictationChromeos::OnSpeechResult(const base::string16& query, void DictationChromeos::OnSpeechResult(const base::string16& query,
bool is_final) { bool is_final) {
composition_->text = query;
if (!is_final) { 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_) if (input_context_)
input_context_->UpdateCompositionText(*composition_, 0, true); input_context_->UpdateCompositionText(*composition_, 0, true);
return; return;
...@@ -109,3 +116,5 @@ void DictationChromeos::DictationOff() { ...@@ -109,3 +116,5 @@ void DictationChromeos::DictationOff() {
details); details);
speech_recognizer_.reset(); speech_recognizer_.reset();
} }
} // namespace chromeos
...@@ -21,6 +21,8 @@ class IMEInputContextHandlerInterface; ...@@ -21,6 +21,8 @@ class IMEInputContextHandlerInterface;
class Profile; class Profile;
class SpeechRecognizer; class SpeechRecognizer;
namespace chromeos {
// Provides global dictation (type what you speak) on Chrome OS. // Provides global dictation (type what you speak) on Chrome OS.
class DictationChromeos : public SpeechRecognizerDelegate, class DictationChromeos : public SpeechRecognizerDelegate,
ui::IMEBridgeObserver { ui::IMEBridgeObserver {
...@@ -43,7 +45,7 @@ class DictationChromeos : public SpeechRecognizerDelegate, ...@@ -43,7 +45,7 @@ class DictationChromeos : public SpeechRecognizerDelegate,
// IMEBridgeObserver // IMEBridgeObserver
void OnRequestSwitchEngine() override; void OnRequestSwitchEngine() override;
// Saves current dictation state and stops listening. // Saves current dictation result and stops listening.
void DictationOff(); void DictationOff();
std::unique_ptr<SpeechRecognizer> speech_recognizer_; std::unique_ptr<SpeechRecognizer> speech_recognizer_;
...@@ -54,7 +56,10 @@ class DictationChromeos : public SpeechRecognizerDelegate, ...@@ -54,7 +56,10 @@ class DictationChromeos : public SpeechRecognizerDelegate,
base::WeakPtrFactory<DictationChromeos> weak_ptr_factory_; base::WeakPtrFactory<DictationChromeos> weak_ptr_factory_;
friend class DictationTest;
DISALLOW_COPY_AND_ASSIGN(DictationChromeos); DISALLOW_COPY_AND_ASSIGN(DictationChromeos);
}; };
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_ACCESSIBILITY_DICTATION_CHROMEOS_H_ #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) { ...@@ -4953,6 +4953,7 @@ if (!is_android) {
if (is_chromeos) { if (is_chromeos) {
sources += [ sources += [
"../browser/chromeos/accessibility/dictation_chromeos_browsertest.cc",
"../browser/chromeos/accessibility/magnification_controller_browsertest.cc", "../browser/chromeos/accessibility/magnification_controller_browsertest.cc",
"../browser/chromeos/accessibility/select_to_speak_browsertest.cc", "../browser/chromeos/accessibility/select_to_speak_browsertest.cc",
"../browser/chromeos/accessibility/spoken_feedback_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