spoken_feedback_browsertest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <queue> 6 7#include "ash/shell.h" 8#include "base/command_line.h" 9#include "base/strings/string_util.h" 10#include "chrome/app/chrome_command_ids.h" 11#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" 12#include "chrome/browser/chromeos/accessibility/speech_monitor.h" 13#include "chrome/browser/chromeos/login/ui/login_display_host.h" 14#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" 15#include "chrome/browser/chromeos/login/ui/webui_login_view.h" 16#include "chrome/browser/chromeos/profiles/profile_helper.h" 17#include "chrome/browser/extensions/api/braille_display_private/stub_braille_controller.h" 18#include "chrome/browser/speech/tts_controller.h" 19#include "chrome/browser/speech/tts_platform.h" 20#include "chrome/browser/ui/browser.h" 21#include "chrome/browser/ui/browser_commands.h" 22#include "chrome/browser/ui/browser_window.h" 23#include "chrome/common/chrome_switches.h" 24#include "chrome/test/base/in_process_browser_test.h" 25#include "chrome/test/base/interactive_test_utils.h" 26#include "chrome/test/base/testing_profile.h" 27#include "chrome/test/base/ui_test_utils.h" 28#include "chromeos/chromeos_switches.h" 29#include "chromeos/login/user_names.h" 30#include "content/public/common/url_constants.h" 31#include "content/public/test/test_utils.h" 32#include "testing/gtest/include/gtest/gtest.h" 33#include "ui/base/test/ui_controls.h" 34#include "ui/views/widget/widget.h" 35 36using extensions::api::braille_display_private::StubBrailleController; 37 38namespace chromeos { 39 40// 41// Spoken feedback tests only in a logged in user's window. 42// 43 44class LoggedInSpokenFeedbackTest : public InProcessBrowserTest { 45 protected: 46 LoggedInSpokenFeedbackTest() {} 47 virtual ~LoggedInSpokenFeedbackTest() {} 48 49 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 50 AccessibilityManager::SetBrailleControllerForTest(&braille_controller_); 51 } 52 53 virtual void CleanUpOnMainThread() OVERRIDE { 54 AccessibilityManager::SetBrailleControllerForTest(NULL); 55 } 56 57 void SendKeyPress(ui::KeyboardCode key) { 58 gfx::NativeWindow root_window = 59 ash::Shell::GetInstance()->GetPrimaryRootWindow(); 60 ASSERT_TRUE( 61 ui_test_utils::SendKeyPressToWindowSync( 62 root_window, key, false, false, false, false)); 63 } 64 65 private: 66 StubBrailleController braille_controller_; 67 DISALLOW_COPY_AND_ASSIGN(LoggedInSpokenFeedbackTest); 68}; 69 70IN_PROC_BROWSER_TEST_F(LoggedInSpokenFeedbackTest, AddBookmark) { 71 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 72 73 SpeechMonitor monitor; 74 AccessibilityManager::Get()->EnableSpokenFeedback( 75 true, ash::A11Y_NOTIFICATION_NONE); 76 EXPECT_TRUE(monitor.SkipChromeVoxEnabledMessage()); 77 78 chrome::ExecuteCommand(browser(), IDC_SHOW_BOOKMARK_BAR); 79 80 // Create a bookmark with title "foo". 81 chrome::ExecuteCommand(browser(), IDC_BOOKMARK_PAGE); 82 EXPECT_EQ("Bookmark added!,", monitor.GetNextUtterance()); 83 EXPECT_EQ("about blank,", monitor.GetNextUtterance()); 84 EXPECT_EQ("Bookmark name,", monitor.GetNextUtterance()); 85 EXPECT_EQ("text box", monitor.GetNextUtterance()); 86 87 SendKeyPress(ui::VKEY_F); 88 EXPECT_EQ("f", monitor.GetNextUtterance()); 89 SendKeyPress(ui::VKEY_O); 90 EXPECT_EQ("o", monitor.GetNextUtterance()); 91 SendKeyPress(ui::VKEY_O); 92 EXPECT_EQ("o", monitor.GetNextUtterance()); 93 94 SendKeyPress(ui::VKEY_TAB); 95 EXPECT_EQ("Bookmarks bar,", monitor.GetNextUtterance()); 96 EXPECT_EQ("Bookmark folder,", monitor.GetNextUtterance()); 97 EXPECT_TRUE(MatchPattern(monitor.GetNextUtterance(), "combo box*")); 98 99 SendKeyPress(ui::VKEY_RETURN); 100 101 EXPECT_TRUE(MatchPattern(monitor.GetNextUtterance(), "*oolbar*")); 102 // Wait for active window change to be announced to avoid interference from 103 // that below. 104 while (monitor.GetNextUtterance() != "window about blank tab") { 105 // Do nothing. 106 } 107 108 // Focus bookmarks bar and listen for "foo". 109 chrome::ExecuteCommand(browser(), IDC_FOCUS_BOOKMARKS); 110 while (true) { 111 std::string utterance = monitor.GetNextUtterance(); 112 VLOG(0) << "Got utterance: " << utterance; 113 if (utterance == "Bookmarks,") 114 break; 115 } 116 EXPECT_EQ("foo,", monitor.GetNextUtterance()); 117 EXPECT_EQ("button", monitor.GetNextUtterance()); 118} 119 120// 121// Spoken feedback tests in both a logged in browser window and guest mode. 122// 123 124enum SpokenFeedbackTestVariant { 125 kTestAsNormalUser, 126 kTestAsGuestUser 127}; 128 129class SpokenFeedbackTest 130 : public LoggedInSpokenFeedbackTest, 131 public ::testing::WithParamInterface<SpokenFeedbackTestVariant> { 132 protected: 133 SpokenFeedbackTest() {} 134 virtual ~SpokenFeedbackTest() {} 135 136 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 137 if (GetParam() == kTestAsGuestUser) { 138 command_line->AppendSwitch(chromeos::switches::kGuestSession); 139 command_line->AppendSwitch(::switches::kIncognito); 140 command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile, 141 "user"); 142 command_line->AppendSwitchASCII(chromeos::switches::kLoginUser, 143 chromeos::login::kGuestUserName); 144 } 145 } 146}; 147 148INSTANTIATE_TEST_CASE_P( 149 TestAsNormalAndGuestUser, 150 SpokenFeedbackTest, 151 ::testing::Values(kTestAsNormalUser, 152 kTestAsGuestUser)); 153 154IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, EnableSpokenFeedback) { 155 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 156 157 SpeechMonitor monitor; 158 AccessibilityManager::Get()->EnableSpokenFeedback( 159 true, ash::A11Y_NOTIFICATION_NONE); 160 EXPECT_TRUE(monitor.SkipChromeVoxEnabledMessage()); 161} 162 163IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, FocusToolbar) { 164 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 165 166 SpeechMonitor monitor; 167 AccessibilityManager::Get()->EnableSpokenFeedback( 168 true, ash::A11Y_NOTIFICATION_NONE); 169 EXPECT_TRUE(monitor.SkipChromeVoxEnabledMessage()); 170 171 chrome::ExecuteCommand(browser(), IDC_FOCUS_TOOLBAR); 172 // Might be "Google Chrome Toolbar" or "Chromium Toolbar". 173 EXPECT_TRUE(MatchPattern(monitor.GetNextUtterance(), "*oolbar*")); 174 EXPECT_EQ("Reload,", monitor.GetNextUtterance()); 175 EXPECT_EQ("button", monitor.GetNextUtterance()); 176} 177 178IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, TypeInOmnibox) { 179 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 180 181 SpeechMonitor monitor; 182 AccessibilityManager::Get()->EnableSpokenFeedback( 183 true, ash::A11Y_NOTIFICATION_NONE); 184 EXPECT_TRUE(monitor.SkipChromeVoxEnabledMessage()); 185 186 // Wait for ChromeVox to finish speaking. 187 chrome::ExecuteCommand(browser(), IDC_FOCUS_LOCATION); 188 while (true) { 189 std::string utterance = monitor.GetNextUtterance(); 190 VLOG(0) << "Got utterance: " << utterance; 191 if (utterance == "text box") 192 break; 193 } 194 195 SendKeyPress(ui::VKEY_X); 196 EXPECT_EQ("x", monitor.GetNextUtterance()); 197 198 SendKeyPress(ui::VKEY_Y); 199 EXPECT_EQ("y", monitor.GetNextUtterance()); 200 201 SendKeyPress(ui::VKEY_Z); 202 EXPECT_EQ("z", monitor.GetNextUtterance()); 203 204 SendKeyPress(ui::VKEY_BACK); 205 EXPECT_EQ("z", monitor.GetNextUtterance()); 206} 207 208// 209// Spoken feedback tests that run only in guest mode. 210// 211 212class GuestSpokenFeedbackTest : public LoggedInSpokenFeedbackTest { 213 protected: 214 GuestSpokenFeedbackTest() {} 215 virtual ~GuestSpokenFeedbackTest() {} 216 217 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 218 command_line->AppendSwitch(chromeos::switches::kGuestSession); 219 command_line->AppendSwitch(::switches::kIncognito); 220 command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile, "user"); 221 command_line->AppendSwitchASCII(chromeos::switches::kLoginUser, 222 chromeos::login::kGuestUserName); 223 } 224 225 private: 226 DISALLOW_COPY_AND_ASSIGN(GuestSpokenFeedbackTest); 227}; 228 229IN_PROC_BROWSER_TEST_F(GuestSpokenFeedbackTest, FocusToolbar) { 230 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 231 232 SpeechMonitor monitor; 233 AccessibilityManager::Get()->EnableSpokenFeedback( 234 true, ash::A11Y_NOTIFICATION_NONE); 235 EXPECT_TRUE(monitor.SkipChromeVoxEnabledMessage()); 236 237 chrome::ExecuteCommand(browser(), IDC_FOCUS_TOOLBAR); 238 // Might be "Google Chrome Toolbar" or "Chromium Toolbar". 239 EXPECT_TRUE(MatchPattern(monitor.GetNextUtterance(), "*oolbar*")); 240 EXPECT_EQ("Reload,", monitor.GetNextUtterance()); 241 EXPECT_EQ("button", monitor.GetNextUtterance()); 242} 243 244// 245// Spoken feedback tests of the out-of-box experience. 246// 247 248class OobeSpokenFeedbackTest : public InProcessBrowserTest { 249 protected: 250 OobeSpokenFeedbackTest() {} 251 virtual ~OobeSpokenFeedbackTest() {} 252 253 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 254 command_line->AppendSwitch(chromeos::switches::kLoginManager); 255 command_line->AppendSwitch(chromeos::switches::kForceLoginManagerInTests); 256 command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile, "user"); 257 } 258 259 virtual void SetUpOnMainThread() OVERRIDE { 260 AccessibilityManager::Get()-> 261 SetProfileForTest(ProfileHelper::GetSigninProfile()); 262 } 263 264 private: 265 DISALLOW_COPY_AND_ASSIGN(OobeSpokenFeedbackTest); 266}; 267 268// Test is flaky: http://crbug.com/346797 269IN_PROC_BROWSER_TEST_F(OobeSpokenFeedbackTest, DISABLED_SpokenFeedbackInOobe) { 270 ui_controls::EnableUIControls(); 271 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 272 273 LoginDisplayHost* login_display_host = LoginDisplayHostImpl::default_host(); 274 WebUILoginView* web_ui_login_view = login_display_host->GetWebUILoginView(); 275 views::Widget* widget = web_ui_login_view->GetWidget(); 276 gfx::NativeWindow window = widget->GetNativeWindow(); 277 278 SpeechMonitor monitor; 279 AccessibilityManager::Get()->EnableSpokenFeedback( 280 true, ash::A11Y_NOTIFICATION_NONE); 281 EXPECT_TRUE(monitor.SkipChromeVoxEnabledMessage()); 282 283 EXPECT_EQ("Select your language:", monitor.GetNextUtterance()); 284 EXPECT_EQ("English ( United States)", monitor.GetNextUtterance()); 285 EXPECT_TRUE(MatchPattern(monitor.GetNextUtterance(), "Combo box * of *")); 286 ASSERT_TRUE( 287 ui_test_utils::SendKeyPressToWindowSync( 288 window, ui::VKEY_TAB, false, false, false, false)); 289 EXPECT_EQ("Select your keyboard:", monitor.GetNextUtterance()); 290} 291 292} // namespace chromeos 293