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