From f2fcee96055f83035ea5af1cc56b1b6c02b0089d Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 16 Aug 2025 17:20:20 +0200 Subject: [PATCH] test: Added tests for folders opening from owner tabs, b=no-bug, c=folders, tests, tabs --- .../tabbrowser/content/tabbrowser-js.patch | 13 +++---- src/zen/folders/ZenFolders.mjs | 12 ++++++ src/zen/tests/folders/browser.toml | 6 +++ .../folders/browser_folder_basic_toggle.js | 4 +- .../tests/folders/browser_folder_create.js | 4 +- .../folders/browser_folder_issue_9885.js | 5 +-- .../folders/browser_folder_owner_tabs.js | 38 +++++++++++++++++++ .../tests/folders/browser_folder_subfolder.js | 5 +-- src/zen/tests/folders/head.js | 11 ++++++ 9 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 src/zen/tests/folders/browser_folder_owner_tabs.js create mode 100644 src/zen/tests/folders/head.js diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 5438702e1..356ab08d6 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..50ff735a4621110ff3691186139cabf76482a941 100644 +index d80a66a01002e78a9c65545d08fe786328ddf124..a25073f3a700e4d6765a9ba92eddbc0bf4bfa444 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -422,15 +422,60 @@ @@ -249,17 +249,14 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..50ff735a4621110ff3691186139cabf7 if (insertTab) { // Insert the tab into the tab container in the correct position. this.#insertTabAtIndex(t, { -@@ -2790,8 +2874,9 @@ +@@ -2790,6 +2874,7 @@ ownerTab, openerTab, pinned, + essential, bulkOrderedOpen, -- tabGroup: tabGroup ?? openerTab?.group, -+ tabGroup: tabGroup, + tabGroup: tabGroup ?? openerTab?.group, }); - } - @@ -2808,6 +2893,7 @@ openWindowInfo, skipLoad, @@ -394,10 +391,10 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..50ff735a4621110ff3691186139cabf7 + gZenWorkspaces._initialTab._shouldRemove = true; + } + } - } ++ } + else { + gZenWorkspaces._tabToRemoveForEmpty = this.selectedTab; -+ } + } + this._hasAlreadyInitializedZenSessionStore = true; if (tabs.length > 1 || !tabs[0].selected) { diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index 5a2f46513..15f7c9bd7 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -166,6 +166,7 @@ window.addEventListener('TabGroupCollapse', this.#onTabGroupCollapse.bind(this)); window.addEventListener('FolderGrouped', this.#onFolderGrouped.bind(this)); window.addEventListener('TabSelect', this.#onTabSelected.bind(this)); + window.addEventListener('TabOpen', this.#onTabOpened.bind(this)); document .getElementById('zen-context-menu-new-folder') .addEventListener('command', this.#onNewFolder.bind(this)); @@ -210,6 +211,17 @@ gBrowser.tabContainer._invalidateCachedTabs(); } + #onTabOpened(event) { + const tab = event.target; + const group = tab.group; + if (!group?.isZenFolder || tab.pinned) return; + // Edge case: In occations where we add a tab with an ownerTab + // inside a folder, the tab gets added into the folder in an + // unpinned state. We need to pin it and re-add it into the folder. + gBrowser.pinTab(tab); + group.addTabs([tab]); + } + #onTabUngrouped(event) { const tab = event.detail; const group = event.target; diff --git a/src/zen/tests/folders/browser.toml b/src/zen/tests/folders/browser.toml index 456ad3139..2503e4b17 100644 --- a/src/zen/tests/folders/browser.toml +++ b/src/zen/tests/folders/browser.toml @@ -2,8 +2,14 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +[DEFAULT] +support-files = [ + "head.js", +] + ["browser_folder_create.js"] ["browser_folder_subfolder.js"] ["browser_folder_basic_toggle.js"] +["browser_folder_owner_tabs.js"] ["browser_folder_issue_9885.js"] diff --git a/src/zen/tests/folders/browser_folder_basic_toggle.js b/src/zen/tests/folders/browser_folder_basic_toggle.js index 6e30bad3a..244a22aec 100644 --- a/src/zen/tests/folders/browser_folder_basic_toggle.js +++ b/src/zen/tests/folders/browser_folder_basic_toggle.js @@ -17,7 +17,5 @@ add_task(async function test_Basic_Toggle() { folder.labelElement.click(); ok(!folder.collapsed, 'Folder should be expanded after clicking on it again'); - const removeEvent = BrowserTestUtils.waitForEvent(folder, 'TabGroupRemoved'); - folder.delete(); - await removeEvent; + await removeFolder(folder); }); diff --git a/src/zen/tests/folders/browser_folder_create.js b/src/zen/tests/folders/browser_folder_create.js index 6a2eebf83..bfd8890da 100644 --- a/src/zen/tests/folders/browser_folder_create.js +++ b/src/zen/tests/folders/browser_folder_create.js @@ -18,9 +18,7 @@ add_task(async function test_Create_Folder() { ok(tab.pinned, 'Tab is pinned after folder creation'); Assert.equal(folder.label, 'test', 'Folder label is set correctly'); ok(!folder.collapsed, 'Folder is expanded after creation'); - const removeEvent = BrowserTestUtils.waitForEvent(window, 'TabGroupRemoved'); - folder.delete(); - await removeEvent; + await removeFolder(folder); Assert.equal(folder.tabs.length, 0, 'Folder is empty after deletion'); ok(!folder.parentElement, 'Folder is removed from the DOM'); ok(tab.closing, 'Tab is closing after folder deletion'); diff --git a/src/zen/tests/folders/browser_folder_issue_9885.js b/src/zen/tests/folders/browser_folder_issue_9885.js index c1d0e6df3..a99234a2c 100644 --- a/src/zen/tests/folders/browser_folder_issue_9885.js +++ b/src/zen/tests/folders/browser_folder_issue_9885.js @@ -23,7 +23,6 @@ add_task(async function test_Issue_9885() { ok(subfolder.collapsed, 'Subfolder should be collapsed after clicking on it'); ok(!parent.collapsed, 'Parent folder should be collapsed after clicking on subfolder'); - const removeEvent = BrowserTestUtils.waitForEvent(parent, 'TabGroupRemoved'); - parent.delete(); - await removeEvent; + await removeFolder(subfolder); + await removeFolder(parent); }); diff --git a/src/zen/tests/folders/browser_folder_owner_tabs.js b/src/zen/tests/folders/browser_folder_owner_tabs.js new file mode 100644 index 000000000..0b11f7034 --- /dev/null +++ b/src/zen/tests/folders/browser_folder_owner_tabs.js @@ -0,0 +1,38 @@ +/* Any copyright is dedicated to the Public Domain. + https://creativecommons.org/publicdomain/zero/1.0/ */ + +'use strict'; + +add_task(async function test_Duplicate_Tab_Inside_Folder() { + const selectedTab = gBrowser.selectedTab; + const tab = BrowserTestUtils.addTab(gBrowser, 'about:blank'); + const folder = await gZenFolders.createFolder([tab], { + renameFolder: false, + }); + gBrowser.selectedTab = tab; + const triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal(); + gBrowser.addTab('https://example.com', { + tabIndex: undefined, + relatedToCurrent: true, + ownerTab: tab, + triggeringPrincipal, + }); + + Assert.equal( + folder.tabs.length, + 3, + 'Folder contains the original tab and the two duplicated tabs' + ); + + await new Promise((resolve) => setTimeout(resolve, 100)); + + for (const t of folder.tabs) { + ok(t.pinned, 'All tabs in the folder should be pinned'); + if (!t.hasAttribute('zen-empty-tab')) { + ok(t.hasAttribute('zen-pin-id'), 'All non-empty tabs should have a zen-pinned-id attribute'); + } + } + + gBrowser.selectedTab = selectedTab; + await removeFolder(folder); +}); diff --git a/src/zen/tests/folders/browser_folder_subfolder.js b/src/zen/tests/folders/browser_folder_subfolder.js index 2ed8efef9..c216cef93 100644 --- a/src/zen/tests/folders/browser_folder_subfolder.js +++ b/src/zen/tests/folders/browser_folder_subfolder.js @@ -23,7 +23,6 @@ add_task(async function test_Create_Folder() { 'Subfolder contains the tab and the empty tab created by Zen Folders' ); Assert.equal(parent.tabs.length, 4, 'Parent folder contains the subfolder'); - const removeEvent = BrowserTestUtils.waitForEvent(window, 'TabGroupRemoved'); - parent.delete(); - await removeEvent; + await removeFolder(subfolder); + await removeFolder(parent); }); diff --git a/src/zen/tests/folders/head.js b/src/zen/tests/folders/head.js new file mode 100644 index 000000000..c5abc6200 --- /dev/null +++ b/src/zen/tests/folders/head.js @@ -0,0 +1,11 @@ +/* Any copyright is dedicated to the Public Domain. + https://creativecommons.org/publicdomain/zero/1.0/ */ + +'use strict'; + +async function removeFolder(folder) { + if (!folder) return; + const removeEvent = BrowserTestUtils.waitForEvent(folder, 'TabGroupRemoved'); + folder.delete(); + await removeEvent; +}