diff --git a/addon/chrome/content/click/click.js b/addon/chrome/content/click/click.js index 75b8fc38..079841ce 100644 --- a/addon/chrome/content/click/click.js +++ b/addon/chrome/content/click/click.js @@ -989,15 +989,37 @@ Tabmix.allTabs = { return row; }; - // we modify here _populate from TabsListBase class - Object.getPrototypeOf(TabsPanel.prototype)._populate = function() { + // TabsListBase class + // modify _populateDOM and _populate add _tabmix_sortTabs + + /** @type {MockedGeckoTypes.TabsListBase} */ + const TabsListBase = Object.getPrototypeOf(TabsPanel.prototype); + + if (Tabmix.isVersion(1350)) { + TabsListBase._tabmix_sortTabs = function() { + return this.gBrowser.tabs.slice() + .sort((a, b) => { + if (a.group?.id === b.group?.id) { + return a.label.toLowerCase() > b.label.toLowerCase() ? 1 : -1; + } + const labelA = a.group ? a.group.label.toLowerCase() : a.label.toLowerCase(); + const labelB = b.group ? b.group.label.toLowerCase() : b.label.toLowerCase(); + return labelA > labelB ? 1 : -1; + }); + }; + } else { + TabsListBase._tabmix_sortTabs = function() { + return this.gBrowser.tabs.slice() + .sort((a, b) => (a.label.toLowerCase() > b.label.toLowerCase() ? 1 : -1)); + }; + } + + TabsListBase._populateDOM = function() { let fragment = this.doc.createDocumentFragment(); let currentGroupId; - const sortTabs = () => [...this.gBrowser.tabs] - .sort((a, b) => (a.label.toLowerCase() > b.label.toLowerCase() ? 1 : -1)); const tabs = typeof sortTabsButton === "object" && sortTabsButton.checked ? - sortTabs() : this.gBrowser.tabs; + this._tabmix_sortTabs() : this.gBrowser.tabs; for (let tab of tabs) { if (this.filterFn(tab)) { @@ -1005,13 +1027,21 @@ Tabmix.allTabs = { fragment.appendChild(this._createGroupRow(tab.group)); currentGroupId = tab.group.id; } - fragment.appendChild(this._createRow(tab)); + if (!tab.group?.collapsed) { + fragment.appendChild(this._createRow(tab)); + } } } this._addElement(fragment); - this._setupListeners(); }; + + if (!Tabmix.isVersion(1360)) { + TabsListBase._populate = function() { + this._populateDOM(); + this._setupListeners(); + }; + } } }, diff --git a/types/general.d.ts b/types/general.d.ts index 8d06c886..f03dcdfa 100644 --- a/types/general.d.ts +++ b/types/general.d.ts @@ -461,7 +461,7 @@ declare namespace MockedGeckoTypes { gBrowser: TabBrowser; } - type MozTabbrowserTabGroup = {color: string; id: string; label: string}; + type MozTabbrowserTabGroup = {color: string; collapsed: boolean; id: string; label: string}; interface TabsPanel extends TabsListBase { prototype: TabsListBase; @@ -515,8 +515,11 @@ declare namespace MockedGeckoTypes { handleEvent(event: Event): void; _selectTab(tab: BrowserTab): void; _populate(): void; + _populateDOM(): void; _addElement(elementOrFragment: DocumentFragment | HTMLElement): void; _cleanup(): void; + _createRow(tab: BrowserTab): TabsPanelRow; + _createGroupRow(group: MozTabbrowserTabGroup): TabsPanelRow; _setupListeners(): void; _cleanupListeners(): void; _tabAttrModified(tab: BrowserTab): void; @@ -524,6 +527,8 @@ declare namespace MockedGeckoTypes { _addTab(newtab: BrowserTab): void; _tabClose(tab: BrowserTab): void; _removeItem(item: TabsPanelRow, tab: BrowserTab): void; + + _tabmix_sortTabs(): BrowserTab[]; } interface gTabsPanel {