diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js index a2db42fba8d1f1d9df1dc295adb64be3f5885d50..2dd43fe4898badeaf9bc669502ead2c56982d1aa 100644 --- a/browser/components/tabbrowser/content/tabs.js +++ b/browser/components/tabbrowser/content/tabs.js @@ -230,7 +230,7 @@ this.tooltip = "tabbrowser-tab-tooltip"; - this.tabDragAndDrop = new window.TabDragAndDrop(this); + this.tabDragAndDrop = new window.ZenDragAndDrop(this); this.tabDragAndDrop.init(); } @@ -454,7 +454,7 @@ // and we're not hitting the scroll buttons. if ( event.button != 0 || - event.target != this.arrowScrollbox || + !event.target.classList.contains("zen-workspace-empty-space") || event.composedTarget.localName == "toolbarbutton" ) { return; @@ -535,7 +535,6 @@ }); } } else if (isTabGroupLabel(event.target)) { - event.target.group.saveAndClose(); } else if ( event.originalTarget.closest("scrollbox") && !Services.prefs.getBoolPref( @@ -571,6 +570,9 @@ } on_keydown(event) { + if (document.documentElement.getAttribute('zen-renaming-tab') === 'true') { + return; + } let { altKey, shiftKey } = event; let [accel, nonAccel] = AppConstants.platform == "macosx" @@ -765,7 +767,6 @@ this._updateCloseButtons(); if (!this.#animatingGroups.size) { - this._handleTabSelect(true); } document @@ -832,7 +833,7 @@ } get newTabButton() { - return this.querySelector("#tabs-newtab-button"); + return gZenWorkspaces.activeWorkspaceStrip.querySelector("#tabs-newtab-button"); } get verticalMode() { @@ -848,6 +849,7 @@ } get overflowing() { + gZenWorkspaces.updateOverflowingTabs(); return this.hasAttribute("overflow"); } @@ -861,29 +863,56 @@ if (pinnedChildren?.at(-1)?.id == "pinned-tabs-container-periphery") { pinnedChildren.pop(); } - let unpinnedChildren = Array.from(this.arrowScrollbox.children); + let unpinnedChildren = gZenWorkspaces.tabboxChildren; // remove arrowScrollbox periphery element. unpinnedChildren.pop(); // explode tab groups and split view wrappers // Iterate backwards over the array to preserve indices while we modify // things in place - for (let i = unpinnedChildren.length - 1; i >= 0; i--) { - if ( - unpinnedChildren[i].tagName == "tab-group" || - unpinnedChildren[i].tagName == "tab-split-view-wrapper" - ) { - unpinnedChildren.splice(i, 1, ...unpinnedChildren[i].tabs); + const pinnedTabs = [...gZenWorkspaces.getCurrentEssentialsContainer().children, ...pinnedChildren]; + const expandTabs = (tabs) => { + for (let i = tabs.length - 1; i >= 0; i--) { + const tab = tabs[i]; + if (isTabGroup(tab)) { + // remove the group from the list + tabs.splice(i, 1); + // add the tabs in the group to the list + tabs.splice(i, 0, ...tab.tabs); + } else if (!isTab(tab)) { + tabs.splice(i, 1); + } } + }; + expandTabs(pinnedTabs); + expandTabs(unpinnedChildren); + const allTabs = [ + ...pinnedTabs, + ...unpinnedChildren, + ]; + const lastPinnedTabIdx = pinnedTabs.length - 1; + let i = 0; + for (const tab of [...allTabs]) { + // add glance tabs (tabs inside tabs) to the list + const glanceTab = tab.glanceTab; + if (glanceTab) { + // insert right after the parent tab. note: it must be inserted before + // the last pinned tab so it can be inserted in the correct order + allTabs.splice(Math.max(i++ + 1, lastPinnedTabIdx), 0, glanceTab); + } else if (tab.classList.contains("pinned-tabs-container-separator")) { + // remove the separator from the list + allTabs.splice(i, 1); + i--; + } + i++; } - - this.#allTabs = [...pinnedChildren, ...unpinnedChildren]; + this.#allTabs = allTabs; return this.#allTabs; } get allGroups() { let children = Array.from(this.arrowScrollbox.children); - return children.filter(node => node.tagName == "tab-group"); + return gZenWorkspaces.allTabGroups; } get allSplitViews() { @@ -968,29 +997,28 @@ return this.#focusableItems; } - let unpinnedChildren = Array.from(this.arrowScrollbox.children); - let pinnedChildren = Array.from(this.pinnedTabsContainer.children); + let elementIndex = 0; + let children = gZenWorkspaces.tabboxChildrenWithoutEmpty; let focusableItems = []; - for (let child of pinnedChildren) { - if (isTab(child)) { - focusableItems.push(child); - } - } - for (let child of unpinnedChildren) { + for (let child of [...gZenWorkspaces.getCurrentEssentialsContainer().children, ...(gZenWorkspaces.activeWorkspaceElement?.hasCollapsedPinnedTabs ? [] : this.pinnedTabsContainer.children), ...children]) { if (isTab(child) && child.visible) { focusableItems.push(child); } else if (isTabGroup(child)) { focusableItems.push(child.labelElement); - - let visibleTabsInGroup = child.tabs.filter(tab => tab.visible); + if (!child.hasAttribute("split-view-group")) { + let visibleTabsInGroup = child.childGroupsAndTabs.filter(tab => tab.visible); + focusableItems.push(...visibleTabsInGroup); + } } else if (child.tagName == "tab-split-view-wrapper") { let visibleTabsInSplitView = child.tabs.filter(tab => tab.visible); focusableItems.push(...visibleTabsInSplitView); } } - + focusableItems.forEach(item => { + item.elementIndex = elementIndex++; + }); this.#focusableItems = focusableItems; return this.#focusableItems; @@ -1003,6 +1031,7 @@ * focusable (ex, we don't want the splitview container to be focusable, only its children). */ get dragAndDropElements() { + return this.ariaFocusableItems; if (this.#dragAndDropElements) { return this.#dragAndDropElements; } @@ -1073,6 +1102,7 @@ _invalidateCachedTabs() { this.#allTabs = null; this._invalidateCachedVisibleTabs(); + gZenWorkspaces._allStoredTabs = null; } _invalidateCachedVisibleTabs() { @@ -1092,7 +1122,8 @@ isContainerVerticalPinnedGrid(tab) { return ( - tab.pinned && + tab.hasAttribute("zen-essential") && + (this.hasAttribute("expanded") || document.documentElement.hasAttribute("zen-sidebar-expanded")) && this.verticalMode && this.hasAttribute("expanded") && !this.expandOnHover @@ -1186,7 +1217,7 @@ if (node == null) { // We have a container for non-tab elements at the end of the scrollbox. - node = this.arrowScrollbox.lastChild; + node = gZenWorkspaces.activeWorkspaceStrip.lastChild; } node.before(tab); @@ -1281,7 +1312,7 @@ // There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and // for when the tab strip is overflowed (which is shared by vertical and horizontal tabs); // Attach the long click popup to all of them. - const newTab = document.getElementById("new-tab-button"); + const newTab = gZenWorkspaces.activeWorkspaceStrip.querySelector("#tabs-newtab-button"); const newTab2 = this.newTabButton; const newTabVertical = document.getElementById( "vertical-tabs-newtab-button" @@ -1386,8 +1417,10 @@ */ _handleTabSelect(aInstant) { let selectedTab = this.selectedItem; + if (!selectedTab) return; this.#ensureTabIsVisible(selectedTab, aInstant); + gZenCompactModeManager.flashSidebarIfNecessary(aInstant); selectedTab._notselectedsinceload = false; } @@ -1396,7 +1429,7 @@ * @param {boolean} [shouldScrollInstantly=false] */ #ensureTabIsVisible(tab, shouldScrollInstantly = false) { - let arrowScrollbox = tab.closest("arrowscrollbox"); + let arrowScrollbox = this.arrowScrollbox; if (arrowScrollbox?.overflowing) { arrowScrollbox.ensureElementIsVisible(tab, shouldScrollInstantly); } @@ -1523,7 +1556,7 @@ } _notifyBackgroundTab(aTab) { - if (aTab.pinned || !aTab.visible || !this.overflowing) { + if (aTab.hasAttribute("zen-essential") || !aTab.visible || !this.overflowing) { return; }