diff --git a/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_cookieacceptdialog.js b/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_cookieacceptdialog.js index a21aa7c3151d..98876ac54c6a 100644 --- a/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_cookieacceptdialog.js +++ b/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_cookieacceptdialog.js @@ -5,7 +5,7 @@ // This test makes sure that private browsing mode disables the "remember" // option in the cookie accept dialog. -function test() { +add_task(function* test() { // initialization const TEST_URL = "http://mochi.test:8888/browser/browser/components/" + "privatebrowsing/test/browser/" + @@ -14,36 +14,8 @@ function test() { let cp = Cc["@mozilla.org/embedcomp/cookieprompt-service;1"]. getService(Ci.nsICookiePromptService); - waitForExplicitFinish(); - - function checkRememberOption(expectedDisabled, aWindow, callback) { - function observer(aSubject, aTopic, aData) { - if (aTopic != "domwindowopened") - return; - - Services.ww.unregisterNotification(observer); - let win = aSubject.QueryInterface(Ci.nsIDOMWindow); - win.addEventListener("load", function onLoad(event) { - win.removeEventListener("load", onLoad, false); - - executeSoon(function () { - let doc = win.document; - let remember = doc.getElementById("persistDomainAcceptance"); - ok(remember, "The remember checkbox should exist"); - - if (expectedDisabled) - is(remember.getAttribute("disabled"), "true", - "The checkbox should be disabled"); - else - ok(!remember.hasAttribute("disabled"), - "The checkbox should not be disabled"); - - waitForWindowClose(win, callback); - }); - }, false); - } - Services.ww.registerNotification(observer); + function openCookieDialog(aWindow) { let remember = {}; const time = (new Date("Jan 1, 2030")).getTime() / 1000; let cookie = { @@ -67,95 +39,90 @@ function test() { throw Cr.NS_ERROR_NO_INTERFACE; } }; - cp.cookieDialog(aWindow, cookie, "mozilla.org", 10, false, remember); - } - function checkSettingDialog(aIsPrivateWindow, aWindow, aCallback) { - let selectedBrowser = aWindow.gBrowser.selectedBrowser; + executeSoon(function () { + cp.cookieDialog(aWindow, cookie, "mozilla.org", 10, false, remember); + }); + return BrowserTestUtils.domWindowOpened(); + }; - function onLoad() { - if (aWindow.content.location.href != TEST_URL) { - selectedBrowser.loadURI(TEST_URL); - return; - } - selectedBrowser.removeEventListener("load", onLoad, true); - Services.ww.unregisterNotification(observer); - ok(aIsPrivateWindow, - "Confirm setting dialog is not displayed for private window"); + function checkRememberOption(expectedDisabled, aWindow) { + return Task.spawn(function* () { + let dialogWin = yield openCookieDialog(aWindow); - executeSoon(aCallback); - } - selectedBrowser.addEventListener("load", onLoad, true); - - function observer(aSubject, aTopic, aData) { - if (aTopic != "domwindowopened") - return; - selectedBrowser.removeEventListener("load", onLoad, true); - Services.ww.unregisterNotification(observer); - ok(!aIsPrivateWindow, - "Confirm setting dialog is displayed for normal window"); - let win = aSubject.QueryInterface(Ci.nsIDOMWindow); - executeSoon(function () { - info("Wait for window close"); - waitForWindowClose(win, aCallback); + yield new Promise(resolve => { + dialogWin.addEventListener("load", function onLoad(event) { + dialogWin.removeEventListener("load", onLoad, false); + resolve(); + }, false); }); - } - Services.ww.registerNotification(observer); - selectedBrowser.loadURI(TEST_URL); - } + let doc = dialogWin.document; + let remember = doc.getElementById("persistDomainAcceptance"); + ok(remember, "The remember checkbox should exist"); - let windowsToClose = []; - function testOnWindow(aIsPrivate, aCallback) { - whenNewWindowLoaded({private: aIsPrivate}, function(aWin) { - windowsToClose.push(aWin); - let selectedBrowser = aWin.gBrowser.selectedBrowser; - selectedBrowser.addEventListener("load", function onLoad() { - if (aWin.content.location.href != BLANK_URL) { - selectedBrowser.loadURI(BLANK_URL); - return; - } - selectedBrowser.removeEventListener("load", onLoad, true); - executeSoon(function() aCallback(aWin)); - }, true); - selectedBrowser.loadURI(BLANK_URL); + if (expectedDisabled) + is(remember.getAttribute("disabled"), "true", + "The checkbox should be disabled"); + else + ok(!remember.hasAttribute("disabled"), + "The checkbox should not be disabled"); + + yield BrowserTestUtils.closeWindow(dialogWin); }); - } + }; - registerCleanupFunction(function() { - Services.prefs.clearUserPref("network.cookie.lifetimePolicy"); - windowsToClose.forEach(function(aWin) { - aWin.close(); + function checkSettingDialog(aIsPrivateWindow, aWindow) { + return Task.spawn(function* () { + let dialogOpened = false; + let promiseDialogClosed = null; + + function observer(subject, topic, data) { + if (topic != "domwindowopened") { return; } + Services.ww.unregisterNotification(observer); + dialogOpened = true; + + promiseDialogClosed = BrowserTestUtils.closeWindow( + subject.QueryInterface(Ci.nsIDOMWindow)); + } + Services.ww.registerNotification(observer); + + let selectedBrowser = aWindow.gBrowser.selectedBrowser; + selectedBrowser.loadURI(TEST_URL); + yield BrowserTestUtils.browserLoaded(selectedBrowser);; + + if (dialogOpened) { + ok(!aIsPrivateWindow, + "Setting dialog shown, confirm normal window"); + } else { + Services.ww.unregisterNotification(observer); + ok(aIsPrivateWindow, + "Confirm setting dialog is not displayed for private window"); + } + + yield promiseDialogClosed; }); - }); + }; // Ask all cookies Services.prefs.setIntPref("network.cookie.lifetimePolicy", 1); - testOnWindow(false, function(aWin) { - info("Test on public window"); - checkRememberOption(false, aWin, function() { - checkSettingDialog(false, aWin, function() { - testOnWindow(true, function(aPrivWin) { - info("Test on private window"); - checkRememberOption(true, aPrivWin, function() { - checkSettingDialog(true, aPrivWin, finish); - }); - }); - }); - }); - }); -} + let win = yield BrowserTestUtils.openNewBrowserWindow(); + info("Test on public window"); -function waitForWindowClose(aWin, aCallback) { - function observer(aSubject, aTopic, aData) { - if (aTopic == "domwindowclosed") { - info("Window closed"); - Services.ww.unregisterNotification(observer); - executeSoon(aCallback); - } - } - Services.ww.registerNotification(observer); - aWin.close(); -} + yield checkRememberOption(false, win); + yield checkSettingDialog(false, win); + + let privateWin = yield BrowserTestUtils.openNewBrowserWindow({private: true}); + info("Test on private window"); + + yield checkRememberOption(true, privateWin); + yield checkSettingDialog(true, privateWin); + + + // Cleanup + Services.prefs.clearUserPref("network.cookie.lifetimePolicy"); + yield BrowserTestUtils.closeWindow(win); + yield BrowserTestUtils.closeWindow(privateWin); +}); diff --git a/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm index 3482c70e0f2d..b9324eec47ec 100644 --- a/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm +++ b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm @@ -59,6 +59,23 @@ this.BrowserTestUtils = { }); }, + /** + * @return {Promise} + * A Promise which resolves when a "domwindowopened" notification + * has been fired by the window watcher. + */ + domWindowOpened() { + return new Promise(resolve => { + function observer(subject, topic, data) { + if (topic != "domwindowopened") { return; } + + Services.ww.unregisterNotification(observer); + resolve(subject.QueryInterface(Ci.nsIDOMWindow)); + } + Services.ww.registerNotification(observer); + }); + }, + /** * @param {Object} options * { @@ -89,6 +106,29 @@ this.BrowserTestUtils = { subject => subject == win).then(() => win); }, + /** + * Closes a window. + * + * @param {Window} + * A window to close. + * + * @return {Promise} + * Resolves when the provided window has been closed. + */ + closeWindow(win) { + return new Promise(resolve => { + function observer(subject, topic, data) { + if (topic == "domwindowclosed" && subject === win) { + Services.ww.unregisterNotification(observer); + resolve(); + } + } + Services.ww.registerNotification(observer); + win.close(); + }); + }, + + /** * Waits a specified number of miliseconds for a specified event to be * fired on a specified element.