| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 /** @fileoverview Suite of tests for settings-languages-page. */ |
| 6 | 6 |
| 7 /** @const {string} Path to root from chrome/test/data/webui/settings/. */ | 7 /** @const {string} Path to root from chrome/test/data/webui/settings/. */ |
| 8 var ROOT_PATH = '../../../../../'; | 8 var ROOT_PATH = '../../../../../'; |
| 9 | 9 |
| 10 // Polymer BrowserTest fixture. | 10 // Polymer BrowserTest fixture. |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 return new Promise(function(resolve, reject) { | 66 return new Promise(function(resolve, reject) { |
| 67 languagesPage.addEventListener('languages-changed', function changed() { | 67 languagesPage.addEventListener('languages-changed', function changed() { |
| 68 if (languagesPage.languages.enabled.length != numExpected) | 68 if (languagesPage.languages.enabled.length != numExpected) |
| 69 return; | 69 return; |
| 70 resolve(); | 70 resolve(); |
| 71 languagesPage.removeEventListener('languages-changed', changed); | 71 languagesPage.removeEventListener('languages-changed', changed); |
| 72 }); | 72 }); |
| 73 }); | 73 }); |
| 74 } | 74 } |
| 75 | 75 |
| 76 // Returns a supported language that is not enabled, for testing. | 76 // Returns supported languages that are not enabled. |
| 77 function getAvailableLanguage() { | 77 function getAvailableLanguages() { |
| 78 return languagesPage.languages.supported.find(function(language) { | 78 return languagesPage.languages.supported.filter(function(language) { |
| 79 return !languageHelper.isLanguageEnabled(language.code); | 79 return !languageHelper.isLanguageEnabled(language.code); |
| 80 }); | 80 }); |
| 81 } | 81 } |
| 82 | 82 |
| 83 suiteSetup(function() { | 83 suiteSetup(function() { |
| 84 page.set('pageVisibility.languages', true); | 84 page.set('pageVisibility.languages', true); |
| 85 Polymer.dom.flush(); | 85 Polymer.dom.flush(); |
| 86 | 86 |
| 87 languagesSection = assert(this.getSection(page, 'languages')); | 87 languagesSection = assert(this.getSection(page, 'languages')); |
| 88 languagesPage = assert( | 88 languagesPage = assert( |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 MockInteractions.tap(actionButton); | 195 MockInteractions.tap(actionButton); |
| 196 | 196 |
| 197 // Wait for the languages to be enabled by the browser. | 197 // Wait for the languages to be enabled by the browser. |
| 198 return whenNumEnabledLanguagesBecomes(numEnabled + 2); | 198 return whenNumEnabledLanguagesBecomes(numEnabled + 2); |
| 199 }); | 199 }); |
| 200 }); | 200 }); |
| 201 | 201 |
| 202 suite('language menu', function() { | 202 suite('language menu', function() { |
| 203 var origTranslateEnabled; | 203 var origTranslateEnabled; |
| 204 | 204 |
| 205 /** |
| 206 * Finds, asserts and returns the menu item for the given i18n key. |
| 207 * @param {string} i18nKey Name of the i18n string for the item's text. |
| 208 * @return {!HTMLElement} Menu item. |
| 209 */ |
| 210 function getMenuItem(i18nKey) { |
| 211 var i18nString = assert(loadTimeData.getString(i18nKey)); |
| 212 var menuItems = actionMenu.querySelectorAll('.dropdown-item'); |
| 213 var menuItem = Array.from(menuItems).find( |
| 214 item => item.textContent.trim() == i18nString); |
| 215 return assert(menuItem, 'Menu item "' + i18nKey + '" not found'); |
| 216 } |
| 217 |
| 218 /** |
| 219 * Checks the visibility of each expected menu item button. |
| 220 * param {!Object<boolean>} Dictionary from i18n keys to expected |
| 221 * visibility of those menu items. |
| 222 */ |
| 223 function assertMenuItemButtonsVisible(buttonVisibility) { |
| 224 assertTrue(actionMenu.open); |
| 225 for (var buttonKey of Object.keys(buttonVisibility)) { |
| 226 var buttonItem = getMenuItem(buttonKey); |
| 227 assertEquals(!buttonVisibility[buttonKey], buttonItem.hidden, |
| 228 'Menu item "' + buttonKey + '" hidden'); |
| 229 } |
| 230 } |
| 231 |
| 205 suiteSetup(function() { | 232 suiteSetup(function() { |
| 206 // Cache the value of Translate to avoid side effects. | 233 // Cache the value of Translate to avoid side effects. |
| 207 origTranslateEnabled = languageHelper.prefs.translate.enabled.value; | 234 origTranslateEnabled = languageHelper.prefs.translate.enabled.value; |
| 208 }); | 235 }); |
| 209 | 236 |
| 210 suiteTeardown(function() { | 237 suiteTeardown(function() { |
| 211 var cur = languageHelper.prefs.translate.enabled.value; | 238 var cur = languageHelper.prefs.translate.enabled.value; |
| 212 // Restore the value of Translate. | 239 // Restore the value of Translate. |
| 213 languageHelper.setPrefValue('translate.enabled', origTranslateEnabled); | 240 languageHelper.setPrefValue('translate.enabled', origTranslateEnabled); |
| 214 cur = languageHelper.prefs.translate.enabled.value; | 241 cur = languageHelper.prefs.translate.enabled.value; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 languagesPage.set('languages.translateTarget', 'foo'); | 285 languagesPage.set('languages.translateTarget', 'foo'); |
| 259 languagesPage.set('languages.enabled.1.supportsTranslate', true); | 286 languagesPage.set('languages.enabled.1.supportsTranslate', true); |
| 260 | 287 |
| 261 var languageOptionsDropdownTrigger = | 288 var languageOptionsDropdownTrigger = |
| 262 languagesCollapse.querySelectorAll('paper-icon-button')[1]; | 289 languagesCollapse.querySelectorAll('paper-icon-button')[1]; |
| 263 assertTrue(!!languageOptionsDropdownTrigger); | 290 assertTrue(!!languageOptionsDropdownTrigger); |
| 264 MockInteractions.tap(languageOptionsDropdownTrigger); | 291 MockInteractions.tap(languageOptionsDropdownTrigger); |
| 265 assertTrue(actionMenu.open); | 292 assertTrue(actionMenu.open); |
| 266 | 293 |
| 267 // Toggle the translate option. | 294 // Toggle the translate option. |
| 268 var translateOption = actionMenu.querySelector('#offerTranslations'); | 295 var translateOption = getMenuItem('offerToTranslateInThisLanguage'); |
| 269 assertTrue(!!translateOption); | |
| 270 assertFalse(translateOption.disabled); | 296 assertFalse(translateOption.disabled); |
| 271 MockInteractions.tap(translateOption); | 297 MockInteractions.tap(translateOption); |
| 272 | 298 |
| 273 // Menu should stay open briefly. | 299 // Menu should stay open briefly. |
| 274 assertTrue(actionMenu.open); | 300 assertTrue(actionMenu.open); |
| 275 // Guaranteed to run later than the menu close delay. | 301 // Guaranteed to run later than the menu close delay. |
| 276 setTimeout(function() { | 302 setTimeout(function() { |
| 277 assertFalse(actionMenu.open); | 303 assertFalse(actionMenu.open); |
| 278 done(); | 304 done(); |
| 279 }, settings.kMenuCloseDelay + 1); | 305 }, settings.kMenuCloseDelay + 1); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 295 // The language-specific translation option should be hidden. | 321 // The language-specific translation option should be hidden. |
| 296 var translateOption = actionMenu.querySelector('#offerTranslations'); | 322 var translateOption = actionMenu.querySelector('#offerTranslations'); |
| 297 assertTrue(!!translateOption); | 323 assertTrue(!!translateOption); |
| 298 assertTrue(translateOption.hidden); | 324 assertTrue(translateOption.hidden); |
| 299 }); | 325 }); |
| 300 | 326 |
| 301 test('remove language', function() { | 327 test('remove language', function() { |
| 302 var numEnabled = languagesPage.languages.enabled.length; | 328 var numEnabled = languagesPage.languages.enabled.length; |
| 303 | 329 |
| 304 // Enabled a language which we can then disable. | 330 // Enabled a language which we can then disable. |
| 305 var newLanguage = getAvailableLanguage(); | 331 var newLanguage = assert(getAvailableLanguages()[0]); |
| 306 languageHelper.enableLanguage(newLanguage.code); | 332 languageHelper.enableLanguage(newLanguage.code); |
| 307 | 333 |
| 308 // Wait for the language to be enabled. | 334 // Wait for the language to be enabled. |
| 309 return whenNumEnabledLanguagesBecomes(numEnabled + 1).then(function() { | 335 return whenNumEnabledLanguagesBecomes(numEnabled + 1).then(function() { |
| 310 // Populate the dom-repeat. | 336 // Populate the dom-repeat. |
| 311 Polymer.dom.flush(); | 337 Polymer.dom.flush(); |
| 312 | 338 |
| 313 // Find the new language item. | 339 // Find the new language item. |
| 314 var items = languagesCollapse.querySelectorAll('.list-item'); | 340 var items = languagesCollapse.querySelectorAll('.list-item'); |
| 315 var domRepeat = assert( | 341 var domRepeat = assert( |
| 316 languagesCollapse.querySelector('template[is="dom-repeat"]')); | 342 languagesCollapse.querySelector('template[is="dom-repeat"]')); |
| 317 var item = Array.from(items).find(function(el) { | 343 var item = Array.from(items).find(function(el) { |
| 318 return domRepeat.itemForElement(el) && | 344 return domRepeat.itemForElement(el) && |
| 319 domRepeat.itemForElement(el).language == newLanguage; | 345 domRepeat.itemForElement(el).language == newLanguage; |
| 320 }); | 346 }); |
| 321 | 347 |
| 322 // Open the menu and select Remove. | 348 // Open the menu and select Remove. |
| 323 MockInteractions.tap(item.querySelector('paper-icon-button')); | 349 MockInteractions.tap(item.querySelector('paper-icon-button')); |
| 324 | 350 |
| 325 assertTrue(actionMenu.open); | 351 assertTrue(actionMenu.open); |
| 326 var removeMenuItem = assert(actionMenu.querySelector( | 352 var removeMenuItem = getMenuItem('removeLanguage'); |
| 327 '.dropdown-item:last-child')); | |
| 328 assertFalse(removeMenuItem.disabled); | 353 assertFalse(removeMenuItem.disabled); |
| 329 MockInteractions.tap(removeMenuItem); | 354 MockInteractions.tap(removeMenuItem); |
| 330 assertFalse(actionMenu.open); | 355 assertFalse(actionMenu.open); |
| 331 | 356 |
| 332 // We should go back down to the original number of enabled languages. | 357 // We should go back down to the original number of enabled languages. |
| 333 return whenNumEnabledLanguagesBecomes(numEnabled); | 358 return whenNumEnabledLanguagesBecomes(numEnabled); |
| 334 }).then(function() { | 359 }).then(function() { |
| 335 assertFalse(languageHelper.isLanguageEnabled(newLanguage.code)); | 360 assertFalse(languageHelper.isLanguageEnabled(newLanguage.code)); |
| 336 }); | 361 }); |
| 337 }); | 362 }); |
| 363 |
| 364 test('move up/down buttons', function() { |
| 365 // Add several languages. |
| 366 var numEnabled = languagesPage.languages.enabled.length; |
| 367 var available = getAvailableLanguages(); |
| 368 for (var i = 0; i < 4; i++) |
| 369 languageHelper.enableLanguage(assert(available[i]).code); |
| 370 |
| 371 return whenNumEnabledLanguagesBecomes(numEnabled + 4).then(function() { |
| 372 Polymer.dom.flush(); |
| 373 |
| 374 var menuButtons = |
| 375 languagesCollapse.querySelectorAll( |
| 376 '.list-item paper-icon-button[icon="cr:more-vert"]'); |
| 377 |
| 378 // First language should not have "Move up" or "Move to top". |
| 379 MockInteractions.tap(menuButtons[0]); |
| 380 assertMenuItemButtonsVisible({ |
| 381 moveToTop: false, moveUp: false, moveDown: true, |
| 382 }); |
| 383 actionMenu.close(); |
| 384 |
| 385 // Second language should not have "Move up". |
| 386 MockInteractions.tap(menuButtons[1]); |
| 387 assertMenuItemButtonsVisible({ |
| 388 moveToTop: true, moveUp: false, moveDown: true, |
| 389 }); |
| 390 actionMenu.close(); |
| 391 |
| 392 // Middle languages should have all buttons. |
| 393 MockInteractions.tap(menuButtons[2]); |
| 394 assertMenuItemButtonsVisible({ |
| 395 moveToTop: true, moveUp: true, moveDown: true, |
| 396 }); |
| 397 actionMenu.close(); |
| 398 |
| 399 // Last language should not have "Move down". |
| 400 MockInteractions.tap(menuButtons[menuButtons.length - 1]); |
| 401 assertMenuItemButtonsVisible({ |
| 402 moveToTop: true, moveUp: true, moveDown: false, |
| 403 }); |
| 404 actionMenu.close(); |
| 405 }); |
| 406 }); |
| 338 }); | 407 }); |
| 339 | 408 |
| 340 test('manage input methods', function() { | 409 test('manage input methods', function() { |
| 341 var inputMethodsCollapse = languagesPage.$.inputMethodsCollapse; | 410 var inputMethodsCollapse = languagesPage.$.inputMethodsCollapse; |
| 342 var inputMethodSettingsExist = !!inputMethodsCollapse; | 411 var inputMethodSettingsExist = !!inputMethodsCollapse; |
| 343 if (cr.isChromeOS) { | 412 if (cr.isChromeOS) { |
| 344 assertTrue(inputMethodSettingsExist); | 413 assertTrue(inputMethodSettingsExist); |
| 345 var manageInputMethodsButton = | 414 var manageInputMethodsButton = |
| 346 inputMethodsCollapse.querySelector('.list-button:last-of-type'); | 415 inputMethodsCollapse.querySelector('.list-button:last-of-type'); |
| 347 MockInteractions.tap(manageInputMethodsButton); | 416 MockInteractions.tap(manageInputMethodsButton); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 assertTrue(!!languagesPage.$$('settings-edit-dictionary-page')); | 453 assertTrue(!!languagesPage.$$('settings-edit-dictionary-page')); |
| 385 } | 454 } |
| 386 }); | 455 }); |
| 387 }.bind(this)); | 456 }.bind(this)); |
| 388 | 457 |
| 389 // TODO(michaelpg): Test more aspects of the languages UI. | 458 // TODO(michaelpg): Test more aspects of the languages UI. |
| 390 | 459 |
| 391 // Run all registered tests. | 460 // Run all registered tests. |
| 392 mocha.run(); | 461 mocha.run(); |
| 393 }); | 462 }); |
| OLD | NEW |