"use strict"; // Tests that a second attempt to close a window while blocked on a // beforeunload confirmation ignores the beforeunload listener and // unblocks the original close call. const CONTENT_PROMPT_SUBDIALOG = Services.prefs.getBoolPref( "prompts.contentPromptSubDialog", false ); const DIALOG_TOPIC = CONTENT_PROMPT_SUBDIALOG ? "common-dialog-loaded" : "tabmodal-dialog-loaded"; add_task(async function () { await SpecialPowers.pushPrefEnv({ set: [["dom.require_user_interaction_for_beforeunload", false]], }); let win = await BrowserTestUtils.openNewBrowserWindow(); let browser = win.gBrowser.selectedBrowser; // eslint-disable-next-line @microsoft/sdl/no-insecure-url BrowserTestUtils.loadURIString(browser, "http://example.com/"); // eslint-disable-next-line @microsoft/sdl/no-insecure-url await BrowserTestUtils.browserLoaded(browser, false, "http://example.com/"); await SpecialPowers.spawn(browser, [], () => { // eslint-disable-next-line mozilla/balanced-listeners content.addEventListener("beforeunload", event => { event.preventDefault(); }); }); let confirmationShown = false; BrowserUtils.promiseObserved(DIALOG_TOPIC).then(() => { confirmationShown = true; win.close(); }); win.close(); ok(confirmationShown, "Before unload confirmation should have been shown"); ok(win.closed, "Window should have been closed after second close() call"); });