Index: chrome/test/data/webui/settings/languages_page_browsertest.js |
diff --git a/chrome/test/data/webui/settings/languages_page_browsertest.js b/chrome/test/data/webui/settings/languages_page_browsertest.js |
index d43dc028a04011cba2ea119b172bbb1ffc6560c4..822e002ef1e3e68a0254fe137d794d448e989cfd 100644 |
--- a/chrome/test/data/webui/settings/languages_page_browsertest.js |
+++ b/chrome/test/data/webui/settings/languages_page_browsertest.js |
@@ -51,6 +51,32 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
var languagesSection; |
var languagesPage; |
var languageHelper; |
+ |
+ /** |
+ * @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 a supported language that is not enabled, for testing. |
+ function getAvailableLanguage() { |
+ return languagesPage.languages.supported.find(function(language) { |
+ return !languageHelper.isLanguageEnabled(language.code); |
+ }); |
+ } |
+ |
suiteSetup(function() { |
advanced.set('pageVisibility.languages', true); |
Polymer.dom.flush(); |
@@ -67,19 +93,101 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
teardown(function(done) { |
// Close the section if we're in a sub-page. |
if (settings.getCurrentRoute().isSubpage()) { |
- settings.navigateTo(settings.Route.ADVANCED); |
+ settings.navigateTo(settings.Route.BASIC); |
setTimeout(done); |
} else { |
done(); |
} |
}); |
- test('manage languages', function() { |
- var manageLanguagesButton = |
- languagesPage.$.languagesCollapse.querySelector( |
- '.list-button:last-of-type'); |
- MockInteractions.tap(manageLanguagesButton); |
- assertTrue(!!languagesPage.$$('settings-manage-languages-page')); |
+ suite('add languages dialog', function() { |
+ var dialog; |
+ var dialogItems; |
+ var cancelButton; |
+ var actionButton; |
+ |
+ setup(function(done) { |
+ var addLanguagesButton = languagesPage.$.languagesCollapse |
+ .querySelector('.list-button:last-of-type'); |
+ MockInteractions.tap(addLanguagesButton); |
+ |
+ // The page stamps the dialog and registers listeners asynchronously. |
+ Polymer.Base.async(function() { |
+ dialog = languagesPage.$$('settings-add-languages-dialog'); |
+ assertTrue(!!dialog); |
+ |
+ actionButton = assert(dialog.$$('.action-button')); |
+ cancelButton = assert(dialog.$$('.cancel-button')); |
+ |
+ // The fixed-height dialog's iron-list should stamp far fewer than |
+ // 50 items. |
+ dialogItems = |
+ dialog.$.dialog.querySelectorAll('.list-item:not([hidden])'); |
+ assertGT(dialogItems.length, 1); |
+ assertLT(dialogItems.length, 50); |
+ |
+ // No languages have been checked, so the action button is disabled. |
+ assertTrue(actionButton.disabled); |
+ assertFalse(cancelButton.disabled); |
+ |
+ done(); |
+ }); |
+ }); |
+ |
+ // After every test, check that the dialog is removed from the DOM. |
+ teardown(function() { |
+ Polymer.dom.flush(); |
+ assertEquals(null, languagesPage.$$('settings-add-languages-dialog')); |
+ }); |
+ |
+ test('cancel', function() { |
+ // Canceling the dialog should close and remove it. |
stevenjb
2016/08/24 15:45:18
I gues what is not obvious to me is where this tes
michaelpg
2016/08/24 20:46:41
in teardown: "After every test, check that the dia
|
+ MockInteractions.tap(cancelButton); |
+ }); |
+ |
+ test('add languages and cancel', function(done) { |
+ var numEnabled = languagesPage.languages.enabled.length; |
+ |
+ // Check some languages. |
+ MockInteractions.tap(dialogItems[0]); |
+ MockInteractions.tap(dialogItems[1]); |
+ |
+ // 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); |
+ 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(); |
+ assertEquals(dialog, languagesPage.$$('settings-add-languages-dialog')); |
+ |
+ // Check and uncheck one language. |
+ MockInteractions.tap(dialogItems[0]); |
+ assertFalse(actionButton.disabled); |
+ MockInteractions.tap(dialogItems[0]); |
+ assertTrue(actionButton.disabled); |
+ |
+ // Check multiple languages. |
+ MockInteractions.tap(dialogItems[0]); |
+ MockInteractions.tap(dialogItems[1]); |
+ 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); |
+ }); |
}); |
test('Should not set UI language', function() { |
@@ -94,6 +202,42 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
MockInteractions.tap(languageOptionsDropdownTrigger); |
}); |
+ test('remove language', function() { |
+ var numEnabled = languagesPage.languages.enabled.length; |
+ |
+ // Enabled a language which we can then disable. |
+ var newLanguage = getAvailableLanguage(); |
+ 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 languagesCollapse = languagesPage.$.languagesCollapse; |
+ 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')); |
+ var removeMenuItem = assert(item.querySelector( |
+ '.dropdown-content .dropdown-item:last-of-type')); |
+ assertFalse(removeMenuItem.disabled); |
+ MockInteractions.tap(removeMenuItem); |
+ |
+ // We should go back down to the original number of enabled languages. |
+ return whenNumEnabledLanguagesBecomes(numEnabled).then(function() { |
+ assertFalse(languageHelper.isLanguageEnabled(newLanguage.code)); |
+ }); |
+ }); |
+ }); |
+ |
test('language detail', function() { |
var languagesCollapse = languagesPage.$.languagesCollapse; |
var languageDetailMenuItem = languagesCollapse.querySelectorAll( |
@@ -102,7 +246,7 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
MockInteractions.tap(languageDetailMenuItem); |
var languageDetailPage = |
- languagesPage.$$('settings-language-detail-page'); |
+ languagesPage.$$('settings-language-detail-page'); |
michaelpg
2016/08/23 23:37:07
hmm oops, i'll revert this
|
assertTrue(!!languageDetailPage); |
assertEquals('en-US', languageDetailPage.detail.language.code); |
}); |
@@ -113,7 +257,7 @@ TEST_F('SettingsLanguagesPageBrowserTest', 'MAYBE_LanguagesPage', function() { |
if (cr.isChromeOS) { |
assertTrue(inputMethodSettingsExist); |
var manageInputMethodsButton = |
- inputMethodsCollapse.querySelector('.list-button:last-of-type'); |
+ inputMethodsCollapse.querySelector('.list-button:last-of-type'); |
michaelpg
2016/08/23 23:37:07
and this
|
MockInteractions.tap(manageInputMethodsButton); |
assertTrue(!!languagesPage.$$('settings-manage-input-methods-page')); |
} else { |