Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

"use strict";
const TOPIC = "browsing-context-discarded";
async function observeDiscarded(browsingContexts, callback) {
let discarded = [];
let promise = BrowserUtils.promiseObserved(TOPIC, subject => {
ok(BrowsingContext.isInstance(subject), "subject to be a BrowsingContext");
discarded.push(subject);
return browsingContexts.every(item => discarded.includes(item));
});
await callback();
await promise;
return discarded;
}
add_task(async function toplevelForNewWindow() {
let win = await BrowserTestUtils.openNewBrowserWindow();
let browsingContext = win.gBrowser.selectedBrowser.browsingContext;
await observeDiscarded([win.browsingContext, browsingContext], async () => {
await BrowserTestUtils.closeWindow(win);
});
});
add_task(async function toplevelForNewTab() {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
let browsingContext = tab.linkedBrowser.browsingContext;
let discarded = await observeDiscarded([browsingContext], () => {
BrowserTestUtils.removeTab(tab);
});
ok(
!discarded.includes(window.browsingContext),
"no notification for the current window's chrome browsing context"
);
});
add_task(async function subframe() {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
let browsingContext = await SpecialPowers.spawn(tab.linkedBrowser, [], () => {
let iframe = content.document.createElement("iframe");
content.document.body.appendChild(iframe);
iframe.contentWindow.location = "https://example.com/";
return iframe.browsingContext;
});
let discarded = await observeDiscarded([browsingContext], async () => {
await SpecialPowers.spawn(tab.linkedBrowser, [], () => {
let iframe = content.document.querySelector("iframe");
iframe.remove();
});
});
ok(
!discarded.includes(tab.browsingContext),
"no notification for toplevel browsing context"
);
BrowserTestUtils.removeTab(tab);
});