forked from mirrors/gecko-dev
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
114 lines
3.2 KiB
JavaScript
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");
|
|
});
|
|
});
|