diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 398d42c50..39300183e 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 d80a66a01002e78a9c65545d08fe786328ddf124..749991884735a1a6d7b1a2c2e1c77f7eae2e5c28 100644 +index d80a66a01002e78a9c65545d08fe786328ddf124..1c01a1931a2d0b98f2d8f9a3b27e565c1ec15e92 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -422,15 +422,60 @@ @@ -718,8 +718,12 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..749991884735a1a6d7b1a2c2e1c77f7e } else if (targetElement) { targetElement.after(element); } else { -@@ -6230,7 +6388,7 @@ - if (!this.isTab(aTab)) { +@@ -6227,10 +6385,10 @@ + * @param {TabMetricsContext} [metricsContext] + */ + moveTabToGroup(aTab, aGroup, metricsContext) { +- if (!this.isTab(aTab)) { ++ if (!this.isTab(aTab) && !aTab.hasAttribute('split-view-group')) { throw new Error("Can only move a tab into a tab group"); } - if (aTab.pinned) { diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index a692bebbe..51a6b9abb 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -615,12 +615,26 @@ contextMenu.triggerNode && (contextMenu.triggerNode.tab || contextMenu.triggerNode.closest('tab')); - tabs.push(triggerTab, ...gBrowser.selectedTabs); + const selectedTabs = gBrowser.selectedTabs; + if (selectedTabs.length > 1) { + tabs.push(triggerTab, ...gBrowser.selectedTabs); + } else { + tabs.push(triggerTab); + } if (isFromToolbar) { tabs = []; } - const group = this.createFolder(tabs, { insertBefore: triggerTab, renameFolder: true }); + const canInsertBefore = + !triggerTab.hasAttribute('zen-essential') && + !triggerTab?.group?.hasAttribute('split-view-group') && + this.canDropElement({ isZenFolder: true }, triggerTab); + + const group = this.createFolder(tabs, { + insertAfter: !canInsertBefore ? triggerTab?.group : null, + insertBefore: canInsertBefore ? triggerTab : null, + renameFolder: true, + }); if (!group) return; this.#groupInit(group); } @@ -695,19 +709,25 @@ } canDropElement(element, targetElement) { - if (element?.isZenFolder && targetElement?.group?.level >= ZEN_MAX_SUBFOLDERS) { + const isZenFolder = element?.isZenFolder; + const level = targetElement?.group?.level + 1; + if (isZenFolder && level >= ZEN_MAX_SUBFOLDERS) { return false; } return true; } createFolder(tabs = [], options = {}) { - for (const tab of tabs) { - if (tab.hasAttribute('zen-essential')) return; - if (tab.group?.hasAttribute('split-view-group')) return; + const filteredTabs = tabs + .filter((tab) => !tab.hasAttribute('zen-essential')) + .map((tab) => { + gBrowser.pinTab(tab); + if (tab?.group?.hasAttribute('split-view-group')) { + tab = tab.group; + } + return tab; + }); - gBrowser.pinTab(tab); - } const workspacePinned = gZenWorkspaces.workspaceElement( options.workspaceId )?.pinnedTabsContainer; @@ -724,7 +744,7 @@ _forZenEmptyTab: true, }); - tabs = [emptyTab, ...tabs]; + tabs = [emptyTab, ...filteredTabs]; const folder = this._createFolderNode(options); if (options.initialPinId) {