Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** @fileoverview Suite of tests for settings-languages-page. */ | 5 cr.define('languages_page_tests', function() { |
| 6 | 6 /** @enum {string} */ |
| 7 /** @const {string} Path to root from chrome/test/data/webui/settings/. */ | 7 const TestNames = { |
|
dpapad
2017/04/25 20:41:17
See other comment in this file about ES6 usage.
michaelpg
2017/05/04 22:54:19
Acknowledged.
| |
| 8 var ROOT_PATH = '../../../../../'; | 8 AddLanguagesDialog: 'add languages dialog', |
| 9 | 9 LanguageMenu: 'language menu', |
| 10 // Polymer BrowserTest fixture. | 10 InputMethods: 'input methods', |
| 11 GEN_INCLUDE( | 11 Spellcheck: 'spellcheck', |
| 12 [ROOT_PATH + 'chrome/test/data/webui/polymer_browser_test_base.js']); | 12 }; |
| 13 // SettingsPageBrowserTest fixture. | |
| 14 GEN_INCLUDE([ROOT_PATH + | |
| 15 'chrome/test/data/webui/settings/settings_page_browsertest.js']); | |
| 16 | |
| 17 /** | |
| 18 * Test class for settings-languages-page UI. | |
| 19 * @constructor | |
| 20 * @extends {SettingsPageBrowserTest} | |
| 21 */ | |
| 22 function SettingsLanguagesPageBrowserTest() {} | |
| 23 | |
| 24 SettingsLanguagesPageBrowserTest.prototype = { | |
| 25 __proto__: SettingsPageBrowserTest.prototype, | |
| 26 | |
| 27 /** @override */ | |
| 28 preLoad: function() { | |
| 29 SettingsPageBrowserTest.prototype.preLoad.call(this); | |
| 30 settingsHidePagesByDefaultForTest = true; | |
| 31 }, | |
| 32 }; | |
| 33 | |
| 34 // Flaky on Windows, Mac and Linux. See https://crbug.com/641400. | |
| 35 // | |
| 36 // May time out on debug builders and memory bots because the Settings page can | |
| 37 // take several seconds to load in a Release build and several times that in a | |
| 38 // Debug build. See https://crbug.com/558434. | |
| 39 // | |
| 40 // Disabling this test in general. | |
| 41 GEN('#define MAYBE_LanguagesPage DISABLED_LanguagesPage'); | |
| 42 | |
| 43 // Runs languages page tests. | |
| 44 TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { | |
| 45 var self = this; | |
| 46 | |
| 47 suiteSetup(function() { | |
| 48 self.toggleAdvanced(); | |
| 49 }); | |
| 50 | 13 |
| 51 suite('languages page', function() { | 14 suite('languages page', function() { |
| 52 testing.Test.disableAnimationsAndTransitions(); | 15 /** @type {?LanguageHelper} */ |
| 16 var languageHelper = null; | |
| 17 /** @type {?SettingsLanguagesPageElement} */ | |
| 18 var languagesPage = null; | |
| 19 /** @type {?IronCollapseElement} */ | |
| 20 var languagesCollapse = null; | |
| 21 /** @type {?CrActionMenuElement} */ | |
| 22 var actionMenu = null; | |
| 23 /** @type {?settings.LanguagesBrowserProxy} */ | |
| 24 var browserProxy = null; | |
| 53 | 25 |
| 54 var languagesSection; | 26 // Enabled language pref name for the platform. |
| 55 var languagesPage; | 27 const languagesPref = |
| 56 var languagesCollapse; | 28 cr.isChromeOS ? 'settings.language.preferred_languages' |
| 57 var languageHelper; | 29 : 'intl.accept_languages'; |
| 58 var actionMenu; | |
| 59 | 30 |
| 60 /** | 31 // Initial value of enabled languages pref used in tests. |
| 61 * @param {numExpected} Expected number of languages to eventually be | 32 const initialLanguages = 'en-US,sw'; |
| 62 * enabled. | |
| 63 * @return {!Promise} Resolved when the number of enabled languages changes | |
| 64 * to match expectations. | |
| 65 */ | |
| 66 function whenNumEnabledLanguagesBecomes(numExpected) { | |
| 67 assert(!!languagesPage); | |
| 68 return new Promise(function(resolve, reject) { | |
| 69 languagesPage.addEventListener('languages-changed', function changed() { | |
| 70 if (languagesPage.languages.enabled.length != numExpected) | |
| 71 return; | |
| 72 resolve(); | |
| 73 languagesPage.removeEventListener('languages-changed', changed); | |
| 74 }); | |
| 75 }); | |
| 76 } | |
| 77 | |
| 78 // Returns supported languages that are not enabled. | |
| 79 function getAvailableLanguages() { | |
| 80 return languagesPage.languages.supported.filter(function(language) { | |
| 81 return !languageHelper.isLanguageEnabled(language.code); | |
| 82 }); | |
| 83 } | |
| 84 | 33 |
| 85 suiteSetup(function() { | 34 suiteSetup(function() { |
| 86 var page = self.basicPage; | 35 testing.Test.disableAnimationsAndTransitions(); |
| 87 page.set('pageVisibility.languages', true); | 36 PolymerTest.clearBody(); |
| 88 Polymer.dom.flush(); | 37 CrSettingsPrefs.deferInitialization = true; |
| 89 | |
| 90 languagesSection = assert(this.getSection(page, 'languages')); | |
| 91 languagesPage = assert( | |
| 92 languagesSection.querySelector('settings-languages-page')); | |
| 93 languagesCollapse = languagesPage.$.languagesCollapse; | |
| 94 languagesCollapse.opened = true; | |
| 95 actionMenu = languagesPage.$.menu.get(); | |
| 96 | |
| 97 languageHelper = languagesPage.languageHelper; | |
| 98 return languageHelper.whenReady(); | |
| 99 }.bind(this)); | |
| 100 | |
| 101 teardown(function(done) { | |
| 102 if (actionMenu.open) | |
| 103 actionMenu.close(); | |
| 104 | |
| 105 // Close the section if we're in a sub-page. | |
| 106 if (settings.getCurrentRoute().isSubpage()) { | |
| 107 settings.navigateTo(settings.Route.BASIC); | |
| 108 setTimeout(done); | |
| 109 } else { | |
| 110 done(); | |
| 111 } | |
| 112 }); | 38 }); |
| 113 | 39 |
| 114 suite('add languages dialog', function() { | 40 setup(function() { |
| 41 var settingsPrefs = document.createElement('settings-prefs'); | |
| 42 var settingsPrivate = | |
| 43 new settings.FakeSettingsPrivate(settings.getFakeLanguagePrefs()); | |
| 44 settingsPrefs.initialize(settingsPrivate); | |
| 45 document.body.appendChild(settingsPrefs); | |
| 46 return CrSettingsPrefs.initialized.then(function() { | |
| 47 // Set up test browser proxy. | |
| 48 browserProxy = new settings.TestLanguagesBrowserProxy(); | |
| 49 settings.LanguagesBrowserProxyImpl.instance_ = browserProxy; | |
| 50 | |
| 51 // Set up fake languageSettingsPrivate API. | |
| 52 var languageSettingsPrivate = browserProxy.getLanguageSettingsPrivate(); | |
| 53 languageSettingsPrivate.setSettingsPrefs(settingsPrefs); | |
| 54 | |
| 55 languagesPage = document.createElement('settings-languages-page'); | |
| 56 | |
| 57 // Prefs would normally be data-bound to settings-languages-page. | |
| 58 languagesPage.prefs = settingsPrefs.prefs; | |
| 59 test_util.fakeDataBind(settingsPrefs, languagesPage, 'prefs'); | |
| 60 | |
| 61 document.body.appendChild(languagesPage); | |
| 62 languagesCollapse = languagesPage.$.languagesCollapse; | |
| 63 languagesCollapse.opened = true; | |
| 64 actionMenu = languagesPage.$.menu.get(); | |
| 65 | |
| 66 languageHelper = languagesPage.languageHelper; | |
| 67 return languageHelper.whenReady(); | |
| 68 }); | |
| 69 }); | |
| 70 | |
| 71 teardown(function() { | |
| 72 PolymerTest.clearBody(); | |
| 73 }); | |
| 74 | |
| 75 suite(TestNames.AddLanguagesDialog, function() { | |
| 115 var dialog; | 76 var dialog; |
| 116 var dialogItems; | 77 var dialogItems; |
| 117 var cancelButton; | 78 var cancelButton; |
| 118 var actionButton; | 79 var actionButton; |
| 119 | 80 |
| 120 setup(function(done) { | 81 setup(function(done) { |
| 121 var addLanguagesButton = | 82 var addLanguagesButton = |
| 122 languagesCollapse.querySelector('#addLanguages'); | 83 languagesCollapse.querySelector('#addLanguages'); |
| 123 MockInteractions.tap(addLanguagesButton); | 84 MockInteractions.tap(addLanguagesButton); |
| 124 | 85 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 151 Polymer.dom.flush(); | 112 Polymer.dom.flush(); |
| 152 assertEquals(null, languagesPage.$$('settings-add-languages-dialog')); | 113 assertEquals(null, languagesPage.$$('settings-add-languages-dialog')); |
| 153 }); | 114 }); |
| 154 | 115 |
| 155 test('cancel', function() { | 116 test('cancel', function() { |
| 156 // Canceling the dialog should close and remove it. | 117 // Canceling the dialog should close and remove it. |
| 157 MockInteractions.tap(cancelButton); | 118 MockInteractions.tap(cancelButton); |
| 158 }); | 119 }); |
| 159 | 120 |
| 160 test('add languages and cancel', function(done) { | 121 test('add languages and cancel', function(done) { |
| 161 var numEnabled = languagesPage.languages.enabled.length; | |
| 162 | |
| 163 // Check some languages. | 122 // Check some languages. |
| 164 MockInteractions.tap(dialogItems[0]); | 123 MockInteractions.tap(dialogItems[1]); // en-CA. |
| 165 MockInteractions.tap(dialogItems[1]); | 124 MockInteractions.tap(dialogItems[2]); // tk. |
| 166 | 125 |
| 167 // Canceling the dialog should close and remove it without enabling | 126 // Canceling the dialog should close and remove it without enabling |
| 168 // the checked languages. A small timeout lets us check this. | 127 // the checked languages. A small timeout lets us check this. |
| 169 MockInteractions.tap(cancelButton); | 128 MockInteractions.tap(cancelButton); |
| 170 setTimeout(function() { | 129 setTimeout(function() { |
| 171 // Number of enabled languages should be the same. | 130 assertEquals(initialLanguages, |
| 172 assertEquals(numEnabled, languagesPage.languages.enabled.length); | 131 languageHelper.getPref(languagesPref).value); |
| 173 done(); | 132 done(); |
| 174 }, 100); | 133 }, 100); |
| 175 }); | 134 }); |
| 176 | 135 |
| 177 test('add languages and confirm', function() { | 136 test('add languages and confirm', function() { |
| 178 var numEnabled = languagesPage.languages.enabled.length; | |
| 179 | |
| 180 // No languages have been checked, so the action button is inert. | 137 // No languages have been checked, so the action button is inert. |
| 181 MockInteractions.tap(actionButton); | 138 MockInteractions.tap(actionButton); |
| 182 Polymer.dom.flush(); | 139 Polymer.dom.flush(); |
| 183 assertEquals(dialog, languagesPage.$$('settings-add-languages-dialog')); | 140 assertEquals(dialog, languagesPage.$$('settings-add-languages-dialog')); |
| 184 | 141 |
| 185 // Check and uncheck one language. | 142 // Check and uncheck one language. |
| 186 MockInteractions.tap(dialogItems[0]); | 143 MockInteractions.tap(dialogItems[0]); |
| 187 assertFalse(actionButton.disabled); | 144 assertFalse(actionButton.disabled); |
| 188 MockInteractions.tap(dialogItems[0]); | 145 MockInteractions.tap(dialogItems[0]); |
| 189 assertTrue(actionButton.disabled); | 146 assertTrue(actionButton.disabled); |
| 190 | 147 |
| 191 // Check multiple languages. | 148 // Check multiple languages. |
| 192 MockInteractions.tap(dialogItems[0]); | 149 MockInteractions.tap(dialogItems[0]); // en. |
| 193 MockInteractions.tap(dialogItems[1]); | 150 MockInteractions.tap(dialogItems[2]); // tk. |
| 194 assertFalse(actionButton.disabled); | 151 assertFalse(actionButton.disabled); |
| 195 | 152 |
| 196 // The action button should close and remove the dialog, enabling the | 153 // The action button should close and remove the dialog, enabling the |
| 197 // checked languages. | 154 // checked languages. |
| 198 MockInteractions.tap(actionButton); | 155 MockInteractions.tap(actionButton); |
| 199 | 156 |
| 200 // Wait for the languages to be enabled by the browser. | 157 assertEquals( |
| 201 return whenNumEnabledLanguagesBecomes(numEnabled + 2); | 158 initialLanguages + ',en,tk', |
| 159 languageHelper.getPref(languagesPref).value); | |
| 202 }); | 160 }); |
| 203 }); | 161 }); |
| 204 | 162 |
| 205 suite('language menu', function() { | 163 suite(TestNames.LanguageMenu, function() { |
| 206 var origTranslateEnabled; | 164 /* |
| 207 | |
| 208 /** | |
| 209 * Finds, asserts and returns the menu item for the given i18n key. | 165 * Finds, asserts and returns the menu item for the given i18n key. |
| 210 * @param {string} i18nKey Name of the i18n string for the item's text. | 166 * @param {string} i18nKey Name of the i18n string for the item's text. |
| 211 * @return {!HTMLElement} Menu item. | 167 * @return {!HTMLElement} Menu item. |
| 212 */ | 168 */ |
| 213 function getMenuItem(i18nKey) { | 169 function getMenuItem(i18nKey) { |
| 214 var i18nString = assert(loadTimeData.getString(i18nKey)); | 170 var i18nString = assert(loadTimeData.getString(i18nKey)); |
| 215 var menuItems = actionMenu.querySelectorAll('.dropdown-item'); | 171 var menuItems = actionMenu.querySelectorAll('.dropdown-item'); |
| 216 var menuItem = Array.from(menuItems).find( | 172 var menuItem = Array.from(menuItems).find( |
| 217 item => item.textContent.trim() == i18nString); | 173 item => item.textContent.trim() == i18nString); |
| 218 return assert(menuItem, 'Menu item "' + i18nKey + '" not found'); | 174 return assert(menuItem, 'Menu item "' + i18nKey + '" not found'); |
| 219 } | 175 } |
| 220 | 176 |
| 221 /** | 177 /* |
| 222 * Checks the visibility of each expected menu item button. | 178 * Checks the visibility of each expected menu item button. |
| 223 * param {!Object<boolean>} Dictionary from i18n keys to expected | 179 * param {!Object<boolean>} Dictionary from i18n keys to expected |
| 224 * visibility of those menu items. | 180 * visibility of those menu items. |
| 225 */ | 181 */ |
| 226 function assertMenuItemButtonsVisible(buttonVisibility) { | 182 function assertMenuItemButtonsVisible(buttonVisibility) { |
| 227 assertTrue(actionMenu.open); | 183 assertTrue(actionMenu.open); |
| 228 for (var buttonKey of Object.keys(buttonVisibility)) { | 184 for (var buttonKey of Object.keys(buttonVisibility)) { |
| 229 var buttonItem = getMenuItem(buttonKey); | 185 var buttonItem = getMenuItem(buttonKey); |
| 230 assertEquals(!buttonVisibility[buttonKey], buttonItem.hidden, | 186 assertEquals(!buttonVisibility[buttonKey], buttonItem.hidden, |
| 231 'Menu item "' + buttonKey + '" hidden'); | 187 'Menu item "' + buttonKey + '" hidden'); |
| 232 } | 188 } |
| 233 } | 189 } |
| 234 | 190 |
| 235 suiteSetup(function() { | |
| 236 // Cache the value of Translate to avoid side effects. | |
| 237 origTranslateEnabled = languageHelper.prefs.translate.enabled.value; | |
| 238 }); | |
| 239 | |
| 240 suiteTeardown(function() { | |
| 241 var cur = languageHelper.prefs.translate.enabled.value; | |
| 242 // Restore the value of Translate. | |
| 243 languageHelper.setPrefValue('translate.enabled', origTranslateEnabled); | |
| 244 cur = languageHelper.prefs.translate.enabled.value; | |
| 245 }); | |
| 246 | |
| 247 test('structure', function() { | 191 test('structure', function() { |
| 248 var languageOptionsDropdownTrigger = languagesCollapse.querySelector( | 192 var languageOptionsDropdownTrigger = languagesCollapse.querySelector( |
| 249 'paper-icon-button'); | 193 'paper-icon-button'); |
| 250 assertTrue(!!languageOptionsDropdownTrigger); | 194 assertTrue(!!languageOptionsDropdownTrigger); |
| 251 MockInteractions.tap(languageOptionsDropdownTrigger); | 195 MockInteractions.tap(languageOptionsDropdownTrigger); |
| 252 assertTrue(actionMenu.open); | 196 assertTrue(actionMenu.open); |
| 253 | 197 |
| 254 // Enable Translate so the menu always shows the Translate checkbox. | |
| 255 languageHelper.setPrefValue('translate.enabled', true); | |
| 256 | |
| 257 var separator = actionMenu.querySelector('hr'); | 198 var separator = actionMenu.querySelector('hr'); |
| 258 assertEquals(1, separator.offsetHeight); | 199 assertEquals(1, separator.offsetHeight); |
| 259 | 200 |
| 260 // Disable Translate. On platforms that can't change the UI language, | 201 // Disable Translate. On platforms that can't change the UI language, |
| 261 // this hides all the checkboxes, so the separator isn't needed. | 202 // this hides all the checkboxes, so the separator isn't needed. |
| 262 // Chrome OS and Windows still show a checkbox and thus the separator. | 203 // Chrome OS and Windows still show a checkbox and thus the separator. |
| 263 languageHelper.setPrefValue('translate.enabled', false); | 204 languageHelper.setPrefValue('translate.enabled', false); |
| 264 assertEquals( | 205 assertEquals( |
| 265 cr.isChromeOS || cr.isWindows ? 1 : 0, separator.offsetHeight); | 206 cr.isChromeOS || cr.isWindows ? 1 : 0, separator.offsetHeight); |
| 266 }); | 207 }); |
| 267 | 208 |
| 268 test('test translate.enable toggle', function() { | 209 test('test translate.enable toggle', function() { |
| 269 languageHelper.setPrefValue('translate.enabled', true); | 210 var settingsToggle = languagesPage.$.offerTranslateOtherLangs; |
| 270 var toggle = languagesPage.$.offerTranslateOtherLangs.root | 211 assertTrue(!!settingsToggle); |
| 271 .querySelectorAll('paper-toggle-button')[0]; | 212 var paperToggle = settingsToggle.$$('paper-toggle-button'); |
| 272 assertTrue(!!toggle); | 213 assertTrue(!!paperToggle); |
| 273 | 214 |
| 274 // Clicking on toggle switch it to false. | 215 // Clicking on the toggle switches it to false. |
| 275 MockInteractions.tap(toggle); | 216 MockInteractions.tap(paperToggle); |
|
dpapad
2017/04/25 20:41:17
Is taping the internal paper-toggle necessary? Wou
michaelpg
2017/05/04 22:54:19
Yes, it's necessary; nothing forwards the mock tap
| |
| 276 var newToggleValue = languageHelper.prefs.translate.enabled.value; | 217 var newToggleValue = languageHelper.prefs.translate.enabled.value; |
| 277 assertFalse(newToggleValue); | 218 assertFalse(newToggleValue); |
| 278 | 219 |
| 279 // Clicking on toggle switch it to true again. | 220 // Clicking on the toggle switches it to true again. |
| 280 MockInteractions.tap(toggle); | 221 MockInteractions.tap(paperToggle); |
| 281 newToggleValue = languageHelper.prefs.translate.enabled.value; | 222 newToggleValue = languageHelper.prefs.translate.enabled.value; |
| 282 assertTrue(newToggleValue); | 223 assertTrue(newToggleValue); |
| 283 }); | 224 }); |
| 284 | 225 |
| 285 test('toggle translate for a specific language', function(done) { | 226 test('toggle translate for a specific language', function(done) { |
| 286 // Enable Translate so the menu always shows the Translate checkbox. | 227 // Open options for 'sw'. |
| 287 languageHelper.setPrefValue('translate.enabled', true); | |
| 288 languagesPage.set('languages.translateTarget', 'foo'); | |
| 289 languagesPage.set('languages.enabled.1.supportsTranslate', true); | |
| 290 | |
| 291 var languageOptionsDropdownTrigger = | 228 var languageOptionsDropdownTrigger = |
| 292 languagesCollapse.querySelectorAll('paper-icon-button')[1]; | 229 languagesCollapse.querySelectorAll('paper-icon-button')[1]; |
| 293 assertTrue(!!languageOptionsDropdownTrigger); | 230 assertTrue(!!languageOptionsDropdownTrigger); |
| 294 MockInteractions.tap(languageOptionsDropdownTrigger); | 231 MockInteractions.tap(languageOptionsDropdownTrigger); |
| 295 assertTrue(actionMenu.open); | 232 assertTrue(actionMenu.open); |
| 296 | 233 |
| 297 // Toggle the translate option. | 234 // 'sw' supports translate to the target language ('en'). |
| 298 var translateOption = getMenuItem('offerToTranslateInThisLanguage'); | 235 var translateOption = getMenuItem('offerToTranslateInThisLanguage'); |
| 299 assertFalse(translateOption.disabled); | 236 assertFalse(translateOption.disabled); |
| 237 assertTrue(translateOption.checked); | |
| 238 | |
| 239 // Toggle the translate option. | |
| 300 MockInteractions.tap(translateOption); | 240 MockInteractions.tap(translateOption); |
| 301 | 241 |
| 302 // Menu should stay open briefly. | 242 // Menu should stay open briefly. |
| 303 assertTrue(actionMenu.open); | 243 assertTrue(actionMenu.open); |
| 304 // Guaranteed to run later than the menu close delay. | 244 // Guaranteed to run later than the menu close delay. |
| 305 setTimeout(function() { | 245 setTimeout(function() { |
| 306 assertFalse(actionMenu.open); | 246 assertFalse(actionMenu.open); |
| 247 assertDeepEquals( | |
| 248 ['en-US', 'sw'], | |
| 249 languageHelper.prefs.translate_blocked_languages.value); | |
| 307 done(); | 250 done(); |
| 308 }, settings.kMenuCloseDelay + 1); | 251 }, settings.kMenuCloseDelay + 1); |
| 309 }); | 252 }); |
| 310 | 253 |
| 311 test('disable translate hides language-specific option', function() { | 254 test('disable translate hides language-specific option', function() { |
| 312 // Disables translate. | 255 // Disables translate. |
| 313 languageHelper.setPrefValue('translate.enabled', false); | 256 languageHelper.setPrefValue('translate.enabled', false); |
| 314 languagesPage.set('languages.translateTarget', 'foo'); | |
| 315 languagesPage.set('languages.enabled.1.supportsTranslate', true); | |
| 316 | 257 |
| 317 // Makes sure language-specific menu exists. | 258 // Open options for 'sw'. |
| 318 var languageOptionsDropdownTrigger = | 259 var languageOptionsDropdownTrigger = |
| 319 languagesCollapse.querySelectorAll('paper-icon-button')[1]; | 260 languagesCollapse.querySelectorAll('paper-icon-button')[1]; |
| 320 assertTrue(!!languageOptionsDropdownTrigger); | 261 assertTrue(!!languageOptionsDropdownTrigger); |
| 321 MockInteractions.tap(languageOptionsDropdownTrigger); | 262 MockInteractions.tap(languageOptionsDropdownTrigger); |
| 322 assertTrue(actionMenu.open); | 263 assertTrue(actionMenu.open); |
| 323 | 264 |
| 324 // The language-specific translation option should be hidden. | 265 // The language-specific translation option should be hidden. |
| 325 var translateOption = actionMenu.querySelector('#offerTranslations'); | 266 var translateOption = actionMenu.querySelector('#offerTranslations'); |
| 326 assertTrue(!!translateOption); | 267 assertTrue(!!translateOption); |
| 327 assertTrue(translateOption.hidden); | 268 assertTrue(translateOption.hidden); |
| 328 }); | 269 }); |
| 329 | 270 |
| 330 test('remove language', function() { | 271 test('remove language', function() { |
| 331 var numEnabled = languagesPage.languages.enabled.length; | 272 // Enable a language which we can then disable. |
| 273 languageHelper.enableLanguage('no'); | |
| 332 | 274 |
| 333 // Enabled a language which we can then disable. | 275 // Populate the dom-repeat. |
| 334 var newLanguage = assert(getAvailableLanguages()[0]); | 276 Polymer.dom.flush(); |
| 335 languageHelper.enableLanguage(newLanguage.code); | |
| 336 | 277 |
| 337 // Wait for the language to be enabled. | 278 // Find the new language item. |
| 338 return whenNumEnabledLanguagesBecomes(numEnabled + 1).then(function() { | 279 var items = languagesCollapse.querySelectorAll('.list-item'); |
| 339 // Populate the dom-repeat. | 280 var domRepeat = assert( |
| 340 Polymer.dom.flush(); | 281 languagesCollapse.querySelector('template[is="dom-repeat"]')); |
| 282 var item = Array.from(items).find(function(el) { | |
| 283 return domRepeat.itemForElement(el) && | |
| 284 domRepeat.itemForElement(el).language.code == 'no'; | |
| 285 }); | |
| 341 | 286 |
| 342 // Find the new language item. | 287 // Open the menu and select Remove. |
| 343 var items = languagesCollapse.querySelectorAll('.list-item'); | 288 MockInteractions.tap(item.querySelector('paper-icon-button')); |
| 344 var domRepeat = assert( | |
| 345 languagesCollapse.querySelector('template[is="dom-repeat"]')); | |
| 346 var item = Array.from(items).find(function(el) { | |
| 347 return domRepeat.itemForElement(el) && | |
| 348 domRepeat.itemForElement(el).language == newLanguage; | |
| 349 }); | |
| 350 | 289 |
| 351 // Open the menu and select Remove. | 290 assertTrue(actionMenu.open); |
| 352 MockInteractions.tap(item.querySelector('paper-icon-button')); | 291 var removeMenuItem = getMenuItem('removeLanguage'); |
| 292 assertFalse(removeMenuItem.disabled); | |
| 293 MockInteractions.tap(removeMenuItem); | |
| 294 assertFalse(actionMenu.open); | |
| 353 | 295 |
| 354 assertTrue(actionMenu.open); | 296 assertEquals( |
| 355 var removeMenuItem = getMenuItem('removeLanguage'); | 297 initialLanguages, languageHelper.getPref(languagesPref).value); |
| 356 assertFalse(removeMenuItem.disabled); | |
| 357 MockInteractions.tap(removeMenuItem); | |
| 358 assertFalse(actionMenu.open); | |
| 359 | |
| 360 // We should go back down to the original number of enabled languages. | |
| 361 return whenNumEnabledLanguagesBecomes(numEnabled); | |
| 362 }).then(function() { | |
| 363 assertFalse(languageHelper.isLanguageEnabled(newLanguage.code)); | |
| 364 }); | |
| 365 }); | 298 }); |
| 366 | 299 |
| 367 test('move up/down buttons', function() { | 300 test('move up/down buttons', function() { |
| 368 // Add several languages. | 301 // Add several languages. |
| 369 var numEnabled = languagesPage.languages.enabled.length; | 302 for (var language of ['en-CA', 'en-US', 'tk', 'no']) |
|
dpapad
2017/04/25 20:41:17
Technically the guide at https://chromium.googleso
michaelpg
2017/05/04 22:54:19
As discussed in standup, since our tests already u
| |
| 370 var available = getAvailableLanguages(); | 303 languageHelper.enableLanguage(language); |
| 371 for (var i = 0; i < 4; i++) | |
| 372 languageHelper.enableLanguage(assert(available[i]).code); | |
| 373 | 304 |
| 374 return whenNumEnabledLanguagesBecomes(numEnabled + 4).then(function() { | 305 Polymer.dom.flush(); |
| 375 Polymer.dom.flush(); | |
| 376 | 306 |
| 377 var menuButtons = | 307 var menuButtons = |
| 378 languagesCollapse.querySelectorAll( | 308 languagesCollapse.querySelectorAll( |
| 379 '.list-item paper-icon-button[icon="cr:more-vert"]'); | 309 '.list-item paper-icon-button[icon="cr:more-vert"]'); |
| 380 | 310 |
| 381 // First language should not have "Move up" or "Move to top". | 311 // First language should not have "Move up" or "Move to top". |
| 382 MockInteractions.tap(menuButtons[0]); | 312 MockInteractions.tap(menuButtons[0]); |
| 383 assertMenuItemButtonsVisible({ | 313 assertMenuItemButtonsVisible({ |
| 384 moveToTop: false, moveUp: false, moveDown: true, | 314 moveToTop: false, moveUp: false, moveDown: true, |
| 385 }); | 315 }); |
| 386 actionMenu.close(); | 316 actionMenu.close(); |
| 387 | 317 |
| 388 // Second language should not have "Move up". | 318 // Second language should not have "Move up". |
| 389 MockInteractions.tap(menuButtons[1]); | 319 MockInteractions.tap(menuButtons[1]); |
| 390 assertMenuItemButtonsVisible({ | 320 assertMenuItemButtonsVisible({ |
| 391 moveToTop: true, moveUp: false, moveDown: true, | 321 moveToTop: true, moveUp: false, moveDown: true, |
| 392 }); | 322 }); |
| 393 actionMenu.close(); | 323 actionMenu.close(); |
| 394 | 324 |
| 395 // Middle languages should have all buttons. | 325 // Middle languages should have all buttons. |
| 396 MockInteractions.tap(menuButtons[2]); | 326 MockInteractions.tap(menuButtons[2]); |
| 397 assertMenuItemButtonsVisible({ | 327 assertMenuItemButtonsVisible({ |
| 398 moveToTop: true, moveUp: true, moveDown: true, | 328 moveToTop: true, moveUp: true, moveDown: true, |
| 399 }); | 329 }); |
| 400 actionMenu.close(); | 330 actionMenu.close(); |
| 401 | 331 |
| 402 // Last language should not have "Move down". | 332 // Last language should not have "Move down". |
| 403 MockInteractions.tap(menuButtons[menuButtons.length - 1]); | 333 MockInteractions.tap(menuButtons[menuButtons.length - 1]); |
| 404 assertMenuItemButtonsVisible({ | 334 assertMenuItemButtonsVisible({ |
| 405 moveToTop: true, moveUp: true, moveDown: false, | 335 moveToTop: true, moveUp: true, moveDown: false, |
| 406 }); | |
| 407 actionMenu.close(); | |
| 408 }); | 336 }); |
| 337 actionMenu.close(); | |
| 409 }); | 338 }); |
| 410 }); | 339 }); |
| 411 | 340 |
| 412 test('manage input methods', function() { | 341 test(TestNames.InputMethods, function() { |
| 413 var inputMethodsCollapse = languagesPage.$.inputMethodsCollapse; | 342 var inputMethodsCollapse = languagesPage.$.inputMethodsCollapse; |
| 414 var inputMethodSettingsExist = !!inputMethodsCollapse; | 343 var inputMethodSettingsExist = !!inputMethodsCollapse; |
| 415 if (cr.isChromeOS) { | 344 if (cr.isChromeOS) { |
| 416 assertTrue(inputMethodSettingsExist); | 345 assertTrue(inputMethodSettingsExist); |
| 417 var manageInputMethodsButton = | 346 var manageInputMethodsButton = |
| 418 inputMethodsCollapse.querySelector('#manageInputMethods'); | 347 inputMethodsCollapse.querySelector('#manageInputMethods'); |
| 419 MockInteractions.tap(manageInputMethodsButton); | 348 MockInteractions.tap(manageInputMethodsButton); |
| 420 assertTrue(!!languagesPage.$$('settings-manage-input-methods-page')); | 349 assertTrue(!!languagesPage.$$('settings-manage-input-methods-page')); |
| 421 } else { | 350 } else { |
| 422 assertFalse(inputMethodSettingsExist); | 351 assertFalse(inputMethodSettingsExist); |
| 423 } | 352 } |
| 424 }); | 353 }); |
| 425 | 354 |
| 426 test('spellcheck', function() { | 355 test(TestNames.Spellcheck, function() { |
| 427 var spellCheckCollapse = languagesPage.$.spellCheckCollapse; | 356 var spellCheckCollapse = languagesPage.$.spellCheckCollapse; |
| 428 var spellCheckSettingsExist = !!spellCheckCollapse; | 357 var spellCheckSettingsExist = !!spellCheckCollapse; |
| 429 if (cr.isMac) { | 358 if (cr.isMac) { |
| 430 assertFalse(spellCheckSettingsExist); | 359 assertFalse(spellCheckSettingsExist); |
| 431 } else { | 360 } else { |
| 432 assertTrue(spellCheckSettingsExist); | 361 assertTrue(spellCheckSettingsExist); |
| 433 | 362 |
| 434 // Ensure no language has spell check enabled. | 363 // The row button should have a secondary row specifying which language |
| 435 for (var i = 0; i < languagesPage.languages.enabled.length; i++) { | 364 // spell check is enabled for. |
| 436 languagesPage.set( | 365 var triggerRow = languagesPage.$.spellCheckSubpageTrigger; |
| 437 'languages.enabled.' + i + '.spellCheckEnabled', false); | |
| 438 } | |
| 439 | 366 |
| 440 // The row button should have the extra row only if some language has | 367 // en-US starts with spellcheck enabled, so the secondary row is |
| 441 // spell check enabled. | 368 // populated. |
| 442 var triggerRow = languagesPage.$.spellCheckSubpageTrigger; | 369 assertTrue(triggerRow.classList.contains('two-line')); |
| 370 assertLT( | |
| 371 0, triggerRow.querySelector('.secondary').textContent.length); | |
| 372 | |
| 373 MockInteractions.tap(triggerRow); | |
| 374 Polymer.dom.flush(); | |
| 375 | |
| 376 // Disable spellcheck for en-US. | |
| 377 var spellcheckLanguageToggle = | |
| 378 spellCheckCollapse.querySelector('paper-toggle-button[checked]'); | |
| 379 assertTrue(!!spellcheckLanguageToggle); | |
| 380 MockInteractions.tap(spellcheckLanguageToggle); | |
| 381 assertFalse(spellcheckLanguageToggle.checked); | |
| 382 assertEquals( | |
| 383 0, | |
| 384 languageHelper.prefs.spellcheck.dictionaries.value.length); | |
| 385 | |
| 386 // Now the secondary row is empty, so it shouldn't be shown. | |
| 443 assertFalse(triggerRow.classList.contains('two-line')); | 387 assertFalse(triggerRow.classList.contains('two-line')); |
| 444 assertEquals( | 388 assertEquals( |
| 445 0, triggerRow.querySelector('.secondary').textContent.length); | 389 0, triggerRow.querySelector('.secondary').textContent.length); |
| 446 | |
| 447 languagesPage.set( | |
| 448 'languages.enabled.0.language.supportsSpellcheck', true); | |
| 449 languagesPage.set('languages.enabled.0.spellCheckEnabled', true); | |
| 450 assertTrue(triggerRow.classList.contains('two-line')); | |
| 451 assertLT( | |
| 452 0, triggerRow.querySelector('.secondary').textContent.length); | |
| 453 } | 390 } |
| 454 }); | 391 }); |
| 455 }.bind(this)); | 392 }); |
| 456 | 393 |
| 457 // TODO(michaelpg): Test more aspects of the languages UI. | 394 return {TestNames: TestNames}; |
| 458 | |
| 459 // Run all registered tests. | |
| 460 mocha.run(); | |
| 461 }); | 395 }); |
| OLD | NEW |