From 882c67dc5b97eff8783c08f10cdb9b2b8a87afd8 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 24 Dec 2025 22:45:49 +0100 Subject: [PATCH] Discard changes to src/browser/components/tabbrowser/content/tabbrowser-js.patch --- .../tabbrowser/content/tabbrowser-js.patch | 234 +++++++----------- 1 file changed, 93 insertions(+), 141 deletions(-) diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 7327740e8..8a71eaaae 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 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18e829ca07 100644 +index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f53bc059b 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -386,6 +386,7 @@ @@ -10,7 +10,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 const browsers = []; if (this.#activeSplitView) { for (const tab of this.#activeSplitView.tabs) { -@@ -450,15 +451,66 @@ +@@ -450,15 +451,64 @@ return this.tabContainer.visibleTabs; } @@ -18,8 +18,6 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 + return this.#handleTabMove(...args); + } + -+ get zenTabProgressListener() { return TabProgressListener; } -+ + get _numVisiblePinTabsWithoutCollapsed() { + let i = 0; + for (let item of this.tabContainer.ariaFocusableItems) { @@ -79,7 +77,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 set selectedTab(val) { if ( gSharedTabWarning.willShowSharedTabWarning(val) || -@@ -613,6 +665,7 @@ +@@ -613,6 +663,7 @@ this.tabpanels.appendChild(panel); let tab = this.tabs[0]; @@ -87,7 +85,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 tab.linkedPanel = uniqueId; this._selectedTab = tab; this._selectedBrowser = browser; -@@ -898,13 +951,17 @@ +@@ -898,13 +949,17 @@ } this.showTab(aTab); @@ -106,7 +104,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 aTab.setAttribute("pinned", "true"); this._updateTabBarForPinnedTabs(); -@@ -917,11 +974,15 @@ +@@ -917,11 +972,15 @@ } this.#handleTabMove(aTab, () => { @@ -123,7 +121,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 }); aTab.style.marginInlineStart = ""; -@@ -1098,6 +1159,8 @@ +@@ -1098,6 +1157,8 @@ let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"]; @@ -132,7 +130,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if ( aIconURL && !LOCAL_PROTOCOLS.some(protocol => aIconURL.startsWith(protocol)) -@@ -1107,6 +1170,9 @@ +@@ -1107,6 +1168,9 @@ ); return; } @@ -142,7 +140,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 let browser = this.getBrowserForTab(aTab); browser.mIconURL = aIconURL; -@@ -1379,7 +1445,6 @@ +@@ -1379,7 +1443,6 @@ // Preview mode should not reset the owner if (!this._previewMode && !oldTab.selected) { @@ -150,7 +148,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } let lastRelatedTab = this._lastRelatedTabMap.get(oldTab); -@@ -1470,6 +1535,7 @@ +@@ -1470,6 +1533,7 @@ if (!this._previewMode) { newTab.recordTimeFromUnloadToReload(); newTab.updateLastAccessed(); @@ -158,7 +156,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 oldTab.updateLastAccessed(); // if this is the foreground window, update the last-seen timestamps. if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) { -@@ -1622,6 +1688,9 @@ +@@ -1622,6 +1686,9 @@ } let activeEl = document.activeElement; @@ -168,20 +166,17 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 // If focus is on the old tab, move it to the new tab. if (activeEl == oldTab) { newTab.focus(); -@@ -1945,7 +2014,11 @@ +@@ -1945,7 +2012,8 @@ } _setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) { - if (!aLabel || aLabel.includes("about:reader?")) { -+ if (!aTab._zenContentsVisible && !aTab._zenChangeLabelFlag && !aTab._labelIsInitialTitle && !gZenWorkspaces.privateWindowOrDisabled) { -+ return false; -+ } + gZenPinnedTabManager.onTabLabelChanged(aTab); -+ if (!aLabel || aLabel.includes("about:reader?") || (aTab.hasAttribute("zen-has-static-label") && !aTab._zenChangeLabelFlag)) { ++ if (!aLabel || aLabel.includes("about:reader?") || aTab.hasAttribute("zen-has-static-label")) { return false; } -@@ -2053,7 +2126,7 @@ +@@ -2053,7 +2121,7 @@ newIndex = this.selectedTab._tPos + 1; } @@ -190,7 +185,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if (this.isTabGroupLabel(targetTab)) { throw new Error( "Replacing a tab group label with a tab is not supported" -@@ -2328,6 +2401,7 @@ +@@ -2328,6 +2396,7 @@ uriIsAboutBlank, userContextId, skipLoad, @@ -198,7 +193,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } = {}) { let b = document.createXULElement("browser"); // Use the JSM global to create the permanentKey, so that if the -@@ -2401,8 +2475,7 @@ +@@ -2401,8 +2470,7 @@ // we use a different attribute name for this? b.setAttribute("name", name); } @@ -208,7 +203,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 b.setAttribute("transparent", "true"); } -@@ -2567,7 +2640,7 @@ +@@ -2567,7 +2635,7 @@ let panel = this.getPanel(browser); let uniqueId = this._generateUniquePanelID(); @@ -217,7 +212,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 aTab.linkedPanel = uniqueId; // Inject the into the DOM if necessary. -@@ -2626,8 +2699,8 @@ +@@ -2626,8 +2694,8 @@ // If we transitioned from one browser to two browsers, we need to set // hasSiblings=false on both the existing browser and the new browser. if (this.tabs.length == 2) { @@ -228,7 +223,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } else { aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1; } -@@ -2814,7 +2887,6 @@ +@@ -2814,7 +2882,6 @@ this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, { tabIndex: tab._tPos + 1, userContextId: tab.userContextId, @@ -236,17 +231,16 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 focusUrlBar: true, }); resolve(this.selectedBrowser); -@@ -2923,6 +2995,9 @@ +@@ -2923,6 +2990,8 @@ schemelessInput, hasValidUserGestureActivation = false, textDirectiveUserActivation = false, + _forZenEmptyTab, + essential, -+ zenWorkspaceId, } = {} ) { // all callers of addTab that pass a params object need to pass -@@ -2933,10 +3008,17 @@ +@@ -2933,10 +3002,17 @@ ); } @@ -264,7 +258,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 // If we're opening a foreground tab, set the owner by default. ownerTab ??= inBackground ? null : this.selectedTab; -@@ -2944,6 +3026,7 @@ +@@ -2944,6 +3020,7 @@ if (this.selectedTab.owner) { this.selectedTab.owner = null; } @@ -272,16 +266,14 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 // Find the tab that opened this one, if any. This is used for // determining positioning, and inherited attributes such as the -@@ -2996,6 +3079,21 @@ +@@ -2996,6 +3073,19 @@ noInitialLabel, skipBackgroundNotify, }); + if (hasZenDefaultUserContextId) { + t.setAttribute("zenDefaultUserContextId", "true"); + } -+ if (zenWorkspaceId) { -+ t.setAttribute("zen-workspace-id", zenWorkspaceId); -+ } else if (zenForcedWorkspaceId !== undefined) { ++ if (zenForcedWorkspaceId !== undefined) { + t.setAttribute("zen-workspace-id", zenForcedWorkspaceId); + t.setAttribute("change-workspace", "") + } @@ -294,7 +286,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if (insertTab) { // Insert the tab into the tab container in the correct position. this.#insertTabAtIndex(t, { -@@ -3004,6 +3102,7 @@ +@@ -3004,6 +3094,7 @@ ownerTab, openerTab, pinned, @@ -302,7 +294,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 bulkOrderedOpen, tabGroup: tabGroup ?? openerTab?.group, }); -@@ -3022,6 +3121,7 @@ +@@ -3022,6 +3113,7 @@ openWindowInfo, skipLoad, triggeringRemoteType, @@ -310,7 +302,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 })); if (focusUrlBar) { -@@ -3146,6 +3246,12 @@ +@@ -3146,6 +3238,12 @@ } } @@ -323,7 +315,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 // Additionally send pinned tab events if (pinned) { this.#notifyPinnedStatus(t); -@@ -3349,10 +3455,10 @@ +@@ -3349,10 +3447,10 @@ isAdoptingGroup = false, isUserTriggered = false, telemetryUserCreateSource = "unknown", @@ -335,7 +327,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } if (!color) { -@@ -3373,9 +3479,14 @@ +@@ -3373,9 +3471,14 @@ label, isAdoptingGroup ); @@ -352,7 +344,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 ); group.addTabs(tabs); -@@ -3496,7 +3607,7 @@ +@@ -3496,7 +3599,7 @@ } this.#handleTabMove(tab, () => @@ -361,7 +353,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 ); } -@@ -3698,6 +3809,7 @@ +@@ -3698,6 +3801,7 @@ openWindowInfo, skipLoad, triggeringRemoteType, @@ -369,7 +361,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } ) { // If we don't have a preferred remote type (or it is `NOT_REMOTE`), and -@@ -3767,6 +3879,7 @@ +@@ -3767,6 +3871,7 @@ openWindowInfo, name, skipLoad, @@ -377,7 +369,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 }); } -@@ -3955,7 +4068,7 @@ +@@ -3955,7 +4060,7 @@ // Add a new tab if needed. if (!tab) { let createLazyBrowser = @@ -386,7 +378,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 let url = "about:blank"; if (tabData.entries?.length) { -@@ -3992,8 +4105,10 @@ +@@ -3992,8 +4097,10 @@ insertTab: false, skipLoad: true, preferredRemoteType, @@ -398,7 +390,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if (select) { tabToSelect = tab; } -@@ -4005,7 +4120,8 @@ +@@ -4005,7 +4112,8 @@ this.pinTab(tab); // Then ensure all the tab open/pinning information is sent. this._fireTabOpen(tab, {}); @@ -408,7 +400,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 let { groupId } = tabData; const tabGroup = tabGroupWorkingData.get(groupId); // if a tab refers to a tab group we don't know, skip any group -@@ -4019,7 +4135,10 @@ +@@ -4019,7 +4127,10 @@ tabGroup.stateData.id, tabGroup.stateData.color, tabGroup.stateData.collapsed, @@ -420,7 +412,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 ); tabsFragment.appendChild(tabGroup.node); } -@@ -4064,9 +4183,23 @@ +@@ -4064,9 +4175,23 @@ // to remove the old selected tab. if (tabToSelect) { let leftoverTab = this.selectedTab; @@ -436,15 +428,15 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 + gZenWorkspaces._initialTab._shouldRemove = true; + } + } - } ++ } + else { + gZenWorkspaces._tabToRemoveForEmpty = this.selectedTab; -+ } + } + this._hasAlreadyInitializedZenSessionStore = true; if (tabs.length > 1 || !tabs[0].selected) { this._updateTabsAfterInsert(); -@@ -4257,11 +4390,14 @@ +@@ -4257,11 +4382,14 @@ if (ownerTab) { tab.owner = ownerTab; } @@ -460,7 +452,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if ( !bulkOrderedOpen && ((openerTab && -@@ -4273,7 +4409,7 @@ +@@ -4273,7 +4401,7 @@ let lastRelatedTab = openerTab && this._lastRelatedTabMap.get(openerTab); let previousTab = lastRelatedTab || openerTab || this.selectedTab; @@ -469,7 +461,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 tabGroup = previousTab.group; } if ( -@@ -4284,7 +4420,7 @@ +@@ -4284,7 +4412,7 @@ ) { elementIndex = Infinity; } else if (previousTab.visible) { @@ -478,7 +470,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } else if (previousTab == FirefoxViewHandler.tab) { elementIndex = 0; } -@@ -4312,14 +4448,14 @@ +@@ -4312,14 +4440,14 @@ } // Ensure index is within bounds. if (tab.pinned) { @@ -497,7 +489,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if (pinned && !itemAfter?.pinned) { itemAfter = null; -@@ -4330,7 +4466,7 @@ +@@ -4330,7 +4458,7 @@ this.tabContainer._invalidateCachedTabs(); @@ -506,7 +498,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if (this.isTab(itemAfter) && itemAfter.group == tabGroup) { // Place at the front of, or between tabs in, the same tab group this.tabContainer.insertBefore(tab, itemAfter); -@@ -4358,7 +4494,11 @@ +@@ -4358,7 +4486,11 @@ const tabContainer = pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; @@ -518,7 +510,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } this._updateTabsAfterInsert(); -@@ -4366,6 +4506,7 @@ +@@ -4366,6 +4498,7 @@ if (pinned) { this._updateTabBarForPinnedTabs(); } @@ -526,7 +518,17 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 TabBarVisibility.update(); } -@@ -4916,6 +5057,7 @@ +@@ -4655,6 +4788,9 @@ + return; + } + ++ for (let tab of selectedTabs) { ++ gZenPinnedTabManager._removePinnedAttributes(tab, true); ++ } + this.removeTabs(selectedTabs, { isUserTriggered, telemetrySource }); + } + +@@ -4916,6 +5052,7 @@ telemetrySource, } = {} ) { @@ -534,7 +536,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 // When 'closeWindowWithLastTab' pref is enabled, closing all tabs // can be considered equivalent to closing the window. if ( -@@ -5005,6 +5147,7 @@ +@@ -5005,6 +5142,7 @@ if (lastToClose) { this.removeTab(lastToClose, aParams); } @@ -542,7 +544,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } catch (e) { console.error(e); } -@@ -5043,6 +5186,12 @@ +@@ -5043,6 +5181,12 @@ aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start(); } @@ -555,7 +557,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 // Handle requests for synchronously removing an already // asynchronously closing tab. if (!animate && aTab.closing) { -@@ -5057,6 +5206,9 @@ +@@ -5057,6 +5201,9 @@ // state). let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width; let isLastTab = this.#isLastTabInWindow(aTab); @@ -565,7 +567,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if ( !this._beginRemoveTab(aTab, { closeWindowFastpath: true, -@@ -5105,7 +5257,13 @@ +@@ -5105,7 +5252,13 @@ // We're not animating, so we can cancel the animation stopwatch. Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId); aTab._closeTimeAnimTimerId = null; @@ -580,7 +582,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 return; } -@@ -5239,7 +5397,7 @@ +@@ -5239,7 +5392,7 @@ closeWindowWithLastTab != null ? closeWindowWithLastTab : !window.toolbar.visible || @@ -589,7 +591,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if (closeWindow) { // We've already called beforeunload on all the relevant tabs if we get here, -@@ -5263,6 +5421,7 @@ +@@ -5263,6 +5416,7 @@ newTab = true; } @@ -597,7 +599,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 aTab._endRemoveArgs = [closeWindow, newTab]; // swapBrowsersAndCloseOther will take care of closing the window without animation. -@@ -5303,13 +5462,7 @@ +@@ -5303,13 +5457,7 @@ aTab._mouseleave(); if (newTab) { @@ -612,7 +614,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } else { TabBarVisibility.update(); } -@@ -5442,6 +5595,7 @@ +@@ -5442,6 +5590,7 @@ this.tabs[i]._tPos = i; } @@ -620,7 +622,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if (!this._windowIsClosing) { // update tab close buttons state this.tabContainer._updateCloseButtons(); -@@ -5663,6 +5817,7 @@ +@@ -5663,6 +5812,7 @@ } let excludeTabs = new Set(aExcludeTabs); @@ -628,7 +630,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 // If this tab has a successor, it should be selectable, since // hiding or closing a tab removes that tab as a successor. -@@ -5675,13 +5830,13 @@ +@@ -5675,13 +5825,13 @@ !excludeTabs.has(aTab.owner) && Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose") ) { @@ -644,7 +646,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 ); let tab = this.tabContainer.findNextTab(aTab, { -@@ -5697,7 +5852,7 @@ +@@ -5697,7 +5847,7 @@ } if (tab) { @@ -653,7 +655,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } // If no qualifying visible tab was found, see if there is a tab in -@@ -5718,7 +5873,7 @@ +@@ -5718,7 +5868,7 @@ }); } @@ -662,47 +664,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } _blurTab(aTab) { -@@ -5729,7 +5884,7 @@ - * @returns {boolean} - * False if swapping isn't permitted, true otherwise. - */ -- swapBrowsersAndCloseOther(aOurTab, aOtherTab) { -+ swapBrowsersAndCloseOther(aOurTab, aOtherTab, zenCloseOther = true) { - // Do not allow transfering a private tab to a non-private window - // and vice versa. - if ( -@@ -5783,6 +5938,7 @@ - // fire the beforeunload event in the process. Close the other - // window if this was its last tab. - if ( -+ zenCloseOther && - !remoteBrowser._beginRemoveTab(aOtherTab, { - adoptedByTab: aOurTab, - closeWindowWithLastTab: true, -@@ -5794,7 +5950,7 @@ - // If this is the last tab of the window, hide the window - // immediately without animation before the docshell swap, to avoid - // about:blank being painted. -- let [closeWindow] = aOtherTab._endRemoveArgs; -+ let [closeWindow] = !zenCloseOther ? [false] : aOtherTab._endRemoveArgs; - if (closeWindow) { - let win = aOtherTab.ownerGlobal; - win.windowUtils.suppressAnimation(true); -@@ -5918,11 +6074,13 @@ - } - - // Finish tearing down the tab that's going away. -+ if (zenCloseOther) { - if (closeWindow) { - aOtherTab.ownerGlobal.close(); - } else { - remoteBrowser._endRemoveTab(aOtherTab); - } -+ } - - this.setTabTitle(aOurTab); - -@@ -6124,10 +6282,10 @@ +@@ -6124,10 +6274,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); } @@ -715,33 +677,15 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. -@@ -6185,7 +6343,8 @@ - * +@@ -6186,6 +6336,7 @@ * @param {MozTabbrowserTab|MozTabbrowserTabGroup|MozTabbrowserTabGroup.labelElement} aTab */ -- replaceTabWithWindow(aTab, aOptions) { -+ replaceTabWithWindow(aTab, aOptions, zenForceSync = false) { + replaceTabWithWindow(aTab, aOptions) { + if (!this.isTab(aTab)) return; // TODO: Handle tab groups if (this.tabs.length == 1) { return null; } -@@ -6209,12 +6368,14 @@ - } - - // tell a new window to take the "dropped" tab -- return window.openDialog( -+ let win = window.openDialog( - AppConstants.BROWSER_CHROME_URL, - "_blank", - options, - aTab - ); -+ win._zenStartupSyncFlag = zenForceSync ? 'synced' : 'unsynced'; -+ return win; - } - - /** -@@ -6319,7 +6480,7 @@ +@@ -6319,7 +6470,7 @@ * `true` if element is a `` */ isTabGroup(element) { @@ -750,7 +694,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } /** -@@ -6404,8 +6565,8 @@ +@@ -6404,8 +6555,8 @@ } // Don't allow mixing pinned and unpinned tabs. @@ -761,7 +705,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } else { tabIndex = Math.max(tabIndex, this.pinnedTabCount); } -@@ -6431,10 +6592,16 @@ +@@ -6431,10 +6582,16 @@ this.#handleTabMove( element, () => { @@ -780,7 +724,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 if (neighbor && this.isTab(element) && tabIndex > element._tPos) { neighbor.after(element); } else { -@@ -6492,23 +6659,28 @@ +@@ -6492,23 +6649,28 @@ #moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) { if (this.isTabGroupLabel(targetElement)) { targetElement = targetElement.group; @@ -815,7 +759,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } else if (!element.pinned && targetElement && targetElement.pinned) { // If the caller asks to move an unpinned element next to a pinned // tab, move the unpinned element to be the first unpinned element -@@ -6521,14 +6693,34 @@ +@@ -6521,14 +6683,34 @@ // move the tab group right before the first unpinned tab. // 4. Moving a tab group and the first unpinned tab is grouped: // move the tab group right before the first unpinned tab's tab group. @@ -851,7 +795,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 element.pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; -@@ -6537,7 +6729,7 @@ +@@ -6537,7 +6719,7 @@ element, () => { if (moveBefore) { @@ -860,7 +804,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 } else if (targetElement) { targetElement.after(element); } else { -@@ -6607,10 +6799,10 @@ +@@ -6607,10 +6789,10 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToGroup(aTab, aGroup, metricsContext) { @@ -873,7 +817,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 return; } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -6656,6 +6848,7 @@ +@@ -6656,6 +6838,7 @@ let state = { tabIndex: tab._tPos, @@ -881,7 +825,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 }; if (tab.visible) { state.elementIndex = tab.elementIndex; -@@ -6682,7 +6875,7 @@ +@@ -6682,7 +6865,7 @@ let changedTabGroup = previousTabState.tabGroupId != currentTabState.tabGroupId; @@ -890,7 +834,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 tab.dispatchEvent( new CustomEvent("TabMove", { bubbles: true, -@@ -6723,6 +6916,10 @@ +@@ -6723,6 +6906,10 @@ moveActionCallback(); @@ -901,7 +845,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7623,7 +7820,7 @@ +@@ -7623,7 +7810,7 @@ // preventDefault(). It will still raise the window if appropriate. break; } @@ -910,7 +854,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 window.focus(); aEvent.preventDefault(); break; -@@ -7640,7 +7837,6 @@ +@@ -7640,7 +7827,6 @@ } case "TabGroupCollapse": aEvent.target.tabs.forEach(tab => { @@ -918,7 +862,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 }); break; case "TabGroupCreateByUser": -@@ -8589,6 +8785,7 @@ +@@ -8589,6 +8775,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -926,7 +870,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9623,7 +9820,7 @@ var TabContextMenu = { +@@ -9623,7 +9810,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; @@ -935,3 +879,11 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..ebf699804db90e5509d1b1b704c95f18 // Build Ask Chat items TabContextMenu.GenAI.buildTabMenu( document.getElementById("context_askChat"), +@@ -9943,6 +10130,7 @@ var TabContextMenu = { + ) + ); + } else { ++ gZenPinnedTabManager._removePinnedAttributes(this.contextTab, true); + gBrowser.removeTab(this.contextTab, { + animate: true, + ...gBrowser.TabMetrics.userTriggeredContext(