diff --git a/src/browser/base/zen-components/ZenWorkspaces.mjs b/src/browser/base/zen-components/ZenWorkspaces.mjs index 0dfdf4fcb..b217a2b60 100644 --- a/src/browser/base/zen-components/ZenWorkspaces.mjs +++ b/src/browser/base/zen-components/ZenWorkspaces.mjs @@ -429,11 +429,8 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { return null; } - let tabs = gBrowser.tabs.filter( - (t) => - (t.getAttribute('zen-workspace-id') === workspaceID || t.hasAttribute('zen-essential')) && - (!this.shouldOpenNewTabIfLastUnpinnedTabIsClosed || !t.pinned || t.getAttribute('pending') !== 'true') - ); + let tabs = gBrowser.visibleTabs; + let tabsPinned = tabs.filter((t) => !this.shouldOpenNewTabIfLastUnpinnedTabIsClosed || !t.pinned); const shouldCloseWindow = this.shouldCloseWindow(); if (tabs.length === 1 && tabs[0] === tab) { @@ -448,13 +445,17 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { if (!gBrowser._removingTabs.size) { // This call actually closes the window, unless the user // cancels the operation. We are finished here in both cases. - gBrowser._windowIsClosing = window.closeWindow(true, window.warnAboutClosingWindow, 'close-last-tab'); - return null; + this._isClosingWindow = true; + // Inside a setTimeout to avoid reentrancy issues. + setTimeout(() => { + document.getElementById('cmd_closeWindow').doCommand(); + }, 100); + return this._createNewTabForWorkspace({ uuid: workspaceID }); } return null; } - let newTab = this._createNewTabForWorkspace({ uuid: workspaceID }); - return newTab; + } else if (tabsPinned.length === 1 && tabsPinned[0] === tab) { + return this._createNewTabForWorkspace({ uuid: workspaceID }); } return null; @@ -1543,7 +1544,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { } async onLocationChange(browser) { - if (!this.workspaceEnabled || this._inChangingWorkspace) { + if (!this.workspaceEnabled || this._inChangingWorkspace || this._isClosingWindow) { return; } diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 954adf14b..361106684 100644 --- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch +++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js -index ce68c339f35416574b7bc7ebf8c93378f653242b..46d25e4381eaae71f3aec1025788684c593a60c7 100644 +index ce68c339f35416574b7bc7ebf8c93378f653242b..07e3f7fcdb3e219c523201929cf07b6878d4d394 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -409,11 +409,39 @@ @@ -237,7 +237,7 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..46d25e4381eaae71f3aec1025788684c if ( !this._beginRemoveTab(aTab, { closeWindowFastpath: true, -@@ -4556,7 +4657,7 @@ +@@ -4556,14 +4657,14 @@ !!this.tabsInCollapsedTabGroups.length; if ( aTab.visible && @@ -246,6 +246,14 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..46d25e4381eaae71f3aec1025788684c !anyRemainingTabsInCollapsedTabGroups ) { closeWindow = + closeWindowWithLastTab != null + ? closeWindowWithLastTab + : !window.toolbar.visible || +- Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab"); ++ Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab") && !ZenWorkspaces._isClosingWindow; + + if (closeWindow) { + // We've already called beforeunload on all the relevant tabs if we get here, @@ -5411,10 +5512,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); }