blob: 394e07195a9a9cbc76aa1fad7dff9c91b16cf3b3 [file] [log] [blame]
// Copyright 2014 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/macros.h"
#include "build/build_config.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/interactive_test_utils.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
namespace language_options_ui_test {
namespace {
// This class will test the language options settings.
// This test is part of the interactive_ui_tests isntead of browser_tests
// because it is necessary to emulate pushing a button in order to properly
// test accessibility.
class LanguageOptionsWebUITest : public InProcessBrowserTest {
public:
LanguageOptionsWebUITest() {}
// This method will navigate to the language settings page and show
// a subset of languages from the list of available languages.
void SetUpOnMainThread() override {
#if defined(OS_CHROMEOS)
auto* setting_name = prefs::kLanguagePreferredLanguages;
#else
auto* setting_name = prefs::kAcceptLanguages;
#endif
const GURL url = chrome::GetSettingsUrl(chrome::kLanguageOptionsSubPage);
ui_test_utils::NavigateToURL(browser(), url);
browser()->profile()->GetPrefs()->SetString(setting_name, "en-US,es,fr");
}
protected:
// Will get the id of the element in the UI that has focus.
std::string GetActiveElementId() {
std::string get_element_id_script =
"domAutomationController.send(document.activeElement.id);";
std::string element_id;
EXPECT_TRUE(content::ExecuteScriptAndExtractString(
GetActiveFrame(),
get_element_id_script,
&element_id));
return element_id;
}
content::RenderFrameHost* GetActiveFrame() {
return GetActiveWebContents()->GetFocusedFrame();
}
content::RenderViewHost* GetRenderViewHost() {
return GetActiveWebContents()->GetRenderViewHost();
}
content::WebContents* GetActiveWebContents() {
return browser()->tab_strip_model()->GetActiveWebContents();
}
// Press and release a key in the browser. This will wait for the element on
// the page to change.
bool PressKey(ui::KeyboardCode key_code) {
return ui_test_utils::SendKeyPressAndWait(
browser(),
key_code,
false,
false,
false,
false,
content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
content::Source<content::RenderViewHost>(GetRenderViewHost()));
}
private:
DISALLOW_COPY_AND_ASSIGN(LanguageOptionsWebUITest);
};
} // namespace
// This test will verify that the appropriate languages are available.
// This test will also fail if the language page is not loaded because a random
// page will not have the language list.
// Test assumes that the default active element is the list of languages.
IN_PROC_BROWSER_TEST_F(LanguageOptionsWebUITest, TestAvailableLanguages) {
// Verify that the language list is focused by default.
std::string original_id = GetActiveElementId();
EXPECT_EQ("language-options-list", original_id);
content::RenderFrameHost* active_frame = GetActiveFrame();
std::string count_deletable_items_script =
"domAutomationController.send("
" document.activeElement.querySelectorAll('.deletable-item').length);";
// Count the number of languages in the list.
int language_count = 0;
ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
active_frame,
count_deletable_items_script,
&language_count));
EXPECT_EQ(3, language_count);
std::string get_children_of_current_element_script =
"domAutomationController.send(document.activeElement.textContent);";
// Verify that the correct languages are added to the list.
std::string languages;
ASSERT_TRUE(content::ExecuteScriptAndExtractString(
active_frame,
get_children_of_current_element_script,
&languages));
EXPECT_EQ("English (United States)SpanishFrench", languages);
}
// This test will validate that the language webui is accessible through
// the keyboard.
// This test must be updated if the tab order of the elements on this page
// is changed.
// Crashes on Win 7. http://crbug.com/500609
#if defined(OS_WIN)
#define MAYBE_TestListTabAccessibility DISABLED_TestListTabAccessibility
#else
#define MAYBE_TestListTabAccessibility TestListTabAccessibility
#endif
IN_PROC_BROWSER_TEST_F(LanguageOptionsWebUITest,
MAYBE_TestListTabAccessibility) {
// Verify that the language list is focused by default.
std::string original_id = GetActiveElementId();
EXPECT_EQ("language-options-list", original_id);
// Press tab to select the next element.
ASSERT_TRUE(PressKey(ui::VKEY_TAB));
// Make sure that the element is now the button that is next in the tab order.
// Checking that the list is no longer selected is not sufficient to validate
// this use case because this test should fail if an item inside the list is
// selected.
std::string new_id = GetActiveElementId();
EXPECT_EQ("language-options-add-button", new_id);
}
} // namespace language_options_ui_test