Index: chrome/test/data/webui/settings/languages_page_tests.js |
diff --git a/chrome/test/data/webui/settings/languages_page_browsertest.js b/chrome/test/data/webui/settings/languages_page_tests.js |
similarity index 46% |
rename from chrome/test/data/webui/settings/languages_page_browsertest.js |
rename to chrome/test/data/webui/settings/languages_page_tests.js |
index ae7dfab6a551a5c136e3f01768bb1afa2edb1b84..8bccfad534280762cb873ba0299faaa60d106d9c 100644 |
--- a/chrome/test/data/webui/settings/languages_page_browsertest.js |
+++ b/chrome/test/data/webui/settings/languages_page_tests.js |
@@ -1,117 +1,78 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Copyright 2017 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. |
-/** @fileoverview Suite of tests for settings-languages-page. */ |
- |
-/** @const {string} Path to root from chrome/test/data/webui/settings/. */ |
-var ROOT_PATH = '../../../../../'; |
- |
-// Polymer BrowserTest fixture. |
-GEN_INCLUDE( |
- [ROOT_PATH + 'chrome/test/data/webui/polymer_browser_test_base.js']); |
-// SettingsPageBrowserTest fixture. |
-GEN_INCLUDE([ROOT_PATH + |
- 'chrome/test/data/webui/settings/settings_page_browsertest.js']); |
- |
-/** |
- * Test class for settings-languages-page UI. |
- * @constructor |
- * @extends {SettingsPageBrowserTest} |
- */ |
-function SettingsLanguagesPageBrowserTest() {} |
- |
-SettingsLanguagesPageBrowserTest.prototype = { |
- __proto__: SettingsPageBrowserTest.prototype, |
- |
- /** @override */ |
- preLoad: function() { |
- SettingsPageBrowserTest.prototype.preLoad.call(this); |
- settingsHidePagesByDefaultForTest = true; |
- }, |
-}; |
- |
-// Flaky on Windows, Mac and Linux. See https://crbug.com/641400. |
-// |
-// May time out on debug builders and memory bots because the Settings page can |
-// take several seconds to load in a Release build and several times that in a |
-// Debug build. See https://crbug.com/558434. |
-// |
-// Disabling this test in general. |
-GEN('#define MAYBE_LanguagesPage DISABLED_LanguagesPage'); |
- |
-// Runs languages page tests. |
-TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
- var self = this; |
- |
- suiteSetup(function() { |
- self.toggleAdvanced(); |
- }); |
+cr.define('languages_page_tests', function() { |
+ /** @enum {string} */ |
+ const TestNames = { |
+ AddLanguagesDialog: 'add languages dialog', |
+ LanguageMenu: 'language menu', |
+ InputMethods: 'input methods', |
+ Spellcheck: 'spellcheck', |
+ }; |
suite('languages page', function() { |
- testing.Test.disableAnimationsAndTransitions(); |
- |
- var languagesSection; |
- var languagesPage; |
- var languagesCollapse; |
- var languageHelper; |
- var actionMenu; |
- |
- /** |
- * @param {numExpected} Expected number of languages to eventually be |
- * enabled. |
- * @return {!Promise} Resolved when the number of enabled languages changes |
- * to match expectations. |
- */ |
- function whenNumEnabledLanguagesBecomes(numExpected) { |
- assert(!!languagesPage); |
- return new Promise(function(resolve, reject) { |
- languagesPage.addEventListener('languages-changed', function changed() { |
- if (languagesPage.languages.enabled.length != numExpected) |
- return; |
- resolve(); |
- languagesPage.removeEventListener('languages-changed', changed); |
- }); |
- }); |
- } |
- |
- // Returns supported languages that are not enabled. |
- function getAvailableLanguages() { |
- return languagesPage.languages.supported.filter(function(language) { |
- return !languageHelper.isLanguageEnabled(language.code); |
- }); |
- } |
+ /** @type {?LanguageHelper} */ |
+ var languageHelper = null; |
+ /** @type {?SettingsLanguagesPageElement} */ |
+ var languagesPage = null; |
+ /** @type {?IronCollapseElement} */ |
+ var languagesCollapse = null; |
+ /** @type {?CrActionMenuElement} */ |
+ var actionMenu = null; |
+ /** @type {?settings.LanguagesBrowserProxy} */ |
+ var browserProxy = null; |
+ |
+ // Enabled language pref name for the platform. |
+ const languagesPref = |
+ cr.isChromeOS ? 'settings.language.preferred_languages' |
+ : 'intl.accept_languages'; |
+ |
+ // Initial value of enabled languages pref used in tests. |
+ const initialLanguages = 'en-US,sw'; |
suiteSetup(function() { |
- var page = self.basicPage; |
- page.set('pageVisibility.languages', true); |
- Polymer.dom.flush(); |
- |
- languagesSection = assert(this.getSection(page, 'languages')); |
- languagesPage = assert( |
- languagesSection.querySelector('settings-languages-page')); |
- languagesCollapse = languagesPage.$.languagesCollapse; |
- languagesCollapse.opened = true; |
- actionMenu = languagesPage.$.menu.get(); |
- |
- languageHelper = languagesPage.languageHelper; |
- return languageHelper.whenReady(); |
- }.bind(this)); |
- |
- teardown(function(done) { |
- if (actionMenu.open) |
- actionMenu.close(); |
+ testing.Test.disableAnimationsAndTransitions(); |
+ PolymerTest.clearBody(); |
+ CrSettingsPrefs.deferInitialization = true; |
+ }); |
- // Close the section if we're in a sub-page. |
- if (settings.getCurrentRoute().isSubpage()) { |
- settings.navigateTo(settings.Route.BASIC); |
- setTimeout(done); |
- } else { |
- done(); |
- } |
+ setup(function() { |
+ var settingsPrefs = document.createElement('settings-prefs'); |
+ var settingsPrivate = |
+ new settings.FakeSettingsPrivate(settings.getFakeLanguagePrefs()); |
+ settingsPrefs.initialize(settingsPrivate); |
+ document.body.appendChild(settingsPrefs); |
+ return CrSettingsPrefs.initialized.then(function() { |
+ // Set up test browser proxy. |
+ browserProxy = new settings.TestLanguagesBrowserProxy(); |
+ settings.LanguagesBrowserProxyImpl.instance_ = browserProxy; |
+ |
+ // Set up fake languageSettingsPrivate API. |
+ var languageSettingsPrivate = browserProxy.getLanguageSettingsPrivate(); |
+ languageSettingsPrivate.setSettingsPrefs(settingsPrefs); |
+ |
+ languagesPage = document.createElement('settings-languages-page'); |
+ |
+ // Prefs would normally be data-bound to settings-languages-page. |
+ languagesPage.prefs = settingsPrefs.prefs; |
+ test_util.fakeDataBind(settingsPrefs, languagesPage, 'prefs'); |
+ |
+ document.body.appendChild(languagesPage); |
+ languagesCollapse = languagesPage.$.languagesCollapse; |
+ languagesCollapse.opened = true; |
+ actionMenu = languagesPage.$.menu.get(); |
+ |
+ languageHelper = languagesPage.languageHelper; |
+ return languageHelper.whenReady(); |
+ }); |
+ }); |
+ |
+ teardown(function() { |
+ PolymerTest.clearBody(); |
}); |
- suite('add languages dialog', function() { |
+ suite(TestNames.AddLanguagesDialog, function() { |
var dialog; |
var dialogItems; |
var cancelButton; |
@@ -158,25 +119,21 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
}); |
test('add languages and cancel', function(done) { |
- var numEnabled = languagesPage.languages.enabled.length; |
- |
// Check some languages. |
- MockInteractions.tap(dialogItems[0]); |
- MockInteractions.tap(dialogItems[1]); |
+ MockInteractions.tap(dialogItems[1]); // en-CA. |
+ MockInteractions.tap(dialogItems[2]); // tk. |
// Canceling the dialog should close and remove it without enabling |
// the checked languages. A small timeout lets us check this. |
MockInteractions.tap(cancelButton); |
setTimeout(function() { |
- // Number of enabled languages should be the same. |
- assertEquals(numEnabled, languagesPage.languages.enabled.length); |
+ assertEquals(initialLanguages, |
+ languageHelper.getPref(languagesPref).value); |
done(); |
}, 100); |
}); |
test('add languages and confirm', function() { |
- var numEnabled = languagesPage.languages.enabled.length; |
- |
// No languages have been checked, so the action button is inert. |
MockInteractions.tap(actionButton); |
Polymer.dom.flush(); |
@@ -189,23 +146,22 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
assertTrue(actionButton.disabled); |
// Check multiple languages. |
- MockInteractions.tap(dialogItems[0]); |
- MockInteractions.tap(dialogItems[1]); |
+ MockInteractions.tap(dialogItems[0]); // en. |
+ MockInteractions.tap(dialogItems[2]); // tk. |
assertFalse(actionButton.disabled); |
// The action button should close and remove the dialog, enabling the |
// checked languages. |
MockInteractions.tap(actionButton); |
- // Wait for the languages to be enabled by the browser. |
- return whenNumEnabledLanguagesBecomes(numEnabled + 2); |
+ assertEquals( |
+ initialLanguages + ',en,tk', |
+ languageHelper.getPref(languagesPref).value); |
}); |
}); |
- suite('language menu', function() { |
- var origTranslateEnabled; |
- |
- /** |
+ suite(TestNames.LanguageMenu, function() { |
+ /* |
* Finds, asserts and returns the menu item for the given i18n key. |
* @param {string} i18nKey Name of the i18n string for the item's text. |
* @return {!HTMLElement} Menu item. |
@@ -218,7 +174,7 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
return assert(menuItem, 'Menu item "' + i18nKey + '" not found'); |
} |
- /** |
+ /* |
* Checks the visibility of each expected menu item button. |
* param {!Object<boolean>} Dictionary from i18n keys to expected |
* visibility of those menu items. |
@@ -232,18 +188,6 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
} |
} |
- suiteSetup(function() { |
- // Cache the value of Translate to avoid side effects. |
- origTranslateEnabled = languageHelper.prefs.translate.enabled.value; |
- }); |
- |
- suiteTeardown(function() { |
- var cur = languageHelper.prefs.translate.enabled.value; |
- // Restore the value of Translate. |
- languageHelper.setPrefValue('translate.enabled', origTranslateEnabled); |
- cur = languageHelper.prefs.translate.enabled.value; |
- }); |
- |
test('structure', function() { |
var languageOptionsDropdownTrigger = languagesCollapse.querySelector( |
'paper-icon-button'); |
@@ -251,9 +195,6 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
MockInteractions.tap(languageOptionsDropdownTrigger); |
assertTrue(actionMenu.open); |
- // Enable Translate so the menu always shows the Translate checkbox. |
- languageHelper.setPrefValue('translate.enabled', true); |
- |
var separator = actionMenu.querySelector('hr'); |
assertEquals(1, separator.offsetHeight); |
@@ -266,37 +207,36 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
}); |
test('test translate.enable toggle', function() { |
- languageHelper.setPrefValue('translate.enabled', true); |
- var toggle = languagesPage.$.offerTranslateOtherLangs.root |
- .querySelectorAll('paper-toggle-button')[0]; |
- assertTrue(!!toggle); |
+ var settingsToggle = languagesPage.$.offerTranslateOtherLangs; |
+ assertTrue(!!settingsToggle); |
+ var paperToggle = settingsToggle.$$('paper-toggle-button'); |
+ assertTrue(!!paperToggle); |
- // Clicking on toggle switch it to false. |
- MockInteractions.tap(toggle); |
+ // Clicking on the toggle switches it to false. |
+ MockInteractions.tap(paperToggle); |
var newToggleValue = languageHelper.prefs.translate.enabled.value; |
assertFalse(newToggleValue); |
- // Clicking on toggle switch it to true again. |
- MockInteractions.tap(toggle); |
+ // Clicking on the toggle switches it to true again. |
+ MockInteractions.tap(paperToggle); |
newToggleValue = languageHelper.prefs.translate.enabled.value; |
assertTrue(newToggleValue); |
}); |
test('toggle translate for a specific language', function(done) { |
- // Enable Translate so the menu always shows the Translate checkbox. |
- languageHelper.setPrefValue('translate.enabled', true); |
- languagesPage.set('languages.translateTarget', 'foo'); |
- languagesPage.set('languages.enabled.1.supportsTranslate', true); |
- |
+ // Open options for 'sw'. |
var languageOptionsDropdownTrigger = |
languagesCollapse.querySelectorAll('paper-icon-button')[1]; |
assertTrue(!!languageOptionsDropdownTrigger); |
MockInteractions.tap(languageOptionsDropdownTrigger); |
assertTrue(actionMenu.open); |
- // Toggle the translate option. |
+ // 'sw' supports translate to the target language ('en'). |
var translateOption = getMenuItem('offerToTranslateInThisLanguage'); |
assertFalse(translateOption.disabled); |
+ assertTrue(translateOption.checked); |
+ |
+ // Toggle the translate option. |
MockInteractions.tap(translateOption); |
// Menu should stay open briefly. |
@@ -304,6 +244,9 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
// Guaranteed to run later than the menu close delay. |
setTimeout(function() { |
assertFalse(actionMenu.open); |
+ assertDeepEquals( |
+ ['en-US', 'sw'], |
+ languageHelper.prefs.translate_blocked_languages.value); |
done(); |
}, settings.kMenuCloseDelay + 1); |
}); |
@@ -311,10 +254,8 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
test('disable translate hides language-specific option', function() { |
// Disables translate. |
languageHelper.setPrefValue('translate.enabled', false); |
- languagesPage.set('languages.translateTarget', 'foo'); |
- languagesPage.set('languages.enabled.1.supportsTranslate', true); |
- // Makes sure language-specific menu exists. |
+ // Open options for 'sw'. |
var languageOptionsDropdownTrigger = |
languagesCollapse.querySelectorAll('paper-icon-button')[1]; |
assertTrue(!!languageOptionsDropdownTrigger); |
@@ -328,88 +269,76 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
}); |
test('remove language', function() { |
- var numEnabled = languagesPage.languages.enabled.length; |
- |
- // Enabled a language which we can then disable. |
- var newLanguage = assert(getAvailableLanguages()[0]); |
- languageHelper.enableLanguage(newLanguage.code); |
- |
- // Wait for the language to be enabled. |
- return whenNumEnabledLanguagesBecomes(numEnabled + 1).then(function() { |
- // Populate the dom-repeat. |
- Polymer.dom.flush(); |
- |
- // Find the new language item. |
- var items = languagesCollapse.querySelectorAll('.list-item'); |
- var domRepeat = assert( |
- languagesCollapse.querySelector('template[is="dom-repeat"]')); |
- var item = Array.from(items).find(function(el) { |
- return domRepeat.itemForElement(el) && |
- domRepeat.itemForElement(el).language == newLanguage; |
- }); |
- |
- // Open the menu and select Remove. |
- MockInteractions.tap(item.querySelector('paper-icon-button')); |
- |
- assertTrue(actionMenu.open); |
- var removeMenuItem = getMenuItem('removeLanguage'); |
- assertFalse(removeMenuItem.disabled); |
- MockInteractions.tap(removeMenuItem); |
- assertFalse(actionMenu.open); |
+ // Enable a language which we can then disable. |
+ languageHelper.enableLanguage('no'); |
- // We should go back down to the original number of enabled languages. |
- return whenNumEnabledLanguagesBecomes(numEnabled); |
- }).then(function() { |
- assertFalse(languageHelper.isLanguageEnabled(newLanguage.code)); |
+ // Populate the dom-repeat. |
+ Polymer.dom.flush(); |
+ |
+ // Find the new language item. |
+ var items = languagesCollapse.querySelectorAll('.list-item'); |
+ var domRepeat = assert( |
+ languagesCollapse.querySelector('template[is="dom-repeat"]')); |
+ var item = Array.from(items).find(function(el) { |
+ return domRepeat.itemForElement(el) && |
+ domRepeat.itemForElement(el).language.code == 'no'; |
}); |
+ |
+ // Open the menu and select Remove. |
+ MockInteractions.tap(item.querySelector('paper-icon-button')); |
+ |
+ assertTrue(actionMenu.open); |
+ var removeMenuItem = getMenuItem('removeLanguage'); |
+ assertFalse(removeMenuItem.disabled); |
+ MockInteractions.tap(removeMenuItem); |
+ assertFalse(actionMenu.open); |
+ |
+ assertEquals( |
+ initialLanguages, languageHelper.getPref(languagesPref).value); |
}); |
test('move up/down buttons', function() { |
// Add several languages. |
- var numEnabled = languagesPage.languages.enabled.length; |
- var available = getAvailableLanguages(); |
- for (var i = 0; i < 4; i++) |
- languageHelper.enableLanguage(assert(available[i]).code); |
- |
- return whenNumEnabledLanguagesBecomes(numEnabled + 4).then(function() { |
- Polymer.dom.flush(); |
- |
- var menuButtons = |
- languagesCollapse.querySelectorAll( |
- '.list-item paper-icon-button[icon="cr:more-vert"]'); |
- |
- // First language should not have "Move up" or "Move to top". |
- MockInteractions.tap(menuButtons[0]); |
- assertMenuItemButtonsVisible({ |
- moveToTop: false, moveUp: false, moveDown: true, |
- }); |
- actionMenu.close(); |
- |
- // Second language should not have "Move up". |
- MockInteractions.tap(menuButtons[1]); |
- assertMenuItemButtonsVisible({ |
- moveToTop: true, moveUp: false, moveDown: true, |
- }); |
- actionMenu.close(); |
- |
- // Middle languages should have all buttons. |
- MockInteractions.tap(menuButtons[2]); |
- assertMenuItemButtonsVisible({ |
- moveToTop: true, moveUp: true, moveDown: true, |
- }); |
- actionMenu.close(); |
- |
- // Last language should not have "Move down". |
- MockInteractions.tap(menuButtons[menuButtons.length - 1]); |
- assertMenuItemButtonsVisible({ |
- moveToTop: true, moveUp: true, moveDown: false, |
- }); |
- actionMenu.close(); |
+ for (var language of ['en-CA', 'en-US', 'tk', 'no']) |
+ languageHelper.enableLanguage(language); |
+ |
+ Polymer.dom.flush(); |
+ |
+ var menuButtons = |
+ languagesCollapse.querySelectorAll( |
+ '.list-item paper-icon-button[icon="cr:more-vert"]'); |
+ |
+ // First language should not have "Move up" or "Move to top". |
+ MockInteractions.tap(menuButtons[0]); |
+ assertMenuItemButtonsVisible({ |
+ moveToTop: false, moveUp: false, moveDown: true, |
+ }); |
+ actionMenu.close(); |
+ |
+ // Second language should not have "Move up". |
+ MockInteractions.tap(menuButtons[1]); |
+ assertMenuItemButtonsVisible({ |
+ moveToTop: true, moveUp: false, moveDown: true, |
+ }); |
+ actionMenu.close(); |
+ |
+ // Middle languages should have all buttons. |
+ MockInteractions.tap(menuButtons[2]); |
+ assertMenuItemButtonsVisible({ |
+ moveToTop: true, moveUp: true, moveDown: true, |
+ }); |
+ actionMenu.close(); |
+ |
+ // Last language should not have "Move down". |
+ MockInteractions.tap(menuButtons[menuButtons.length - 1]); |
+ assertMenuItemButtonsVisible({ |
+ moveToTop: true, moveUp: true, moveDown: false, |
}); |
+ actionMenu.close(); |
}); |
}); |
- test('manage input methods', function() { |
+ test(TestNames.InputMethods, function() { |
var inputMethodsCollapse = languagesPage.$.inputMethodsCollapse; |
var inputMethodSettingsExist = !!inputMethodsCollapse; |
if (cr.isChromeOS) { |
@@ -423,7 +352,7 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
} |
}); |
- test('spellcheck', function() { |
+ test(TestNames.Spellcheck, function() { |
var spellCheckCollapse = languagesPage.$.spellCheckCollapse; |
var spellCheckSettingsExist = !!spellCheckCollapse; |
if (cr.isMac) { |
@@ -431,31 +360,36 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
} else { |
assertTrue(spellCheckSettingsExist); |
- // Ensure no language has spell check enabled. |
- for (var i = 0; i < languagesPage.languages.enabled.length; i++) { |
- languagesPage.set( |
- 'languages.enabled.' + i + '.spellCheckEnabled', false); |
- } |
- |
- // The row button should have the extra row only if some language has |
- // spell check enabled. |
+ // The row button should have a secondary row specifying which language |
+ // spell check is enabled for. |
var triggerRow = languagesPage.$.spellCheckSubpageTrigger; |
- assertFalse(triggerRow.classList.contains('two-line')); |
- assertEquals( |
- 0, triggerRow.querySelector('.secondary').textContent.length); |
- languagesPage.set( |
- 'languages.enabled.0.language.supportsSpellcheck', true); |
- languagesPage.set('languages.enabled.0.spellCheckEnabled', true); |
+ // en-US starts with spellcheck enabled, so the secondary row is |
+ // populated. |
assertTrue(triggerRow.classList.contains('two-line')); |
assertLT( |
0, triggerRow.querySelector('.secondary').textContent.length); |
+ |
+ MockInteractions.tap(triggerRow); |
+ Polymer.dom.flush(); |
+ |
+ // Disable spellcheck for en-US. |
+ var spellcheckLanguageToggle = |
+ spellCheckCollapse.querySelector('paper-toggle-button[checked]'); |
+ assertTrue(!!spellcheckLanguageToggle); |
+ MockInteractions.tap(spellcheckLanguageToggle); |
+ assertFalse(spellcheckLanguageToggle.checked); |
+ assertEquals( |
+ 0, |
+ languageHelper.prefs.spellcheck.dictionaries.value.length); |
+ |
+ // Now the secondary row is empty, so it shouldn't be shown. |
+ assertFalse(triggerRow.classList.contains('two-line')); |
+ assertEquals( |
+ 0, triggerRow.querySelector('.secondary').textContent.length); |
} |
}); |
- }.bind(this)); |
- |
- // TODO(michaelpg): Test more aspects of the languages UI. |
+ }); |
- // Run all registered tests. |
- mocha.run(); |
+ return {TestNames: TestNames}; |
}); |