fune/browser/base/content/test/tabdialogs/browser_subdialog_esc.js
Emilio Cobos Álvarez 7829e5aab5 Bug 1774378 - Make select code harder to mess up. r=Gijs
Right now we rely on the menulist to be injected by hand in all the
relevant windows. Instead create it lazily, making the select code more
standalone.

The DevTools window was missing it, for example.

Differential Revision: https://phabricator.services.mozilla.com/D149620
2022-06-21 21:42:58 +00:00

114 lines
3.2 KiB
JavaScript

/* 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",
"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("http://example.com", async function(
browser
) {
// Start loading a page
let loadStartedPromise = BrowserTestUtils.loadURI(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("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");
});
});