103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/prefs/pref_service.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chrome_notification_types.h"
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/common/pref_names.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/common/url_constants.h"
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h"
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/web_contents.h"
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace language_options_ui_test {
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace {
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This class will test the language options settings.
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This test is part of the interactive_ui_tests isntead of browser_tests
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// because it is necessary to emulate pushing a button in order to properly
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// test accessiblity.
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class LanguageOptionsWebUITest : public InProcessBrowserTest {
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public:
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  LanguageOptionsWebUITest() {}
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // This method will navigate to the language settings page and show
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // a subset of languages from the list of available languages.
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(OS_CHROMEOS)
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    auto setting_name = prefs::kLanguagePreferredLanguages;
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#else
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    auto setting_name = prefs::kAcceptLanguages;
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const GURL url = chrome::GetSettingsUrl(chrome::kLanguageOptionsSubPage);
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), url);
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    browser()->profile()->GetPrefs()->SetString(setting_name, "en-US,es,fr");
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) protected:
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Will get the id of the element in the UI that has focus.
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string GetActiveElementId() {
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string get_element_id_script =
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        "domAutomationController.send(document.activeElement.id);";
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string element_id;
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_TRUE(content::ExecuteScriptAndExtractString(
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          GetActiveFrame(),
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          get_element_id_script,
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          &element_id));
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return element_id;
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::RenderFrameHost* GetActiveFrame() {
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return GetActiveWebContents()->GetFocusedFrame();
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::RenderViewHost* GetRenderViewHost() {
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return GetActiveWebContents()->GetRenderViewHost();
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::WebContents* GetActiveWebContents() {
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return browser()->tab_strip_model()->GetActiveWebContents();
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Press and release a key in the browser. This will wait for the element on
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the page to change.
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool PressKey(ui::KeyboardCode key_code) {
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return ui_test_utils::SendKeyPressAndWait(
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        browser(),
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        key_code,
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        false,
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        false,
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        false,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        false,
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        content::Source<content::RenderViewHost>(GetRenderViewHost()));
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private:
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LanguageOptionsWebUITest);
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This test will verify that the appropriate languages are available.
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This test will also fail if the language page is not loaded because a random
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// page will not have the language list.
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Test assumes that the default active element is the list of languages.
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LanguageOptionsWebUITest, TestAvailableLanguages) {
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Verify that the language list is focused by default.
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string original_id = GetActiveElementId();
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("language-options-list", original_id);
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::RenderFrameHost* active_frame = GetActiveFrame();
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string count_deletable_items_script =
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "domAutomationController.send("
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "    document.activeElement.querySelectorAll('.deletable-item').length);";
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Count the number of languages in the list.
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int language_count = 0;
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      active_frame,
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      count_deletable_items_script,
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &language_count));
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(3, language_count);
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string get_children_of_current_element_script =
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      "domAutomationController.send(document.activeElement.textContent);";
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Verify that the correct languages are added to the list.
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string languages;
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractString(
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      active_frame,
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      get_children_of_current_element_script,
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &languages));
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("English (United States)SpanishFrench", languages);
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This test will validate that the language webui is accessible through
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// the keyboard.
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This test must be updated if the tab order of the elements on this page
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// is chagned.
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// flaky: http://crbug.com/405711
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(LanguageOptionsWebUITest, TestListTabAccessibility) {
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Verify that the language list is focused by default.
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string original_id = GetActiveElementId();
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("language-options-list", original_id);
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Press tab to select the next element.
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_TRUE(PressKey(ui::VKEY_TAB));
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Make sure that the element is now the button that is next in the tab order.
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Checking that the list is no longer selected is not sufficient to validate
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // this use case because this test should fail if an item inside the list is
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // selected.
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string new_id = GetActiveElementId();
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ("language-options-add-button", new_id);
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace language_options_ui_test
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
149