| Index: chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
|
| diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
|
| index abd11d05c94971a12d9b93f5e9f9e96ae729fcab..bd2b3a9ef73df9b0705776342697d481c6e83b53 100644
|
| --- a/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
|
| +++ b/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
|
| @@ -87,11 +87,6 @@
|
| nullptr, key, false, true, false, true)));
|
| }
|
|
|
| - void SendKeyPressWithSearch(ui::KeyboardCode key) {
|
| - ASSERT_NO_FATAL_FAILURE(ASSERT_TRUE(ui_test_utils::SendKeyPressToWindowSync(
|
| - nullptr, key, false, false, false, true)));
|
| - }
|
| -
|
| void RunJavaScriptInChromeVoxBackgroundPage(const std::string& script) {
|
| extensions::ExtensionHost* host =
|
| extensions::ProcessManager::Get(browser()->profile())
|
| @@ -125,13 +120,42 @@
|
|
|
| void EnableChromeVox() {
|
| // Test setup.
|
| - // Enable ChromeVox, skip welcome message/notification, and disable earcons.
|
| + // Enable ChromeVox, skip welcome message, and disable earcons.
|
| ASSERT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
|
|
|
| AccessibilityManager::Get()->EnableSpokenFeedback(
|
| true, ash::A11Y_NOTIFICATION_NONE);
|
| EXPECT_TRUE(speech_monitor_.SkipChromeVoxEnabledMessage());
|
| DisableEarcons();
|
| + }
|
| +
|
| + void LoadChromeVoxAndThenNavigateToURL(const GURL& url) {
|
| + // The goal of this helper function is to avoid race conditions between
|
| + // the page loading and the ChromeVox extension loading and fully
|
| + // initializing. To do this, we first load a test url that repeatedly
|
| + // asks ChromeVox to speak 'ready', then we load ChromeVox and block
|
| + // until we get that 'ready' speech.
|
| +
|
| + ui_test_utils::NavigateToURL(
|
| + browser(),
|
| + GURL("data:text/html;charset=utf-8,"
|
| + "<script>"
|
| + "window.setInterval(function() {"
|
| + " try {"
|
| + " cvox.Api.speak('ready');"
|
| + " } catch (e) {}"
|
| + "}, 100);"
|
| + "</script>"));
|
| + EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
|
| + AccessibilityManager::Get()->EnableSpokenFeedback(
|
| + true, ash::A11Y_NOTIFICATION_NONE);
|
| +
|
| + // Block until we get "ready".
|
| + while (speech_monitor_.GetNextUtterance() != "ready") {
|
| + }
|
| +
|
| + // Now load the requested url.
|
| + ui_test_utils::NavigateToURL(browser(), url);
|
| }
|
|
|
| void PressRepeatedlyUntilUtterance(ui::KeyboardCode key,
|
| @@ -285,12 +309,24 @@
|
| chrome::ExecuteCommand(browser(), IDC_FOCUS_TOOLBAR);
|
| EXPECT_EQ("Reload", speech_monitor_.GetNextUtterance());
|
| EXPECT_EQ("Button", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ("main", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ("Tool bar", speech_monitor_.GetNextUtterance());
|
| + EXPECT_TRUE(
|
| + base::MatchPattern(speech_monitor_.GetNextUtterance(), "about:blank*"));
|
| }
|
|
|
| IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, TypeInOmnibox) {
|
| EnableChromeVox();
|
|
|
| - // Location bar has focus by default so just start typing.
|
| + chrome::ExecuteCommand(browser(), IDC_FOCUS_LOCATION);
|
| + EXPECT_EQ("Address and search bar", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ("about:blank", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ("Edit text", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ("main", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ("Tool bar", speech_monitor_.GetNextUtterance());
|
| + EXPECT_TRUE(
|
| + base::MatchPattern(speech_monitor_.GetNextUtterance(), "*about:blank*"));
|
| +
|
| SendKeyPress(ui::VKEY_X);
|
| EXPECT_EQ("x", speech_monitor_.GetNextUtterance());
|
|
|
| @@ -402,13 +438,14 @@
|
| EXPECT_TRUE(base::MatchPattern(speech_monitor_.GetNextUtterance(), "*"));
|
| EXPECT_TRUE(base::MatchPattern(speech_monitor_.GetNextUtterance(), "Button"));
|
|
|
| - // Next element.
|
| - SendKeyPressWithSearch(ui::VKEY_RIGHT);
|
| + // Compat next element.
|
| + SendKeyPressWithSearchAndShift(ui::VKEY_RIGHT);
|
| EXPECT_TRUE(base::MatchPattern(speech_monitor_.GetNextUtterance(), "*"));
|
| EXPECT_TRUE(base::MatchPattern(speech_monitor_.GetNextUtterance(), "Button"));
|
|
|
| - // Next button.
|
| - SendKeyPressWithSearch(ui::VKEY_B);
|
| + // Compat next button.
|
| + SendKeyPressWithSearchAndShift(ui::VKEY_N);
|
| + SendKeyPress(ui::VKEY_B);
|
| EXPECT_TRUE(base::MatchPattern(speech_monitor_.GetNextUtterance(), "*"));
|
| EXPECT_TRUE(base::MatchPattern(speech_monitor_.GetNextUtterance(), "Button"));
|
|
|
| @@ -490,10 +527,7 @@
|
| #define MAYBE_ChromeVoxShiftSearch ChromeVoxShiftSearch
|
| #endif
|
| IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, MAYBE_ChromeVoxShiftSearch) {
|
| - EnableChromeVox();
|
| -
|
| - ui_test_utils::NavigateToURL(
|
| - browser(),
|
| + LoadChromeVoxAndThenNavigateToURL(
|
| GURL("data:text/html;charset=utf-8,<button autofocus>Click me</button>"));
|
| while (true) {
|
| std::string utterance = speech_monitor_.GetNextUtterance();
|
| @@ -502,11 +536,36 @@
|
| }
|
| EXPECT_EQ("Button", speech_monitor_.GetNextUtterance());
|
|
|
| - // Press Search+/ to enter ChromeVox's "find in page".
|
| - SendKeyPressWithSearch(ui::VKEY_OEM_2);
|
| - EXPECT_EQ("webView", speech_monitor_.GetNextUtterance());
|
| - EXPECT_EQ(", window", speech_monitor_.GetNextUtterance());
|
| + // Press Search+Shift+/ to enter ChromeVox's "find in page".
|
| + SendKeyPressWithSearchAndShift(ui::VKEY_OEM_2);
|
| EXPECT_EQ("Find in page.", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ(",", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ("Enter a search query.", speech_monitor_.GetNextUtterance());
|
| +}
|
| +
|
| +#if defined(MEMORY_SANITIZER)
|
| +// Fails under MemorySanitizer: http://crbug.com/472125
|
| +#define MAYBE_ChromeVoxPrefixKey DISABLED_ChromeVoxPrefixKey
|
| +#else
|
| +#define MAYBE_ChromeVoxPrefixKey ChromeVoxPrefixKey
|
| +#endif
|
| +IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, MAYBE_ChromeVoxPrefixKey) {
|
| + LoadChromeVoxAndThenNavigateToURL(
|
| + GURL("data:text/html;charset=utf-8,<button autofocus>Click me</button>"));
|
| + while (true) {
|
| + std::string utterance = speech_monitor_.GetNextUtterance();
|
| + if (utterance == "Click me")
|
| + break;
|
| + }
|
| + EXPECT_EQ("Button", speech_monitor_.GetNextUtterance());
|
| +
|
| + // Press the prefix key Ctrl+';' followed by '/'
|
| + // to enter ChromeVox's "find in page".
|
| + SendKeyPressWithControl(ui::VKEY_OEM_1);
|
| + SendKeyPress(ui::VKEY_OEM_2);
|
| + EXPECT_EQ("Find in page.", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ(",", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ("Enter a search query.", speech_monitor_.GetNextUtterance());
|
| }
|
|
|
| #if defined(MEMORY_SANITIZER)
|
| @@ -516,12 +575,10 @@
|
| #define MAYBE_ChromeVoxNavigateAndSelect ChromeVoxNavigateAndSelect
|
| #endif
|
| IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, MAYBE_ChromeVoxNavigateAndSelect) {
|
| - EnableChromeVox();
|
| -
|
| - ui_test_utils::NavigateToURL(browser(),
|
| - GURL("data:text/html;charset=utf-8,"
|
| - "<h1>Title</h1>"
|
| - "<button autofocus>Click me</button>"));
|
| + LoadChromeVoxAndThenNavigateToURL(
|
| + GURL("data:text/html;charset=utf-8,"
|
| + "<h1>Title</h1>"
|
| + "<button autofocus>Click me</button>"));
|
| while (true) {
|
| std::string utterance = speech_monitor_.GetNextUtterance();
|
| if (utterance == "Click me")
|
| @@ -529,30 +586,33 @@
|
| }
|
| EXPECT_EQ("Button", speech_monitor_.GetNextUtterance());
|
|
|
| - // Press Search+Left to navigate to the previous item.
|
| - SendKeyPressWithSearch(ui::VKEY_LEFT);
|
| + // Press Search+Shift+Up to navigate to the previous item.
|
| + SendKeyPressWithSearchAndShift(ui::VKEY_UP);
|
| EXPECT_EQ("Title", speech_monitor_.GetNextUtterance());
|
| EXPECT_EQ("Heading 1", speech_monitor_.GetNextUtterance());
|
|
|
| - // Press Search+S to select the text.
|
| - SendKeyPressWithSearch(ui::VKEY_S);
|
| + // Press Search+Shift+S to select the text.
|
| + SendKeyPressWithSearchAndShift(ui::VKEY_S);
|
| + EXPECT_EQ("Start selection", speech_monitor_.GetNextUtterance());
|
| EXPECT_EQ("Title", speech_monitor_.GetNextUtterance());
|
| - EXPECT_EQ("selected", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ(", selected", speech_monitor_.GetNextUtterance());
|
|
|
| // Press again to end the selection.
|
| - SendKeyPressWithSearch(ui::VKEY_S);
|
| + SendKeyPressWithSearchAndShift(ui::VKEY_S);
|
| EXPECT_EQ("End selection", speech_monitor_.GetNextUtterance());
|
| EXPECT_EQ("Title", speech_monitor_.GetNextUtterance());
|
| }
|
|
|
| -IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, ChromeVoxNextStickyMode) {
|
| - EnableChromeVox();
|
| -
|
| - ui_test_utils::NavigateToURL(
|
| - browser(),
|
| - GURL("data:text/html;charset=utf-8,<button autofocus>Click me</button>"));
|
| - while ("Button" != speech_monitor_.GetNextUtterance()) {
|
| - }
|
| +// http://crbug.com/628060
|
| +IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, DISABLED_ChromeVoxStickyMode) {
|
| + LoadChromeVoxAndThenNavigateToURL(
|
| + GURL("data:text/html;charset=utf-8,"
|
| + "<label>Enter your name <input autofocus></label>"
|
| + "<p>One</p>"
|
| + "<h2>Two</h2>"));
|
| + while (speech_monitor_.GetNextUtterance() != "Enter your name") {
|
| + }
|
| + EXPECT_EQ("Edit text", speech_monitor_.GetNextUtterance());
|
|
|
| // Press the sticky-key sequence: Search Search.
|
| SendKeyPress(ui::VKEY_LWIN);
|
| @@ -567,10 +627,31 @@
|
|
|
| EXPECT_EQ("Sticky mode enabled", speech_monitor_.GetNextUtterance());
|
|
|
| - SendKeyPress(ui::VKEY_H);
|
| - while ("No next heading." != speech_monitor_.GetNextUtterance()) {
|
| - }
|
| -
|
| + // Even once we hear "sticky mode enabled" from the ChromeVox background
|
| + // page, there's a short window of time when the content script still
|
| + // hasn't switched to sticky mode. That's why we're focused on a text box.
|
| + // Keep pressing the '/' key. If sticky mode is off, it will echo the word
|
| + // "slash". If sticky mode is on, it will open "Find in page". Keep pressing
|
| + // '/' until we get "Find in page.".
|
| + PressRepeatedlyUntilUtterance(ui::VKEY_OEM_2, "Find in page.");
|
| + while (speech_monitor_.GetNextUtterance() != "Enter a search query.") {
|
| + }
|
| +
|
| + // Press Esc to exit Find in Page mode.
|
| + SendKeyPress(ui::VKEY_ESCAPE);
|
| + EXPECT_EQ("Exited", speech_monitor_.GetNextUtterance());
|
| + while (speech_monitor_.GetNextUtterance() != "Find in page.") {
|
| + }
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, ChromeVoxNextStickyMode) {
|
| + LoadChromeVoxAndThenNavigateToURL(
|
| + GURL("data:text/html;charset=utf-8,<button autofocus>Click me</button>"
|
| + "<!-- chromevox_next_test -->"));
|
| + while ("Button" != speech_monitor_.GetNextUtterance()) {
|
| + }
|
| +
|
| + // Press the sticky-key sequence: Search Search.
|
| SendKeyPress(ui::VKEY_LWIN);
|
|
|
| // Sticky key has a minimum 100 ms check to prevent key repeat from toggling
|
| @@ -581,6 +662,22 @@
|
| base::Unretained(this), ui::VKEY_LWIN),
|
| base::TimeDelta::FromMilliseconds(200));
|
|
|
| + EXPECT_EQ("Sticky mode enabled", speech_monitor_.GetNextUtterance());
|
| +
|
| + SendKeyPress(ui::VKEY_H);
|
| + while ("No next heading." != speech_monitor_.GetNextUtterance()) {
|
| + }
|
| +
|
| + SendKeyPress(ui::VKEY_LWIN);
|
| +
|
| + // Sticky key has a minimum 100 ms check to prevent key repeat from toggling
|
| + // it.
|
| + content::BrowserThread::PostDelayedTask(
|
| + content::BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&LoggedInSpokenFeedbackTest::SendKeyPress,
|
| + base::Unretained(this), ui::VKEY_LWIN),
|
| + base::TimeDelta::FromMilliseconds(200));
|
| +
|
| while ("Sticky mode disabled" != speech_monitor_.GetNextUtterance()) {
|
| }
|
| }
|
| @@ -629,6 +726,10 @@
|
|
|
| EXPECT_EQ("Reload", speech_monitor_.GetNextUtterance());
|
| EXPECT_EQ("Button", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ("main", speech_monitor_.GetNextUtterance());
|
| + EXPECT_EQ("Tool bar", speech_monitor_.GetNextUtterance());
|
| + EXPECT_TRUE(
|
| + base::MatchPattern(speech_monitor_.GetNextUtterance(), "about:blank*"));
|
| }
|
|
|
| //
|
|
|