diff options
Diffstat (limited to 'browser/base/content/test/tabdialogs/browser_subdialog_esc.js')
-rw-r--r-- | browser/base/content/test/tabdialogs/browser_subdialog_esc.js | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/browser/base/content/test/tabdialogs/browser_subdialog_esc.js b/browser/base/content/test/tabdialogs/browser_subdialog_esc.js new file mode 100644 index 0000000000..63f2f276a3 --- /dev/null +++ b/browser/base/content/test/tabdialogs/browser_subdialog_esc.js @@ -0,0 +1,122 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const TEST_ROOT_CHROME = getRootDirectory(gTestPath); +const TEST_DIALOG_PATH = TEST_ROOT_CHROME + "subdialog.xhtml"; + +const WEB_ROOT = TEST_ROOT_CHROME.replace( + "chrome://mochitests/content", + // eslint-disable-next-line @microsoft/sdl/no-insecure-url + "http://example.com" +); +const TEST_LOAD_PAGE = WEB_ROOT + "loadDelayedReply.sjs"; + +/** + * Tests that ESC on a SubDialog does not cancel ongoing loads in the parent. + */ +add_task(async function test_subdialog_esc_does_not_cancel_load() { + await BrowserTestUtils.withNewTab( + // eslint-disable-next-line @microsoft/sdl/no-insecure-url + "http://example.com", + async function (browser) { + // Start loading a page + let loadStartedPromise = BrowserTestUtils.loadURIString( + browser, + TEST_LOAD_PAGE + ); + let loadedPromise = BrowserTestUtils.browserLoaded(browser); + await loadStartedPromise; + + // Open a dialog + let dialogBox = gBrowser.getTabDialogBox(browser); + let dialogClose = dialogBox.open(TEST_DIALOG_PATH, { + keepOpenSameOriginNav: true, + }).closedPromise; + + let dialogs = dialogBox.getTabDialogManager()._dialogs; + + is(dialogs.length, 1, "Dialog manager has a dialog."); + + info("Waiting for dialogs to open."); + await dialogs[0]._dialogReady; + + // Close the dialog with esc key + EventUtils.synthesizeKey("KEY_Escape"); + + info("Waiting for dialog to close."); + await dialogClose; + + info("Triggering load complete"); + fetch(TEST_LOAD_PAGE, { + method: "POST", + }); + + // Load must complete + info("Waiting for load to complete"); + await loadedPromise; + ok(true, "Load completed"); + } + ); +}); + +/** + * Tests that ESC on a SubDialog with an open dropdown doesn't close the dialog. + */ +add_task(async function test_subdialog_esc_on_dropdown_does_not_close_dialog() { + await BrowserTestUtils.withNewTab( + // eslint-disable-next-line @microsoft/sdl/no-insecure-url + "http://example.com", + async function (browser) { + // Open the test dialog + let dialogBox = gBrowser.getTabDialogBox(browser); + let dialogClose = dialogBox.open(TEST_DIALOG_PATH, { + keepOpenSameOriginNav: true, + }).closedPromise; + + let dialogs = dialogBox.getTabDialogManager()._dialogs; + + is(dialogs.length, 1, "Dialog manager has a dialog."); + + let dialog = dialogs[0]; + + info("Waiting for dialog to open."); + await dialog._dialogReady; + + // Open dropdown + let select = dialog._frame.contentDocument.getElementById("select"); + let shownPromise = BrowserTestUtils.waitForSelectPopupShown(window); + + info("Opening dropdown"); + select.focus(); + EventUtils.synthesizeKey("VK_SPACE", {}, dialog._frame.contentWindow); + + let selectPopup = await shownPromise; + + let hiddenPromise = BrowserTestUtils.waitForEvent( + selectPopup, + "popuphiding", + true + ); + + // Race dropdown closing vs SubDialog close + let race = Promise.race([ + hiddenPromise.then(() => true), + dialogClose.then(() => false), + ]); + + // Close the dropdown with esc key + info("Hitting escape key."); + await EventUtils.synthesizeKey("KEY_Escape"); + + let result = await race; + ok(result, "Select closed first"); + + await new Promise(resolve => executeSoon(resolve)); + + ok(!dialog._isClosing, "Dialog is not closing"); + ok(dialog._openedURL, "Dialog is open"); + } + ); +}); |