Bug 1877191 - Add removeTabOptions parameter to ContextualIdentityService.closeContainerTabs r=mconley

Adds a removeTabOptions optional parameter to closeContainerTabs that will be forwarded to tabbrowser.removeTab
This allows to set options such as skipPermitUnload.
Browser mochitest added to check the new behavior. This should be a noop for current consumers of the API.

Differential Revision: https://phabricator.services.mozilla.com/D200018
This commit is contained in:
Julian Descottes 2024-02-07 00:40:42 +00:00
parent 8b02ebad10
commit 69300a43c4
4 changed files with 87 additions and 2 deletions

View File

@ -567,7 +567,7 @@ _ContextualIdentityService.prototype = {
return count;
},
closeContainerTabs(userContextId = 0) {
closeContainerTabs(userContextId = 0, removeTabOptions = {}) {
return new Promise(resolve => {
let remoteTabIds = new Set();
this._forEachContainerTab((tab, tabbrowser) => {
@ -578,7 +578,7 @@ _ContextualIdentityService.prototype = {
remoteTabIds.add(frameLoader.remoteTab.tabId);
}
tabbrowser.removeTab(tab);
tabbrowser.removeTab(tab, removeTabOptions);
}, userContextId);
if (remoteTabIds.size == 0) {

View File

@ -11,4 +11,5 @@ EXTRA_JS_MODULES += [
"ContextualIdentityService.sys.mjs",
]
BROWSER_CHROME_MANIFESTS += ["tests/browser/browser.toml"]
XPCSHELL_TESTS_MANIFESTS += ["tests/unit/xpcshell.toml"]

View File

@ -0,0 +1,3 @@
[DEFAULT]
["browser_closeContainerTabs.js"]

View File

@ -0,0 +1,81 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const { PromptTestUtils } = ChromeUtils.importESModule(
"resource://testing-common/PromptTestUtils.sys.mjs"
);
const BUILDER_URL = "https://example.com/document-builder.sjs?html=";
const PAGE_MARKUP = `
<html>
<head>
<script>
window.onbeforeunload = function() {
return true;
};
</script>
</head>
<body>TEST PAGE</body>
</html>
`;
const TEST_URL = BUILDER_URL + encodeURI(PAGE_MARKUP);
add_task(async function test_skipPermitUnload() {
await SpecialPowers.pushPrefEnv({
set: [["dom.require_user_interaction_for_beforeunload", false]],
});
info("Create a test user context");
const userContextId = ContextualIdentityService.create("test").userContextId;
// Run tests in a new window to avoid affecting the main test window.
const win = await BrowserTestUtils.openNewBrowserWindow();
registerCleanupFunction(async () => {
await BrowserTestUtils.closeWindow(win);
});
info("Create a tab owned by the test user context");
const tab = await BrowserTestUtils.addTab(win.gBrowser, TEST_URL, {
userContextId,
});
registerCleanupFunction(() => win.gBrowser.removeTab(tab));
await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
info("Call closeContainerTabs without skipPermitUnload");
const unloadDialogPromise = PromptTestUtils.handleNextPrompt(
tab.linkedBrowser,
{
modalType: Ci.nsIPrompt.MODAL_TYPE_CONTENT,
promptType: "confirmEx",
},
// Click the cancel button.
{ buttonNumClick: 1 }
);
const tabCountBeforeClose = win.gBrowser.tabs.length;
ContextualIdentityService.closeContainerTabs(userContextId);
info("Wait for the unload dialog");
await unloadDialogPromise;
is(
win.gBrowser.tabs.length,
tabCountBeforeClose,
"Tab was not closed because of the before unload prompt"
);
info("Call closeContainerTabs with skipPermitUnload");
const closePromise = BrowserTestUtils.waitForTabClosing(tab);
ContextualIdentityService.closeContainerTabs(userContextId, {
skipPermitUnload: true,
});
info("Wait for the tab to be closed");
await closePromise;
is(
win.gBrowser.tabs.length,
tabCountBeforeClose - 1,
"Tab was closed after ignoring the before unload prompt"
);
});