From b185773daf9fd2b92a21389efacc988fffc315df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristijan=20Ribari=C4=87?= Date: Tue, 1 Oct 2024 16:31:58 +0200 Subject: [PATCH 1/8] feat(pinned-tab-url-reset): add option to reset pinned tab to originally pinned url Adds a new setting to enable or disable pinned tab url resetting on pressing close tab shortcut. Persists pinned tab url and label on browser closing. --- src/browser/app/profile/zen-browser.js | 1 + .../components/preferences/zen-settings.js | 5 +++ .../preferences/zenTabsManagement.inc.xhtml | 4 +++ .../tabbrowser/content/tabbrowser-js.patch | 35 ++++++++++++++++--- src/browser/themes/shared/zen-icons/icons.css | 3 +- 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/browser/app/profile/zen-browser.js b/src/browser/app/profile/zen-browser.js index 7f9246f3e..b3d524e4e 100644 --- a/src/browser/app/profile/zen-browser.js +++ b/src/browser/app/profile/zen-browser.js @@ -111,6 +111,7 @@ pref('zen.themes.updated-value-observer', false); pref('zen.tab-unloader.enabled', true); pref('zen.tab-unloader.timeout-minutes', 20); pref('zen.tab-unloader.excluded-urls', "example.com,example.org"); +pref('zen.tab-unloader.reset-pinned-tab-on-close-shortcut', true); // Pref to enable the new profiles (TODO: Check this out!) //pref("browser.profiles.enabled", true); diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js index 36d4de02e..def9b768c 100644 --- a/src/browser/components/preferences/zen-settings.js +++ b/src/browser/components/preferences/zen-settings.js @@ -1020,4 +1020,9 @@ Preferences.addAll([ type: 'bool', default: false, }, + { + id: 'zen.tab-unloader.reset-pinned-tab-on-close-shortcut', + type: 'bool', + default: true, + }, ]); diff --git a/src/browser/components/preferences/zenTabsManagement.inc.xhtml b/src/browser/components/preferences/zenTabsManagement.inc.xhtml index c2b41f34f..d5954db77 100644 --- a/src/browser/components/preferences/zenTabsManagement.inc.xhtml +++ b/src/browser/components/preferences/zenTabsManagement.inc.xhtml @@ -48,6 +48,10 @@ data-l10n-id="zen-tabs-unloader-enabled" preference="zen.tab-unloader.enabled"/> + + diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index bce895bac..92d12be37 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 ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36d7470155 100644 +index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..7ffa8f7d64f2ed13018e3f32f94e7b6835bdacdb 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -452,11 +452,26 @@ @@ -68,7 +68,7 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36 if (!tabData.pinned) { this.unpinTab(tab); } else { -@@ -3297,6 +3328,13 @@ +@@ -3297,6 +3328,12 @@ preferredRemoteType, }); @@ -78,11 +78,24 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36 + if (tabData.zenDefaultUserContextId) { + tab.setAttribute("zenDefaultUserContextId", "true"); + } -+ if (select) { tabToSelect = tab; } -@@ -4184,6 +4222,7 @@ +@@ -3331,7 +3368,13 @@ + this.tabContainer._invalidateCachedTabs(); + } + } ++ if (tabData.zenPinnedUrl) { ++ tab.setAttribute("zen-pinned-url", tabData.zenPinnedUrl); ++ } + ++ if (tabData.zenPinnedTitle) { ++ tab.setAttribute("zen-pinned-title", tabData.zenPinnedTitle); ++ } + tab.initialize(); + } + +@@ -4184,6 +4227,7 @@ isLastTab || aTab.pinned || aTab.hidden || @@ -90,7 +103,7 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36 this._removingTabs.size > 3 /* don't want lots of concurrent animations */ || !aTab.hasAttribute( -@@ -5117,10 +5156,10 @@ +@@ -5117,10 +5161,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); }, @@ -103,3 +116,15 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36 aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. +@@ -7822,7 +7866,10 @@ var TabContextMenu = { + ); + contextUnpinSelectedTabs.hidden = + !this.contextTab.pinned || !multiselectionContext; +- ++ let contextResetPinnedTab = document.getElementById("context_zen-reset-pinned-tab"); ++ if(contextResetPinnedTab) { ++ contextResetPinnedTab.hidden = !this.contextTab.pinned || !this.contextTab.getAttribute("zen-pinned-url") || multiselectionContext; ++ } + // Move Tab items + let contextMoveTabOptions = document.getElementById( + "context_moveTabOptions" diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index 5c671b7d4..802abe4a9 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -773,7 +773,8 @@ menuitem[id='placesContext_deleteHost'], #context_reloadTab, #context_reloadSelectedTabs, #toolbar-context-reloadSelectedTab, -#toolbar-context-reloadSelectedTabs { +#toolbar-context-reloadSelectedTabs, +#context_zen-reset-pinned-tab { --menu-image: url('reload.svg'); } From 43834e57f026784bf23c14264e8510a324c6b145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristijan=20Ribari=C4=87?= Date: Tue, 1 Oct 2024 18:11:27 +0200 Subject: [PATCH 2/8] feat(sessionstore): Add pinned url, and pinned title to tab state Adds `zenPinnedUrl`, and `zenPinnedTitle` attributes to the tab state to persist pinned tab information. This allows users to restore their previous Zen pinned base url configuration upon restarting the browser. --- src/browser/components/sessionstore/TabState-sys-mjs.patch | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/browser/components/sessionstore/TabState-sys-mjs.patch b/src/browser/components/sessionstore/TabState-sys-mjs.patch index 1d2056633..27af3b860 100644 --- a/src/browser/components/sessionstore/TabState-sys-mjs.patch +++ b/src/browser/components/sessionstore/TabState-sys-mjs.patch @@ -1,13 +1,15 @@ diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs -index 26f5671c849d9b0a126d79b07bc7d3d7870826ec..26f80d69a28f1196096e67a0e628a69b5b367727 100644 +index 26f5671c849d9b0a126d79b07bc7d3d7870826ec..3726c8d89c9a8f797fda4ef3c18e4fa81f3ad130 100644 --- a/browser/components/sessionstore/TabState.sys.mjs +++ b/browser/components/sessionstore/TabState.sys.mjs -@@ -98,6 +98,9 @@ var TabStateInternal = { +@@ -98,6 +98,11 @@ var TabStateInternal = { tabData.muteReason = tab.muteReason; } + tabData.zenWorkspace = tab.getAttribute("zen-workspace-id"); + tabData.zenDefaultUserContextId = tab.getAttribute("zenDefaultUserContextId"); ++ tabData.zenPinnedUrl = tab.getAttribute("zen-pinned-url"); ++ tabData.zenPinnedTitle = tab.getAttribute("zen-pinned-title"); + tabData.searchMode = tab.ownerGlobal.gURLBar.getSearchMode(browser, true); From 6dcff571d2bc3d473166b0a1070fef9a06ad728e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristijan=20Ribari=C4=87?= Date: Mon, 7 Oct 2024 16:58:01 +0200 Subject: [PATCH 3/8] feat(zen-pinned-tab-manager): Add pinned tab management functionality This commit introduces a new feature: pinned tab management. It allows users to pin tabs and define whether to reset pinned tabs on close. - Adds a new `ZenPinnedTabManager` component to manage pinned tabs. - Updates `zen-assets.inc.xhtml` and `zen-assets.jar.inc.mn` to include the new component. - Modifies the `ZenStartup.mjs` file to initialize the new manager. - Introduces a new preference `zen.pinned-tab-manager.reset-pinned-tab-on-close-shortcut` to control the behavior of pinned tabs on close. - Updates the settings UI to reflect the new pinned tab management functionality. - Refactors related preferences from `zen.tab-unloader.*` to `zen.pinned-tab-manager.*`. This feature enhances Zen's tab management capabilities by providing users with more control over their pinned tabs. --- src/browser/app/profile/zen-browser.js | 3 ++- src/browser/base/content/ZenStartup.mjs | 1 + src/browser/base/content/zen-assets.inc.xhtml | 1 + .../base/content/zen-assets.jar.inc.mn | 1 + .../components/preferences/zen-settings.js | 2 +- .../preferences/zenTabsManagement.inc.xhtml | 19 ++++++++++++++++--- 6 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/browser/app/profile/zen-browser.js b/src/browser/app/profile/zen-browser.js index b3d524e4e..b2713aa9e 100644 --- a/src/browser/app/profile/zen-browser.js +++ b/src/browser/app/profile/zen-browser.js @@ -111,7 +111,8 @@ pref('zen.themes.updated-value-observer', false); pref('zen.tab-unloader.enabled', true); pref('zen.tab-unloader.timeout-minutes', 20); pref('zen.tab-unloader.excluded-urls', "example.com,example.org"); -pref('zen.tab-unloader.reset-pinned-tab-on-close-shortcut', true); + +pref('zen.pinned-tab-manager.reset-pinned-tab-on-close-shortcut', true); // Pref to enable the new profiles (TODO: Check this out!) //pref("browser.profiles.enabled", true); diff --git a/src/browser/base/content/ZenStartup.mjs b/src/browser/base/content/ZenStartup.mjs index c9fc37e71..505793fd8 100644 --- a/src/browser/base/content/ZenStartup.mjs +++ b/src/browser/base/content/ZenStartup.mjs @@ -39,6 +39,7 @@ gZenUIManager.init(); gZenVerticalTabsManager.init(); gZenCompactModeManager.init(); + gZenPinnedTabManager.init(); function throttle(f, delay) { let timer = 0; diff --git a/src/browser/base/content/zen-assets.inc.xhtml b/src/browser/base/content/zen-assets.inc.xhtml index 74d0d6af7..737eab480 100644 --- a/src/browser/base/content/zen-assets.inc.xhtml +++ b/src/browser/base/content/zen-assets.inc.xhtml @@ -31,6 +31,7 @@