Index: chrome/test/data/webui/settings/languages_page_tests.js |
diff --git a/chrome/test/data/webui/settings/languages_page_tests.js b/chrome/test/data/webui/settings/languages_page_tests.js |
index 8bccfad534280762cb873ba0299faaa60d106d9c..5779f861ded7d23de51d0340d5639440e31ecef0 100644 |
--- a/chrome/test/data/webui/settings/languages_page_tests.js |
+++ b/chrome/test/data/webui/settings/languages_page_tests.js |
@@ -77,6 +77,25 @@ cr.define('languages_page_tests', function() { |
var dialogItems; |
var cancelButton; |
var actionButton; |
+ var dialogClosedResolver; |
+ var dialogClosedObserver; |
+ |
+ // Resolves the PromiseResolver if the mutation includes removal of the |
+ // settings-add-languages-dialog. |
+ // TODO(michaelpg): Extract into a common method similar to |
+ // test_util.whenAttributeIs for use elsewhere. |
+ var onMutation = function(mutations, observer) { |
+ if (mutations.some(function(mutation) { |
+ return mutation.type == 'childList' && |
+ Array.from(mutation.removedNodes).includes(dialog); |
+ })) { |
+ // Sanity check: the dialog should no longer be in the DOM. |
+ assertEquals(null, languagesPage.$$('settings-add-languages-dialog')); |
+ observer.disconnect(); |
+ assertTrue(!!dialogClosedResolver); |
+ dialogClosedResolver.resolve(); |
+ } |
+ }; |
setup(function(done) { |
var addLanguagesButton = |
@@ -89,6 +108,12 @@ cr.define('languages_page_tests', function() { |
dialog = languagesPage.$$('settings-add-languages-dialog'); |
assertTrue(!!dialog); |
+ // Observe the removal of the dialog via MutationObserver since the |
+ // HTMLDialogElement 'close' event fires at an unpredictable time. |
+ dialogClosedResolver = new PromiseResolver(); |
+ dialogClosedObserver = new MutationObserver(onMutation); |
+ dialogClosedObserver.observe(languagesPage.root, {childList: true}); |
+ |
actionButton = assert(dialog.$$('.action-button')); |
cancelButton = assert(dialog.$$('.cancel-button')); |
@@ -107,30 +132,29 @@ cr.define('languages_page_tests', function() { |
}); |
}); |
- // After every test, check that the dialog is removed from the DOM. |
teardown(function() { |
- Polymer.dom.flush(); |
- assertEquals(null, languagesPage.$$('settings-add-languages-dialog')); |
+ dialogClosedObserver.disconnect(); |
}); |
test('cancel', function() { |
// Canceling the dialog should close and remove it. |
MockInteractions.tap(cancelButton); |
+ |
+ return dialogClosedResolver.promise; |
}); |
- test('add languages and cancel', function(done) { |
+ test('add languages and cancel', function() { |
// Check some languages. |
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. |
+ // the checked languages. |
MockInteractions.tap(cancelButton); |
- setTimeout(function() { |
+ return dialogClosedResolver.promise.then(function() { |
assertEquals(initialLanguages, |
languageHelper.getPref(languagesPref).value); |
- done(); |
- }, 100); |
+ }); |
}); |
test('add languages and confirm', function() { |
@@ -157,6 +181,8 @@ cr.define('languages_page_tests', function() { |
assertEquals( |
initialLanguages + ',en,tk', |
languageHelper.getPref(languagesPref).value); |
+ |
+ return dialogClosedResolver.promise; |
}); |
}); |