test: Added tests for folders opening from owner tabs, b=no-bug, c=folders, tests, tabs

This commit is contained in:
Mr. M
2025-08-16 17:20:20 +02:00
parent 5dcc6d5f44
commit f2fcee9605
9 changed files with 78 additions and 20 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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"]

View File

@@ -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);
});

View File

@@ -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');

View File

@@ -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);
});

View File

@@ -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);
});

View File

@@ -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);
});

View File

@@ -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;
}