Bug 1926396 - when unloading current tab, don't switch to an unloaded tab r=tabbrowser-reviewers,dao

Differential Revision: https://phabricator.services.mozilla.com/D234569
This commit is contained in:
Greg Stoll
2025-01-16 19:53:09 +00:00
parent 418d1decfb
commit 96e0daa1a5
2 changed files with 107 additions and 3 deletions

View File

@@ -4946,12 +4946,17 @@
if (tabs.some(tab => tab.selected)) {
// Unloading the currently selected tab.
// Need to select a different one before unloading.
// Avoid selecting any tab we're unloading now or
// any tab that is already unloaded.
unloadSelectedTab = true;
let newTab = this._findTabToBlurTo(this.selectedTab, tabs);
const tabsToExclude = tabs.concat(
this.tabContainer.allTabs.filter(tab => !tab.linkedPanel)
);
let newTab = this._findTabToBlurTo(this.selectedTab, tabsToExclude);
if (newTab) {
this.selectedTab = newTab;
} else if (FirefoxViewHandler.tab) {
// probably unloading all tabs - show Firefox View
} else {
// all tabs are unloaded - show Firefox View
FirefoxViewHandler.openTab("opentabs");
allTabsUnloaded = true;
}

View File

@@ -164,6 +164,105 @@ add_task(async function test_unload_selected_tab() {
await BrowserTestUtils.removeTab(tab1);
});
add_task(async function test_unload_selected_tab_switches_to_loaded_tab() {
await SpecialPowers.pushPrefEnv({
set: [["browser.tabs.unloadTabInContextMenu", true]],
});
let [tab1, tab2, tab3] = await addBrowserTabs(3);
let menuItemUnload = document.getElementById("context_unloadTab");
await BrowserTestUtils.switchTab(gBrowser, tab1);
updateTabContextMenu(tab2);
ok(!menuItemUnload.hidden, "Unload Tab is visible");
{
let menu = await openTabMenuFor(tab2);
let menuHiddenPromise = BrowserTestUtils.waitForPopupEvent(menu, "hidden");
menu.activateItem(menuItemUnload);
await menuHiddenPromise;
}
await TestUtils.waitForCondition(
() => !tab2.linkedPanel,
"Wait for Tab2 to be unloaded"
);
updateTabContextMenu(tab1);
ok(!menuItemUnload.hidden, "Unload Tab is visible");
{
let menu = await openTabMenuFor(tab1);
let menuHiddenPromise = BrowserTestUtils.waitForPopupEvent(menu, "hidden");
menu.activateItem(menuItemUnload);
await menuHiddenPromise;
}
await TestUtils.waitForCondition(
() => !tab1.linkedPanel,
"Wait for Tab1 to be unloaded"
);
is(gBrowser.selectedTab, tab3, "Should select another loaded tab");
await BrowserTestUtils.removeTab(tab3);
await BrowserTestUtils.removeTab(tab2);
await BrowserTestUtils.removeTab(tab1);
});
add_task(
async function test_unload_selected_tab_with_no_others_loaded_switches_to_firefoxview() {
await SpecialPowers.pushPrefEnv({
set: [["browser.tabs.unloadTabInContextMenu", true]],
});
let originalTab = gBrowser.selectedTab;
let [tab1] = await addBrowserTabs(1);
let menuItemUnload = document.getElementById("context_unloadTab");
await BrowserTestUtils.switchTab(gBrowser, tab1);
updateTabContextMenu(originalTab);
ok(!menuItemUnload.hidden, "Unload Tab is visible");
{
let menu = await openTabMenuFor(originalTab);
let menuHiddenPromise = BrowserTestUtils.waitForPopupEvent(
menu,
"hidden"
);
menu.activateItem(menuItemUnload);
await menuHiddenPromise;
}
await TestUtils.waitForCondition(
() => !originalTab.linkedPanel,
"Wait for original tab to be unloaded"
);
updateTabContextMenu(tab1);
ok(!menuItemUnload.hidden, "Unload Tab is visible");
{
let menu = await openTabMenuFor(tab1);
let menuHiddenPromise = BrowserTestUtils.waitForPopupEvent(
menu,
"hidden"
);
menu.activateItem(menuItemUnload);
await menuHiddenPromise;
}
await TestUtils.waitForCondition(
() => !tab1.linkedPanel,
"Wait for Tab1 to be unloaded"
);
is(
gBrowser.selectedTab,
FirefoxViewHandler.tab,
"Should select Firefox View"
);
await BrowserTestUtils.removeTab(tab1);
// Switch back to the original tab so as not to mess up subsequent tests
await BrowserTestUtils.switchTab(gBrowser, originalTab);
}
);
add_task(async function test_unload_all_tabs() {
await SpecialPowers.pushPrefEnv({
set: [["browser.tabs.unloadTabInContextMenu", true]],