From 47181da49e18f8822ae95566c227c986106f0520 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sat, 27 Sep 2025 19:04:59 +0200 Subject: [PATCH 001/111] feat: Improved startup performance and flashes, p=#10588, c=common, tabs, workspaces --- src/zen/ZenComponents.manifest | 30 +++++++++ src/zen/common/ZenStartup.mjs | 36 +++++------ src/zen/moz.build | 4 ++ src/zen/tabs/zen-tabs/vertical-tabs.css | 4 +- src/zen/workspaces/ZenWorkspaces.mjs | 84 ++++++++++++------------- 5 files changed, 91 insertions(+), 67 deletions(-) create mode 100644 src/zen/ZenComponents.manifest diff --git a/src/zen/ZenComponents.manifest b/src/zen/ZenComponents.manifest new file mode 100644 index 000000000..bb5094206 --- /dev/null +++ b/src/zen/ZenComponents.manifest @@ -0,0 +1,30 @@ +# nsBrowserGlue.js + +# This component must restrict its registration for the app-startup category +# to the specific list of apps that use it so it doesn't get loaded in xpcshell. +# Thus we restrict it to these apps: +# +# browser: {ec8030f7-c20a-464f-9b0e-13a3a9e97384} +# +# The first rule of running code during startup is: don't. +# +# We take performance very seriously and ideally your component/feature should +# initialize only when needed. +# +# If you have established that you really must run code during startup, +# available entrypoints are: +# +# - registering a `browser-idle-startup` category entry for your JS module (or +# even a "best effort" user idle task, see `BrowserGlue.sys.mjs`) +# - registering a `browser-window-delayed-startup` category entry for your JS +# module. **Note that this is invoked for each browser window.** +# - registering a `browser-before-ui-startup` category entry if you really really +# need to. This will run code before the first browser window appears on the +# screen and make Firefox seem slow, so please don't do it unless absolutely +# necessary. + +#ifdef XP_UNIX + #ifndef XP_MACOSX + #define UNIX_BUT_NOT_MAC + #endif +#endif diff --git a/src/zen/common/ZenStartup.mjs b/src/zen/common/ZenStartup.mjs index 3fa3d061c..ad4c4e775 100644 --- a/src/zen/common/ZenStartup.mjs +++ b/src/zen/common/ZenStartup.mjs @@ -2,22 +2,25 @@ // 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/. { - var gZenStartup = new (class { + class ZenStartupManager { #watermarkIgnoreElements = ['zen-toast-container']; #hasInitializedLayout = false; isReady = false; - async init() { - // important: We do this to ensure that some firefox components - // are initialized before we start our own initialization. - // please, do not remove this line and if you do, make sure to - // test the startup process. - await new Promise((resolve) => setTimeout(resolve, 0)); - this.openWatermark(); - this.#initBrowserBackground(); - this.#changeSidebarLocation(); - this.#zenInitBrowserLayout(); + constructor() { + gZenWorkspaces.init(); + + window.addEventListener( + 'MozBeforeInitialXULLayout', + () => { + this.openWatermark(); + this.#zenInitBrowserLayout(); + this.#initBrowserBackground(); + this.#changeSidebarLocation(); + }, + { once: true } + ); } #initBrowserBackground() { @@ -57,7 +60,6 @@ document.getElementById('zen-appcontent-wrapper').prepend(deckTemplate); } - gZenWorkspaces.init(); setTimeout(() => { gZenUIManager.init(); this.#checkForWelcomePage(); @@ -223,13 +225,7 @@ }); }); } - })(); + } - window.addEventListener( - 'MozBeforeInitialXULLayout', - () => { - gZenStartup.init(); - }, - { once: true } - ); + window.gZenStartup = new ZenStartupManager(); } diff --git a/src/zen/moz.build b/src/zen/moz.build index 56782122f..ac8965447 100644 --- a/src/zen/moz.build +++ b/src/zen/moz.build @@ -10,3 +10,7 @@ DIRS += [ "urlbar", "toolkit", ] + +EXTRA_PP_COMPONENTS += [ + "ZenComponents.manifest", +] diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index 0012ebfd6..1a7cb15e6 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -418,13 +418,13 @@ overflow-y: auto; height: 100%; - :root[zen-workspace-id][zen-sidebar-expanded='true'] & { + :root[zen-sidebar-expanded='true'] & { margin-left: calc(-1 * var(--zen-toolbox-padding)); width: calc(100% + var(--zen-toolbox-padding) * 2); } } -:root[zen-workspace-id] #pinned-tabs-container { +#pinned-tabs-container { display: none; } diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index ea881aeff..1fb1476c9 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -51,7 +51,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { await Promise.all([this.promiseDBInitialized, this.promisePinnedInitialized]); } - async init() { + init() { // Initialize tab selection state this._tabSelectionState = { inProgress: false, @@ -118,12 +118,8 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { this.popupOpenHandler = this._popupOpenHandler.bind(this); window.addEventListener('resize', this.onWindowResize.bind(this)); - this.addPopupListeners(); - await this.#waitForPromises(); - await this._workspaces(); - - await this.afterLoadInit(); + this.afterLoadInit(); } log(...args) { @@ -136,11 +132,13 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { if (!this._hasInitializedTabsStrip) { await this.delayedStartup(); } - this._initializeWorkspaceTabContextMenus(); + this.#initializeWorkspaceTabContextMenus(); await this.initializeWorkspaces(); await this.promiseSectionsInitialized; // Non UI related initializations + this.addPopupListeners(); + if ( Services.prefs.getBoolPref('zen.workspaces.swipe-actions', false) && this.workspaceEnabled && @@ -311,6 +309,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { } async _createDefaultWorkspaceIfNeeded() { + await this.#waitForPromises(); const workspaces = await this._workspaces(); if (!workspaces.workspaces.length) { await this.createAndSaveWorkspace('Space', null, true); @@ -401,46 +400,42 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { async initializeTabsStripSections() { await SessionStore.promiseInitialized; await SessionStore.promiseAllWindowsRestored; + await gZenSessionStore.promiseInitialized; const perifery = document.getElementById('tabbrowser-arrowscrollbox-periphery'); perifery.setAttribute('hidden', 'true'); - await new Promise((resolve) => { - setTimeout(async () => { - const tabs = gBrowser.tabContainer.allTabs; - const workspaces = await this._workspaces(); - for (const workspace of workspaces.workspaces) { - await this._createWorkspaceTabsSection(workspace, tabs); - } - if (tabs.length) { - const defaultSelectedContainer = this.workspaceElement( - this.activeWorkspace - )?.querySelector('.zen-workspace-normal-tabs-section'); - const pinnedContainer = this.workspaceElement(this.activeWorkspace).querySelector( - '.zen-workspace-pinned-tabs-section' - ); - // New profile with no workspaces does not have a default selected container - if (defaultSelectedContainer) { - for (const tab of tabs) { - if (tab.hasAttribute('zen-essential')) { - this.getEssentialsSection(tab).appendChild(tab); - continue; - } else if (tab.pinned) { - pinnedContainer.insertBefore(tab, pinnedContainer.lastChild); - continue; - } - // before to the last child (perifery) - defaultSelectedContainer.insertBefore(tab, defaultSelectedContainer.lastChild); - } + const tabs = gBrowser.tabContainer.allTabs; + const workspaces = await this._workspaces(); + for (const workspace of workspaces.workspaces) { + await this._createWorkspaceTabsSection(workspace, tabs); + } + if (tabs.length) { + const defaultSelectedContainer = this.workspaceElement(this.activeWorkspace)?.querySelector( + '.zen-workspace-normal-tabs-section' + ); + const pinnedContainer = this.workspaceElement(this.activeWorkspace).querySelector( + '.zen-workspace-pinned-tabs-section' + ); + // New profile with no workspaces does not have a default selected container + if (defaultSelectedContainer) { + for (const tab of tabs) { + if (tab.hasAttribute('zen-essential')) { + this.getEssentialsSection(tab).appendChild(tab); + continue; + } else if (tab.pinned) { + pinnedContainer.insertBefore(tab, pinnedContainer.lastChild); + continue; } - gBrowser.tabContainer._invalidateCachedTabs(); + // before to the last child (perifery) + defaultSelectedContainer.insertBefore(tab, defaultSelectedContainer.lastChild); } - perifery.setAttribute('hidden', 'true'); - this._hasInitializedTabsStrip = true; - this.registerPinnedResizeObserver(); - this._fixIndicatorsNames(workspaces); - this._resolveSectionsInitialized(); - resolve(); - }, 0); - }); + } + gBrowser.tabContainer._invalidateCachedTabs(); + } + perifery.setAttribute('hidden', 'true'); + this._hasInitializedTabsStrip = true; + this.registerPinnedResizeObserver(); + this._fixIndicatorsNames(workspaces); + this._resolveSectionsInitialized(); } getEssentialsSection(container = 0) { @@ -920,7 +915,6 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { async initializeWorkspaces() { let activeWorkspace = await this.getActiveWorkspace(); this.activeWorkspace = activeWorkspace?.uuid; - await gZenSessionStore.promiseInitialized; try { if (activeWorkspace) { window.gZenThemePicker = new nsZenThemePicker(); @@ -2660,7 +2654,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { await this.changeWorkspace(nextWorkspace, { whileScrolling }); } - _initializeWorkspaceTabContextMenus() { + #initializeWorkspaceTabContextMenus() { if (this.privateWindowOrDisabled) { const commandsToDisable = [ 'cmd_zenOpenFolderCreation', From b1d6e0eb219abeaa35facecbed175880486b28d9 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 28 Sep 2025 00:59:00 +0200 Subject: [PATCH 002/111] feat: Small tweaks to the command bar animations, b=no-bug, c=common --- .../urlbar/UrlbarProvidersManager-sys-mjs.patch | 12 ++++++++++++ src/zen/common/ZenUIManager.mjs | 2 +- src/zen/common/styles/zen-animations.css | 9 +++++++-- src/zen/common/styles/zen-omnibox.css | 9 +++++---- src/zen/urlbar/ZenUBActionsProvider.sys.mjs | 14 ++++++++++---- src/zen/urlbar/ZenUBGlobalActions.sys.mjs | 10 +++++----- src/zen/urlbar/ZenUBResultsLearner.sys.mjs | 2 +- 7 files changed, 41 insertions(+), 17 deletions(-) create mode 100644 src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch diff --git a/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch new file mode 100644 index 000000000..45f6b46e9 --- /dev/null +++ b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch @@ -0,0 +1,12 @@ +diff --git a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs +index 555273f6ea1efd77aa3062b9910bbfe28568775d..5c4a46c926913ab592f5e12908b8817410abe6b6 100644 +--- a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs ++++ b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs +@@ -716,6 +716,7 @@ export class Query { + if ( + result.heuristic && + this.context.searchMode && ++ !(this.context.searchMode.source === lazy.UrlbarUtils.RESULT_SOURCE.ZEN_ACTIONS && result.payload?.zenAction) && + (!this.context.trimmedSearchString || + (!this.context.searchMode.engineName && !result.autofill)) + ) { diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs index cf6e04202..dc3d44ba8 100644 --- a/src/zen/common/ZenUIManager.mjs +++ b/src/zen/common/ZenUIManager.mjs @@ -260,7 +260,7 @@ var gZenUIManager = { gURLBar.removeAttribute('animate-searchmode'); delete this._animatingSearchModeTimeout; }); - }, 700); + }, 1000); } } }, diff --git a/src/zen/common/styles/zen-animations.css b/src/zen/common/styles/zen-animations.css index 5d3c6d091..efdc0b6df 100644 --- a/src/zen/common/styles/zen-animations.css +++ b/src/zen/common/styles/zen-animations.css @@ -103,10 +103,15 @@ /* Mark: URL Bar */ @keyframes zen-urlbar-searchmode { 0% { - box-shadow: 0 0 20px color-mix(in srgb, var(--zen-primary-color), var(--toolbox-textcolor) 20%); + box-shadow: 0 0 20px + color-mix( + in srgb, + color-mix(in srgb, var(--zen-primary-color), var(--toolbox-textcolor) 20%), + light-dark(rgba(0, 0, 0, 0.3), transparent) 50% + ); } 100% { - box-shadow: 0 0 300px color-mix(in srgb, var(--zen-primary-color), transparent 100%); + box-shadow: 0 0 250px color-mix(in srgb, var(--zen-primary-color), transparent 100%); } } diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 1b6db9023..421641b4f 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -172,8 +172,8 @@ & .urlbar-background { --zen-urlbar-background-base: light-dark( - white, - color-mix(in srgb, hsl(0, 0%, 1%), var(--zen-colors-primary) 25%) + #fbfbfb, + color-mix(in srgb, hsl(0, 0%, 1%), var(--zen-colors-primary) 30%) ); @media -moz-pref('zen.theme.acrylic-elements') { --zen-urlbar-background-transparent: color-mix( @@ -186,7 +186,7 @@ --zen-urlbar-background-transparent, var(--zen-urlbar-background-base) ) !important; - box-shadow: 0px 0px 90px -10px light-dark(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.75)) !important; + box-shadow: 0px 30px 140px -15px light-dark(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6)) !important; backdrop-filter: none !important; outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2)) !important; outline-offset: var(--zen-urlbar-outline-offset) !important; @@ -208,7 +208,7 @@ height: 100%; border-radius: inherit; pointer-events: none; - animation: zen-urlbar-searchmode ease-out 0.7s forwards; + animation: zen-urlbar-searchmode ease-out 1s forwards; } } @@ -678,4 +678,5 @@ #urlbar-search-mode-indicator-title { font-weight: 600; + padding: 0px; } diff --git a/src/zen/urlbar/ZenUBActionsProvider.sys.mjs b/src/zen/urlbar/ZenUBActionsProvider.sys.mjs index d8ba00fe4..898aa9373 100644 --- a/src/zen/urlbar/ZenUBActionsProvider.sys.mjs +++ b/src/zen/urlbar/ZenUBActionsProvider.sys.mjs @@ -15,7 +15,7 @@ const DYNAMIC_TYPE_NAME = 'zen-actions'; const MAX_RECENT_ACTIONS = 5; const MINIMUM_QUERY_SCORE = 92; -const MINIMUM_PREFIXED_QUERY_SCORE = 50; +const MINIMUM_PREFIXED_QUERY_SCORE = 30; ChromeUtils.defineESModuleGetters(lazy, { UrlbarResult: 'resource:///modules/UrlbarResult.sys.mjs', @@ -242,15 +242,15 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { } const ownerGlobal = lazy.BrowserWindowTracker.getTopWindow(); - const finalResults = []; + let finalResults = []; for (const action of actionsResults) { const [payload, payloadHighlights] = lazy.UrlbarResult.payloadAndSimpleHighlights([], { suggestion: action.label, title: action.label, - query: queryContext.searchString, zenCommand: action.command, dynamicType: DYNAMIC_TYPE_NAME, zenAction: true, + query: isPrefixed ? action.label.trimStart() : queryContext.searchString, icon: action.icon, shortcutContent: ownerGlobal.gZenKeyboardShortcutsManager.getShortcutDisplayFromCommand( action.command @@ -265,7 +265,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { payload, payloadHighlights ); - if (zenUrlbarResultsLearner.shouldPrioritize(action.commandId)) { + if (zenUrlbarResultsLearner.shouldPrioritize(action.commandId) && !isPrefixed) { result.heuristic = true; } else { result.suggestedIndex = zenUrlbarResultsLearner.getDeprioritizeIndex(action.commandId); @@ -278,8 +278,14 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { } finalResults.push(result); } + let i = 0; zenUrlbarResultsLearner.sortCommandsByPriority(finalResults).forEach((result) => { + if (isPrefixed && i === 0 && query.length > 1) { + result.heuristic = true; + delete result.suggestedIndex; + } addCallback(this, result); + i++; }); } diff --git a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs index ba5a88abe..8418e14be 100644 --- a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs +++ b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs @@ -37,16 +37,16 @@ const globalActionsTemplate = [ command: (window) => window.openPreferences(), icon: 'chrome://browser/skin/zen-icons/settings.svg', }, - { - label: 'Open New Window', - command: 'cmd_newNavigator', - icon: 'chrome://browser/skin/zen-icons/window.svg', - }, { label: 'Open Private Window', command: 'Tools:PrivateBrowsing', icon: 'chrome://browser/skin/zen-icons/private-window.svg', }, + { + label: 'Open New Window', + command: 'cmd_newNavigator', + icon: 'chrome://browser/skin/zen-icons/window.svg', + }, { label: 'Pin Tab', command: 'cmd_zenTogglePinTab', diff --git a/src/zen/urlbar/ZenUBResultsLearner.sys.mjs b/src/zen/urlbar/ZenUBResultsLearner.sys.mjs index 99165f85f..73f78facb 100644 --- a/src/zen/urlbar/ZenUBResultsLearner.sys.mjs +++ b/src/zen/urlbar/ZenUBResultsLearner.sys.mjs @@ -7,7 +7,7 @@ import { XPCOMUtils } from 'resource://gre/modules/XPCOMUtils.sys.mjs'; const lazy = {}; const DEFAULT_DB_DATA = '{}'; -const DEPRIORITIZE_MAX = -4; +const DEPRIORITIZE_MAX = -5; const PRIORITIZE_MAX = 5; XPCOMUtils.defineLazyPreferenceGetter( From 3146ec1c3be963fec045b4f97d12fc187214076b Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Sun, 28 Sep 2025 13:44:14 +0200 Subject: [PATCH 003/111] fix: Fixed toolbar bg not showing until hover, b=closes #10595, c=compact-mode, workspaces --- src/zen/compact-mode/zen-compact-mode.css | 6 +++--- src/zen/workspaces/zen-workspaces.css | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/zen/compact-mode/zen-compact-mode.css b/src/zen/compact-mode/zen-compact-mode.css index 4f8f6aaa4..235cf8a78 100644 --- a/src/zen/compact-mode/zen-compact-mode.css +++ b/src/zen/compact-mode/zen-compact-mode.css @@ -322,6 +322,9 @@ } & #zen-appcontent-navbar-wrapper { + & .zen-toolbar-background { + display: flex; + } --zen-compact-toolbar-offset: 5px; position: absolute; top: calc(-1 * var(--zen-toolbar-height) + 1px); @@ -360,9 +363,6 @@ ) { & #zen-appcontent-navbar-container { visibility: visible !important; - & .zen-toolbar-background { - display: flex; - } } border-top-width: 0px; diff --git a/src/zen/workspaces/zen-workspaces.css b/src/zen/workspaces/zen-workspaces.css index a37da3d66..da2e8116c 100644 --- a/src/zen/workspaces/zen-workspaces.css +++ b/src/zen/workspaces/zen-workspaces.css @@ -48,6 +48,10 @@ &:is(img) { padding: 6px; + + :root:not([zen-sidebar-expanded='true']) & { + padding: 10px; + } } &[no-icon='true'] { From 88f26d8829ed1241f087fa88176d966276b78359 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 28 Sep 2025 16:06:17 +0200 Subject: [PATCH 004/111] =?UTF-8?q?Revert=20"feat:=20Improved=20startup=20?= =?UTF-8?q?performance=20and=20flashes,=20p=3D#10588,=20c=3Dcommon,=20t?= =?UTF-8?q?=E2=80=A6"=20(#10604)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/zen/ZenComponents.manifest | 30 --------- src/zen/common/ZenStartup.mjs | 36 ++++++----- src/zen/moz.build | 4 -- src/zen/tabs/zen-tabs/vertical-tabs.css | 4 +- src/zen/workspaces/ZenWorkspaces.mjs | 86 +++++++++++++------------ 5 files changed, 68 insertions(+), 92 deletions(-) delete mode 100644 src/zen/ZenComponents.manifest diff --git a/src/zen/ZenComponents.manifest b/src/zen/ZenComponents.manifest deleted file mode 100644 index bb5094206..000000000 --- a/src/zen/ZenComponents.manifest +++ /dev/null @@ -1,30 +0,0 @@ -# nsBrowserGlue.js - -# This component must restrict its registration for the app-startup category -# to the specific list of apps that use it so it doesn't get loaded in xpcshell. -# Thus we restrict it to these apps: -# -# browser: {ec8030f7-c20a-464f-9b0e-13a3a9e97384} -# -# The first rule of running code during startup is: don't. -# -# We take performance very seriously and ideally your component/feature should -# initialize only when needed. -# -# If you have established that you really must run code during startup, -# available entrypoints are: -# -# - registering a `browser-idle-startup` category entry for your JS module (or -# even a "best effort" user idle task, see `BrowserGlue.sys.mjs`) -# - registering a `browser-window-delayed-startup` category entry for your JS -# module. **Note that this is invoked for each browser window.** -# - registering a `browser-before-ui-startup` category entry if you really really -# need to. This will run code before the first browser window appears on the -# screen and make Firefox seem slow, so please don't do it unless absolutely -# necessary. - -#ifdef XP_UNIX - #ifndef XP_MACOSX - #define UNIX_BUT_NOT_MAC - #endif -#endif diff --git a/src/zen/common/ZenStartup.mjs b/src/zen/common/ZenStartup.mjs index ad4c4e775..3fa3d061c 100644 --- a/src/zen/common/ZenStartup.mjs +++ b/src/zen/common/ZenStartup.mjs @@ -2,25 +2,22 @@ // 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/. { - class ZenStartupManager { + var gZenStartup = new (class { #watermarkIgnoreElements = ['zen-toast-container']; #hasInitializedLayout = false; isReady = false; - constructor() { - gZenWorkspaces.init(); - - window.addEventListener( - 'MozBeforeInitialXULLayout', - () => { - this.openWatermark(); - this.#zenInitBrowserLayout(); - this.#initBrowserBackground(); - this.#changeSidebarLocation(); - }, - { once: true } - ); + async init() { + // important: We do this to ensure that some firefox components + // are initialized before we start our own initialization. + // please, do not remove this line and if you do, make sure to + // test the startup process. + await new Promise((resolve) => setTimeout(resolve, 0)); + this.openWatermark(); + this.#initBrowserBackground(); + this.#changeSidebarLocation(); + this.#zenInitBrowserLayout(); } #initBrowserBackground() { @@ -60,6 +57,7 @@ document.getElementById('zen-appcontent-wrapper').prepend(deckTemplate); } + gZenWorkspaces.init(); setTimeout(() => { gZenUIManager.init(); this.#checkForWelcomePage(); @@ -225,7 +223,13 @@ }); }); } - } + })(); - window.gZenStartup = new ZenStartupManager(); + window.addEventListener( + 'MozBeforeInitialXULLayout', + () => { + gZenStartup.init(); + }, + { once: true } + ); } diff --git a/src/zen/moz.build b/src/zen/moz.build index ac8965447..56782122f 100644 --- a/src/zen/moz.build +++ b/src/zen/moz.build @@ -10,7 +10,3 @@ DIRS += [ "urlbar", "toolkit", ] - -EXTRA_PP_COMPONENTS += [ - "ZenComponents.manifest", -] diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index 1a7cb15e6..0012ebfd6 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -418,13 +418,13 @@ overflow-y: auto; height: 100%; - :root[zen-sidebar-expanded='true'] & { + :root[zen-workspace-id][zen-sidebar-expanded='true'] & { margin-left: calc(-1 * var(--zen-toolbox-padding)); width: calc(100% + var(--zen-toolbox-padding) * 2); } } -#pinned-tabs-container { +:root[zen-workspace-id] #pinned-tabs-container { display: none; } diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 1fb1476c9..ea881aeff 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -51,7 +51,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { await Promise.all([this.promiseDBInitialized, this.promisePinnedInitialized]); } - init() { + async init() { // Initialize tab selection state this._tabSelectionState = { inProgress: false, @@ -118,8 +118,12 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { this.popupOpenHandler = this._popupOpenHandler.bind(this); window.addEventListener('resize', this.onWindowResize.bind(this)); + this.addPopupListeners(); - this.afterLoadInit(); + await this.#waitForPromises(); + await this._workspaces(); + + await this.afterLoadInit(); } log(...args) { @@ -132,13 +136,11 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { if (!this._hasInitializedTabsStrip) { await this.delayedStartup(); } - this.#initializeWorkspaceTabContextMenus(); + this._initializeWorkspaceTabContextMenus(); await this.initializeWorkspaces(); await this.promiseSectionsInitialized; // Non UI related initializations - this.addPopupListeners(); - if ( Services.prefs.getBoolPref('zen.workspaces.swipe-actions', false) && this.workspaceEnabled && @@ -309,7 +311,6 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { } async _createDefaultWorkspaceIfNeeded() { - await this.#waitForPromises(); const workspaces = await this._workspaces(); if (!workspaces.workspaces.length) { await this.createAndSaveWorkspace('Space', null, true); @@ -400,42 +401,46 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { async initializeTabsStripSections() { await SessionStore.promiseInitialized; await SessionStore.promiseAllWindowsRestored; - await gZenSessionStore.promiseInitialized; const perifery = document.getElementById('tabbrowser-arrowscrollbox-periphery'); perifery.setAttribute('hidden', 'true'); - const tabs = gBrowser.tabContainer.allTabs; - const workspaces = await this._workspaces(); - for (const workspace of workspaces.workspaces) { - await this._createWorkspaceTabsSection(workspace, tabs); - } - if (tabs.length) { - const defaultSelectedContainer = this.workspaceElement(this.activeWorkspace)?.querySelector( - '.zen-workspace-normal-tabs-section' - ); - const pinnedContainer = this.workspaceElement(this.activeWorkspace).querySelector( - '.zen-workspace-pinned-tabs-section' - ); - // New profile with no workspaces does not have a default selected container - if (defaultSelectedContainer) { - for (const tab of tabs) { - if (tab.hasAttribute('zen-essential')) { - this.getEssentialsSection(tab).appendChild(tab); - continue; - } else if (tab.pinned) { - pinnedContainer.insertBefore(tab, pinnedContainer.lastChild); - continue; - } - // before to the last child (perifery) - defaultSelectedContainer.insertBefore(tab, defaultSelectedContainer.lastChild); + await new Promise((resolve) => { + setTimeout(async () => { + const tabs = gBrowser.tabContainer.allTabs; + const workspaces = await this._workspaces(); + for (const workspace of workspaces.workspaces) { + await this._createWorkspaceTabsSection(workspace, tabs); } - } - gBrowser.tabContainer._invalidateCachedTabs(); - } - perifery.setAttribute('hidden', 'true'); - this._hasInitializedTabsStrip = true; - this.registerPinnedResizeObserver(); - this._fixIndicatorsNames(workspaces); - this._resolveSectionsInitialized(); + if (tabs.length) { + const defaultSelectedContainer = this.workspaceElement( + this.activeWorkspace + )?.querySelector('.zen-workspace-normal-tabs-section'); + const pinnedContainer = this.workspaceElement(this.activeWorkspace).querySelector( + '.zen-workspace-pinned-tabs-section' + ); + // New profile with no workspaces does not have a default selected container + if (defaultSelectedContainer) { + for (const tab of tabs) { + if (tab.hasAttribute('zen-essential')) { + this.getEssentialsSection(tab).appendChild(tab); + continue; + } else if (tab.pinned) { + pinnedContainer.insertBefore(tab, pinnedContainer.lastChild); + continue; + } + // before to the last child (perifery) + defaultSelectedContainer.insertBefore(tab, defaultSelectedContainer.lastChild); + } + } + gBrowser.tabContainer._invalidateCachedTabs(); + } + perifery.setAttribute('hidden', 'true'); + this._hasInitializedTabsStrip = true; + this.registerPinnedResizeObserver(); + this._fixIndicatorsNames(workspaces); + this._resolveSectionsInitialized(); + resolve(); + }, 0); + }); } getEssentialsSection(container = 0) { @@ -915,6 +920,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { async initializeWorkspaces() { let activeWorkspace = await this.getActiveWorkspace(); this.activeWorkspace = activeWorkspace?.uuid; + await gZenSessionStore.promiseInitialized; try { if (activeWorkspace) { window.gZenThemePicker = new nsZenThemePicker(); @@ -2654,7 +2660,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { await this.changeWorkspace(nextWorkspace, { whileScrolling }); } - #initializeWorkspaceTabContextMenus() { + _initializeWorkspaceTabContextMenus() { if (this.privateWindowOrDisabled) { const commandsToDisable = [ 'cmd_zenOpenFolderCreation', From 9a1c466368fbe353376e89bac77cc8f6465151d7 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 28 Sep 2025 16:06:56 +0200 Subject: [PATCH 005/111] New Crowdin updates (#10591) --- locales/ca/browser/browser/zen-general.ftl | 2 +- locales/fr/browser/browser/zen-general.ftl | 2 +- locales/id/browser/browser/zen-general.ftl | 2 +- locales/ko/browser/browser/zen-general.ftl | 2 +- locales/uk/browser/browser/zen-general.ftl | 2 +- .../browser/preferences/zen-preferences.ftl | 30 ++++++------- locales/zh-TW/browser/browser/zen-folders.ftl | 22 +++++----- locales/zh-TW/browser/browser/zen-general.ftl | 22 +++++----- .../zh-TW/browser/browser/zen-split-view.ftl | 8 ++-- .../browser/browser/zen-vertical-tabs.ftl | 4 +- locales/zh-TW/browser/browser/zen-welcome.ftl | 42 +++++++++---------- .../zh-TW/browser/browser/zen-workspaces.ftl | 18 ++++---- 12 files changed, 78 insertions(+), 78 deletions(-) diff --git a/locales/ca/browser/browser/zen-general.ftl b/locales/ca/browser/browser/zen-general.ftl index 431a5b481..3e179f989 100644 --- a/locales/ca/browser/browser/zen-general.ftl +++ b/locales/ca/browser/browser/zen-general.ftl @@ -48,4 +48,4 @@ zen-icons-picker-emoji = .label = Emojis zen-icons-picker-svg = .label = Icones -urlbar-search-mode-zen_actions = Actions +urlbar-search-mode-zen_actions = Accions diff --git a/locales/fr/browser/browser/zen-general.ftl b/locales/fr/browser/browser/zen-general.ftl index 9da276624..ac5901c12 100644 --- a/locales/fr/browser/browser/zen-general.ftl +++ b/locales/fr/browser/browser/zen-general.ftl @@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab = .label = Réinitialiser l’onglet épinglé .accesskey = R tab-context-zen-add-essential = - .label = Ajouter aux Essentials ({ $num } / 12 emplacements remplis) + .label = Ajouter aux Essentials ({ $num }/12 emplacements occupés) .accesskey = E tab-context-zen-remove-essential = .label = Retirer des Essentials diff --git a/locales/id/browser/browser/zen-general.ftl b/locales/id/browser/browser/zen-general.ftl index 95b79faf8..1cf6f1395 100644 --- a/locales/id/browser/browser/zen-general.ftl +++ b/locales/id/browser/browser/zen-general.ftl @@ -48,4 +48,4 @@ zen-icons-picker-emoji = .label = Emoji zen-icons-picker-svg = .label = Ikon -urlbar-search-mode-zen_actions = Actions +urlbar-search-mode-zen_actions = Aksi diff --git a/locales/ko/browser/browser/zen-general.ftl b/locales/ko/browser/browser/zen-general.ftl index ed8d73e31..113315eb6 100644 --- a/locales/ko/browser/browser/zen-general.ftl +++ b/locales/ko/browser/browser/zen-general.ftl @@ -48,4 +48,4 @@ zen-icons-picker-emoji = .label = 이모티콘 zen-icons-picker-svg = .label = 아이콘 -urlbar-search-mode-zen_actions = Actions +urlbar-search-mode-zen_actions = 액션 diff --git a/locales/uk/browser/browser/zen-general.ftl b/locales/uk/browser/browser/zen-general.ftl index 0b319fc20..64539a461 100644 --- a/locales/uk/browser/browser/zen-general.ftl +++ b/locales/uk/browser/browser/zen-general.ftl @@ -48,4 +48,4 @@ zen-icons-picker-emoji = .label = Емоджі zen-icons-picker-svg = .label = Значки -urlbar-search-mode-zen_actions = Actions +urlbar-search-mode-zen_actions = Дії diff --git a/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl b/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl index db2022b65..a82e95d1a 100644 --- a/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl +++ b/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl @@ -27,7 +27,7 @@ zen-glance-trigger-shift-click = zen-glance-trigger-meta-click = .label = Meta (Command) + 左鍵 zen-glance-trigger-mantain-click = - .label = 長按(即將上線!) + .label = 長按(即將推出!) zen-look-and-feel-compact-view-header = 在緊湊模式下顯示 zen-look-and-feel-compact-view-description = 只顯示你需要用的工具欄! zen-look-and-feel-compact-view-enabled = @@ -92,12 +92,12 @@ zen-vertical-tabs-expand-tabs-header = 如何擴展分頁 zen-vertical-tabs-expand-tabs-description = 選擇要如何擴展側邊欄中的分頁 zen-theme-marketplace-header = Zen 模組 zen-theme-disable-all-enabled = - .title = 啟用所有主題 + .title = 啟用所有模組 zen-theme-disable-all-disabled = - .title = 停用所有主題 -zen-theme-marketplace-description = 從商店尋找並安裝主題。 + .title = 停用所有模組 +zen-theme-marketplace-description = 從商店尋找並安裝模組。 zen-theme-marketplace-remove-button = - .label = 移除主題 + .label = 移除模組 zen-theme-marketplace-check-for-updates-button = .label = 檢查更新 zen-theme-marketplace-import-button = @@ -114,15 +114,15 @@ zen-theme-marketplace-toggle-enabled-button = .title = 關閉佈景主題 zen-theme-marketplace-toggle-disabled-button = .title = 啟用佈景主題 -zen-theme-marketplace-remove-confirmation = 您確定要移除此模組? +zen-theme-marketplace-remove-confirmation = 您確定要移除此模組? zen-theme-marketplace-close-modal = 關閉 zen-theme-marketplace-theme-header-title = .title = CSS 選擇器:{ $name } zen-theme-marketplace-dropdown-default-label = .label = 無 zen-theme-marketplace-input-default-placeholder = - .placeholder = 請輸入 -pane-zen-marketplace-title = Zen 模式 + .placeholder = 請輸入... +pane-zen-marketplace-title = Zen 模組 zen-themes-auto-update = .label = 啟動時自動更新已安裝模組 zen-settings-workspaces-force-container-tabs-to-workspace = @@ -150,12 +150,12 @@ pane-zen-CKS-title = 快捷鍵 category-zen-CKS = .tooltiptext = { pane-zen-CKS-title } pane-settings-CKS-title = { -brand-short-name } 快捷鍵 -zen-settings-CKS-header = 自定義你的快捷鍵 -zen-settings-CKS-description = 依據你的愛好來更改預設的快捷鍵以近一步改善你的瀏覽體驗 +zen-settings-CKS-header = 自定義您的快捷鍵 +zen-settings-CKS-description = 依據您的愛好來更改預設的快捷鍵以近一步改善你的瀏覽體驗 zen-settings-CKS-disable-firefox = .label = 停用 { -brand-short-name } 的預設快捷鍵 zen-settings-CKS-duplicate-shortcut = - .label = 重複的快捷鍵 + .label = 複製快捷鍵 zen-settings-CKS-reset-shortcuts = .label = 重設為預設值 zenCKSOption-group-other = 其它 @@ -173,13 +173,13 @@ zenCKSOption-group-devTools = 開發人員工具 zen-key-quick-restart = 快速重啟 zen-window-new-shortcut = 開新視窗 zen-tab-new-shortcut = 開新分頁 -zen-key-redo = 重做 +zen-key-redo = 取消復原 zen-restore-last-closed-tab-shortcut = 復原上次關閉的分頁 zen-location-open-shortcut = 選取網址列 zen-location-open-shortcut-alt = 選取網址列(備用) zen-key-undo-close-window = 還原已關閉視窗 zen-text-action-undo-shortcut = 復原 -zen-text-action-redo-shortcut = 取消「復原」 +zen-text-action-redo-shortcut = 取消復原 zen-text-action-cut-shortcut = 剪下 zen-text-action-copy-shortcut = 複製 zen-text-action-copy-url-shortcut = 複製目前網址 @@ -219,9 +219,9 @@ zen-history-show-all-shortcut = 顯示所有歷史 zen-key-enter-full-screen = 進入全畫面模式 zen-key-exit-full-screen = 離開全畫面模式 zen-ai-chatbot-sidebar-shortcut = 開啟 AI 聊天側邊欄 -zen-key-inspector-mac = 開啟檢測器(Mac) +zen-key-inspector-mac = 開啟檢測器 (Mac) zen-toggle-sidebar-shortcut = 開啟 Firefox 側邊欄 -zen-toggle-pin-tab-shortcut = Toggle Pin Tab +zen-toggle-pin-tab-shortcut = 切換釘選分頁 zen-reader-mode-toggle-shortcut-other = 切換閱讀模式 zen-picture-in-picture-toggle-shortcut = 切換子母畫面 zen-nav-reload-shortcut-2 = 重新整理 diff --git a/locales/zh-TW/browser/browser/zen-folders.ftl b/locales/zh-TW/browser/browser/zen-folders.ftl index f29a2b1a5..629509b69 100644 --- a/locales/zh-TW/browser/browser/zen-folders.ftl +++ b/locales/zh-TW/browser/browser/zen-folders.ftl @@ -1,21 +1,21 @@ zen-folders-search-placeholder = - .placeholder = Search { $folder-name }... + .placeholder = 搜尋 { $folder-name }... zen-folders-panel-rename-folder = - .label = Rename Folder + .label = 重新命名分頁夾 zen-folders-panel-unpack-folder = - .label = Unpack Folder + .label = 解散分頁夾 zen-folders-new-subfolder = - .label = New Subfolder + .label = 新增子分頁夾 zen-folders-panel-delete-folder = - .label = Delete Folder + .label = 刪除分頁夾 zen-folders-panel-convert-folder-to-space = - .label = Convert folder to Space + .label = 將分頁夾轉換為工作區 zen-folders-panel-change-folder-space = - .label = Change Space... + .label = 變更工作區... zen-folders-panel-change-icon-folder = - .label = Change Icon + .label = 變更圖示 zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = 卸載此分頁夾中所有分頁 zen-folders-unload-folder = - .label = Unload All Tabs -zen-folders-search-no-results = 沒有找到搜尋的分頁 🤔 + .label = 卸載所有分頁 +zen-folders-search-no-results = 找不到符合搜尋的分頁 🤔 diff --git a/locales/zh-TW/browser/browser/zen-general.ftl b/locales/zh-TW/browser/browser/zen-general.ftl index 529088d05..d76f6d1dd 100644 --- a/locales/zh-TW/browser/browser/zen-general.ftl +++ b/locales/zh-TW/browser/browser/zen-general.ftl @@ -1,5 +1,5 @@ zen-panel-ui-current-profile-text = 當前設定檔 -unified-extensions-description = 擴充功能用於為 { -brand-short-name } 帶來更多功能。 +unified-extensions-description = 擴充功能可為 { -brand-short-name } 帶來更多額外功能。 tab-context-zen-reset-pinned-tab = .label = 重置釘選的分頁 .accesskey = R @@ -12,25 +12,25 @@ tab-context-zen-remove-essential = tab-context-zen-replace-pinned-url-with-current = .label = 將釘選的網址換成目前的網址 .accesskey = C -zen-themes-corrupted = 你的 { -brand-short-name } 模組文件已損壞,它們已重置為預設佈景主題。 +zen-themes-corrupted = 你的 { -brand-short-name } 模組文件已損壞,它們已重設為預設主題。 zen-shortcuts-corrupted = 你的 { -brand-short-name } 快捷文件已損壞。它們已被重設為預設值。 # note: Do not translate the "
" tags in the following string zen-new-urlbar-notification = 新的 URL 欄已啟用,你不再需要新增新分頁。

馬上打開新分頁來看看新的 URL 欄! -zen-disable = 禁用 +zen-disable = 停用 pictureinpicture-minimize-btn = - .aria-label = Minimize - .tooltip = Minimize + .aria-label = 最小化 + .tooltip = 最小化 zen-panel-ui-gradient-generator-custom-color = 自訂顏色 -zen-panel-ui-gradient-generator-saved-message = 漸層儲存成功! +zen-panel-ui-gradient-generator-saved-message = 已成功儲存漸層! zen-copy-current-url-confirmation = 網址已複製到剪貼簿。 zen-general-cancel-label = .label = 取消 zen-general-confirm = .label = 確認 zen-pinned-tab-replaced = 釘選分頁網址已替換為當前當前網址。 -zen-tabs-renamed = 分頁重新命名成功! -zen-background-tab-opened-toast = New background tab opened! -zen-workspace-renamed-toast = Workspace has been successfully renamed! +zen-tabs-renamed = 已成功重新命名分頁! +zen-background-tab-opened-toast = 已在背景開啟新分頁! +zen-workspace-renamed-toast = 已成功重新命名工作區! zen-library-sidebar-workspaces = .label = 工作區 zen-library-sidebar-mods = @@ -45,5 +45,5 @@ zen-singletoolbar-urlbar-placeholder-with-name = zen-icons-picker-emoji = .label = 表情符號 zen-icons-picker-svg = - .label = Icons -urlbar-search-mode-zen_actions = Actions + .label = 圖示 +urlbar-search-mode-zen_actions = 操作 diff --git a/locales/zh-TW/browser/browser/zen-split-view.ftl b/locales/zh-TW/browser/browser/zen-split-view.ftl index 3c6a616de..d7701d89a 100644 --- a/locales/zh-TW/browser/browser/zen-split-view.ftl +++ b/locales/zh-TW/browser/browser/zen-split-view.ftl @@ -10,7 +10,7 @@ zen-split-link = .accesskey = S zen-split-view-modifier-header = 分割畫面 zen-split-view-modifier-activate-reallocation = - .label = 啟用重新分配 -zen-split-view-modifier-enabled-toast = 分割畫面重新排列已開啟。 -zen-split-view-modifier-enabled-toast-description = 拖曳畫面以重新排列。按 Esc 鍵退出 -zen-split-view-modifier-disabled-toast = 分割畫面重新排列已關閉 + .label = 啟用重新排列 +zen-split-view-modifier-enabled-toast = 已開啟分割畫面重新排列功能。 +zen-split-view-modifier-enabled-toast-description = 拖曳畫面以重新排列。按 Esc 鍵退出。 +zen-split-view-modifier-disabled-toast = 已關閉分割畫面重新排列功能。 diff --git a/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl b/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl index d8a81f797..d2ed844a0 100644 --- a/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl +++ b/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl @@ -15,12 +15,12 @@ zen-toolbar-context-compact-mode-hide-both = .label = 兩者皆隱藏 .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = 新增分頁夾 .accesskey = N sidebar-zen-expand = .label = 展開側邊欄 sidebar-zen-create-new = - .label = Create New... + .label = 新增... tabbrowser-unload-tab-button = .tooltiptext = { $tabCount -> diff --git a/locales/zh-TW/browser/browser/zen-welcome.ftl b/locales/zh-TW/browser/browser/zen-welcome.ftl index 9b2818248..c572eb13e 100644 --- a/locales/zh-TW/browser/browser/zen-welcome.ftl +++ b/locales/zh-TW/browser/browser/zen-welcome.ftl @@ -2,26 +2,26 @@ # 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/. -zen-welcome-title-line1 = Welcome to -zen-welcome-title-line2 = a calmer internet -zen-welcome-import-title = A Fresh Start, Same Bookmarks -zen-welcome-import-description-1 = Your bookmarks, history, and passwords are like a trail of breadcrumbs through the internet—don’t leave them behind! +zen-welcome-title-line1 = 歡迎使用 +zen-welcome-title-line2 = 更寧靜的網路體驗 +zen-welcome-import-title = 全新開始,書籤依舊 +zen-welcome-import-description-1 = 您的書籤、歷史記錄和密碼,是您網路足跡的珍貴紀錄——別把它們遺忘了! zen-welcome-import-description-2 = 輕鬆匯入其他瀏覽器的資料,無縫接續瀏覽體驗。 -zen-welcome-import-button = Import now -zen-welcome-set-default-browser = Set { -brand-short-name } as your default browser -zen-welcome-dont-set-default-browser = DON’T set { -brand-short-name } as your default browser -zen-welcome-initial-essentials-title = Your Key Tabs, Always Within Reach -zen-welcome-initial-essentials-description-1 = Keep your most important tabs easily accessible and always at hand, no matter how many you open. -zen-welcome-initial-essentials-description-2 = Essential tabs are always visible, no matter what workspace you are in. -zen-welcome-workspace-colors-title = Your Workspaces, Your Colors -zen-welcome-workspace-colors-description = Personalize your browser by giving each workspace its own unique color identity. +zen-welcome-import-button = 立即匯入 +zen-welcome-set-default-browser = 將 { -brand-short-name } 設為您的預設瀏覽器 +zen-welcome-dont-set-default-browser = 不要將 { -brand-short-name } 設為您的預設瀏覽器 +zen-welcome-initial-essentials-title = 重要分頁,隨手可及 +zen-welcome-initial-essentials-description-1 = 無論開啟多少分頁,最重要的分頁將永遠顯示,讓您輕鬆存取。 +zen-welcome-initial-essentials-description-2 = 無論您在哪個工作區,Essential 分頁會永遠顯示。 +zen-welcome-workspace-colors-title = 您的工作區,您的色彩 +zen-welcome-workspace-colors-description = 為每個工作區賦予獨特的色彩,打造個人化瀏覽器。 zen-welcome-start-browsing-title = - All set?
- Let’s get rolling! -zen-welcome-start-browsing-description-1 = You’re all set up and ready to go. Click the button below to start browsing with { -brand-short-name }. -zen-welcome-start-browsing = Dive in! -zen-welcome-default-search-title = Your Default Search Engine -zen-welcome-default-search-description = Choose your default search engine. You can always change it later! -zen-welcome-skip-button = Skip -zen-welcome-next-action = Next -zen-welcome-finished = Your Zen has been set up correctly! + 準備好了嗎?
+ 馬上開始體驗吧! +zen-welcome-start-browsing-description-1 = 您已完成所有設定並準備就緒。點擊下方按鈕,開始使用 { -brand-short-name } 瀏覽網路吧。 +zen-welcome-start-browsing = 立即開始! +zen-welcome-default-search-title = 您的預設搜尋引擎 +zen-welcome-default-search-description = 選擇您的預設搜尋引擎,您可以隨時更改它! +zen-welcome-skip-button = 跳過 +zen-welcome-next-action = 下一步 +zen-welcome-finished = 您的 Zen 瀏覽器已成功設定! diff --git a/locales/zh-TW/browser/browser/zen-workspaces.ftl b/locales/zh-TW/browser/browser/zen-workspaces.ftl index 92fbccf9f..97f59f0a6 100644 --- a/locales/zh-TW/browser/browser/zen-workspaces.ftl +++ b/locales/zh-TW/browser/browser/zen-workspaces.ftl @@ -1,8 +1,8 @@ zen-panel-ui-workspaces-text = 工作區 zen-panel-ui-workspaces-create = - .label = 創建工作區 + .label = 建立工作區 zen-panel-ui-folder-create = - .label = Create Folder + .label = 建立分頁夾 zen-panel-ui-new-empty-split = .label = New Split zen-workspaces-panel-context-delete = @@ -13,7 +13,7 @@ zen-workspaces-panel-change-name = zen-workspaces-panel-change-icon = .label = 變更圖示 zen-workspaces-panel-context-default-profile = - .label = Set Profile + .label = 設定設定檔 zen-workspaces-how-to-reorder-title = 如何排序工作區 zen-workspaces-how-to-reorder-desc = 拖曳側邊欄底部工作區圖示以重新排序 zen-workspaces-change-theme = @@ -25,7 +25,7 @@ zen-workspaces-panel-context-edit = .label = 編輯工作區 .accesskey = E context-zen-change-workspace-tab = - .label = 將分頁(含多個)移至工作區 + .label = 將分頁移至工作區 .accesskey = C zen-bookmark-edit-panel-workspace-selector = .value = 選擇工作區 @@ -45,9 +45,9 @@ zen-workspace-creation-name = .placeholder = 工作區名稱 zen-workspaces-panel-context-reorder = .label = 排序工作區 -zen-workspace-creation-profile = Profile - .tooltiptext = Profiles are used to separate cookies and site data between spaces. -zen-workspace-creation-header = 創建工作區 -zen-workspace-creation-label = Spaces are used to organize your tabs and sessions. +zen-workspace-creation-profile = 設定檔 + .tooltiptext = 設定檔用於隔離不同工作區的 Cookie 和網站資料。 +zen-workspace-creation-header = 建立工作區 +zen-workspace-creation-label = 工作區用於組織您的分頁與工作階段。 zen-workspaces-delete-workspace-title = 刪除工作區? -zen-workspaces-delete-workspace-body = 你確定要刪除 { $name } 嗎?該動作無法物復原。 +zen-workspaces-delete-workspace-body = 您確定要刪除 { $name } 嗎?此操錯無法復原。 From cc8dfc693bbff8cf101c0edca49a24612438fb16 Mon Sep 17 00:00:00 2001 From: Kamil Monicz Date: Sun, 28 Sep 2025 16:06:59 +0200 Subject: [PATCH 006/111] fix: zen.source builds missing dotfiles (#10599) --- .github/workflows/build.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8aecf8450..d5574e6db 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -265,10 +265,7 @@ jobs: run: npm run import -- --verbose - name: Compress - run: | - cd engine - tar --use-compress-program=zstd -hcf ../zen.source.tar.zst * - cd .. + run: tar --use-compress-program=zstd -hcf zen.source.tar.zst -C engine . - name: Upload artifact uses: actions/upload-artifact@v4 From a091751e097ed509825e71b7b14fe3aa2a14b206 Mon Sep 17 00:00:00 2001 From: Bernhard Kaindl Date: Sun, 28 Sep 2025 16:10:18 +0200 Subject: [PATCH 007/111] urlbar.yaml: Fix network.IDN_show_punycode to show international characters as designed (#10600) Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> --- prefs/urlbar.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/prefs/urlbar.yaml b/prefs/urlbar.yaml index 72472cae9..e47a3274b 100644 --- a/prefs/urlbar.yaml +++ b/prefs/urlbar.yaml @@ -53,9 +53,6 @@ - name: browser.formfill.enable value: false -- name: network.IDN_show_punycode - value: true - - name: browser.urlbar.suggest.topsites value: true locked: true From 028b7d35db81ecd66d3a4a2a1a406eff6f718a3b Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 28 Sep 2025 16:12:40 +0200 Subject: [PATCH 008/111] chore: lint project, b=no-bug, c=compact-mode --- src/zen/compact-mode/zen-compact-mode.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/zen/compact-mode/zen-compact-mode.css b/src/zen/compact-mode/zen-compact-mode.css index 235cf8a78..38741c81a 100644 --- a/src/zen/compact-mode/zen-compact-mode.css +++ b/src/zen/compact-mode/zen-compact-mode.css @@ -322,9 +322,9 @@ } & #zen-appcontent-navbar-wrapper { - & .zen-toolbar-background { - display: flex; - } + & .zen-toolbar-background { + display: flex; + } --zen-compact-toolbar-offset: 5px; position: absolute; top: calc(-1 * var(--zen-toolbar-height) + 1px); From bc5e4eb48f03fadc1bf8021e84c5b761a8e0a551 Mon Sep 17 00:00:00 2001 From: Kamil Monicz Date: Sun, 28 Sep 2025 17:48:01 +0200 Subject: [PATCH 009/111] fix: zen.source ignore VCS data, p=#10606 --- .github/workflows/build.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d5574e6db..994f631b7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -265,7 +265,12 @@ jobs: run: npm run import -- --verbose - name: Compress - run: tar --use-compress-program=zstd -hcf zen.source.tar.zst -C engine . + run: | + tar \ + --exclude-vcs \ + --use-compress-program=zstd \ + -hcf zen.source.tar.zst \ + -C engine . - name: Upload artifact uses: actions/upload-artifact@v4 From d9bc654fc7d8b9ac615ee174b94339782f8af6c1 Mon Sep 17 00:00:00 2001 From: Kamil Monicz Date: Sun, 28 Sep 2025 21:03:59 +0200 Subject: [PATCH 010/111] fix: zen.source missing vsc from nested modules that are checksummed (#10607) --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 994f631b7..d67c60651 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -267,7 +267,7 @@ jobs: - name: Compress run: | tar \ - --exclude-vcs \ + --exclude='./.git' \ --use-compress-program=zstd \ -hcf zen.source.tar.zst \ -C engine . From e59c73ae53e8b7f0150ea98fbc42ed32ffc790f9 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Sun, 28 Sep 2025 21:52:50 +0200 Subject: [PATCH 011/111] fix: Fixed workspace icons resizing on overflow, b=closes #10596, c=workspaces --- src/zen/workspaces/ZenWorkspaces.mjs | 1 + src/zen/workspaces/zen-workspaces.css | 6 +----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 1fb1476c9..57d71c904 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -2996,6 +2996,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { onWindowResize(event = undefined) { if (!(!event || event.target === window)) return; + gZenUIManager.updateTabsToolbar(); // Check if workspace icons overflow the parent container const parent = this.workspaceIcons; if (!parent || this._processingResize) { diff --git a/src/zen/workspaces/zen-workspaces.css b/src/zen/workspaces/zen-workspaces.css index da2e8116c..023c107ba 100644 --- a/src/zen/workspaces/zen-workspaces.css +++ b/src/zen/workspaces/zen-workspaces.css @@ -47,11 +47,7 @@ line-height: 0; &:is(img) { - padding: 6px; - - :root:not([zen-sidebar-expanded='true']) & { - padding: 10px; - } + width: 14px; } &[no-icon='true'] { From 32944f1548f29c60286c77ed1874b4d9cbbe1b19 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Mon, 29 Sep 2025 10:43:22 +0200 Subject: [PATCH 012/111] fix: Fixed bookmarks not hiding when opening folders, b=closes #10612, c=common --- .../components/urlbar/UrlbarController-sys-mjs.patch | 4 ++-- src/zen/common/ZenUIManager.mjs | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/browser/components/urlbar/UrlbarController-sys-mjs.patch b/src/browser/components/urlbar/UrlbarController-sys-mjs.patch index cd90f6116..3ebb104ae 100644 --- a/src/browser/components/urlbar/UrlbarController-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarController-sys-mjs.patch @@ -1,12 +1,12 @@ diff --git a/browser/components/urlbar/UrlbarController.sys.mjs b/browser/components/urlbar/UrlbarController.sys.mjs -index 36e3ab4a5a153230bb488b66dda7e3e7c763ca23..81f2944b939ac0963c129f86aab0b55817349401 100644 +index 36e3ab4a5a153230bb488b66dda7e3e7c763ca23..cc4ea61914a316451fa54b01a5c8c6a305e4038a 100644 --- a/browser/components/urlbar/UrlbarController.sys.mjs +++ b/browser/components/urlbar/UrlbarController.sys.mjs @@ -434,6 +434,8 @@ export class UrlbarController { }); } event.preventDefault(); -+ } else { ++ } else if (!this.input.value && !(event.ctrlKey || event.altKey || event.shiftKey)) { + this.browserWindow.gZenUIManager.enableCommandsMode(event); } break; diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs index dc3d44ba8..c98f8fdca 100644 --- a/src/zen/common/ZenUIManager.mjs +++ b/src/zen/common/ZenUIManager.mjs @@ -215,8 +215,10 @@ var gZenUIManager = { !el.contains(showEvent.explicitOriginalTarget) || (showEvent.explicitOriginalTarget instanceof Element && showEvent.explicitOriginalTarget?.closest('panel')) || - // See bug #7590: Ignore menupopup elements opening - showEvent.explicitOriginalTarget.tagName === 'menupopup' + // See bug #7590: Ignore menupopup elements opening. + // Also see #10612 for the exclusion of the zen-appcontent-navbar-wrapper + (showEvent.explicitOriginalTarget.tagName === 'menupopup' && + el.id !== 'zen-appcontent-navbar-wrapper') ) { continue; } From 2abba4d2668111f44565e4d6d480b4900a77e644 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Mon, 29 Sep 2025 10:57:19 +0200 Subject: [PATCH 013/111] fix: Fixed empty tabs appearing on the 'all tabs' panel, b=closes #10610, c=common --- .../components/tabbrowser/TabsList-sys-mjs.patch | 13 +++++++++++++ src/zen/common/styles/zen-single-components.css | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 src/browser/components/tabbrowser/TabsList-sys-mjs.patch diff --git a/src/browser/components/tabbrowser/TabsList-sys-mjs.patch b/src/browser/components/tabbrowser/TabsList-sys-mjs.patch new file mode 100644 index 000000000..d511f3c1d --- /dev/null +++ b/src/browser/components/tabbrowser/TabsList-sys-mjs.patch @@ -0,0 +1,13 @@ +diff --git a/browser/components/tabbrowser/TabsList.sys.mjs b/browser/components/tabbrowser/TabsList.sys.mjs +index 97990af166b63cae4b0343c77da5084850890504..b58d20eb3db82867030292625d45277afce1bbea 100644 +--- a/browser/components/tabbrowser/TabsList.sys.mjs ++++ b/browser/components/tabbrowser/TabsList.sys.mjs +@@ -87,7 +87,7 @@ class TabsListBase { + /** @type {function(MozTabbrowserTab):boolean} */ + this.filterFn = onlyHiddenTabs + ? tab => filterFn(tab) && tab.hidden +- : filterFn; ++ : tab => !tab.hasAttribute("zen-empty-tab") && filterFn(tab); + /** @type {Element} */ + this.containerNode = containerNode; + /** @type {Element|null} */ diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 43b149493..8bdaa80c0 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -43,7 +43,8 @@ body > #confetti { } /* Firefox View */ -#firefox-view-button { +#firefox-view-button, +#wrapper-firefox-view-button { display: none !important; } From 1ebe5286f90ec7985110deca54bf1838fa02bc71 Mon Sep 17 00:00:00 2001 From: mr-cheffy <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 1 Oct 2025 02:40:32 +0000 Subject: [PATCH 014/111] docs: Update monthly issue metrics, b=(no bug), c={docs} --- .../2025_2025-09-01..2025-09-30.md | 280 ++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 docs/issue-metrics/2025_2025-09-01..2025-09-30.md diff --git a/docs/issue-metrics/2025_2025-09-01..2025-09-30.md b/docs/issue-metrics/2025_2025-09-01..2025-09-30.md new file mode 100644 index 000000000..e7a494c53 --- /dev/null +++ b/docs/issue-metrics/2025_2025-09-01..2025-09-30.md @@ -0,0 +1,280 @@ +# Issue Metrics + +| Metric | Average | Median | 90th percentile | +| --- | --- | --- | ---: | +| Time to first response | 17:16:35 | 3:11:05 | 1 day, 7:58:23 | +| Time to close | 1 day, 8:59:53 | 8:32:05 | 3 days, 14:43:34 | + +| Metric | Count | +| --- | ---: | +| Number of items that remain open | 123 | +| Number of items closed | 139 | +| Total number of items created | 262 | + +| Title | URL | Time to first response | Time to close | +| --- | --- | --- | --- | +| Auto PIP not working upon tab switch | https://github.com/zen-browser/desktop/issues/10645 | None | None | +| URL bar Opening on the left side of the browser when clicked on new tab | https://github.com/zen-browser/desktop/issues/10642 | None | None | +| Browser opens on wrong monitor on macOS | https://github.com/zen-browser/desktop/issues/10639 | None | None | +| All tabs are lost after each update | https://github.com/zen-browser/desktop/issues/10638 | 2:25:57 | None | +| Sidebar expands independently | https://github.com/zen-browser/desktop/issues/10637 | 2:21:31 | None | +| Onboarding broken (tiny window) on flatpak version | https://github.com/zen-browser/desktop/issues/10635 | None | None | +| Bitwarden extension not synching (self hosted) | https://github.com/zen-browser/desktop/issues/10634 | None | None | +| Zen completely freezes when clicking on "New Tab" | https://github.com/zen-browser/desktop/issues/10632 | None | None | +| Zen Browser URL Bar: Search Engine Highlight Rectangle Looks Broken in Input Mode | https://github.com/zen-browser/desktop/issues/10630 | 9:01:57 | 9:01:57 | +| Url bar doesn't fully appear | https://github.com/zen-browser/desktop/issues/10629 | 1:51:21 | 9:11:03 | +| 1Password Autofill/Universal Autofill feature fails silently | https://github.com/zen-browser/desktop/issues/10627 | None | None | +| Moxfield Bug | https://github.com/zen-browser/desktop/issues/10626 | 16:58:48 | 16:58:48 | +| Tabs are not restored on Startup | https://github.com/zen-browser/desktop/issues/10625 | 0:03:14 | None | +| Zen uses `$HOME/.mozilla/native-messaging-hosts/` instead of `$HOME/.zen/native-messaging-hosts/` | https://github.com/zen-browser/desktop/issues/10622 | None | None | +| No video with supported format and MIME type found | https://github.com/zen-browser/desktop/issues/10620 | 4:38:39 | 4:38:39 | +| Youtube window size | https://github.com/zen-browser/desktop/issues/10619 | None | None | +| Webpage UI elements glitching and not fully rendering | https://github.com/zen-browser/desktop/issues/10615 | None | None | +| bookmarks toolbar failed to collapse automatically in single toolbar mode + compact mode | https://github.com/zen-browser/desktop/issues/10612 | None | 8:56:43 | +| Closing "New Tab" in the "List all tabs" toolbar widget causes zen to not exit cleanly | https://github.com/zen-browser/desktop/issues/10610 | 1:45:50 | 12:56:07 | +| Opening link in new tab switches focus to new tab instead of staying on current tab | https://github.com/zen-browser/desktop/issues/10609 | 2:14:04 | 13:39:31 | +| Webpage flickering/glitching during normal browsing | https://github.com/zen-browser/desktop/issues/10605 | None | None | +| Essentials Get jumbled when reopening the browser | https://github.com/zen-browser/desktop/issues/10602 | 0:19:34 | 0:45:36 | +| Entering ecom in URL bar shows compact mode as first suggestion. | https://github.com/zen-browser/desktop/issues/10601 | 6:27:16 | 6:27:16 | +| Loads of empty windows opening on startup and mysterious tray icon | https://github.com/zen-browser/desktop/issues/10598 | None | None | +| URLbar becomes invisible after bookmarking a tab. | https://github.com/zen-browser/desktop/issues/10597 | None | None | +| Workspace icons too small with narrow sidebar | https://github.com/zen-browser/desktop/issues/10596 | None | 8:06:55 | +| Top toolbar has no background in compact mode after changing space until the URL bar is hovered | https://github.com/zen-browser/desktop/issues/10595 | None | 1:45:30 | +| Video controls going under the screen when in fullscreen using Zen in fullscreen mode | https://github.com/zen-browser/desktop/issues/10594 | None | None | +| Multiple instances of Zen for each tab | https://github.com/zen-browser/desktop/issues/10593 | 4:55:51 | 4:55:51 | +| Tabs Disappear | https://github.com/zen-browser/desktop/issues/10592 | None | 6:02:25 | +| Cannot upgrade from `1.15.5b` to `1.16.1b` | https://github.com/zen-browser/desktop/issues/10590 | None | None | +| New windows come up with ~200 copies of the same link in the pinned tab of some workspaces | https://github.com/zen-browser/desktop/issues/10589 | None | 15:51:30 | +| on_TabGroupsCollapse is hiding currently open tabs | https://github.com/zen-browser/desktop/issues/10587 | 18:18:04 | 18:18:04 | +| websites don't properly go fullscreen in split view on Wayland and windows | https://github.com/zen-browser/desktop/issues/10586 | None | 21:23:38 | +| Active tabs and URLs not prioritized in URL bar over extensions | https://github.com/zen-browser/desktop/issues/10582 | 8:32:05 | 8:32:05 | +| Always floating URL bar does not float on new tab with replace-newtab disabled | https://github.com/zen-browser/desktop/issues/10581 | None | None | +| URL bar not respecting browser.urlbar.maxRichResults setting | https://github.com/zen-browser/desktop/issues/10580 | 0:11:00 | None | +| "Zoom" Icon is missing in the Application Menu | https://github.com/zen-browser/desktop/issues/10578 | 1 day, 2:23:42 | None | +| Search/New Tab Popup Misplaced in Compact Mode (Hidden Vertical Tab Bar) | https://github.com/zen-browser/desktop/issues/10576 | 0:50:41 | 1:38:50 | +| Essentials Tab | https://github.com/zen-browser/desktop/issues/10575 | 2:40:40 | 5:34:25 | +| Udemy - problem with movies | https://github.com/zen-browser/desktop/issues/10571 | 1:11:04 | 1:11:04 | +| Fully lost all data | https://github.com/zen-browser/desktop/issues/10568 | 9:29:58 | 10:31:54 | +| Flatpak fails to launch on Fedora 42 (clone() failure EPERM) | https://github.com/zen-browser/desktop/issues/10567 | 1:22:23 | 3:40:35 | +| The top bar in compact mode is not controlled by the theme, it appears white | https://github.com/zen-browser/desktop/issues/10566 | 1:47:24 | 1:47:24 | +| Pinned extension render bug: pinned extensions are floating on the web page | https://github.com/zen-browser/desktop/issues/10565 | None | None | +| Home link not appearing | https://github.com/zen-browser/desktop/issues/10563 | 0:42:18 | 2:59:02 | +| Connection to "incoming.telemetry.mozilla.org" on startup. | https://github.com/zen-browser/desktop/issues/10560 | 3:29:10 | 21:14:29 | +| Command bar actions not work if they are not translated to selected language | https://github.com/zen-browser/desktop/issues/10559 | None | 4:06:26 | +| the address bar does not respect the color theme when compact mode is enabled | https://github.com/zen-browser/desktop/issues/10557 | 0:14:27 | 0:14:27 | +| Browser crashing on media playback as of 1.16.1b on Nvidia Wayland (VA-API) | https://github.com/zen-browser/desktop/issues/10555 | 0:14:09 | None | +| Split View preview effect still remains after using the Escape key | https://github.com/zen-browser/desktop/issues/10554 | 3:49:15 | 1 day, 0:27:29 | +| Spotify is not working | https://github.com/zen-browser/desktop/issues/10553 | 1:42:55 | 1:42:55 | +| Command bar features doesn't work with other langage than english | https://github.com/zen-browser/desktop/issues/10551 | None | 0:01:48 | +| Nested CSS transform breaks backdrop blur | https://github.com/zen-browser/desktop/issues/10550 | 0:55:22 | 1:22:05 | +| (MINOR) URL bar: custom search engine name has uneven background fill than its icon | https://github.com/zen-browser/desktop/issues/10546 | None | None | +| Special unicode characters (Chinese, Korean, Japanese, etc.) are not showing | https://github.com/zen-browser/desktop/issues/10545 | 3:45:25 | None | +| Computer hard freezes when zen is open with performance intensive tasks going in the background | https://github.com/zen-browser/desktop/issues/10544 | None | None | +| 软件开启使用一会后,右上角关闭按钮失效 | https://github.com/zen-browser/desktop/issues/10543 | 5:28:33 | 5:28:33 | +| Bookmark menu shows up in wrong place, and its entries' context menu has weird layout problem | https://github.com/zen-browser/desktop/issues/10542 | None | None | +| Find bar changes into plain white bar when "X" is clicked | https://github.com/zen-browser/desktop/issues/10541 | 8:22:04 | 10:27:21 | +| browser.tabs.closeWindowWithLastTab doesn't work anymore on v1.16.1b | https://github.com/zen-browser/desktop/issues/10540 | 10:59:55 | None | +| Some UI Elements are Missing On Some Sites | https://github.com/zen-browser/desktop/issues/10538 | 2:19:13 | 3 days, 22:36:11 | +| Browser Freeze on Passkey Call&CallBack Failure | https://github.com/zen-browser/desktop/issues/10533 | None | None | +| Wrong sidebar color in compact mode | https://github.com/zen-browser/desktop/issues/10532 | 0:48:09 | 1 day, 17:09:58 | +| Playing Audio icon inconsistent on tabs not focused on linux | https://github.com/zen-browser/desktop/issues/10531 | None | 21:06:12 | +| Missing "Edit Theme" button in the right click menu | https://github.com/zen-browser/desktop/issues/10530 | 0:56:54 | 1 day, 17:21:25 | +| Stars are shown all over all websites | https://github.com/zen-browser/desktop/issues/10529 | 18:59:14 | None | +| v1.16b not available on flathub | https://github.com/zen-browser/desktop/issues/10528 | 3:10:02 | 5:21:21 | +| Firefox-Zen browser name inconsistency in error page | https://github.com/zen-browser/desktop/issues/10527 | None | None | +| Highlight mini window doesn't close automatically | https://github.com/zen-browser/desktop/issues/10526 | None | None | +| Zen Browser maximized window overlaps with Windows taskbar area | https://github.com/zen-browser/desktop/issues/10525 | None | 0:37:13 | +| Spotify Skipping 7 Songs | https://github.com/zen-browser/desktop/issues/10524 | 2:57:34 | 2:57:34 | +| McAfee notifactions from Zen Browser | https://github.com/zen-browser/desktop/issues/10522 | None | 0:24:17 | +| Zen Browser crashes occasionally when I download a file | https://github.com/zen-browser/desktop/issues/10520 | 13:03:32 | None | +| (SERIOUS BUG DONT IGNORE) Split tab bug report | https://github.com/zen-browser/desktop/issues/10519 | None | 0:01:36 | +| tab spliting issue | https://github.com/zen-browser/desktop/issues/10517 | None | 0:51:11 | +| Rounded window borders cause choppy scrolling. | https://github.com/zen-browser/desktop/issues/10516 | None | None | +| Closing the last tab cannot automatically create a new tab | https://github.com/zen-browser/desktop/issues/10515 | 14:08:09 | 14:08:09 | +| Pinned tabs always load from cache. | https://github.com/zen-browser/desktop/issues/10514 | 1:49:05 | None | +| Command Bar works only in english language | https://github.com/zen-browser/desktop/issues/10509 | 0:10:10 | 0:10:10 | +| Pop up windows don't close properly | https://github.com/zen-browser/desktop/issues/10506 | None | None | +| When accessing Alibaba Cloud DataWorks using the Zen browser, it will report Path Not Found: /page/errorbrowser, or Not Online? | https://github.com/zen-browser/desktop/issues/10503 | 10:29:49 | 10:30:28 | +| Floating url bar not appering where it is suposed to | https://github.com/zen-browser/desktop/issues/10502 | 3:09:03 | 11:51:16 | +| Split tabs are not aligned with other tabs | https://github.com/zen-browser/desktop/issues/10501 | 0:15:04 | 2 days, 14:12:29 | +| Microsoft Entra Platform SSO on MacOS | https://github.com/zen-browser/desktop/issues/10498 | 2 days, 12:29:33 | None | +| Dragging a split panel to the sidebar opens search for panel id | https://github.com/zen-browser/desktop/issues/10495 | 0:42:53 | None | +| After closing all tabs, cmd / ctrl + W does not close the window | https://github.com/zen-browser/desktop/issues/10493 | 1:22:58 | 1:22:58 | +| Youtube lags when adblocker is installed. [Seemingly fixed] | https://github.com/zen-browser/desktop/issues/10492 | 4:34:01 | 4:34:01 | +| URL Bar mispositioning | https://github.com/zen-browser/desktop/issues/10490 | 0:35:10 | 2:15:20 | +| Fullscreen F11 | https://github.com/zen-browser/desktop/issues/10489 | 21:42:02 | 3 days, 20:34:06 | +| Combined tabs are not shown properly in the navigation menu | https://github.com/zen-browser/desktop/issues/10488 | 0:41:09 | None | +| Translucent color codes do not appear translucent in toolbar themes | https://github.com/zen-browser/desktop/issues/10487 | 6:19:55 | None | +| Discord always requires me to log in after closing Zen | https://github.com/zen-browser/desktop/issues/10482 | 7 days, 13:26:09 | None | +| 1.16b crashes a lot on Windows 11 | https://github.com/zen-browser/desktop/issues/10481 | 0:19:54 | None | +| There is bug on perplexity.ai | https://github.com/zen-browser/desktop/issues/10480 | 2:16:15 | 1 day, 10:27:53 | +| Theme bug when Zen not focused. | https://github.com/zen-browser/desktop/issues/10479 | 2:39:03 | None | +| Hiding top bar in collapsed bar mode is white | https://github.com/zen-browser/desktop/issues/10478 | 12:23:32 | 7 days, 4:09:44 | +| URL preview in split screen always appears on focused window | https://github.com/zen-browser/desktop/issues/10477 | 1:20:54 | None | +| After the update, all loose tabs disappeared!!! | https://github.com/zen-browser/desktop/issues/10476 | None | None | +| Compact Mode Url position | https://github.com/zen-browser/desktop/issues/10475 | 2:15:11 | 4:17:47 | +| Zen captures all touchpad input and no other applications receive it, even if they're in the foreground (including desktop) | https://github.com/zen-browser/desktop/issues/10474 | None | None | +| Toolbar 'Edit Theme' features broken | https://github.com/zen-browser/desktop/issues/10473 | None | 12:09:50 | +| Camera / Microphone Permissions | https://github.com/zen-browser/desktop/issues/10471 | 0:09:35 | None | +| Cannot drag sidebar tabs | https://github.com/zen-browser/desktop/issues/10466 | 7 days, 19:48:26 | None | +| tool bar not responsive | https://github.com/zen-browser/desktop/issues/10465 | None | None | +| Zen adaptive history doesn't work (auto-suggestions don't change ranks) | https://github.com/zen-browser/desktop/issues/10464 | 6:38:12 | None | +| Udemy Videos not playing(some DRM issue) | https://github.com/zen-browser/desktop/issues/10462 | 0:26:28 | 0:26:28 | +| Clicking a link to open to a new tab from a page in a folder opens outside of the folder instead of staying inside it | https://github.com/zen-browser/desktop/issues/10461 | 1:22:00 | 1:36:41 | +| bookmark tool bar on full screen mode | https://github.com/zen-browser/desktop/issues/10460 | 7:11:57 | None | +| Compact mode: hide tab not work | https://github.com/zen-browser/desktop/issues/10459 | 7:21:59 | 7:26:31 | +| Error Building on mac, suggested fix as well | https://github.com/zen-browser/desktop/issues/10458 | None | None | +| Clicking on a duplicated tab of an essential tab causes switching to the last workspace | https://github.com/zen-browser/desktop/issues/10457 | 2 days, 11:37:42 | None | +| Very long opening times | https://github.com/zen-browser/desktop/issues/10456 | 1 day, 12:13:47 | None | +| Browser window doesn't close when closing last tab | https://github.com/zen-browser/desktop/issues/10455 | None | 22:08:46 | +| Passkeys not supported | https://github.com/zen-browser/desktop/issues/10454 | 2:29:55 | 2 days, 8:28:48 | +| Focus Bitwader | https://github.com/zen-browser/desktop/issues/10447 | 1 day, 6:48:09 | 1 day, 6:48:09 | +| Unable to change workspace name | https://github.com/zen-browser/desktop/issues/10446 | None | None | +| Udemy video's don't play in Zen. | https://github.com/zen-browser/desktop/issues/10443 | 0:52:31 | 1 day, 21:47:45 | +| SoundCloud audio stops when joining Discord voice in browser | https://github.com/zen-browser/desktop/issues/10441 | None | None | +| Calling browser.search.search (from webextensions API) opens glance window instead of new tab. | https://github.com/zen-browser/desktop/issues/10439 | 1:36:27 | None | +| Side bar expands when you remove pinned extension. | https://github.com/zen-browser/desktop/issues/10438 | 1 day, 2:34:08 | None | +| Compact mode X Bookmarks on Zen startup / Closing all pages | https://github.com/zen-browser/desktop/issues/10436 | 0:10:16 | None | +| Zen using more resources while using adblocking dns then ublock. | https://github.com/zen-browser/desktop/issues/10435 | 4:22:57 | 2 days, 3:07:53 | +| WebRender crashes and switches to Software rendering | https://github.com/zen-browser/desktop/issues/10432 | 5:25:30 | None | +| When there are 2 rows of essentials, essentials can only be moved up, not down | https://github.com/zen-browser/desktop/issues/10428 | 1:54:32 | 8 days, 4:33:00 | +| moz-extension page doesnt load for distill web monitor | https://github.com/zen-browser/desktop/issues/10427 | None | None | +| Sidebar incorrectly overlapping with address bar | https://github.com/zen-browser/desktop/issues/10426 | None | None | +| Unexpected window pops when aborting bitwarden validation | https://github.com/zen-browser/desktop/issues/10419 | 0:47:28 | 1:04:53 | +| Redundant `margin-left` on `#sidebar-box` when zen tabs are on the right | https://github.com/zen-browser/desktop/issues/10415 | None | 5:41:18 | +| Toolbar cannot be automatically hidden in the compact mode | https://github.com/zen-browser/desktop/issues/10414 | 6:26:39 | None | +| Closing and then reopening the last tab that's part of a split screen (3+ split screen tabs) breaks the split screen | https://github.com/zen-browser/desktop/issues/10413 | None | 14:22:44 | +| Opening links from external apps creates a new window but doesn’t redirect to the target URL | https://github.com/zen-browser/desktop/issues/10409 | None | None | +| No Youtube Live Chat | https://github.com/zen-browser/desktop/issues/10408 | 0:14:57 | None | +| Pinned tab is not focused when closing child tab; focus snaps to last pin instead of owner | https://github.com/zen-browser/desktop/issues/10407 | 1:28:19 | 1:28:19 | +| Huge CPU usage and RAM comsumption when idle | https://github.com/zen-browser/desktop/issues/10406 | 3:24:27 | None | +| Browsing history reset itself unexpectedly | https://github.com/zen-browser/desktop/issues/10403 | None | None | +| Opening new background tab(Middle mouse click) from within folder opens new tab outside folder | https://github.com/zen-browser/desktop/issues/10399 | 4:44:58 | 7:04:02 | +| Icons for webpages in the Essentials tab don't load on startup. | https://github.com/zen-browser/desktop/issues/10398 | None | 0:03:42 | +| Can't sign in to any Google services, says cookies are disabled | https://github.com/zen-browser/desktop/issues/10397 | 1:28:00 | 1 day, 6:18:57 | +| Zen crashes on Fedora Linux | https://github.com/zen-browser/desktop/issues/10395 | 0:53:47 | 1 day, 7:05:12 | +| Audio bugs on Google Meet | https://github.com/zen-browser/desktop/issues/10394 | 15:13:01 | None | +| Pinned split screen tabs still not preserved when opening a new window (issue #8583 remains unresolved) | https://github.com/zen-browser/desktop/issues/10388 | None | None | +| A cursor appears when I click on the screen | https://github.com/zen-browser/desktop/issues/10387 | 1:39:24 | 4:27:59 | +| Custom set images that you upload yourself for Firefox Home new tab wallpapers have been broken for a while. | https://github.com/zen-browser/desktop/issues/10384 | 15:32:44 | 3 days, 14:22:59 | +| Scrolling lag when looking at preview (glance) of a webpage when using mouse input | https://github.com/zen-browser/desktop/issues/10382 | None | 3:43:58 | +| Apple's accout verification Not Working | https://github.com/zen-browser/desktop/issues/10381 | None | 1 day, 22:20:39 | +| Find bar doesn't go away | https://github.com/zen-browser/desktop/issues/10380 | 4:16:03 | 4:16:08 | +| Cookies, data, history, and all tabs close and are deleted on every browser restart, despite turning off the settings to do so. | https://github.com/zen-browser/desktop/issues/10377 | None | None | +| Windows Navigation Icons not Showing Up on Zen | https://github.com/zen-browser/desktop/issues/10374 | None | None | +| 无法打开部分网站,显示安全问题或超时 | https://github.com/zen-browser/desktop/issues/10372 | 0:12:19 | 0:12:19 | +| Merci App extension not working - Login not working | https://github.com/zen-browser/desktop/issues/10370 | 3:56:26 | 6:10:52 | +| Compact mode tabs overlay stays fixed on top of bookmarks bar | https://github.com/zen-browser/desktop/issues/10369 | None | 4:13:01 | +| Browsing history reset itself unexpectedly | https://github.com/zen-browser/desktop/issues/10367 | 9:50:29 | 2 days, 10:39:26 | +| Choppy animation while hovering on top bar area in single toolbar compact mode with google doc file open | https://github.com/zen-browser/desktop/issues/10366 | 0:45:17 | None | +| Logged me out of everything after Restart | https://github.com/zen-browser/desktop/issues/10365 | 0:06:34 | None | +| Discord fails at uploading and playing media | https://github.com/zen-browser/desktop/issues/10364 | 1:35:04 | 17:56:18 | +| Pinned tabs inconsisntely dissapear and reappear in the sidebar | https://github.com/zen-browser/desktop/issues/10363 | 2:23:29 | None | +| 1Password no longer allowing touch ID on latest release | https://github.com/zen-browser/desktop/issues/10362 | 2:03:43 | 21:35:42 | +| [Linux: Flatpak] Can't open certain local-network URLs | https://github.com/zen-browser/desktop/issues/10360 | 4 days, 15:35:37 | None | +| Discord WebApp Issue with Audio | https://github.com/zen-browser/desktop/issues/10358 | None | 5:03:34 | +| Apple Security Blocked | https://github.com/zen-browser/desktop/issues/10354 | None | None | +| Always Blank Screen - although It's working and loading Pages | https://github.com/zen-browser/desktop/issues/10353 | 0:21:31 | 8 days, 17:02:49 | +| Tabs are lost then a workspace deletion is synced | https://github.com/zen-browser/desktop/issues/10345 | None | None | +| Fix | https://github.com/zen-browser/desktop/issues/10344 | 8:18:05 | 1 day, 9:23:10 | +| 1px white border on the top of the window which wasnt there before | https://github.com/zen-browser/desktop/issues/10342 | 2 days, 0:57:48 | None | +| zen browser isn't closing correctly | https://github.com/zen-browser/desktop/issues/10337 | 8:28:03 | 17:42:22 | +| Fix Multiple Tabs/Containers in Split View in Sidebar | https://github.com/zen-browser/desktop/issues/10335 | None | None | +| Fresh install: "Essentials" are grayed out for some sites | https://github.com/zen-browser/desktop/issues/10333 | 0:17:20 | 2:38:34 | +| Unticking 'Open Previous Tabs on Startup' messes with pinened folders | https://github.com/zen-browser/desktop/issues/10331 | None | None | +| Can't open Connection secure (certificate) 'page' anymore | https://github.com/zen-browser/desktop/issues/10330 | 1:25:14 | 4:54:22 | +| Some favicons of pins / essentials disappear when restarting without `Open previous windows and tabs` | https://github.com/zen-browser/desktop/issues/10329 | 3:12:08 | None | +| X Spaces breaks when Mic is requested | https://github.com/zen-browser/desktop/issues/10328 | 12 days, 16:06:32 | None | +| Tabs on Right , have Weird White Container that come out of nowhere | https://github.com/zen-browser/desktop/issues/10327 | None | 0:50:40 | +| Multiacccount containers + Mozilla sync deletes all custom containers | https://github.com/zen-browser/desktop/issues/10324 | None | None | +| Cannot open Links from Thunderbird emails in Zen browser | https://github.com/zen-browser/desktop/issues/10323 | 2 days, 7:50:34 | None | +| As long as the Baidu search engine exists in the search engine, the Baidu search engine in the quick search interface is at the top, regardless of whether it is checked or not. | https://github.com/zen-browser/desktop/issues/10322 | 1 day, 0:23:30 | None | +| Your tab just crashed | https://github.com/zen-browser/desktop/issues/10321 | None | None | +| Can not import bookmarks from FF | https://github.com/zen-browser/desktop/issues/10320 | None | None | +| Separate accounts across workspaces; should workspaces have different cookies and site data? | https://github.com/zen-browser/desktop/issues/10319 | 0:20:35 | None | +| folder names are a different font size | https://github.com/zen-browser/desktop/issues/10318 | 2:06:09 | 3 days, 16:05:52 | +| zen.view.experimental-no-window-controls stopped working | https://github.com/zen-browser/desktop/issues/10317 | 7:18:21 | 13:06:50 | +| Images get corrupted when uploading on Zen Browser (Flatpak + AUR, Linux + Wayland + NVIDIA) | https://github.com/zen-browser/desktop/issues/10316 | None | 4:13:56 | +| Popout Tab extensions not working | https://github.com/zen-browser/desktop/issues/10315 | None | None | +| Zen Browser freezing after waking from suspend | https://github.com/zen-browser/desktop/issues/10314 | 1 day, 7:54:39 | None | +| compact mode not working | https://github.com/zen-browser/desktop/issues/10313 | 3:21:50 | 12:27:20 | +| libnotify not used in Flatpak | https://github.com/zen-browser/desktop/issues/10310 | 19:30:48 | 19:30:48 | +| Essentials Tab order reset everytime I restart Zen Browser | https://github.com/zen-browser/desktop/issues/10309 | 1:24:30 | None | +| [ux]first keydown on fill bar is plain focus, enforce type wwhat to typeout what. on chatgpt.com | https://github.com/zen-browser/desktop/issues/10308 | 4:52:52 | 4:52:52 | +| Copying URL using shortcut when in reader mode does not work as expected | https://github.com/zen-browser/desktop/issues/10303 | 0:04:42 | None | +| Reopening Closed Tabs (Ctrl+Shift+T) Duplicates Essentials/Pinned, Causing Loss on Next Session If The Dupes Were Closed | https://github.com/zen-browser/desktop/issues/10302 | 4 days, 23:41:33 | None | +| Tabs within Folders in Workspaces switch back to the default workspace | https://github.com/zen-browser/desktop/issues/10299 | None | None | +| Can't clear the cookies and site data due to a UI bug | https://github.com/zen-browser/desktop/issues/10298 | 6:00:32 | 6:00:32 | +| Cannot move pinned tab to the top of normal tabs | https://github.com/zen-browser/desktop/issues/10295 | None | None | +| Mouse cursor position can have an undesirable effect on the tab switcher | https://github.com/zen-browser/desktop/issues/10292 | 2:12:31 | 2:29:10 | +| Essential tabs and Pinned tabs (including the ones inside a folder) do not load on startup | https://github.com/zen-browser/desktop/issues/10291 | 2:47:15 | None | +| Browser doesn't launch after update | https://github.com/zen-browser/desktop/issues/10290 | 4:30:50 | None | +| Double-click on sidebar no longer opens a new tab after recent Zen update | https://github.com/zen-browser/desktop/issues/10289 | 12:03:10 | 12:03:10 | +| ArchLinux AUR: Quellen für ‚zen-browser-bin-1.15.4b-1‘ konnten nicht heruntergeladen werden | https://github.com/zen-browser/desktop/issues/10288 | 2:39:09 | 2:39:09 | +| Ctrl+Shift+T after reopening Zen mixes tabs from multiple workspaces | https://github.com/zen-browser/desktop/issues/10286 | None | 4 days, 6:16:17 | +| Keyboard Input Delay While Typing on Monaco Editors | https://github.com/zen-browser/desktop/issues/10285 | 1 day, 6:25:04 | None | +| the top close maximize minimize are shwoing up and not going according to the theme and its just very bugged | https://github.com/zen-browser/desktop/issues/10284 | 5:13:41 | 6:27:09 | +| New Tab opens in new window. | https://github.com/zen-browser/desktop/issues/10283 | 0:29:33 | None | +| Can only open in safe mode. 1.15.5b | https://github.com/zen-browser/desktop/issues/10282 | 2:10:07 | 3:33:03 | +| Copy to Cliboard button in the url bar not working | https://github.com/zen-browser/desktop/issues/10281 | 2 days, 6:09:05 | 20 days, 2:34:28 | +| After the 1.15.4b update, the automatic hiding of the top and tab is not working | https://github.com/zen-browser/desktop/issues/10280 | 4:35:52 | 16:55:08 | +| Cannot move window when holding down left mouse button on sidebar | https://github.com/zen-browser/desktop/issues/10278 | 3 days, 19:54:46 | 3 days, 21:15:09 | +| Sidebar always visible in compact mode after right-clicking container icon when opening a new tab | https://github.com/zen-browser/desktop/issues/10276 | 1:53:46 | None | +| zen cannot play youtube livestreams | https://github.com/zen-browser/desktop/issues/10274 | 5:07:19 | None | +| Compact sidebar pops up when opening menus in menubar | https://github.com/zen-browser/desktop/issues/10273 | None | None | +| Newest Update — weird Bookmarks behavior | https://github.com/zen-browser/desktop/issues/10272 | None | 0:34:25 | +| Double-clicking no longer opens a new tab. | https://github.com/zen-browser/desktop/issues/10270 | 1:23:48 | 2:13:30 | +| Theme is inconsistent with and without focus | https://github.com/zen-browser/desktop/issues/10268 | None | None | +| Tabs inside folder goes invisible when closing folder | https://github.com/zen-browser/desktop/issues/10267 | 10:34:08 | 11:05:06 | +| Essentials/Pinned tabs are removed with middle click | https://github.com/zen-browser/desktop/issues/10266 | 2:33:21 | 11:29:40 | +| Creating split window by dragging pinned Essentials icon removes the Essential icon | https://github.com/zen-browser/desktop/issues/10264 | None | None | +| Macos: extention pop-ups open up at a different desktop in fullscreen | https://github.com/zen-browser/desktop/issues/10260 | None | None | +| Split tabs can't be moved to new workspace | https://github.com/zen-browser/desktop/issues/10256 | None | 11:32:53 | +| Google account not shared between spaces — must re-add to sign in to Figma | https://github.com/zen-browser/desktop/issues/10255 | 8:43:21 | None | +| Split tabs context menu does not show when selecting already split tabs | https://github.com/zen-browser/desktop/issues/10254 | 1 day, 8:31:56 | None | +| Netflix Error F7121-1331 | https://github.com/zen-browser/desktop/issues/10251 | 2:31:38 | 0:02:34 | +| Gradient themes get cut off if using vertical taskbar on W10 | https://github.com/zen-browser/desktop/issues/10250 | 20 days, 21:52:53 | None | +| White/Transparent search bar and bookmarks | https://github.com/zen-browser/desktop/issues/10247 | 11:15:56 | 1 day, 14:35:40 | +| Pin tabs duplication | https://github.com/zen-browser/desktop/issues/10246 | 13:43:00 | 13:43:00 | +| Zen window transparency only works when window is maximized | https://github.com/zen-browser/desktop/issues/10243 | None | None | +| Cursor rapid flickering on random places within the browser window when graphic tablet is used | https://github.com/zen-browser/desktop/issues/10242 | 21:55:18 | 21:57:24 | +| MIssing last second(s) in certain audios | https://github.com/zen-browser/desktop/issues/10240 | None | None | +| Issue with Transparency Effect in background in Zen Browser | https://github.com/zen-browser/desktop/issues/10239 | 3:36:39 | 18 days, 3:00:45 | +| Zen icon does not load even apon restart. | https://github.com/zen-browser/desktop/issues/10238 | 1 day, 7:03:03 | 1 day, 7:03:03 | +| Discord login page does not load | https://github.com/zen-browser/desktop/issues/10234 | None | None | +| Native window title doesn't show Page title(document.title) when tab is pinned and renamed, shows only profile name and app name | https://github.com/zen-browser/desktop/issues/10232 | None | None | +| Enabling "Always use private browsing mode" results in totally black UI | https://github.com/zen-browser/desktop/issues/10231 | None | None | +| After newest Update there is now a ugly white Border around the Hidden Compact Sidebar | https://github.com/zen-browser/desktop/issues/10230 | 1 day, 13:55:29 | 2 days, 20:51:00 | +| File manager not opening in Arch linux | https://github.com/zen-browser/desktop/issues/10226 | 0:12:51 | None | +| Default color back to orange | https://github.com/zen-browser/desktop/issues/10225 | 0:07:41 | 3:10:01 | +| NAVEGADOR CONSUMINDO 12 GIGAS? CARALHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO | https://github.com/zen-browser/desktop/issues/10224 | None | 0:24:57 | +| gemini style bug | https://github.com/zen-browser/desktop/issues/10222 | 1:32:02 | 1:04:01 | +| Zen Browser opens on the last used virtual desktop instead of the current one | https://github.com/zen-browser/desktop/issues/10221 | 2:07:09 | None | +| Tabs having weird behaviour when moving them form one window to the other | https://github.com/zen-browser/desktop/issues/10220 | None | None | +| Web pages in the workspace cannot be synced | https://github.com/zen-browser/desktop/issues/10219 | 5 days, 0:56:10 | 5 days, 6:23:07 | +| Swipe workspaces gesture freezes on "Mute Tab" icon hover | https://github.com/zen-browser/desktop/issues/10217 | None | None | +| Sub-folders of Tabs, Dump Tabs when moved in a Folder List | https://github.com/zen-browser/desktop/issues/10216 | 2 days, 13:52:56 | 4 days, 22:25:16 | +| Labels rendering bug | https://github.com/zen-browser/desktop/issues/10215 | 11:10:14 | 3 days, 22:48:16 | +| Browser doesn't allow completion of TOTP number on Paypal site | https://github.com/zen-browser/desktop/issues/10214 | None | None | +| Unable to use Option+Cmd+ArrowLeft or Option+Cmd+ArrowRight to change spaces. | https://github.com/zen-browser/desktop/issues/10211 | 14:39:09 | 15:34:26 | +| The Workspace Icon can't be hided anymore | https://github.com/zen-browser/desktop/issues/10209 | 1:41:32 | 1:41:32 | +| Tabs move into Folders | https://github.com/zen-browser/desktop/issues/10208 | 0:24:03 | 7:25:32 | +| Native select low contrast theme | https://github.com/zen-browser/desktop/issues/10207 | None | None | +| Trackpad zooming on PDF no longer working | https://github.com/zen-browser/desktop/issues/10205 | None | None | +| Can’t add tab to Essentials | https://github.com/zen-browser/desktop/issues/10204 | 1:15:16 | 8:15:36 | +| Zen browser can't go through system proxies on Linux | https://github.com/zen-browser/desktop/issues/10203 | None | None | +| The Browser's adressbar is not visible because it blends into the current viewed page. | https://github.com/zen-browser/desktop/issues/10202 | 0:13:50 | 2 days, 23:44:36 | +| Wrong favicon instead of cached icons bug is back | https://github.com/zen-browser/desktop/issues/10199 | 1 day, 6:59:45 | 2 days, 21:44:37 | +| iCloud not working | https://github.com/zen-browser/desktop/issues/10192 | 6:18:44 | 11:56:51 | +| Truncated folder name in the search inside folders feature | https://github.com/zen-browser/desktop/issues/10189 | 2:31:02 | None | +| Missing translations in the search inside folders feature | https://github.com/zen-browser/desktop/issues/10188 | 2:16:01 | 2:16:01 | +| New "floadting" tab bar window covers bookmark bar | https://github.com/zen-browser/desktop/issues/10186 | 6:07:17 | 16:21:43 | +| Revert 1.15.3b!!!! | https://github.com/zen-browser/desktop/issues/10185 | 1:12:24 | 1:03:18 | +| "New Tab Below" menu item when right clicking on a tab no longer shows after upgrading from 1.14.11b | https://github.com/zen-browser/desktop/issues/10184 | None | 2:40:19 | +| Multiple bugs with new folder Feature | https://github.com/zen-browser/desktop/issues/10182 | 1:37:43 | None | +| New window bug - unpinned tabs disappear, folders expand | https://github.com/zen-browser/desktop/issues/10180 | 2:22:55 | 2:22:55 | +| Essentials not syncing across all spaces in same container | https://github.com/zen-browser/desktop/issues/10179 | 3:37:37 | 24 days, 5:11:42 | +| Macos Universal download installer | https://github.com/zen-browser/desktop/issues/10175 | 7:10:27 | 7:10:27 | + +_This report was generated with the [Issue Metrics Action](https://github.com/github/issue-metrics)_ +Search query used to find these items: `repo:zen-browser/desktop is:issue created:2025-09-01..2025-09-30` From 428b61d6d41215bb0fbdfae5dd5f6cc43003cacd Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 1 Oct 2025 15:41:55 +0200 Subject: [PATCH 015/111] New Crowdin updates (#10611) --- locales/de/browser/browser/zen-general.ftl | 2 +- locales/ga-IE/browser/browser/zen-general.ftl | 2 +- locales/pt-PT/browser/browser/zen-general.ftl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/de/browser/browser/zen-general.ftl b/locales/de/browser/browser/zen-general.ftl index 775af62d7..211ee89a7 100644 --- a/locales/de/browser/browser/zen-general.ftl +++ b/locales/de/browser/browser/zen-general.ftl @@ -48,4 +48,4 @@ zen-icons-picker-emoji = .label = Emojis zen-icons-picker-svg = .label = Symbole -urlbar-search-mode-zen_actions = Actions +urlbar-search-mode-zen_actions = Aktionen diff --git a/locales/ga-IE/browser/browser/zen-general.ftl b/locales/ga-IE/browser/browser/zen-general.ftl index 27bd04d9c..eaa94e10a 100644 --- a/locales/ga-IE/browser/browser/zen-general.ftl +++ b/locales/ga-IE/browser/browser/zen-general.ftl @@ -48,4 +48,4 @@ zen-icons-picker-emoji = .label = Emojis zen-icons-picker-svg = .label = Deilbhíní -urlbar-search-mode-zen_actions = Actions +urlbar-search-mode-zen_actions = Gníomhartha diff --git a/locales/pt-PT/browser/browser/zen-general.ftl b/locales/pt-PT/browser/browser/zen-general.ftl index 3416a8c96..4963234ac 100644 --- a/locales/pt-PT/browser/browser/zen-general.ftl +++ b/locales/pt-PT/browser/browser/zen-general.ftl @@ -48,4 +48,4 @@ zen-icons-picker-emoji = .label = Emojis zen-icons-picker-svg = .label = Ícones -urlbar-search-mode-zen_actions = Actions +urlbar-search-mode-zen_actions = Ações From 58a939f2ad332238ee8a00ed11145f6a9baa7102 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 1 Oct 2025 15:42:23 +0200 Subject: [PATCH 016/111] chore: Re-enable updater service, p=#10654, c=configs --- configs/windows/mozconfig | 3 --- src/browser/installer/package-manifest-in.patch | 14 ++------------ 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/configs/windows/mozconfig b/configs/windows/mozconfig index 408d8884e..0e725a01e 100644 --- a/configs/windows/mozconfig +++ b/configs/windows/mozconfig @@ -22,9 +22,6 @@ if test "$ZEN_CROSS_COMPILING"; then fi fi -ac_add_options --disable-maintenance-service -ac_add_options --disable-bits-download - if test "$SURFER_COMPAT" = "x86_64"; then ac_add_options --target=x86_64-pc-windows-msvc diff --git a/src/browser/installer/package-manifest-in.patch b/src/browser/installer/package-manifest-in.patch index 7cc6a9526..8634232ff 100644 --- a/src/browser/installer/package-manifest-in.patch +++ b/src/browser/installer/package-manifest-in.patch @@ -1,18 +1,8 @@ diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in -index 70f268914f1078ef45e86d295f4bb2ce179a05e0..73d8ffc4457468e8a57ad2c29e4d49f45436bf00 100644 +index 70f268914f1078ef45e86d295f4bb2ce179a05e0..9eb138023bc9de6211a3e814b0525da612156a78 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in -@@ -361,17 +361,17 @@ bin/libfreebl_64int_3.so - ; [MaintenanceService] - ; - #ifdef MOZ_MAINTENANCE_SERVICE --@BINPATH@/maintenanceservice.exe --@BINPATH@/maintenanceservice_installer.exe -+;@BINPATH@/maintenanceservice.exe -+;@BINPATH@/maintenanceservice_installer.exe - #endif - - ; [Crash Reporter] +@@ -369,9 +369,9 @@ bin/libfreebl_64int_3.so ; #ifdef MOZ_CRASHREPORTER #ifdef XP_MACOSX From a8712f9aba28bdc47d2106b6bf9c099d3abe6999 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Wed, 1 Oct 2025 15:48:48 +0200 Subject: [PATCH 017/111] fix: Fixed urlbar being stuck on the screen, b=closes #10650, c=common --- src/zen/common/styles/zen-omnibox.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 421641b4f..377688fc0 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -155,8 +155,11 @@ order: 2 !important; } -#urlbar[breakout-extend='true'] { +#urlbar[breakout] { position: fixed; +} + +#urlbar[breakout-extend='true'] { z-index: 2; & .urlbar-input-container { From 1300ae2521ea059285c34459ce6c722f9481d5b0 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Wed, 1 Oct 2025 16:26:34 +0200 Subject: [PATCH 018/111] fix: Updated to Firefox `143.0.3`, b=no-bug, c=l10n --- README.md | 4 ++-- build/firefox-cache/l10n-last-commit-hash | 2 +- surfer.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3a81ce9d6..60a55aa73 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne ### Firefox Versions -- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `143.0.1`! 🚀 -- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 143.0.1`! +- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `143.0.3`! 🚀 +- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 143.0.3`! ### Contributing diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash index e2d858a12..b24de145e 100644 --- a/build/firefox-cache/l10n-last-commit-hash +++ b/build/firefox-cache/l10n-last-commit-hash @@ -1 +1 @@ -1b0467f0c46520bbed6648f6583a9ba6710d76cb \ No newline at end of file +c8042c4961ad61678121d8ce9ca2d17cc85fefbe \ No newline at end of file diff --git a/surfer.json b/surfer.json index f408413bf..8c0d54fe0 100644 --- a/surfer.json +++ b/surfer.json @@ -5,8 +5,8 @@ "binaryName": "zen", "version": { "product": "firefox", - "version": "143.0.1", - "candidate": "143.0.1" + "version": "143.0.3", + "candidate": "143.0.3" }, "buildOptions": { "generateBranding": true From 9887871d01b0382906686cc015b8f3e4f85685d2 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Wed, 1 Oct 2025 19:13:41 +0200 Subject: [PATCH 019/111] fix: Fixed compact mode twitching with raycast, b=closes #10637, c=tabs, common --- .../tabbrowser/content/tabs-js.patch | 42 +++++++++---------- src/zen/common/ZenHasPolyfill.mjs | 6 ++- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/browser/components/tabbrowser/content/tabs-js.patch b/src/browser/components/tabbrowser/content/tabs-js.patch index 3f0fd1ff9..2fa8caa1f 100644 --- a/src/browser/components/tabbrowser/content/tabs-js.patch +++ b/src/browser/components/tabbrowser/content/tabs-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js -index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536322388ea 100644 +index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221fb51207c6 100644 --- a/browser/components/tabbrowser/content/tabs.js +++ b/browser/components/tabbrowser/content/tabs.js @@ -44,6 +44,9 @@ @@ -361,7 +361,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 #ensureTabIsVisible(tab, shouldScrollInstantly = false) { - let arrowScrollbox = tab.closest("arrowscrollbox"); + let arrowScrollbox = this.arrowScrollbox; - if (arrowScrollbox.overflowing) { + if (arrowScrollbox?.overflowing) { arrowScrollbox.ensureElementIsVisible(tab, shouldScrollInstantly); } @@ -2288,6 +2343,16 @@ @@ -410,9 +410,9 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 translateX = Math.min(Math.max(translateX, firstBoundX), lastBoundX); translateY = Math.min(Math.max(translateY, firstBoundY), lastBoundY); -@@ -2743,13 +2810,18 @@ - +@@ -2744,13 +2811,18 @@ this.#clearDragOverGroupingTimer(); + this.#clearPinnedDropIndicatorTimer(); - let isPinned = draggedTab.pinned; - let numPinned = gBrowser.pinnedTabCount; @@ -433,7 +433,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 if (this.#rtlMode) { tabs.reverse(); -@@ -2760,7 +2832,7 @@ +@@ -2761,7 +2833,7 @@ let screenAxis = this.verticalMode ? "screenY" : "screenX"; let size = this.verticalMode ? "height" : "width"; let translateAxis = this.verticalMode ? "translateY" : "translateX"; @@ -442,7 +442,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 let tabSize = this.verticalMode ? tabHeight : tabWidth; let translateX = event.screenX - dragData.screenX; let translateY = event.screenY - dragData.screenY; -@@ -2776,6 +2848,12 @@ +@@ -2777,6 +2849,12 @@ ); let lastMovingTab = movingTabs.at(-1); let firstMovingTab = movingTabs[0]; @@ -455,7 +455,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 let endEdge = ele => ele[screenAxis] + bounds(ele)[size]; let lastMovingTabScreen = endEdge(lastMovingTab); let firstMovingTabScreen = firstMovingTab[screenAxis]; -@@ -2790,6 +2868,11 @@ +@@ -2791,6 +2869,11 @@ let endBound = this.#rtlMode ? endEdge(this) - lastMovingTabScreen : periphery[screenAxis] - 1 - lastMovingTabScreen; @@ -467,7 +467,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 translate = Math.min(Math.max(translate, startBound), endBound); // Center the tab under the cursor if the tab is not under the cursor while dragging -@@ -2979,6 +3062,8 @@ +@@ -2980,6 +3063,8 @@ }; let dropElement = getOverlappedElement(); @@ -476,7 +476,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 let newDropElementIndex; if (dropElement) { -@@ -3060,7 +3145,7 @@ +@@ -3061,7 +3146,7 @@ ? Services.prefs.getIntPref( "browser.tabs.dragDrop.moveOverThresholdPercent" ) / 100 @@ -485,7 +485,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold)); let shouldMoveOver = overlapPercent > moveOverThreshold; if (logicalForward && shouldMoveOver) { -@@ -3093,6 +3178,7 @@ +@@ -3094,6 +3179,7 @@ // If dragging a group over another group, don't make it look like it is // possible to drop the dragged group inside the other group. if ( @@ -493,7 +493,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 isTabGroupLabel(draggedTab) && dropElement?.group && (!dropElement.group.collapsed || -@@ -3119,20 +3205,13 @@ +@@ -3120,20 +3206,13 @@ let isOutOfBounds = isPinned ? dropElement.elementIndex >= numPinned : dropElement.elementIndex < numPinned; @@ -518,7 +518,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 let groupingDelay = Services.prefs.getIntPref( "browser.tabs.dragDrop.createGroup.delayMS" ); -@@ -3140,6 +3219,7 @@ +@@ -3141,6 +3220,7 @@ // When dragging tab(s) over an ungrouped tab, signal to the user // that dropping the tab(s) will create a new tab group. let shouldCreateGroupOnDrop = @@ -526,7 +526,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 !movingTabsSet.has(dropElement) && isTab(dropElement) && !dropElement?.group && -@@ -3148,6 +3228,7 @@ +@@ -3149,6 +3229,7 @@ // When dragging tab(s) over a collapsed tab group label, signal to the // user that dropping the tab(s) will add them to the group. let shouldDropIntoCollapsedTabGroup = @@ -534,7 +534,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 isTabGroupLabel(dropElement) && dropElement.group.collapsed && overlapPercent > dragOverGroupingThreshold; -@@ -3192,19 +3273,14 @@ +@@ -3193,19 +3274,14 @@ dropElement = dropElementGroup; colorCode = undefined; } else if (isTabGroupLabel(dropElement)) { @@ -562,7 +562,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 } this.#setDragOverGroupColor(colorCode); this.toggleAttribute("movingtab-addToGroup", colorCode); -@@ -3223,11 +3299,11 @@ +@@ -3224,11 +3300,11 @@ dragData.dropElement = dropElement; dragData.dropBefore = dropBefore; dragData.animDropElementIndex = newDropElementIndex; @@ -576,7 +576,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 continue; } -@@ -3346,12 +3422,14 @@ +@@ -3350,12 +3426,14 @@ element?.removeAttribute("dragover-groupTarget"); } @@ -593,7 +593,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 for (let item of this.ariaFocusableItems) { this.#resetGroupTarget(item); -@@ -3394,16 +3472,15 @@ +@@ -3402,16 +3480,15 @@ tab.style.left = ""; tab.style.top = ""; tab.style.maxWidth = ""; @@ -612,7 +612,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 } let periphery = draggedTabDocument.getElementById( "tabbrowser-arrowscrollbox-periphery" -@@ -3475,7 +3552,7 @@ +@@ -3483,7 +3560,7 @@ let postTransitionCleanup = () => { movingTab._moveTogetherSelectedTabsData.animate = false; }; @@ -621,7 +621,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 postTransitionCleanup(); } else { let onTransitionEnd = transitionendEvent => { -@@ -3639,7 +3716,7 @@ +@@ -3647,7 +3724,7 @@ } _notifyBackgroundTab(aTab) { @@ -630,7 +630,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 return; } -@@ -3748,7 +3825,10 @@ +@@ -3756,7 +3833,10 @@ #getDragTarget(event, { ignoreSides = false } = {}) { let { target } = event; while (target) { @@ -642,7 +642,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536 break; } target = target.parentNode; -@@ -3765,6 +3845,9 @@ +@@ -3773,6 +3853,9 @@ return null; } } diff --git a/src/zen/common/ZenHasPolyfill.mjs b/src/zen/common/ZenHasPolyfill.mjs index b7e6b2c60..1f50dc4f2 100644 --- a/src/zen/common/ZenHasPolyfill.mjs +++ b/src/zen/common/ZenHasPolyfill.mjs @@ -15,7 +15,11 @@ observeSelectorExistence(element, descendantSelectors, stateAttribute, attributeFilter = []) { const updateState = () => { const exists = descendantSelectors.some(({ selector }) => { - return element.querySelector(selector); + let selected = element.querySelector(selector); + if (selected?.tagName?.toLowerCase() === 'menu') { + return null; + } + return selected; }); const { exists: shouldExist = true } = descendantSelectors; if (exists === shouldExist) { From bb9b7b74aaca023cf4d1c7f0e1742ebf59e5dfe3 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Wed, 1 Oct 2025 21:52:26 +0200 Subject: [PATCH 020/111] feat: Improved space edit button sizings, b=no-bug, c=workspaces --- src/zen/workspaces/zen-workspaces.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/zen/workspaces/zen-workspaces.css b/src/zen/workspaces/zen-workspaces.css index 023c107ba..5ac09c7c2 100644 --- a/src/zen/workspaces/zen-workspaces.css +++ b/src/zen/workspaces/zen-workspaces.css @@ -237,7 +237,10 @@ --toolbarbutton-inner-padding: 6px; & image { - border-radius: calc(var(--border-radius-medium) - 4px); + border-radius: calc(var(--border-radius-medium) - 4px) !important; + width: 26px; + height: 26px; + margin-right: -1px; } :root[zen-renaming-tab='true'] & { From 69a0ddd03c1710079b53d2f0a6828d1d70ec0a57 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Wed, 1 Oct 2025 22:17:42 +0200 Subject: [PATCH 021/111] fix: Fix compact mode native radius and separtion for windows, b=no-bug, c=compact-mode --- src/browser/themes/windows/browser-css.patch | 5 +++-- src/zen/compact-mode/zen-compact-mode.css | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/browser/themes/windows/browser-css.patch b/src/browser/themes/windows/browser-css.patch index 098bd9c63..5b064a7bb 100644 --- a/src/browser/themes/windows/browser-css.patch +++ b/src/browser/themes/windows/browser-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css -index 4485369284ee762bc8b35afb84fec0874a831fff..7096e2e5d50cda99b62a2aa7118fea6371e76b85 100644 +index 4485369284ee762bc8b35afb84fec0874a831fff..6a1ad15f657437aa4ef98fda63ae921a378f7310 100644 --- a/browser/themes/windows/browser.css +++ b/browser/themes/windows/browser.css @@ -31,7 +31,6 @@ @@ -10,13 +10,14 @@ index 4485369284ee762bc8b35afb84fec0874a831fff..7096e2e5d50cda99b62a2aa7118fea63 } /* Using a semitransparent background preserves the tinting from the backdrop. -@@ -60,14 +59,12 @@ +@@ -60,14 +59,13 @@ } /* This is needed for Windows 10, see bug 1961257 */ -@media (-moz-windows-accent-color-in-titlebar) { - :root[customtitlebar][sizemode="normal"] #navigator-toolbox { + :root[customtitlebar][sizemode="normal"] #browser { ++ --zen-sidebar-compact-top-offset: 1px; border-top: 0.5px solid ActiveBorder; &:-moz-window-inactive { border-top-color: InactiveBorder; diff --git a/src/zen/compact-mode/zen-compact-mode.css b/src/zen/compact-mode/zen-compact-mode.css index 38741c81a..af798fa33 100644 --- a/src/zen/compact-mode/zen-compact-mode.css +++ b/src/zen/compact-mode/zen-compact-mode.css @@ -29,7 +29,7 @@ &, &::before, &::after { - border-radius: calc(var(--zen-native-inner-radius) + var(--zen-element-separation) / 4 - var(--zen-compact-mode-no-padding-radius-fix, 0px)); + border-radius: calc(var(--zen-native-inner-radius) - var(--zen-compact-mode-no-padding-radius-fix, 0px)); } } @@ -97,7 +97,10 @@ bottom: var(--zen-compact-float); padding: 0 var(--zen-compact-float) !important; :root[zen-single-toolbar='true'] & { - top: calc(var(--zen-compact-float) / 2); + /* We add an extra offset since windows users have a border top + * in the window in order to compensate how windows renders the + * titlebar */ + top: calc(var(--zen-compact-float) / 2 + var(--zen-sidebar-compact-top-offset, 0px)); height: calc(100% - var(--zen-compact-float)); } :root:not([zen-single-toolbar='true']) & { From 2c31564f5de93d918e902ebd3b11595ddef1d7c2 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 1 Oct 2025 23:45:22 +0200 Subject: [PATCH 022/111] Revert "chore: Re-enable updater service, p=#10654, c=configs", p=#10660 --- configs/windows/mozconfig | 3 +++ src/browser/installer/package-manifest-in.patch | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/configs/windows/mozconfig b/configs/windows/mozconfig index 0e725a01e..408d8884e 100644 --- a/configs/windows/mozconfig +++ b/configs/windows/mozconfig @@ -22,6 +22,9 @@ if test "$ZEN_CROSS_COMPILING"; then fi fi +ac_add_options --disable-maintenance-service +ac_add_options --disable-bits-download + if test "$SURFER_COMPAT" = "x86_64"; then ac_add_options --target=x86_64-pc-windows-msvc diff --git a/src/browser/installer/package-manifest-in.patch b/src/browser/installer/package-manifest-in.patch index 8634232ff..7cc6a9526 100644 --- a/src/browser/installer/package-manifest-in.patch +++ b/src/browser/installer/package-manifest-in.patch @@ -1,8 +1,18 @@ diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in -index 70f268914f1078ef45e86d295f4bb2ce179a05e0..9eb138023bc9de6211a3e814b0525da612156a78 100644 +index 70f268914f1078ef45e86d295f4bb2ce179a05e0..73d8ffc4457468e8a57ad2c29e4d49f45436bf00 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in -@@ -369,9 +369,9 @@ bin/libfreebl_64int_3.so +@@ -361,17 +361,17 @@ bin/libfreebl_64int_3.so + ; [MaintenanceService] + ; + #ifdef MOZ_MAINTENANCE_SERVICE +-@BINPATH@/maintenanceservice.exe +-@BINPATH@/maintenanceservice_installer.exe ++;@BINPATH@/maintenanceservice.exe ++;@BINPATH@/maintenanceservice_installer.exe + #endif + + ; [Crash Reporter] ; #ifdef MOZ_CRASHREPORTER #ifdef XP_MACOSX From 4f4b1cc140a5ba47a04035f07e0c46aa80979f4a Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Wed, 1 Oct 2025 23:45:34 +0200 Subject: [PATCH 023/111] chore: Bump version, b=no-bug, c=no-component --- surfer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surfer.json b/surfer.json index 8c0d54fe0..a98050d72 100644 --- a/surfer.json +++ b/surfer.json @@ -19,7 +19,7 @@ "brandShortName": "Zen", "brandFullName": "Zen Browser", "release": { - "displayVersion": "1.16.2b", + "displayVersion": "1.16.3b", "github": { "repo": "zen-browser/desktop" }, From 236abce07b853c0bfa59b30577253e5251f3204d Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Thu, 2 Oct 2025 01:02:14 +0200 Subject: [PATCH 024/111] feat: Add more delay when the mouse leaves the urlbar, b=no-bug, c=compact-mode --- src/zen/compact-mode/ZenCompactMode.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zen/compact-mode/ZenCompactMode.mjs b/src/zen/compact-mode/ZenCompactMode.mjs index e0b76019a..0606498ff 100644 --- a/src/zen/compact-mode/ZenCompactMode.mjs +++ b/src/zen/compact-mode/ZenCompactMode.mjs @@ -661,7 +661,7 @@ var gZenCompactModeManager = { requestAnimationFrame(() => { delete this._hasHoveredUrlbar; }); - }, 0); + }, 10); }, 0); }); }, From 283108dc28a9ae3624318f16b69c7faccf9586b5 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Thu, 2 Oct 2025 10:39:45 +0200 Subject: [PATCH 025/111] feat: Improve windows signing CI tool, b=no-bug, c=no-component --- build/winsign/sign.ps1 | 4 +++- package.json | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/build/winsign/sign.ps1 b/build/winsign/sign.ps1 index 1e06067b6..17aa67f9d 100644 --- a/build/winsign/sign.ps1 +++ b/build/winsign/sign.ps1 @@ -35,7 +35,9 @@ Start-Job -Name "SurferInit" -ScriptBlock { param($PWD) cd $PWD npm run import -- --verbose - npm run surfer -- ci --brand release + $surferJson = Get-Content surfer.json | ConvertFrom-Json + $version = $surferJson.brands.release.release.displayVersion + npm run ci -- $version } -Verbose -ArgumentList $PWD -Debug echo "Downloading artifacts info" diff --git a/package.json b/package.json index ea0542817..8844e4840 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "ffprefs": "cd tools/ffprefs && cargo run --bin ffprefs -- ../../", "lc": "surfer license-check", "lc:fix": "surfer license-check --fix", - "use-moz-src": "cd engine && ./mach use-moz-src" + "use-moz-src": "cd engine && ./mach use-moz-src", + "ci": "surfer ci --brand release --display-version" }, "repository": { "type": "git", From a4fa3159ca2707cad874612c61295c0748171447 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Thu, 2 Oct 2025 19:41:47 +0200 Subject: [PATCH 026/111] fix: Fixed essentials disappearing when switching spaces, b=no-bug, c=workspaces --- src/zen/workspaces/ZenWorkspaces.mjs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index bef9d0354..66562e902 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -2494,12 +2494,13 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { } for (const workspaceId of workspacesIds) { const workspaceElement = this.workspaceElement(workspaceId); - if (!workspaceElement) { + const workspaceObject = this.getWorkspaceFromId(workspaceId); + if (!workspaceElement || !workspaceObject) { + console.warn('Workspace element or object not found for id', workspaceId); continue; } const arrowScrollbox = workspaceElement.tabsContainer; const pinnedContainer = workspaceElement.pinnedTabsContainer; - const workspaceObject = this.getWorkspaceFromId(workspaceId); const essentialContainer = this.getEssentialsSection(workspaceObject.containerTabId); const essentialNumChildren = essentialContainer.children.length; let essentialHackType = 0; From a576912e03dbb94eb786fd0b5d30e808b077e6d9 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Thu, 2 Oct 2025 23:43:04 +0200 Subject: [PATCH 027/111] fix: Fixed empty split ksb for windows, b=no-bug, c=kbs --- src/zen/kbs/ZenKeyboardShortcuts.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zen/kbs/ZenKeyboardShortcuts.mjs b/src/zen/kbs/ZenKeyboardShortcuts.mjs index 38d26448a..dcb61e09c 100644 --- a/src/zen/kbs/ZenKeyboardShortcuts.mjs +++ b/src/zen/kbs/ZenKeyboardShortcuts.mjs @@ -1084,7 +1084,7 @@ class nsZenKeyboardShortcutsVersioner { data.push( new KeyShortcut( 'zen-new-empty-split-view', - AppConstants.platform == 'linux' ? '*' : '+', + AppConstants.platform == 'macosx' ? '+' : '*', '', ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, shift: true }), From cbcce8d4e311a1e24d314475ecb856a677885872 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Fri, 3 Oct 2025 07:55:33 +0200 Subject: [PATCH 028/111] New Crowdin updates (#10670) * New translations zen-preferences.ftl (Greek) * New translations zen-preferences.ftl (Russian) * New translations zen-workspaces.ftl (Russian) * New translations zen-general.ftl (Russian) * New translations zen-vertical-tabs.ftl (Russian) * New translations zen-folders.ftl (Russian) --- .../browser/preferences/zen-preferences.ftl | 4 ++-- .../browser/preferences/zen-preferences.ftl | 10 ++++----- locales/ru/browser/browser/zen-folders.ftl | 22 +++++++++---------- locales/ru/browser/browser/zen-general.ftl | 6 ++--- .../ru/browser/browser/zen-vertical-tabs.ftl | 4 ++-- locales/ru/browser/browser/zen-workspaces.ftl | 6 ++--- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/locales/el/browser/browser/preferences/zen-preferences.ftl b/locales/el/browser/browser/preferences/zen-preferences.ftl index 4cd0d53c6..2cc362acc 100644 --- a/locales/el/browser/browser/preferences/zen-preferences.ftl +++ b/locales/el/browser/browser/preferences/zen-preferences.ftl @@ -43,9 +43,9 @@ pane-settings-workspaces-title = Χώροι Εργασίας zen-tabs-unloader-enabled = .label = Ενεργοποίηση Εκφορτωτή Καρτέλας zen-look-and-feel-compact-toolbar-themed = - .label = Use themed background for compact toolbar + .label = Χρήση παρασκηνίου με θέμα για συμπαγή γραμμή εργαλειών zen-workspace-continue-where-left-off = - .label = Συνεχεία από εκεί που σταματήσατε + .label = Συνέχεια από εκεί που σταματήσατε pane-zen-pinned-tab-manager-title = Καρφιτσωμένες Καρτέλες zen-pinned-tab-manager-header = Γενικές ρυθμίσεις για καρφιτσωμένες καρτέλες zen-pinned-tab-manager-description = Διαχείριση πρόσθετης συμπεριφοράς καρφιτσωμένων καρτελών diff --git a/locales/ru/browser/browser/preferences/zen-preferences.ftl b/locales/ru/browser/browser/preferences/zen-preferences.ftl index c32b2b44a..3fdd81e85 100644 --- a/locales/ru/browser/browser/preferences/zen-preferences.ftl +++ b/locales/ru/browser/browser/preferences/zen-preferences.ftl @@ -43,7 +43,7 @@ pane-settings-workspaces-title = Рабочие пространства zen-tabs-unloader-enabled = .label = Включить выгрузку вкладок zen-look-and-feel-compact-toolbar-themed = - .label = Use themed background for compact toolbar + .label = Использовать цвета темы для фона компактной панели инструментов zen-workspace-continue-where-left-off = .label = Продолжить с того места, где вы остановились pane-zen-pinned-tab-manager-title = Закреплённые вкладки @@ -195,7 +195,7 @@ zen-picture-in-picture-toggle-shortcut-mac = Переключить изобра zen-picture-in-picture-toggle-shortcut-mac-alt = Переключить изображение в картинке (Mac Alt) zen-page-source-shortcut-safari = Просмотр исходного кода страницы (Safari) zen-nav-stop-shortcut = Остановить загрузку -zen-history-sidebar-shortcut = Show History Sidebar +zen-history-sidebar-shortcut = Показать боковую панель истории zen-window-minimize-shortcut = Свернуть окно zen-help-shortcut = Открыть справку zen-preferences-shortcut = Открыть настройки @@ -221,7 +221,7 @@ zen-key-exit-full-screen = Выйти из полноэкранного режи zen-ai-chatbot-sidebar-shortcut = Переключить боковую панель ИИ чат-бота zen-key-inspector-mac = Переключить инспектор (Mac) zen-toggle-sidebar-shortcut = Переключить боковую панель Firefox -zen-toggle-pin-tab-shortcut = Toggle Pin Tab +zen-toggle-pin-tab-shortcut = Переключить закрепление вкладки zen-reader-mode-toggle-shortcut-other = Переключить режим чтения zen-picture-in-picture-toggle-shortcut = Переключить изображение в картинке zen-nav-reload-shortcut-2 = Обновить страницу @@ -255,7 +255,7 @@ zen-close-tab-shortcut = Закрыть вкладку zen-compact-mode-shortcut-show-sidebar = Включить/выключить плавающую боковую панель zen-compact-mode-shortcut-show-toolbar = Инструменты плавающей панели zen-compact-mode-shortcut-toggle = Компактный режим -zen-glance-expand = Expand Glance +zen-glance-expand = Раскрыть предпросмотр zen-workspace-shortcut-switch-1 = Переключиться на пространство 1 zen-workspace-shortcut-switch-2 = Переключиться на пространство 2 zen-workspace-shortcut-switch-3 = Переключиться на пространство 3 @@ -274,7 +274,7 @@ zen-split-view-shortcut-grid = Переключить разделение се zen-split-view-shortcut-vertical = Вертикальный режим разделения zen-split-view-shortcut-horizontal = Горизонтальное разделение zen-split-view-shortcut-unsplit = Закрыть раздельный вид -zen-new-empty-split-view-shortcut = New Empty Split View +zen-new-empty-split-view-shortcut = Новая разделённая вкладка zen-key-select-tab-1 = Выбрать вкладку #1 zen-key-select-tab-2 = Выбрать вкладку #2 zen-key-select-tab-3 = Выбрать вкладку #3 diff --git a/locales/ru/browser/browser/zen-folders.ftl b/locales/ru/browser/browser/zen-folders.ftl index e3976b196..c673b1acb 100644 --- a/locales/ru/browser/browser/zen-folders.ftl +++ b/locales/ru/browser/browser/zen-folders.ftl @@ -1,21 +1,21 @@ zen-folders-search-placeholder = - .placeholder = Искать { $folder-name }… + .placeholder = Искать в { $folder-name }... zen-folders-panel-rename-folder = - .label = Rename Folder + .label = Переименовать папку zen-folders-panel-unpack-folder = - .label = Unpack Folder + .label = Распаковать папку zen-folders-new-subfolder = - .label = New Subfolder + .label = Новая подпапка zen-folders-panel-delete-folder = - .label = Delete Folder + .label = Удалить папку zen-folders-panel-convert-folder-to-space = - .label = Convert folder to Space + .label = Конвертировать папку в пространство zen-folders-panel-change-folder-space = - .label = Change Space... + .label = Переместить в пространство... zen-folders-panel-change-icon-folder = - .label = Change Icon + .label = Изменить значок zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Выгрузить все активные вкладки в этой папке zen-folders-unload-folder = - .label = Unload All Tabs -zen-folders-search-no-results = No tabs matching that search 🤔 + .label = Выгрузить все вкладки +zen-folders-search-no-results = Ничего не найдено 🤔 diff --git a/locales/ru/browser/browser/zen-general.ftl b/locales/ru/browser/browser/zen-general.ftl index b877ebc45..6c80884b7 100644 --- a/locales/ru/browser/browser/zen-general.ftl +++ b/locales/ru/browser/browser/zen-general.ftl @@ -45,7 +45,7 @@ zen-close-label = Закрыть zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Найти... zen-icons-picker-emoji = - .label = Emojis + .label = Эмодзи zen-icons-picker-svg = - .label = Icons -urlbar-search-mode-zen_actions = Actions + .label = Иконки +urlbar-search-mode-zen_actions = Действия diff --git a/locales/ru/browser/browser/zen-vertical-tabs.ftl b/locales/ru/browser/browser/zen-vertical-tabs.ftl index 8267a2e54..757a0d602 100644 --- a/locales/ru/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ru/browser/browser/zen-vertical-tabs.ftl @@ -8,14 +8,14 @@ zen-toolbar-context-compact-mode-enable = .label = Включить компактный вид .accesskey = D zen-toolbar-context-compact-mode-just-tabs = - .label = Hide sidebar + .label = Скрыть боковую панель zen-toolbar-context-compact-mode-just-toolbar = .label = Скрыть панель инструментов zen-toolbar-context-compact-mode-hide-both = .label = Скрыть оба .accesskey = Н zen-toolbar-context-new-folder = - .label = New Folder + .label = Новая папка .accesskey = N sidebar-zen-expand = .label = Развернуть боковую панель diff --git a/locales/ru/browser/browser/zen-workspaces.ftl b/locales/ru/browser/browser/zen-workspaces.ftl index 1d638845f..ff1c4cb31 100644 --- a/locales/ru/browser/browser/zen-workspaces.ftl +++ b/locales/ru/browser/browser/zen-workspaces.ftl @@ -2,9 +2,9 @@ zen-panel-ui-workspaces-text = Рабочие пространства zen-panel-ui-workspaces-create = .label = Создать пространство zen-panel-ui-folder-create = - .label = Create Folder + .label = Создать папку zen-panel-ui-new-empty-split = - .label = New Split + .label = Новая разделённая вкладка zen-workspaces-panel-context-delete = .label = Удалить пространство .accesskey = D @@ -50,4 +50,4 @@ zen-workspace-creation-profile = Профиль zen-workspace-creation-header = Создать пространство zen-workspace-creation-label = Пространства используются для организации ваших вкладок и сеансов. zen-workspaces-delete-workspace-title = Удалить пространство? -zen-workspaces-delete-workspace-body = Are you sure you want to delete { $name }? This action cannot be undone. +zen-workspaces-delete-workspace-body = Вы уверены, что хотите удалить { $name }? Это действие необратимо. From 9b3ef6da897b1ee2e9adc6abb10f9b4ba45445c8 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Sat, 4 Oct 2025 04:39:44 +0200 Subject: [PATCH 029/111] chore: Updated Firefox `143.0.4`, b=no-bug, c=l10n --- README.md | 4 ++-- build/firefox-cache/l10n-last-commit-hash | 2 +- surfer.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 60a55aa73..58bc8315f 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne ### Firefox Versions -- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `143.0.3`! 🚀 -- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 143.0.3`! +- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `143.0.4`! 🚀 +- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 143.0.4`! ### Contributing diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash index b24de145e..671337a45 100644 --- a/build/firefox-cache/l10n-last-commit-hash +++ b/build/firefox-cache/l10n-last-commit-hash @@ -1 +1 @@ -c8042c4961ad61678121d8ce9ca2d17cc85fefbe \ No newline at end of file +5cbf54e3cfaf4cfb375088d7e11702e8974b238f \ No newline at end of file diff --git a/surfer.json b/surfer.json index a98050d72..e643dbd5b 100644 --- a/surfer.json +++ b/surfer.json @@ -5,8 +5,8 @@ "binaryName": "zen", "version": { "product": "firefox", - "version": "143.0.3", - "candidate": "143.0.3" + "version": "143.0.4", + "candidate": "143.0.4" }, "buildOptions": { "generateBranding": true From e3409236239569770d096f4fbe5de101f9332506 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 5 Oct 2025 00:28:32 +0200 Subject: [PATCH 030/111] feat: Increased the width and height of toolbar buttons, b=no-bug, c=common, workspaces --- src/zen/common/styles/zen-single-components.css | 9 +++++---- src/zen/workspaces/ZenWorkspaceIcons.mjs | 2 +- src/zen/workspaces/ZenWorkspaces.mjs | 2 +- src/zen/workspaces/zen-workspaces.css | 7 ++++--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 8bdaa80c0..9e6ccd661 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -177,15 +177,16 @@ body > #confetti { #zen-sidebar-foot-buttons & { --tab-border-radius: 6px; --toolbarbutton-border-radius: var(--tab-border-radius); - --toolbarbutton-inner-padding: 5px; + --toolbarbutton-inner-padding: 6px; --toolbarbutton-outer-padding: 2px; } transition: background-color 0.1s, - scale 0.2s; - &:active { - transform: scale(0.98); + transform 0.2s; + + &:active:hover { + transform: scale(0.95); } } diff --git a/src/zen/workspaces/ZenWorkspaceIcons.mjs b/src/zen/workspaces/ZenWorkspaceIcons.mjs index 3d67718c9..1d48a5f10 100644 --- a/src/zen/workspaces/ZenWorkspaceIcons.mjs +++ b/src/zen/workspaces/ZenWorkspaceIcons.mjs @@ -99,7 +99,7 @@ #createWorkspaceIcon(workspace) { const button = document.createXULElement('toolbarbutton'); - button.setAttribute('class', 'subviewbutton'); + button.setAttribute('class', 'subviewbutton toolbarbutton-1'); button.setAttribute('tooltiptext', workspace.name); button.setAttribute('zen-workspace-id', workspace.uuid); button.setAttribute('context', 'zenWorkspaceMoreActions'); diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 66562e902..708ac626e 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -3018,7 +3018,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { parent.removeAttribute('icons-overflow'); return; } - const maxButtonSize = 26; // IMPORTANT: This should match the CSS size of the icons + const maxButtonSize = 28; // IMPORTANT: This should match the CSS size of the icons const minButtonSize = 15; const separation = 3; // Space between icons diff --git a/src/zen/workspaces/zen-workspaces.css b/src/zen/workspaces/zen-workspaces.css index 5ac09c7c2..ad5c61c6c 100644 --- a/src/zen/workspaces/zen-workspaces.css +++ b/src/zen/workspaces/zen-workspaces.css @@ -33,8 +33,8 @@ & toolbarbutton { margin: 0; - max-width: 26px; - height: 26px; + max-width: 28px; + height: 28px; display: flex; justify-content: center; padding: 0 !important; @@ -63,7 +63,8 @@ transition: filter 0.2s, opacity 0.2s, - width 0.1s; + width 0.1s, + transform 0.2s; &[active='true'], &:hover, From 3ac31a96a6295d2afe224d0aada0c3566763005c Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 5 Oct 2025 18:56:41 +0200 Subject: [PATCH 031/111] feat: New site data popup, p=#10651 --- locales/en-US/browser/browser/zen-general.ftl | 24 + .../browser/browser/zen-vertical-tabs.ftl | 11 - prefs/compact-mode.yaml | 6 - prefs/folders.yaml | 2 +- prefs/zen-urlbar.yaml | 3 + .../base/content/browser-addons-js.patch | 37 +- .../base/content/browser-pageActions-js.patch | 12 + .../base/content/navigator-toolbox-js.patch | 38 +- .../base/content/zen-commands.inc.xhtml | 5 +- .../base/content/zen-panels/popups.inc | 9 + .../base/content/zen-panels/site-data.inc | 87 +++ .../base/content/zen-popupset.inc.xhtml | 1 + .../CustomizableUI-sys-mjs.patch | 11 +- .../components/preferences/zen-settings.js | 42 -- .../preferences/zenLooksAndFeel.inc.xhtml | 37 -- .../shared/preferences/zen-preferences.css | 32 - src/browser/themes/shared/zen-icons/icons.css | 92 ++- .../shared/zen-icons/lin/security-broken.svg | 2 +- src/zen/common/ZenCustomizableUI.sys.mjs | 16 +- src/zen/common/ZenUIManager.mjs | 46 +- .../common/styles/zen-browser-container.css | 8 +- src/zen/common/styles/zen-omnibox.css | 76 ++- src/zen/common/styles/zen-popup.css | 15 +- .../common/styles/zen-single-components.css | 276 +++++++++ src/zen/common/zen-sets.js | 13 +- src/zen/compact-mode/ZenCompactMode.mjs | 104 +--- src/zen/compact-mode/zen-compact-mode.css | 578 ++++++++---------- src/zen/kbs/ZenKeyboardShortcuts.mjs | 50 +- src/zen/tabs/zen-tabs/vertical-tabs.css | 11 +- src/zen/urlbar/ZenSiteDataPanel.sys.mjs | 426 +++++++++++++ src/zen/urlbar/moz.build | 1 + src/zen/workspaces/zen-workspaces.css | 1 + src/zen/zen.globals.js | 2 + 33 files changed, 1393 insertions(+), 681 deletions(-) create mode 100644 src/browser/base/content/browser-pageActions-js.patch create mode 100644 src/browser/base/content/zen-panels/site-data.inc create mode 100644 src/zen/urlbar/ZenSiteDataPanel.sys.mjs diff --git a/locales/en-US/browser/browser/zen-general.ftl b/locales/en-US/browser/browser/zen-general.ftl index 708bc05d9..77f8a014b 100644 --- a/locales/en-US/browser/browser/zen-general.ftl +++ b/locales/en-US/browser/browser/zen-general.ftl @@ -49,6 +49,9 @@ zen-library-sidebar-workspaces = zen-library-sidebar-mods = .label = Mods +zen-toggle-compact-mode-button = + .tooltiptext = Toggle Compact Mode + # note: Do not translate the "
" tags in the following string zen-learn-more-text = Learn More @@ -64,3 +67,24 @@ zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions +zen-site-data-settings = Settings + +zen-generic-manage = Manage +zen-generic-more = More + +# These labels will be used for the site data panel settings +zen-site-data-setting-allow = Allowed +zen-site-data-setting-block = Blocked +zen-site-data-security-info-extension = + .label = Extension +zen-site-data-security-info-secure = + .label = Secure +zen-site-data-security-info-not-secure = + .label = Not Secure + +zen-site-data-manage-addons = + .label = Manage Extensions +zen-site-data-get-addons = + .label = Add Extensions +zen-site-data-site-settings = + .label = All Site Settings \ No newline at end of file diff --git a/locales/en-US/browser/browser/zen-vertical-tabs.ftl b/locales/en-US/browser/browser/zen-vertical-tabs.ftl index 63fd3ef6d..3b4975bb6 100644 --- a/locales/en-US/browser/browser/zen-vertical-tabs.ftl +++ b/locales/en-US/browser/browser/zen-vertical-tabs.ftl @@ -3,20 +3,9 @@ zen-toolbar-context-tabs-right = .label = Tabs on the right .accesskey = R -zen-toolbar-context-compact-mode = - .label = Compact mode - .accesskey = C - zen-toolbar-context-compact-mode-enable = .label = Enable compact mode .accesskey = D -zen-toolbar-context-compact-mode-just-tabs = - .label = Hide sidebar -zen-toolbar-context-compact-mode-just-toolbar = - .label = Hide toolbar -zen-toolbar-context-compact-mode-hide-both = - .label = Hide both - .accesskey = H zen-toolbar-context-new-folder = .label = New Folder .accesskey = N diff --git a/prefs/compact-mode.yaml b/prefs/compact-mode.yaml index f48e2d8cd..8e8003411 100644 --- a/prefs/compact-mode.yaml +++ b/prefs/compact-mode.yaml @@ -2,12 +2,6 @@ # 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/. -- name: zen.view.compact.hide-tabbar - value: true - -- name: zen.view.compact.hide-toolbar - value: false - - name: zen.view.compact.toolbar-flash-popup value: false diff --git a/prefs/folders.yaml b/prefs/folders.yaml index b1e98dcf5..7a8edc5ca 100644 --- a/prefs/folders.yaml +++ b/prefs/folders.yaml @@ -6,7 +6,7 @@ value: true - name: zen.folders.search.hover-delay - value: 1000 # ms + value: 900 # ms - name: zen.folders.max-subfolders value: 5 diff --git a/prefs/zen-urlbar.yaml b/prefs/zen-urlbar.yaml index b9b0533d4..97be59be9 100644 --- a/prefs/zen-urlbar.yaml +++ b/prefs/zen-urlbar.yaml @@ -8,6 +8,9 @@ - name: zen.urlbar.show-protections-icon value: false +- name: zen.urlbar.show-contextual-id + value: false + - name: zen.urlbar.behavior value: floating-on-type diff --git a/src/browser/base/content/browser-addons-js.patch b/src/browser/base/content/browser-addons-js.patch index 318539af9..71135dc45 100644 --- a/src/browser/base/content/browser-addons-js.patch +++ b/src/browser/base/content/browser-addons-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js -index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd693f1f1135 100644 +index d7542a38a0242dd9c9c6390171d59992d75a0c19..baa5d84c26f7e74c779bc7e1a2b83b543b413441 100644 --- a/browser/base/content/browser-addons.js +++ b/browser/base/content/browser-addons.js @@ -1064,7 +1064,7 @@ var gXPInstallObserver = { @@ -20,7 +20,38 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd69 }, }; -@@ -2608,7 +2608,7 @@ var gUnifiedExtensions = { +@@ -2205,7 +2205,7 @@ var gUnifiedExtensions = { + // If the new ID is not added in NOTIFICATION_IDS, consider handling the case + // in the "PopupNotificationsBeforeAnchor" handler elsewhere in this file. + getPopupAnchorID(aBrowser, aWindow) { +- const anchorID = "unified-extensions-button"; ++ const anchorID = "zen-site-data-icon-button"; + const attr = anchorID + "popupnotificationanchor"; + + if (!aBrowser[attr]) { +@@ -2216,7 +2216,7 @@ var gUnifiedExtensions = { + anchorID + // Anchor on the toolbar icon to position the popup right below the + // button. +- ).firstElementChild; ++ ); + } + + return anchorID; +@@ -2509,11 +2509,7 @@ var gUnifiedExtensions = { + // Lazy load the unified-extensions-panel panel the first time we need to + // display it. + if (!this._panel) { +- let template = document.getElementById( +- "unified-extensions-panel-template" +- ); +- template.replaceWith(template.content); +- this._panel = document.getElementById("unified-extensions-panel"); ++ this._panel = document.getElementById("zen-unified-site-data-panel"); + let customizationArea = this._panel.querySelector( + "#unified-extensions-area" + ); +@@ -2608,7 +2604,7 @@ var gUnifiedExtensions = { this.recordButtonTelemetry(reason || "extensions_panel_showing"); this.ensureButtonShownBeforeAttachingPanel(panel); PanelMultiView.openPopup(panel, this._button, { @@ -29,7 +60,7 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd69 triggerEvent: aEvent, }); } -@@ -2795,18 +2795,20 @@ var gUnifiedExtensions = { +@@ -2795,18 +2791,20 @@ var gUnifiedExtensions = { this._maybeMoveWidgetNodeBack(widgetId); } diff --git a/src/browser/base/content/browser-pageActions-js.patch b/src/browser/base/content/browser-pageActions-js.patch new file mode 100644 index 000000000..197789f45 --- /dev/null +++ b/src/browser/base/content/browser-pageActions-js.patch @@ -0,0 +1,12 @@ +diff --git a/browser/base/content/browser-pageActions.js b/browser/base/content/browser-pageActions.js +index 00da33bc11189db17b6a2e656acb3a778531197c..9571155baccad9a886cbe9c7bf0bd76a135331c4 100644 +--- a/browser/base/content/browser-pageActions.js ++++ b/browser/base/content/browser-pageActions.js +@@ -451,6 +451,7 @@ var BrowserPageActions = { + ), + document.getElementById(this.mainButtonNode.id), + document.getElementById("identity-icon"), ++ document.getElementById("zen-site-data-icon-button"), + ]; + for (let node of potentialAnchorNodes) { + if (node && !node.hidden) { diff --git a/src/browser/base/content/navigator-toolbox-js.patch b/src/browser/base/content/navigator-toolbox-js.patch index e775bcd15..167525ff8 100644 --- a/src/browser/base/content/navigator-toolbox-js.patch +++ b/src/browser/base/content/navigator-toolbox-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js -index 413bad2a62058a1c434d6a44e927e44eb397289d..b621c586e679bb8686fe9a5e6743512e71604425 100644 +index 413bad2a62058a1c434d6a44e927e44eb397289d..472eab5d3bca2bc665920707a71105167cbe75ec 100644 --- a/browser/base/content/navigator-toolbox.js +++ b/browser/base/content/navigator-toolbox.js @@ -8,7 +8,7 @@ @@ -11,6 +11,24 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..b621c586e679bb8686fe9a5e6743512e const widgetOverflow = document.getElementById("widget-overflow"); function onPopupShowing(event) { +@@ -110,7 +110,7 @@ document.addEventListener( + #pageActionButton, + #downloads-button, + #fxa-toolbar-menu-button, +- #unified-extensions-button, ++ #zen-site-data-icon-button, + #library-button + `); + if (!element) { +@@ -138,7 +138,7 @@ document.addEventListener( + gSync.toggleAccountPanel(element, event); + break; + +- case "unified-extensions-button": ++ case "zen-site-data-icon-button": + gUnifiedExtensions.togglePanel(event); + break; + @@ -187,6 +187,7 @@ document.addEventListener( #reload-button , #urlbar-go-button, @@ -27,3 +45,21 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..b621c586e679bb8686fe9a5e6743512e gBrowser.handleNewTabMiddleClick(element, event); break; +@@ -317,7 +319,7 @@ document.addEventListener( + #pageActionButton, + #downloads-button, + #fxa-toolbar-menu-button, +- #unified-extensions-button, ++ #zen-site-data-icon-button, + #library-button + `); + if (!element) { +@@ -396,7 +398,7 @@ document.addEventListener( + gSync.toggleAccountPanel(element, event); + break; + +- case "unified-extensions-button": ++ case "zen-site-data-icon-button": + gUnifiedExtensions.togglePanel(event); + break; + diff --git a/src/browser/base/content/zen-commands.inc.xhtml b/src/browser/base/content/zen-commands.inc.xhtml index aad8b0c74..25db87158 100644 --- a/src/browser/base/content/zen-commands.inc.xhtml +++ b/src/browser/base/content/zen-commands.inc.xhtml @@ -5,10 +5,7 @@ - - - - + diff --git a/src/browser/base/content/zen-panels/popups.inc b/src/browser/base/content/zen-panels/popups.inc index 955609aa4..cdada5655 100644 --- a/src/browser/base/content/zen-panels/popups.inc +++ b/src/browser/base/content/zen-panels/popups.inc @@ -49,3 +49,12 @@ + + + + + + + + + diff --git a/src/browser/base/content/zen-panels/site-data.inc b/src/browser/base/content/zen-panels/site-data.inc new file mode 100644 index 000000000..e5a774b88 --- /dev/null +++ b/src/browser/base/content/zen-panels/site-data.inc @@ -0,0 +1,87 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# 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/. + + + +# We'll keep the view with this name/id in order to prevent +# any sort of future issues we may have if firefox decides +# to change the functionality of this view + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Keep this button on the DOM even though we hide it for ever, +# again, to keep firefox happy if they decide to change functionality +# for this specific button / id + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/browser/base/content/zen-popupset.inc.xhtml b/src/browser/base/content/zen-popupset.inc.xhtml index 3a812435a..e58a85c4c 100644 --- a/src/browser/base/content/zen-popupset.inc.xhtml +++ b/src/browser/base/content/zen-popupset.inc.xhtml @@ -5,5 +5,6 @@ #include zen-panels/gradient-generator.inc #include zen-panels/emojis-picker.inc #include zen-panels/folders-search.inc +#include zen-panels/site-data.inc #include zen-panels/popups.inc diff --git a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch index 396dbf5a9..4635de61c 100644 --- a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch +++ b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs -index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0ade05e3b 100644 +index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4d74ede4e 100644 --- a/browser/components/customizableui/CustomizableUI.sys.mjs +++ b/browser/components/customizableui/CustomizableUI.sys.mjs @@ -14,6 +14,7 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -10,6 +10,15 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0 HomePage: "resource:///modules/HomePage.sys.mjs", PanelMultiView: "moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs", +@@ -323,7 +324,7 @@ var CustomizableUIInternal = { + { + type: CustomizableUI.TYPE_PANEL, + defaultPlacements: [], +- anchor: "unified-extensions-button", ++ anchor: "zen-site-data-icon-button", + }, + false + ); @@ -333,19 +334,14 @@ var CustomizableUIInternal = { "back-button", "forward-button", diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js index a93ba5b46..b37ba5dcb 100644 --- a/src/browser/components/preferences/zen-settings.js +++ b/src/browser/components/preferences/zen-settings.js @@ -648,8 +648,6 @@ var gZenLooksAndFeel = { Services.prefs.removeObserver(pref, this); } }); - this.setCompactModeStyle(); - this.applySidebarLayout(); }, @@ -696,41 +694,6 @@ var gZenLooksAndFeel = { }); } }, - - setCompactModeStyle() { - const chooser = document.getElementById('zen-compact-mode-styles-form'); - const radios = [...chooser.querySelectorAll('input')]; - - let value = ''; - if ( - Services.prefs.getBoolPref('zen.view.compact.hide-tabbar', false) && - Services.prefs.getBoolPref('zen.view.compact.hide-toolbar', false) - ) { - value = 'both'; - } else { - value = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar') ? 'left' : 'top'; - } - chooser.querySelector(`[value='${value}']`).checked = true; - for (let radio of radios) { - radio.addEventListener('change', (e) => { - let value = e.target.value; - switch (value) { - case 'left': - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false); - break; - case 'top': - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', false); - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); - break; - default: - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); - break; - } - }); - } - }, }; /* eslint-disable no-unused-vars */ @@ -1075,11 +1038,6 @@ var gZenCKSSettings = { }; Preferences.addAll([ - { - id: 'zen.view.compact.hide-toolbar', - type: 'bool', - default: false, - }, { id: 'zen.view.compact.toolbar-flash-popup', type: 'bool', diff --git a/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml b/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml index 6af7b0a5c..259fff79e 100644 --- a/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml +++ b/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml @@ -56,43 +56,6 @@ - -
- - - -
-
hbox { - margin-top: 10px; -} - #category-zen-looks > .category-icon { list-style-image: url('chrome://browser/skin/customize.svg'); } diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index fec5a4d24..8dff5e399 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -54,7 +54,8 @@ } #sidebar-button:-moz-locale-dir(ltr):not([positionend]), -#sidebar-button:-moz-locale-dir(rtl)[positionend] { +#sidebar-button:-moz-locale-dir(rtl)[positionend], +#zen-toggle-compact-mode { list-style-image: url('chrome://browser/skin/sidebars.svg') !important; } @@ -74,7 +75,8 @@ } #appMenu-zoom-controls, -#PanelUI-zen-gradient-generator-color-add { +#PanelUI-zen-gradient-generator-color-add, +#zen-site-data-new-addon-button { list-style-image: url('plus.svg') !important; } @@ -213,7 +215,8 @@ .search-setting-button > .button-box > .button-icon, #appMenu-settings-button, #PanelUI-zen-profiles-managePrfs, -.unified-extensions-item-open-menu.subviewbutton { +.unified-extensions-item-open-menu.subviewbutton, +.zen-site-data-permission-icon { list-style-image: url('settings.svg') !important; } @@ -263,6 +266,7 @@ } #bookmarks-menu-button, +#zen-site-data-header-bookmark, #appMenu-bookmarks-button, #sidebar-switcher-bookmarks, #appMenu-library-bookmarks-button, @@ -407,7 +411,8 @@ list-style-image: url('customize.svg') !important; } -#zen-copy-current-url-button { +#zen-copy-current-url-button, +#zen-site-data-header-share { list-style-image: url('share.svg'); } @@ -466,8 +471,20 @@ } /* permissions */ -#permissions-granted-icon { - list-style-image: url('permissions.svg') !important; +#identity-permission-box, +#identity-box:not([pageproxystate='invalid']) #identity-icon-box, +#identity-box[pageproxystate='invalid'] #zen-site-data-icon-button { + display: none !important; +} + +#zen-site-data-icon-button { + padding: 0 6px; + + & image { + list-style-image: url('permissions.svg'); + -moz-context-properties: fill, fill-opacity; + pointer-events: none; + } } .geo-icon { @@ -495,7 +512,8 @@ list-style-image: url('desktop-notification-blocked.svg') !important; } -.camera-icon { +.camera-icon, +#zen-site-data-header-screenshot { list-style-image: url('camera.svg') !important; } @@ -558,7 +576,8 @@ list-style-image: url('midi.svg') !important; } -.install-icon { +.install-icon, +.zen-permission-extension-icon { list-style-image: url('extension.svg') !important; } @@ -598,7 +617,8 @@ background-image: url('stop-to-reload.svg') !important; } -#reader-mode-button > .urlbar-icon { +#reader-mode-button > .urlbar-icon, +#zen-site-data-header-reader-mode { list-style-image: url('reader-mode.svg') !important; } @@ -811,3 +831,57 @@ -moz-context-properties: fill; fill: currentColor; } + +#zen-site-data-security-info { + -moz-context-properties: fill, fill-opacity; + fill: currentColor; + appearance: none; + border-radius: 4px; + padding: 5px; + + &[identity='secure'] { + list-style-image: url('security.svg'); + } + + &[identity='not-secure'] { + list-style-image: url('security-broken.svg'); + } + + &[identity='extension'] { + list-style-image: url('extension.svg'); + } + + &:not([identity='secure']) * { + color: light-dark(var(--color-red-70), var(--color-red-30)); + } + + & .toolbarbutton-text { + padding-inline-start: 4px !important; + } + + & .toolbarbutton-icon { + width: 16px; + } + + & > * { + opacity: 0.8; + } +} + +#zen-site-data-actions { + -moz-context-properties: fill, fill-opacity; + fill: currentColor; + appearance: none; + width: 26px; + height: 26px; + border-radius: 99px; + margin-left: auto !important; + list-style-image: url('menu.svg'); + justify-content: center; + align-items: center; + padding: 0; + + & label { + display: none; + } +} diff --git a/src/browser/themes/shared/zen-icons/lin/security-broken.svg b/src/browser/themes/shared/zen-icons/lin/security-broken.svg index 06097d2ea..86396585e 100644 --- a/src/browser/themes/shared/zen-icons/lin/security-broken.svg +++ b/src/browser/themes/shared/zen-icons/lin/security-broken.svg @@ -2,4 +2,4 @@ # This Source Code Form is subject to the terms of the Mozilla Public # 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/. - + diff --git a/src/zen/common/ZenCustomizableUI.sys.mjs b/src/zen/common/ZenCustomizableUI.sys.mjs index 04304dec0..329eb2e8f 100644 --- a/src/zen/common/ZenCustomizableUI.sys.mjs +++ b/src/zen/common/ZenCustomizableUI.sys.mjs @@ -67,6 +67,10 @@ export var ZenCustomizableUI = new (class { addon-webext-overflowtarget="overflowed-extensions-list" mode="icons"> + @@ -106,12 +110,20 @@ export var ZenCustomizableUI = new (class { _initCreateNewButton(window) { const button = window.document.getElementById('zen-create-new-button'); - button.addEventListener('command', () => { + button.addEventListener('command', (event) => { if (button.hasAttribute('open')) { return; } const popup = window.document.getElementById('zenCreateNewPopup'); - popup.openPopup(button, 'before_start'); + popup.openPopup( + button, + 'before_start', + 0, + 0, + true /* isContextMenu */, + false /* attributesOverride */, + event + ); }); } diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs index c98f8fdca..a23c0cf0a 100644 --- a/src/zen/common/ZenUIManager.mjs +++ b/src/zen/common/ZenUIManager.mjs @@ -1,6 +1,11 @@ // This Source Code Form is subject to the terms of the Mozilla Public // 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/. + +ChromeUtils.defineESModuleGetters(this, { + nsZenSiteDataPanel: 'resource:///modules/ZenSiteDataPanel.sys.mjs', +}); + var gZenUIManager = { _popupTrackingElements: [], _hoverPausedForExpand: false, @@ -14,19 +19,6 @@ var gZenUIManager = { init() { document.addEventListener('popupshowing', this.onPopupShowing.bind(this)); document.addEventListener('popuphidden', this.onPopupHidden.bind(this)); - XPCOMUtils.defineLazyPreferenceGetter( - this, - 'contentElementSeparation', - 'zen.theme.content-element-separation', - 0 - ); - XPCOMUtils.defineLazyPreferenceGetter(this, 'urlbarWaitToClear', 'zen.urlbar.wait-to-clear', 0); - XPCOMUtils.defineLazyPreferenceGetter( - this, - 'urlbarShowDomainOnly', - 'zen.urlbar.show-domain-only-in-sidebar', - true - ); document.addEventListener('mousedown', this.handleMouseDown.bind(this), true); @@ -44,6 +36,8 @@ var gZenUIManager = { return document.getElementById('zen-toast-container'); }); + window.gZenSiteDataPanel = new nsZenSiteDataPanel(window); + gURLBar._zenTrimURL = this.urlbarTrim.bind(this); new ResizeObserver( @@ -596,6 +590,26 @@ var gZenUIManager = { }, }; +XPCOMUtils.defineLazyPreferenceGetter( + gZenUIManager, + 'contentElementSeparation', + 'zen.theme.content-element-separation', + 0 +); + +XPCOMUtils.defineLazyPreferenceGetter( + gZenUIManager, + 'urlbarWaitToClear', + 'zen.urlbar.wait-to-clear', + 0 +); +XPCOMUtils.defineLazyPreferenceGetter( + gZenUIManager, + 'urlbarShowDomainOnly', + 'zen.urlbar.show-domain-only-in-sidebar', + true +); + var gZenVerticalTabsManager = { init() { this._multiWindowFeature = new nsZenMultiWindowFeature(); @@ -1034,6 +1048,11 @@ var gZenVerticalTabsManager = { ) { topButtons.prepend(windowButtons); } + + if (!isSingleToolbar && isCompactMode) { + navBar.prepend(topButtons); + } + // Case: single toolbar, compact mode, right side and windows styled buttons if (isSingleToolbar && isCompactMode && isRightSide && this.isWindowsStyledButtons) { topButtons.prepend(windowButtons); @@ -1072,7 +1091,6 @@ var gZenVerticalTabsManager = { appContentNavbarContaienr.append(windowButtons); } - gZenCompactModeManager.updateCompactModeContext(isSingleToolbar); this.recalculateURLBarHeight(); // Always move the splitter next to the sidebar diff --git a/src/zen/common/styles/zen-browser-container.css b/src/zen/common/styles/zen-browser-container.css index 1407dbe83..62045e7b0 100644 --- a/src/zen/common/styles/zen-browser-container.css +++ b/src/zen/common/styles/zen-browser-container.css @@ -17,7 +17,13 @@ } & browser[type='content'] { - background: light-dark(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1)); + &:not([transparent='true']) { + background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32)); + } + + &[transparent='true'] { + background: light-dark(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1)); + } } @media not -moz-pref('layout.css.prefers-color-scheme.content-override', 2) { diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 377688fc0..5b245f5f9 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -120,6 +120,21 @@ border-radius: 10px !important; } } + + .identity-box-button { + opacity: 0; + transition: + opacity 0.2s, + visibility 0.2s; + visibility: collapse; + + #navigator-toolbox:hover &, + &[open], + #identity-box[pageproxystate='invalid'] & { + opacity: 1; + visibility: visible; + } + } } .urlbar-page-action, @@ -220,24 +235,14 @@ } :root[zen-single-toolbar='true'] { - --urlbar-icon-border-radius: 10px !important; + --urlbar-icon-border-radius: 8px !important; - .urlbar-page-action:not([open]):not(#identity-permission-box), + .urlbar-page-action:not([open]):not([showing]):not(#identity-permission-box), #tracking-protection-icon-container { display: none; } - #identity-box:not([pageproxystate='invalid']):not(.notSecure) #identity-icon-box:not([open]) { - margin-inline-start: calc(-8px - 2 * var(--urlbar-icon-padding)); - transform: translateX(100%); - opacity: 0; - - :root:not([supress-primary-adjustment]) & { - transition: all 0.1s ease; - } - } - - #identity-permission-box > *:not(#permissions-granted-icon) { + #identity-permission-box > *:not(#zen-site-data-icon-button) { visibility: collapse; } @@ -245,25 +250,7 @@ display: none; } - #urlbar[open] - :is(#tracking-protection-icon-container, .urlbar-page-action, .identity-box-button):not( - [hidden] - ):not(#identity-permission-box), - #urlbar:hover #identity-icon-box { - opacity: 1 !important; - margin-inline-start: 0 !important; - transform: none !important; - display: flex; - #urlbar:not(:hover) & { - transition: none; - } - } - - #urlbar:not([open]) #userContext-icons { - margin-inline: 0; - } - - #urlbar:not([open]) { + #urlbar:not([breakout-extend='true']) { #identity-box:not([pageproxystate='invalid']) { order: 2; } @@ -335,10 +322,6 @@ } @container urlbar-container (width < 350px) { - #userContext-icons { - transition: all 0.1s ease; - } - #userContext-label { display: none; } @@ -346,12 +329,6 @@ #userContext-indicator { margin-inline-end: 4px; } - - #urlbar:hover:not([breakout-extend='true']) #userContext-icons { - margin-inline-end: calc(-16px - 2 * var(--urlbar-icon-padding)) !important; - opacity: 0; - pointer-events: none; - } } #notification-popup-box { @@ -683,3 +660,18 @@ font-weight: 600; padding: 0px; } + +/* These are buttons that we dont need to be + * displayed anymore, since now zen displays + * them into a single, unified button */ +#reader-mode-button, +#urlbar-go-button, +#star-button-box { + display: none !important; +} + +@media not -moz-pref('zen.urlbar.show-contextual-id') { + #userContext-icons { + display: none !important; + } +} diff --git a/src/zen/common/styles/zen-popup.css b/src/zen/common/styles/zen-popup.css index 5eceee4eb..31058262f 100644 --- a/src/zen/common/styles/zen-popup.css +++ b/src/zen/common/styles/zen-popup.css @@ -31,7 +31,6 @@ --uc-autocomplete-panel-separator-margin-vertical: 4px; --uc-permission-itemcontainer-padding-block: 8px; - --uc-permission-item-margin-block: 4px; --uc-permission-item-padding-inline: 16px; --zen-panel-separator-width: 1px; } @@ -228,12 +227,8 @@ panel { .permission-popup-permission-item, #permission-popup-storage-access-permission-list-header { - margin-block: var(--uc-permission-item-margin-block); -} - -.permission-popup-permission-label, -.permission-popup-permission-header-label { - margin-inline-start: var(--uc-arrowpanel-menuicon-margin-inline); + padding-block: 4px; + margin-block: 0px; } #editBookmarkPanel > #editBookmarkHeaderSeparator, @@ -241,12 +236,6 @@ panel { margin-inline: 0; } -#identity-popup-mainView > toolbarseparator:first-child, -#unified-extensions-view > toolbarseparator:first-child { - display: none; - opacity: 0; -} - menupopup, panel { box-shadow: none; diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 9e6ccd661..9e893f546 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -190,6 +190,21 @@ body > #confetti { } } +.zen-interactive-button { + background: color-mix(in srgb, currentColor 6%, transparent) !important; + transition: + background-color 0.12s ease-in-out, + transform 0.12s ease-in-out; + + &:hover { + background-color: color-mix(in srgb, currentColor 10%, transparent) !important; + } + + &:active:hover { + transform: scale(0.95); + } +} + /** Update animation */ #zen-update-animation { @@ -262,3 +277,264 @@ body > #confetti { #customization-container { --toolbar-bgcolor: var(--zen-dialog-background); } + +/* Site Data popup */ + +#zen-unified-site-data-panel { + --panel-padding: 0px; + --panel-width: 228px; + --menu-panel-width-wide: calc(var(--panel-width) - var(--panel-padding) * 2); + --uei-icon-size: 14px; + --arrowpanel-menuitem-border-radius: 10px; +} + +#unified-extensions-messages-container { + display: none; +} + +#zen-site-data-addons { + display: flex; + flex-wrap: wrap; + gap: 8px; + overflow: visible; + + .unified-extensions-item-name, + .unified-extensions-item-message, + .unified-extensions-item-message-hover, + .unified-extensions-item-message-hover-menu-button, + .unified-extensions-item-menu-button { + display: none; + } + + #overflowed-extensions-list, + #unified-extensions-area, + .unified-extensions-list, + #zen-site-data-new-addon-button-container { + display: contents; + + &:empty { + display: none; + } + + & > * { + background-color: color-mix(in srgb, currentcolor 6%, transparent); + width: 46px; + height: 34px; + margin: 0; + justify-content: center; + align-items: center; + border-radius: 6px; + transition: + background-color 0.1s ease-in-out, + transform 0.12s ease-in-out; + + & toolbarbutton { + background: transparent !important; + } + + & .toolbarbutton-badge-stack { + margin: 0; + } + + &:hover { + transform: scale(1.05); + } + + &:active:hover { + transform: scale(0.95); + background-color: color-mix(in srgb, currentcolor 10%, transparent); + } + } + } +} + +.zen-site-data-section { + gap: 6px; + padding: 8px; +} + +.zen-site-data-section-header { + font-weight: 500; + font-size: small; + + & label { + margin: 0; + } + + & > label:nth-child(2) { + font-weight: 400; + font-size: smaller; + transition: opacity 0.15s ease-in-out; + opacity: 0; + padding: 0px 4px; + + .zen-site-data-section:hover & { + opacity: 0.8; + } + } +} + +#zen-site-data-new-addon-button .toolbarbutton-text { + display: none; +} + +.permission-popup-permission-item { + gap: 8px; + overflow: hidden; + align-items: center; +} + +.permission-popup-permission-label { + margin: 0px; + font-weight: 500; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.permission-popup-permission-icon { + fill: var(--button-primary-color); + padding: 8px; + width: 34px; + height: 34px; + overflow: visible; + position: relative; + appearance: none; + + & label { + display: none; + } + + & image { + -moz-context-properties: fill; + z-index: 1; + } + + &::before { + content: ''; + position: absolute; + inset: 1px; + border-radius: 99px; + width: 32px; + height: 32px; + background: var(--button-primary-bgcolor); + opacity: 0.6; + transition: + transform 0.12s ease-in-out, + opacity 0.12s ease-in-out; + } + + .permission-popup-permission-item:hover &::before { + transform: scale(1.05); + } + + .permission-popup-permission-item:active:hover &::before { + transform: scale(0.95); + } + + .permission-popup-permission-item[state='allow'] &::before { + opacity: 1; + } +} + +.zen-permission-popup-permission-state-label { + opacity: 0.8; + font-size: smaller; + font-weight: 400; + margin: 0; +} + +#identity-box { + opacity: 0.6; +} + +#zen-site-data-footer { + border-top: 1px solid color-mix(in srgb, currentColor 6%, transparent); + padding-top: 8px; + margin: 2px 8px 8px 8px; + + & toolbarbutton { + margin: 0; + } +} + +#unified-extensions-button:not([showing]) { + display: none !important; +} + +#zen-site-data-header { + gap: 6px; + align-items: center; + padding: 8px; + padding-bottom: 0; + + & toolbarbutton { + margin: 0; + appearance: none; + -moz-context-properties: fill; + fill: currentColor; + color: light-dark(rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0.8)); + padding: 8px 0px; + position: relative; + + &[disabled] { + opacity: 0.5; + pointer-events: none; + } + + & .toolbarbutton-text { + display: none; + } + + & image { + width: 18px; + pointer-events: none; + z-index: 1; + } + + &::before { + content: ''; + position: absolute; + inset: 1px; + background: linear-gradient( + to bottom, + color-mix( + in srgb, + light-dark(rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.3)) 15%, + transparent 100% + ), + color-mix( + in srgb, + light-dark(rgba(255, 255, 255, 0.8), rgba(0, 0, 0, 0.8)) 100%, + transparent 100% + ) + ); + transition: transform 0.12s ease-in-out; + box-shadow: 0px 2px 3px 1px rgba(0, 0, 0, 0.1); + border-radius: 6px; + --base-border-color: light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.1)); + border: 1px solid; + border-top-color: light-dark(var(--base-border-color), rgba(255, 255, 255, 0.12)); + border-left-color: light-dark(var(--base-border-color), transparent); + border-right-color: light-dark(var(--base-border-color), transparent); + border-bottom-color: light-dark(var(--base-border-color), rgba(0, 0, 0, 0.12)); + will-change: transform; + } + + &.active { + color: var(--button-primary-color); + + &::before { + background: var(--button-primary-bgcolor); + } + } + + &:hover::before { + transform: scale(1.03); + } + + &:active:hover::before { + transform: scale(0.97); + } + } +} diff --git a/src/zen/common/zen-sets.js b/src/zen/common/zen-sets.js index 5d8316589..4609d2e76 100644 --- a/src/zen/common/zen-sets.js +++ b/src/zen/common/zen-sets.js @@ -17,17 +17,8 @@ document.addEventListener( case 'cmd_zenCompactModeShowSidebar': gZenCompactModeManager.toggleSidebar(); break; - case 'cmd_zenCompactModeHideSidebar': - gZenCompactModeManager.hideSidebar(); - break; - case 'cmd_zenCompactModeHideToolbar': - gZenCompactModeManager.hideToolbar(); - break; - case 'cmd_zenCompactModeHideBoth': - gZenCompactModeManager.hideBoth(); - break; - case 'cmd_zenCompactModeShowToolbar': - gZenCompactModeManager.toggleToolbar(); + case 'cmd_toggleCompactModeIgnoreHover': + gZenCompactModeManager.toggle(true); break; case 'cmd_zenWorkspaceForward': gZenWorkspaces.changeWorkspaceShortcut(); diff --git a/src/zen/compact-mode/ZenCompactMode.mjs b/src/zen/compact-mode/ZenCompactMode.mjs index 0606498ff..619e5e051 100644 --- a/src/zen/compact-mode/ZenCompactMode.mjs +++ b/src/zen/compact-mode/ZenCompactMode.mjs @@ -115,6 +115,7 @@ var gZenCompactModeManager = { // We wont do anything with it anyway, so we remove it delete this._wasInCompactMode; } + delete this._ignoreNextHover; // We dont want the user to be able to spam the button return; } @@ -173,47 +174,12 @@ var gZenCompactModeManager = { addContextMenu() { const fragment = window.MozXULElement.parseXULToFragment(` - - - - - - - - - + `); document.getElementById('viewToolbarsMenuSeparator').before(fragment); this.updateContextMenu(); }, - updateCompactModeContext(isSingleToolbar) { - const menuitem = document.getElementById('zen-context-menu-compact-mode-toggle'); - const menu = document.getElementById('zen-context-menu-compact-mode'); - if (isSingleToolbar) { - menu.setAttribute('hidden', 'true'); - menu.before(menuitem); - } else { - menu.removeAttribute('hidden'); - menu.querySelector('menupopup').prepend(menuitem); - } - }, - - hideSidebar() { - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false); - }, - - hideToolbar() { - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', false); - }, - - hideBoth() { - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); - }, - addEventListener(callback) { this._evenListeners.push(callback); }, @@ -281,13 +247,6 @@ var gZenCompactModeManager = { return sidebarWidth; }, - get canHideSidebar() { - return ( - Services.prefs.getBoolPref('zen.view.compact.hide-tabbar') || - gZenVerticalTabsManager._hasSetSingleToolbar - ); - }, - animateCompactMode() { // Get the splitter width before hiding it (we need to hide it before animating on right) document.documentElement.setAttribute('zen-compact-animating', 'true'); @@ -297,7 +256,6 @@ var gZenCompactModeManager = { .getElementById('zen-sidebar-splitter') .getBoundingClientRect().width; const isCompactMode = this.preference; - const canHideSidebar = this.canHideSidebar; let canAnimate = lazyCompactMode.COMPACT_MODE_CAN_ANIMATE_SIDEBAR && !this.isSidebarPotentiallyOpen(); if (typeof this._wasInCompactMode !== 'undefined') { @@ -308,6 +266,9 @@ var gZenCompactModeManager = { if (canAnimate) { this.sidebar.setAttribute('animate', 'true'); } + if (this._ignoreNextHover) { + this.sidebar.removeAttribute('zen-has-hover'); + } this.sidebar.style.removeProperty('margin-right'); this.sidebar.style.removeProperty('margin-left'); this.sidebar.style.removeProperty('transform'); @@ -325,7 +286,7 @@ var gZenCompactModeManager = { resolve(); return; } - if (canHideSidebar && isCompactMode) { + if (isCompactMode) { if (document.documentElement.hasAttribute('zen-sidebar-expanded')) { sidebarWidth -= 0.5 * splitterWidth; if (elementSeparation < splitterWidth) { @@ -335,20 +296,19 @@ var gZenCompactModeManager = { } else { sidebarWidth -= elementSeparation; } - this.sidebar.style.marginRight = '0px'; - this.sidebar.style.marginLeft = '0px'; + this.sidebar.removeAttribute('zen-has-hover'); gZenUIManager.motion .animate( this.sidebar, { - marginRight: this.sidebarIsOnRight ? `-${sidebarWidth}px` : 0, - marginLeft: this.sidebarIsOnRight ? 0 : `-${sidebarWidth}px`, + marginRight: [0, this.sidebarIsOnRight ? `-${sidebarWidth}px` : 0], + marginLeft: [0, this.sidebarIsOnRight ? 0 : `-${sidebarWidth}px`], }, { ease: 'easeIn', type: 'spring', bounce: 0, - duration: 0.15, + duration: 0.12, } ) .then(() => { @@ -365,6 +325,12 @@ var gZenCompactModeManager = { this._ignoreNextResize = true; setTimeout(() => { + if (this._ignoreNextHover) { + setTimeout(() => { + delete this._ignoreNextHover; + }); + } + this.sidebar.style.removeProperty('margin-right'); this.sidebar.style.removeProperty('margin-left'); this.sidebar.style.removeProperty('transition'); @@ -375,11 +341,12 @@ var gZenCompactModeManager = { titlebar.style.removeProperty('transition'); gURLBar.textbox.style.removeProperty('visibility'); + resolve(); }); }); }); - } else if (canHideSidebar && !isCompactMode) { + } else { document.getElementById('browser').style.overflow = 'clip'; if (this.sidebarIsOnRight) { this.sidebar.style.marginRight = `-${sidebarWidth}px`; @@ -399,7 +366,7 @@ var gZenCompactModeManager = { ease: 'easeOut', type: 'spring', bounce: 0, - duration: 0.15, + duration: 0.12, } ) .then(() => { @@ -415,9 +382,6 @@ var gZenCompactModeManager = { resolve(); }); }); - } else { - this.sidebar.removeAttribute('animate'); // remove the attribute if we are not animating - document.documentElement.removeAttribute('zen-compact-animating'); } }); }); @@ -427,15 +391,6 @@ var gZenCompactModeManager = { document .getElementById('zen-context-menu-compact-mode-toggle') .setAttribute('checked', this.preference); - - const hideTabBar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar', false); - const hideToolbar = Services.prefs.getBoolPref('zen.view.compact.hide-toolbar', false); - const hideBoth = hideTabBar && hideToolbar; - - const idName = 'zen-context-menu-compact-mode-hide-'; - document.getElementById(idName + 'sidebar').setAttribute('checked', !hideBoth && hideTabBar); - document.getElementById(idName + 'toolbar').setAttribute('checked', !hideBoth && hideToolbar); - document.getElementById(idName + 'both').setAttribute('checked', hideBoth); }, _removeOpenStateOnUnifiedExtensions() { @@ -448,7 +403,9 @@ var gZenCompactModeManager = { } }, - toggle() { + toggle(ignoreHover = false) { + // Only ignore the next hover when we are enabling compact mode + this._ignoreNextHover = ignoreHover && !this.preference; return (this.preference = !this.preference); }, @@ -551,7 +508,8 @@ var gZenCompactModeManager = { window.requestAnimationFrame(() => { if ( document.documentElement.getAttribute('supress-primary-adjustment') === 'true' || - this._hasHoveredUrlbar + this._hasHoveredUrlbar || + this._ignoreNextHover ) { return; } @@ -596,7 +554,8 @@ var gZenCompactModeManager = { event.explicitOriginalTarget.closest('#urlbar[zen-floating-urlbar]') || (document.documentElement.getAttribute('supress-primary-adjustment') === 'true' && gZenVerticalTabsManager._hasSetSingleToolbar) || - this._hasHoveredUrlbar + this._hasHoveredUrlbar || + this._ignoreNextHover ) { return; } @@ -682,11 +641,6 @@ var gZenCompactModeManager = { else return bBox.left - error < x && x < bBox.right + error; }, - toggleToolbar() { - let toolbar = document.getElementById('zen-appcontent-navbar-wrapper'); - toolbar.toggleAttribute('zen-user-show'); - }, - _clearAllHoverStates() { // Clear hover attributes from all hoverable elements for (let entry of this.hoverableElements) { @@ -699,6 +653,9 @@ var gZenCompactModeManager = { }, isSidebarPotentiallyOpen() { + if (this._ignoreNextHover) { + this.sidebar.removeAttribute('zen-has-hover'); + } return ( this.sidebar.hasAttribute('zen-user-show') || this.sidebar.hasAttribute('zen-has-hover') || @@ -713,8 +670,7 @@ var gZenCompactModeManager = { !this.isSidebarPotentiallyOpen() && this._canShowBackgroundTabToast && !gZenGlanceManager._animating && - !this._nextTimeWillBeActive && - this.canHideSidebar + !this._nextTimeWillBeActive ) { gZenUIManager.showToast('zen-background-tab-opened-toast', { button: { diff --git a/src/zen/compact-mode/zen-compact-mode.css b/src/zen/compact-mode/zen-compact-mode.css index af798fa33..0a2dda72a 100644 --- a/src/zen/compact-mode/zen-compact-mode.css +++ b/src/zen/compact-mode/zen-compact-mode.css @@ -20,7 +20,7 @@ &::before, &::after { - outline: 1px solid rgba(255, 255, 255, .15); + outline: 1px solid rgba(255, 255, 255, 0.15); outline-offset: -1px; background-attachment: fixed !important; background-size: 100vw 100vh !important; @@ -29,7 +29,9 @@ &, &::before, &::after { - border-radius: calc(var(--zen-native-inner-radius) - var(--zen-compact-mode-no-padding-radius-fix, 0px)); + border-radius: calc( + var(--zen-native-inner-radius) - var(--zen-compact-mode-no-padding-radius-fix, 0px) + ); } } @@ -40,366 +42,272 @@ visibility: visible; } - @media -moz-pref('zen.view.compact.hide-tabbar') or -moz-pref('zen.view.use-single-toolbar') { - &:not([zen-compact-animating]) { - & #zen-sidebar-splitter { - display: none !important; + &:not([zen-compact-animating]) { + & #zen-sidebar-splitter { + display: none !important; + } + + #zen-tabbox-wrapper { + /* Remove extra 1px of margine we have to add to the tabbox */ + margin-left: var(--zen-element-separation) !important; + margin-right: var(--zen-element-separation) !important; + } + + #zen-appcontent-wrapper { + & #tabbrowser-tabbox { + margin-left: 0 !important; + } + } + + #zen-sidebar-splitter { + display: none !important; + } + + #zen-sidebar-top-buttons-customization-target { + padding-inline-start: calc( + var(--zen-toolbox-padding) - var(--toolbarbutton-outer-padding) + ) !important; + } + + &:not([zen-window-buttons-reversed='true']) #zen-appcontent-navbar-wrapper #nav-bar { + margin-left: var(--zen-element-separation) !important; + } + + &[zen-window-buttons-reversed='true'] #zen-appcontent-navbar-wrapper #nav-bar { + margin-right: var(--zen-element-separation) !important; + margin-left: calc(var(--zen-element-separation) - 3px) !important; + } + + #navigator-toolbox { + --zen-toolbox-max-width: 74px !important; + --zen-compact-float: var(--zen-element-separation); + :root[zen-no-padding='true'] & { + --zen-compact-float: 10px; + --zen-compact-mode-no-padding-radius-fix: 2px; } - #zen-tabbox-wrapper { - /* Remove extra 1px of margine we have to add to the tabbox */ - margin-left: var(--zen-element-separation) !important; - margin-right: var(--zen-element-separation) !important; - } + /* Initial padding for when we are animating */ + padding: 0 0 0 var(--zen-toolbox-padding) !important; - #zen-appcontent-wrapper { - & #tabbrowser-tabbox { - margin-left: 0 !important; + &:not([animate='true']) { + position: fixed; + z-index: 10; + transition: + left 0.15s ease, + right 0.15s ease, + visibility 0.15s ease; + bottom: var(--zen-compact-float); + padding: 0 var(--zen-compact-float) !important; + + :root[zen-single-toolbar='true'] & { + /* We add an extra offset since windows users have a border top + * in the window in order to compensate how windows renders the + * titlebar */ + top: calc(var(--zen-compact-float) / 2 + var(--zen-sidebar-compact-top-offset, 0px)); + height: calc(100% - var(--zen-compact-float)); + } + + :root:not([zen-single-toolbar='true']) & { + bottom: calc(var(--zen-compact-float) / 2); + height: calc(100% - var(--zen-toolbar-height)); + } + + & #zen-sidebar-top-buttons { + margin: 0 0 calc(var(--zen-toolbox-padding) / 2) 0; } } - #zen-sidebar-splitter { - display: none !important; + &:not([zen-right-side='true']) #nav-bar { + margin-left: 0 !important; + } + } + + &:not([zen-right-side='true']) #navigator-toolbox { + left: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px); + } + + &:not([zen-sidebar-expanded='true']) .zen-essentials-container { + padding: 0; + } + + &[zen-right-side='true'] { + & #navigator-toolbox:not([animate='true']) { + right: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px); } - #zen-sidebar-top-buttons-customization-target { - padding-inline-start: calc(var(--zen-toolbox-padding) - var(--toolbarbutton-outer-padding)) !important; + & .browserSidebarContainer { + margin-left: 0 !important; + margin-right: 0 !important; + } + } + + #navigator-toolbox:not([animate='true']) #titlebar { + padding: var(--zen-toolbox-padding) !important; + :root:not([zen-sidebar-expanded='true']) & { + padding: var(--zen-toolbox-padding) 0 !important; + max-width: calc(var(--zen-sidebar-width) - var(--zen-toolbox-padding) * 2); + width: var(--zen-sidebar-width); + } + position: relative; + min-width: var(--zen-toolbox-min-width); + transition: visibility 0.15s; /* Same as the toolbox */ + visibility: hidden; + + :root[zen-sidebar-expanded='true'] & { + width: calc(var(--zen-sidebar-width) + var(--zen-toolbox-padding)); } - &:not([zen-window-buttons-reversed='true']) #zen-appcontent-navbar-wrapper #nav-bar { - margin-left: var(--zen-element-separation) !important; + & .zen-toolbar-background { + display: flex; } + } - &[zen-window-buttons-reversed='true'] #zen-appcontent-navbar-wrapper #nav-bar { - margin-right: var(--zen-element-separation) !important; - margin-left: calc(var(--zen-element-separation) - 3px) !important; - } + #navigator-toolbox[zen-has-hover]:not(:has(#urlbar[zen-floating-urlbar='true']:hover)), + #navigator-toolbox[zen-user-show], + #navigator-toolbox[zen-has-empty-tab], + #navigator-toolbox[flash-popup], + #navigator-toolbox[has-popup-menu], + #navigator-toolbox[movingtab], + &[zen-renaming-tab='true'] #navigator-toolbox, + #navigator-toolbox[zen-compact-mode-active] { + &:not([animate='true']) { + --zen-compact-mode-func: linear( + 0 0%, + 0.002748 1%, + 0.010544 2%, + 0.022757 3%, + 0.038804 4%, + 0.058151 5%, + 0.080308 6%, + 0.104828 7.000000000000001%, + 0.131301 8%, + 0.159358 9%, + 0.188662 10%, + 0.21891 11%, + 0.249828 12%, + 0.281172 13%, + 0.312724 14.000000000000002%, + 0.344288 15%, + 0.375693 16%, + 0.40679 17%, + 0.437447 18%, + 0.467549 19%, + 0.497 20%, + 0.525718 21%, + 0.553633 22%, + 0.580688 23%, + 0.60684 24%, + 0.632052 25%, + 0.656298 26%, + 0.679562 27%, + 0.701831 28.000000000000004%, + 0.723104 28.999999999999996%, + 0.743381 30%, + 0.76267 31%, + 0.780983 32%, + 0.798335 33%, + 0.814744 34%, + 0.830233 35%, + 0.844826 36%, + 0.858549 37%, + 0.87143 38%, + 0.883498 39%, + 0.894782 40%, + 0.905314 41%, + 0.915125 42%, + 0.924247 43%, + 0.93271 44%, + 0.940547 45%, + 0.947787 46%, + 0.954463 47%, + 0.960603 48%, + 0.966239 49%, + 0.971397 50%, + 0.976106 51%, + 0.980394 52%, + 0.984286 53%, + 0.987808 54%, + 0.990984 55.00000000000001%, + 0.993837 56.00000000000001%, + 0.99639 56.99999999999999%, + 0.998664 57.99999999999999%, + 1.000679 59%, + 1.002456 60%, + 1.004011 61%, + 1.005363 62%, + 1.006528 63%, + 1.007522 64%, + 1.008359 65%, + 1.009054 66%, + 1.009618 67%, + 1.010065 68%, + 1.010405 69%, + 1.010649 70%, + 1.010808 71%, + 1.01089 72%, + 1.010904 73%, + 1.010857 74%, + 1.010757 75%, + 1.010611 76%, + 1.010425 77%, + 1.010205 78%, + 1.009955 79%, + 1.009681 80%, + 1.009387 81%, + 1.009077 82%, + 1.008754 83%, + 1.008422 84%, + 1.008083 85%, + 1.00774 86%, + 1.007396 87%, + 1.007052 88%, + 1.00671 89%, + 1.006372 90%, + 1.00604 91%, + 1.005713 92%, + 1.005394 93%, + 1.005083 94%, + 1.004782 95%, + 1.004489 96%, + 1.004207 97%, + 1.003935 98%, + 1.003674 99%, + 1.003423 100% + ); + --zen-compact-mode-time: 0.25s; + transition: + left var(--zen-compact-mode-time) var(--zen-compact-mode-func), + right var(--zen-compact-mode-time) var(--zen-compact-mode-func); - #navigator-toolbox { - --zen-toolbox-max-width: 74px !important; - --zen-compact-float: var(--zen-element-separation); - :root[zen-no-padding='true'] & { - --zen-compact-float: 10px; - --zen-compact-mode-no-padding-radius-fix: 2px; - } - - /* Initial padding for when we are animating */ - padding: 0 0 0 var(--zen-toolbox-padding) !important; - - &:not([animate='true']) { - position: fixed; - z-index: 10; - transition: - left 0.15s ease, - right 0.15s ease, - visibility 0.15s ease; - top: 0; - bottom: var(--zen-compact-float); - padding: 0 var(--zen-compact-float) !important; - :root[zen-single-toolbar='true'] & { - /* We add an extra offset since windows users have a border top - * in the window in order to compensate how windows renders the - * titlebar */ - top: calc(var(--zen-compact-float) / 2 + var(--zen-sidebar-compact-top-offset, 0px)); - height: calc(100% - var(--zen-compact-float)); + :root:not([supress-primary-adjustment='true']) & { + & #titlebar { + transition: none; + visibility: visible; } - :root:not([zen-single-toolbar='true']) & { - top: calc(var(--zen-compact-float) / -2); - height: calc(100% - var(--zen-toolbar-height)); - @media -moz-pref('zen.view.compact.hide-toolbar') { - height: 100%; - } - } - & #zen-sidebar-top-buttons { - margin: 0 0 calc(var(--zen-toolbox-padding) / 2) 0; - } - } - &:not([zen-right-side='true']) #nav-bar { - margin-left: 0 !important; - } - } - - &:not([zen-right-side='true']) #navigator-toolbox { - left: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px); - } - - /* When we have multiple toolbars and the top-toolbar is NOT being hidden, - * we need to adjust the top-padding of the toolbox to account for the - * extra toolbar height. */ - @media not -moz-pref('zen.view.compact.hide-toolbar') { - &:not([zen-single-toolbar='true']) { - #navigator-toolbox:not([animate='true']) { - margin-top: var(--zen-toolbar-height) !important; - } - } - } - - &:not([zen-sidebar-expanded='true']) .zen-essentials-container { - padding: 0; - } - - &[zen-right-side='true'] { - & #navigator-toolbox:not([animate='true']) { - right: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px); - } - - & .browserSidebarContainer { - margin-left: 0 !important; - margin-right: 0 !important; - } - } - - #navigator-toolbox:not([animate='true']) #titlebar { - padding: var(--zen-toolbox-padding) !important; - :root:not([zen-sidebar-expanded='true']) & { - padding: var(--zen-toolbox-padding) 0 !important; - max-width: calc(var(--zen-sidebar-width) - var(--zen-toolbox-padding) * 2); - width: var(--zen-sidebar-width); - } - position: relative; - min-width: var(--zen-toolbox-min-width); - transition: visibility 0.15s; /* Same as the toolbox */ - visibility: hidden; - - :root[zen-sidebar-expanded='true'] & { - width: calc(var(--zen-sidebar-width) + var(--zen-toolbox-padding)); - } - - & .zen-toolbar-background { - display: flex; - } - } - - #navigator-toolbox[zen-has-hover]:not(:has(#urlbar[zen-floating-urlbar='true']:hover)), - #navigator-toolbox[zen-user-show], - #navigator-toolbox[zen-has-empty-tab], - #navigator-toolbox[flash-popup], - #navigator-toolbox[has-popup-menu], - #navigator-toolbox[movingtab], - &[zen-renaming-tab='true'] #navigator-toolbox, - #navigator-toolbox[zen-compact-mode-active] { - &:not([animate='true']) { - --zen-compact-mode-func: linear( - 0 0%, - 0.002748 1%, - 0.010544 2%, - 0.022757 3%, - 0.038804 4%, - 0.058151 5%, - 0.080308 6%, - 0.104828 7.000000000000001%, - 0.131301 8%, - 0.159358 9%, - 0.188662 10%, - 0.21891 11%, - 0.249828 12%, - 0.281172 13%, - 0.312724 14.000000000000002%, - 0.344288 15%, - 0.375693 16%, - 0.40679 17%, - 0.437447 18%, - 0.467549 19%, - 0.497 20%, - 0.525718 21%, - 0.553633 22%, - 0.580688 23%, - 0.60684 24%, - 0.632052 25%, - 0.656298 26%, - 0.679562 27%, - 0.701831 28.000000000000004%, - 0.723104 28.999999999999996%, - 0.743381 30%, - 0.76267 31%, - 0.780983 32%, - 0.798335 33%, - 0.814744 34%, - 0.830233 35%, - 0.844826 36%, - 0.858549 37%, - 0.87143 38%, - 0.883498 39%, - 0.894782 40%, - 0.905314 41%, - 0.915125 42%, - 0.924247 43%, - 0.93271 44%, - 0.940547 45%, - 0.947787 46%, - 0.954463 47%, - 0.960603 48%, - 0.966239 49%, - 0.971397 50%, - 0.976106 51%, - 0.980394 52%, - 0.984286 53%, - 0.987808 54%, - 0.990984 55.00000000000001%, - 0.993837 56.00000000000001%, - 0.99639 56.99999999999999%, - 0.998664 57.99999999999999%, - 1.000679 59%, - 1.002456 60%, - 1.004011 61%, - 1.005363 62%, - 1.006528 63%, - 1.007522 64%, - 1.008359 65%, - 1.009054 66%, - 1.009618 67%, - 1.010065 68%, - 1.010405 69%, - 1.010649 70%, - 1.010808 71%, - 1.01089 72%, - 1.010904 73%, - 1.010857 74%, - 1.010757 75%, - 1.010611 76%, - 1.010425 77%, - 1.010205 78%, - 1.009955 79%, - 1.009681 80%, - 1.009387 81%, - 1.009077 82%, - 1.008754 83%, - 1.008422 84%, - 1.008083 85%, - 1.00774 86%, - 1.007396 87%, - 1.007052 88%, - 1.00671 89%, - 1.006372 90%, - 1.00604 91%, - 1.005713 92%, - 1.005394 93%, - 1.005083 94%, - 1.004782 95%, - 1.004489 96%, - 1.004207 97%, - 1.003935 98%, - 1.003674 99%, - 1.003423 100% - ); - --zen-compact-mode-time: 0.25s; - transition: - left var(--zen-compact-mode-time) var(--zen-compact-mode-func), - right var(--zen-compact-mode-time) var(--zen-compact-mode-func); - - :root:not([supress-primary-adjustment='true']) & { - & #titlebar { - transition: none; - visibility: visible; - } - - left: calc(var(--zen-compact-float) / -2); - :root[zen-right-side='true'] & { - right: calc(var(--zen-compact-float) / -2); - left: auto; - } + left: calc(var(--zen-compact-float) / -2); + :root[zen-right-side='true'] & { + right: calc(var(--zen-compact-float) / -2); + left: auto; } } } } } - @media -moz-pref('zen.view.compact.hide-toolbar') { - &:not([zen-single-toolbar='true']) { - & #navigator-toolbox { - top: 0; - } - - & #navigator-toolbox { - --zen-toolbox-top-align: var(--zen-element-separation); - } - - & #titlebar, - & #zen-appcontent-wrapper { - margin-top: var(--zen-element-separation) !important; - } - - & #zen-appcontent-wrapper { - z-index: 3 !important; - } - - & #zen-appcontent-navbar-wrapper { - & .zen-toolbar-background { - display: flex; - } - --zen-compact-toolbar-offset: 5px; - position: absolute; - top: calc(-1 * var(--zen-toolbar-height) + 1px); - left: 0; - z-index: 20; - transition: all 0.15s ease; - width: 100%; - - max-height: var(--zen-toolbar-height); - overflow: hidden; - - & #urlbar:not([breakout-extend='true']) { - opacity: 0 !important; - } - - & #zen-appcontent-navbar-container { - visibility: hidden; - - box-shadow: var(--zen-big-shadow); - border-bottom-left-radius: var(--zen-border-radius); - border-bottom-right-radius: var(--zen-border-radius); - :root:not([sizemode='maximized']) & { - border-top-left-radius: env(-moz-gtk-csd-titlebar-radius); - border-top-right-radius: env(-moz-gtk-csd-titlebar-radius); - } - transition: all 0.15s ease; - width: 100%; - } - } - - & #zen-appcontent-navbar-wrapper[zen-has-hover]:not(:has(#urlbar[zen-floating-urlbar='true']:hover)), - & #zen-appcontent-navbar-wrapper[zen-user-show], - & #zen-appcontent-navbar-wrapper[has-popup-menu], - & #zen-appcontent-navbar-wrapper:has( - *:is([panelopen='true'], [open='true'], #urlbar:focus-within, [breakout-extend='true']):not(#urlbar[zen-floating-urlbar='true']):not(.zen-compact-mode-ignore) - ) { - & #zen-appcontent-navbar-container { - visibility: visible !important; - } - border-top-width: 0px; - - top: -1px; - overflow: initial; - max-height: unset; - - & #urlbar { - opacity: 1 !important; - } - - & #urlbar[breakout-extend='true']:not([zen-floating-urlbar='true']) { - top: 2px !important; - opacity: 1; - } - } + &:not([zen-single-toolbar='true']) #zen-sidebar-top-buttons { + max-width: fit-content; + :root[zen-right-side='true'] & { + order: 999; } } } /* Fix for https://github.com/zen-browser/desktop/issues/7615 */ :root[zen-compact-mode='true']:not([customizing])[inDOMFullscreen='true'] { - @media -moz-pref('zen.view.compact.hide-tabbar') or -moz-pref('zen.view.use-single-toolbar') { - &:not([zen-compact-animating]) { - #navigator-toolbox { - opacity: 0; - } - } - } - @media -moz-pref('zen.view.compact.hide-toolbar') { - &:not([zen-single-toolbar='true']) { - & #zen-appcontent-navbar-wrapper { - opacity: 0; - } + &:not([zen-compact-animating]) { + #navigator-toolbox { + opacity: 0; } } } diff --git a/src/zen/kbs/ZenKeyboardShortcuts.mjs b/src/zen/kbs/ZenKeyboardShortcuts.mjs index dcb61e09c..ad7a7c5f4 100644 --- a/src/zen/kbs/ZenKeyboardShortcuts.mjs +++ b/src/zen/kbs/ZenKeyboardShortcuts.mjs @@ -302,7 +302,6 @@ class KeyShortcut { #disabled = false; #reserved = false; #internal = false; - #shouldBeEmpty = false; constructor( id, @@ -404,16 +403,11 @@ class KeyShortcut { } set shouldBeEmpty(value) { - this.#shouldBeEmpty = value; if (value) { this.clearKeybind(); } } - get shouldBeEmpty() { - return this.#shouldBeEmpty; - } - toXHTMLElement(window) { let key = window.document.createXULElement('key'); return this.replaceWithChild(key); @@ -691,17 +685,6 @@ class nsZenKeyboardShortcutsLoader { 'zen-compact-mode-shortcut-show-sidebar' ) ); - newShortcutList.push( - new KeyShortcut( - 'zen-compact-mode-show-toolbar', - 'T', - '', - ZEN_COMPACT_MODE_SHORTCUTS_GROUP, - nsKeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'cmd_zenCompactModeShowToolbar', - 'zen-compact-mode-shortcut-show-toolbar' - ) - ); // Workspace shortcuts for (let i = 10; i > 0; i--) { @@ -816,7 +799,7 @@ class nsZenKeyboardShortcutsLoader { } class nsZenKeyboardShortcutsVersioner { - static LATEST_KBS_VERSION = 11; + static LATEST_KBS_VERSION = 12; constructor() {} @@ -865,7 +848,7 @@ class nsZenKeyboardShortcutsVersioner { return newData; } - console.error('Unknown keyboar shortcuts version'); + console.error('Unknown keyboard shortcuts version'); this.version = 0; return this.migrateIfNeeded(data); } @@ -884,17 +867,6 @@ class nsZenKeyboardShortcutsVersioner { // Apply migrations and ensure defaults exist let out = this.fillDefaultIfNotPresent(this.migrateIfNeeded(data)); - // Hard-remove deprecated or conflicting defaults regardless of version - // - Remove the built-in "Open File" keybinding; menu item remains available - // - Remove default "Bookmark All Tabs" keybinding (Ctrl+Shift+D) to avoid conflict - // - Remove "Stop" keybinding to avoid conflict with Firefox's built-in binding - const shouldBeEmptyShortcuts = ['openFileKb', 'bookmarkAllTabsKb', 'key_stop']; - for (let shortcut of out) { - if (shouldBeEmptyShortcuts.includes(shortcut.getID?.())) { - shortcut.shouldBeEmpty = true; - } - } - return out; } @@ -1024,7 +996,6 @@ class nsZenKeyboardShortcutsVersioner { const commandMap = { 'zen-compact-mode-toggle': 'cmd_zenCompactModeToggle', 'zen-compact-mode-show-sidebar': 'cmd_zenCompactModeShowSidebar', - 'zen-compact-mode-show-toolbar': 'cmd_zenCompactModeShowToolbar', 'zen-workspace-forward': 'cmd_zenWorkspaceForward', 'zen-workspace-backward': 'cmd_zenWorkspaceBackward', 'zen-split-view-grid': 'cmd_zenSplitViewGrid', @@ -1093,6 +1064,23 @@ class nsZenKeyboardShortcutsVersioner { ) ); } + + if (version < 12) { + // Hard-remove deprecated or conflicting defaults regardless of version + // - Remove the built-in "Open File" keybinding; menu item remains available + // - Remove default "Bookmark All Tabs" keybinding (Ctrl+Shift+D) to avoid conflict + // - Remove "Stop" keybinding to avoid conflict with Firefox's built-in binding + const shouldBeEmptyShortcuts = ['openFileKb', 'bookmarkAllTabsKb', 'key_stop']; + for (let shortcut of data) { + if (shouldBeEmptyShortcuts.includes(shortcut.getID?.())) { + shortcut.shouldBeEmpty = true; + } + } + + // Also remove zen-compact-mode-show-toolbar + data = data.filter((shortcut) => shortcut.getID() != 'zen-compact-mode-show-toolbar'); + } + return data; } } diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index 0012ebfd6..c75b7896d 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -60,12 +60,6 @@ &:root[zen-right-side='true'] #zen-sidebar-top-buttons .titlebar-buttonbox-container { margin-right: calc(-1 * var(--zen-toolbox-padding)); - margin-top: -10px; - height: calc(4px + var(--zen-toolbar-height)) !important; - - & .titlebar-button { - align-items: end; - } } } @@ -723,7 +717,6 @@ & #zen-sidebar-top-buttons-customization-target { flex-direction: column; - padding-top: var(--zen-element-separation); } & #zen-sidebar-foot-buttons { @@ -972,15 +965,13 @@ :root[zen-sidebar-expanded='true'] & { --toolbarbutton-inner-padding: var(--zen-toolbar-button-inner-padding) !important; } + :root[zen-single-toolbar='true'] & { --toolbarbutton-inner-padding: calc(var(--zen-toolbar-button-inner-padding) - 2px) !important; & #PanelUI-button { order: -2; } - & #unified-extensions-button { - order: -1; - } } & #zen-sidebar-top-buttons-customization-target { diff --git a/src/zen/urlbar/ZenSiteDataPanel.sys.mjs b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs new file mode 100644 index 000000000..aebbfc657 --- /dev/null +++ b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs @@ -0,0 +1,426 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +export class nsZenSiteDataPanel { + #iconMap = { + install: 'extension', + }; + + constructor(window) { + this.window = window; + this.document = window.document; + + this.panel = this.document.getElementById('zen-unified-site-data-panel'); + this.#init(); + } + + #init() { + // Add a new button to the urlbar popup + const button = this.window.MozXULElement.parseXULToFragment(` + + + + `); + this.anchor = button.querySelector('#zen-site-data-icon-button'); + this.document.getElementById('identity-icon-box').after(button); + this.window.gUnifiedExtensions._button = this.anchor; + + this.document + .getElementById('nav-bar') + .setAttribute('addon-webext-overflowbutton', 'zen-site-data-icon-button'); + + // Remove the old permissions dialog + this.document.getElementById('unified-extensions-panel-template').remove(); + + this.#initEventListeners(); + } + + #initEventListeners() { + this.panel.addEventListener('popupshowing', this); + this.document.getElementById('zen-site-data-manage-addons').addEventListener('click', this); + this.document.getElementById('zen-site-data-settings-more').addEventListener('click', this); + const kCommandIDs = [ + 'zen-site-data-header-share', + 'zen-site-data-header-bookmark', + 'zen-site-data-security-info', + 'zen-site-data-actions', + 'zen-site-data-new-addon-button', + ]; + + for (let id of kCommandIDs) { + this.document.getElementById(id).addEventListener('command', this); + } + + this.#initContextMenuEventListener(); + } + + #initContextMenuEventListener() { + const kCommands = { + context_zenClearSiteData: (event) => { + this.window.gIdentityHandler.clearSiteData(event); + }, + context_zenOpenGetAddons: () => { + this.#openGetAddons(); + }, + context_zenOpenSiteSettings: () => { + const { BrowserCommands } = this.window; + BrowserCommands.pageInfo(null, 'permTab'); + }, + }; + + for (let [id, handler] of Object.entries(kCommands)) { + this.document.getElementById(id).addEventListener('command', handler); + } + } + + #preparePanel() { + this.#setSitePermissions(); + this.#setSiteSecurityInfo(); + this.#setSiteHeader(); + } + + #setSiteHeader() { + { + const button = this.document.getElementById('zen-site-data-header-reader-mode'); + const urlbarButton = this.window.document.getElementById('reader-mode-button'); + const isActive = urlbarButton?.hasAttribute('readeractive'); + const isVisible = !urlbarButton?.hidden || isActive; + + button.disabled = !isVisible; + if (isActive) { + button.classList.add('active'); + } else { + button.classList.remove('active'); + } + this.document.l10n.setAttributes(button, urlbarButton?.getAttribute('data-l10n-id')); + } + { + const button = this.document.getElementById('zen-site-data-header-bookmark'); + const isPageBookmarked = this.window.BookmarkingUI.star?.hasAttribute('starred'); + + if (isPageBookmarked) { + button.classList.add('active'); + } else { + button.classList.remove('active'); + } + } + { + const button = this.document.getElementById('zen-site-data-header-share'); + if ( + this.window.gBrowser.currentURI.schemeIs('http') || + this.window.gBrowser.currentURI.schemeIs('https') + ) { + button.removeAttribute('disabled'); + } else { + button.setAttribute('disabled', 'true'); + } + } + } + + #setSiteSecurityInfo() { + const { gIdentityHandler } = this.window; + const button = this.document.getElementById('zen-site-data-security-info'); + + if (gIdentityHandler._isSecureInternalUI) { + button.parentNode.hidden = true; + return; + } + + let identity; + if (gIdentityHandler._pageExtensionPolicy) { + this.document.l10n.setAttributes(button, 'zen-site-data-security-info-extension'); + identity = 'extension'; + } else if (gIdentityHandler._uriHasHost && gIdentityHandler._isSecureConnection) { + this.document.l10n.setAttributes(button, 'zen-site-data-security-info-secure'); + identity = 'secure'; + } else { + this.document.l10n.setAttributes(button, 'zen-site-data-security-info-not-secure'); + identity = 'not-secure'; + } + + button.parentNode.hidden = false; + button.setAttribute('identity', identity); + } + + #setSitePermissions() { + const { gBrowser, SitePermissions } = this.window; + const list = this.document.getElementById('zen-site-data-settings-list'); + const section = list.closest('.zen-site-data-section'); + + // show permission icons + let permissions = SitePermissions.getAllPermissionDetailsForBrowser(gBrowser.selectedBrowser); + + // Don't display origin-keyed 3rdPartyStorage permissions that are covered by + // site-keyed 3rdPartyFrameStorage permissions. + let thirdPartyStorageSites = new Set( + permissions + .map(function (permission) { + let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER); + if (id == '3rdPartyFrameStorage') { + return key; + } + return null; + }) + .filter(function (key) { + return key != null; + }) + ); + permissions = permissions.filter(function (permission) { + let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER); + if (id != '3rdPartyStorage') { + return true; + } + try { + let origin = Services.io.newURI(key); + let site = Services.eTLD.getSite(origin); + return !thirdPartyStorageSites.has(site); + } catch { + return false; + } + }); + + this._sharingState = gBrowser.selectedTab._sharingState; + + if (this._sharingState?.geo) { + let geoPermission = permissions.find((perm) => perm.id === 'geo'); + if (!geoPermission) { + permissions.push({ + id: 'geo', + state: SitePermissions.ALLOW, + scope: SitePermissions.SCOPE_REQUEST, + sharingState: true, + }); + } + } + + if (this._sharingState?.xr) { + let xrPermission = permissions.find((perm) => perm.id === 'xr'); + if (!xrPermission) { + permissions.push({ + id: 'xr', + state: SitePermissions.ALLOW, + scope: SitePermissions.SCOPE_REQUEST, + sharingState: true, + }); + } + } + + if (this._sharingState?.webRTC) { + let webrtcState = this._sharingState.webRTC; + // If WebRTC device or screen are in use, we need to find + // the associated ALLOW permission item to set the sharingState field. + for (let id of ['camera', 'microphone', 'screen']) { + if (webrtcState[id]) { + let found = false; + for (let permission of permissions) { + let [permId] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER); + if (permId != id || permission.state != SitePermissions.ALLOW) { + continue; + } + found = true; + } + if (!found) { + // If the ALLOW permission item we were looking for doesn't exist, + // the user has temporarily allowed sharing and we need to add + // an item in the permissions array to reflect this. + permissions.push({ + id, + state: SitePermissions.ALLOW, + scope: SitePermissions.SCOPE_REQUEST, + sharingState: webrtcState[id], + }); + } + } + } + } + + list.innerHTML = ''; + for (let permission of permissions) { + let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER); + + if (id == 'storage-access') { + // Ignore storage access permissions here, they are made visible inside + // the Content Blocking UI. + continue; + } + + if (permission.state == SitePermissions.PROMPT) { + // We don't display "ask" permissions in the site data panel. + continue; + } + + let item = this.#createPermissionItem(id, key, permission); + if (item) { + list.appendChild(item); + } + } + + section.hidden = list.childElementCount == 0; + } + + #getPermissionStateLabelId(permission) { + const { SitePermissions } = this.window; + switch (permission.state) { + // There should only be these types being displayed in the panel. + case SitePermissions.ALLOW: + return 'zen-site-data-setting-allow'; + case SitePermissions.BLOCK: + case SitePermissions.AUTOPLAY_BLOCKED_ALL: + return 'zen-site-data-setting-block'; + default: + return null; + } + } + + #createPermissionItem(id, key, permission) { + const { SitePermissions } = this.window; + + // Create a permission item for the site data panel. + let container = this.document.createXULElement('hbox'); + const idNoSuffix = permission.id; + container.classList.add( + 'permission-popup-permission-item', + `permission-popup-permission-item-${idNoSuffix}` + ); + container.setAttribute('align', 'center'); + container.setAttribute('role', 'group'); + + container.setAttribute('state', permission.state == SitePermissions.ALLOW ? 'allow' : 'block'); + + let img = this.document.createXULElement('toolbarbutton'); + img.classList.add('permission-popup-permission-icon', 'zen-site-data-permission-icon'); + if (this.#iconMap[id]) { + img.classList.add(`zen-permission-${this.#iconMap[id]}-icon`); + } + + let labelContainer = this.document.createXULElement('vbox'); + labelContainer.setAttribute('flex', '1'); + labelContainer.setAttribute('align', 'start'); + labelContainer.classList.add('permission-popup-permission-label-container'); + labelContainer._permission = permission; + labelContainer.addEventListener('click', this); + + let nameLabel = this.document.createXULElement('label'); + nameLabel.setAttribute('flex', '1'); + nameLabel.setAttribute('class', 'permission-popup-permission-label'); + let label = SitePermissions.getPermissionLabel(permission.id); + if (label === null) { + return null; + } + nameLabel.textContent = label; + labelContainer.appendChild(nameLabel); + + let stateLabel = this.document.createXULElement('label'); + stateLabel.setAttribute('class', 'zen-permission-popup-permission-state-label'); + stateLabel.setAttribute('data-l10n-id', this.#getPermissionStateLabelId(permission)); + labelContainer.appendChild(stateLabel); + + container.appendChild(img); + container.appendChild(labelContainer); + + return container; + } + + #openGetAddons() { + const { switchToTabHavingURI } = this.window; + let amoUrl = Services.urlFormatter.formatURLPref('extensions.getAddons.link.url'); + switchToTabHavingURI(amoUrl, true); + } + + #onCommandEvent(event) { + const id = event.target.id; + switch (id) { + case 'zen-site-data-new-addon-button': { + this.#openGetAddons(); + break; + } + case 'zen-site-data-security-info': { + this.window.displaySecurityInfo(); + break; + } + case 'zen-site-data-actions': { + const button = this.document.getElementById('zen-site-data-actions'); + const popup = this.document.getElementById('zenSiteDataActions'); + popup.openPopup( + button, + 'after_start', + 0, + 0, + /* context menu */ true, + false, + this.window.event + ); + break; + } + case 'zen-site-data-header-bookmark': { + this.window.BookmarkingUI.onStarCommand(event); + break; + } + } + } + + #onPermissionClick(label) { + const { SitePermissions, gBrowser } = this.window; + const permission = label._permission; + + let newState; + switch (permission.state) { + case SitePermissions.ALLOW: + newState = SitePermissions.BLOCK; + break; + case SitePermissions.BLOCK: + case SitePermissions.AUTOPLAY_BLOCKED_ALL: + newState = SitePermissions.ALLOW; + break; + default: + return; + } + + SitePermissions.setForPrincipal(gBrowser.contentPrincipal, permission.id, newState); + + label.parentNode.setAttribute('state', newState == SitePermissions.ALLOW ? 'allow' : 'block'); + label + .querySelector('.zen-permission-popup-permission-state-label') + .setAttribute('data-l10n-id', this.#getPermissionStateLabelId({ state: newState })); + label._permission.state = newState; + } + + #onClickEvent(event) { + const id = event.target.id; + switch (id) { + case 'zen-site-data-manage-addons': { + const { BrowserAddonUI } = this.window; + BrowserAddonUI.openAddonsMgr('addons://list/extension'); + break; + } + case 'zen-site-data-settings-more': { + const { BrowserCommands } = this.window; + BrowserCommands.pageInfo(null, 'permTab'); + break; + } + default: { + const label = event.target.closest('.permission-popup-permission-label-container'); + if (label?._permission) { + this.#onPermissionClick(label); + } + break; + } + } + } + + handleEvent(event) { + const type = event.type; + switch (type) { + case 'click': + this.#onClickEvent(event); + break; + case 'command': + this.#onCommandEvent(event); + break; + case 'popupshowing': + this.#preparePanel(); + break; + } + } +} diff --git a/src/zen/urlbar/moz.build b/src/zen/urlbar/moz.build index 1e331db90..f321a86bb 100644 --- a/src/zen/urlbar/moz.build +++ b/src/zen/urlbar/moz.build @@ -3,6 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. EXTRA_JS_MODULES += [ + "ZenSiteDataPanel.sys.mjs", "ZenUBActionsProvider.sys.mjs", "ZenUBGlobalActions.sys.mjs", "ZenUBProvider.sys.mjs", diff --git a/src/zen/workspaces/zen-workspaces.css b/src/zen/workspaces/zen-workspaces.css index ad5c61c6c..d38f0fab6 100644 --- a/src/zen/workspaces/zen-workspaces.css +++ b/src/zen/workspaces/zen-workspaces.css @@ -153,6 +153,7 @@ /* Mark workspaces indicator */ .zen-current-workspace-indicator { + margin-top: 1px; padding: calc(2px + var(--tab-inline-padding) + var(--zen-toolbox-padding)); font-weight: 500; position: relative; diff --git a/src/zen/zen.globals.js b/src/zen/zen.globals.js index c8dc0987f..a225ca767 100644 --- a/src/zen/zen.globals.js +++ b/src/zen/zen.globals.js @@ -7,6 +7,8 @@ export default [ 'nsZenDOMOperatedFeature', 'nsZenPreloadedFeature', + 'nsZenSiteDataPanel', + 'ZenThemeModifier', 'ZenHasPolyfill', From f273cd8fd14d947de6586abb3e6ad91a03f14058 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 5 Oct 2025 18:57:35 +0200 Subject: [PATCH 032/111] chore: Refactor glance animtions, p=#10690 --- .../flatpak/app.zen_browser.zen.yml.template | 2 +- .../browser/preferences/zen-preferences.ftl | 2 - prefs/glance.yaml | 3 - scripts/run_tests.py | 12 +- .../preferences/zenLooksAndFeel.inc.xhtml | 1 - .../common/styles/zen-browser-container.css | 4 +- src/zen/glance/ZenGlanceManager.mjs | 1560 +++++++++++++---- src/zen/glance/actors/ZenGlanceChild.sys.mjs | 78 +- src/zen/glance/actors/ZenGlanceParent.sys.mjs | 36 +- src/zen/glance/zen-glance.css | 35 +- src/zen/split-view/ZenViewSplitter.mjs | 5 +- src/zen/tests/glance/browser.toml | 1 + .../glance/browser_glance_close_select.js | 36 + src/zen/tests/ignorePrefs.json | 8 + 14 files changed, 1322 insertions(+), 461 deletions(-) create mode 100644 src/zen/tests/glance/browser_glance_close_select.js diff --git a/build/flatpak/app.zen_browser.zen.yml.template b/build/flatpak/app.zen_browser.zen.yml.template index d18329c46..821b0f1e6 100644 --- a/build/flatpak/app.zen_browser.zen.yml.template +++ b/build/flatpak/app.zen_browser.zen.yml.template @@ -7,7 +7,7 @@ base-version: '24.08' add-extensions: org.freedesktop.Platform.ffmpeg-full: directory: lib/ffmpeg - version: '24.08' + version: '24.08.26' add-ld-path: . app.zen_browser.zen.systemconfig: directory: etc/zen diff --git a/locales/en-US/browser/browser/preferences/zen-preferences.ftl b/locales/en-US/browser/browser/preferences/zen-preferences.ftl index 5ab322e34..1c2d18229 100644 --- a/locales/en-US/browser/browser/preferences/zen-preferences.ftl +++ b/locales/en-US/browser/browser/preferences/zen-preferences.ftl @@ -33,8 +33,6 @@ zen-glance-trigger-shift-click = .label = Shift + Click zen-glance-trigger-meta-click = .label = Meta (Command) + Click -zen-glance-trigger-mantain-click = - .label = Hold Click (Coming Soon!) zen-look-and-feel-compact-view-header = Show in compact view zen-look-and-feel-compact-view-description = Only show the toolbars you use! diff --git a/prefs/glance.yaml b/prefs/glance.yaml index cae4738d2..49125fe30 100644 --- a/prefs/glance.yaml +++ b/prefs/glance.yaml @@ -8,9 +8,6 @@ - name: zen.glance.enable-contextmenu-search value: true -- name: zen.glance.hold-duration - value: 300 # in ms - - name: zen.glance.open-essential-external-links value: true diff --git a/scripts/run_tests.py b/scripts/run_tests.py index a4adecd7c..90a7995a8 100644 --- a/scripts/run_tests.py +++ b/scripts/run_tests.py @@ -6,6 +6,7 @@ import os import sys import json from pathlib import Path +from typing import Any IGNORE_PREFS_FILE_IN = os.path.join( 'src', 'zen', 'tests', 'ignorePrefs.json' @@ -15,6 +16,15 @@ IGNORE_PREFS_FILE_OUT = os.path.join( ) +class JSONWithCommentsDecoder(json.JSONDecoder): + def __init__(self, **kw): + super().__init__(**kw) + + def decode(self, s: str) -> Any: + s = '\n'.join(l for l in s.split('\n') if not l.lstrip(' ').startswith('//')) + return super().decode(s) + + def copy_ignore_prefs(): print("Copying ignorePrefs.json from src/zen/tests to engine/testing/mochitest...") # if there are prefs that dont exist on output file, copy them from input file @@ -22,7 +32,7 @@ def copy_ignore_prefs(): with open(IGNORE_PREFS_FILE_OUT, 'r') as f: all_prefs = json.load(f) with open(IGNORE_PREFS_FILE_IN, 'r') as f_in: - new_prefs = json.load(f_in) + new_prefs = json.load(f_in, cls=JSONWithCommentsDecoder) all_prefs.extend(p for p in new_prefs if p not in all_prefs) with open(IGNORE_PREFS_FILE_OUT, 'w') as f_out: json.dump(all_prefs, f_out, indent=2) diff --git a/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml b/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml index 259fff79e..068db06b6 100644 --- a/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml +++ b/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml @@ -87,7 +87,6 @@ #ifdef XP_MACOSX #endif - diff --git a/src/zen/common/styles/zen-browser-container.css b/src/zen/common/styles/zen-browser-container.css index 62045e7b0..ea34f8434 100644 --- a/src/zen/common/styles/zen-browser-container.css +++ b/src/zen/common/styles/zen-browser-container.css @@ -8,12 +8,12 @@ #tabbrowser-tabpanels[dragging-split='true'] { width: -moz-available; position: relative; - overflow: clip; &.browserSidebarContainer { - :root:not([zen-no-padding='true']) & { + :root:not([zen-no-padding='true']) &:not(.zen-glance-overlay) { border-radius: var(--zen-native-inner-radius); box-shadow: var(--zen-big-shadow); + overflow: clip; } & browser[type='content'] { diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs index bccffa314..de653c244 100644 --- a/src/zen/glance/ZenGlanceManager.mjs +++ b/src/zen/glance/ZenGlanceManager.mjs @@ -1,312 +1,788 @@ // This Source Code Form is subject to the terms of the Mozilla Public // 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/. + { + /** + * Manages the Zen Glance feature - a preview overlay system for tabs + * Allows users to preview content without fully opening new tabs + */ class nsZenGlanceManager extends nsZenDOMOperatedFeature { + // Animation state _animating = false; _lazyPref = {}; + // Glance management #glances = new Map(); #currentGlanceID = null; - #confirmationTimeout = null; + // Animation flags + animatingOpen = false; + animatingFullOpen = false; + closingGlance = false; + #duringOpening = false; + #ignoreClose = false; + + // Arc animation configuration + #ARC_CONFIG = Object.freeze({ + ARC_STEPS: 40, // Increased for smoother bounce + MAX_ARC_HEIGHT: 30, + ARC_HEIGHT_RATIO: 0.2, // Arc height = distance * ratio (capped at MAX_ARC_HEIGHT) + }); + init() { + this.#setupEventListeners(); + this.#setupPreferences(); + this.#setupObservers(); + } + + #setupEventListeners() { window.addEventListener('TabClose', this.onTabClose.bind(this)); window.addEventListener('TabSelect', this.onLocationChange.bind(this)); + document + .getElementById('tabbrowser-tabpanels') + .addEventListener('click', this.onOverlayClick.bind(this)); + } + + #setupPreferences() { XPCOMUtils.defineLazyPreferenceGetter( this._lazyPref, 'SHOULD_OPEN_EXTERNAL_TABS_IN_GLANCE', 'zen.glance.open-essential-external-links', false ); + } - document - .getElementById('tabbrowser-tabpanels') - .addEventListener('click', this.onOverlayClick.bind(this)); + #setupObservers() { Services.obs.addObserver(this, 'quit-application-requested'); } + /** + * Handle main command set events for glance operations + * @param {Event} event - The command event + */ handleMainCommandSet(event) { const command = event.target; - switch (command.id) { - case 'cmd_zenGlanceClose': - this.closeGlance({ onTabClose: true }); - break; - case 'cmd_zenGlanceExpand': - this.fullyOpenGlance(); - break; - case 'cmd_zenGlanceSplit': - this.splitGlance(); - break; + const commandHandlers = { + cmd_zenGlanceClose: () => this.closeGlance({ onTabClose: true }), + cmd_zenGlanceExpand: () => this.fullyOpenGlance(), + cmd_zenGlanceSplit: () => this.splitGlance(), + }; + + const handler = commandHandlers[command.id]; + if (handler) { + handler(); } } + /** + * Get the current glance browser element + * @returns {Browser} The current browser or null + */ get #currentBrowser() { return this.#glances.get(this.#currentGlanceID)?.browser; } + /** + * Get the current glance tab element + * @returns {Tab} The current tab or null + */ get #currentTab() { return this.#glances.get(this.#currentGlanceID)?.tab; } + /** + * Get the current glance parent tab element + * @returns {Tab} The parent tab or null + */ get #currentParentTab() { return this.#glances.get(this.#currentGlanceID)?.parentTab; } + /** + * Handle clicks on the glance overlay + * @param {Event} event - The click event + */ onOverlayClick(event) { - if (event.target === this.overlay && event.originalTarget !== this.contentWrapper) { + const isOverlayClick = event.target === this.overlay; + const isNotContentClick = event.originalTarget !== this.contentWrapper; + + if (isOverlayClick && isNotContentClick) { this.closeGlance({ onTabClose: true }); } } + /** + * Handle application observer notifications + * @param {Object} subject - The subject of the notification + * @param {string} topic - The topic of the notification + */ observe(subject, topic) { - switch (topic) { - case 'quit-application-requested': - this.onUnload(); - break; + if (topic === 'quit-application-requested') { + this.onUnload(); } } + /** + * Clean up all glances when the application is unloading + */ onUnload() { - // clear everything - /* eslint-disable no-unused-vars */ - for (let [id, glance] of this.#glances) { + for (const [, glance] of this.#glances) { gBrowser.removeTab(glance.tab, { animate: false }); } + this.#glances.clear(); } + /** + * Create a new browser element for a glance + * @param {string} url - The URL to load + * @param {Tab} currentTab - The current tab + * @param {Tab} existingTab - Optional existing tab to reuse + * @returns {Browser} The created browser element + */ createBrowserElement(url, currentTab, existingTab = null) { - const newTabOptions = { + const newTabOptions = this.#createTabOptions(currentTab); + const newUUID = gZenUIManager.generateUuidv4(); + + currentTab._selected = true; + const newTab = + existingTab ?? gBrowser.addTrustedTab(Services.io.newURI(url).spec, newTabOptions); + + this.#configureNewTab(newTab, currentTab, newUUID); + this.#registerGlance(newTab, currentTab, newUUID); + + gBrowser.selectedTab = newTab; + return this.#currentBrowser; + } + + /** + * Create tab options for a new glance tab + * @param {Tab} currentTab - The current tab + * @returns {Object} Tab options + */ + #createTabOptions(currentTab) { + return { userContextId: currentTab.getAttribute('usercontextid') || '', skipBackgroundNotify: true, insertTab: true, skipLoad: false, }; - currentTab._selected = true; - const newUUID = gZenUIManager.generateUuidv4(); - const newTab = - existingTab ?? gBrowser.addTrustedTab(Services.io.newURI(url).spec, newTabOptions); + } + + /** + * Configure a new tab for glance usage + * @param {Tab} newTab - The new tab to configure + * @param {Tab} currentTab - The current tab + * @param {string} glanceId - The glance ID + */ + #configureNewTab(newTab, currentTab, glanceId) { if (currentTab.hasAttribute('zenDefaultUserContextId')) { newTab.setAttribute('zenDefaultUserContextId', true); } + currentTab.querySelector('.tab-content').appendChild(newTab); newTab.setAttribute('zen-glance-tab', true); - newTab.setAttribute('glance-id', newUUID); - currentTab.setAttribute('glance-id', newUUID); - this.#glances.set(newUUID, { + newTab.setAttribute('glance-id', glanceId); + currentTab.setAttribute('glance-id', glanceId); + } + + /** + * Register a new glance in the glances map + * @param {Tab} newTab - The new tab + * @param {Tab} currentTab - The current tab + * @param {string} glanceId - The glance ID + */ + #registerGlance(newTab, currentTab, glanceId) { + this.#glances.set(glanceId, { tab: newTab, parentTab: currentTab, browser: newTab.linkedBrowser, }); - this.#currentGlanceID = newUUID; - gBrowser.selectedTab = newTab; - return this.#currentBrowser; + this.#currentGlanceID = glanceId; } + /** + * Fill overlay references from a browser element + * @param {Browser} browser - The browser element + */ fillOverlay(browser) { this.overlay = browser.closest('.browserSidebarContainer'); this.browserWrapper = browser.closest('.browserContainer'); this.contentWrapper = browser.closest('.browserStack'); } + /** + * Create new overlay buttons with animation + * @returns {DocumentFragment} The cloned button template + */ #createNewOverlayButtons() { - const newButtons = document - .getElementById('zen-glance-sidebar-template') - .content.cloneNode(true); + const template = document.getElementById('zen-glance-sidebar-template'); + const newButtons = template.content.cloneNode(true); const container = newButtons.querySelector('.zen-glance-sidebar-container'); + + this.#animateOverlayButtons(container); + return newButtons; + } + + /** + * Animate the overlay buttons entrance + * @param {Element} container - The button container + */ + #animateOverlayButtons(container) { container.style.opacity = 0; + + const xOffset = gZenVerticalTabsManager._prefsRightSide ? 20 : -20; + gZenUIManager.motion.animate( container, { opacity: [0, 1], + x: [xOffset, 0], }, { - duration: 0.2, + duration: 0.3, type: 'spring', - delay: 0.05, + delay: 0.15, + bounce: 0, } ); - return newButtons; } + /** + * Open a glance overlay with the specified data + * @param {Object} data - Glance data including URL, position, and dimensions + * @param {Tab} existingTab - Optional existing tab to reuse + * @param {Tab} ownerTab - The tab that owns this glance + * @returns {Promise} Promise that resolves to the glance tab + */ openGlance(data, existingTab = null, ownerTab = null) { if (this.#currentBrowser) { return; } + if (gBrowser.selectedTab === this.#currentParentTab) { gBrowser.selectedTab = this.#currentTab; return; } - this.animatingOpen = true; - this._animating = true; - - const initialX = data.clientX; - const initialY = data.clientY; - const initialWidth = data.width; - const initialHeight = data.height; - - this.browserWrapper?.removeAttribute('animate'); - this.browserWrapper?.removeAttribute('has-finished-animation'); - this.overlay?.removeAttribute('post-fade-out'); + this.#setAnimationState(true); const currentTab = ownerTab ?? gBrowser.selectedTab; - const browserElement = this.createBrowserElement(data.url, currentTab, existingTab); this.fillOverlay(browserElement); - this.overlay.classList.add('zen-glance-overlay'); + return this.#animateGlanceOpening(data, browserElement); + } + + /** + * Set animation state flags + * @param {boolean} isAnimating - Whether animations are active + */ + #setAnimationState(isAnimating) { + this.animatingOpen = isAnimating; + this._animating = isAnimating; + } + + /** + * Animate the glance opening process + * @param {Object} data - Glance data + * @param {Browser} browserElement - The browser element + * @returns {Promise} Promise that resolves to the glance tab + */ + #animateGlanceOpening(data, browserElement) { return new Promise((resolve) => { window.requestAnimationFrame(() => { - this.quickOpenGlance(); - const newButtons = this.#createNewOverlayButtons(); - this.browserWrapper.appendChild(newButtons); - - // Performance: backdrop-filter blur on Windows significantly impacts scroll smoothness - // in the Glance preview (particularly for wheel scrolling). Avoid applying it on Windows. - const parentSidebarContainer = this.#currentParentTab.linkedBrowser.closest( - '.browserSidebarContainer' - ); - gZenUIManager.motion.animate( - parentSidebarContainer, - { - scale: [1, 0.98], - opacity: [1, 0.6], - }, - { - duration: 0.4, - type: 'spring', - bounce: 0.2, - } - ); - this.overlay.removeAttribute('fade-out'); - this.browserWrapper.setAttribute('animate', true); - const top = initialY + initialHeight / 2; - const left = initialX + initialWidth / 2; - this.browserWrapper.style.top = `${top}px`; - this.browserWrapper.style.left = `${left}px`; - this.browserWrapper.style.width = `${initialWidth}px`; - this.browserWrapper.style.height = `${initialHeight}px`; - this.browserWrapper.style.opacity = 0.8; - this.#glances.get(this.#currentGlanceID).originalPosition = { - top: this.browserWrapper.style.top, - left: this.browserWrapper.style.left, - width: this.browserWrapper.style.width, - height: this.browserWrapper.style.height, - }; - this.browserWrapper.style.transform = 'translate(-50%, -50%)'; - this.overlay.style.overflow = 'visible'; - gZenUIManager.motion - .animate( - this.browserWrapper, - { - top: '50%', - left: '50%', - width: '85%', - height: '100%', - opacity: 1, - }, - { - duration: 0.3, - type: 'spring', - bounce: 0.2, - } - ) - .then(() => { - gBrowser.tabContainer._invalidateCachedTabs(); - this.overlay.style.removeProperty('overflow'); - this.browserWrapper.removeAttribute('animate'); - this.browserWrapper.setAttribute('has-finished-animation', true); - this._animating = false; - this.animatingOpen = false; - this.#currentTab.dispatchEvent(new Event('GlanceOpen', { bubbles: true })); - resolve(this.#currentTab); - }); + this.#prepareGlanceAnimation(data, browserElement); + this.#executeGlanceAnimation(data, browserElement, resolve); }); }); } - _clearContainerStyles(container) { + /** + * Prepare the glance for animation + * @param {Object} data - Glance data + * @param {Browser} browserElement - The browser element + */ + #prepareGlanceAnimation(data, browserElement) { + this.quickOpenGlance(); + const newButtons = this.#createNewOverlayButtons(); + this.browserWrapper.appendChild(newButtons); + + this.#animateParentBackground(); + this.#setupGlancePositioning(data); + this.#configureBrowserElement(browserElement); + } + + /** + * Animate the parent background + */ + #animateParentBackground() { + const parentSidebarContainer = this.#currentParentTab.linkedBrowser.closest( + '.browserSidebarContainer' + ); + + gZenUIManager.motion.animate( + parentSidebarContainer, + { + scale: [1, 0.98], + opacity: [1, 0.6], + }, + { + duration: 0.3, + type: 'spring', + bounce: 0.2, + } + ); + } + + /** + * Set up glance positioning + * @param {Object} data - Glance data with position and dimensions + */ + #setupGlancePositioning(data) { + const { clientX, clientY, width, height } = data; + const top = clientY + height / 2; + const left = clientX + width / 2; + + this.overlay.removeAttribute('fade-out'); + this.browserWrapper.setAttribute('animate', true); + this.browserWrapper.style.top = `${top}px`; + this.browserWrapper.style.left = `${left}px`; + this.browserWrapper.style.width = `${width}px`; + this.browserWrapper.style.height = `${height}px`; + + this.#storeOriginalPosition(); + this.overlay.style.overflow = 'visible'; + } + + /** + * Store the original position for later restoration + */ + #storeOriginalPosition() { + this.#glances.get(this.#currentGlanceID).originalPosition = { + top: this.browserWrapper.style.top, + left: this.browserWrapper.style.left, + width: this.browserWrapper.style.width, + height: this.browserWrapper.style.height, + }; + } + + /** + * Handle element preview if provided + * @param {Object} data - Glance data + * @returns {Element|null} The preview element or null + */ + #handleElementPreview(data) { + if (!data.elementData) { + return null; + } + + const imageDataElement = document.createXULElement('image'); + imageDataElement.setAttribute('src', data.elementData); + imageDataElement.classList.add('zen-glance-element-preview'); + this.browserWrapper.prepend(imageDataElement); + this.#glances.get(this.#currentGlanceID).elementImageData = data.elementData; + + return imageDataElement; + } + + /** + * Configure browser element for animation + * @param {Browser} browserElement - The browser element + */ + #configureBrowserElement(browserElement) { + const rect = window.windowUtils.getBoundsWithoutFlushing(this.browserWrapper.parentElement); + const minWidth = rect.width * 0.85; + const minHeight = rect.height * 0.85; + + browserElement.style.minWidth = `${minWidth}px`; + browserElement.style.minHeight = `${minHeight}px`; + } + + /** + * Get the transform origin for the animation + * @param {Object} data - Glance data with position and dimensions + * @returns {string} The transform origin CSS value + */ + #getTransformOrigin(data) { + const { clientX, clientY, width, height } = data; + const parentRect = window.windowUtils.getBoundsWithoutFlushing( + this.browserWrapper.parentElement + ); + const xPercent = ((clientX + width / 2 - parentRect.left) / parentRect.width) * 100; + const yPercent = ((clientY + height / 2 - parentRect.top) / parentRect.height) * 100; + + const xOrigin = xPercent < 33 ? 'left' : xPercent > 66 ? 'right' : 'center'; + const yOrigin = yPercent < 33 ? 'top' : yPercent > 66 ? 'bottom' : 'center'; + + return `${xOrigin} ${yOrigin}`; + } + + /** + * Execute the main glance animation + * @param {Object} data - Glance data + * @param {Browser} browserElement - The browser element + * @param {Function} resolve - Promise resolve function + */ + #executeGlanceAnimation(data, browserElement, resolve) { + const imageDataElement = this.#handleElementPreview(data); + + // Create curved animation sequence + const arcSequence = this.#createGlanceArcSequence(data, 'opening'); + const transformOrigin = this.#getTransformOrigin(data); + + this.browserWrapper.style.transformOrigin = transformOrigin; + gZenUIManager.motion + .animate(this.browserWrapper, arcSequence, { + duration: gZenUIManager.testingEnabled ? 0 : 0.4, + ease: 'easeInOut', + }) + .then(() => { + this.#finalizeGlanceOpening(imageDataElement, browserElement, resolve); + }); + } + + /** + * Create arc animation sequence for glance animations + * @param {Object} data - Glance data with position and dimensions + * @param {string} direction - 'opening' or 'closing' + * @returns {Object} Animation sequence object + */ + #createGlanceArcSequence(data, direction) { + const { clientX, clientY, width, height } = data; + + // Calculate start and end positions based on direction + let startPosition, endPosition; + + const tabPanelsRect = window.windowUtils.getBoundsWithoutFlushing(gBrowser.tabpanels); + + const widthPercent = 0.85; + if (direction === 'opening') { + startPosition = { + x: clientX + width / 2, + y: clientY + height / 2, + width: width, + height: height, + }; + endPosition = { + x: tabPanelsRect.width / 2, + y: tabPanelsRect.height / 2, + width: tabPanelsRect.width * widthPercent, + height: tabPanelsRect.height, + }; + } else { + // closing + startPosition = { + x: tabPanelsRect.width / 2, + y: tabPanelsRect.height / 2, + width: tabPanelsRect.width * widthPercent, + height: tabPanelsRect.height, + }; + endPosition = { + x: clientX + width / 2, + y: clientY + height / 2, + width: width, + height: height, + }; + } + + // Calculate distance and arc parameters + const distance = this.#calculateDistance(startPosition, endPosition); + const { arcHeight, shouldArcDownward } = this.#calculateOptimalArc( + startPosition, + endPosition, + distance + ); + + const sequence = { + top: [], + left: [], + width: [], + height: [], + transform: [], + }; + + const steps = this.#ARC_CONFIG.ARC_STEPS; + const arcDirection = shouldArcDownward ? 1 : -1; + + function easeInOutQuad(t) { + return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; + } + + function easeOutCubic(t) { + return 1 - Math.pow(1 - t, 6); + } + + // First, create the main animation steps + for (let i = 0; i <= steps; i++) { + const progress = i / steps; + const eased = direction === 'opening' ? easeInOutQuad(progress) : easeOutCubic(progress); + + // Calculate size interpolation + const currentWidth = + startPosition.width + (endPosition.width - startPosition.width) * eased; + const currentHeight = + startPosition.height + (endPosition.height - startPosition.height) * eased; + + // Calculate position on arc + const distanceX = endPosition.x - startPosition.x; + const distanceY = endPosition.y - startPosition.y; + + const x = startPosition.x + distanceX * eased; + const y = + startPosition.y + + distanceY * eased + + arcDirection * arcHeight * (1 - (2 * eased - 1) ** 2); + + sequence.transform.push(`translate(-50%, -50%) scale(1)`); + sequence.top.push(`${y}px`); + sequence.left.push(`${x}px`); + sequence.width.push(`${currentWidth}px`); + sequence.height.push(`${currentHeight}px`); + } + + let scale = 1; + const bounceSteps = 40; + if (direction === 'opening') { + for (let i = 0; i < bounceSteps; i++) { + const progress = i / bounceSteps; + // Scale up slightly then back to normal + scale = 1 + 0.006 * Math.sin(progress * Math.PI); + // If we are at the last step, ensure scale is exactly 1 + if (i === bounceSteps - 1) { + scale = 1; + } + sequence.transform.push(`translate(-50%, -50%) scale(${scale})`); + sequence.top.push(sequence.top[sequence.top.length - 1]); + sequence.left.push(sequence.left[sequence.left.length - 1]); + sequence.width.push(sequence.width[sequence.width.length - 1]); + sequence.height.push(sequence.height[sequence.height.length - 1]); + } + } + + return sequence; + } + + /** + * Calculate distance between two positions + * @param {Object} start - Start position + * @param {Object} end - End position + * @returns {number} Distance + */ + #calculateDistance(start, end) { + const distanceX = end.x - start.x; + const distanceY = end.y - start.y; + return Math.sqrt(distanceX * distanceX + distanceY * distanceY); + } + + /** + * Calculate optimal arc parameters + * @param {Object} startPosition - Start position + * @param {Object} endPosition - End position + * @param {number} distance - Distance between positions + * @returns {Object} Arc parameters + */ + #calculateOptimalArc(startPosition, endPosition, distance) { + // Calculate available space for the arc + const availableTopSpace = Math.min(startPosition.y, endPosition.y); + const viewportHeight = window.innerHeight; + const availableBottomSpace = viewportHeight - Math.max(startPosition.y, endPosition.y); + + // Determine if we should arc downward or upward based on available space + const shouldArcDownward = availableBottomSpace > availableTopSpace; + + // Use the space in the direction we're arcing + const availableSpace = shouldArcDownward ? availableBottomSpace : availableTopSpace; + + // Limit arc height to a percentage of the available space + const arcHeight = Math.min( + distance * this.#ARC_CONFIG.ARC_HEIGHT_RATIO, + this.#ARC_CONFIG.MAX_ARC_HEIGHT, + availableSpace * 0.6 + ); + + return { arcHeight, shouldArcDownward }; + } + + /** + * Finalize the glance opening process + * @param {Element|null} imageDataElement - The preview element + * @param {Browser} browserElement - The browser element + * @param {Function} resolve - Promise resolve function + */ + #finalizeGlanceOpening(imageDataElement, browserElement, resolve) { + if (imageDataElement) { + imageDataElement.remove(); + } + + this.browserWrapper.style.transformOrigin = ''; + + browserElement.style.minWidth = ''; + browserElement.style.minHeight = ''; + + gBrowser.tabContainer._invalidateCachedTabs(); + this.overlay.style.removeProperty('overflow'); + this.browserWrapper.removeAttribute('animate'); + this.browserWrapper.setAttribute('has-finished-animation', true); + + this.#setAnimationState(false); + this.#currentTab.dispatchEvent(new Event('GlanceOpen', { bubbles: true })); + resolve(this.#currentTab); + } + + /** + * Clear container styles while preserving inset + * @param {Element} container - The container element + */ + #clearContainerStyles(container) { const inset = container.style.inset; container.removeAttribute('style'); container.style.inset = inset; } + /** + * Close the current glance + * @param {Object} options - Close options + * @param {boolean} options.noAnimation - Skip animation + * @param {boolean} options.onTabClose - Called during tab close + * @param {string} options.setNewID - Set new glance ID + * @param {boolean} options.hasFocused - Has focus confirmation + * @param {boolean} options.skipPermitUnload - Skip unload permission check + * @returns {Promise|undefined} Promise if animated, undefined if immediate + */ closeGlance({ noAnimation = false, onTabClose = false, setNewID = null, - isDifferent = false, hasFocused = false, skipPermitUnload = false, } = {}) { - if ( - (this._animating && !onTabClose) || - !this.#currentBrowser || - (this.animatingOpen && !onTabClose) || - this._duringOpening - ) { + if (!this.#canCloseGlance(onTabClose)) { return; } - if (!skipPermitUnload) { - let { permitUnload } = this.#currentBrowser.permitUnload(); - if (!permitUnload) { - return; - } + if (!skipPermitUnload && !this.#checkPermitUnload()) { + return; } const browserSidebarContainer = this.#currentParentTab?.linkedBrowser?.closest( '.browserSidebarContainer' ); const sidebarButtons = this.browserWrapper.querySelector('.zen-glance-sidebar-container'); + + if (this.#handleConfirmationTimeout(onTabClose, hasFocused, sidebarButtons)) { + return; + } + + this.browserWrapper.removeAttribute('has-finished-animation'); + + if (noAnimation) { + this.#clearContainerStyles(browserSidebarContainer); + this.quickCloseGlance({ closeCurrentTab: false }); + return; + } + + return this.#animateGlanceClosing( + onTabClose, + browserSidebarContainer, + sidebarButtons, + setNewID + ); + } + + /** + * Check if glance can be closed + * @param {boolean} onTabClose - Whether this is called during tab close + * @returns {boolean} True if can close + */ + #canCloseGlance(onTabClose) { + return !( + (this._animating && !onTabClose) || + !this.#currentBrowser || + (this.animatingOpen && !onTabClose) || + this._duringOpening + ); + } + + /** + * Check if unload is permitted + * @returns {boolean} True if unload is permitted + */ + #checkPermitUnload() { + const { permitUnload } = this.#currentBrowser.permitUnload(); + return permitUnload; + } + + /** + * Handle confirmation timeout for focused close + * @param {boolean} onTabClose - Whether this is called during tab close + * @param {boolean} hasFocused - Has focus confirmation + * @param {Element} sidebarButtons - The sidebar buttons element + * @returns {boolean} True if should return early + */ + #handleConfirmationTimeout(onTabClose, hasFocused, sidebarButtons) { if (onTabClose && hasFocused && !this.#confirmationTimeout && sidebarButtons) { - const cancelButton = sidebarButtons?.querySelector('.zen-glance-sidebar-close'); + const cancelButton = sidebarButtons.querySelector('.zen-glance-sidebar-close'); cancelButton.setAttribute('waitconfirmation', true); this.#confirmationTimeout = setTimeout(() => { cancelButton.removeAttribute('waitconfirmation'); this.#confirmationTimeout = null; }, 3000); - return; - } - - this.browserWrapper.removeAttribute('has-finished-animation'); - if (noAnimation) { - this._clearContainerStyles(browserSidebarContainer); - this.quickCloseGlance({ closeCurrentTab: false }); - return; + return true; } + return false; + } + /** + * Animate the glance closing process + * @param {boolean} onTabClose - Whether this is called during tab close + * @param {Element} browserSidebarContainer - The sidebar container + * @param {Element} sidebarButtons - The sidebar buttons + * @param {string} setNewID - New glance ID to set + * @returns {Promise} Promise that resolves when closing is complete + */ + #animateGlanceClosing(onTabClose, browserSidebarContainer, sidebarButtons, setNewID) { this.closingGlance = true; this._animating = true; gBrowser.moveTabAfter(this.#currentTab, this.#currentParentTab); - let quikcCloseZen = false; - if (onTabClose) { - // Create new tab if no more ex - if (gBrowser.tabs.length === 1) { - BrowserCommands.openTab(); - return; - } + if (onTabClose && gBrowser.tabs.length === 1) { + BrowserCommands.openTab(); + return; } - // do NOT touch here, I don't know what it does, but it works... + this.#prepareGlanceForClosing(); + this.#animateSidebarButtons(sidebarButtons); + this.#animateParentBackgroundClose(browserSidebarContainer); + + return this.#executeClosingAnimation(setNewID, onTabClose); + } + + /** + * Prepare glance for closing + */ + #prepareGlanceForClosing() { + // Critical: This line must not be touched - it works for unknown reasons this.#currentTab.style.display = 'none'; this.overlay.setAttribute('fade-out', true); this.overlay.style.pointerEvents = 'none'; this.quickCloseGlance({ justAnimateParent: true, clearID: false }); - const originalPosition = this.#glances.get(this.#currentGlanceID).originalPosition; + } + + /** + * Animate sidebar buttons out + * @param {Element} sidebarButtons - The sidebar buttons element + */ + #animateSidebarButtons(sidebarButtons) { if (sidebarButtons) { gZenUIManager.motion .animate( sidebarButtons, - { - opacity: [1, 0], - }, + { opacity: [1, 0] }, { duration: 0.2, type: 'spring', @@ -317,6 +793,13 @@ sidebarButtons.remove(); }); } + } + + /** + * Animate parent background restoration + * @param {Element} browserSidebarContainer - The sidebar container + */ + #animateParentBackgroundClose(browserSidebarContainer) { gZenUIManager.motion .animate( browserSidebarContainer, @@ -325,102 +808,199 @@ opacity: [0.6, 1], }, { - duration: 0.4, + duration: 0.3, type: 'spring', - bounce: 0.2, + bounce: 0, } ) .then(() => { - this._clearContainerStyles(browserSidebarContainer); + this.#clearContainerStyles(browserSidebarContainer); }); + this.browserWrapper.style.opacity = 1; + } + + /** + * Execute the main closing animation + * @param {string} setNewID - New glance ID to set + * @param {boolean} onTabClose - Whether this is called during tab close + * @returns {Promise} Promise that resolves when complete + */ + #executeClosingAnimation(setNewID, onTabClose) { return new Promise((resolve) => { + const originalPosition = this.#glances.get(this.#currentGlanceID).originalPosition; + const elementImageData = this.#glances.get(this.#currentGlanceID).elementImageData; + + this.#addElementPreview(elementImageData); + + // Create curved closing animation sequence + const closingData = this.#createClosingDataFromOriginalPosition(originalPosition); + const arcSequence = this.#createGlanceArcSequence(closingData, 'closing'); + gZenUIManager.motion - .animate( - this.browserWrapper, - { - ...originalPosition, - opacity: 0, - }, - { type: 'spring', bounce: 0, duration: 0.5, easing: 'ease-in' } - ) + .animate(this.browserWrapper, arcSequence, { duration: 0.4, ease: 'easeOut' }) .then(() => { - this.browserWrapper.removeAttribute('animate'); - if (!this.#currentParentTab) { - return; + // Remove element preview after closing animation + const elementPreview = this.browserWrapper.querySelector('.zen-glance-element-preview'); + if (elementPreview) { + elementPreview.remove(); } - - if (!onTabClose || quikcCloseZen) { - this.quickCloseGlance({ clearID: false }); - } - this.overlay.removeAttribute('fade-out'); - this.browserWrapper.removeAttribute('animate'); - - const lastCurrentTab = this.#currentTab; - - this.overlay.classList.remove('zen-glance-overlay'); - gBrowser - ._getSwitcher() - .setTabStateNoAction(lastCurrentTab, gBrowser.AsyncTabSwitcher.STATE_UNLOADED); - - if (!onTabClose) { - this.#currentParentTab._visuallySelected = false; - } - - if ( - this.#currentParentTab.linkedBrowser && - !this.#currentParentTab.hasAttribute('split-view') - ) { - this.#currentParentTab.linkedBrowser.zenModeActive = false; - } - - // reset everything - this.browserWrapper = null; - this.overlay = null; - this.contentWrapper = null; - - lastCurrentTab.removeAttribute('zen-glance-tab'); - lastCurrentTab._closingGlance = true; - - if (!isDifferent) { - gBrowser.selectedTab = this.#currentParentTab; - } - this._ignoreClose = true; - lastCurrentTab.dispatchEvent(new Event('GlanceClose', { bubbles: true })); - gBrowser.removeTab(lastCurrentTab, { animate: true, skipPermitUnload: true }); - gBrowser.tabContainer._invalidateCachedTabs(); - - this.#currentParentTab.removeAttribute('glance-id'); - - this.#glances.delete(this.#currentGlanceID); - this.#currentGlanceID = setNewID; - - this._duringOpening = false; - - this._animating = false; - this.closingGlance = false; - - if (this.#currentGlanceID) { - this.quickOpenGlance(); - } - - resolve(); + this.#finalizeGlanceClosing(setNewID, resolve, onTabClose); }); }); } - quickOpenGlance() { - if (!this.#currentBrowser || this._duringOpening) { + /** + * Create closing data from original position for arc animation + * @param {Object} originalPosition - Original position object + * @returns {Object} Closing data object + */ + #createClosingDataFromOriginalPosition(originalPosition) { + // Parse the original position values + const top = parseFloat(originalPosition.top) || 0; + const left = parseFloat(originalPosition.left) || 0; + const width = parseFloat(originalPosition.width) || 0; + const height = parseFloat(originalPosition.height) || 0; + + return { + clientX: left - width / 2, + clientY: top - height / 2, + width: width, + height: height, + }; + } + + /** + * Add element preview if available + * @param {string} elementImageData - The element image data + */ + #addElementPreview(elementImageData) { + if (elementImageData) { + const imageDataElement = document.createXULElement('image'); + imageDataElement.setAttribute('src', elementImageData); + imageDataElement.classList.add('zen-glance-element-preview'); + this.browserWrapper.prepend(imageDataElement); + } + } + + /** + * Finalize the glance closing process + * @param {string} setNewID - New glance ID to set + * @param {Function} resolve - Promise resolve function + * @param {boolean} onTabClose - Whether this is called during tab close + */ + #finalizeGlanceClosing(setNewID, resolve, onTabClose) { + this.browserWrapper.removeAttribute('animate'); + + if (!this.#currentParentTab) { return; } - this._duringOpening = true; + if (!onTabClose) { + this.quickCloseGlance({ clearID: false }); + } + this.browserWrapper.style.display = 'none'; + this.overlay.removeAttribute('fade-out'); + this.browserWrapper.removeAttribute('animate'); + + const lastCurrentTab = this.#currentTab; + this.#cleanupGlanceElements(lastCurrentTab); + this.#resetGlanceState(setNewID); + + this.#setAnimationState(false); + this.closingGlance = false; + + if (this.#currentGlanceID) { + this.quickOpenGlance(); + } + + resolve(); + } + + /** + * Clean up glance DOM elements + * @param {Tab} lastCurrentTab - The tab being closed + */ + #cleanupGlanceElements(lastCurrentTab) { + this.overlay.classList.remove('zen-glance-overlay'); + gBrowser + ._getSwitcher() + .setTabStateNoAction(lastCurrentTab, gBrowser.AsyncTabSwitcher.STATE_UNLOADED); + + if (!this.#currentParentTab.selected) { + this.#currentParentTab._visuallySelected = false; + } + + if (gBrowser.selectedTab === lastCurrentTab) { + gBrowser.selectedTab = this.#currentParentTab; + } + + if ( + this.#currentParentTab.linkedBrowser && + !this.#currentParentTab.hasAttribute('split-view') + ) { + this.#currentParentTab.linkedBrowser.zenModeActive = false; + } + + // Reset overlay references + this.browserWrapper = null; + this.overlay = null; + this.contentWrapper = null; + + lastCurrentTab.removeAttribute('zen-glance-tab'); + lastCurrentTab._closingGlance = true; + + this.#ignoreClose = true; + lastCurrentTab.dispatchEvent(new Event('GlanceClose', { bubbles: true })); + gBrowser.removeTab(lastCurrentTab, { animate: true, skipPermitUnload: true }); + gBrowser.tabContainer._invalidateCachedTabs(); + } + + /** + * Reset glance state + * @param {string} setNewID - New glance ID to set + */ + #resetGlanceState(setNewID) { + this.#currentParentTab.removeAttribute('glance-id'); + this.#glances.delete(this.#currentGlanceID); + this.#currentGlanceID = setNewID; + this._duringOpening = false; + } + + /** + * Quickly open glance without animation + */ + quickOpenGlance() { + if (!this.#currentBrowser || this.#duringOpening) { + return; + } + + this.#duringOpening = true; + this.#configureGlanceElements(); + this.#setGlanceStates(); + this.#duringOpening = false; + } + + /** + * Configure glance DOM elements + */ + #configureGlanceElements() { const parentBrowserContainer = this.#currentParentTab.linkedBrowser.closest( '.browserSidebarContainer' ); + parentBrowserContainer.classList.add('zen-glance-background'); parentBrowserContainer.classList.remove('zen-glance-overlay'); parentBrowserContainer.classList.add('deck-selected'); + + this.overlay.classList.add('deck-selected'); + this.overlay.classList.add('zen-glance-overlay'); + } + + /** + * Set glance browser and tab states + */ + #setGlanceStates() { this.#currentParentTab.linkedBrowser.zenModeActive = true; this.#currentParentTab.linkedBrowser.docShellIsActive = true; this.#currentBrowser.zenModeActive = true; @@ -428,13 +1008,16 @@ this.#currentBrowser.setAttribute('zen-glance-selected', true); this.fillOverlay(this.#currentBrowser); this.#currentParentTab._visuallySelected = true; - - this.overlay.classList.add('deck-selected'); - this.overlay.classList.add('zen-glance-overlay'); - - this._duringOpening = false; } + /** + * Quickly close glance without animation + * @param {Object} options - Close options + * @param {boolean} options.closeCurrentTab - Close current tab + * @param {boolean} options.closeParentTab - Close parent tab + * @param {boolean} options.justAnimateParent - Only animate parent + * @param {boolean} options.clearID - Clear current glance ID + */ quickCloseGlance({ closeCurrentTab = true, closeParentTab = true, @@ -445,127 +1028,217 @@ const browserContainer = this.#currentParentTab.linkedBrowser.closest( '.browserSidebarContainer' ); - if (parentHasBrowser) { - browserContainer.classList.remove('zen-glance-background'); - } + + this.#removeParentBackground(parentHasBrowser, browserContainer); + if (!justAnimateParent && this.overlay) { - if (parentHasBrowser && !this.#currentParentTab.hasAttribute('split-view')) { - if (closeParentTab) { - browserContainer.classList.remove('deck-selected'); - } - this.#currentParentTab.linkedBrowser.zenModeActive = false; - } - this.#currentBrowser.zenModeActive = false; - if (closeParentTab && parentHasBrowser) { - this.#currentParentTab.linkedBrowser.docShellIsActive = false; - } - if (closeCurrentTab) { - this.#currentBrowser.docShellIsActive = false; - this.overlay.classList.remove('deck-selected'); - this.#currentTab._selected = false; - } - if (!this.#currentParentTab._visuallySelected && closeParentTab) { - this.#currentParentTab._visuallySelected = false; - } - this.#currentBrowser.removeAttribute('zen-glance-selected'); - this.overlay.classList.remove('zen-glance-overlay'); + this.#resetGlanceStates( + closeCurrentTab, + closeParentTab, + parentHasBrowser, + browserContainer + ); } + if (clearID) { this.#currentGlanceID = null; } } + /** + * Remove parent background styling + * @param {boolean} parentHasBrowser - Whether parent has browser + * @param {Element} browserContainer - The browser container + */ + #removeParentBackground(parentHasBrowser, browserContainer) { + if (parentHasBrowser) { + browserContainer.classList.remove('zen-glance-background'); + } + } + + /** + * Reset glance states + * @param {boolean} closeCurrentTab - Whether to close current tab + * @param {boolean} closeParentTab - Whether to close parent tab + * @param {boolean} parentHasBrowser - Whether parent has browser + * @param {Element} browserContainer - The browser container + */ + #resetGlanceStates(closeCurrentTab, closeParentTab, parentHasBrowser, browserContainer) { + if (parentHasBrowser && !this.#currentParentTab.hasAttribute('split-view')) { + if (closeParentTab) { + browserContainer.classList.remove('deck-selected'); + } + this.#currentParentTab.linkedBrowser.zenModeActive = false; + } + + this.#currentBrowser.zenModeActive = false; + + if (closeParentTab && parentHasBrowser) { + this.#currentParentTab.linkedBrowser.docShellIsActive = false; + } + + if (closeCurrentTab) { + this.#currentBrowser.docShellIsActive = false; + this.overlay.classList.remove('deck-selected'); + this.#currentTab._selected = false; + } + + if (!this.#currentParentTab._visuallySelected && closeParentTab) { + this.#currentParentTab._visuallySelected = false; + } + + this.#currentBrowser.removeAttribute('zen-glance-selected'); + this.overlay.classList.remove('zen-glance-overlay'); + } + + /** + * Open glance on location change if not animating + */ onLocationChangeOpenGlance() { if (!this.animatingOpen) { this.quickOpenGlance(); } } - // note: must be sync to avoid timing issues + /** + * Handle location change events + * Note: Must be sync to avoid timing issues + * @param {Event} event - The location change event + */ onLocationChange(event) { const tab = event.target; + if (this.animatingFullOpen || this.closingGlance) { return; } - if (this._duringOpening || !tab.hasAttribute('glance-id')) { - if (this.#currentGlanceID && !this._duringOpening) { + + if (this.#duringOpening || !tab.hasAttribute('glance-id')) { + if (this.#currentGlanceID && !this.#duringOpening) { this.quickCloseGlance(); } return; } + if (this.#currentGlanceID && this.#currentGlanceID !== tab.getAttribute('glance-id')) { this.quickCloseGlance(); } + this.#currentGlanceID = tab.getAttribute('glance-id'); + if (gBrowser.selectedTab === this.#currentParentTab && this.#currentBrowser) { - const curTab = this.#currentTab; - const prevTab = event.detail.previousTab; - setTimeout(() => { - gBrowser.selectedTab = curTab; - if (prevTab?.linkedBrowser) { - prevTab.linkedBrowser - .closest('.browserSidebarContainer') - .classList.remove('deck-selected'); - } - }, 0); + this.#handleParentTabSelection(event); } else if (gBrowser.selectedTab === this.#currentTab) { setTimeout(this.onLocationChangeOpenGlance.bind(this), 0); } } + /** + * Handle parent tab selection + * @param {Event} event - The location change event + */ + #handleParentTabSelection(event) { + const curTab = this.#currentTab; + const prevTab = event.detail.previousTab; + + setTimeout(() => { + gBrowser.selectedTab = curTab; + if (prevTab?.linkedBrowser) { + prevTab.linkedBrowser + .closest('.browserSidebarContainer') + .classList.remove('deck-selected'); + } + }, 0); + } + + /** + * Handle tab close events + * @param {Event} event - The tab close event + */ onTabClose(event) { if (event.target === this.#currentParentTab) { this.closeGlance({ onTabClose: true }); } } + /** + * Manage tab close for glance tabs + * @param {Tab} tab - The tab being closed + * @returns {boolean} Whether to continue with tab close + */ manageTabClose(tab) { - if (tab.hasAttribute('glance-id')) { - const oldGlanceID = this.#currentGlanceID; - const newGlanceID = tab.getAttribute('glance-id'); - this.#currentGlanceID = newGlanceID; - const isDifferent = newGlanceID !== oldGlanceID; - if (this._ignoreClose) { - this._ignoreClose = false; - return false; - } - this.closeGlance({ - onTabClose: true, - setNewID: isDifferent ? oldGlanceID : null, - isDifferent, - }); - // only keep continueing tab close if we are not on the currently selected tab - return !isDifferent; + if (!tab.hasAttribute('glance-id')) { + return false; } - return false; + + const oldGlanceID = this.#currentGlanceID; + const newGlanceID = tab.getAttribute('glance-id'); + this.#currentGlanceID = newGlanceID; + const isDifferent = newGlanceID !== oldGlanceID; + + if (this.#ignoreClose) { + this.#ignoreClose = false; + return false; + } + + this.closeGlance({ + onTabClose: true, + setNewID: isDifferent ? oldGlanceID : null, + }); + + // Only continue tab close if we are not on the currently selected tab + return !isDifferent; } + /** + * Check if two tabs have different domains + * @param {Tab} tab1 - First tab + * @param {nsIURI} url2 - Second URL + * @returns {boolean} True if domains differ + */ tabDomainsDiffer(tab1, url2) { try { if (!tab1) { return true; } - let url1 = tab1.linkedBrowser.currentURI.spec; + + const url1 = tab1.linkedBrowser.currentURI.spec; if (url1.startsWith('about:')) { return true; } - // https://github.com/zen-browser/desktop/issues/7173: Only glance up links that are http(s) or file + + // Only glance up links that are http(s) or file + // https://github.com/zen-browser/desktop/issues/7173 const url2Spec = url2.spec; - if ( - !url2Spec.startsWith('http') && - !url2Spec.startsWith('https') && - !url2Spec.startsWith('file') - ) { + if (!this.#isValidGlanceUrl(url2Spec)) { return false; } + return Services.io.newURI(url1).host !== url2.host; } catch { return true; } } + /** + * Check if URL is valid for glance + * @param {string} urlSpec - The URL spec + * @returns {boolean} True if valid + */ + #isValidGlanceUrl(urlSpec) { + return ( + urlSpec.startsWith('http') || urlSpec.startsWith('https') || urlSpec.startsWith('file') + ); + } + + /** + * Check if a tab should be opened in glance + * @param {Tab} tab - The tab to check + * @param {nsIURI} uri - The URI to check + * @returns {boolean} True if should open in glance + */ shouldOpenTabInGlance(tab, uri) { - let owner = tab.owner; + const owner = tab.owner; + return ( owner && owner.pinned && @@ -576,86 +1249,138 @@ ); } + /** + * Handle tab open events + * @param {Browser} browser - The browser element + * @param {nsIURI} uri - The URI being opened + */ onTabOpen(browser, uri) { - let tab = gBrowser.getTabForBrowser(browser); + const tab = gBrowser.getTabForBrowser(browser); if (!tab) { return; } + try { if (this.shouldOpenTabInGlance(tab, uri)) { - const browserRect = gBrowser.tabbox.getBoundingClientRect(); - this.openGlance( - { - url: undefined, - ...(gZenUIManager._lastClickPosition || { - clientX: browserRect.width / 2, - clientY: browserRect.height / 2, - }), - width: 0, - height: 0, - }, - tab, - tab.owner - ); + this.#openGlanceForTab(tab); } } catch (e) { - console.error(e); + console.error('Error opening glance for tab:', e); } } + /** + * Open glance for a specific tab + * @param {Tab} tab - The tab to open glance for + */ + #openGlanceForTab(tab) { + const browserRect = window.windowUtils.getBoundsWithoutFlushing(gBrowser.tabbox); + const clickPosition = gZenUIManager._lastClickPosition || { + clientX: browserRect.width / 2, + clientY: browserRect.height / 2, + }; + + this.openGlance( + { + url: undefined, + ...clickPosition, + width: 0, + height: 0, + }, + tab, + tab.owner + ); + } + + /** + * Finish opening glance and clean up + */ finishOpeningGlance() { gBrowser.tabContainer._invalidateCachedTabs(); gZenWorkspaces.updateTabsContainers(); this.overlay.classList.remove('zen-glance-overlay'); - this._clearContainerStyles(this.browserWrapper); + this.#clearContainerStyles(this.browserWrapper); this.animatingFullOpen = false; this.closeGlance({ noAnimation: true, skipPermitUnload: true }); this.#glances.delete(this.#currentGlanceID); } + /** + * Fully open glance (convert to regular tab) + * @param {Object} options - Options for full opening + * @param {boolean} options.forSplit - Whether this is for split view + */ async fullyOpenGlance({ forSplit = false } = {}) { - // If there is no active glance, do nothing if (!this.#currentGlanceID || !this.#currentTab) { return; } + this.animatingFullOpen = true; this.#currentTab.setAttribute('zen-dont-split-glance', true); + this.#handleZenFolderPinning(); + gBrowser.moveTabAfter(this.#currentTab, this.#currentParentTab); + + const browserRect = window.windowUtils.getBoundsWithoutFlushing(this.browserWrapper); + this.#prepareTabForFullOpen(); + + const sidebarButtons = this.browserWrapper.querySelector('.zen-glance-sidebar-container'); + if (sidebarButtons) { + sidebarButtons.remove(); + } + + if (forSplit) { + this.finishOpeningGlance(); + return; + } + + if (gReduceMotion) { + gZenViewSplitter.deactivateCurrentSplitView(); + this.finishOpeningGlance(); + return; + } + + await this.#animateFullOpen(browserRect); + this.finishOpeningGlance(); + } + + /** + * Handle Zen folder pinning if applicable + */ + #handleZenFolderPinning() { const isZenFolder = this.#currentParentTab?.group?.isZenFolder; if (Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder') && isZenFolder) { gBrowser.pinTab(this.#currentTab); } + } - gBrowser.moveTabAfter(this.#currentTab, this.#currentParentTab); - - const browserRect = window.windowUtils.getBoundsWithoutFlushing(this.browserWrapper); + /** + * Prepare tab for full opening + */ + #prepareTabForFullOpen() { this.#currentTab.removeAttribute('zen-glance-tab'); - this._clearContainerStyles(this.browserWrapper); + this.#clearContainerStyles(this.browserWrapper); this.#currentTab.removeAttribute('glance-id'); this.#currentParentTab.removeAttribute('glance-id'); gBrowser.selectedTab = this.#currentTab; + this.#currentParentTab.linkedBrowser .closest('.browserSidebarContainer') .classList.remove('zen-glance-background'); this.#currentParentTab._visuallySelected = false; gBrowser.TabStateFlusher.flush(this.#currentTab.linkedBrowser); - const sidebarButtons = this.browserWrapper.querySelector('.zen-glance-sidebar-container'); - if (sidebarButtons) { - sidebarButtons.remove(); - } - if (forSplit) { - this.finishOpeningGlance(); - return; - } - if (gReduceMotion || forSplit) { - gZenViewSplitter.deactivateCurrentSplitView(); - this.finishOpeningGlance(); - return; - } - // Write the styles early to avoid flickering + } + + /** + * Animate the full opening process + * @param {Object} browserRect - The browser rectangle + */ + async #animateFullOpen(browserRect) { + // Write styles early to avoid flickering this.browserWrapper.style.opacity = 1; this.browserWrapper.style.width = `${browserRect.width}px`; this.browserWrapper.style.height = `${browserRect.height}px`; + await gZenUIManager.motion.animate( this.browserWrapper, { @@ -668,67 +1393,114 @@ bounce: 0, } ); + this.browserWrapper.style.width = ''; this.browserWrapper.style.height = ''; this.browserWrapper.style.opacity = ''; gZenViewSplitter.deactivateCurrentSplitView({ removeDeckSelected: true }); - this.finishOpeningGlance(); } + /** + * Open glance for bookmark activation + * @param {Event} event - The bookmark click event + * @returns {boolean} False to prevent default behavior + */ openGlanceForBookmark(event) { const activationMethod = Services.prefs.getStringPref('zen.glance.activation-method', 'ctrl'); - if (activationMethod === 'ctrl' && !event.ctrlKey) { - return; - } else if (activationMethod === 'alt' && !event.altKey) { - return; - } else if (activationMethod === 'shift' && !event.shiftKey) { - return; - } else if (activationMethod === 'meta' && !event.metaKey) { - return; - } else if (activationMethod === 'mantain' || typeof activationMethod === 'undefined') { + if (!this.#isActivationKeyPressed(event, activationMethod)) { return; } event.preventDefault(); event.stopPropagation(); - const rect = event.target.getBoundingClientRect(); - const data = { + const data = this.#createGlanceDataFromBookmark(event); + this.openGlance(data); + + return false; + } + + /** + * Check if the correct activation key is pressed + * @param {Event} event - The event + * @param {string} activationMethod - The activation method + * @returns {boolean} True if key is pressed + */ + #isActivationKeyPressed(event, activationMethod) { + const keyMap = { + ctrl: event.ctrlKey, + alt: event.altKey, + shift: event.shiftKey, + meta: event.metaKey, + }; + + return keyMap[activationMethod] || false; + } + + /** + * Create glance data from bookmark event + * @param {Event} event - The bookmark event + * @returns {Object} Glance data object + */ + #createGlanceDataFromBookmark(event) { + const rect = window.windowUtils.getBoundsWithoutFlushing(event.target); + return { url: event.target._placesNode.uri, clientX: rect.left, clientY: rect.top, width: rect.width, height: rect.height, }; - - this.openGlance(data); - - return false; } + /** + * Get the focused tab based on direction + * @param {number} aDir - Direction (-1 for parent, 1 for current) + * @returns {Tab} The focused tab + */ getFocusedTab(aDir) { return aDir < 0 ? this.#currentParentTab : this.#currentTab; } + /** + * Split the current glance into a split view + */ async splitGlance() { - if (this.#currentGlanceID) { - const currentTab = this.#currentTab; - const currentParentTab = this.#currentParentTab; + if (!this.#currentGlanceID) { + return; + } - const isZenFolder = currentParentTab?.group?.isZenFolder; - if (Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder') && isZenFolder) { - gBrowser.pinTab(currentTab); - } - await this.fullyOpenGlance({ forSplit: true }); - gZenViewSplitter.splitTabs([currentTab, currentParentTab], 'vsep', 1); - const browserContainer = currentTab.linkedBrowser?.closest('.browserSidebarContainer'); - if (!gReduceMotion && browserContainer) { - gZenViewSplitter.animateBrowserDrop(browserContainer); - } + const currentTab = this.#currentTab; + const currentParentTab = this.#currentParentTab; + + this.#handleZenFolderPinningForSplit(currentParentTab); + await this.fullyOpenGlance({ forSplit: true }); + + gZenViewSplitter.splitTabs([currentTab, currentParentTab], 'vsep', 1); + + const browserContainer = currentTab.linkedBrowser?.closest('.browserSidebarContainer'); + if (!gReduceMotion && browserContainer) { + gZenViewSplitter.animateBrowserDrop(browserContainer); } } + /** + * Handle Zen folder pinning for split view + * @param {Tab} parentTab - The parent tab + */ + #handleZenFolderPinningForSplit(parentTab) { + const isZenFolder = parentTab?.group?.isZenFolder; + if (Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder') && isZenFolder) { + gBrowser.pinTab(this.#currentTab); + } + } + + /** + * Get the tab or its glance parent + * @param {Tab} tab - The tab to check + * @returns {Tab} The tab or its parent + */ getTabOrGlanceParent(tab) { if (tab?.hasAttribute('glance-id') && this.#glances) { const parentTab = this.#glances.get(tab.getAttribute('glance-id'))?.parentTab; @@ -739,52 +1511,89 @@ return tab; } + /** + * Check if deck should remain selected + * @param {Element} currentPanel - Current panel + * @param {Element} oldPanel - Previous panel + * @returns {boolean} True if deck should remain selected + */ shouldShowDeckSelected(currentPanel, oldPanel) { - // Dont remove if it's a glance background and current panel corresponds to a glance const currentBrowser = currentPanel?.querySelector('browser'); const oldBrowser = oldPanel?.querySelector('browser'); + if (!currentBrowser || !oldBrowser) { return false; } + const currentTab = gBrowser.getTabForBrowser(currentBrowser); const oldTab = gBrowser.getTabForBrowser(oldBrowser); - if (currentTab && oldTab) { - const currentGlanceID = currentTab.getAttribute('glance-id'); - const oldGlanceID = oldTab.getAttribute('glance-id'); - if (currentGlanceID && oldGlanceID) { - return ( - currentGlanceID === oldGlanceID && oldPanel.classList.contains('zen-glance-background') - ); - } + + if (!currentTab || !oldTab) { + return false; } + + const currentGlanceID = currentTab.getAttribute('glance-id'); + const oldGlanceID = oldTab.getAttribute('glance-id'); + + if (currentGlanceID && oldGlanceID) { + return ( + currentGlanceID === oldGlanceID && oldPanel.classList.contains('zen-glance-background') + ); + } + return false; } + /** + * Handle search select command + * @param {string} where - Where to open the search result + */ onSearchSelectCommand(where) { - // Check if Glance is globally enabled and specifically enabled for contextmenu/search - if ( - !Services.prefs.getBoolPref('zen.glance.enabled', false) || - !Services.prefs.getBoolPref('zen.glance.enable-contextmenu-search', true) - ) { + if (!this.#isGlanceEnabledForSearch()) { return; } + if (where !== 'tab') { return; } + const currentTab = gBrowser.selectedTab; const parentTab = currentTab.owner; + if (!parentTab || parentTab.hasAttribute('glance-id')) { return; } - // Open a new glance if the current tab is a glance tab - const browserRect = gBrowser.tabbox.getBoundingClientRect(); + + this.#openGlanceForSearch(currentTab, parentTab); + } + + /** + * Check if glance is enabled for search + * @returns {boolean} True if enabled + */ + #isGlanceEnabledForSearch() { + return ( + Services.prefs.getBoolPref('zen.glance.enabled', false) && + Services.prefs.getBoolPref('zen.glance.enable-contextmenu-search', true) + ); + } + + /** + * Open glance for search result + * @param {Tab} currentTab - Current tab + * @param {Tab} parentTab - Parent tab + */ + #openGlanceForSearch(currentTab, parentTab) { + const browserRect = window.windowUtils.getBoundsWithoutFlushing(gBrowser.tabbox); + const clickPosition = gZenUIManager._lastClickPosition || { + clientX: browserRect.width / 2, + clientY: browserRect.height / 2, + }; + this.openGlance( { url: undefined, - ...(gZenUIManager._lastClickPosition || { - clientX: browserRect.width / 2, - clientY: browserRect.height / 2, - }), + ...clickPosition, width: 0, height: 0, }, @@ -796,6 +1605,9 @@ window.gZenGlanceManager = new nsZenGlanceManager(); + /** + * Register window actors for glance functionality + */ function registerWindowActors() { gZenActorsManager.addJSWindowActor('ZenGlance', { parent: { diff --git a/src/zen/glance/actors/ZenGlanceChild.sys.mjs b/src/zen/glance/actors/ZenGlanceChild.sys.mjs index c1cb21a6e..d78805321 100644 --- a/src/zen/glance/actors/ZenGlanceChild.sys.mjs +++ b/src/zen/glance/actors/ZenGlanceChild.sys.mjs @@ -2,11 +2,10 @@ // 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/. export class ZenGlanceChild extends JSWindowActorChild { + #activationMethod; + constructor() { super(); - - this.mouseUpListener = this.handleMouseUp.bind(this); - this.mouseDownListener = this.handleMouseDown.bind(this); this.clickListener = this.handleClick.bind(this); } @@ -22,51 +21,34 @@ export class ZenGlanceChild extends JSWindowActorChild { } } - async getActivationMethod() { - if (this._activationMethod === undefined) { - this._activationMethod = await this.sendQuery('ZenGlance:GetActivationMethod'); - } - return this._activationMethod; - } - - async getHoverActivationDelay() { - if (this._hoverActivationDelay === undefined) { - this._hoverActivationDelay = await this.sendQuery('ZenGlance:GetHoverActivationDelay'); - } - return this._hoverActivationDelay; + async #initActivationMethod() { + this.#activationMethod = await this.sendQuery('ZenGlance:GetActivationMethod'); } async initiateGlance() { this.mouseIsDown = false; - const activationMethod = await this.getActivationMethod(); - if (activationMethod === 'mantain') { - this.contentWindow.addEventListener('mousedown', this.mouseDownListener); - this.contentWindow.addEventListener('mouseup', this.mouseUpListener); - - this.contentWindow.document.removeEventListener('click', this.clickListener); - } else if ( - activationMethod === 'ctrl' || - activationMethod === 'alt' || - activationMethod === 'shift' - ) { - this.contentWindow.document.addEventListener('click', this.clickListener, { capture: true }); - - this.contentWindow.removeEventListener('mousedown', this.mouseDownListener); - this.contentWindow.removeEventListener('mouseup', this.mouseUpListener); - } + await this.#initActivationMethod(); + this.contentWindow.document.addEventListener('click', this.clickListener, { capture: true }); } ensureOnlyKeyModifiers(event) { return !(event.ctrlKey ^ event.altKey ^ event.shiftKey ^ event.metaKey); } - openGlance(target) { + openGlance(target, originalTarget) { let url = target.href; // Add domain to relative URLs if (!url.match(/^(?:[a-z]+:)?\/\//i)) { url = this.contentWindow.location.origin + url; } - const rect = target.getBoundingClientRect(); + // Get the largest element we can get. If the `A` element + // is a parent of the original target, use the anchor element, + // otherwise use the original target. + let rect = originalTarget.getBoundingClientRect(); + const anchorRect = target.getBoundingClientRect(); + if (anchorRect.width * anchorRect.height > rect.width * rect.height) { + rect = anchorRect; + } this.sendAsyncMessage('ZenGlance:OpenGlance', { url, clientX: rect.left, @@ -76,35 +58,11 @@ export class ZenGlanceChild extends JSWindowActorChild { }); } - handleMouseUp(event) { - if (this.hasClicked) { - event.preventDefault(); - event.stopPropagation(); - this.hasClicked = false; - } - this.mouseIsDown = null; - } - - async handleMouseDown(event) { - const target = event.target.closest('A'); - if (!target) { - return; - } - this.mouseIsDown = target; - const hoverActivationDelay = await this.getHoverActivationDelay(); - this.contentWindow.setTimeout(() => { - if (this.mouseIsDown === target) { - this.hasClicked = true; - this.openGlance(target); - } - }, hoverActivationDelay); - } - handleClick(event) { if (this.ensureOnlyKeyModifiers(event) || event.button !== 0 || event.defaultPrevented) { return; } - const activationMethod = this._activationMethod; + const activationMethod = this.#activationMethod; if (activationMethod === 'ctrl' && !event.ctrlKey) { return; } else if (activationMethod === 'alt' && !event.altKey) { @@ -113,8 +71,6 @@ export class ZenGlanceChild extends JSWindowActorChild { return; } else if (activationMethod === 'meta' && !event.metaKey) { return; - } else if (activationMethod === 'mantain' || typeof activationMethod === 'undefined') { - return; } // get closest A element const target = event.target.closest('A'); @@ -122,7 +78,7 @@ export class ZenGlanceChild extends JSWindowActorChild { event.preventDefault(); event.stopPropagation(); - this.openGlance(target); + this.openGlance(target, event.originalTarget || event.target); } } diff --git a/src/zen/glance/actors/ZenGlanceParent.sys.mjs b/src/zen/glance/actors/ZenGlanceParent.sys.mjs index b6d5c9b12..0939cd47a 100644 --- a/src/zen/glance/actors/ZenGlanceParent.sys.mjs +++ b/src/zen/glance/actors/ZenGlanceParent.sys.mjs @@ -11,9 +11,6 @@ export class ZenGlanceParent extends JSWindowActorParent { case 'ZenGlance:GetActivationMethod': { return Services.prefs.getStringPref('zen.glance.activation-method', 'ctrl'); } - case 'ZenGlance:GetHoverActivationDelay': { - return Services.prefs.getIntPref('zen.glance.hold-duration', 500); - } case 'ZenGlance:OpenGlance': { this.openGlance(this.browsingContext.topChromeWindow, message.data); break; @@ -31,7 +28,38 @@ export class ZenGlanceParent extends JSWindowActorParent { } } - openGlance(window, data) { + #imageBitmapToBase64(imageBitmap) { + // 1. Create a canvas with the same size as the ImageBitmap + const canvas = this.browsingContext.topChromeWindow.document.createElement('canvas'); + canvas.width = imageBitmap.width; + canvas.height = imageBitmap.height; + + // 2. Draw the ImageBitmap onto the canvas + const ctx = canvas.getContext('2d'); + ctx.drawImage(imageBitmap, 0, 0); + + // 3. Convert the canvas content to a Base64 string (PNG by default) + const base64String = canvas.toDataURL('image/png'); + return base64String; + } + + async openGlance(window, data) { + const win = this.browsingContext.topChromeWindow; + const tabPanels = win.gBrowser.tabpanels; + // Make the rect relative to the tabpanels. We dont do it directly on the + // content process since it does not take into account scroll. This way, we can + // be sure that the coordinates are correct. + const tabPanelsRect = tabPanels.getBoundingClientRect(); + const rect = new DOMRect( + data.clientX + tabPanelsRect.left, + data.clientY + tabPanelsRect.top, + data.width, + data.height + ); + const elementData = await this.#imageBitmapToBase64( + await win.browsingContext.currentWindowGlobal.drawSnapshot(rect, 1, 'transparent', true) + ); + data.elementData = elementData; window.gZenGlanceManager.openGlance(data); } } diff --git a/src/zen/glance/zen-glance.css b/src/zen/glance/zen-glance.css index f59f20b79..55bb59932 100644 --- a/src/zen/glance/zen-glance.css +++ b/src/zen/glance/zen-glance.css @@ -14,11 +14,11 @@ gap: 12px; max-width: 56px; - :root[zen-right-side='true'] & { + :root:not([zen-right-side='true']) & { left: 100%; } - :root:not([zen-right-side='true']) & { + :root[zen-right-side='true'] & { right: 100%; } @@ -99,7 +99,7 @@ } .browserSidebarContainer.zen-glance-background, -.browserSidebarContainer.zen-glance-overlay .browserContainer { +.browserSidebarContainer.zen-glance-overlay .browserContainer:not([fade-out='true']) { border-radius: var(--zen-native-inner-radius); box-shadow: var(--zen-big-shadow); } @@ -116,14 +116,19 @@ } & .browserContainer { - background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32)); + transform: translate(-50%, -50%); position: fixed; - opacity: 0; top: 0; left: 0; flex: unset !important; /* Promote to its own layer during transitions to reduce jank */ - will-change: transform, opacity, top, left, width, height; + will-change: transform, top, left; + width: 85%; + height: 100%; + + &:not([has-finished-animation='true']) #statuspanel { + display: none; + } &[has-finished-animation='true'] { position: relative !important; @@ -140,10 +145,15 @@ } & browser { + background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32)) !important; width: 100%; height: 100%; opacity: 1; - transition: opacity 0.2s ease-in-out; + transition: opacity 0.08s; + + @starting-style { + opacity: 0; + } } &[animate='true'] { @@ -153,8 +163,17 @@ &[fade-out='true'] { & browser { - transition: opacity 0.2s ease; + transition: opacity 0.25s ease-in-out; opacity: 0; } } } + +.zen-glance-element-preview { + position: absolute; + pointer-events: none; + width: 100%; + height: 100%; + z-index: -1; + border-radius: var(--zen-native-inner-radius); +} diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index 2dd3c6424..9e8436691 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -958,10 +958,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { * @returns {Element} The tab browser panel. */ get tabBrowserPanel() { - if (!this._tabBrowserPanel) { - this._tabBrowserPanel = document.getElementById('tabbrowser-tabpanels'); - } - return this._tabBrowserPanel; + return gBrowser.tabpanels; } get splitViewActive() { diff --git a/src/zen/tests/glance/browser.toml b/src/zen/tests/glance/browser.toml index 7f231bbff..6098fbf07 100644 --- a/src/zen/tests/glance/browser.toml +++ b/src/zen/tests/glance/browser.toml @@ -13,3 +13,4 @@ support-files = [ ["browser_glance_next_tab.js"] ["browser_glance_prev_tab.js"] ["browser_glance_select_parent.js"] +["browser_glance_close_select.js"] diff --git a/src/zen/tests/glance/browser_glance_close_select.js b/src/zen/tests/glance/browser_glance_close_select.js new file mode 100644 index 000000000..e073ec53a --- /dev/null +++ b/src/zen/tests/glance/browser_glance_close_select.js @@ -0,0 +1,36 @@ +/* Any copyright is dedicated to the Public Domain. + https://creativecommons.org/publicdomain/zero/1.0/ */ + +'use strict'; + +async function openAndCloseGlance() { + await openGlanceOnTab(async (glanceTab) => { + ok( + glanceTab.hasAttribute('zen-glance-tab'), + 'The glance tab should have the zen-glance-tab attribute' + ); + }); +} + +add_task(async function test_Glance_Close_No_Tabs() { + const currentTab = gBrowser.selectedTab; + await openAndCloseGlance(); + Assert.equal(gBrowser.selectedTab, currentTab, 'The original tab should be selected'); + ok(currentTab.selected, 'The original tab should be visually selected'); +}); + +add_task(async function test_Glance_Close_With_Next_Tab() { + const originalTab = gBrowser.selectedTab; + await BrowserTestUtils.withNewTab( + { url: 'http://example.com', gBrowser, waitForLoad: false }, + async function () { + const selectedTab = gBrowser.selectedTab; + Assert.notEqual(selectedTab, originalTab, 'A new tab should be selected'); + await openAndCloseGlance(); + Assert.equal(gBrowser.selectedTab, selectedTab, 'The new tab should still be selected'); + ok(selectedTab.selected, 'The new tab should be visually selected'); + + gBrowser.selectedTab = originalTab; + } + ); +}); diff --git a/src/zen/tests/ignorePrefs.json b/src/zen/tests/ignorePrefs.json index 25c2cf37a..b7244e654 100644 --- a/src/zen/tests/ignorePrefs.json +++ b/src/zen/tests/ignorePrefs.json @@ -1,6 +1,14 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// 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/. +// +// This file lists preferences that are ignored when running mochitests. +// Add here any preference that is not relevant for testing Zen Modus. +// This prevents unnecessary test re-runs when these preferences are changed. [ "zen.mods.updated-value-observer", "zen.mods.last-update", "zen.view.compact.enable-at-startup", + "zen.urlbar.suggestions-learner", "browser.newtabpage.activity-stream.trendingSearch.defaultSearchEngine" ] From 2dd185288d2e5bfa3840989078bca3f5dd2c07b9 Mon Sep 17 00:00:00 2001 From: alightsoulmate <2314297572@qq.com> Date: Mon, 6 Oct 2025 01:00:19 +0800 Subject: [PATCH 033/111] Fix: Unexpected Spelling in Theme Configuration Page, p=#10696 Co-authored-by: Mr. M --- prefs/theme.yaml | 2 +- src/zen/common/ZenUIMigration.sys.mjs | 10 +++++++++- src/zen/workspaces/ZenGradientGenerator.mjs | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/prefs/theme.yaml b/prefs/theme.yaml index d4b51666d..2a654d17b 100644 --- a/prefs/theme.yaml +++ b/prefs/theme.yaml @@ -26,7 +26,7 @@ - name: zen.theme.disable-lightweight value: true -- name: zen.theme.use-sysyem-colors +- name: zen.theme.use-system-colors value: false - name: zen.theme.hide-tab-throbber diff --git a/src/zen/common/ZenUIMigration.sys.mjs b/src/zen/common/ZenUIMigration.sys.mjs index 18c3f6ca5..52fba005d 100644 --- a/src/zen/common/ZenUIMigration.sys.mjs +++ b/src/zen/common/ZenUIMigration.sys.mjs @@ -6,7 +6,7 @@ const { AppConstants } = ChromeUtils.importESModule('resource://gre/modules/AppC class nsZenUIMigration { PREF_NAME = 'zen.ui.migration.version'; - MIGRATION_VERSION = 3; + MIGRATION_VERSION = 4; init(isNewProfile) { if (!isNewProfile) { @@ -77,6 +77,14 @@ class nsZenUIMigration { Services.prefs.setStringPref('zen.theme.accent-color', '#ffb787'); } } + + _migrateV4() { + // Fix spelling mistake in preference name + Services.prefs.setBoolPref( + 'zen.theme.use-system-colors', + Services.prefs.getBoolPref('zen.theme.use-sysyem-colors', false) + ); + } } export var gZenUIMigration = new nsZenUIMigration(); diff --git a/src/zen/workspaces/ZenGradientGenerator.mjs b/src/zen/workspaces/ZenGradientGenerator.mjs index fdb6661da..f08aee8ee 100644 --- a/src/zen/workspaces/ZenGradientGenerator.mjs +++ b/src/zen/workspaces/ZenGradientGenerator.mjs @@ -1192,7 +1192,7 @@ } shouldBeDarkMode(accentColor) { - if (Services.prefs.getBoolPref('zen.theme.use-sysyem-colors')) { + if (Services.prefs.getBoolPref('zen.theme.use-system-colors')) { return this.isDarkMode; } From 0feb6ac3f96766a562c4a94dca49357d01f20441 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 5 Oct 2025 19:14:15 +0200 Subject: [PATCH 034/111] fix: Fixed omnibox not appearing on fullscreen, b=closes #5229, c=common --- .../urlbar/UrlbarInput-sys-mjs.patch | 58 ++++++++++++------- src/zen/common/styles/zen-omnibox.css | 2 + 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch b/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch index 91f5a08ac..59089ed3a 100644 --- a/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs -index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079774eed27 100644 +index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e235161f625 100644 --- a/browser/components/urlbar/UrlbarInput.sys.mjs +++ b/browser/components/urlbar/UrlbarInput.sys.mjs @@ -74,6 +74,13 @@ ChromeUtils.defineLazyGetter(lazy, "logger", () => @@ -75,11 +75,25 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 } if (isCanonized) { -@@ -2205,6 +2237,12 @@ export class UrlbarInput { +@@ -2191,6 +2223,13 @@ export class UrlbarInput { + await this.#updateLayoutBreakoutDimensions(); + } + ++ get zenUrlbarBehavior() { ++ if (this.document.documentElement.hasAttribute("inDOMFullscreen")) { ++ return "float"; ++ } ++ return lazy.ZEN_URLBAR_BEHAVIOR; ++ } ++ + startLayoutExtend() { + if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) { + // Do not expand if the Urlbar does not support being expanded or it is +@@ -2205,6 +2244,12 @@ export class UrlbarInput { this.setAttribute("breakout-extend", "true"); -+ if (lazy.ZEN_URLBAR_BEHAVIOR == 'float' || (lazy.ZEN_URLBAR_BEHAVIOR == 'floating-on-type' && !this.focusedViaMousedown)) { ++ if (this.zenUrlbarBehavior == 'float' || (this.zenUrlbarBehavior == 'floating-on-type' && !this.focusedViaMousedown)) { + this.setAttribute("zen-floating-urlbar", "true"); + this.window.gZenUIManager.onFloatingURLBarOpen(); + } else { @@ -88,7 +102,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 // Enable the animation only after the first extend call to ensure it // doesn't run when opening a new window. if (!this.hasAttribute("breakout-extend-animate")) { -@@ -2224,6 +2262,24 @@ export class UrlbarInput { +@@ -2224,6 +2269,24 @@ export class UrlbarInput { return; } @@ -113,7 +127,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 this.removeAttribute("breakout-extend"); this.#updateTextboxPosition(); } -@@ -2553,7 +2609,7 @@ export class UrlbarInput { +@@ -2553,7 +2616,7 @@ export class UrlbarInput { this.textbox.parentNode.style.setProperty( "--urlbar-container-height", @@ -122,7 +136,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 ); this.textbox.style.setProperty( "--urlbar-height", -@@ -2986,6 +3042,7 @@ export class UrlbarInput { +@@ -2986,6 +3049,7 @@ export class UrlbarInput { } _toggleActionOverride(event) { @@ -130,7 +144,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 if ( event.keyCode == KeyEvent.DOM_VK_SHIFT || event.keyCode == KeyEvent.DOM_VK_ALT || -@@ -3087,7 +3144,7 @@ export class UrlbarInput { +@@ -3087,7 +3151,7 @@ export class UrlbarInput { */ _trimValue(val) { let trimmedValue = lazy.UrlbarPrefs.get("trimURLs") @@ -139,7 +153,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 : val; // Only trim value if the directionality doesn't change to RTL and we're not // showing a strikeout https protocol. -@@ -3303,6 +3360,7 @@ export class UrlbarInput { +@@ -3303,6 +3367,7 @@ export class UrlbarInput { resultDetails = null, browser = this.window.gBrowser.selectedBrowser ) { @@ -147,7 +161,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 // No point in setting these because we'll handleRevert() a few rows below. if (openUILinkWhere == "current") { // Make sure URL is formatted properly (don't show punycode). -@@ -3455,6 +3513,10 @@ export class UrlbarInput { +@@ -3455,6 +3520,10 @@ export class UrlbarInput { } reuseEmpty = true; } @@ -158,7 +172,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 if ( where == "tab" && reuseEmpty && -@@ -3462,6 +3524,9 @@ export class UrlbarInput { +@@ -3462,6 +3531,9 @@ export class UrlbarInput { ) { where = "current"; } @@ -168,7 +182,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 return where; } -@@ -3719,6 +3784,7 @@ export class UrlbarInput { +@@ -3719,6 +3791,7 @@ export class UrlbarInput { this.setResultForCurrentValue(null); this.handleCommand(); this.controller.clearLastQueryContextCache(); @@ -176,7 +190,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 this._suppressStartQuery = false; }); -@@ -3726,7 +3792,6 @@ export class UrlbarInput { +@@ -3726,7 +3799,6 @@ export class UrlbarInput { contextMenu.addEventListener("popupshowing", () => { // Close the results pane when the input field contextual menu is open, // because paste and go doesn't want a result selection. @@ -184,7 +198,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 let controller = this.document.commandDispatcher.getControllerForCommand("cmd_paste"); -@@ -3836,7 +3901,11 @@ export class UrlbarInput { +@@ -3836,7 +3908,11 @@ export class UrlbarInput { if (!engineName && !source && !this.hasAttribute("searchmode")) { return; } @@ -197,7 +211,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 this._searchModeIndicatorTitle.textContent = ""; this._searchModeIndicatorTitle.removeAttribute("data-l10n-id"); -@@ -4130,6 +4199,7 @@ export class UrlbarInput { +@@ -4130,6 +4206,7 @@ export class UrlbarInput { this.document.l10n.setAttributes( this.inputField, @@ -205,7 +219,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 l10nId, l10nId == "urlbar-placeholder-with-name" ? { name } : undefined ); -@@ -4241,6 +4311,11 @@ export class UrlbarInput { +@@ -4241,6 +4318,11 @@ export class UrlbarInput { } _on_click(event) { @@ -217,7 +231,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 if ( event.target == this.inputField || event.target == this._inputContainer -@@ -4311,7 +4386,7 @@ export class UrlbarInput { +@@ -4311,7 +4393,7 @@ export class UrlbarInput { } } @@ -226,7 +240,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 this.view.autoOpen({ event }); } else { if (this._untrimOnFocusAfterKeydown) { -@@ -4351,9 +4426,16 @@ export class UrlbarInput { +@@ -4351,9 +4433,16 @@ export class UrlbarInput { } _on_mousedown(event) { @@ -235,16 +249,16 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 case this.textbox: { this._mousedownOnUrlbarDescendant = true; + const isProbablyFloating = -+ (lazy.ZEN_URLBAR_BEHAVIOR == "floating-on-type" && ++ (this.zenUrlbarBehavior == "floating-on-type" && + this.hasAttribute("breakout-extend") && !this.focusedViaMousedown) || -+ (lazy.ZEN_URLBAR_BEHAVIOR == "float") || this.window.gZenVerticalTabsManager._hasSetSingleToolbar; ++ (this.zenUrlbarBehavior == "float") || this.window.gZenVerticalTabsManager._hasSetSingleToolbar; + if (event.type != "click" && isProbablyFloating || event.type == "click" && !isProbablyFloating) { + return true; + } if ( event.target != this.inputField && -@@ -4364,6 +4446,10 @@ export class UrlbarInput { +@@ -4364,6 +4453,10 @@ export class UrlbarInput { this.focusedViaMousedown = !this.focused; this._preventClickSelectsAll = this.focused; @@ -255,7 +269,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 // Keep the focus status, since the attribute may be changed // upon calling this.focus(). -@@ -4399,7 +4485,7 @@ export class UrlbarInput { +@@ -4399,7 +4492,7 @@ export class UrlbarInput { } // Don't close the view when clicking on a tab; we may want to keep the // view open on tab switch, and the TabSelect event arrived earlier. @@ -264,7 +278,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079 break; } -@@ -4716,7 +4802,7 @@ export class UrlbarInput { +@@ -4716,7 +4809,7 @@ export class UrlbarInput { // When we are in actions search mode we can show more results so // increase the limit. let maxResults = diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 377688fc0..13c9acc24 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -29,6 +29,8 @@ &[breakout-extend='true'] { --urlbar-container-padding: 0px; + /* See issue https://github.com/zen-browser/desktop/issues/5229 */ + visibility: visible; } :root[zen-single-toolbar='true'] &[breakout-extend='true'], From 9bf8bd97b2e47b38436185443bf649ba4f1ca5e1 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 5 Oct 2025 23:45:32 +0200 Subject: [PATCH 035/111] feat: Always show new site data popup, b=no-bug, c=glance --- .../base/content/browser-addons-js.patch | 25 +++++++++++++------ .../base/content/zen-panels/site-data.inc | 3 +-- src/browser/themes/shared/zen-icons/icons.css | 5 ++++ src/zen/glance/zen-glance.css | 22 +++++++++------- src/zen/urlbar/ZenSiteDataPanel.sys.mjs | 17 +++++++++++++ 5 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/browser/base/content/browser-addons-js.patch b/src/browser/base/content/browser-addons-js.patch index 71135dc45..0264323c8 100644 --- a/src/browser/base/content/browser-addons-js.patch +++ b/src/browser/base/content/browser-addons-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js -index d7542a38a0242dd9c9c6390171d59992d75a0c19..baa5d84c26f7e74c779bc7e1a2b83b543b413441 100644 +index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..29864ab59819271b7319b273c08bdc2736d40c93 100644 --- a/browser/base/content/browser-addons.js +++ b/browser/base/content/browser-addons.js -@@ -1064,7 +1064,7 @@ var gXPInstallObserver = { +@@ -1071,7 +1071,7 @@ var gXPInstallObserver = { persistent: true, hideClose: true, popupOptions: { @@ -11,7 +11,7 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..baa5d84c26f7e74c779bc7e1a2b83b54 }, }; -@@ -1273,7 +1273,7 @@ var gXPInstallObserver = { +@@ -1280,7 +1280,7 @@ var gXPInstallObserver = { hideClose: true, timeout: Date.now() + 30000, popupOptions: { @@ -20,7 +20,7 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..baa5d84c26f7e74c779bc7e1a2b83b54 }, }; -@@ -2205,7 +2205,7 @@ var gUnifiedExtensions = { +@@ -2212,7 +2212,7 @@ var gUnifiedExtensions = { // If the new ID is not added in NOTIFICATION_IDS, consider handling the case // in the "PopupNotificationsBeforeAnchor" handler elsewhere in this file. getPopupAnchorID(aBrowser, aWindow) { @@ -29,7 +29,7 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..baa5d84c26f7e74c779bc7e1a2b83b54 const attr = anchorID + "popupnotificationanchor"; if (!aBrowser[attr]) { -@@ -2216,7 +2216,7 @@ var gUnifiedExtensions = { +@@ -2223,7 +2223,7 @@ var gUnifiedExtensions = { anchorID // Anchor on the toolbar icon to position the popup right below the // button. @@ -38,7 +38,7 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..baa5d84c26f7e74c779bc7e1a2b83b54 } return anchorID; -@@ -2509,11 +2509,7 @@ var gUnifiedExtensions = { +@@ -2516,11 +2516,7 @@ var gUnifiedExtensions = { // Lazy load the unified-extensions-panel panel the first time we need to // display it. if (!this._panel) { @@ -51,7 +51,16 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..baa5d84c26f7e74c779bc7e1a2b83b54 let customizationArea = this._panel.querySelector( "#unified-extensions-area" ); -@@ -2608,7 +2604,7 @@ var gUnifiedExtensions = { +@@ -2570,7 +2566,7 @@ var gUnifiedExtensions = { + + // The button should directly open `about:addons` when the user does not + // have any active extensions listed in the unified extensions panel. +- if (!this.hasExtensionsInPanel()) { ++ if (!this.hasExtensionsInPanel() && false) { + let viewID; + if ( + Services.prefs.getBoolPref("extensions.getAddons.showPane", true) && +@@ -2615,7 +2611,7 @@ var gUnifiedExtensions = { this.recordButtonTelemetry(reason || "extensions_panel_showing"); this.ensureButtonShownBeforeAttachingPanel(panel); PanelMultiView.openPopup(panel, this._button, { @@ -60,7 +69,7 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..baa5d84c26f7e74c779bc7e1a2b83b54 triggerEvent: aEvent, }); } -@@ -2795,18 +2791,20 @@ var gUnifiedExtensions = { +@@ -2802,18 +2798,20 @@ var gUnifiedExtensions = { this._maybeMoveWidgetNodeBack(widgetId); } diff --git a/src/browser/base/content/zen-panels/site-data.inc b/src/browser/base/content/zen-panels/site-data.inc index e5a774b88..dab190c80 100644 --- a/src/browser/base/content/zen-panels/site-data.inc +++ b/src/browser/base/content/zen-panels/site-data.inc @@ -17,8 +17,7 @@ + flex="1" /> diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index 8dff5e399..d9fb761ec 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -471,6 +471,11 @@ } /* permissions */ + +#zen-site-data-icon-button { + display: flex !important; +} + #identity-permission-box, #identity-box:not([pageproxystate='invalid']) #identity-icon-box, #identity-box[pageproxystate='invalid'] #zen-site-data-icon-button { diff --git a/src/zen/glance/zen-glance.css b/src/zen/glance/zen-glance.css index 55bb59932..81dbd5445 100644 --- a/src/zen/glance/zen-glance.css +++ b/src/zen/glance/zen-glance.css @@ -98,10 +98,13 @@ --zen-element-separation: 6px; } +.browserSidebarContainer.zen-glance-background { + box-shadow: var(--zen-big-shadow); +} + .browserSidebarContainer.zen-glance-background, .browserSidebarContainer.zen-glance-overlay .browserContainer:not([fade-out='true']) { border-radius: var(--zen-native-inner-radius); - box-shadow: var(--zen-big-shadow); } .browserSidebarContainer.zen-glance-overlay { @@ -142,12 +145,7 @@ & .browserStack { border-radius: var(--zen-native-inner-radius); overflow: hidden; - } - - & browser { - background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32)) !important; - width: 100%; - height: 100%; + box-shadow: var(--zen-big-shadow); opacity: 1; transition: opacity 0.08s; @@ -156,14 +154,20 @@ } } + & browser { + background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32)) !important; + width: 100%; + height: 100%; + } + &[animate='true'] { position: absolute; } } &[fade-out='true'] { - & browser { - transition: opacity 0.25s ease-in-out; + & .browserStack { + transition: opacity 0.2s ease-in-out; opacity: 0; } } diff --git a/src/zen/urlbar/ZenSiteDataPanel.sys.mjs b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs index aebbfc657..129842c8b 100644 --- a/src/zen/urlbar/ZenSiteDataPanel.sys.mjs +++ b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs @@ -357,6 +357,23 @@ export class nsZenSiteDataPanel { this.window.BookmarkingUI.onStarCommand(event); break; } + case 'zen-site-data-header-share': { + if (Services.zen.canShare()) { + const buttonRect = event.target.getBoundingClientRect(); + const currentUrl = this.window.gBrowser.currentURI; + Services.zen.share( + currentUrl, + '', + '', + buttonRect.left, + this.window.innerHeight - buttonRect.bottom, + buttonRect.width, + buttonRect.height + ); + } else { + this.window.gZenCommonActions.copyCurrentURLToClipboard(); + } + } } } From d6ac283388290c419a779c0cc49fe5b51234ae41 Mon Sep 17 00:00:00 2001 From: atharva kamble <60008419+athkdev@users.noreply.github.com> Date: Sun, 5 Oct 2025 17:55:29 -0400 Subject: [PATCH 036/111] feat: Unload a workspace context menu, p=#10688 Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> --- .../en-US/browser/browser/zen-workspaces.ftl | 3 +++ .../base/content/zen-commands.inc.xhtml | 1 + .../base/content/zen-panels/popups.inc | 1 + src/zen/common/zen-sets.js | 4 ++++ src/zen/workspaces/ZenWorkspaces.mjs | 20 +++++++++++++++++++ 5 files changed, 29 insertions(+) diff --git a/locales/en-US/browser/browser/zen-workspaces.ftl b/locales/en-US/browser/browser/zen-workspaces.ftl index 5b6452475..0933f225c 100644 --- a/locales/en-US/browser/browser/zen-workspaces.ftl +++ b/locales/en-US/browser/browser/zen-workspaces.ftl @@ -23,6 +23,9 @@ zen-workspaces-panel-change-icon = zen-workspaces-panel-context-default-profile = .label = Set Profile +zen-workspaces-panel-unload = + .label = Unload Space + zen-workspaces-how-to-reorder-title = How to reorder spaces zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them diff --git a/src/browser/base/content/zen-commands.inc.xhtml b/src/browser/base/content/zen-commands.inc.xhtml index 25db87158..d1cbacd7a 100644 --- a/src/browser/base/content/zen-commands.inc.xhtml +++ b/src/browser/base/content/zen-commands.inc.xhtml @@ -39,6 +39,7 @@ + diff --git a/src/browser/base/content/zen-panels/popups.inc b/src/browser/base/content/zen-panels/popups.inc index cdada5655..d94f76ae0 100644 --- a/src/browser/base/content/zen-panels/popups.inc +++ b/src/browser/base/content/zen-panels/popups.inc @@ -25,6 +25,7 @@ hide-if-usercontext-disabled="true"> + diff --git a/src/zen/common/zen-sets.js b/src/zen/common/zen-sets.js index 4609d2e76..e9ca4b8bc 100644 --- a/src/zen/common/zen-sets.js +++ b/src/zen/common/zen-sets.js @@ -122,6 +122,10 @@ document.addEventListener( } break; } + case 'cmd_zenUnloadWorkspace': { + gZenWorkspaces.unloadWorkspace(); + break; + } default: gZenGlanceManager.handleMainCommandSet(event); if (event.target.id.startsWith('cmd_zenWorkspaceSwitch')) { diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 708ac626e..41e983f70 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -1479,6 +1479,26 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { }); } + async unloadWorkspace() { + const workspaceId = this.#contextMenuData?.workspaceId || this.activeWorkspace; + + const tabsToUnload = this.allStoredTabs.filter( + (tab) => + tab.getAttribute('zen-workspace-id') === workspaceId && + !tab.hasAttribute('zen-empty-tab') && + !tab.hasAttribute('zen-essential') && + !tab.hasAttribute('pending') + ); + + if (tabsToUnload.length === 0) { + return; + } + + this.log('Unloading workspace', workspaceId); + + await gBrowser.explicitUnloadTabs(tabsToUnload); // TODO: unit test this + } + moveTabToWorkspace(tab, workspaceID) { return this.moveTabsToWorkspace([tab], workspaceID); } From 0a8fe6d7baa20d7d0b1b87400d1022a72938cfc4 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Mon, 6 Oct 2025 00:22:53 +0200 Subject: [PATCH 037/111] feat: Move the site data button to the end, b=no-bug, c=common --- src/zen/common/styles/zen-omnibox.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index b9af5bc35..5349e8b57 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -254,7 +254,7 @@ #urlbar:not([breakout-extend='true']) { #identity-box:not([pageproxystate='invalid']) { - order: 2; + order: 9; } } From 856d6f523a9b4865316fa60f074548ee26fed607 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Mon, 6 Oct 2025 00:46:34 +0200 Subject: [PATCH 038/111] fix: Fixed collapsed sidebar in compact mode not showing tabs, b=no-bug, c=glance, tabs, workspaces --- src/zen/glance/ZenGlanceManager.mjs | 3 +++ src/zen/tabs/zen-tabs/vertical-tabs.css | 7 ++----- src/zen/workspaces/ZenWorkspaces.mjs | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs index de653c244..949844619 100644 --- a/src/zen/glance/ZenGlanceManager.mjs +++ b/src/zen/glance/ZenGlanceManager.mjs @@ -623,6 +623,9 @@ browserElement.style.minWidth = ''; browserElement.style.minHeight = ''; + this.browserWrapper.style.height = '100%'; + this.browserWrapper.style.width = '85%'; + gBrowser.tabContainer._invalidateCachedTabs(); this.overlay.style.removeProperty('overflow'); this.browserWrapper.removeAttribute('animate'); diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index c75b7896d..809401417 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -20,7 +20,8 @@ width: 100%; } -#pinned-drop-indicator { +#pinned-drop-indicator, +#drag-to-pin-promo-card { /* We dont use this firefox feature */ display: none !important; } @@ -62,10 +63,6 @@ margin-right: calc(-1 * var(--zen-toolbox-padding)); } } - - #tabbrowser-arrowscrollbox { - min-height: fit-content !important; - } } :root[zen-window-buttons-reversed='true'] .titlebar-buttonbox-container { diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 41e983f70..96a28a1c6 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -1496,7 +1496,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { this.log('Unloading workspace', workspaceId); - await gBrowser.explicitUnloadTabs(tabsToUnload); // TODO: unit test this + await gBrowser.explicitUnloadTabs(tabsToUnload); // TODO: unit test this } moveTabToWorkspace(tab, workspaceID) { From d0fb8aea03fb5ae6811d064608bf96d4ea55cc5f Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Mon, 6 Oct 2025 01:05:48 +0200 Subject: [PATCH 039/111] feat: Increase the size of toolbar buttons, b=no-bug, c=common, workspaces --- src/zen/common/styles/zen-single-components.css | 2 +- src/zen/workspaces/ZenWorkspaces.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 9e893f546..02169605c 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -177,7 +177,7 @@ body > #confetti { #zen-sidebar-foot-buttons & { --tab-border-radius: 6px; --toolbarbutton-border-radius: var(--tab-border-radius); - --toolbarbutton-inner-padding: 6px; + --toolbarbutton-inner-padding: 7px; --toolbarbutton-outer-padding: 2px; } diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 96a28a1c6..e2a0c31c4 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -3038,7 +3038,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { parent.removeAttribute('icons-overflow'); return; } - const maxButtonSize = 28; // IMPORTANT: This should match the CSS size of the icons + const maxButtonSize = 30; // IMPORTANT: This should match the CSS size of the icons const minButtonSize = 15; const separation = 3; // Space between icons From 9f42abf789d7faaf2b4bbfde89a22aa8aafc71cd Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Tue, 7 Oct 2025 01:06:16 +0200 Subject: [PATCH 040/111] feat: Restore top toolbar compact mode, b=no-bug, c=tabs, compact-mode, common --- .../browser/preferences/zen-preferences.ftl | 6 +- locales/en-US/browser/browser/zen-general.ftl | 1 + .../browser/browser/zen-vertical-tabs.ftl | 8 + prefs/compact-mode.yaml | 6 + .../base/content/zen-panels/site-data.inc | 3 +- src/browser/themes/shared/zen-icons/icons.css | 2 +- src/zen/common/ZenCustomizableUI.sys.mjs | 3 +- src/zen/common/ZenUIManager.mjs | 3 +- src/zen/common/styles/zen-browser-ui.css | 7 + src/zen/common/styles/zen-theme.css | 4 + src/zen/compact-mode/ZenCompactMode.mjs | 74 ++++- src/zen/compact-mode/sidebar.inc.css | 265 ++++++++++++++++ src/zen/compact-mode/toolbar.inc.css | 84 ++++++ src/zen/compact-mode/zen-compact-mode.css | 282 ++---------------- src/zen/tabs/zen-tabs/vertical-tabs.css | 13 +- src/zen/urlbar/ZenSiteDataPanel.sys.mjs | 5 + 16 files changed, 481 insertions(+), 285 deletions(-) create mode 100644 src/zen/compact-mode/sidebar.inc.css create mode 100644 src/zen/compact-mode/toolbar.inc.css diff --git a/locales/en-US/browser/browser/preferences/zen-preferences.ftl b/locales/en-US/browser/browser/preferences/zen-preferences.ftl index 1c2d18229..6d400ca0e 100644 --- a/locales/en-US/browser/browser/preferences/zen-preferences.ftl +++ b/locales/en-US/browser/browser/preferences/zen-preferences.ftl @@ -8,9 +8,9 @@ zen-warning-language = Changing the default language could make it easier for We zen-vertical-tabs-layout-header = Browser Layout zen-vertical-tabs-layout-description = Choose the layout that suits you best -zen-layout-single-toolbar = Single toolbar -zen-layout-multiple-toolbar = Multiple toolbars -zen-layout-collapsed-toolbar = Collapsed toolbar +zen-layout-single-toolbar = Only Sidebar +zen-layout-multiple-toolbar = Sidebar and Top Toolbar +zen-layout-collapsed-toolbar = Collapsed Sidebar sync-currently-syncing-workspaces = Workspaces sync-engine-workspaces = diff --git a/locales/en-US/browser/browser/zen-general.ftl b/locales/en-US/browser/browser/zen-general.ftl index 77f8a014b..4772e428b 100644 --- a/locales/en-US/browser/browser/zen-general.ftl +++ b/locales/en-US/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-library-sidebar-mods = .label = Mods zen-toggle-compact-mode-button = + .label = Compact Mode .tooltiptext = Toggle Compact Mode # note: Do not translate the "
" tags in the following string diff --git a/locales/en-US/browser/browser/zen-vertical-tabs.ftl b/locales/en-US/browser/browser/zen-vertical-tabs.ftl index 3b4975bb6..55e88d913 100644 --- a/locales/en-US/browser/browser/zen-vertical-tabs.ftl +++ b/locales/en-US/browser/browser/zen-vertical-tabs.ftl @@ -6,6 +6,14 @@ zen-toolbar-context-tabs-right = zen-toolbar-context-compact-mode-enable = .label = Enable compact mode .accesskey = D +zen-toolbar-context-compact-mode-just-tabs = + .label = Hide sidebar +zen-toolbar-context-compact-mode-just-toolbar = + .label = Hide toolbar +zen-toolbar-context-compact-mode-hide-both = + .label = Hide both + .accesskey = H + zen-toolbar-context-new-folder = .label = New Folder .accesskey = N diff --git a/prefs/compact-mode.yaml b/prefs/compact-mode.yaml index 8e8003411..f48e2d8cd 100644 --- a/prefs/compact-mode.yaml +++ b/prefs/compact-mode.yaml @@ -2,6 +2,12 @@ # 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/. +- name: zen.view.compact.hide-tabbar + value: true + +- name: zen.view.compact.hide-toolbar + value: false + - name: zen.view.compact.toolbar-flash-popup value: false diff --git a/src/browser/base/content/zen-panels/site-data.inc b/src/browser/base/content/zen-panels/site-data.inc index dab190c80..e5a774b88 100644 --- a/src/browser/base/content/zen-panels/site-data.inc +++ b/src/browser/base/content/zen-panels/site-data.inc @@ -17,7 +17,8 @@ + flex="1" + closemenu="none" /> diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index d9fb761ec..7e1db475b 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -56,7 +56,7 @@ #sidebar-button:-moz-locale-dir(ltr):not([positionend]), #sidebar-button:-moz-locale-dir(rtl)[positionend], #zen-toggle-compact-mode { - list-style-image: url('chrome://browser/skin/sidebars.svg') !important; + list-style-image: url('sidebar.svg') !important; } #downloads-button, diff --git a/src/zen/common/ZenCustomizableUI.sys.mjs b/src/zen/common/ZenCustomizableUI.sys.mjs index 329eb2e8f..d667fd39c 100644 --- a/src/zen/common/ZenCustomizableUI.sys.mjs +++ b/src/zen/common/ZenCustomizableUI.sys.mjs @@ -70,7 +70,8 @@ export var ZenCustomizableUI = new (class { + data-l10n-id="zen-toggle-compact-mode-button" + removable="true" /> diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs index a23c0cf0a..dd54457be 100644 --- a/src/zen/common/ZenUIManager.mjs +++ b/src/zen/common/ZenUIManager.mjs @@ -1049,7 +1049,7 @@ var gZenVerticalTabsManager = { topButtons.prepend(windowButtons); } - if (!isSingleToolbar && isCompactMode) { + if ((!isSingleToolbar && isCompactMode) || !isSidebarExpanded) { navBar.prepend(topButtons); } @@ -1091,6 +1091,7 @@ var gZenVerticalTabsManager = { appContentNavbarContaienr.append(windowButtons); } + gZenCompactModeManager.updateCompactModeContext(isSingleToolbar); this.recalculateURLBarHeight(); // Always move the splitter next to the sidebar diff --git a/src/zen/common/styles/zen-browser-ui.css b/src/zen/common/styles/zen-browser-ui.css index c542eccd4..43bd6ab0a 100644 --- a/src/zen/common/styles/zen-browser-ui.css +++ b/src/zen/common/styles/zen-browser-ui.css @@ -311,3 +311,10 @@ opacity: 1; } } + +#zen-appcontent-navbar-wrapper #zen-sidebar-top-buttons { + max-width: fit-content; + :root[zen-right-side='true'] & { + order: 999; + } +} diff --git a/src/zen/common/styles/zen-theme.css b/src/zen/common/styles/zen-theme.css index dbae226d9..40118cbff 100644 --- a/src/zen/common/styles/zen-theme.css +++ b/src/zen/common/styles/zen-theme.css @@ -210,6 +210,10 @@ --zen-workspace-indicator-height: 46px; + &:not([zen-sidebar-expanded='true']) { + --zen-workspace-indicator-height: 38px; + } + --toolbar-field-color: var(--toolbox-textcolor) !important; &[zen-private-window='true'] { diff --git a/src/zen/compact-mode/ZenCompactMode.mjs b/src/zen/compact-mode/ZenCompactMode.mjs index 619e5e051..021981169 100644 --- a/src/zen/compact-mode/ZenCompactMode.mjs +++ b/src/zen/compact-mode/ZenCompactMode.mjs @@ -174,12 +174,60 @@ var gZenCompactModeManager = { addContextMenu() { const fragment = window.MozXULElement.parseXULToFragment(` - + + + + + + + + + `); + + const idToAction = { + 'zen-context-menu-compact-mode-hide-sidebar': this.hideSidebar.bind(this), + 'zen-context-menu-compact-mode-hide-toolbar': this.hideToolbar.bind(this), + 'zen-context-menu-compact-mode-hide-both': this.hideBoth.bind(this), + }; + + for (let menuitem of fragment.querySelectorAll('menuitem')) { + if (menuitem.id in idToAction) { + menuitem.addEventListener('command', idToAction[menuitem.id]); + } + } + document.getElementById('viewToolbarsMenuSeparator').before(fragment); this.updateContextMenu(); }, + updateCompactModeContext(isSingleToolbar) { + const menuitem = document.getElementById('zen-context-menu-compact-mode-toggle'); + const menu = document.getElementById('zen-context-menu-compact-mode'); + if (isSingleToolbar) { + menu.setAttribute('hidden', 'true'); + menu.before(menuitem); + } else { + menu.removeAttribute('hidden'); + menu.querySelector('menupopup').prepend(menuitem); + } + }, + + hideSidebar() { + Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); + Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false); + }, + + hideToolbar() { + Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); + Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', false); + }, + + hideBoth() { + Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); + Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); + }, + addEventListener(callback) { this._evenListeners.push(callback); }, @@ -247,6 +295,13 @@ var gZenCompactModeManager = { return sidebarWidth; }, + get canHideSidebar() { + return ( + Services.prefs.getBoolPref('zen.view.compact.hide-tabbar') || + gZenVerticalTabsManager._hasSetSingleToolbar + ); + }, + animateCompactMode() { // Get the splitter width before hiding it (we need to hide it before animating on right) document.documentElement.setAttribute('zen-compact-animating', 'true'); @@ -256,6 +311,7 @@ var gZenCompactModeManager = { .getElementById('zen-sidebar-splitter') .getBoundingClientRect().width; const isCompactMode = this.preference; + const canHideSidebar = this.canHideSidebar; let canAnimate = lazyCompactMode.COMPACT_MODE_CAN_ANIMATE_SIDEBAR && !this.isSidebarPotentiallyOpen(); if (typeof this._wasInCompactMode !== 'undefined') { @@ -286,7 +342,7 @@ var gZenCompactModeManager = { resolve(); return; } - if (isCompactMode) { + if (canHideSidebar && isCompactMode) { if (document.documentElement.hasAttribute('zen-sidebar-expanded')) { sidebarWidth -= 0.5 * splitterWidth; if (elementSeparation < splitterWidth) { @@ -346,7 +402,7 @@ var gZenCompactModeManager = { }); }); }); - } else { + } else if (canHideSidebar && !isCompactMode) { document.getElementById('browser').style.overflow = 'clip'; if (this.sidebarIsOnRight) { this.sidebar.style.marginRight = `-${sidebarWidth}px`; @@ -382,6 +438,9 @@ var gZenCompactModeManager = { resolve(); }); }); + } else { + this.sidebar.removeAttribute('animate'); // remove the attribute if we are not animating + document.documentElement.removeAttribute('zen-compact-animating'); } }); }); @@ -391,6 +450,15 @@ var gZenCompactModeManager = { document .getElementById('zen-context-menu-compact-mode-toggle') .setAttribute('checked', this.preference); + + const hideTabBar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar', false); + const hideToolbar = Services.prefs.getBoolPref('zen.view.compact.hide-toolbar', false); + const hideBoth = hideTabBar && hideToolbar; + + const idName = 'zen-context-menu-compact-mode-hide-'; + document.getElementById(idName + 'sidebar').setAttribute('checked', !hideBoth && hideTabBar); + document.getElementById(idName + 'toolbar').setAttribute('checked', !hideBoth && hideToolbar); + document.getElementById(idName + 'both').setAttribute('checked', hideBoth); }, _removeOpenStateOnUnifiedExtensions() { diff --git a/src/zen/compact-mode/sidebar.inc.css b/src/zen/compact-mode/sidebar.inc.css new file mode 100644 index 000000000..b5f72008f --- /dev/null +++ b/src/zen/compact-mode/sidebar.inc.css @@ -0,0 +1,265 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * 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/. + */ + +&:not([zen-compact-animating]) { + & #zen-sidebar-splitter { + display: none !important; + } + + #zen-tabbox-wrapper { + /* Remove extra 1px of margine we have to add to the tabbox */ + margin-left: var(--zen-element-separation) !important; + margin-right: var(--zen-element-separation) !important; + } + + #zen-appcontent-wrapper { + & #tabbrowser-tabbox { + margin-left: 0 !important; + } + } + + #zen-sidebar-splitter { + display: none !important; + } + + #zen-sidebar-top-buttons-customization-target { + padding-inline-start: calc( + var(--zen-toolbox-padding) - var(--toolbarbutton-outer-padding) + ) !important; + } + + &[zen-window-buttons-reversed='true'] #zen-appcontent-navbar-wrapper #nav-bar { + margin-right: var(--zen-element-separation) !important; + margin-left: calc(var(--zen-element-separation) - 3px) !important; + } + + #navigator-toolbox { + --zen-toolbox-max-width: 74px !important; + --zen-compact-float: var(--zen-element-separation); + :root[zen-no-padding='true'] & { + --zen-compact-float: 10px; + --zen-compact-mode-no-padding-radius-fix: 2px; + } + + /* Initial padding for when we are animating */ + padding: 0 0 0 var(--zen-toolbox-padding) !important; + + &:not([animate='true']) { + position: fixed; + z-index: 10; + transition: + left 0.15s ease, + right 0.15s ease, + visibility 0.15s ease; + bottom: var(--zen-compact-float); + padding: 0 var(--zen-compact-float) !important; + :root[zen-single-toolbar='true'] & { + /* We add an extra offset since windows users have a border top + * in the window in order to compensate how windows renders the + * titlebar */ + top: calc(var(--zen-compact-float) / 2 + var(--zen-sidebar-compact-top-offset, 0px)); + height: calc(100% - var(--zen-compact-float)); + } + :root:not([zen-single-toolbar='true']) & { + bottom: calc(var(--zen-compact-float) / 2); + height: calc(100% - var(--zen-toolbar-height)); + @media -moz-pref('zen.view.compact.hide-toolbar') { + height: 100%; + } + } + & #zen-sidebar-top-buttons { + margin: 0 0 calc(var(--zen-toolbox-padding) / 2) 0; + } + } + + &:not([zen-right-side='true']) #nav-bar { + margin-left: 0 !important; + } + } + + &:not([zen-right-side='true']) #navigator-toolbox { + left: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px); + } + + /* When we have multiple toolbars and the top-toolbar is NOT being hidden, + * we need to adjust the top-padding of the toolbox to account for the + * extra toolbar height. */ + @media not -moz-pref('zen.view.compact.hide-toolbar') { + &:not([zen-single-toolbar='true']) { + #navigator-toolbox:not([animate='true']) { + margin-top: var(--zen-toolbar-height) !important; + } + } + } + + &:not([zen-sidebar-expanded='true']) .zen-essentials-container { + padding: 0; + } + + &[zen-right-side='true'] { + & #navigator-toolbox:not([animate='true']) { + right: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px); + } + + & .browserSidebarContainer { + margin-left: 0 !important; + margin-right: 0 !important; + } + } + + #navigator-toolbox:not([animate='true']) #titlebar { + padding: var(--zen-toolbox-padding) !important; + :root:not([zen-sidebar-expanded='true']) & { + padding: var(--zen-toolbox-padding) 0 !important; + max-width: calc(var(--zen-sidebar-width) - var(--zen-toolbox-padding) * 2); + width: var(--zen-sidebar-width); + } + position: relative; + min-width: var(--zen-toolbox-min-width); + transition: visibility 0.15s; /* Same as the toolbox */ + visibility: hidden; + + :root[zen-sidebar-expanded='true'] & { + width: calc(var(--zen-sidebar-width) + var(--zen-toolbox-padding)); + } + + & .zen-toolbar-background { + display: flex; + } + } + + #navigator-toolbox[zen-has-hover]:not(:has(#urlbar[zen-floating-urlbar='true']:hover)), + #navigator-toolbox[zen-user-show], + #navigator-toolbox[zen-has-empty-tab], + #navigator-toolbox[flash-popup], + #navigator-toolbox[has-popup-menu], + #navigator-toolbox[movingtab], + &[zen-renaming-tab='true'] #navigator-toolbox, + #navigator-toolbox[zen-compact-mode-active] { + &:not([animate='true']) { + --zen-compact-mode-func: linear( + 0 0%, + 0.002748 1%, + 0.010544 2%, + 0.022757 3%, + 0.038804 4%, + 0.058151 5%, + 0.080308 6%, + 0.104828 7.000000000000001%, + 0.131301 8%, + 0.159358 9%, + 0.188662 10%, + 0.21891 11%, + 0.249828 12%, + 0.281172 13%, + 0.312724 14.000000000000002%, + 0.344288 15%, + 0.375693 16%, + 0.40679 17%, + 0.437447 18%, + 0.467549 19%, + 0.497 20%, + 0.525718 21%, + 0.553633 22%, + 0.580688 23%, + 0.60684 24%, + 0.632052 25%, + 0.656298 26%, + 0.679562 27%, + 0.701831 28.000000000000004%, + 0.723104 28.999999999999996%, + 0.743381 30%, + 0.76267 31%, + 0.780983 32%, + 0.798335 33%, + 0.814744 34%, + 0.830233 35%, + 0.844826 36%, + 0.858549 37%, + 0.87143 38%, + 0.883498 39%, + 0.894782 40%, + 0.905314 41%, + 0.915125 42%, + 0.924247 43%, + 0.93271 44%, + 0.940547 45%, + 0.947787 46%, + 0.954463 47%, + 0.960603 48%, + 0.966239 49%, + 0.971397 50%, + 0.976106 51%, + 0.980394 52%, + 0.984286 53%, + 0.987808 54%, + 0.990984 55.00000000000001%, + 0.993837 56.00000000000001%, + 0.99639 56.99999999999999%, + 0.998664 57.99999999999999%, + 1.000679 59%, + 1.002456 60%, + 1.004011 61%, + 1.005363 62%, + 1.006528 63%, + 1.007522 64%, + 1.008359 65%, + 1.009054 66%, + 1.009618 67%, + 1.010065 68%, + 1.010405 69%, + 1.010649 70%, + 1.010808 71%, + 1.01089 72%, + 1.010904 73%, + 1.010857 74%, + 1.010757 75%, + 1.010611 76%, + 1.010425 77%, + 1.010205 78%, + 1.009955 79%, + 1.009681 80%, + 1.009387 81%, + 1.009077 82%, + 1.008754 83%, + 1.008422 84%, + 1.008083 85%, + 1.00774 86%, + 1.007396 87%, + 1.007052 88%, + 1.00671 89%, + 1.006372 90%, + 1.00604 91%, + 1.005713 92%, + 1.005394 93%, + 1.005083 94%, + 1.004782 95%, + 1.004489 96%, + 1.004207 97%, + 1.003935 98%, + 1.003674 99%, + 1.003423 100% + ); + --zen-compact-mode-time: 0.25s; + transition: + left var(--zen-compact-mode-time) var(--zen-compact-mode-func), + right var(--zen-compact-mode-time) var(--zen-compact-mode-func); + + :root:not([supress-primary-adjustment='true']) & { + & #titlebar { + transition: none; + visibility: visible; + } + + left: calc(var(--zen-compact-float) / -2); + :root[zen-right-side='true'] & { + right: calc(var(--zen-compact-float) / -2); + left: auto; + } + } + } + } +} diff --git a/src/zen/compact-mode/toolbar.inc.css b/src/zen/compact-mode/toolbar.inc.css new file mode 100644 index 000000000..f58134b53 --- /dev/null +++ b/src/zen/compact-mode/toolbar.inc.css @@ -0,0 +1,84 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * 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/. + */ + +&:not([zen-single-toolbar='true']) { + & #navigator-toolbox { + --zen-toolbox-top-align: var(--zen-element-separation); + } + + & #titlebar, + & #zen-appcontent-wrapper { + margin-top: var(--zen-element-separation) !important; + } + + & #zen-appcontent-wrapper { + z-index: 3 !important; + } + + & #zen-appcontent-navbar-wrapper { + & .zen-toolbar-background { + display: flex; + } + --zen-compact-toolbar-offset: 5px; + position: absolute; + top: calc(-1 * var(--zen-toolbar-height) + 1px); + left: 0; + z-index: 20; + transition: all 0.15s ease; + width: 100%; + + max-height: var(--zen-toolbar-height); + overflow: hidden; + + & #urlbar:not([breakout-extend='true']) { + opacity: 0 !important; + } + + & #zen-appcontent-navbar-container { + visibility: hidden; + + box-shadow: var(--zen-big-shadow); + border-bottom-left-radius: var(--zen-border-radius); + border-bottom-right-radius: var(--zen-border-radius); + :root:not([sizemode='maximized']) & { + border-top-left-radius: env(-moz-gtk-csd-titlebar-radius); + border-top-right-radius: env(-moz-gtk-csd-titlebar-radius); + } + transition: all 0.15s ease; + width: 100%; + } + } + + & + #zen-appcontent-navbar-wrapper[zen-has-hover]:not( + :has(#urlbar[zen-floating-urlbar='true']:hover) + ), + & #zen-appcontent-navbar-wrapper[has-popup-menu], + & + #zen-appcontent-navbar-wrapper:has( + *:is([panelopen='true'], [open='true'], #urlbar:focus-within, [breakout-extend='true']):not( + #urlbar[zen-floating-urlbar='true'] + ):not(.zen-compact-mode-ignore) + ) { + & #zen-appcontent-navbar-container { + visibility: visible !important; + } + border-top-width: 0px; + + top: -1px; + overflow: initial; + max-height: unset; + + & #urlbar { + opacity: 1 !important; + } + + & #urlbar[breakout-extend='true']:not([zen-floating-urlbar='true']) { + top: 2px !important; + opacity: 1; + } + } +} diff --git a/src/zen/compact-mode/zen-compact-mode.css b/src/zen/compact-mode/zen-compact-mode.css index 0a2dda72a..342514d03 100644 --- a/src/zen/compact-mode/zen-compact-mode.css +++ b/src/zen/compact-mode/zen-compact-mode.css @@ -20,7 +20,7 @@ &::before, &::after { - outline: 1px solid rgba(255, 255, 255, 0.15); + outline: 1px solid rgba(255, 255, 255, .15); outline-offset: -1px; background-attachment: fixed !important; background-size: 100vw 100vh !important; @@ -29,285 +29,41 @@ &, &::before, &::after { - border-radius: calc( - var(--zen-native-inner-radius) - var(--zen-compact-mode-no-padding-radius-fix, 0px) - ); + border-radius: calc(var(--zen-native-inner-radius) - var(--zen-compact-mode-no-padding-radius-fix, 0px)); } } :root[zen-compact-mode='true']:not([customizing]):not([inDOMFullscreen='true']) { + %include ../tabs/zen-tabs/vertical-tabs-topbuttons-fix.css & #urlbar { visibility: visible; } - &:not([zen-compact-animating]) { - & #zen-sidebar-splitter { - display: none !important; - } - - #zen-tabbox-wrapper { - /* Remove extra 1px of margine we have to add to the tabbox */ - margin-left: var(--zen-element-separation) !important; - margin-right: var(--zen-element-separation) !important; - } - - #zen-appcontent-wrapper { - & #tabbrowser-tabbox { - margin-left: 0 !important; - } - } - - #zen-sidebar-splitter { - display: none !important; - } - - #zen-sidebar-top-buttons-customization-target { - padding-inline-start: calc( - var(--zen-toolbox-padding) - var(--toolbarbutton-outer-padding) - ) !important; - } - - &:not([zen-window-buttons-reversed='true']) #zen-appcontent-navbar-wrapper #nav-bar { - margin-left: var(--zen-element-separation) !important; - } - - &[zen-window-buttons-reversed='true'] #zen-appcontent-navbar-wrapper #nav-bar { - margin-right: var(--zen-element-separation) !important; - margin-left: calc(var(--zen-element-separation) - 3px) !important; - } - - #navigator-toolbox { - --zen-toolbox-max-width: 74px !important; - --zen-compact-float: var(--zen-element-separation); - :root[zen-no-padding='true'] & { - --zen-compact-float: 10px; - --zen-compact-mode-no-padding-radius-fix: 2px; - } - - /* Initial padding for when we are animating */ - padding: 0 0 0 var(--zen-toolbox-padding) !important; - - &:not([animate='true']) { - position: fixed; - z-index: 10; - transition: - left 0.15s ease, - right 0.15s ease, - visibility 0.15s ease; - bottom: var(--zen-compact-float); - padding: 0 var(--zen-compact-float) !important; - - :root[zen-single-toolbar='true'] & { - /* We add an extra offset since windows users have a border top - * in the window in order to compensate how windows renders the - * titlebar */ - top: calc(var(--zen-compact-float) / 2 + var(--zen-sidebar-compact-top-offset, 0px)); - height: calc(100% - var(--zen-compact-float)); - } - - :root:not([zen-single-toolbar='true']) & { - bottom: calc(var(--zen-compact-float) / 2); - height: calc(100% - var(--zen-toolbar-height)); - } - - & #zen-sidebar-top-buttons { - margin: 0 0 calc(var(--zen-toolbox-padding) / 2) 0; - } - } - - &:not([zen-right-side='true']) #nav-bar { - margin-left: 0 !important; - } - } - - &:not([zen-right-side='true']) #navigator-toolbox { - left: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px); - } - - &:not([zen-sidebar-expanded='true']) .zen-essentials-container { - padding: 0; - } - - &[zen-right-side='true'] { - & #navigator-toolbox:not([animate='true']) { - right: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px); - } - - & .browserSidebarContainer { - margin-left: 0 !important; - margin-right: 0 !important; - } - } - - #navigator-toolbox:not([animate='true']) #titlebar { - padding: var(--zen-toolbox-padding) !important; - :root:not([zen-sidebar-expanded='true']) & { - padding: var(--zen-toolbox-padding) 0 !important; - max-width: calc(var(--zen-sidebar-width) - var(--zen-toolbox-padding) * 2); - width: var(--zen-sidebar-width); - } - position: relative; - min-width: var(--zen-toolbox-min-width); - transition: visibility 0.15s; /* Same as the toolbox */ - visibility: hidden; - - :root[zen-sidebar-expanded='true'] & { - width: calc(var(--zen-sidebar-width) + var(--zen-toolbox-padding)); - } - - & .zen-toolbar-background { - display: flex; - } - } - - #navigator-toolbox[zen-has-hover]:not(:has(#urlbar[zen-floating-urlbar='true']:hover)), - #navigator-toolbox[zen-user-show], - #navigator-toolbox[zen-has-empty-tab], - #navigator-toolbox[flash-popup], - #navigator-toolbox[has-popup-menu], - #navigator-toolbox[movingtab], - &[zen-renaming-tab='true'] #navigator-toolbox, - #navigator-toolbox[zen-compact-mode-active] { - &:not([animate='true']) { - --zen-compact-mode-func: linear( - 0 0%, - 0.002748 1%, - 0.010544 2%, - 0.022757 3%, - 0.038804 4%, - 0.058151 5%, - 0.080308 6%, - 0.104828 7.000000000000001%, - 0.131301 8%, - 0.159358 9%, - 0.188662 10%, - 0.21891 11%, - 0.249828 12%, - 0.281172 13%, - 0.312724 14.000000000000002%, - 0.344288 15%, - 0.375693 16%, - 0.40679 17%, - 0.437447 18%, - 0.467549 19%, - 0.497 20%, - 0.525718 21%, - 0.553633 22%, - 0.580688 23%, - 0.60684 24%, - 0.632052 25%, - 0.656298 26%, - 0.679562 27%, - 0.701831 28.000000000000004%, - 0.723104 28.999999999999996%, - 0.743381 30%, - 0.76267 31%, - 0.780983 32%, - 0.798335 33%, - 0.814744 34%, - 0.830233 35%, - 0.844826 36%, - 0.858549 37%, - 0.87143 38%, - 0.883498 39%, - 0.894782 40%, - 0.905314 41%, - 0.915125 42%, - 0.924247 43%, - 0.93271 44%, - 0.940547 45%, - 0.947787 46%, - 0.954463 47%, - 0.960603 48%, - 0.966239 49%, - 0.971397 50%, - 0.976106 51%, - 0.980394 52%, - 0.984286 53%, - 0.987808 54%, - 0.990984 55.00000000000001%, - 0.993837 56.00000000000001%, - 0.99639 56.99999999999999%, - 0.998664 57.99999999999999%, - 1.000679 59%, - 1.002456 60%, - 1.004011 61%, - 1.005363 62%, - 1.006528 63%, - 1.007522 64%, - 1.008359 65%, - 1.009054 66%, - 1.009618 67%, - 1.010065 68%, - 1.010405 69%, - 1.010649 70%, - 1.010808 71%, - 1.01089 72%, - 1.010904 73%, - 1.010857 74%, - 1.010757 75%, - 1.010611 76%, - 1.010425 77%, - 1.010205 78%, - 1.009955 79%, - 1.009681 80%, - 1.009387 81%, - 1.009077 82%, - 1.008754 83%, - 1.008422 84%, - 1.008083 85%, - 1.00774 86%, - 1.007396 87%, - 1.007052 88%, - 1.00671 89%, - 1.006372 90%, - 1.00604 91%, - 1.005713 92%, - 1.005394 93%, - 1.005083 94%, - 1.004782 95%, - 1.004489 96%, - 1.004207 97%, - 1.003935 98%, - 1.003674 99%, - 1.003423 100% - ); - --zen-compact-mode-time: 0.25s; - transition: - left var(--zen-compact-mode-time) var(--zen-compact-mode-func), - right var(--zen-compact-mode-time) var(--zen-compact-mode-func); - - :root:not([supress-primary-adjustment='true']) & { - & #titlebar { - transition: none; - visibility: visible; - } - - left: calc(var(--zen-compact-float) / -2); - :root[zen-right-side='true'] & { - right: calc(var(--zen-compact-float) / -2); - left: auto; - } - } - } - } + @media -moz-pref('zen.view.compact.hide-tabbar') or -moz-pref('zen.view.use-single-toolbar') { +%include sidebar.inc.css } - &:not([zen-single-toolbar='true']) #zen-sidebar-top-buttons { - max-width: fit-content; - :root[zen-right-side='true'] & { - order: 999; - } + @media -moz-pref('zen.view.compact.hide-toolbar') { +%include toolbar.inc.css } } /* Fix for https://github.com/zen-browser/desktop/issues/7615 */ :root[zen-compact-mode='true']:not([customizing])[inDOMFullscreen='true'] { - &:not([zen-compact-animating]) { - #navigator-toolbox { - opacity: 0; + @media -moz-pref('zen.view.compact.hide-tabbar') or -moz-pref('zen.view.use-single-toolbar') { + &:not([zen-compact-animating]) { + #navigator-toolbox { + opacity: 0; + } + } + } + @media -moz-pref('zen.view.compact.hide-toolbar') { + &:not([zen-single-toolbar='true']) { + & #zen-appcontent-navbar-wrapper { + opacity: 0; + } } } } diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index 809401417..fb4af924f 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -124,10 +124,6 @@ } } -:root:not([zen-single-toolbar='true']) #tabbrowser-tabs { - margin-top: -2px; -} - /* ========================================================================== Pinned Tabs Separator ========================================================================== */ @@ -708,7 +704,6 @@ & #titlebar { display: grid; - grid-template-rows: auto 1fr; overflow: clip; } @@ -975,14 +970,8 @@ height: 100%; align-items: center; - :root:not([zen-sidebar-expanded='true']):not([zen-right-side='true']) { - padding-inline-start: var(--zen-toolbox-padding); - } #nav-bar & { - padding-inline-start: var(--toolbarbutton-outer-padding); - } - :root[zen-right-side='true']:not([zen-window-buttons-reversed='true']) { - padding-inline-end: var(--zen-toolbox-padding); + padding-inline-end: var(--toolbarbutton-outer-padding); } :root:not([zen-sidebar-expanded='true']) & toolbarspring { diff --git a/src/zen/urlbar/ZenSiteDataPanel.sys.mjs b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs index 129842c8b..c42bd84d0 100644 --- a/src/zen/urlbar/ZenSiteDataPanel.sys.mjs +++ b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs @@ -2,6 +2,8 @@ * 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/. */ +import { AppConstants } from 'resource://gre/modules/AppConstants.sys.mjs'; + export class nsZenSiteDataPanel { #iconMap = { install: 'extension', @@ -373,6 +375,9 @@ export class nsZenSiteDataPanel { } else { this.window.gZenCommonActions.copyCurrentURLToClipboard(); } + if (AppConstants.platform !== 'macosx') { + this.panel.hidePopup(); + } } } } From c2951d0a0fb81a01aa31a01ade3d1a022d8e5f19 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Tue, 7 Oct 2025 01:21:52 +0200 Subject: [PATCH 041/111] fix: Add debug info when an invalid folder is trying to restore, b=no-bug, c=common, folders --- prefs/view.yaml | 3 +++ src/zen/common/zenThemeModifier.js | 3 ++- src/zen/folders/ZenFolders.mjs | 17 ++++++++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/prefs/view.yaml b/prefs/view.yaml index cfdd2ae4d..ff34b01d0 100644 --- a/prefs/view.yaml +++ b/prefs/view.yaml @@ -51,3 +51,6 @@ - name: zen.view.context-menu.refresh value: false + +- name: zen.view.borderless-fullscreen + value: true diff --git a/src/zen/common/zenThemeModifier.js b/src/zen/common/zenThemeModifier.js index 4c940536d..acd7899d8 100644 --- a/src/zen/common/zenThemeModifier.js +++ b/src/zen/common/zenThemeModifier.js @@ -96,7 +96,8 @@ var ZenThemeModifier = { if ( window.fullScreen && window.gZenCompactModeManager?.preference && - !document.getElementById('tabbrowser-tabbox')?.hasAttribute('zen-split-view') + !document.getElementById('tabbrowser-tabbox')?.hasAttribute('zen-split-view') && + Services.prefs.getBoolPref('zen.view.borderless-fullscreen', true) ) { separation = 0; } diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index ba57639df..a3c91abf0 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -1615,11 +1615,6 @@ const parentWorkingData = tabFolderWorkingData.get(stateData.parentId); if (parentWorkingData && parentWorkingData.node) { switch (stateData?.prevSiblingInfo?.type) { - case 'group': { - const folder = document.getElementById(stateData.prevSiblingInfo.id); - folder.after(node); - break; - } case 'tab': { const tab = parentWorkingData.node.querySelector( `[zen-pin-id="${stateData.prevSiblingInfo.id}"]` @@ -1627,6 +1622,18 @@ tab.after(node); break; } + case 'group': { + const folder = document.getElementById(stateData.prevSiblingInfo.id); + if (folder) { + folder.after(node); + break; + } + // If we didn't find the group, we should debug it and continue to default case. + console.warn( + `Zen Folders: Could not find previous sibling group with id ${stateData.prevSiblingInfo.id} while restoring session.` + ); + // @eslint-disable-next-line no-fallthrough + } default: { // Should insert after zen-empty-tab const start = From 289058c25d47b27d7cda19000c2a58afba5413b2 Mon Sep 17 00:00:00 2001 From: reizumi Date: Tue, 7 Oct 2025 23:59:11 +0800 Subject: [PATCH 042/111] style: update sidebar icon (#10718) --- src/browser/themes/shared/zen-icons/icons.css | 4 ++++ src/browser/themes/shared/zen-icons/jar.inc.mn | 3 +++ src/browser/themes/shared/zen-icons/lin/sidebar-right.svg | 5 +++++ src/browser/themes/shared/zen-icons/lin/sidebar.svg | 2 +- 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/browser/themes/shared/zen-icons/lin/sidebar-right.svg diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index 7e1db475b..e5c7002bd 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -57,6 +57,10 @@ #sidebar-button:-moz-locale-dir(rtl)[positionend], #zen-toggle-compact-mode { list-style-image: url('sidebar.svg') !important; + + :root[zen-right-side='true'] & { + list-style-image: url('sidebar-right.svg') !important; + } } #downloads-button, diff --git a/src/browser/themes/shared/zen-icons/jar.inc.mn b/src/browser/themes/shared/zen-icons/jar.inc.mn index f9e705850..c71a81e50 100644 --- a/src/browser/themes/shared/zen-icons/jar.inc.mn +++ b/src/browser/themes/shared/zen-icons/jar.inc.mn @@ -118,6 +118,7 @@ * skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/lin/settings.svg) * skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/lin/share.svg) * skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg) +* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/lin/sidebar-right.svg) * skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/lin/sidebar.svg) * skin/classic/browser/zen-icons/source-code.svg (../shared/zen-icons/lin/source-code.svg) * skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/lin/sparkles.svg) @@ -259,6 +260,7 @@ * skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/lin/settings.svg) * skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/lin/share.svg) * skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg) +* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/lin/sidebar-right.svg) * skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/lin/sidebar.svg) * skin/classic/browser/zen-icons/source-code.svg (../shared/zen-icons/lin/source-code.svg) * skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/lin/sparkles.svg) @@ -400,6 +402,7 @@ * skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/lin/settings.svg) * skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/lin/share.svg) * skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg) +* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/lin/sidebar-right.svg) * skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/lin/sidebar.svg) * skin/classic/browser/zen-icons/source-code.svg (../shared/zen-icons/lin/source-code.svg) * skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/lin/sparkles.svg) diff --git a/src/browser/themes/shared/zen-icons/lin/sidebar-right.svg b/src/browser/themes/shared/zen-icons/lin/sidebar-right.svg new file mode 100644 index 000000000..d25f84075 --- /dev/null +++ b/src/browser/themes/shared/zen-icons/lin/sidebar-right.svg @@ -0,0 +1,5 @@ +#filter dumbComments emptyLines substitution +# This Source Code Form is subject to the terms of the Mozilla Public +# 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/. + diff --git a/src/browser/themes/shared/zen-icons/lin/sidebar.svg b/src/browser/themes/shared/zen-icons/lin/sidebar.svg index bd468826a..9f0aa3571 100644 --- a/src/browser/themes/shared/zen-icons/lin/sidebar.svg +++ b/src/browser/themes/shared/zen-icons/lin/sidebar.svg @@ -2,4 +2,4 @@ # This Source Code Form is subject to the terms of the Mozilla Public # 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/. - + From 2dc98fa7f7f56b0487c613083f3fea54c2b01eb1 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 7 Oct 2025 23:06:47 +0200 Subject: [PATCH 043/111] chore: Updated to Firefox `144.0`, p=#10725, c=l10n, tabs, media, common, tests, workspaces --- README.md | 2 +- build/firefox-cache/l10n-last-commit-hash | 2 +- src/Cargo-lock.patch | 4 +- src/Cargo-toml.patch | 4 +- src/browser/actors/WebRTCParent-sys-mjs.patch | 2 +- .../base/content/browser-commands-js.patch | 2 +- .../browser-fullScreenAndPointerLock-js.patch | 2 +- .../base/content/browser-init-js.patch | 14 +- src/browser/base/content/browser-js.patch | 6 +- .../base/content/browser-places-js.patch | 2 +- src/browser/base/content/browser-xhtml.patch | 8 +- .../content/main-popupset-inc-xhtml.patch | 4 +- .../content/navigator-toolbox-inc-xhtml.patch | 2 +- .../base/content/nsContextMenu-sys-mjs.patch | 4 +- src/browser/base/moz-build.patch | 4 +- .../BrowserContentHandler-sys-mjs.patch | 2 +- .../components/BrowserGlue-sys-mjs.patch | 6 +- .../content/identityPanel-inc-xhtml.patch | 2 +- .../CustomizableUI-sys-mjs.patch | 48 +- .../extensions/parent/ext-browser-js.patch | 8 +- .../content/browserPlacesViews-js.patch | 2 +- .../components/preferences/jar-mn.patch | 4 +- .../preferences/main-inc-xhtml.patch | 6 +- .../components/preferences/main-js.patch | 4 +- .../preferences/preferences-js.patch | 2 +- .../preferences/preferences-xhtml.patch | 14 +- .../screenshots/overlay/overlay-css.patch | 6 +- .../search/SearchUIUtils-sys-mjs.patch | 4 +- .../sessionstore/SessionStore-sys-mjs.patch | 18 +- .../sidebar/browser-sidebar-js.patch | 2 +- .../tabbrowser/TabsList-sys-mjs.patch | 2 +- .../tabbrowser/content/tab-js.patch | 14 +- .../tabbrowser/content/tabbrowser-js.patch | 150 ++--- .../tabbrowser/content/tabgroup-js.patch | 39 +- .../tabbrowser/content/tabs-js.patch | 148 +++-- .../urlbar/UrlbarController-sys-mjs.patch | 4 +- .../urlbar/UrlbarInput-sys-mjs.patch | 72 +-- .../urlbar/UrlbarMuxerStandard-sys-mjs.patch | 8 +- .../urlbar/UrlbarPrefs-sys-mjs.patch | 4 +- .../urlbar/UrlbarProviderPlaces-sys-mjs.patch | 12 +- .../UrlbarProvidersManager-sys-mjs.patch | 4 +- .../urlbar/UrlbarUtils-sys-mjs.patch | 18 +- .../urlbar/UrlbarValueFormatter-sys-mjs.patch | 2 +- .../urlbar/UrlbarView-sys-mjs.patch | 10 +- .../newtab/lib/ActivityStream-sys-mjs.patch | 4 +- .../installer/package-manifest-in.patch | 4 +- .../themes/BuiltInThemeConfig-sys-mjs.patch | 16 - src/browser/themes/linux/browser-css.patch | 2 +- src/browser/themes/osx/browser-css.patch | 2 +- .../themes/shared/browser-shared-css.patch | 6 +- src/browser/themes/shared/jar-inc-mn.patch | 4 +- .../shared/tabbrowser/content-area-css.patch | 2 +- .../themes/shared/tabbrowser/tabs-css.patch | 16 +- .../themes/shared/toolbarbuttons-css.patch | 6 +- .../themes/shared/urlbar-searchbar-css.patch | 6 +- .../themes/shared/urlbarView-css.patch | 2 +- src/browser/themes/windows/browser-css.patch | 2 +- src/build/moz-build.patch | 4 +- .../actors/animation-type-longhand-js.patch | 4 +- .../startup/DevToolsStartup-sys-mjs.patch | 2 +- src/dom/base/Document-cpp.patch | 6 +- src/dom/base/use_counter_metrics-yaml.patch | 6 +- .../mediaelement/HTMLMediaElement-cpp.patch | 4 +- .../ff142-gradient-dithering.patch | 545 ------------------ src/layout/generic/nsIFrame-cpp.patch | 4 +- src/layout/style/nsStyleStruct-cpp.patch | 6 +- src/layout/style/nsStyleStruct-h.patch | 4 +- .../libpref/init/StaticPrefList-yaml.patch | 4 +- src/modules/libpref/moz-build.patch | 2 +- .../style/gecko/media_features-rs.patch | 8 +- .../components/style/queries/feature-rs.patch | 2 +- .../style/queries/feature_expression-rs.patch | 2 +- src/testing/mochitest/browser-test-js.patch | 2 +- .../downloads/DownloadList-sys-mjs.patch | 2 +- .../extensions/parent/ext-downloads-js.patch | 2 +- .../pictureinpicture/content/player-js.patch | 4 +- .../content/player-xhtml.patch | 2 +- .../widgets/browser-custom-element-mjs.patch | 4 +- .../widgets/moz-toggle/moz-toggle-css.patch | 2 +- src/toolkit/modules/moz-build.patch | 4 +- src/toolkit/moz-configure.patch | 2 +- .../extensions/AddonManager-sys-mjs.patch | 2 +- .../extensions/content/aboutaddons-css.patch | 2 +- .../profile/nsToolkitProfileService-cpp.patch | 6 +- .../themes/shared/aboutReader-css.patch | 4 +- .../shared/in-content/common-shared-css.patch | 8 +- src/toolkit/themes/shared/menulist-css.patch | 4 +- .../shared/pictureinpicture/player-css.patch | 4 +- .../signing/macos/mach_commands-py.patch | 4 +- src/widget/cocoa/nsCocoaWindow-mm.patch | 4 +- src/xpfe/appshell/AppWindow-cpp.patch | 4 +- src/zen/common/ZenStartup.mjs | 5 - src/zen/common/ZenUIManager.mjs | 1 - src/zen/common/styles/zen-omnibox.css | 4 + .../common/styles/zen-single-components.css | 6 +- src/zen/tests/tabs/browser.toml | 1 + .../tests/tabs/browser_tabs_fetch_checks.js | 29 + src/zen/workspaces/ZenWorkspaces.mjs | 2 + surfer.json | 2 +- 99 files changed, 464 insertions(+), 1004 deletions(-) delete mode 100644 src/browser/themes/BuiltInThemeConfig-sys-mjs.patch delete mode 100644 src/firefox-patches/ff142-gradient-dithering.patch create mode 100644 src/zen/tests/tabs/browser_tabs_fetch_checks.js diff --git a/README.md b/README.md index 58bc8315f..d61a328ca 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne ### Firefox Versions - [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `143.0.4`! 🚀 -- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 143.0.4`! +- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 144.0`! ### Contributing diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash index 671337a45..12646d8ca 100644 --- a/build/firefox-cache/l10n-last-commit-hash +++ b/build/firefox-cache/l10n-last-commit-hash @@ -1 +1 @@ -5cbf54e3cfaf4cfb375088d7e11702e8974b238f \ No newline at end of file +dd57c783345c5401fcdcc48e83b1fa9ce511d1cf \ No newline at end of file diff --git a/src/Cargo-lock.patch b/src/Cargo-lock.patch index e33677b06..0f9223905 100644 --- a/src/Cargo-lock.patch +++ b/src/Cargo-lock.patch @@ -1,8 +1,8 @@ diff --git a/Cargo.lock b/Cargo.lock -index 2ac65181b1a9561ee4760e0569dfdd621c684142..b159fd8a351ba7c6541e8994a815de8150db619f 100644 +index c079ef11880c5338c4498a0e5b3eb4cf4bfb6e02..ecd06b05381be740197c07c8cf0743dc882727f5 100644 --- a/Cargo.lock +++ b/Cargo.lock -@@ -4029,8 +4029,6 @@ dependencies = [ +@@ -4069,8 +4069,6 @@ dependencies = [ [[package]] name = "mime_guess" version = "2.0.4" diff --git a/src/Cargo-toml.patch b/src/Cargo-toml.patch index e4b55038b..563622667 100644 --- a/src/Cargo-toml.patch +++ b/src/Cargo-toml.patch @@ -1,8 +1,8 @@ diff --git a/Cargo.toml b/Cargo.toml -index 0fdad8b956be8119f5a914b9cee01bb6520cd13d..f1414b5afd5c66c61d1585184de6b32f9918670d 100644 +index 2331ff5733d39e26c0a16301cb83d46ca970f632..777dbd5fb8546466e4a349772ccba254c7ffd691 100644 --- a/Cargo.toml +++ b/Cargo.toml -@@ -218,6 +218,8 @@ moz_asserts = { path = "mozglue/static/rust/moz_asserts" } +@@ -224,6 +224,8 @@ moz_asserts = { path = "mozglue/static/rust/moz_asserts" } # Workaround for https://github.com/rust-lang/cargo/issues/11232 rure = { path = "third_party/rust/rure" } diff --git a/src/browser/actors/WebRTCParent-sys-mjs.patch b/src/browser/actors/WebRTCParent-sys-mjs.patch index fed9ceb84..cee359785 100644 --- a/src/browser/actors/WebRTCParent-sys-mjs.patch +++ b/src/browser/actors/WebRTCParent-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs -index f327e1684d0966a0dcfdcdbf8cc70259b27a4504..c8f722bda4cf297f5d0a6aa22dafbe27c4218123 100644 +index 80fd2177c7112c958ff51bbf7a18ebea39e50fbf..24f62810901dc558e25ee874bd49736bd64fd358 100644 --- a/browser/actors/WebRTCParent.sys.mjs +++ b/browser/actors/WebRTCParent.sys.mjs @@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent { diff --git a/src/browser/base/content/browser-commands-js.patch b/src/browser/base/content/browser-commands-js.patch index 7e98cf714..b6d37eec0 100644 --- a/src/browser/base/content/browser-commands-js.patch +++ b/src/browser/base/content/browser-commands-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser-commands.js b/browser/base/content/browser-commands.js -index 637e9dda83df5b490d6340367dd63077904ea056..6ffb1dc6ed1d6e58b4e8de1faca887f6b38115cb 100644 +index 74aae01ddcdc4b6460ebbe174355ca129a89010b..52dd4e6aa49929394ed6afa6b25f4ee4954b8b94 100644 --- a/browser/base/content/browser-commands.js +++ b/browser/base/content/browser-commands.js @@ -317,6 +317,10 @@ var BrowserCommands = { diff --git a/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch b/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch index b71398c94..db1354d84 100644 --- a/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch +++ b/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser-fullScreenAndPointerLock.js b/browser/base/content/browser-fullScreenAndPointerLock.js -index d477ac782e0cb921203f8cd38da70a003ac41b39..648d0b4066b630a9b31da0bb8490f29da701dd3d 100644 +index b41449d4c4bc373a4c9cf449c0bb370bfdbc20d6..f1166929397dd39b7f44bd9cb0d62a45d67f0e1d 100644 --- a/browser/base/content/browser-fullScreenAndPointerLock.js +++ b/browser/base/content/browser-fullScreenAndPointerLock.js @@ -427,10 +427,10 @@ var FullScreen = { diff --git a/src/browser/base/content/browser-init-js.patch b/src/browser/base/content/browser-init-js.patch index 9b3a7c42d..2d21acf05 100644 --- a/src/browser/base/content/browser-init-js.patch +++ b/src/browser/base/content/browser-init-js.patch @@ -1,20 +1,12 @@ diff --git a/browser/base/content/browser-init.js b/browser/base/content/browser-init.js -index e4a94863c0f0810d1894475b020814b2ad32ffb3..515f61d2df5d4a593fc32d3f32e8fdec2b8f5983 100644 +index 8e63654b343e8518aa0e366a3fd3bf7e0856eafb..fe402e526ab33cdcc4baabf8685dfb03efac6003 100644 --- a/browser/base/content/browser-init.js +++ b/browser/base/content/browser-init.js -@@ -191,6 +191,7 @@ var gBrowserInit = { +@@ -198,6 +198,7 @@ var gBrowserInit = { }, onLoad() { + Services.scriptloader.loadSubScript("chrome://browser/content/zenThemeModifier.js", window); gBrowser.addEventListener("DOMUpdateBlockedPopups", e => - PopupBlockerObserver.handleEvent(e) + PopupAndRedirectBlockerObserver.handleEvent(e) ); -@@ -359,6 +360,7 @@ var gBrowserInit = { - - this._handleURIToLoad(); - -+ gZenWorkspaces.selectStartPage(); - Services.obs.addObserver(gIdentityHandler, "perm-changed"); - Services.obs.addObserver(gRemoteControl, "devtools-socket"); - Services.obs.addObserver(gRemoteControl, "marionette-listening"); diff --git a/src/browser/base/content/browser-js.patch b/src/browser/base/content/browser-js.patch index afc190969..33bd7cf81 100644 --- a/src/browser/base/content/browser-js.patch +++ b/src/browser/base/content/browser-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js -index c5b7ef2616c1dab9f42970605897e862d57ab7d0..77f0731db6c4a8d835cf8733115d27ae7782a987 100644 +index 32b67f846b9942ad3da4276bb8748fee915eb485..f77d5df7c8ef49c0366ada8b3153c5a6c676239b 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -31,6 +31,7 @@ ChromeUtils.defineESModuleGetters(this, { @@ -10,7 +10,7 @@ index c5b7ef2616c1dab9f42970605897e862d57ab7d0..77f0731db6c4a8d835cf8733115d27ae DevToolsSocketStatus: "resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs", DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs", -@@ -2291,6 +2292,8 @@ var XULBrowserWindow = { +@@ -2293,6 +2294,8 @@ var XULBrowserWindow = { AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser); TranslationsParent.onLocationChange(gBrowser.selectedBrowser); @@ -19,7 +19,7 @@ index c5b7ef2616c1dab9f42970605897e862d57ab7d0..77f0731db6c4a8d835cf8733115d27ae PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser); if (!gMultiProcessBrowser) { -@@ -5232,6 +5235,9 @@ var ConfirmationHint = { +@@ -4782,6 +4785,9 @@ var ConfirmationHint = { MozXULElement.insertFTLIfNeeded("toolkit/branding/brandings.ftl"); MozXULElement.insertFTLIfNeeded("browser/confirmationHints.ftl"); document.l10n.setAttributes(this._message, messageId, options.l10nArgs); diff --git a/src/browser/base/content/browser-places-js.patch b/src/browser/base/content/browser-places-js.patch index e7baf596a..e302f2838 100644 --- a/src/browser/base/content/browser-places-js.patch +++ b/src/browser/base/content/browser-places-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js -index 5ba2b6a58776e2b1d70b80e8cb1533cb20caafc6..65736705968732a185e81561b2866bfbe6f3233a 100644 +index 79b4f6f8fb2f7dd8784920038784e6bb0c967e2d..1f3f4991b3ba7c00516e9708e89e8f95db25a36a 100644 --- a/browser/base/content/browser-places.js +++ b/browser/base/content/browser-places.js @@ -252,6 +252,8 @@ var StarUI = { diff --git a/src/browser/base/content/browser-xhtml.patch b/src/browser/base/content/browser-xhtml.patch index 7b1a16f57..413da9a2a 100644 --- a/src/browser/base/content/browser-xhtml.patch +++ b/src/browser/base/content/browser-xhtml.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml -index 7c4c05b72845dfb37c11317d011b8e7c6ba07934..856c368e4d6fe7c7d7ab468423348c844cbf1cdf 100644 +index ffddea280e2edffa2531b4b129489c2be0e2c3d2..f03db9e2db0dec06f997740337f28e76a08a3bdb 100644 --- a/browser/base/content/browser.xhtml +++ b/browser/base/content/browser.xhtml -@@ -26,6 +26,7 @@ +@@ -19,6 +19,7 @@ sizemode="normal" retargetdocumentfocus="urlbar-input" scrolling="false" @@ -10,7 +10,7 @@ index 7c4c05b72845dfb37c11317d011b8e7c6ba07934..856c368e4d6fe7c7d7ab468423348c84 persist="screenX screenY width height sizemode" data-l10n-sync="true"> -@@ -105,8 +106,10 @@ +@@ -98,8 +99,10 @@ @@ -21,7 +21,7 @@ index 7c4c05b72845dfb37c11317d011b8e7c6ba07934..856c368e4d6fe7c7d7ab468423348c84 # All sets except for popupsets (commands, keys, and stringbundles) -@@ -128,9 +131,11 @@ +@@ -132,9 +135,11 @@
diff --git a/src/browser/base/content/main-popupset-inc-xhtml.patch b/src/browser/base/content/main-popupset-inc-xhtml.patch index c185ae782..45cdf904f 100644 --- a/src/browser/base/content/main-popupset-inc-xhtml.patch +++ b/src/browser/base/content/main-popupset-inc-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content/main-popupset.inc.xhtml -index fc219ea3dc901fe2ed351161240700113efb8799..f25bdbf886733e2081a4dff55614809056e9885e 100644 +index 69b83857f40bab6a7298c1416989df2d929d78c1..4ac9f02eb31f58a72d4c58c239ebeadcb66d1e16 100644 --- a/browser/base/content/main-popupset.inc.xhtml +++ b/browser/base/content/main-popupset.inc.xhtml @@ -208,6 +208,10 @@ @@ -21,7 +21,7 @@ index fc219ea3dc901fe2ed351161240700113efb8799..f25bdbf886733e2081a4dff556148090 -@@ -613,6 +618,8 @@ +@@ -615,6 +620,8 @@ #include popup-notifications.inc.xhtml diff --git a/src/browser/base/content/navigator-toolbox-inc-xhtml.patch b/src/browser/base/content/navigator-toolbox-inc-xhtml.patch index 2297b8efd..98bcbfa15 100644 --- a/src/browser/base/content/navigator-toolbox-inc-xhtml.patch +++ b/src/browser/base/content/navigator-toolbox-inc-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml -index 8e56b24b39e9c1607e3ff208d284a9b555a91ebb..2402848ae564234ec22d5a317c43864ea1b36f29 100644 +index 328a9b052e2f758f48df1caa8165347ed0301b33..1c111abe148f2e16afa6b5f33eb118b7c02dfd69 100644 --- a/browser/base/content/navigator-toolbox.inc.xhtml +++ b/browser/base/content/navigator-toolbox.inc.xhtml @@ -2,7 +2,7 @@ diff --git a/src/browser/base/content/nsContextMenu-sys-mjs.patch b/src/browser/base/content/nsContextMenu-sys-mjs.patch index 633a2916f..d5ddb503a 100644 --- a/src/browser/base/content/nsContextMenu-sys-mjs.patch +++ b/src/browser/base/content/nsContextMenu-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/nsContextMenu.sys.mjs b/browser/base/content/nsContextMenu.sys.mjs -index bc71ba720ef3603e8b90d295fb16d8415ba114c4..99677f70e22258f61cc9bda31e4d8745d7ca9395 100644 +index b4fe996f9685a085c14324a35a1d51e2fed569b7..c83d5e9bf92f8f2e3d96b121ba3b758dd124393b 100644 --- a/browser/base/content/nsContextMenu.sys.mjs +++ b/browser/base/content/nsContextMenu.sys.mjs -@@ -1095,6 +1095,8 @@ export class nsContextMenu { +@@ -1105,6 +1105,8 @@ export class nsContextMenu { !this.isSecureAboutPage() ); diff --git a/src/browser/base/moz-build.patch b/src/browser/base/moz-build.patch index 06cd8ea3f..d4813485e 100644 --- a/src/browser/base/moz-build.patch +++ b/src/browser/base/moz-build.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/moz.build b/browser/base/moz.build -index 2f2807a246c262298d0802a6a80abe211c99732c..089a86c9e7f69b994657f20fb2392f3dcc8646bf 100644 +index 086b462e706bb46727d0fed85b4c98debaeaf721..44a4fcb9b8181678667ee11b0443eed681dd2a43 100644 --- a/browser/base/moz.build +++ b/browser/base/moz.build -@@ -81,3 +81,5 @@ DEFINES["MOZ_APP_VERSION_DISPLAY"] = CONFIG["MOZ_APP_VERSION_DISPLAY"] +@@ -82,3 +82,5 @@ DEFINES["MOZ_APP_VERSION_DISPLAY"] = CONFIG["MOZ_APP_VERSION_DISPLAY"] DEFINES["APP_LICENSE_BLOCK"] = "%s/content/overrides/app-license.html" % SRCDIR JAR_MANIFESTS += ["jar.mn"] diff --git a/src/browser/components/BrowserContentHandler-sys-mjs.patch b/src/browser/components/BrowserContentHandler-sys-mjs.patch index bfe87274f..4d2cdfa8f 100644 --- a/src/browser/components/BrowserContentHandler-sys-mjs.patch +++ b/src/browser/components/BrowserContentHandler-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/BrowserContentHandler.sys.mjs b/browser/components/BrowserContentHandler.sys.mjs -index 8630614d23147365628e0cb7e9625b8f2a160588..0750869f16336452a458f27627e6fe0492aae462 100644 +index aeb53582c895d3d495dca2702da3043cf761714c..86859f25ac9c0cb20da24d1f84775f99c9092016 100644 --- a/browser/components/BrowserContentHandler.sys.mjs +++ b/browser/components/BrowserContentHandler.sys.mjs @@ -1276,6 +1276,7 @@ function maybeRecordToHandleTelemetry(uri, isLaunch) { diff --git a/src/browser/components/BrowserGlue-sys-mjs.patch b/src/browser/components/BrowserGlue-sys-mjs.patch index b7d6408ac..7d280fdcd 100644 --- a/src/browser/components/BrowserGlue-sys-mjs.patch +++ b/src/browser/components/BrowserGlue-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs -index eae3ed9518ad9ce2103bb912963465c1b10ac050..ccbb04cd36fd8fd63fd8c9ebd0b51f0a5966829c 100644 +index 67b2806835baba3070f295d6b96f97077639995a..5f28e0073c893c57c1d6c37deaacf7b097351d60 100644 --- a/browser/components/BrowserGlue.sys.mjs +++ b/browser/components/BrowserGlue.sys.mjs @@ -8,6 +8,7 @@ import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; @@ -10,7 +10,7 @@ index eae3ed9518ad9ce2103bb912963465c1b10ac050..ccbb04cd36fd8fd63fd8c9ebd0b51f0a AboutHomeStartupCache: "resource:///modules/AboutHomeStartupCache.sys.mjs", AWToolbarButton: "resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs", ASRouter: "resource:///modules/asrouter/ASRouter.sys.mjs", -@@ -1448,7 +1449,7 @@ BrowserGlue.prototype = { +@@ -1458,7 +1459,7 @@ BrowserGlue.prototype = { windowcount++; let tabbrowser = win.gBrowser; if (tabbrowser) { @@ -19,7 +19,7 @@ index eae3ed9518ad9ce2103bb912963465c1b10ac050..ccbb04cd36fd8fd63fd8c9ebd0b51f0a } } -@@ -1611,6 +1612,8 @@ BrowserGlue.prototype = { +@@ -1623,6 +1624,8 @@ BrowserGlue.prototype = { } else if (profileDataVersion < APP_DATA_VERSION) { lazy.ProfileDataUpgrader.upgrade(profileDataVersion, APP_DATA_VERSION); } diff --git a/src/browser/components/controlcenter/content/identityPanel-inc-xhtml.patch b/src/browser/components/controlcenter/content/identityPanel-inc-xhtml.patch index 5c65723d4..27546b54d 100644 --- a/src/browser/components/controlcenter/content/identityPanel-inc-xhtml.patch +++ b/src/browser/components/controlcenter/content/identityPanel-inc-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/controlcenter/content/identityPanel.inc.xhtml b/browser/components/controlcenter/content/identityPanel.inc.xhtml -index 225340c698f775a321bf5f82c0156bb0e3e2aa96..59e6613638efadfd2961999bd77b388c4529314b 100644 +index 8e23aad8ca0bb686a669b11e1d78b7906f5f38d0..cf4873cc6165b5f77091c056d7e275e0f3d36769 100644 --- a/browser/components/controlcenter/content/identityPanel.inc.xhtml +++ b/browser/components/controlcenter/content/identityPanel.inc.xhtml @@ -28,7 +28,7 @@ diff --git a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch index 4635de61c..abfdf5f78 100644 --- a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch +++ b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs -index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4d74ede4e 100644 +index d9a059f608779fea7cd8c595a432f6fe95183e0c..a3c18551e3b24ee86a4373cbbc4f2cdb074aa94d 100644 --- a/browser/components/customizableui/CustomizableUI.sys.mjs +++ b/browser/components/customizableui/CustomizableUI.sys.mjs @@ -14,6 +14,7 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -10,7 +10,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 HomePage: "resource:///modules/HomePage.sys.mjs", PanelMultiView: "moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs", -@@ -323,7 +324,7 @@ var CustomizableUIInternal = { +@@ -326,7 +327,7 @@ var CustomizableUIInternal = { { type: CustomizableUI.TYPE_PANEL, defaultPlacements: [], @@ -19,7 +19,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 }, false ); -@@ -333,19 +334,14 @@ var CustomizableUIInternal = { +@@ -336,19 +337,14 @@ var CustomizableUIInternal = { "back-button", "forward-button", "stop-reload-button", @@ -40,7 +40,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 this.registerArea( CustomizableUI.AREA_NAVBAR, { -@@ -353,8 +349,6 @@ var CustomizableUIInternal = { +@@ -356,8 +352,6 @@ var CustomizableUIInternal = { overflowable: true, defaultPlacements: navbarPlacements, verticalTabsDefaultPlacements: [ @@ -49,7 +49,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 ], defaultCollapsed: false, }, -@@ -378,10 +372,7 @@ var CustomizableUIInternal = { +@@ -381,10 +375,7 @@ var CustomizableUIInternal = { { type: CustomizableUI.TYPE_TOOLBAR, defaultPlacements: [ @@ -60,7 +60,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 ], verticalTabsDefaultPlacements: [], defaultCollapsed: null, -@@ -463,6 +454,7 @@ var CustomizableUIInternal = { +@@ -466,6 +457,7 @@ var CustomizableUIInternal = { CustomizableUI.AREA_NAVBAR, CustomizableUI.AREA_BOOKMARKS, CustomizableUI.AREA_TABSTRIP, @@ -68,7 +68,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 ]); if (AppConstants.platform != "macosx") { toolbars.add(CustomizableUI.AREA_MENUBAR); -@@ -1247,6 +1239,9 @@ var CustomizableUIInternal = { +@@ -1250,6 +1242,9 @@ var CustomizableUIInternal = { placements = gPlacements.get(area); } @@ -78,7 +78,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 // For toolbars that need it, mark as dirty. let defaultPlacements = areaProperties.get("defaultPlacements"); if ( -@@ -1754,7 +1749,7 @@ var CustomizableUIInternal = { +@@ -1757,7 +1752,7 @@ var CustomizableUIInternal = { lazy.log.info( "Widget " + aWidgetId + " not found, unable to remove from " + aArea ); @@ -87,7 +87,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 } this.notifyDOMChange(widgetNode, null, container, true, () => { -@@ -1764,7 +1759,7 @@ var CustomizableUIInternal = { +@@ -1767,7 +1762,7 @@ var CustomizableUIInternal = { // We also need to remove the panel context menu if it's there: this.ensureButtonContextMenu(widgetNode); if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) { @@ -96,7 +96,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 } else { window.gNavToolbox.palette.appendChild(widgetNode); } -@@ -1932,16 +1927,16 @@ var CustomizableUIInternal = { +@@ -1935,16 +1930,16 @@ var CustomizableUIInternal = { elem.setAttribute("skipintoolbarset", "true"); } } @@ -116,7 +116,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 // Handle initial state of vertical tabs. if (isVerticalTabs) { // Show the vertical tabs toolbar -@@ -2183,6 +2178,10 @@ var CustomizableUIInternal = { +@@ -2186,6 +2181,10 @@ var CustomizableUIInternal = { * The identifier string of the area that aNode is being inserted into. */ insertWidgetBefore(aNode, aNextNode, aContainer, aAreaId) { @@ -127,7 +127,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 this.notifyDOMChange(aNode, aNextNode, aContainer, false, () => { this.setLocationAttributes(aNode, aAreaId); aContainer.insertBefore(aNode, aNextNode); -@@ -3303,7 +3302,6 @@ var CustomizableUIInternal = { +@@ -3306,7 +3305,6 @@ var CustomizableUIInternal = { if (!this.isWidgetRemovable(aWidgetId)) { return; } @@ -135,7 +135,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 let placements = gPlacements.get(oldPlacement.area); let position = placements.indexOf(aWidgetId); if (position != -1) { -@@ -4538,7 +4536,7 @@ var CustomizableUIInternal = { +@@ -4541,7 +4539,7 @@ var CustomizableUIInternal = { * For all registered areas, builds those areas to reflect the current * placement state of all widgets. */ @@ -144,7 +144,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 for (let [areaId, areaNodes] of gBuildAreas) { let placements = gPlacements.get(areaId); let isFirstChangedToolbar = true; -@@ -4549,7 +4547,7 @@ var CustomizableUIInternal = { +@@ -4552,7 +4550,7 @@ var CustomizableUIInternal = { if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) { let defaultCollapsed = area.get("defaultCollapsed"); let win = areaNode.ownerGlobal; @@ -153,7 +153,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 win.setToolbarVisibility( areaNode, typeof defaultCollapsed == "string" -@@ -5840,6 +5838,7 @@ export var CustomizableUI = { +@@ -5843,6 +5841,7 @@ export var CustomizableUI = { unregisterArea(aName, aDestroyPlacements) { CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements); }, @@ -161,7 +161,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 /** * Add a widget to an area. * If the area to which you try to add is not known to CustomizableUI, -@@ -7887,11 +7886,11 @@ class OverflowableToolbar { +@@ -7890,11 +7889,11 @@ class OverflowableToolbar { parseFloat(style.paddingLeft) - parseFloat(style.paddingRight) - toolbarChildrenWidth; @@ -175,17 +175,17 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 }); lazy.log.debug( -@@ -7901,7 +7900,8 @@ class OverflowableToolbar { - // If the target has min-width: 0, their children might actually overflow - // it, so check for both cases explicitly. - let targetContentWidth = Math.max(targetWidth, targetChildrenWidth); -- let isOverflowing = Math.floor(targetContentWidth) > totalAvailWidth; +@@ -7909,7 +7908,8 @@ class OverflowableToolbar { + Math.max(targetWidth, targetChildrenWidth) + ); + totalAvailWidth = Math.ceil(totalAvailWidth); +- let isOverflowing = targetContentWidth > totalAvailWidth; + if (win.gZenVerticalTabsManager._hasSetSingleToolbar && this.#toolbar.id == 'nav-bar') return { isOverflowing: false, targetContentWidth, totalAvailWidth }; -+ let isOverflowing = Math.floor(targetContentWidth) + (win.gZenVerticalTabsManager._hasSetSingleToolbar ? 0.1 : 0) > totalAvailWidth; ++ let isOverflowing = targetContentWidth + (win.gZenVerticalTabsManager._hasSetSingleToolbar ? 0.1 : 0) > totalAvailWidth; return { isOverflowing, targetContentWidth, totalAvailWidth }; } -@@ -7995,7 +7995,7 @@ class OverflowableToolbar { +@@ -8003,7 +8003,7 @@ class OverflowableToolbar { } } if (!inserted) { @@ -194,7 +194,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4 } child.removeAttribute("cui-anchorid"); child.removeAttribute("overflowedItem"); -@@ -8340,7 +8340,7 @@ class OverflowableToolbar { +@@ -8348,7 +8348,7 @@ class OverflowableToolbar { break; } case "mousedown": { diff --git a/src/browser/components/extensions/parent/ext-browser-js.patch b/src/browser/components/extensions/parent/ext-browser-js.patch index 3bace1f05..68c720930 100644 --- a/src/browser/components/extensions/parent/ext-browser-js.patch +++ b/src/browser/components/extensions/parent/ext-browser-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/extensions/parent/ext-browser.js b/browser/components/extensions/parent/ext-browser.js -index 0baa038232d7e0fd9942f392c48acf7ea5ba50ed..093e1c29c3538d18eb2162b4e4b23ba40c695739 100644 +index 89b0bb3b92c15b89499ffc6cf35dcee7ebb89e48..327afaea3821cdca8d7f58bfaa65c7ce3dbfa7a3 100644 --- a/browser/components/extensions/parent/ext-browser.js +++ b/browser/components/extensions/parent/ext-browser.js -@@ -351,6 +351,7 @@ class TabTracker extends TabTrackerBase { +@@ -354,6 +354,7 @@ class TabTracker extends TabTrackerBase { } getId(nativeTab) { @@ -10,7 +10,7 @@ index 0baa038232d7e0fd9942f392c48acf7ea5ba50ed..093e1c29c3538d18eb2162b4e4b23ba4 let id = this._tabs.get(nativeTab); if (id) { return id; -@@ -385,6 +386,7 @@ class TabTracker extends TabTrackerBase { +@@ -388,6 +389,7 @@ class TabTracker extends TabTrackerBase { if (nativeTab.ownerGlobal.closed) { throw new Error("Cannot attach ID to a tab in a closed window."); } @@ -18,7 +18,7 @@ index 0baa038232d7e0fd9942f392c48acf7ea5ba50ed..093e1c29c3538d18eb2162b4e4b23ba4 this._tabs.set(nativeTab, id); if (nativeTab.linkedBrowser) { -@@ -1268,6 +1270,10 @@ class TabManager extends TabManagerBase { +@@ -1271,6 +1273,10 @@ class TabManager extends TabManagerBase { } canAccessTab(nativeTab) { diff --git a/src/browser/components/places/content/browserPlacesViews-js.patch b/src/browser/components/places/content/browserPlacesViews-js.patch index bf9dad21b..334efc46f 100644 --- a/src/browser/components/places/content/browserPlacesViews-js.patch +++ b/src/browser/components/places/content/browserPlacesViews-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/places/content/browserPlacesViews.js b/browser/components/places/content/browserPlacesViews.js -index 29fb3308dcc98d785a3345dee78050d633927db2..0ae28fa0618def4a146723b19a22280956a25371 100644 +index ee6050d411df009d8b61e49d7fdaba79f1bc5db1..0149528329dad3d48449175a35d96d3ed3a3058e 100644 --- a/browser/components/places/content/browserPlacesViews.js +++ b/browser/components/places/content/browserPlacesViews.js @@ -330,12 +330,23 @@ class PlacesViewBase { diff --git a/src/browser/components/preferences/jar-mn.patch b/src/browser/components/preferences/jar-mn.patch index 591370981..1f1b5e52a 100644 --- a/src/browser/components/preferences/jar-mn.patch +++ b/src/browser/components/preferences/jar-mn.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/preferences/jar.mn b/browser/components/preferences/jar.mn -index eac1fc65c01107cc7f1a3f3aeb1e8caac3c4a3f5..c3bd265acc924bcf26816e9e78f314c31af41f6d 100644 +index a786155d80a9f1f09d209f2da11437ee2d662739..2e422b48b452698275118d336d1b16af6a221577 100644 --- a/browser/components/preferences/jar.mn +++ b/browser/components/preferences/jar.mn -@@ -27,3 +27,5 @@ browser.jar: +@@ -30,3 +30,5 @@ browser.jar: content/browser/preferences/widgets/setting-control.mjs (widgets/setting-control/setting-control.mjs) content/browser/preferences/widgets/setting-group.mjs (widgets/setting-group/setting-group.mjs) content/browser/preferences/widgets/setting-group.css (widgets/setting-group/setting-group.css) diff --git a/src/browser/components/preferences/main-inc-xhtml.patch b/src/browser/components/preferences/main-inc-xhtml.patch index c3c8af6ce..234483ae9 100644 --- a/src/browser/components/preferences/main-inc-xhtml.patch +++ b/src/browser/components/preferences/main-inc-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/preferences/main.inc.xhtml b/browser/components/preferences/main.inc.xhtml -index 66ce978d9b022285dea67fdb75b3c005adb05d9b..db61587570ca18403a82ea6796a756d403cc207e 100644 +index 891cf7108cf4606c99a902afa420e744b9690b87..72034b4a28e68016c04d06a2991ccebff30dd341 100644 --- a/browser/components/preferences/main.inc.xhtml +++ b/browser/components/preferences/main.inc.xhtml @@ -29,6 +29,9 @@ @@ -12,7 +12,7 @@ index 66ce978d9b022285dea67fdb75b3c005adb05d9b..db61587570ca18403a82ea6796a756d4 #ifdef XP_WIN diff --git a/src/browser/components/preferences/main-js.patch b/src/browser/components/preferences/main-js.patch index 7fe5eeb4e..fedbfaded 100644 --- a/src/browser/components/preferences/main-js.patch +++ b/src/browser/components/preferences/main-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js -index 3f578f3888684a1830d456f2a4896e8a5f6630fd..7de18a724d3953a5616577f65a8cf9a18f71893c 100644 +index 259bc260328af1b1f2b95866e7cf92dec341a4b0..3cebff51774b2542a8d4d888aa99dc10929c80be 100644 --- a/browser/components/preferences/main.js +++ b/browser/components/preferences/main.js -@@ -424,7 +424,7 @@ function getBundleForLocales(newLocales) { +@@ -443,7 +443,7 @@ function getBundleForLocales(newLocales) { ]) ); return new Localization( diff --git a/src/browser/components/preferences/preferences-js.patch b/src/browser/components/preferences/preferences-js.patch index 9bd739668..c85a728be 100644 --- a/src/browser/components/preferences/preferences-js.patch +++ b/src/browser/components/preferences/preferences-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js -index b5af9af69fd715012af5c0613e0627dd9cf9c3b7..7f86bac8cce278c5b7b7e1230230b3a27b7cf49a 100644 +index 1fb8a954f61e89736b369f5fa01bb4f89fff16ad..3030c32cb66529f14e575428654778abd312dfd8 100644 --- a/browser/components/preferences/preferences.js +++ b/browser/components/preferences/preferences.js @@ -117,6 +117,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () { diff --git a/src/browser/components/preferences/preferences-xhtml.patch b/src/browser/components/preferences/preferences-xhtml.patch index 9a6458fdd..8e8ee9e12 100644 --- a/src/browser/components/preferences/preferences-xhtml.patch +++ b/src/browser/components/preferences/preferences-xhtml.patch @@ -1,17 +1,17 @@ diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml -index 21d951a19df06da67a28f717b9f80f8f4ebf77d2..b1f998f2b3ed99b19666e81e61428587541b0da5 100644 +index 0081bb470c9b15b39441ff844680e5e91b05fb86..3e4e7c43cf0e4feffb80623491de6222bb88a64b 100644 --- a/browser/components/preferences/preferences.xhtml +++ b/browser/components/preferences/preferences.xhtml -@@ -44,6 +44,8 @@ - +@@ -45,6 +45,8 @@ + +#include zen-preferences-links.xhtml + -@@ -104,6 +106,11 @@ +@@ -106,6 +108,11 @@ @@ -23,7 +23,7 @@ index 21d951a19df06da67a28f717b9f80f8f4ebf77d2..b1f998f2b3ed99b19666e81e61428587 @@ -74,7 +74,7 @@ index 21d951a19df06da67a28f717b9f80f8f4ebf77d2..b1f998f2b3ed99b19666e81e61428587 @@ -86,7 +86,7 @@ index 21d951a19df06da67a28f717b9f80f8f4ebf77d2..b1f998f2b3ed99b19666e81e61428587 -@@ -245,6 +291,10 @@ +@@ -247,6 +293,10 @@ #include sync.inc.xhtml #include experimental.inc.xhtml #include moreFromMozilla.inc.xhtml diff --git a/src/browser/components/screenshots/overlay/overlay-css.patch b/src/browser/components/screenshots/overlay/overlay-css.patch index 5230fd70e..9c3021460 100644 --- a/src/browser/components/screenshots/overlay/overlay-css.patch +++ b/src/browser/components/screenshots/overlay/overlay-css.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/screenshots/overlay/overlay.css b/browser/components/screenshots/overlay/overlay.css -index 037b060327d896e1ec0d087ade80df7548c8c1f7..7a158291c56df0e3b01bf7a37d04de71940d395f 100644 +index ee2740fc48e9b70fe17b0f27b60053209516dbbf..cc0270e0eb28c3e60216460b02d62111abb970de 100644 --- a/browser/components/screenshots/overlay/overlay.css +++ b/browser/components/screenshots/overlay/overlay.css -@@ -225,6 +225,9 @@ +@@ -196,6 +196,9 @@ pointer-events: none; position: absolute; z-index: var(--screenshots-high-layer); @@ -12,7 +12,7 @@ index 037b060327d896e1ec0d087ade80df7548c8c1f7..7a158291c56df0e3b01bf7a37d04de71 } #top-background { -@@ -243,7 +246,7 @@ +@@ -214,7 +217,7 @@ } .bghighlight { diff --git a/src/browser/components/search/SearchUIUtils-sys-mjs.patch b/src/browser/components/search/SearchUIUtils-sys-mjs.patch index 850fac1ff..c384b1151 100644 --- a/src/browser/components/search/SearchUIUtils-sys-mjs.patch +++ b/src/browser/components/search/SearchUIUtils-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/search/SearchUIUtils.sys.mjs b/browser/components/search/SearchUIUtils.sys.mjs -index 6ef224ce377cf3ff511e435f3c7a5dc1de819c60..5b4c395c222c6317fd88499a1aa5307032ea13f8 100644 +index 55f90f4e802480728bbd5ef962b507183e017997..2a83f861fe6edee2b127c8d7946abcdcdbf677f5 100644 --- a/browser/components/search/SearchUIUtils.sys.mjs +++ b/browser/components/search/SearchUIUtils.sys.mjs -@@ -426,7 +426,7 @@ export var SearchUIUtils = { +@@ -430,7 +430,7 @@ export var SearchUIUtils = { triggeringSearchEngine: engine.name, }, }); diff --git a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch index 08585dd50..79c5bcfcf 100644 --- a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch +++ b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs -index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb1077ea5c 100644 +index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d89fb95494 100644 --- a/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs @@ -126,6 +126,8 @@ const TAB_EVENTS = [ @@ -11,7 +11,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb ]; const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; -@@ -1898,6 +1900,8 @@ var SessionStoreInternal = { +@@ -1904,6 +1906,8 @@ var SessionStoreInternal = { case "TabPinned": case "TabUnpinned": case "SwapDocShells": @@ -20,7 +20,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb this.saveStateDelayed(win); break; case "TabGroupCreate": -@@ -2133,7 +2137,6 @@ var SessionStoreInternal = { +@@ -2139,7 +2143,6 @@ var SessionStoreInternal = { if (closedWindowState) { let newWindowState; if ( @@ -28,7 +28,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb !lazy.SessionStartup.willRestore() ) { // We want to split the window up into pinned tabs and unpinned tabs. -@@ -2366,11 +2369,9 @@ var SessionStoreInternal = { +@@ -2372,11 +2375,9 @@ var SessionStoreInternal = { tabbrowser.selectedTab.label; } @@ -40,7 +40,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb // Store the window's close date to figure out when each individual tab // was closed. This timestamp should allow re-arranging data based on how -@@ -3355,7 +3356,7 @@ var SessionStoreInternal = { +@@ -3361,7 +3362,7 @@ var SessionStoreInternal = { if (!isPrivateWindow && tabState.isPrivate) { return; } @@ -49,7 +49,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb return; } -@@ -4067,6 +4068,11 @@ var SessionStoreInternal = { +@@ -4073,6 +4074,11 @@ var SessionStoreInternal = { Math.min(tabState.index, tabState.entries.length) ); tabState.pinned = false; @@ -61,7 +61,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb if (inBackground === false) { aWindow.gBrowser.selectedTab = newTab; -@@ -4503,6 +4509,7 @@ var SessionStoreInternal = { +@@ -4509,6 +4515,7 @@ var SessionStoreInternal = { // Append the tab if we're opening into a different window, tabIndex: aSource == aTargetWindow ? pos : Infinity, pinned: state.pinned, @@ -138,7 +138,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb this._log.debug( `restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs` ); -@@ -6349,6 +6360,25 @@ var SessionStoreInternal = { +@@ -6348,6 +6359,25 @@ var SessionStoreInternal = { // Most of tabData has been restored, now continue with restoring // attributes that may trigger external events. @@ -164,7 +164,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb if (tabData.pinned) { tabbrowser.pinTab(tab); -@@ -7264,7 +7294,7 @@ var SessionStoreInternal = { +@@ -7263,7 +7293,7 @@ var SessionStoreInternal = { let groupsToSave = new Map(); for (let tIndex = 0; tIndex < window.tabs.length; ) { diff --git a/src/browser/components/sidebar/browser-sidebar-js.patch b/src/browser/components/sidebar/browser-sidebar-js.patch index 4f1be7371..a04592bf8 100644 --- a/src/browser/components/sidebar/browser-sidebar-js.patch +++ b/src/browser/components/sidebar/browser-sidebar-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/sidebar/browser-sidebar.js b/browser/components/sidebar/browser-sidebar.js -index f62decaa3f7400787b245b3e765197f4e70dffbb..329240cf434fdbefcf145a733179bd565a814280 100644 +index c4edb5442e5243b7d9fe35e1774b2fc651903601..d58076fedafe07d3401ab1723eaa837fabbae09f 100644 --- a/browser/components/sidebar/browser-sidebar.js +++ b/browser/components/sidebar/browser-sidebar.js @@ -779,7 +779,7 @@ var SidebarController = { diff --git a/src/browser/components/tabbrowser/TabsList-sys-mjs.patch b/src/browser/components/tabbrowser/TabsList-sys-mjs.patch index d511f3c1d..5ac1788da 100644 --- a/src/browser/components/tabbrowser/TabsList-sys-mjs.patch +++ b/src/browser/components/tabbrowser/TabsList-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/TabsList.sys.mjs b/browser/components/tabbrowser/TabsList.sys.mjs -index 97990af166b63cae4b0343c77da5084850890504..b58d20eb3db82867030292625d45277afce1bbea 100644 +index 20a543dede6bf4428c8af19c5d0589788ddd8eaa..27a378e70f5b280b720c95ba8dac2cc4e88985be 100644 --- a/browser/components/tabbrowser/TabsList.sys.mjs +++ b/browser/components/tabbrowser/TabsList.sys.mjs @@ -87,7 +87,7 @@ class TabsListBase { diff --git a/src/browser/components/tabbrowser/content/tab-js.patch b/src/browser/components/tabbrowser/content/tab-js.patch index 55459a9d4..50543e0eb 100644 --- a/src/browser/components/tabbrowser/content/tab-js.patch +++ b/src/browser/components/tabbrowser/content/tab-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js -index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6e64a457d 100644 +index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..5b0f46642e36fd3e15d13a8dbc633c7a9751f8aa 100644 --- a/browser/components/tabbrowser/content/tab.js +++ b/browser/components/tabbrowser/content/tab.js @@ -21,6 +21,7 @@ @@ -31,7 +31,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6 "fadein,pinned,busy,progress,selected=visuallyselected", ".tab-icon-pending": @@ -93,9 +96,9 @@ - "src=image,triggeringprincipal=iconloadingprincipal,requestcontextid,fadein,pinned,selected=visuallyselected,busy,crashed,sharing,pictureinpicture,pending,discarded", + "src=image,requestcontextid,fadein,pinned,selected=visuallyselected,busy,crashed,sharing,pictureinpicture,pending,discarded", ".tab-sharing-icon-overlay": "sharing,selected=visuallyselected,pinned", ".tab-icon-overlay": - "sharing,pictureinpicture,crashed,busy,soundplaying,soundplaying-scheduledremoval,pinned,muted,blocked,selected=visuallyselected,activemedia-blocked", @@ -101,7 +101,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6 } return null; } -@@ -459,6 +475,8 @@ +@@ -468,6 +484,8 @@ this.style.MozUserFocus = "ignore"; } else if ( event.target.classList.contains("tab-close-button") || @@ -110,7 +110,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6 event.target.classList.contains("tab-icon-overlay") || event.target.classList.contains("tab-audio-button") ) { -@@ -513,6 +531,10 @@ +@@ -522,6 +540,10 @@ this.style.MozUserFocus = ""; } @@ -121,7 +121,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6 on_click(event) { if (event.button != 0) { return; -@@ -561,6 +583,7 @@ +@@ -570,6 +592,7 @@ ) ); } else { @@ -129,7 +129,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6 gBrowser.removeTab(this, { animate: true, triggeringEvent: event, -@@ -573,6 +596,14 @@ +@@ -582,6 +605,14 @@ // (see tabbrowser-tabs 'click' handler). gBrowser.tabContainer._blockDblClick = true; } @@ -144,7 +144,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6 } on_dblclick(event) { -@@ -596,6 +627,8 @@ +@@ -605,6 +636,8 @@ animate: true, triggeringEvent: event, }); diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 6494a3137..11561149a 100644 --- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch +++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js -index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80ed9d2317a 100644 +index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394b7dbc6a7 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js -@@ -427,15 +427,64 @@ +@@ -432,15 +432,64 @@ return this.tabContainer.visibleTabs; } @@ -69,7 +69,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e set selectedTab(val) { if ( gSharedTabWarning.willShowSharedTabWarning(val) || -@@ -583,6 +632,7 @@ +@@ -588,6 +637,7 @@ this.tabpanels.appendChild(panel); let tab = this.tabs[0]; @@ -77,22 +77,26 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e tab.linkedPanel = uniqueId; this._selectedTab = tab; this._selectedBrowser = browser; -@@ -868,9 +918,13 @@ +@@ -873,13 +923,17 @@ } this.showTab(aTab); + const handled = gZenFolders.handleTabPin(aTab); + if (!handled) { + this.ungroupTab(aTab); - this.#handleTabMove(aTab, () => -- this.pinnedTabsContainer.appendChild(aTab) + this.#handleTabMove(aTab, () => { + let periphery = document.getElementById( + "pinned-tabs-container-periphery" + ); + // If periphery is null, append to end +- this.pinnedTabsContainer.insertBefore(aTab, periphery); + aTab.hasAttribute("zen-essential") ? gZenWorkspaces.getEssentialsSection(aTab).appendChild(aTab) : this.pinnedTabsContainer.insertBefore(aTab, this.pinnedTabsContainer.lastChild) - ); + }); + } aTab.setAttribute("pinned", "true"); this._updateTabBarForPinnedTabs(); -@@ -883,11 +937,15 @@ +@@ -892,11 +946,15 @@ } this.#handleTabMove(aTab, () => { @@ -109,7 +113,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e }); aTab.style.marginInlineStart = ""; -@@ -1065,6 +1123,8 @@ +@@ -1073,6 +1131,8 @@ let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"]; @@ -117,8 +121,8 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e + gZenPinnedTabManager.onTabIconChanged(aTab, aIconURL); if ( aIconURL && - !aLoadingPrincipal && -@@ -1075,6 +1135,9 @@ + !LOCAL_PROTOCOLS.some(protocol => aIconURL.startsWith(protocol)) +@@ -1082,6 +1142,9 @@ ); return; } @@ -128,7 +132,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e let browser = this.getBrowserForTab(aTab); browser.mIconURL = aIconURL; -@@ -1333,6 +1396,7 @@ +@@ -1445,6 +1508,7 @@ if (!this._previewMode) { newTab.recordTimeFromUnloadToReload(); newTab.updateLastAccessed(); @@ -136,7 +140,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e oldTab.updateLastAccessed(); // if this is the foreground window, update the last-seen timestamps. if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) { -@@ -1485,6 +1549,9 @@ +@@ -1597,6 +1661,9 @@ } let activeEl = document.activeElement; @@ -146,7 +150,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e // If focus is on the old tab, move it to the new tab. if (activeEl == oldTab) { newTab.focus(); -@@ -1808,7 +1875,8 @@ +@@ -1920,7 +1987,8 @@ } _setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) { @@ -156,7 +160,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e return false; } -@@ -1916,7 +1984,7 @@ +@@ -2028,7 +2096,7 @@ newIndex = this.selectedTab._tPos + 1; } @@ -165,7 +169,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (this.isTabGroupLabel(targetTab)) { throw new Error( "Replacing a tab group label with a tab is not supported" -@@ -2191,6 +2259,7 @@ +@@ -2303,6 +2371,7 @@ uriIsAboutBlank, userContextId, skipLoad, @@ -173,7 +177,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } = {}) { let b = document.createXULElement("browser"); // Use the JSM global to create the permanentKey, so that if the -@@ -2264,8 +2333,7 @@ +@@ -2376,8 +2445,7 @@ // we use a different attribute name for this? b.setAttribute("name", name); } @@ -183,7 +187,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e b.setAttribute("transparent", "true"); } -@@ -2430,7 +2498,7 @@ +@@ -2542,7 +2610,7 @@ let panel = this.getPanel(browser); let uniqueId = this._generateUniquePanelID(); @@ -192,7 +196,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e aTab.linkedPanel = uniqueId; // Inject the into the DOM if necessary. -@@ -2489,8 +2557,8 @@ +@@ -2601,8 +2669,8 @@ // If we transitioned from one browser to two browsers, we need to set // hasSiblings=false on both the existing browser and the new browser. if (this.tabs.length == 2) { @@ -203,7 +207,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } else { aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1; } -@@ -2654,7 +2722,6 @@ +@@ -2779,7 +2847,6 @@ this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, { tabIndex: tab._tPos + 1, userContextId: tab.userContextId, @@ -211,7 +215,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e focusUrlBar: true, }); resolve(this.selectedBrowser); -@@ -2734,6 +2801,8 @@ +@@ -2859,6 +2926,8 @@ schemelessInput, hasValidUserGestureActivation = false, textDirectiveUserActivation = false, @@ -220,7 +224,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } = {} ) { // all callers of addTab that pass a params object need to pass -@@ -2744,6 +2813,12 @@ +@@ -2869,6 +2938,12 @@ ); } @@ -233,7 +237,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (!UserInteraction.running("browser.tabs.opening", window)) { UserInteraction.start("browser.tabs.opening", "initting", window); } -@@ -2807,6 +2882,19 @@ +@@ -2932,6 +3007,19 @@ noInitialLabel, skipBackgroundNotify, }); @@ -253,7 +257,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (insertTab) { // Insert the tab into the tab container in the correct position. this.#insertTabAtIndex(t, { -@@ -2815,6 +2903,7 @@ +@@ -2940,6 +3028,7 @@ ownerTab, openerTab, pinned, @@ -261,7 +265,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e bulkOrderedOpen, tabGroup: tabGroup ?? openerTab?.group, }); -@@ -2833,6 +2922,7 @@ +@@ -2958,6 +3047,7 @@ openWindowInfo, skipLoad, triggeringRemoteType, @@ -269,7 +273,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e })); if (focusUrlBar) { -@@ -2953,6 +3043,12 @@ +@@ -3078,6 +3168,12 @@ } } @@ -282,7 +286,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e // Additionally send pinned tab events if (pinned) { this.#notifyPinnedStatus(t); -@@ -3041,10 +3137,10 @@ +@@ -3248,10 +3344,10 @@ isAdoptingGroup = false, isUserTriggered = false, telemetryUserCreateSource = "unknown", @@ -294,7 +298,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } if (!color) { -@@ -3065,9 +3161,14 @@ +@@ -3272,9 +3368,14 @@ label, isAdoptingGroup ); @@ -311,7 +315,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e ); group.addTabs(tabs); -@@ -3188,7 +3289,7 @@ +@@ -3395,7 +3496,7 @@ } this.#handleTabMove(tab, () => @@ -320,7 +324,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e ); } -@@ -3390,6 +3491,7 @@ +@@ -3597,6 +3698,7 @@ openWindowInfo, skipLoad, triggeringRemoteType, @@ -328,7 +332,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } ) { // If we don't have a preferred remote type (or it is `NOT_REMOTE`), and -@@ -3459,6 +3561,7 @@ +@@ -3666,6 +3768,7 @@ openWindowInfo, name, skipLoad, @@ -336,7 +340,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e }); } -@@ -3646,7 +3749,7 @@ +@@ -3853,7 +3956,7 @@ // Add a new tab if needed. if (!tab) { let createLazyBrowser = @@ -345,7 +349,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e let url = "about:blank"; if (tabData.entries?.length) { -@@ -3683,8 +3786,10 @@ +@@ -3890,8 +3993,10 @@ insertTab: false, skipLoad: true, preferredRemoteType, @@ -357,7 +361,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (select) { tabToSelect = tab; } -@@ -3696,7 +3801,8 @@ +@@ -3903,7 +4008,8 @@ this.pinTab(tab); // Then ensure all the tab open/pinning information is sent. this._fireTabOpen(tab, {}); @@ -367,7 +371,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e let { groupId } = tabData; const tabGroup = tabGroupWorkingData.get(groupId); // if a tab refers to a tab group we don't know, skip any group -@@ -3710,7 +3816,10 @@ +@@ -3917,7 +4023,10 @@ tabGroup.stateData.id, tabGroup.stateData.color, tabGroup.stateData.collapsed, @@ -379,7 +383,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e ); tabsFragment.appendChild(tabGroup.node); } -@@ -3755,9 +3864,23 @@ +@@ -3962,9 +4071,23 @@ // to remove the old selected tab. if (tabToSelect) { let leftoverTab = this.selectedTab; @@ -403,7 +407,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (tabs.length > 1 || !tabs[0].selected) { this._updateTabsAfterInsert(); -@@ -3948,11 +4071,14 @@ +@@ -4155,11 +4278,14 @@ if (ownerTab) { tab.owner = ownerTab; } @@ -419,7 +423,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if ( !bulkOrderedOpen && ((openerTab && -@@ -3964,7 +4090,7 @@ +@@ -4171,7 +4297,7 @@ let lastRelatedTab = openerTab && this._lastRelatedTabMap.get(openerTab); let previousTab = lastRelatedTab || openerTab || this.selectedTab; @@ -428,7 +432,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e tabGroup = previousTab.group; } if ( -@@ -3975,7 +4101,7 @@ +@@ -4182,7 +4308,7 @@ ) { elementIndex = Infinity; } else if (previousTab.visible) { @@ -437,7 +441,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } else if (previousTab == FirefoxViewHandler.tab) { elementIndex = 0; } -@@ -4003,14 +4129,14 @@ +@@ -4210,14 +4336,14 @@ } // Ensure index is within bounds. if (tab.pinned) { @@ -456,7 +460,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (pinned && !itemAfter?.pinned) { itemAfter = null; -@@ -4021,7 +4147,7 @@ +@@ -4228,7 +4354,7 @@ this.tabContainer._invalidateCachedTabs(); @@ -465,7 +469,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (this.isTab(itemAfter) && itemAfter.group == tabGroup) { // Place at the front of, or between tabs in, the same tab group this.tabContainer.insertBefore(tab, itemAfter); -@@ -4057,6 +4183,7 @@ +@@ -4264,6 +4390,7 @@ if (pinned) { this._updateTabBarForPinnedTabs(); } @@ -473,7 +477,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e TabBarVisibility.update(); } -@@ -4346,6 +4473,9 @@ +@@ -4553,6 +4680,9 @@ return; } @@ -483,7 +487,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e this.removeTabs(selectedTabs, { isUserTriggered, telemetrySource }); } -@@ -4607,6 +4737,7 @@ +@@ -4814,6 +4944,7 @@ telemetrySource, } = {} ) { @@ -491,7 +495,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e // When 'closeWindowWithLastTab' pref is enabled, closing all tabs // can be considered equivalent to closing the window. if ( -@@ -4696,6 +4827,7 @@ +@@ -4903,6 +5034,7 @@ if (lastToClose) { this.removeTab(lastToClose, aParams); } @@ -499,7 +503,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } catch (e) { console.error(e); } -@@ -4734,6 +4866,12 @@ +@@ -4941,6 +5073,12 @@ aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start(); } @@ -512,7 +516,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e // Handle requests for synchronously removing an already // asynchronously closing tab. if (!animate && aTab.closing) { -@@ -4748,6 +4886,9 @@ +@@ -4955,6 +5093,9 @@ // state). let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width; let isLastTab = this.#isLastTabInWindow(aTab); @@ -522,7 +526,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if ( !this._beginRemoveTab(aTab, { closeWindowFastpath: true, -@@ -4796,7 +4937,13 @@ +@@ -5003,7 +5144,13 @@ // We're not animating, so we can cancel the animation stopwatch. Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId); aTab._closeTimeAnimTimerId = null; @@ -537,7 +541,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e return; } -@@ -4930,7 +5077,7 @@ +@@ -5137,7 +5284,7 @@ closeWindowWithLastTab != null ? closeWindowWithLastTab : !window.toolbar.visible || @@ -546,7 +550,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (closeWindow) { // We've already called beforeunload on all the relevant tabs if we get here, -@@ -4954,6 +5101,7 @@ +@@ -5161,6 +5308,7 @@ newTab = true; } @@ -554,7 +558,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e aTab._endRemoveArgs = [closeWindow, newTab]; // swapBrowsersAndCloseOther will take care of closing the window without animation. -@@ -4994,13 +5142,7 @@ +@@ -5201,13 +5349,7 @@ aTab._mouseleave(); if (newTab) { @@ -569,7 +573,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } else { TabBarVisibility.update(); } -@@ -5133,6 +5275,7 @@ +@@ -5340,6 +5482,7 @@ this.tabs[i]._tPos = i; } @@ -577,7 +581,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (!this._windowIsClosing) { // update tab close buttons state this.tabContainer._updateCloseButtons(); -@@ -5345,6 +5488,7 @@ +@@ -5552,6 +5695,7 @@ } let excludeTabs = new Set(aExcludeTabs); @@ -585,7 +589,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e // If this tab has a successor, it should be selectable, since // hiding or closing a tab removes that tab as a successor. -@@ -5357,13 +5501,13 @@ +@@ -5564,13 +5708,13 @@ !excludeTabs.has(aTab.owner) && Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose") ) { @@ -601,7 +605,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e ); let tab = this.tabContainer.findNextTab(aTab, { -@@ -5379,7 +5523,7 @@ +@@ -5586,7 +5730,7 @@ } if (tab) { @@ -610,7 +614,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } // If no qualifying visible tab was found, see if there is a tab in -@@ -5400,7 +5544,7 @@ +@@ -5607,7 +5751,7 @@ }); } @@ -619,7 +623,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } _blurTab(aTab) { -@@ -5802,10 +5946,10 @@ +@@ -6013,10 +6157,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); } @@ -632,7 +636,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. -@@ -5864,6 +6008,7 @@ +@@ -6075,6 +6219,7 @@ * @param {MozTabbrowserTab|MozTabbrowserTabGroup|MozTabbrowserTabGroup.labelElement} aTab */ replaceTabWithWindow(aTab, aOptions) { @@ -640,7 +644,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (this.tabs.length == 1) { return null; } -@@ -5997,7 +6142,7 @@ +@@ -6208,7 +6353,7 @@ * `true` if element is a `` */ isTabGroup(element) { @@ -649,7 +653,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } /** -@@ -6073,8 +6218,8 @@ +@@ -6284,8 +6429,8 @@ } // Don't allow mixing pinned and unpinned tabs. @@ -660,7 +664,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } else { tabIndex = Math.max(tabIndex, this.pinnedTabCount); } -@@ -6100,10 +6245,16 @@ +@@ -6311,10 +6456,16 @@ this.#handleTabMove( element, () => { @@ -679,7 +683,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e if (neighbor && this.isTab(element) && tabIndex > element._tPos) { neighbor.after(element); } else { -@@ -6161,23 +6312,28 @@ +@@ -6372,23 +6523,28 @@ #moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) { if (this.isTabGroupLabel(targetElement)) { targetElement = targetElement.group; @@ -714,7 +718,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } else if (!element.pinned && targetElement && targetElement.pinned) { // If the caller asks to move an unpinned element next to a pinned // tab, move the unpinned element to be the first unpinned element -@@ -6190,14 +6346,34 @@ +@@ -6401,14 +6557,34 @@ // move the tab group right before the first unpinned tab. // 4. Moving a tab group and the first unpinned tab is grouped: // move the tab group right before the first unpinned tab's tab group. @@ -750,7 +754,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e element.pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; -@@ -6206,7 +6382,7 @@ +@@ -6417,7 +6593,7 @@ element, () => { if (moveBefore) { @@ -759,7 +763,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e } else if (targetElement) { targetElement.after(element); } else { -@@ -6252,10 +6428,10 @@ +@@ -6489,10 +6665,10 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToGroup(aTab, aGroup, metricsContext) { @@ -772,7 +776,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e return; } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -6285,6 +6461,7 @@ +@@ -6522,6 +6698,7 @@ let state = { tabIndex: tab._tPos, @@ -780,7 +784,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e }; if (tab.visible) { state.elementIndex = tab.elementIndex; -@@ -6311,7 +6488,7 @@ +@@ -6548,7 +6725,7 @@ let changedTabGroup = previousTabState.tabGroupId != currentTabState.tabGroupId; @@ -789,7 +793,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e tab.dispatchEvent( new CustomEvent("TabMove", { bubbles: true, -@@ -6348,6 +6525,10 @@ +@@ -6585,6 +6762,10 @@ moveActionCallback(); @@ -800,7 +804,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7249,7 +7430,7 @@ +@@ -7486,7 +7667,7 @@ // preventDefault(). It will still raise the window if appropriate. break; } @@ -809,7 +813,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e window.focus(); aEvent.preventDefault(); break; -@@ -7264,7 +7445,6 @@ +@@ -7501,7 +7682,6 @@ } case "TabGroupCollapse": aEvent.target.tabs.forEach(tab => { @@ -817,7 +821,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e }); break; case "TabGroupCreateByUser": -@@ -8199,6 +8379,7 @@ +@@ -8442,6 +8622,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -825,7 +829,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9200,7 +9381,7 @@ var TabContextMenu = { +@@ -9443,7 +9624,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; @@ -834,7 +838,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e // Build Ask Chat items TabContextMenu.GenAI.buildTabMenu( document.getElementById("context_askChat"), -@@ -9520,6 +9701,7 @@ var TabContextMenu = { +@@ -9763,6 +9944,7 @@ var TabContextMenu = { ) ); } else { diff --git a/src/browser/components/tabbrowser/content/tabgroup-js.patch b/src/browser/components/tabbrowser/content/tabgroup-js.patch index 34d48759b..2c3e80263 100644 --- a/src/browser/components/tabbrowser/content/tabgroup-js.patch +++ b/src/browser/components/tabbrowser/content/tabgroup-js.patch @@ -1,24 +1,23 @@ diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js -index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e8532174e2a7cf 100644 +index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b424098ba3e7b 100644 --- a/browser/components/tabbrowser/content/tabgroup.js +++ b/browser/components/tabbrowser/content/tabgroup.js -@@ -13,10 +13,12 @@ - +@@ -14,11 +14,11 @@ class MozTabbrowserTabGroup extends MozXULElement { static markup = ` -- -+ - + +- + + - -+ + + + -@@ -57,20 +59,36 @@ +@@ -69,20 +69,36 @@ } connectedCallback() { @@ -59,10 +58,10 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321 this._initialized = true; this.saveOnWindowClose = true; -@@ -99,11 +117,14 @@ +@@ -114,11 +130,14 @@ - this.#labelElement.addEventListener("mouseover", this); - this.#labelElement.addEventListener("mouseout", this); + this.#labelContainerElement.addEventListener("mouseover", this); + this.#labelContainerElement.addEventListener("mouseout", this); - this.#labelElement.addEventListener("contextmenu", e => { - e.preventDefault(); - gBrowser.tabGroupMenu.openEditModal(this); @@ -79,7 +78,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321 this.#updateLabelAriaAttributes(); this.#updateCollapsedAriaAttributes(); -@@ -129,6 +150,8 @@ +@@ -144,6 +163,8 @@ // mounts after getting created by `Tabbrowser.adoptTabGroup`. this.#wasCreatedByAdoption = false; } @@ -88,7 +87,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321 resetDefaultGroupName = () => { this.#defaultGroupName = ""; -@@ -213,7 +236,10 @@ +@@ -228,7 +249,10 @@ } }); } @@ -100,7 +99,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321 } get color() { -@@ -307,6 +333,9 @@ +@@ -322,6 +346,9 @@ } set collapsed(val) { @@ -110,7 +109,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321 if (!!val == this.collapsed) { return; } -@@ -364,7 +393,6 @@ +@@ -399,7 +426,6 @@ tabGroupName, }) .then(result => { @@ -118,7 +117,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321 }); } -@@ -383,7 +411,57 @@ +@@ -418,7 +444,57 @@ * @returns {MozTabbrowserTab[]} */ get tabs() { @@ -177,7 +176,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321 } /** -@@ -442,7 +520,6 @@ +@@ -498,7 +574,6 @@ addTabs(tabs, metricsContext) { for (let tab of tabs) { if (tab.pinned) { @@ -185,7 +184,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321 } let tabToMove = this.ownerGlobal === tab.ownerGlobal -@@ -505,7 +582,7 @@ +@@ -561,7 +636,7 @@ */ on_click(event) { let isToggleElement = @@ -194,7 +193,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321 event.target === this.#overflowCountLabel; if (isToggleElement && event.button === 0) { event.preventDefault(); -@@ -570,5 +647,6 @@ +@@ -630,5 +705,6 @@ } } diff --git a/src/browser/components/tabbrowser/content/tabs-js.patch b/src/browser/components/tabbrowser/content/tabs-js.patch index 2fa8caa1f..8318bbc10 100644 --- a/src/browser/components/tabbrowser/content/tabs-js.patch +++ b/src/browser/components/tabbrowser/content/tabs-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js -index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221fb51207c6 100644 +index 1425607ef87d6c28fb676e722617edfb51ba12a1..62431aa1c78c8327edf2c8c93472cb8b19b606e9 100644 --- a/browser/components/tabbrowser/content/tabs.js +++ b/browser/components/tabbrowser/content/tabs.js @@ -44,6 +44,9 @@ @@ -12,7 +12,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f if (isTab(element)) { return element; } -@@ -411,7 +414,7 @@ +@@ -423,7 +426,7 @@ // and we're not hitting the scroll buttons. if ( event.button != 0 || @@ -21,7 +21,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f event.composedTarget.localName == "toolbarbutton" ) { return; -@@ -492,7 +495,6 @@ +@@ -504,7 +507,6 @@ }); } } else if (isTabGroupLabel(event.target)) { @@ -29,7 +29,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f } else if ( event.originalTarget.closest("scrollbox") && !Services.prefs.getBoolPref( -@@ -528,6 +530,9 @@ +@@ -540,6 +542,9 @@ } on_keydown(event) { @@ -39,7 +39,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f let { altKey, shiftKey } = event; let [accel, nonAccel] = AppConstants.platform == "macosx" -@@ -765,7 +770,7 @@ +@@ -777,7 +782,7 @@ if (this.#isContainerVerticalPinnedGrid(tab)) { // In expanded vertical mode, the max number of pinned tabs per row is dynamic // Set this before adjusting dragged tab's position @@ -48,7 +48,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f let tabsPerRow = 0; let position = RTL_UI ? window.windowUtils.getBoundsWithoutFlushing( -@@ -930,7 +935,7 @@ +@@ -942,7 +947,7 @@ let dropEffect = this.getDropEffectForTabDrag(event); let isMovingInTabStrip = !fromTabList && dropEffect == "move"; let collapseTabGroupDuringDrag = @@ -57,7 +57,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f tab._dragData = { offsetX: this.verticalMode -@@ -940,7 +945,7 @@ +@@ -952,7 +957,7 @@ ? event.screenY - window.screenY - tabOffset : event.screenY - window.screenY, scrollPos: @@ -66,7 +66,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f ? this.pinnedTabsContainer.scrollPosition : this.arrowScrollbox.scrollPosition, screenX: event.screenX, -@@ -969,6 +974,7 @@ +@@ -981,6 +986,7 @@ if (collapseTabGroupDuringDrag) { tab.group.collapsed = true; @@ -74,7 +74,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f } } } -@@ -1015,6 +1021,10 @@ +@@ -1027,6 +1033,10 @@ } let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0); @@ -85,7 +85,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f if ( (dropEffect == "move" || dropEffect == "copy") && document == draggedTab.ownerDocument && -@@ -1196,6 +1206,18 @@ +@@ -1208,6 +1218,18 @@ this._tabDropIndicator.hidden = true; event.stopPropagation(); @@ -104,7 +104,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f if (draggedTab && dropEffect == "copy") { let duplicatedDraggedTab; let duplicatedTabs = []; -@@ -1220,8 +1242,9 @@ +@@ -1232,8 +1254,9 @@ let translateOffsetY = oldTranslateY % tabHeight; let newTranslateX = oldTranslateX - translateOffsetX; let newTranslateY = oldTranslateY - translateOffsetY; @@ -116,7 +116,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f if (this.#isContainerVerticalPinnedGrid(draggedTab)) { // Update both translate axis for pinned vertical expanded tabs -@@ -1237,8 +1260,8 @@ +@@ -1249,8 +1272,8 @@ } } else { let tabs = this.ariaFocusableItems.slice( @@ -127,7 +127,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f ); let size = this.verticalMode ? "height" : "width"; let screenAxis = this.verticalMode ? "screenY" : "screenX"; -@@ -1287,11 +1310,13 @@ +@@ -1299,11 +1322,13 @@ this.dragToPinPromoCard, ]; let shouldPin = @@ -141,7 +141,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f isTab(draggedTab) && draggedTab.pinned && this.arrowScrollbox.contains(event.target); -@@ -1309,6 +1334,7 @@ +@@ -1321,6 +1346,7 @@ (oldTranslateY && oldTranslateY != newTranslateY); } else if (this.verticalMode) { shouldTranslate &&= oldTranslateY && oldTranslateY != newTranslateY; @@ -149,7 +149,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f } else { shouldTranslate &&= oldTranslateX && oldTranslateX != newTranslateX; } -@@ -1503,6 +1529,7 @@ +@@ -1515,6 +1541,7 @@ let nextItem = this.ariaFocusableItems[newIndex]; let tabGroup = isTab(nextItem) && nextItem.group; @@ -157,7 +157,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f gBrowser.loadTabs(urls, { inBackground, replace, -@@ -1541,6 +1568,17 @@ +@@ -1553,6 +1580,17 @@ } this.#resetTabsAfterDrop(draggedTab.ownerDocument); @@ -175,7 +175,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f if ( dt.mozUserCancelled || dt.dropEffect != "none" || -@@ -1707,7 +1745,6 @@ +@@ -1719,7 +1757,6 @@ this.toggleAttribute("overflow", true); this._updateCloseButtons(); @@ -183,7 +183,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f document .getElementById("tab-preview-panel") -@@ -1765,7 +1802,7 @@ +@@ -1777,7 +1814,7 @@ } get newTabButton() { @@ -192,7 +192,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f } get verticalMode() { -@@ -1781,6 +1818,7 @@ +@@ -1793,6 +1830,7 @@ } get overflowing() { @@ -200,28 +200,25 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f return this.hasAttribute("overflow"); } -@@ -1789,31 +1827,51 @@ - if (this.#allTabs) { - return this.#allTabs; +@@ -1806,29 +1844,54 @@ + if (pinnedChildren?.at(-1)?.id == "pinned-tabs-container-periphery") { + pinnedChildren.pop(); } -- // Remove temporary periphery element added at drag start. -- let pinnedChildren = Array.from(this.pinnedTabsContainer.children); -- if (pinnedChildren?.at(-1)?.id == "pinned-tabs-container-periphery") { -- pinnedChildren.pop(); -- } - let unpinnedChildren = Array.from(this.arrowScrollbox.children); -- // remove arrowScrollbox periphery element. -- unpinnedChildren.pop(); -- -+ let children = gZenWorkspaces.tabboxChildren; -+ children.pop(); - // explode tab groups ++ 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") { +- 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, ...this.pinnedTabsContainer.children]; ++ const pinnedTabs = [...gZenWorkspaces.getCurrentEssentialsContainer().children, ...pinnedChildren]; + const expandTabs = (tabs) => { + for (let i = tabs.length - 1; i >= 0; i--) { + const tab = tabs[i]; @@ -231,15 +228,13 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f + // add the tabs in the group to the list + tabs.splice(i, 0, ...tab.tabs); + } - } - } -- -- this.#allTabs = [...pinnedChildren, ...unpinnedChildren]; ++ } ++ }; + expandTabs(pinnedTabs); -+ expandTabs(children); ++ expandTabs(unpinnedChildren); + const allTabs = [ + ...pinnedTabs, -+ ...children, ++ ...unpinnedChildren, + ]; + const lastPinnedTabIdx = pinnedTabs.length - 1; + let i = 0; @@ -254,21 +249,23 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f + // 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); + let children = Array.from(this.arrowScrollbox.children); - return children.filter(node => node.tagName == "tab-group"); + return gZenWorkspaces.allTabGroups; } /** -@@ -1880,29 +1938,23 @@ +@@ -1895,29 +1958,23 @@ let elementIndex = 0; @@ -307,7 +304,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f } } -@@ -1914,6 +1966,7 @@ +@@ -1929,6 +1986,7 @@ _invalidateCachedTabs() { this.#allTabs = null; this._invalidateCachedVisibleTabs(); @@ -315,7 +312,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f } _invalidateCachedVisibleTabs() { -@@ -1929,8 +1982,8 @@ +@@ -1944,8 +2002,8 @@ #isContainerVerticalPinnedGrid(tab) { return ( this.verticalMode && @@ -326,7 +323,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f !this.expandOnHover ); } -@@ -1946,7 +1999,7 @@ +@@ -1961,7 +2019,7 @@ if (node == null) { // We have a container for non-tab elements at the end of the scrollbox. @@ -335,7 +332,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f } node.before(tab); -@@ -2041,7 +2094,7 @@ +@@ -2056,7 +2114,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. @@ -344,7 +341,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f const newTab2 = this.newTabButton; const newTabVertical = document.getElementById( "vertical-tabs-newtab-button" -@@ -2139,8 +2192,10 @@ +@@ -2156,8 +2214,10 @@ */ _handleTabSelect(aInstant) { let selectedTab = this.selectedItem; @@ -355,7 +352,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f selectedTab._notselectedsinceload = false; } -@@ -2149,7 +2204,7 @@ +@@ -2166,7 +2226,7 @@ * @param {boolean} [shouldScrollInstantly=false] */ #ensureTabIsVisible(tab, shouldScrollInstantly = false) { @@ -364,7 +361,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f if (arrowScrollbox?.overflowing) { arrowScrollbox.ensureElementIsVisible(tab, shouldScrollInstantly); } -@@ -2288,6 +2343,16 @@ +@@ -2305,6 +2365,16 @@ when the tab is first selected to be dragged. */ #updateTabStylesOnDrag(tab) { @@ -381,7 +378,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f let isPinned = tab.pinned; let numPinned = gBrowser.pinnedTabCount; let allTabs = this.ariaFocusableItems; -@@ -2540,7 +2605,7 @@ +@@ -2578,7 +2648,7 @@ return; } @@ -390,7 +387,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f let directionX = screenX > dragData.animLastScreenX; let directionY = screenY > dragData.animLastScreenY; -@@ -2549,6 +2614,8 @@ +@@ -2587,6 +2657,8 @@ let { width: tabWidth, height: tabHeight } = draggedTab.getBoundingClientRect(); @@ -399,7 +396,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f let shiftSizeX = tabWidth * movingTabs.length; let shiftSizeY = tabHeight; dragData.tabWidth = tabWidth; -@@ -2585,8 +2652,8 @@ +@@ -2623,8 +2695,8 @@ let lastBoundX = lastTabInRow.screenX + lastTabInRow.getBoundingClientRect().width - @@ -410,7 +407,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f translateX = Math.min(Math.max(translateX, firstBoundX), lastBoundX); translateY = Math.min(Math.max(translateY, firstBoundY), lastBoundY); -@@ -2744,13 +2811,18 @@ +@@ -2782,13 +2854,18 @@ this.#clearDragOverGroupingTimer(); this.#clearPinnedDropIndicatorTimer(); @@ -433,7 +430,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f if (this.#rtlMode) { tabs.reverse(); -@@ -2761,7 +2833,7 @@ +@@ -2799,7 +2876,7 @@ let screenAxis = this.verticalMode ? "screenY" : "screenX"; let size = this.verticalMode ? "height" : "width"; let translateAxis = this.verticalMode ? "translateY" : "translateX"; @@ -442,7 +439,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f let tabSize = this.verticalMode ? tabHeight : tabWidth; let translateX = event.screenX - dragData.screenX; let translateY = event.screenY - dragData.screenY; -@@ -2777,6 +2849,12 @@ +@@ -2815,6 +2892,12 @@ ); let lastMovingTab = movingTabs.at(-1); let firstMovingTab = movingTabs[0]; @@ -455,7 +452,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f let endEdge = ele => ele[screenAxis] + bounds(ele)[size]; let lastMovingTabScreen = endEdge(lastMovingTab); let firstMovingTabScreen = firstMovingTab[screenAxis]; -@@ -2791,6 +2869,11 @@ +@@ -2829,6 +2912,11 @@ let endBound = this.#rtlMode ? endEdge(this) - lastMovingTabScreen : periphery[screenAxis] - 1 - lastMovingTabScreen; @@ -467,7 +464,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f translate = Math.min(Math.max(translate, startBound), endBound); // Center the tab under the cursor if the tab is not under the cursor while dragging -@@ -2980,6 +3063,8 @@ +@@ -3018,6 +3106,8 @@ }; let dropElement = getOverlappedElement(); @@ -476,7 +473,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f let newDropElementIndex; if (dropElement) { -@@ -3061,7 +3146,7 @@ +@@ -3099,7 +3189,7 @@ ? Services.prefs.getIntPref( "browser.tabs.dragDrop.moveOverThresholdPercent" ) / 100 @@ -485,7 +482,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold)); let shouldMoveOver = overlapPercent > moveOverThreshold; if (logicalForward && shouldMoveOver) { -@@ -3094,6 +3179,7 @@ +@@ -3132,6 +3222,7 @@ // If dragging a group over another group, don't make it look like it is // possible to drop the dragged group inside the other group. if ( @@ -493,7 +490,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f isTabGroupLabel(draggedTab) && dropElement?.group && (!dropElement.group.collapsed || -@@ -3120,20 +3206,13 @@ +@@ -3158,20 +3249,13 @@ let isOutOfBounds = isPinned ? dropElement.elementIndex >= numPinned : dropElement.elementIndex < numPinned; @@ -518,7 +515,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f let groupingDelay = Services.prefs.getIntPref( "browser.tabs.dragDrop.createGroup.delayMS" ); -@@ -3141,6 +3220,7 @@ +@@ -3179,6 +3263,7 @@ // When dragging tab(s) over an ungrouped tab, signal to the user // that dropping the tab(s) will create a new tab group. let shouldCreateGroupOnDrop = @@ -526,7 +523,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f !movingTabsSet.has(dropElement) && isTab(dropElement) && !dropElement?.group && -@@ -3149,6 +3229,7 @@ +@@ -3187,6 +3272,7 @@ // When dragging tab(s) over a collapsed tab group label, signal to the // user that dropping the tab(s) will add them to the group. let shouldDropIntoCollapsedTabGroup = @@ -534,7 +531,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f isTabGroupLabel(dropElement) && dropElement.group.collapsed && overlapPercent > dragOverGroupingThreshold; -@@ -3193,19 +3274,14 @@ +@@ -3231,19 +3317,14 @@ dropElement = dropElementGroup; colorCode = undefined; } else if (isTabGroupLabel(dropElement)) { @@ -562,7 +559,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f } this.#setDragOverGroupColor(colorCode); this.toggleAttribute("movingtab-addToGroup", colorCode); -@@ -3224,11 +3300,11 @@ +@@ -3262,11 +3343,11 @@ dragData.dropElement = dropElement; dragData.dropBefore = dropBefore; dragData.animDropElementIndex = newDropElementIndex; @@ -576,7 +573,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f continue; } -@@ -3350,12 +3426,14 @@ +@@ -3388,12 +3469,14 @@ element?.removeAttribute("dragover-groupTarget"); } @@ -593,7 +590,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f for (let item of this.ariaFocusableItems) { this.#resetGroupTarget(item); -@@ -3402,16 +3480,15 @@ +@@ -3440,7 +3523,7 @@ tab.style.left = ""; tab.style.top = ""; tab.style.maxWidth = ""; @@ -602,17 +599,16 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f } for (let label of draggedTabDocument.getElementsByClassName( "tab-group-label-container" - )) { - label.style.width = ""; -- label.style.height = ""; +@@ -3450,7 +3533,7 @@ label.style.left = ""; label.style.top = ""; + label.style.maxWidth = ""; - label.removeAttribute("dragtarget"); + label.removeAttribute("zen-dragtarget"); } let periphery = draggedTabDocument.getElementById( "tabbrowser-arrowscrollbox-periphery" -@@ -3483,7 +3560,7 @@ +@@ -3522,7 +3605,7 @@ let postTransitionCleanup = () => { movingTab._moveTogetherSelectedTabsData.animate = false; }; @@ -621,7 +617,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f postTransitionCleanup(); } else { let onTransitionEnd = transitionendEvent => { -@@ -3647,7 +3724,7 @@ +@@ -3686,7 +3769,7 @@ } _notifyBackgroundTab(aTab) { @@ -630,7 +626,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f return; } -@@ -3756,7 +3833,10 @@ +@@ -3795,7 +3878,10 @@ #getDragTarget(event, { ignoreSides = false } = {}) { let { target } = event; while (target) { @@ -642,7 +638,7 @@ index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221f break; } target = target.parentNode; -@@ -3773,6 +3853,9 @@ +@@ -3812,6 +3898,9 @@ return null; } } diff --git a/src/browser/components/urlbar/UrlbarController-sys-mjs.patch b/src/browser/components/urlbar/UrlbarController-sys-mjs.patch index 3ebb104ae..c12b327db 100644 --- a/src/browser/components/urlbar/UrlbarController-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarController-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarController.sys.mjs b/browser/components/urlbar/UrlbarController.sys.mjs -index 36e3ab4a5a153230bb488b66dda7e3e7c763ca23..cc4ea61914a316451fa54b01a5c8c6a305e4038a 100644 +index a1faf7e4278c66865f267283515f22052769928d..d76d19da5a3d4b9739faf3a673bb3ad693765ada 100644 --- a/browser/components/urlbar/UrlbarController.sys.mjs +++ b/browser/components/urlbar/UrlbarController.sys.mjs -@@ -434,6 +434,8 @@ export class UrlbarController { +@@ -441,6 +441,8 @@ export class UrlbarController { }); } event.preventDefault(); diff --git a/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch b/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch index 59089ed3a..8793bce8c 100644 --- a/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs -index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e235161f625 100644 +index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..3aafb612152af88d570c7d7046ca3bd0ce222c46 100644 --- a/browser/components/urlbar/UrlbarInput.sys.mjs +++ b/browser/components/urlbar/UrlbarInput.sys.mjs -@@ -74,6 +74,13 @@ ChromeUtils.defineLazyGetter(lazy, "logger", () => +@@ -76,6 +76,13 @@ ChromeUtils.defineLazyGetter(lazy, "logger", () => lazy.UrlbarUtils.getLogger({ prefix: "Input" }) ); @@ -16,7 +16,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 const DEFAULT_FORM_HISTORY_NAME = "searchbar-history"; const UNLIMITED_MAX_RESULTS = 99; -@@ -355,7 +362,16 @@ export class UrlbarInput { +@@ -437,7 +444,16 @@ export class UrlbarInput { // See _on_select(). HTMLInputElement.select() dispatches a "select" // event but does not set the primary selection. this._suppressPrimaryAdjustment = true; @@ -33,7 +33,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 this._suppressPrimaryAdjustment = false; } -@@ -431,6 +447,10 @@ export class UrlbarInput { +@@ -513,6 +529,10 @@ export class UrlbarInput { hideSearchTerms = false, isSameDocument = false ) { @@ -41,10 +41,10 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 + return; + } + - // We only need to update the searchModeUI on tab switch conditionally - // as we only persist searchMode with ScotchBonnet enabled. - if ( -@@ -703,8 +723,16 @@ export class UrlbarInput { + if (!this.isAddressbar) { + throw new Error( + "Cannot set URI for UrlbarInput that is not an address bar" +@@ -790,8 +810,16 @@ export class UrlbarInput { return; } } @@ -62,7 +62,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 } /** -@@ -1116,7 +1144,11 @@ export class UrlbarInput { +@@ -1207,7 +1235,11 @@ export class UrlbarInput { } if (!this.#providesSearchMode(result)) { @@ -75,7 +75,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 } if (isCanonized) { -@@ -2191,6 +2223,13 @@ export class UrlbarInput { +@@ -2298,6 +2330,13 @@ export class UrlbarInput { await this.#updateLayoutBreakoutDimensions(); } @@ -89,7 +89,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 startLayoutExtend() { if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) { // Do not expand if the Urlbar does not support being expanded or it is -@@ -2205,6 +2244,12 @@ export class UrlbarInput { +@@ -2312,6 +2351,12 @@ export class UrlbarInput { this.setAttribute("breakout-extend", "true"); @@ -102,7 +102,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 // Enable the animation only after the first extend call to ensure it // doesn't run when opening a new window. if (!this.hasAttribute("breakout-extend-animate")) { -@@ -2224,6 +2269,24 @@ export class UrlbarInput { +@@ -2331,6 +2376,24 @@ export class UrlbarInput { return; } @@ -127,7 +127,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 this.removeAttribute("breakout-extend"); this.#updateTextboxPosition(); } -@@ -2553,7 +2616,7 @@ export class UrlbarInput { +@@ -2660,7 +2723,7 @@ export class UrlbarInput { this.textbox.parentNode.style.setProperty( "--urlbar-container-height", @@ -136,7 +136,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 ); this.textbox.style.setProperty( "--urlbar-height", -@@ -2986,6 +3049,7 @@ export class UrlbarInput { +@@ -3093,6 +3156,7 @@ export class UrlbarInput { } _toggleActionOverride(event) { @@ -144,24 +144,24 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 if ( event.keyCode == KeyEvent.DOM_VK_SHIFT || event.keyCode == KeyEvent.DOM_VK_ALT || -@@ -3087,7 +3151,7 @@ export class UrlbarInput { - */ - _trimValue(val) { +@@ -3197,7 +3261,7 @@ export class UrlbarInput { + return val; + } let trimmedValue = lazy.UrlbarPrefs.get("trimURLs") - ? lazy.BrowserUIUtils.trimURL(val) + ? this._zenTrimURL(val) : val; // Only trim value if the directionality doesn't change to RTL and we're not // showing a strikeout https protocol. -@@ -3303,6 +3367,7 @@ export class UrlbarInput { - resultDetails = null, - browser = this.window.gBrowser.selectedBrowser - ) { +@@ -3407,6 +3471,7 @@ export class UrlbarInput { + ); + } + + openUILinkWhere = this.window.gZenUIManager.getOpenUILinkWhere(url, browser, openUILinkWhere); // No point in setting these because we'll handleRevert() a few rows below. if (openUILinkWhere == "current") { // Make sure URL is formatted properly (don't show punycode). -@@ -3455,6 +3520,10 @@ export class UrlbarInput { +@@ -3608,6 +3673,10 @@ export class UrlbarInput { } reuseEmpty = true; } @@ -172,7 +172,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 if ( where == "tab" && reuseEmpty && -@@ -3462,6 +3531,9 @@ export class UrlbarInput { +@@ -3615,6 +3684,9 @@ export class UrlbarInput { ) { where = "current"; } @@ -182,7 +182,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 return where; } -@@ -3719,6 +3791,7 @@ export class UrlbarInput { +@@ -3872,6 +3944,7 @@ export class UrlbarInput { this.setResultForCurrentValue(null); this.handleCommand(); this.controller.clearLastQueryContextCache(); @@ -190,7 +190,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 this._suppressStartQuery = false; }); -@@ -3726,7 +3799,6 @@ export class UrlbarInput { +@@ -3879,7 +3952,6 @@ export class UrlbarInput { contextMenu.addEventListener("popupshowing", () => { // Close the results pane when the input field contextual menu is open, // because paste and go doesn't want a result selection. @@ -198,7 +198,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 let controller = this.document.commandDispatcher.getControllerForCommand("cmd_paste"); -@@ -3836,7 +3908,11 @@ export class UrlbarInput { +@@ -3991,7 +4063,11 @@ export class UrlbarInput { if (!engineName && !source && !this.hasAttribute("searchmode")) { return; } @@ -208,10 +208,10 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 + detail: { searchMode }, + }) + ); - this._searchModeIndicatorTitle.textContent = ""; - this._searchModeIndicatorTitle.removeAttribute("data-l10n-id"); - -@@ -4130,6 +4206,7 @@ export class UrlbarInput { + if (this._searchModeIndicatorTitle) { + this._searchModeIndicatorTitle.textContent = ""; + this._searchModeIndicatorTitle.removeAttribute("data-l10n-id"); +@@ -4302,6 +4378,7 @@ export class UrlbarInput { this.document.l10n.setAttributes( this.inputField, @@ -219,7 +219,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 l10nId, l10nId == "urlbar-placeholder-with-name" ? { name } : undefined ); -@@ -4241,6 +4318,11 @@ export class UrlbarInput { +@@ -4413,6 +4490,11 @@ export class UrlbarInput { } _on_click(event) { @@ -231,7 +231,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 if ( event.target == this.inputField || event.target == this._inputContainer -@@ -4311,7 +4393,7 @@ export class UrlbarInput { +@@ -4485,7 +4567,7 @@ export class UrlbarInput { } } @@ -240,7 +240,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 this.view.autoOpen({ event }); } else { if (this._untrimOnFocusAfterKeydown) { -@@ -4351,9 +4433,16 @@ export class UrlbarInput { +@@ -4525,9 +4607,16 @@ export class UrlbarInput { } _on_mousedown(event) { @@ -258,7 +258,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 if ( event.target != this.inputField && -@@ -4364,6 +4453,10 @@ export class UrlbarInput { +@@ -4538,6 +4627,10 @@ export class UrlbarInput { this.focusedViaMousedown = !this.focused; this._preventClickSelectsAll = this.focused; @@ -269,7 +269,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 // Keep the focus status, since the attribute may be changed // upon calling this.focus(). -@@ -4399,7 +4492,7 @@ export class UrlbarInput { +@@ -4573,7 +4666,7 @@ export class UrlbarInput { } // Don't close the view when clicking on a tab; we may want to keep the // view open on tab switch, and the TabSelect event arrived earlier. @@ -278,7 +278,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..b63bf54956a42c63d5cadc9360545e23 break; } -@@ -4716,7 +4809,7 @@ export class UrlbarInput { +@@ -4890,7 +4983,7 @@ export class UrlbarInput { // When we are in actions search mode we can show more results so // increase the limit. let maxResults = diff --git a/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch b/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch index f1c290366..c737569ca 100644 --- a/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch @@ -1,16 +1,16 @@ diff --git a/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs b/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs -index cdc476a3eb2ee2cb6193d215513b65ed375f6153..bc66d9651e521bda75a3bb9e7f1e4b3bb325be90 100644 +index 20be2dbbb8471aeb43a9bf77888c9858a0b61186..a9f974a78c5676d1340a3543852e4126c1d32b04 100644 --- a/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs +++ b/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs -@@ -855,6 +855,7 @@ class MuxerUnifiedComplete extends UrlbarMuxer { +@@ -852,6 +852,7 @@ class MuxerUnifiedComplete extends UrlbarMuxer { } - if (result.providerName == lazy.UrlbarProviderTabToSearch.name) { + if (result.providerName == "UrlbarProviderTabToSearch") { + return false; // Discard the result if a tab-to-search result was added already. if (!state.canAddTabToSearch) { return false; -@@ -1501,7 +1502,9 @@ class MuxerUnifiedComplete extends UrlbarMuxer { +@@ -1498,7 +1499,9 @@ class MuxerUnifiedComplete extends UrlbarMuxer { usedLimits.maxResultCount++; } diff --git a/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch b/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch index 2b93e360f..539445412 100644 --- a/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarPrefs.sys.mjs b/browser/components/urlbar/UrlbarPrefs.sys.mjs -index 3c179db3b310c43f8c6c06b1ecbcf5ed59feefe6..d9d2ce116ebcee8d403e165066c3a569bb952cd2 100644 +index 46ad55519aecd6c14034a9faa91c7ad8e5c1c422..e8d9c06499a2b273483edd21faf902c936462b59 100644 --- a/browser/components/urlbar/UrlbarPrefs.sys.mjs +++ b/browser/components/urlbar/UrlbarPrefs.sys.mjs -@@ -719,6 +719,7 @@ function makeResultGroups({ showSearchSuggestionsFirst }) { +@@ -731,6 +731,7 @@ function makeResultGroups({ showSearchSuggestionsFirst }) { */ let rootGroup = { children: [ diff --git a/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch b/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch index df8854d91..7862a4a27 100644 --- a/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch @@ -1,13 +1,13 @@ diff --git a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs -index ad971f090bdaba2865cf1fac2840b1f553d2630c..a9e676e43d35b617eebd5a67c8653397b7c0c6bf 100644 +index b2c3bfa6fbe83fceb019196c210baaa7b4881372..02f2c8be89f163e16c5fd29f9b7e145e16ea53ed 100644 --- a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs +++ b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs -@@ -40,11 +40,13 @@ function defaultQuery(conditions = "") { +@@ -44,11 +44,13 @@ function defaultQuery(conditions = "") { let query = ` SELECT h.url, h.title, ${SQL_BOOKMARK_TAGS_FRAGMENT}, h.id, t.open_count, ${lazy.PAGES_FRECENCY_FIELD} AS frecency, t.userContextId, -- h.last_visit_date, t.groupId -+ h.last_visit_date, t.groupId, zp.url AS pinned_url, zp.title AS pinned_title +- h.last_visit_date, NULLIF(t.groupId, '') groupId ++ h.last_visit_date, NULLIF(t.groupId, '') groupId, zp.url AS pinned_url, zp.title AS pinned_title FROM moz_places h LEFT JOIN moz_openpages_temp t ON t.url = h.url @@ -17,7 +17,7 @@ index ad971f090bdaba2865cf1fac2840b1f553d2630c..a9e676e43d35b617eebd5a67c8653397 WHERE ( (:switchTabsEnabled AND t.open_count > 0) OR ${lazy.PAGES_FRECENCY_FIELD} <> 0 -@@ -58,7 +60,7 @@ function defaultQuery(conditions = "") { +@@ -62,7 +64,7 @@ function defaultQuery(conditions = "") { :matchBehavior, :searchBehavior, NULL) ELSE AUTOCOMPLETE_MATCH(:searchString, h.url, @@ -26,7 +26,7 @@ index ad971f090bdaba2865cf1fac2840b1f553d2630c..a9e676e43d35b617eebd5a67c8653397 h.visit_count, h.typed, 0, t.open_count, :matchBehavior, :searchBehavior, NULL) -@@ -1116,11 +1118,13 @@ Search.prototype = { +@@ -1120,11 +1122,13 @@ Search.prototype = { ? lazy.PlacesUtils.toDate(lastVisitPRTime).getTime() : undefined; let tabGroup = row.getResultByName("groupId"); diff --git a/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch index 45f6b46e9..b06de00cf 100644 --- a/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs -index 555273f6ea1efd77aa3062b9910bbfe28568775d..5c4a46c926913ab592f5e12908b8817410abe6b6 100644 +index ece407214669009e263b507b5236ab28da33efe9..8f22426295e2b001438918f44d2c22ed7a697c2f 100644 --- a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs +++ b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs -@@ -716,6 +716,7 @@ export class Query { +@@ -845,6 +845,7 @@ export class Query { if ( result.heuristic && this.context.searchMode && diff --git a/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch b/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch index b477dc892..12bdd6dba 100644 --- a/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarUtils.sys.mjs b/browser/components/urlbar/UrlbarUtils.sys.mjs -index 0bc15c02f56dd8f46a21fed02b4e21a741f27f41..40da868f68f21d8411107fb8a95e2d0b74337b51 100644 +index f38e860e46fa979b3e0c66ecd3eb88a64df60fc1..d130bbc7488ff3de926823974a1df13dc8e61fbc 100644 --- a/browser/components/urlbar/UrlbarUtils.sys.mjs +++ b/browser/components/urlbar/UrlbarUtils.sys.mjs -@@ -75,6 +75,7 @@ export var UrlbarUtils = { +@@ -74,6 +74,7 @@ export var UrlbarUtils = { RESTRICT_SEARCH_KEYWORD: "restrictSearchKeyword", SUGGESTED_INDEX: "suggestedIndex", TAIL_SUGGESTION: "tailSuggestion", @@ -10,7 +10,7 @@ index 0bc15c02f56dd8f46a21fed02b4e21a741f27f41..40da868f68f21d8411107fb8a95e2d0b }), // Defines provider types. -@@ -134,6 +135,7 @@ export var UrlbarUtils = { +@@ -133,6 +134,7 @@ export var UrlbarUtils = { OTHER_NETWORK: 6, ADDON: 7, ACTIONS: 8, @@ -18,12 +18,12 @@ index 0bc15c02f56dd8f46a21fed02b4e21a741f27f41..40da868f68f21d8411107fb8a95e2d0b }), // Per-result exposure telemetry. -@@ -553,6 +555,8 @@ export var UrlbarUtils = { - return this.RESULT_GROUP.HEURISTIC_SEARCH_TIP; - case "HistoryUrlHeuristic": +@@ -544,6 +546,8 @@ export var UrlbarUtils = { + return this.RESULT_GROUP.HEURISTIC_FALLBACK; + case "UrlbarProviderHistoryUrlHeuristic": return this.RESULT_GROUP.HEURISTIC_HISTORY_URL; + case "ZenUrlbarProviderGlobalActions": + return this.RESULT_GROUP.ZEN_ACTION; - default: - if (result.providerName.startsWith("TestProvider")) { - return this.RESULT_GROUP.HEURISTIC_TEST; + case "UrlbarProviderOmnibox": + return this.RESULT_GROUP.HEURISTIC_OMNIBOX; + case "UrlbarProviderRestrictKeywordsAutofill": diff --git a/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch b/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch index fe22eed31..81ea5fc30 100644 --- a/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs -index dfa91b76ad3890ceadb1b1b5d7a63b7074fbb776..6369fa1cdb242de32338bbce6debcdab2a04ca02 100644 +index 50961e4beb75012ef0ed6f261a95854712cc69d7..93bcfca9270ff34dbe6386789fdae6066457438d 100644 --- a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs +++ b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs @@ -585,6 +585,7 @@ export class UrlbarValueFormatter { diff --git a/src/browser/components/urlbar/UrlbarView-sys-mjs.patch b/src/browser/components/urlbar/UrlbarView-sys-mjs.patch index 0e0812bd7..26c99b0e8 100644 --- a/src/browser/components/urlbar/UrlbarView-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarView-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarView.sys.mjs b/browser/components/urlbar/UrlbarView.sys.mjs -index fdbab8806fd320f4aacec46a42c8ef953580d00c..031a615ad09274c578184b129434bbd93b49353d 100644 +index b3c7c8a995226e2cbe852d82515f9bc7077980e7..4c8611556f7f71e5f8860787ed1db9b50b9fa2e8 100644 --- a/browser/components/urlbar/UrlbarView.sys.mjs +++ b/browser/components/urlbar/UrlbarView.sys.mjs -@@ -613,7 +613,7 @@ export class UrlbarView { +@@ -620,7 +620,7 @@ export class UrlbarView { !this.input.value || this.input.getAttribute("pageproxystate") == "valid" ) { @@ -11,7 +11,7 @@ index fdbab8806fd320f4aacec46a42c8ef953580d00c..031a615ad09274c578184b129434bbd9 // Try to reuse the cached top-sites context. If it's not cached, then // there will be a gap of time between when the input is focused and // when the view opens that can be perceived as flicker. -@@ -2706,6 +2706,8 @@ export class UrlbarView { +@@ -2734,6 +2734,8 @@ export class UrlbarView { if (row?.hasAttribute("row-selectable")) { row?.toggleAttribute("selected", true); } @@ -20,12 +20,12 @@ index fdbab8806fd320f4aacec46a42c8ef953580d00c..031a615ad09274c578184b129434bbd9 if (element != row) { row?.toggleAttribute("descendant-selected", true); } -@@ -3189,7 +3191,7 @@ export class UrlbarView { +@@ -3215,7 +3217,7 @@ export class UrlbarView { } #enableOrDisableRowWrap() { - let wrap = getBoundsWithoutFlushing(this.input.textbox).width < 650; + let wrap = false; this.#rows.toggleAttribute("wrap", wrap); - this.oneOffSearchButtons.container.toggleAttribute("wrap", wrap); + this.oneOffSearchButtons?.container.toggleAttribute("wrap", wrap); } diff --git a/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch b/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch index 608533a1e..fb2d74187 100644 --- a/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch +++ b/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/extensions/newtab/lib/ActivityStream.sys.mjs b/browser/extensions/newtab/lib/ActivityStream.sys.mjs -index 1a482b6de24468ccfec069586f374937d8ef68dd..8614beda3fdfc038092f31f11b2604d5cfb843a1 100644 +index 6207e6c8aa1e303ec151bc1e5c51c277ef776ee6..d3783a3c459c94880be1c95dc265a7d4887f67a1 100644 --- a/browser/extensions/newtab/lib/ActivityStream.sys.mjs +++ b/browser/extensions/newtab/lib/ActivityStream.sys.mjs -@@ -248,7 +248,7 @@ export const PREFS_CONFIG = new Map([ +@@ -223,7 +223,7 @@ export const PREFS_CONFIG = new Map([ "showSponsoredTopSites", { title: "Show sponsored top sites", diff --git a/src/browser/installer/package-manifest-in.patch b/src/browser/installer/package-manifest-in.patch index 7cc6a9526..2f18925ed 100644 --- a/src/browser/installer/package-manifest-in.patch +++ b/src/browser/installer/package-manifest-in.patch @@ -1,8 +1,8 @@ diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in -index 70f268914f1078ef45e86d295f4bb2ce179a05e0..73d8ffc4457468e8a57ad2c29e4d49f45436bf00 100644 +index b884f0167e5de87a45cf523436ceaceb710d35ae..eedc80278a5c93f81ce90c0d6198924549c07fc3 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in -@@ -361,17 +361,17 @@ bin/libfreebl_64int_3.so +@@ -362,17 +362,17 @@ bin/libfreebl_64int_3.so ; [MaintenanceService] ; #ifdef MOZ_MAINTENANCE_SERVICE diff --git a/src/browser/themes/BuiltInThemeConfig-sys-mjs.patch b/src/browser/themes/BuiltInThemeConfig-sys-mjs.patch deleted file mode 100644 index ae66873e5..000000000 --- a/src/browser/themes/BuiltInThemeConfig-sys-mjs.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/browser/themes/BuiltInThemeConfig.sys.mjs b/browser/themes/BuiltInThemeConfig.sys.mjs -index 28b254d5757caf35c4ba755ef4cfed44bab5af00..660f517e0e3342970c6e30837fcf4d0adf360777 100644 ---- a/browser/themes/BuiltInThemeConfig.sys.mjs -+++ b/browser/themes/BuiltInThemeConfig.sys.mjs -@@ -33,11 +33,4 @@ export const BuiltInThemeConfig = new Map([ - path: "resource://builtin-themes/dark/", - }, - ], -- [ -- "firefox-alpenglow@mozilla.org", -- { -- version: "1.5", -- path: "resource://builtin-themes/alpenglow/", -- }, -- ], - ]); diff --git a/src/browser/themes/linux/browser-css.patch b/src/browser/themes/linux/browser-css.patch index dfaee3e7d..81b190aaf 100644 --- a/src/browser/themes/linux/browser-css.patch +++ b/src/browser/themes/linux/browser-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css -index 9723a8199cc5b8d25bb92c46992792b8c94a3565..302f5b675abd1970e64f56a5a4592bb174f9a72a 100644 +index b0ec88f361399cea255ef8fb6c7f2b87779a8e04..c7ca01c2033f9a300caa1a1e3de9d5517d438796 100644 --- a/browser/themes/linux/browser.css +++ b/browser/themes/linux/browser.css @@ -43,7 +43,8 @@ diff --git a/src/browser/themes/osx/browser-css.patch b/src/browser/themes/osx/browser-css.patch index c48477643..cdaeb1877 100644 --- a/src/browser/themes/osx/browser-css.patch +++ b/src/browser/themes/osx/browser-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css -index c209151370225d8efade7c51aea30ce7365e5f4f..4dd5cf4a98ea010b2d347ac0ba7314ae81320e75 100644 +index b1062108c6f6174a680e9b235ee9cb2037f94924..31aac7bdee4ebb07e9de58e7c3e5e6833c94e968 100644 --- a/browser/themes/osx/browser.css +++ b/browser/themes/osx/browser.css @@ -38,7 +38,7 @@ diff --git a/src/browser/themes/shared/browser-shared-css.patch b/src/browser/themes/shared/browser-shared-css.patch index b76cd554b..009a642c9 100644 --- a/src/browser/themes/shared/browser-shared-css.patch +++ b/src/browser/themes/shared/browser-shared-css.patch @@ -1,8 +1,8 @@ diff --git a/browser/themes/shared/browser-shared.css b/browser/themes/shared/browser-shared.css -index c612e7d021122e3e4823994071cd613563d3e12e..682d7a47624460ce33e8fcb5ff9c995f3413bab2 100644 +index c77a0e6388c4061d9e6ee5f396a3e3af8867e4fe..d37e49538cd07716da5ebed823622fccde5dd69a 100644 --- a/browser/themes/shared/browser-shared.css +++ b/browser/themes/shared/browser-shared.css -@@ -99,7 +99,7 @@ body { +@@ -102,7 +102,7 @@ body { --toolbarbutton-border-radius: 4px; --identity-box-margin-inline: 4px; --urlbar-min-height: max(32px, 1.4em); @@ -11,7 +11,7 @@ index c612e7d021122e3e4823994071cd613563d3e12e..682d7a47624460ce33e8fcb5ff9c995f /* This should be used for icons and chiclets inside the input field. It makes the gap around them more uniform when they are close to the field edges */ -@@ -167,8 +167,6 @@ body { +@@ -170,8 +170,6 @@ body { */ &.fullscreen-with-menubar { z-index: var(--browser-area-z-index-toolbox-while-animating); diff --git a/src/browser/themes/shared/jar-inc-mn.patch b/src/browser/themes/shared/jar-inc-mn.patch index 09c2b92d2..003aa4104 100644 --- a/src/browser/themes/shared/jar-inc-mn.patch +++ b/src/browser/themes/shared/jar-inc-mn.patch @@ -1,11 +1,11 @@ diff --git a/browser/themes/shared/jar.inc.mn b/browser/themes/shared/jar.inc.mn -index bc47c162cd4792c7df17565014aac1c2258c6d40..21c0b7ddb04cbb828c758dad34885f91c1ddde6c 100644 +index 94036d036a64c8845c02d4ffbcf3f99b5d88576e..2ab3f060c9952f1b0c7bee3d5c3a1d7035e6736a 100644 --- a/browser/themes/shared/jar.inc.mn +++ b/browser/themes/shared/jar.inc.mn @@ -316,3 +316,5 @@ - skin/classic/browser/weather/night-mostly-cloudy-with-flurries.svg (../shared/weather/night-mostly-cloudy-with-flurries.svg) skin/classic/browser/illustrations/market-opt-in.svg (../shared/illustrations/market-opt-in.svg) + skin/classic/browser/illustrations/yelpRealtime-opt-in.svg (../shared/illustrations/yelpRealtime-opt-in.svg) + +#include zen-sources.inc.mn \ No newline at end of file diff --git a/src/browser/themes/shared/tabbrowser/content-area-css.patch b/src/browser/themes/shared/tabbrowser/content-area-css.patch index 9511724fd..dd1164699 100644 --- a/src/browser/themes/shared/tabbrowser/content-area-css.patch +++ b/src/browser/themes/shared/tabbrowser/content-area-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/tabbrowser/content-area.css b/browser/themes/shared/tabbrowser/content-area.css -index 44f6c942f2e4b08f784b2ff96f785e9beed01ecd..834e174186972c3297a552bbd579f0ea1261c19e 100644 +index e06addf1602dc26ff4e75a8db6251231690f3f80..86e2cd0194bb37fa140a2f93eccfdd61419a9aec 100644 --- a/browser/themes/shared/tabbrowser/content-area.css +++ b/browser/themes/shared/tabbrowser/content-area.css @@ -276,7 +276,7 @@ diff --git a/src/browser/themes/shared/tabbrowser/tabs-css.patch b/src/browser/themes/shared/tabbrowser/tabs-css.patch index e00e45fc2..1e127b19f 100644 --- a/src/browser/themes/shared/tabbrowser/tabs-css.patch +++ b/src/browser/themes/shared/tabbrowser/tabs-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css -index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f52d78a307 100644 +index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d85fc4c91a 100644 --- a/browser/themes/shared/tabbrowser/tabs.css +++ b/browser/themes/shared/tabbrowser/tabs.css @@ -21,7 +21,7 @@ @@ -102,7 +102,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5 &:is([soundplaying], [muted], [activemedia-blocked]) { display: flex; } -@@ -1137,7 +1130,7 @@ tab-group { +@@ -1226,7 +1219,7 @@ tab-group { } #tabbrowser-tabs[orient="vertical"][expanded] { @@ -111,7 +111,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5 &[movingtab][movingtab-addToGroup]:not([movingtab-group], [movingtab-ungroup]) .tabbrowser-tab:is(:active, [multiselected]) { margin-inline-start: var(--space-medium); } -@@ -1567,7 +1560,7 @@ tab-group { +@@ -1685,7 +1678,7 @@ tab-group { } } @@ -120,7 +120,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5 #vertical-tabs-newtab-button { appearance: none; min-height: var(--tab-min-height); -@@ -1578,7 +1571,7 @@ tab-group { +@@ -1696,7 +1689,7 @@ tab-group { margin-inline: var(--tab-inner-inline-margin); #tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text { @@ -129,7 +129,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5 } &:hover { -@@ -1602,7 +1595,7 @@ tab-group { +@@ -1720,7 +1713,7 @@ tab-group { * flex container. #tabs-newtab-button is a child of the arrowscrollbox where * we don't want a gap (between tabs), so we have to add some margin. */ @@ -138,7 +138,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5 margin-block: var(--tab-block-margin); } -@@ -1793,7 +1786,6 @@ tab-group { +@@ -1913,7 +1906,6 @@ tab-group { &:not([expanded]) { .tabbrowser-tab[pinned] { @@ -146,7 +146,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5 } .tab-background { -@@ -1833,8 +1825,8 @@ tab-group { +@@ -1953,8 +1945,8 @@ tab-group { display: block; position: absolute; inset: auto; @@ -157,7 +157,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5 &:-moz-window-inactive { background-image: -@@ -1953,7 +1945,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button { +@@ -2073,7 +2065,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button { list-style-image: url(chrome://global/skin/icons/plus.svg); } diff --git a/src/browser/themes/shared/toolbarbuttons-css.patch b/src/browser/themes/shared/toolbarbuttons-css.patch index 12714ef02..f4dd140a8 100644 --- a/src/browser/themes/shared/toolbarbuttons-css.patch +++ b/src/browser/themes/shared/toolbarbuttons-css.patch @@ -1,8 +1,8 @@ diff --git a/browser/themes/shared/toolbarbuttons.css b/browser/themes/shared/toolbarbuttons.css -index e7b1c17391ffae02226015d0dd8bbe8eca29731f..938a8cb8c3d854a75fe300db2a7330d188c9ed6f 100644 +index e2b8a7cae70ed2bd3c80ee4214a09dbdb68a0d01..71320c7268d92aaa06bfa15c74bdbf02f1442745 100644 --- a/browser/themes/shared/toolbarbuttons.css +++ b/browser/themes/shared/toolbarbuttons.css -@@ -256,7 +256,7 @@ toolbar .toolbaritem-combined-buttons > separator { +@@ -279,7 +279,7 @@ toolbar .toolbaritem-combined-buttons { #nav-bar-overflow-button { list-style-image: url("chrome://global/skin/icons/chevron.svg"); @@ -11,7 +11,7 @@ index e7b1c17391ffae02226015d0dd8bbe8eca29731f..938a8cb8c3d854a75fe300db2a7330d1 display: none; } -@@ -466,7 +466,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) { +@@ -489,7 +489,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) { */ align-items: stretch; > .toolbarbutton-icon { diff --git a/src/browser/themes/shared/urlbar-searchbar-css.patch b/src/browser/themes/shared/urlbar-searchbar-css.patch index f0608a0f6..2d75c52f7 100644 --- a/src/browser/themes/shared/urlbar-searchbar-css.patch +++ b/src/browser/themes/shared/urlbar-searchbar-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css -index 11636a976736ba56dcc5a58081cee998bbdf58d4..0a6ca26f25511c799d8b40484b6bd1c81ceeb4e0 100644 +index 1744e627bbcfc69ccccb207ad1cbf0c262afb9be..50cc9da2076d946771fb5aca1402f1cbe6a531c8 100644 --- a/browser/themes/shared/urlbar-searchbar.css +++ b/browser/themes/shared/urlbar-searchbar.css @@ -6,7 +6,7 @@ @@ -11,7 +11,7 @@ index 11636a976736ba56dcc5a58081cee998bbdf58d4..0a6ca26f25511c799d8b40484b6bd1c8 --urlbar-margin-inline: 5px; --urlbar-padding-block: 4px; -@@ -33,7 +33,7 @@ +@@ -48,7 +48,7 @@ #urlbar[usertyping] > .urlbar-input-container > #page-action-buttons > #urlbar-zoom-button, .urlbar:is(:not([usertyping]), :not([focused])) > .urlbar-input-container > .urlbar-go-button, .urlbar-revert-button-container { @@ -20,7 +20,7 @@ index 11636a976736ba56dcc5a58081cee998bbdf58d4..0a6ca26f25511c799d8b40484b6bd1c8 } /* When rich suggestions are enabled the urlbar identity icon is given extra padding to -@@ -307,10 +307,14 @@ +@@ -321,10 +321,14 @@ .urlbar[breakout][breakout-extend] { height: auto; diff --git a/src/browser/themes/shared/urlbarView-css.patch b/src/browser/themes/shared/urlbarView-css.patch index bba5d89a9..9e692c3be 100644 --- a/src/browser/themes/shared/urlbarView-css.patch +++ b/src/browser/themes/shared/urlbarView-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/urlbarView.css b/browser/themes/shared/urlbarView.css -index 743b1bc81474378ac994ca9cfeb8f4cc6b434581..3486cebd74efa2df481d2a112e89b219bd6bb8a2 100644 +index ec849fc792572e75d12b9e7cd7e6b7f32c799fa9..17c7d442854b774817ef5b3b96e732c19bebef9d 100644 --- a/browser/themes/shared/urlbarView.css +++ b/browser/themes/shared/urlbarView.css @@ -20,7 +20,7 @@ diff --git a/src/browser/themes/windows/browser-css.patch b/src/browser/themes/windows/browser-css.patch index 5b064a7bb..c8e03bdee 100644 --- a/src/browser/themes/windows/browser-css.patch +++ b/src/browser/themes/windows/browser-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css -index 4485369284ee762bc8b35afb84fec0874a831fff..6a1ad15f657437aa4ef98fda63ae921a378f7310 100644 +index e1a79cd22180738d2ca16e9a6c5591499d337325..d36996359bfa4dd7d98c4f5aeb192c7b144339bb 100644 --- a/browser/themes/windows/browser.css +++ b/browser/themes/windows/browser.css @@ -31,7 +31,6 @@ diff --git a/src/build/moz-build.patch b/src/build/moz-build.patch index 596a09b20..7ccf4194c 100644 --- a/src/build/moz-build.patch +++ b/src/build/moz-build.patch @@ -1,8 +1,8 @@ diff --git a/build/moz.build b/build/moz.build -index f7a912ec35dd089ea9a7e712765e954854f55cb3..a84534efbc7662f81573a4a80bc045e0a6d2ed3e 100644 +index 720fb1235f418fb063e88d8bbcd2eb444e84870b..ed831a4d35e006bc03aa514a6c00968a4dd19624 100644 --- a/build/moz.build +++ b/build/moz.build -@@ -89,7 +89,7 @@ if CONFIG["MOZ_APP_BASENAME"]: +@@ -93,7 +93,7 @@ if CONFIG["MOZ_APP_BASENAME"]: if CONFIG[var]: appini_defines[var] = True diff --git a/src/devtools/server/actors/animation-type-longhand-js.patch b/src/devtools/server/actors/animation-type-longhand-js.patch index d9872df5a..29e44807d 100644 --- a/src/devtools/server/actors/animation-type-longhand-js.patch +++ b/src/devtools/server/actors/animation-type-longhand-js.patch @@ -1,8 +1,8 @@ diff --git a/devtools/server/actors/animation-type-longhand.js b/devtools/server/actors/animation-type-longhand.js -index 17960549c60ebab9ac7c50a70cb69a6b1f8c37dd..9a9ec4539d39f20dccf449cbdcd066efee145b50 100644 +index ea27f1209ddb9b33ae044186c2b795685a0bde67..6d808a760885f0e26ff307a39d6977228359fe71 100644 --- a/devtools/server/actors/animation-type-longhand.js +++ b/devtools/server/actors/animation-type-longhand.js -@@ -343,6 +343,7 @@ exports.ANIMATION_TYPE_FOR_LONGHANDS = [ +@@ -344,6 +344,7 @@ exports.ANIMATION_TYPE_FOR_LONGHANDS = [ "transform-origin", "translate", "-moz-window-transform", diff --git a/src/devtools/startup/DevToolsStartup-sys-mjs.patch b/src/devtools/startup/DevToolsStartup-sys-mjs.patch index b9c5e983d..9f7ea1c66 100644 --- a/src/devtools/startup/DevToolsStartup-sys-mjs.patch +++ b/src/devtools/startup/DevToolsStartup-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/devtools/startup/DevToolsStartup.sys.mjs b/devtools/startup/DevToolsStartup.sys.mjs -index 175edde2720f31c796e8ae8823e2aff17944f423..d9d4f7f5e53064b1ba07870dced2e1452fdde6b1 100644 +index 95de0614e392e00036500a5b3ef9976041f37ec6..2c842055ce1d7ffd94c8f21a82305a3a13d493e0 100644 --- a/devtools/startup/DevToolsStartup.sys.mjs +++ b/devtools/startup/DevToolsStartup.sys.mjs @@ -816,6 +816,7 @@ DevToolsStartup.prototype = { diff --git a/src/dom/base/Document-cpp.patch b/src/dom/base/Document-cpp.patch index 022968aaa..37f0f667b 100644 --- a/src/dom/base/Document-cpp.patch +++ b/src/dom/base/Document-cpp.patch @@ -1,8 +1,8 @@ diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp -index 7d7a93e9e76b4957e3ac5860dfc730b7c4e6ad1d..c7c689b73c6599e9e736f73a67bb402d083964a0 100644 +index 0c2ef36f9765b6904659ac0ed4329468ca89225f..d06552e8d4ac102dd50a1afea10938ca32aeb788 100644 --- a/dom/base/Document.cpp +++ b/dom/base/Document.cpp -@@ -467,6 +467,7 @@ +@@ -466,6 +466,7 @@ #include "prtime.h" #include "prtypes.h" #include "xpcpublic.h" @@ -10,7 +10,7 @@ index 7d7a93e9e76b4957e3ac5860dfc730b7c4e6ad1d..c7c689b73c6599e9e736f73a67bb402d // clang-format off #include "mozilla/Encoding.h" -@@ -3345,6 +3346,10 @@ void Document::FillStyleSetUserAndUASheets() { +@@ -3428,6 +3429,10 @@ void Document::FillStyleSetUserAndUASheets() { for (StyleSheet* sheet : *sheetService->UserStyleSheets()) { styleSet.AppendStyleSheet(*sheet); } diff --git a/src/dom/base/use_counter_metrics-yaml.patch b/src/dom/base/use_counter_metrics-yaml.patch index e8f250c47..eeac251f7 100644 --- a/src/dom/base/use_counter_metrics-yaml.patch +++ b/src/dom/base/use_counter_metrics-yaml.patch @@ -1,8 +1,8 @@ diff --git a/dom/base/use_counter_metrics.yaml b/dom/base/use_counter_metrics.yaml -index adf8d1ed451a54426d92e65557801cffa2f64281..0bf810d3544e42689ad530468bfce5380a51e274 100644 +index 157d46c37d0a465f02f794eda4323f7e344c5e63..aec8b819dbcf853c2e6d5513000149449fae36fd 100644 --- a/dom/base/use_counter_metrics.yaml +++ b/dom/base/use_counter_metrics.yaml -@@ -21477,6 +21477,22 @@ use.counter.css.page: +@@ -21154,6 +21154,22 @@ use.counter.css.page: send_in_pings: - use-counters @@ -25,7 +25,7 @@ index adf8d1ed451a54426d92e65557801cffa2f64281..0bf810d3544e42689ad530468bfce538 css_transform_origin: type: counter description: > -@@ -33481,6 +33497,22 @@ use.counter.css.doc: +@@ -33175,6 +33191,22 @@ use.counter.css.doc: send_in_pings: - use-counters diff --git a/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch b/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch index 60236c198..da62b610d 100644 --- a/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch +++ b/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch @@ -1,5 +1,5 @@ diff --git a/dom/media/mediaelement/HTMLMediaElement.cpp b/dom/media/mediaelement/HTMLMediaElement.cpp -index d46d5edc1d66c1eee8780abad444289fdc36a518..0e0d69819d9eee82add726792ec829c05551a076 100644 +index 741a8f1744f48e7db4dbda64c856efaf9f3564b0..f9a2c0878f8a923903ed8eb65cbd355d40b41715 100644 --- a/dom/media/mediaelement/HTMLMediaElement.cpp +++ b/dom/media/mediaelement/HTMLMediaElement.cpp @@ -453,6 +453,7 @@ class HTMLMediaElement::MediaControlKeyListener final @@ -10,7 +10,7 @@ index d46d5edc1d66c1eee8780abad444289fdc36a518..0e0d69819d9eee82add726792ec829c0 NotifyAudibleStateChanged(mIsOwnerAudible ? MediaAudibleState::eAudible : MediaAudibleState::eInaudible); -@@ -7034,6 +7035,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) { +@@ -7191,6 +7192,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) { QueueTask(std::move(runner)); mQueueTimeUpdateRunnerTime = TimeStamp::Now(); mLastCurrentTime = CurrentTime(); diff --git a/src/firefox-patches/ff142-gradient-dithering.patch b/src/firefox-patches/ff142-gradient-dithering.patch deleted file mode 100644 index 26a1dbf86..000000000 --- a/src/firefox-patches/ff142-gradient-dithering.patch +++ /dev/null @@ -1,545 +0,0 @@ -diff --git a/gfx/webrender_bindings/src/bindings.rs b/gfx/webrender_bindings/src/bindings.rs -index 578c2f80a9db..08823b7fea22 100644 ---- a/gfx/webrender_bindings/src/bindings.rs -+++ b/gfx/webrender_bindings/src/bindings.rs -@@ -2144,12 +2144,6 @@ pub extern "C" fn wr_window_new( - } - }; - -- let enable_dithering = if !software && static_prefs::pref!("gfx.webrender.dithering") { -- true -- } else { -- false -- }; -- - let opts = WebRenderOptions { - enable_aa: true, - enable_subpixel_aa, -@@ -2204,7 +2198,6 @@ pub extern "C" fn wr_window_new( - reject_software_rasterizer, - low_quality_pinch_zoom, - max_shared_surface_size, -- enable_dithering, - ..Default::default() - }; - -@@ -4615,11 +4608,8 @@ pub extern "C" fn wr_shaders_new( - - device.begin_frame(); - -- let mut options = WebRenderOptions::default(); -- options.enable_dithering = static_prefs::pref!("gfx.webrender.dithering"); -- - let gl_type = device.gl().get_type(); -- let mut shaders = match Shaders::new(&mut device, gl_type, &options) { -+ let mut shaders = match Shaders::new(&mut device, gl_type, &WebRenderOptions::default()) { - Ok(shaders) => shaders, - Err(e) => { - warn!(" Failed to create a Shaders: {:?}", e); -diff --git a/gfx/wr/glsl-to-cxx/src/hir.rs b/gfx/wr/glsl-to-cxx/src/hir.rs -index 626a3643e6ee..f0bb95d1df38 100644 ---- a/gfx/wr/glsl-to-cxx/src/hir.rs -+++ b/gfx/wr/glsl-to-cxx/src/hir.rs -@@ -3964,6 +3964,14 @@ pub fn ast_to_hir(state: &mut State, tu: &syntax::TranslationUnit) -> Translatio - vec![Type::new(Sampler2D), Type::new(Int), Type::new(Float), Type::new(Bool), Type::new(Bool), - Type::new(Vec2), Type::new(Vec2), Type::new(Float)], - ); -+ declare_function( -+ state, -+ "swgl_commitDitheredLinearGradientRGBA8", -+ None, -+ Type::new(Void), -+ vec![Type::new(Sampler2D), Type::new(Int), Type::new(Float), Type::new(Bool), Type::new(Bool), -+ Type::new(Vec2), Type::new(Vec2), Type::new(Float), Type::new(Vec4)], -+ ); - declare_function( - state, - "swgl_commitRadialGradientRGBA8", -@@ -3972,6 +3980,14 @@ pub fn ast_to_hir(state: &mut State, tu: &syntax::TranslationUnit) -> Translatio - vec![Type::new(Sampler2D), Type::new(Int), Type::new(Float), Type::new(Bool), Type::new(Vec2), - Type::new(Float)], - ); -+ declare_function( -+ state, -+ "swgl_commitDitheredRadialGradientRGBA8", -+ None, -+ Type::new(Void), -+ vec![Type::new(Sampler2D), Type::new(Int), Type::new(Float), Type::new(Bool), Type::new(Vec2), -+ Type::new(Float), Type::new(Vec4)], -+ ); - declare_function( - state, - "swgl_commitGradientRGBA8", -diff --git a/gfx/wr/swgl/build.rs b/gfx/wr/swgl/build.rs -index fd6ec3fc4726..b8c9ad2ec174 100644 ---- a/gfx/wr/swgl/build.rs -+++ b/gfx/wr/swgl/build.rs -@@ -142,6 +142,7 @@ fn main() { - let shader_flags = ShaderFeatureFlags::GL - | ShaderFeatureFlags::DUAL_SOURCE_BLENDING - | ShaderFeatureFlags::ADVANCED_BLEND_EQUATION -+ | ShaderFeatureFlags::DITHERING - | ShaderFeatureFlags::DEBUG; - let mut shaders: Vec = Vec::new(); - for (name, features) in get_shader_features(shader_flags) { -diff --git a/gfx/wr/swgl/src/swgl_ext.h b/gfx/wr/swgl/src/swgl_ext.h -index 36b66843f63a..5a517afbe25c 100644 ---- a/gfx/wr/swgl/src/swgl_ext.h -+++ b/gfx/wr/swgl/src/swgl_ext.h -@@ -1383,14 +1383,63 @@ static inline WideRGBA8 sampleGradient(sampler2D sampler, int address, - swgl_commitChunk(RGBA8, applyColor(sampleGradient(sampler, address, entry), \ - packColor(swgl_OutRGBA, color))) - -+static const int8_t ditherNoiseMatrix[] = { -+ -126, 66, -78, 114, -114, 78, -66, 126, 2, -62, 50, -14, 14, -+ -50, 62, -2, -94, 98, -110, 82, -82, 110, -98, 94, 34, -30, -+ 18, -46, 46, -18, 30, -34, -118, 74, -70, 122, -122, 70, -74, -+ 118, 10, -54, 58, -6, 6, -58, 54, -10, -86, 106, -102, 90, -+ -90, 102, -106, 86, 42, -22, 26, -38, 38, -26, 22, -42, -+}; -+ -+// Values in color should be in the 0..0xFF00 range so that dithering has enough -+// overhead to avoid overflow. -+static inline VectorType dither( -+ const VectorType* color, ivec4_scalar fragCoord) { -+ VectorType ret = *color; -+ -+ // This isn't technically proper behaviour, but it's fast. Proper -+ // behaviour would be to do a bounds check on every addition, or to otherwise -+ // recreate that behaviour. Instead, we refuse to dither all 4 -+ // pixels if any channel from any one of them would underflow. -+ auto boundsCheck = ret < 126; -+ -+ // This is a vectorized or operation on all RGB values (ignores A) -+ auto boundsCheckRGB = SHUFFLE(boundsCheck, boundsCheck, 0, 1, 2, 4, 5, 6, 8, -+ 9, 10, 12, 13, 14, 0, 0, 0, 0); -+ auto boundsCheckRGBReducedV8 = -+ lowHalf(boundsCheckRGB) | highHalf(boundsCheckRGB); -+ auto boundsCheckRGBReducedV4 = -+ lowHalf(boundsCheckRGBReducedV8) | highHalf(boundsCheckRGBReducedV8); -+ auto boundsCheckRGBReducedV2 = -+ lowHalf(boundsCheckRGBReducedV4) | highHalf(boundsCheckRGBReducedV4); -+ if (bit_cast(boundsCheckRGBReducedV2) != 0) { -+ return ret; -+ } -+ -+ const int row = (fragCoord.y & 7) * 8; -+ int8_t n0 = ditherNoiseMatrix[row + ((fragCoord.x + 0) & 7)]; -+ int8_t n1 = ditherNoiseMatrix[row + ((fragCoord.x + 1) & 7)]; -+ int8_t n2 = ditherNoiseMatrix[row + ((fragCoord.x + 2) & 7)]; -+ int8_t n3 = ditherNoiseMatrix[row + ((fragCoord.x + 3) & 7)]; -+ -+ VectorType noiseVector = { -+ uint16_t(n0), uint16_t(n0), uint16_t(n0), 0, -+ uint16_t(n1), uint16_t(n1), uint16_t(n1), 0, -+ uint16_t(n2), uint16_t(n2), uint16_t(n2), 0, -+ uint16_t(n3), uint16_t(n3), uint16_t(n3), 0}; -+ -+ ret += noiseVector; -+ return ret; -+} -+ - // Samples an entire span of a linear gradient by crawling the gradient table - // and looking for consecutive stops that can be merged into a single larger - // gradient, then interpolating between those larger gradients within the span. --template -+template - static bool commitLinearGradient(sampler2D sampler, int address, float size, - bool tileRepeat, bool gradientRepeat, vec2 pos, - const vec2_scalar& scaleDir, float startOffset, -- uint32_t* buf, int span) { -+ uint32_t* buf, int span, vec4 fragCoord) { - assert(sampler->format == TextureFormat::RGBA32F); - assert(address >= 0 && address < int(sampler->height * sampler->stride)); - GradientStops* stops = (GradientStops*)&sampler->buf[address]; -@@ -1402,6 +1451,11 @@ static bool commitLinearGradient(sampler2D sampler, int address, float size, - if (!isfinite(delta)) { - return false; - } -+ -+ // Only incremented in the case of dithering -+ ivec4_scalar currentFragCoord = -+ ivec4_scalar(fragCoord.x.x, fragCoord.y.x, fragCoord.z.x, fragCoord.w.x); -+ - // If we have a repeating brush, then the position will be modulo the [0,1) - // interval. Compute coefficients that can be used to quickly evaluate the - // distance to the interval boundary where the offset will wrap. -@@ -1536,7 +1590,14 @@ static bool commitLinearGradient(sampler2D sampler, int address, float size, - // deltas. - int segment = min(remaining, 256 / 4); - for (auto* end = buf + segment * 4; buf < end; buf += 4) { -- commit_blend_span(buf, bit_cast(color >> 8)); -+ if (DITHER) { -+ commit_blend_span( -+ buf, -+ bit_cast(dither(&color, currentFragCoord) >> 8)); -+ currentFragCoord.x += 4; -+ } else { -+ commit_blend_span(buf, bit_cast(color >> 8)); -+ } - color += deltaColor; - } - remaining -= segment; -@@ -1569,7 +1630,20 @@ static bool commitLinearGradient(sampler2D sampler, int address, float size, - // will calculate a table entry for each sample, assuming the samples may - // have different table entries. - Float entry = clamp(offset * size + 1.0f, 0.0f, 1.0f + size); -- commit_blend_span(buf, sampleGradient(sampler, address, entry)); -+ -+ if (DITHER) { -+ auto gradientSample = static_cast>( -+ sampleGradient(sampler, address, entry)) -+ << 8; -+ commit_blend_span( -+ buf, -+ static_cast( -+ dither(&gradientSample, currentFragCoord) >> 8)); -+ currentFragCoord.x += 4; -+ } else { -+ commit_blend_span( -+ buf, static_cast(sampleGradient(sampler, address, entry))); -+ } - span -= 4; - buf += 4; - pos += posStep; -@@ -1589,13 +1663,35 @@ static bool commitLinearGradient(sampler2D sampler, int address, float size, - do { \ - bool drawn = false; \ - if (blend_key) { \ -- drawn = commitLinearGradient( \ -+ drawn = commitLinearGradient( \ -+ sampler, address, size, tileRepeat, gradientRepeat, pos, scaleDir, \ -+ startOffset, swgl_OutRGBA8, swgl_SpanLength, \ -+ static_cast(0x0)); \ -+ } else { \ -+ drawn = commitLinearGradient( \ -+ sampler, address, size, tileRepeat, gradientRepeat, pos, scaleDir, \ -+ startOffset, swgl_OutRGBA8, swgl_SpanLength, \ -+ static_cast(0x0)); \ -+ } \ -+ if (drawn) { \ -+ swgl_OutRGBA8 += swgl_SpanLength; \ -+ swgl_SpanLength = 0; \ -+ } \ -+ } while (0) -+ -+#define swgl_commitDitheredLinearGradientRGBA8( \ -+ sampler, address, size, tileRepeat, gradientRepeat, pos, scaleDir, \ -+ startOffset, fragCoord) \ -+ do { \ -+ bool drawn = false; \ -+ if (blend_key) { \ -+ drawn = commitLinearGradient( \ - sampler, address, size, tileRepeat, gradientRepeat, pos, scaleDir, \ -- startOffset, swgl_OutRGBA8, swgl_SpanLength); \ -+ startOffset, swgl_OutRGBA8, swgl_SpanLength, fragCoord); \ - } else { \ -- drawn = commitLinearGradient( \ -+ drawn = commitLinearGradient( \ - sampler, address, size, tileRepeat, gradientRepeat, pos, scaleDir, \ -- startOffset, swgl_OutRGBA8, swgl_SpanLength); \ -+ startOffset, swgl_OutRGBA8, swgl_SpanLength, fragCoord); \ - } \ - if (drawn) { \ - swgl_OutRGBA8 += swgl_SpanLength; \ -@@ -1625,10 +1721,10 @@ static ALWAYS_INLINE auto fastLength(V v) { - // and looking for consecutive stops that can be merged into a single larger - // gradient, then interpolating between those larger gradients within the span - // based on the computed position relative to a radius. --template -+template - static bool commitRadialGradient(sampler2D sampler, int address, float size, - bool repeat, vec2 pos, float radius, -- uint32_t* buf, int span) { -+ uint32_t* buf, int span, vec4 fragCoord) { - assert(sampler->format == TextureFormat::RGBA32F); - assert(address >= 0 && address < int(sampler->height * sampler->stride)); - GradientStops* stops = (GradientStops*)&sampler->buf[address]; -@@ -1658,6 +1754,11 @@ static bool commitRadialGradient(sampler2D sampler, int address, float size, - if (!isfinite(deltaDelta) || !isfinite(radius)) { - return false; - } -+ -+ // Only incremented in the case of dithering -+ ivec4_scalar currentFragCoord = -+ ivec4_scalar(fragCoord.x.x, fragCoord.y.x, fragCoord.z.x, fragCoord.w.x); -+ - float invDelta, middleT, middleB; - if (deltaDelta > 0) { - invDelta = 1.0f / deltaDelta; -@@ -1778,9 +1879,12 @@ static bool commitRadialGradient(sampler2D sampler, int address, float size, - // Figure out how many chunks are actually inside the merged gradient. - if (t + 4.0f <= endT) { - int inside = int(endT - t) & ~3; -- // Convert start and end colors to BGRA and scale to 0..255 range later. -- auto minColorF = stops[minIndex].startColor.zyxw * 255.0f; -- auto maxColorF = stops[maxIndex].end_color().zyxw * 255.0f; -+ // Convert start and end colors to BGRA and scale to 0..0xFF00 range (for -+ // dithered) and 0..255 range (for non-dithered). -+ auto minColorF = -+ stops[minIndex].startColor.zyxw * (DITHER ? float(0xFF00) : 255.0f); -+ auto maxColorF = -+ stops[maxIndex].end_color().zyxw * (DITHER ? float(0xFF00) : 255.0f); - // Compute the change in color per change in gradient offset. - auto deltaColorF = - (maxColorF - minColorF) * (size / (maxIndex + 1 - minIndex)); -@@ -1789,18 +1893,29 @@ static bool commitRadialGradient(sampler2D sampler, int address, float size, - Float colorF = - minColorF - deltaColorF * (startRadius + (minIndex - 1) / size); - // Finally, walk over the span accumulating the position dot product and -- // getting its sqrt as an offset into the color ramp. Since we're already -- // in BGRA format and scaled to 255, we just need to round to an integer -- // and pack down to pixel format. -+ // getting its sqrt as an offset into the color ramp. At this point we -+ // just need to round to an integer and pack down to an 8-bit pixel -+ // format. - for (auto* end = buf + inside; buf < end; buf += 4) { - Float offsetG = fastSqrt(dotPos); -- commit_blend_span( -- buf, -- combine( -- packRGBA8(round_pixel(colorF + deltaColorF * offsetG.x, 1), -- round_pixel(colorF + deltaColorF * offsetG.y, 1)), -- packRGBA8(round_pixel(colorF + deltaColorF * offsetG.z, 1), -- round_pixel(colorF + deltaColorF * offsetG.w, 1)))); -+ if (DITHER) { -+ auto color = combine( -+ CONVERT(round_pixel(colorF + deltaColorF * offsetG.x, 1), U16), -+ CONVERT(round_pixel(colorF + deltaColorF * offsetG.y, 1), U16), -+ CONVERT(round_pixel(colorF + deltaColorF * offsetG.z, 1), U16), -+ CONVERT(round_pixel(colorF + deltaColorF * offsetG.w, 1), U16)); -+ commit_blend_span( -+ buf, static_cast( -+ dither(&color, currentFragCoord) >> 8)); -+ currentFragCoord.x += 4; -+ } else { -+ auto color = combine( -+ packRGBA8(round_pixel(colorF + deltaColorF * offsetG.x, 1), -+ round_pixel(colorF + deltaColorF * offsetG.y, 1)), -+ packRGBA8(round_pixel(colorF + deltaColorF * offsetG.z, 1), -+ round_pixel(colorF + deltaColorF * offsetG.w, 1))); -+ commit_blend_span(buf, color); -+ } - dotPos += dotPosDelta; - dotPosDelta += deltaDelta2; - } -@@ -1837,25 +1952,45 @@ static bool commitRadialGradient(sampler2D sampler, int address, float size, - // swglcommitLinearGradient, but given a varying 2D position scaled to - // gradient-space and a radius at which the distance from the origin maps to the - // start of the gradient table. --#define swgl_commitRadialGradientRGBA8(sampler, address, size, repeat, pos, \ -- radius) \ -- do { \ -- bool drawn = false; \ -- if (blend_key) { \ -- drawn = \ -- commitRadialGradient(sampler, address, size, repeat, pos, \ -- radius, swgl_OutRGBA8, swgl_SpanLength); \ -- } else { \ -- drawn = \ -- commitRadialGradient(sampler, address, size, repeat, pos, \ -- radius, swgl_OutRGBA8, swgl_SpanLength); \ -- } \ -- if (drawn) { \ -- swgl_OutRGBA8 += swgl_SpanLength; \ -- swgl_SpanLength = 0; \ -- } \ -+#define swgl_commitRadialGradientRGBA8(sampler, address, size, repeat, pos, \ -+ radius) \ -+ do { \ -+ bool drawn = false; \ -+ if (blend_key) { \ -+ drawn = commitRadialGradient( \ -+ sampler, address, size, repeat, pos, radius, swgl_OutRGBA8, \ -+ swgl_SpanLength, \ -+ static_cast(0x0)); \ -+ } else { \ -+ drawn = commitRadialGradient( \ -+ sampler, address, size, repeat, pos, radius, swgl_OutRGBA8, \ -+ swgl_SpanLength, \ -+ static_cast(0x0)); \ -+ } \ -+ if (drawn) { \ -+ swgl_OutRGBA8 += swgl_SpanLength; \ -+ swgl_SpanLength = 0; \ -+ } \ - } while (0) - -+#define swgl_commitDitheredRadialGradientRGBA8( \ -+ sampler, address, size, repeat, pos, radius, fragCoord) \ -+ do { \ -+ bool drawn = false; \ -+ if (blend_key) { \ -+ drawn = commitRadialGradient( \ -+ sampler, address, size, repeat, pos, radius, swgl_OutRGBA8, \ -+ swgl_SpanLength, fragCoord); \ -+ } else { \ -+ drawn = commitRadialGradient( \ -+ sampler, address, size, repeat, pos, radius, swgl_OutRGBA8, \ -+ swgl_SpanLength, fragCoord); \ -+ } \ -+ if (drawn) { \ -+ swgl_OutRGBA8 += swgl_SpanLength; \ -+ swgl_SpanLength = 0; \ -+ } \ -+ } while (0) - // Extension to set a clip mask image to be sampled during blending. The offset - // specifies the positioning of the clip mask image relative to the viewport - // origin. The bounding box specifies the rectangle relative to the clip mask's -diff --git a/gfx/wr/webrender/res/brush_linear_gradient.glsl b/gfx/wr/webrender/res/brush_linear_gradient.glsl -index 235be4b24be8..6f923052ffb1 100644 ---- a/gfx/wr/webrender/res/brush_linear_gradient.glsl -+++ b/gfx/wr/webrender/res/brush_linear_gradient.glsl -@@ -87,8 +87,13 @@ void swgl_drawSpanRGBA8() { - return; - } - -+#ifdef WR_FEATURE_DITHERING -+ swgl_commitDitheredLinearGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, true, v_gradient_repeat.x != 0.0, -+ v_pos, v_scale_dir, v_start_offset.x, gl_FragCoord); -+#else - swgl_commitLinearGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, true, v_gradient_repeat.x != 0.0, - v_pos, v_scale_dir, v_start_offset.x); -+#endif - } - #endif - -diff --git a/gfx/wr/webrender/res/cs_radial_gradient.glsl b/gfx/wr/webrender/res/cs_radial_gradient.glsl -index 10919ac6283e..8084d8d47be1 100644 ---- a/gfx/wr/webrender/res/cs_radial_gradient.glsl -+++ b/gfx/wr/webrender/res/cs_radial_gradient.glsl -@@ -63,8 +63,14 @@ void swgl_drawSpanRGBA8() { - if (address < 0) { - return; - } -+ -+#ifdef WR_FEATURE_DITHERING -+ swgl_commitDitheredRadialGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, v_gradient_repeat.x != 0.0, -+ v_pos, v_start_radius.x, gl_FragCoord); -+#else - swgl_commitRadialGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, v_gradient_repeat.x != 0.0, - v_pos, v_start_radius.x); -+#endif - } - #endif - -diff --git a/gfx/wr/webrender/res/ps_quad_radial_gradient.glsl b/gfx/wr/webrender/res/ps_quad_radial_gradient.glsl -index 05b4dd2aa8c6..dc83f3c27742 100644 ---- a/gfx/wr/webrender/res/ps_quad_radial_gradient.glsl -+++ b/gfx/wr/webrender/res/ps_quad_radial_gradient.glsl -@@ -73,8 +73,14 @@ void swgl_drawSpanRGBA8() { - if (address < 0) { - return; - } -+ -+#ifdef WR_FEATURE_DITHERING -+ swgl_commitDitheredRadialGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, v_gradient_repeat.x != 0.0, -+ v_pos, v_start_radius.x, gl_FragCoord); -+#else - swgl_commitRadialGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, v_gradient_repeat.x != 0.0, - v_pos, v_start_radius.x); -+#endif - } - #endif - -diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/renderer/init.rs -index 7c63798bc644..169d4c7a4437 100644 ---- a/gfx/wr/webrender/src/renderer/init.rs -+++ b/gfx/wr/webrender/src/renderer/init.rs -@@ -224,7 +224,7 @@ impl Default for WebRenderOptions { - resource_override_path: None, - use_optimized_shaders: false, - enable_aa: true, -- enable_dithering: false, -+ enable_dithering: true, - debug_flags: DebugFlags::empty(), - max_recorded_profiles: 0, - precache_flags: ShaderPrecacheFlags::empty(), -diff --git a/gfx/wr/webrender/src/renderer/shade.rs b/gfx/wr/webrender/src/renderer/shade.rs -index ed38e7aa24e3..0171cb4092e1 100644 ---- a/gfx/wr/webrender/src/renderer/shade.rs -+++ b/gfx/wr/webrender/src/renderer/shade.rs -@@ -873,14 +873,22 @@ impl Shaders { - let ps_quad_radial_gradient = loader.create_shader( - ShaderKind::Primitive, - "ps_quad_radial_gradient", -- &[], -+ if options.enable_dithering { -+ &[DITHERING_FEATURE] -+ } else { -+ &[] -+ }, - &shader_list, - )?; - - let ps_quad_conic_gradient = loader.create_shader( - ShaderKind::Primitive, - "ps_quad_conic_gradient", -- &[], -+ if options.enable_dithering { -+ &[DITHERING_FEATURE] -+ } else { -+ &[] -+ }, - &shader_list, - )?; - -@@ -1032,14 +1040,22 @@ impl Shaders { - let cs_radial_gradient = loader.create_shader( - ShaderKind::Cache(VertexArrayKind::RadialGradient), - "cs_radial_gradient", -- &[], -+ if options.enable_dithering { -+ &[DITHERING_FEATURE] -+ } else { -+ &[] -+ }, - &shader_list, - )?; - - let cs_conic_gradient = loader.create_shader( - ShaderKind::Cache(VertexArrayKind::ConicGradient), - "cs_conic_gradient", -- &[], -+ if options.enable_dithering { -+ &[DITHERING_FEATURE] -+ } else { -+ &[] -+ }, - &shader_list, - )?; - -diff --git a/gfx/wr/webrender_build/src/shader_features.rs b/gfx/wr/webrender_build/src/shader_features.rs -index 72b82df00228..97247c929609 100644 ---- a/gfx/wr/webrender_build/src/shader_features.rs -+++ b/gfx/wr/webrender_build/src/shader_features.rs -@@ -242,9 +242,9 @@ pub fn get_shader_features(flags: ShaderFeatureFlags) -> ShaderFeatures { - - shaders.insert("ps_quad_textured", vec![base_prim_features.finish()]); - -- shaders.insert("ps_quad_radial_gradient", vec![base_prim_features.finish()]); -+ shaders.insert("ps_quad_radial_gradient", vec![base_prim_features.finish(), if flags.contains(ShaderFeatureFlags::DITHERING) { "DITHERING".to_string() } else { String::new() }]); - -- shaders.insert("ps_quad_conic_gradient", vec![base_prim_features.finish()]); -+ shaders.insert("ps_quad_conic_gradient", vec![base_prim_features.finish(), if flags.contains(ShaderFeatureFlags::DITHERING) { "DITHERING".to_string() } else { String::new() }]); - - shaders.insert("ps_clear", vec![base_prim_features.finish()]); - -diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml -index e21849fa3db4..258e12665ca8 100644 ---- a/modules/libpref/init/StaticPrefList.yaml -+++ b/modules/libpref/init/StaticPrefList.yaml -@@ -8007,13 +8007,6 @@ - value: true - mirror: once - --# Enable dithering in hardware WebRender --- name: gfx.webrender.dithering -- type: bool -- rust: true -- value: false -- mirror: once -- - # Use vsync events generated by hardware - - name: gfx.work-around-driver-bugs - type: bool diff --git a/src/layout/generic/nsIFrame-cpp.patch b/src/layout/generic/nsIFrame-cpp.patch index 66f1b822d..3a9042a12 100644 --- a/src/layout/generic/nsIFrame-cpp.patch +++ b/src/layout/generic/nsIFrame-cpp.patch @@ -1,8 +1,8 @@ diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp -index 0fca54d43aed64e711c3470a5745a94baaed8886..17097bc8f39e7d5140afa4d91811bca2071a8ad1 100644 +index 7c8f9c8c8ea4cc43825b388e7dd655a2ef34e75f..da5f48bb2d55ae306c72b062169a9758ad10c014 100644 --- a/layout/generic/nsIFrame.cpp +++ b/layout/generic/nsIFrame.cpp -@@ -11933,6 +11933,11 @@ gfx::Matrix nsIFrame::ComputeWidgetTransform() const { +@@ -11912,6 +11912,11 @@ gfx::Matrix nsIFrame::ComputeWidgetTransform() const { gfx::Matrix4x4 matrix = nsStyleTransformMatrix::ReadTransforms( uiReset->mMozWindowTransform, refBox, float(appUnitsPerDevPixel)); diff --git a/src/layout/style/nsStyleStruct-cpp.patch b/src/layout/style/nsStyleStruct-cpp.patch index 677018f5d..f3c81c9a9 100644 --- a/src/layout/style/nsStyleStruct-cpp.patch +++ b/src/layout/style/nsStyleStruct-cpp.patch @@ -1,8 +1,8 @@ diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp -index 3fc58a635189d2160be84c3c8083e63abce611f0..7aac552365a4414229879e2dd9586f7fbd98816d 100644 +index 2413696f643246a825e184732bfba6eb33f606fd..932d3c316ee60c59b5f999e5ddd65c6acee3129d 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp -@@ -3266,6 +3266,9 @@ nsStyleUIReset::nsStyleUIReset() +@@ -3273,6 +3273,9 @@ nsStyleUIReset::nsStyleUIReset() mWindowShadow(StyleWindowShadow::Auto), mWindowOpacity(1.0), mMozWindowInputRegionMargin(StyleLength::Zero()), @@ -12,7 +12,7 @@ index 3fc58a635189d2160be84c3c8083e63abce611f0..7aac552365a4414229879e2dd9586f7f mTransitions( nsStyleAutoArray::WITH_SINGLE_INITIAL_ELEMENT), mTransitionTimingFunctionCount(1), -@@ -3310,6 +3313,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource) +@@ -3317,6 +3320,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource) mWindowOpacity(aSource.mWindowOpacity), mMozWindowInputRegionMargin(aSource.mMozWindowInputRegionMargin), mMozWindowTransform(aSource.mMozWindowTransform), diff --git a/src/layout/style/nsStyleStruct-h.patch b/src/layout/style/nsStyleStruct-h.patch index 0eeede686..1e0c4aee3 100644 --- a/src/layout/style/nsStyleStruct-h.patch +++ b/src/layout/style/nsStyleStruct-h.patch @@ -1,8 +1,8 @@ diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h -index 9db1b385ac12e0142921c49e6b6c2ba0fadccf95..919089fd9bc278b0c2fede4b2babe133acd4632e 100644 +index f40f005606946b1149bfb7b67d1df9be04ddaf07..64da397ceb4192aacd24c4cd9fb0efbad2d363ed 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h -@@ -2075,6 +2075,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset { +@@ -2094,6 +2094,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset { // The margin of the window region that should be transparent to events. mozilla::StyleLength mMozWindowInputRegionMargin; mozilla::StyleTransform mMozWindowTransform; diff --git a/src/modules/libpref/init/StaticPrefList-yaml.patch b/src/modules/libpref/init/StaticPrefList-yaml.patch index d46f3b54a..4156b2b27 100644 --- a/src/modules/libpref/init/StaticPrefList-yaml.patch +++ b/src/modules/libpref/init/StaticPrefList-yaml.patch @@ -1,8 +1,8 @@ diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml -index a6c49438aaf3464e70bf9c75c2849a6062bd096a..2ee33493ed541b36a29f29c104d1275b80e5a20a 100644 +index 86dc55502b05eed6e4bb0a2ed489e1e8e76840cb..2c2918b2d3c76063662fe59d7fde745a36a92ab6 100644 --- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml -@@ -19222,6 +19215,7 @@ +@@ -19316,6 +19316,7 @@ mirror: always #endif diff --git a/src/modules/libpref/moz-build.patch b/src/modules/libpref/moz-build.patch index d5fd7d0c8..f91740056 100644 --- a/src/modules/libpref/moz-build.patch +++ b/src/modules/libpref/moz-build.patch @@ -1,5 +1,5 @@ diff --git a/modules/libpref/moz.build b/modules/libpref/moz.build -index 68a0bd6b50b804745b052e1921f4f6120354443e..23e7d03a6796af39dc2d39733b16548e73f8b10f 100644 +index 46034d8d99ba227f85824d472933ec556f54ba81..42f7f68aba60ca9c8f85f5fe13ffb56fa542e344 100644 --- a/modules/libpref/moz.build +++ b/modules/libpref/moz.build @@ -93,6 +93,7 @@ pref_groups = [ diff --git a/src/servo/components/style/gecko/media_features-rs.patch b/src/servo/components/style/gecko/media_features-rs.patch index fd2ce91cd..eda66d696 100644 --- a/src/servo/components/style/gecko/media_features-rs.patch +++ b/src/servo/components/style/gecko/media_features-rs.patch @@ -1,5 +1,5 @@ diff --git a/servo/components/style/gecko/media_features.rs b/servo/components/style/gecko/media_features.rs -index 3d4630e2250476729d21cdcb1726a7af93f9fd75..489d1dc624bb1e7b3f7ed22a0073d3ada29846e4 100644 +index b0082951254ad592c73caaa16c5b5c57127831a9..9b3566b08aacfcf2cfbf9941b2b3ca91a31ade59 100644 --- a/servo/components/style/gecko/media_features.rs +++ b/servo/components/style/gecko/media_features.rs @@ -13,6 +13,9 @@ use crate::values::computed::{CSSPixelLength, Context, Ratio, Resolution}; @@ -24,9 +24,9 @@ index 3d4630e2250476729d21cdcb1726a7af93f9fd75..489d1dc624bb1e7b3f7ed22a0073d3ad + KleeneValue::from(unsafe { bindings::Gecko_EvalMozPrefFeature(pref.as_ptr(), &MozPrefFeatureValue::::None) }) +} - fn get_lnf_int(int_id: i32) -> i32 { - unsafe { bindings::Gecko_GetLookAndFeelInt(int_id) } -@@ -641,7 +651,13 @@ macro_rules! lnf_int_feature { + fn eval_moz_mac_rtl(context: &Context) -> bool { + unsafe { bindings::Gecko_MediaFeatures_MacRTL(context.device().document()) } +@@ -645,7 +655,13 @@ macro_rules! lnf_int_feature { /// to support new types in these entries and (2) ensuring that either /// nsPresContext::MediaFeatureValuesChanged is called when the value that /// would be returned by the evaluator function could change. diff --git a/src/servo/components/style/queries/feature-rs.patch b/src/servo/components/style/queries/feature-rs.patch index f9f6ae27e..18cb4aa09 100644 --- a/src/servo/components/style/queries/feature-rs.patch +++ b/src/servo/components/style/queries/feature-rs.patch @@ -1,5 +1,5 @@ diff --git a/servo/components/style/queries/feature.rs b/servo/components/style/queries/feature.rs -index a9a4decb178234037a6d285ddd3206bd52f214e5..18ea220a14cbb59ef3c9809cb679f8fdb5352f98 100644 +index 1414dd624e0761d269f7e3b1c64ed4bb6576a6e3..f0204c2ee3e8c3527750a26788b5fb7cdf8dfc67 100644 --- a/servo/components/style/queries/feature.rs +++ b/servo/components/style/queries/feature.rs @@ -6,6 +6,7 @@ diff --git a/src/servo/components/style/queries/feature_expression-rs.patch b/src/servo/components/style/queries/feature_expression-rs.patch index 1ec0d6303..8265a0588 100644 --- a/src/servo/components/style/queries/feature_expression-rs.patch +++ b/src/servo/components/style/queries/feature_expression-rs.patch @@ -1,5 +1,5 @@ diff --git a/servo/components/style/queries/feature_expression.rs b/servo/components/style/queries/feature_expression.rs -index 31ba4839aacf740eae4a753c17ee34d9e13562eb..e59bea9cd82d85ff6b195051fef595a45dff520c 100644 +index 91e1d1572cbd3682ec977f21751e067968ed8884..6e618ac765f698bf3d9ce120167a6906ae3ce5ff 100644 --- a/servo/components/style/queries/feature_expression.rs +++ b/servo/components/style/queries/feature_expression.rs @@ -11,7 +11,7 @@ use crate::parser::{Parse, ParserContext}; diff --git a/src/testing/mochitest/browser-test-js.patch b/src/testing/mochitest/browser-test-js.patch index 474a8f07c..ff99dd955 100644 --- a/src/testing/mochitest/browser-test-js.patch +++ b/src/testing/mochitest/browser-test-js.patch @@ -1,5 +1,5 @@ diff --git a/testing/mochitest/browser-test.js b/testing/mochitest/browser-test.js -index 11217c210dd8dc5f7c4bdc6043df9aeb361529c6..18c3c4d658170d0646483cd289fe8ad1f21ffae0 100644 +index 979c6a0960cb8c490b612649d0fac55cd7b7d0f7..f149f248f705484b3572ca462660932dd792e312 100644 --- a/testing/mochitest/browser-test.js +++ b/testing/mochitest/browser-test.js @@ -440,11 +440,11 @@ Tester.prototype = { diff --git a/src/toolkit/components/downloads/DownloadList-sys-mjs.patch b/src/toolkit/components/downloads/DownloadList-sys-mjs.patch index ceff5a646..3a2c53041 100644 --- a/src/toolkit/components/downloads/DownloadList-sys-mjs.patch +++ b/src/toolkit/components/downloads/DownloadList-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/components/downloads/DownloadList.sys.mjs b/toolkit/components/downloads/DownloadList.sys.mjs -index 9ffdcd97edb31c35168a88303474fc4f5dc7c9d4..3c361101190d7f6123568535c68781c0e46fe2a9 100644 +index ef84be4cfd8194a99e2b2019360b780c700d8d42..3979c03670902ea3ae8bd344612612b20bec6176 100644 --- a/toolkit/components/downloads/DownloadList.sys.mjs +++ b/toolkit/components/downloads/DownloadList.sys.mjs @@ -50,6 +50,7 @@ const FILE_EXTENSIONS = [ diff --git a/src/toolkit/components/extensions/parent/ext-downloads-js.patch b/src/toolkit/components/extensions/parent/ext-downloads-js.patch index 5fdf9dbaf..81377918d 100644 --- a/src/toolkit/components/extensions/parent/ext-downloads-js.patch +++ b/src/toolkit/components/extensions/parent/ext-downloads-js.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/components/extensions/parent/ext-downloads.js b/toolkit/components/extensions/parent/ext-downloads.js -index 3b81d5e60a5e3006b80a2acec0b6720ccb7e5b33..5b6272986e13b48047f3bae1ec4205fc3e8012ef 100644 +index 4665c05116908133382be99ebeefd3546205750d..ba7cee3800e72f0fbd9b735c064cb6e61b4b4d28 100644 --- a/toolkit/components/extensions/parent/ext-downloads.js +++ b/toolkit/components/extensions/parent/ext-downloads.js @@ -87,6 +87,7 @@ const FILTER_IMAGES_EXTENSIONS = [ diff --git a/src/toolkit/components/pictureinpicture/content/player-js.patch b/src/toolkit/components/pictureinpicture/content/player-js.patch index 7ae87824f..6e461b23b 100644 --- a/src/toolkit/components/pictureinpicture/content/player-js.patch +++ b/src/toolkit/components/pictureinpicture/content/player-js.patch @@ -1,8 +1,8 @@ diff --git a/toolkit/components/pictureinpicture/content/player.js b/toolkit/components/pictureinpicture/content/player.js -index 3be55670e18ed2ae1e02307304a3699d16d89aa5..477933646c3623432164be06c31ef5328f86bba6 100644 +index 8a1088b318dfd321b4e5f34819c689a10e7f87b2..8d1816b27a0c88ab41b654249ae52111129edbf5 100644 --- a/toolkit/components/pictureinpicture/content/player.js +++ b/toolkit/components/pictureinpicture/content/player.js -@@ -755,6 +755,11 @@ let Player = { +@@ -760,6 +760,11 @@ let Player = { document.getElementById("large").click(); break; } diff --git a/src/toolkit/components/pictureinpicture/content/player-xhtml.patch b/src/toolkit/components/pictureinpicture/content/player-xhtml.patch index ef89eff98..802143144 100644 --- a/src/toolkit/components/pictureinpicture/content/player-xhtml.patch +++ b/src/toolkit/components/pictureinpicture/content/player-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/components/pictureinpicture/content/player.xhtml b/toolkit/components/pictureinpicture/content/player.xhtml -index b38789882149c97a3263c405b783999bc60a5c71..009b7b7aa2ded0d88247c62171bfff59222a8e28 100644 +index 09c9c5000de96fcd4a9d26328408996540c2cbda..b6d93850bbfe63a4e21756c97415a6c1908dae25 100644 --- a/toolkit/components/pictureinpicture/content/player.xhtml +++ b/toolkit/components/pictureinpicture/content/player.xhtml @@ -18,6 +18,7 @@ diff --git a/src/toolkit/content/widgets/browser-custom-element-mjs.patch b/src/toolkit/content/widgets/browser-custom-element-mjs.patch index cb7820fe0..52362b570 100644 --- a/src/toolkit/content/widgets/browser-custom-element-mjs.patch +++ b/src/toolkit/content/widgets/browser-custom-element-mjs.patch @@ -1,8 +1,8 @@ diff --git a/toolkit/content/widgets/browser-custom-element.mjs b/toolkit/content/widgets/browser-custom-element.mjs -index ef01902583d6ff1c563e9b2886f3048b127fe383..01f353f5eb4c67b2cf01a14e337a81e93358586f 100644 +index b5eb24e15cc97b004f182c35901505cb740e8571..f2dd435ba072affff3b4fdada6c360a575c22910 100644 --- a/toolkit/content/widgets/browser-custom-element.mjs +++ b/toolkit/content/widgets/browser-custom-element.mjs -@@ -482,11 +482,11 @@ class MozBrowser extends MozElements.MozElementMixin(XULFrameElement) { +@@ -483,11 +483,11 @@ class MozBrowser extends MozElements.MozElementMixin(XULFrameElement) { if (!this.browsingContext) { return; } diff --git a/src/toolkit/content/widgets/moz-toggle/moz-toggle-css.patch b/src/toolkit/content/widgets/moz-toggle/moz-toggle-css.patch index 766f3435b..305ba49e4 100644 --- a/src/toolkit/content/widgets/moz-toggle/moz-toggle-css.patch +++ b/src/toolkit/content/widgets/moz-toggle/moz-toggle-css.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/content/widgets/moz-toggle/moz-toggle.css b/toolkit/content/widgets/moz-toggle/moz-toggle.css -index 7b9ec91bf0cfd8fda6a161995c9de57270557f6c..b1049bd2b2c03104e5b35978a9b81674d6920d53 100644 +index 49f04a3a8eedf580e9854f04014c637894181300..4e1336b4a58afaba182de87b4e670b0f0b3d607e 100644 --- a/toolkit/content/widgets/moz-toggle/moz-toggle.css +++ b/toolkit/content/widgets/moz-toggle/moz-toggle.css @@ -6,8 +6,8 @@ diff --git a/src/toolkit/modules/moz-build.patch b/src/toolkit/modules/moz-build.patch index a384e5c2e..f7c21aa5f 100644 --- a/src/toolkit/modules/moz-build.patch +++ b/src/toolkit/modules/moz-build.patch @@ -1,8 +1,8 @@ diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build -index 990244af276576d0af0b371a370287aa780f42c1..cd43715aea607fc7dbafda589e14e1462568dd61 100644 +index e43870b10c5b35165fd21b48065980060104dc52..71e3db5618c834bc4ff9d481b1e667f2b02b183e 100644 --- a/toolkit/modules/moz.build +++ b/toolkit/modules/moz.build -@@ -281,6 +281,7 @@ for var in ( +@@ -280,6 +280,7 @@ for var in ( "DLL_SUFFIX", "DEBUG_JS_MODULES", "OMNIJAR_NAME", diff --git a/src/toolkit/moz-configure.patch b/src/toolkit/moz-configure.patch index 2b4335893..7cbc4274e 100644 --- a/src/toolkit/moz-configure.patch +++ b/src/toolkit/moz-configure.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/moz.configure b/toolkit/moz.configure -index 44b91b7bb3e0196b7f1f923c43fb8967f569cd28..907f7059cb44b990b5eb3a90d5df523075cd6ae1 100644 +index 2fdcf62bde7805e52737cb06ec67908fa40524c9..b9f9e3abeb5cf770b29e1354615184fce2162ec7 100644 --- a/toolkit/moz.configure +++ b/toolkit/moz.configure @@ -22,6 +22,7 @@ def check_moz_app_id(moz_app_id, build_project): diff --git a/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch b/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch index 6ed13c08c..3fd64f2b3 100644 --- a/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch +++ b/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/mozapps/extensions/AddonManager.sys.mjs b/toolkit/mozapps/extensions/AddonManager.sys.mjs -index f544f44cf7a73858213ddfc07c0ad693e2f56504..01293cb38ad53ff36c545ccb392071e20fe1d62b 100644 +index 2c1e187d14bae0dcc17a1fa2de768e7c949b3776..c322b770bdc1a0786d8e3bf1af618e3d3d3dd26e 100644 --- a/toolkit/mozapps/extensions/AddonManager.sys.mjs +++ b/toolkit/mozapps/extensions/AddonManager.sys.mjs @@ -1227,12 +1227,12 @@ var AddonManagerInternal = { diff --git a/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch b/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch index d35981b3b..f0290fa86 100644 --- a/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch +++ b/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/mozapps/extensions/content/aboutaddons.css b/toolkit/mozapps/extensions/content/aboutaddons.css -index 733396c68be4f1dd9de99bd602c9f8cde8843957..e0d9489a89e366e3f6dab2a6f472c6752a8815b3 100644 +index 232fca6975de67bc0d84969204e75bad358b6bc7..4bbfb2abb9ea4812005734eb95a0bd7b8bbab7ce 100644 --- a/toolkit/mozapps/extensions/content/aboutaddons.css +++ b/toolkit/mozapps/extensions/content/aboutaddons.css @@ -105,6 +105,13 @@ h2 { diff --git a/src/toolkit/profile/nsToolkitProfileService-cpp.patch b/src/toolkit/profile/nsToolkitProfileService-cpp.patch index 3df221797..c796e9ba9 100644 --- a/src/toolkit/profile/nsToolkitProfileService-cpp.patch +++ b/src/toolkit/profile/nsToolkitProfileService-cpp.patch @@ -1,8 +1,8 @@ diff --git a/toolkit/profile/nsToolkitProfileService.cpp b/toolkit/profile/nsToolkitProfileService.cpp -index befc1def42c9fdd33438f0485cea6d36520adf28..1d3dd61fd3dd1769a9523c95993bb31cfde7b7ab 100644 +index 1d8c95cc10d158e86254f45d8f955c8f8ce50394..3708da5d0780298589b89dbb4a03152749911dee 100644 --- a/toolkit/profile/nsToolkitProfileService.cpp +++ b/toolkit/profile/nsToolkitProfileService.cpp -@@ -82,6 +82,8 @@ using namespace mozilla; +@@ -84,6 +84,8 @@ using namespace mozilla; #define INSTALL_PREFIX_LENGTH 7 #define STORE_ID_PREF "toolkit.profiles.storeID" @@ -11,7 +11,7 @@ index befc1def42c9fdd33438f0485cea6d36520adf28..1d3dd61fd3dd1769a9523c95993bb31c struct KeyValue { KeyValue(const char* aKey, const char* aValue) : key(aKey), value(aValue) {} -@@ -1364,7 +1366,7 @@ nsresult nsToolkitProfileService::CreateDefaultProfile( +@@ -1370,7 +1372,7 @@ nsresult nsToolkitProfileService::CreateDefaultProfile( if (mUseDevEditionProfile) { name.AssignLiteral(DEV_EDITION_NAME); } else if (mUseDedicatedProfile) { diff --git a/src/toolkit/themes/shared/aboutReader-css.patch b/src/toolkit/themes/shared/aboutReader-css.patch index 5b830814d..6ea618c2e 100644 --- a/src/toolkit/themes/shared/aboutReader-css.patch +++ b/src/toolkit/themes/shared/aboutReader-css.patch @@ -1,8 +1,8 @@ diff --git a/toolkit/themes/shared/aboutReader.css b/toolkit/themes/shared/aboutReader.css -index bf425379af81f442fb0b4ad7d2921c3f06196f26..6c2cc0faade92de995b675eea2696f061dfda571 100644 +index 1eb2c44694bb4970134fb5d290e32c7053103461..8d8237029976960048cb9aceede918c9e20c523b 100644 --- a/toolkit/themes/shared/aboutReader.css +++ b/toolkit/themes/shared/aboutReader.css -@@ -1189,3 +1189,43 @@ pre code { +@@ -1181,3 +1181,43 @@ pre code { display: block; overflow: auto; } diff --git a/src/toolkit/themes/shared/in-content/common-shared-css.patch b/src/toolkit/themes/shared/in-content/common-shared-css.patch index 70b644c55..615b9a4e5 100644 --- a/src/toolkit/themes/shared/in-content/common-shared-css.patch +++ b/src/toolkit/themes/shared/in-content/common-shared-css.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/themes/shared/in-content/common-shared.css b/toolkit/themes/shared/in-content/common-shared.css -index c45d48dc3106a2dc36f6dd704ebb2721817f016e..71291ab50b73872473190537fe2ce7a95a57aa12 100644 +index 96129498de63153704711bf7a21fb10922e80917..83f7b5ee2f15197dc42ec02ec1a73cc2bfc19a4d 100644 --- a/toolkit/themes/shared/in-content/common-shared.css +++ b/toolkit/themes/shared/in-content/common-shared.css @@ -4,7 +4,7 @@ @@ -11,7 +11,7 @@ index c45d48dc3106a2dc36f6dd704ebb2721817f016e..71291ab50b73872473190537fe2ce7a9 @namespace html "http://www.w3.org/1999/xhtml"; @namespace xul "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; -@@ -69,7 +69,7 @@ +@@ -68,7 +68,7 @@ * this in forced colors mode, as we should be using system colours then. */ :root[dialogroot] { @@ -20,7 +20,7 @@ index c45d48dc3106a2dc36f6dd704ebb2721817f016e..71291ab50b73872473190537fe2ce7a9 } } -@@ -708,7 +708,7 @@ html|*#categories[last-input-type="mouse"] > html|button.category:focus-visible +@@ -706,7 +706,7 @@ html|*#categories[last-input-type="mouse"] > html|button.category:focus-visible fill-opacity: 1; } @@ -29,7 +29,7 @@ index c45d48dc3106a2dc36f6dd704ebb2721817f016e..71291ab50b73872473190537fe2ce7a9 :root { --in-content-sidebar-width: 118px; } -@@ -1098,7 +1098,7 @@ xul|*.sidebar-footer-link { +@@ -1096,7 +1096,7 @@ xul|*.sidebar-footer-link { user-select: none; } diff --git a/src/toolkit/themes/shared/menulist-css.patch b/src/toolkit/themes/shared/menulist-css.patch index 5fa88cb37..a8cd61158 100644 --- a/src/toolkit/themes/shared/menulist-css.patch +++ b/src/toolkit/themes/shared/menulist-css.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/themes/shared/menulist.css b/toolkit/themes/shared/menulist.css -index e5ac973b1ee2595e8547680465e25d537685a9e7..20f85152d783c81be5e29846353daca9ccd0c67d 100644 +index 8f9c006945e67f668075bd36ce83d5a772a9a796..08d68c015b001233548cd6c7babad17f3a638702 100644 --- a/toolkit/themes/shared/menulist.css +++ b/toolkit/themes/shared/menulist.css @@ -53,7 +53,7 @@ @@ -9,5 +9,5 @@ index e5ac973b1ee2595e8547680465e25d537685a9e7..20f85152d783c81be5e29846353daca9 - background-color: var(--button-background-color); + background-color: light-dark(rgba(0,0,0,.1), rgba(255,255,255,.1)); color: var(--button-text-color); - border-radius: 4px; + border-radius: var(--border-radius-small); padding-block: 4px; diff --git a/src/toolkit/themes/shared/pictureinpicture/player-css.patch b/src/toolkit/themes/shared/pictureinpicture/player-css.patch index 475bb4de0..798902248 100644 --- a/src/toolkit/themes/shared/pictureinpicture/player-css.patch +++ b/src/toolkit/themes/shared/pictureinpicture/player-css.patch @@ -1,8 +1,8 @@ diff --git a/toolkit/themes/shared/pictureinpicture/player.css b/toolkit/themes/shared/pictureinpicture/player.css -index 4a4ab15f9801d9443f3dbc131a533823be423bd9..ed487012d172c278f7d5a59ee953de4a05456019 100644 +index 33b10bebcdfe636d7ff0f61a11d5fa4664a31f78..83b53817c53f43cca3be40b490300109b4949f5b 100644 --- a/toolkit/themes/shared/pictureinpicture/player.css +++ b/toolkit/themes/shared/pictureinpicture/player.css -@@ -736,3 +736,17 @@ input:checked + .slider::before { +@@ -738,3 +738,17 @@ input:checked + .slider::before { justify-self: center; } } diff --git a/src/tools/signing/macos/mach_commands-py.patch b/src/tools/signing/macos/mach_commands-py.patch index 73169aa91..be02e1b77 100644 --- a/src/tools/signing/macos/mach_commands-py.patch +++ b/src/tools/signing/macos/mach_commands-py.patch @@ -1,5 +1,5 @@ diff --git a/tools/signing/macos/mach_commands.py b/tools/signing/macos/mach_commands.py -index 454a9bbc35802fbf811065e8e1ca592674016bb3..d6b0cf119664e0534a3898f72ffbcd3aade9c89d 100644 +index 721790b0d067ea1cdc6ddc9d220e423de9206d53..ca80e6f2c8bcd82eda24d03720a37a2bfdc50cfe 100644 --- a/tools/signing/macos/mach_commands.py +++ b/tools/signing/macos/mach_commands.py @@ -37,7 +37,6 @@ from mozbuild.base import MachCommandConditions as conditions @@ -21,7 +21,7 @@ index 454a9bbc35802fbf811065e8e1ca592674016bb3..d6b0cf119664e0534a3898f72ffbcd3a if use_rcodesign_arg is True: sign_with_rcodesign( command_context, -@@ -567,7 +570,7 @@ def sign_with_rcodesign( +@@ -608,7 +611,7 @@ def sign_with_rcodesign( # input path and its options are specified as standard arguments. ctx.log(logging.INFO, "macos-sign", {}, "Signing with rcodesign") diff --git a/src/widget/cocoa/nsCocoaWindow-mm.patch b/src/widget/cocoa/nsCocoaWindow-mm.patch index ecbe7de1e..ee8b3bc7a 100644 --- a/src/widget/cocoa/nsCocoaWindow-mm.patch +++ b/src/widget/cocoa/nsCocoaWindow-mm.patch @@ -1,8 +1,8 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm -index 827dc774a429d0595028314a522722078a202edc..11ba33c2c316c0fc53053f6f8d0feab97c93bc72 100644 +index 6c80f33454503af0840af18cb88af44a006727ee..47b318814ddd57b1e73c66b576884b8e62093906 100644 --- a/widget/cocoa/nsCocoaWindow.mm +++ b/widget/cocoa/nsCocoaWindow.mm -@@ -7540,7 +7540,7 @@ static NSMutableSet* gSwizzledFrameViewClasses = nil; +@@ -7588,7 +7588,7 @@ static NSMutableSet* gSwizzledFrameViewClasses = nil; // Returns an autoreleased NSImage. static NSImage* GetMenuMaskImage() { diff --git a/src/xpfe/appshell/AppWindow-cpp.patch b/src/xpfe/appshell/AppWindow-cpp.patch index 70df53122..61deb9ea7 100644 --- a/src/xpfe/appshell/AppWindow-cpp.patch +++ b/src/xpfe/appshell/AppWindow-cpp.patch @@ -1,8 +1,8 @@ diff --git a/xpfe/appshell/AppWindow.cpp b/xpfe/appshell/AppWindow.cpp -index 0b7788ec179d1c1021d2e5692c652b367646d33b..f5d48ca47a899b82f9d9cb7823eeb096f542c0ea 100644 +index 64f18c991b0b9a8bf3690a54624b447f347a210e..0b00a29956cd6a750d5feadd4b2a4ceb8338410b 100644 --- a/xpfe/appshell/AppWindow.cpp +++ b/xpfe/appshell/AppWindow.cpp -@@ -1873,7 +1873,7 @@ nsresult AppWindow::MaybeSaveEarlyWindowPersistentValues( +@@ -1874,7 +1874,7 @@ nsresult AppWindow::MaybeSaveEarlyWindowPersistentValues( } } diff --git a/src/zen/common/ZenStartup.mjs b/src/zen/common/ZenStartup.mjs index 3fa3d061c..289266a2b 100644 --- a/src/zen/common/ZenStartup.mjs +++ b/src/zen/common/ZenStartup.mjs @@ -61,11 +61,6 @@ setTimeout(() => { gZenUIManager.init(); this.#checkForWelcomePage(); - - document.l10n.setAttributes( - document.getElementById('tabs-newtab-button'), - 'tabs-toolbar-new-tab' - ); }, 0); } catch (e) { console.error('ZenThemeModifier: Error initializing browser layout', e); diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs index dd54457be..d344e543e 100644 --- a/src/zen/common/ZenUIManager.mjs +++ b/src/zen/common/ZenUIManager.mjs @@ -889,7 +889,6 @@ var gZenVerticalTabsManager = { if (typeof height !== 'undefined') { document.getElementById('urlbar').style.setProperty('--urlbar-height', `${height}px`); } - gURLBar.valueFormatter._formatURL(); }); }, diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 5349e8b57..12e2c7cf3 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -111,6 +111,10 @@ border-radius: 0px !important; } +#urlbar:not([breakout-extend='true']) .urlbar-input-box { + font-weight: 500; +} + :root[zen-single-toolbar='true'] #urlbar:not([breakout-extend='true']) { & #urlbar-input { cursor: default; diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 02169605c..3eefbd64d 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -500,12 +500,12 @@ body > #confetti { to bottom, color-mix( in srgb, - light-dark(rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.3)) 15%, + light-dark(rgba(255, 255, 255, 1), rgba(0, 0, 0, 0.5)) 15%, transparent 100% ), color-mix( in srgb, - light-dark(rgba(255, 255, 255, 0.8), rgba(0, 0, 0, 0.8)) 100%, + light-dark(rgba(255, 255, 255, 0.8), rgba(0, 0, 0, 0.9)) 100%, transparent 100% ) ); @@ -514,7 +514,7 @@ body > #confetti { border-radius: 6px; --base-border-color: light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.1)); border: 1px solid; - border-top-color: light-dark(var(--base-border-color), rgba(255, 255, 255, 0.12)); + border-top-color: light-dark(var(--base-border-color), rgba(255, 255, 255, 0.1)); border-left-color: light-dark(var(--base-border-color), transparent); border-right-color: light-dark(var(--base-border-color), transparent); border-bottom-color: light-dark(var(--base-border-color), rgba(0, 0, 0, 0.12)); diff --git a/src/zen/tests/tabs/browser.toml b/src/zen/tests/tabs/browser.toml index 3d86041c6..0d6efd5dd 100644 --- a/src/zen/tests/tabs/browser.toml +++ b/src/zen/tests/tabs/browser.toml @@ -8,6 +8,7 @@ support-files = [ ] ["browser_tabs_empty_checks.js"] +["browser_tabs_fetch_checks.js"] ["browser_drag_drop_vertical.js"] tags = [ "drag-drop", diff --git a/src/zen/tests/tabs/browser_tabs_fetch_checks.js b/src/zen/tests/tabs/browser_tabs_fetch_checks.js new file mode 100644 index 000000000..a223af8b0 --- /dev/null +++ b/src/zen/tests/tabs/browser_tabs_fetch_checks.js @@ -0,0 +1,29 @@ +/* Any copyright is dedicated to the Public Domain. + https://creativecommons.org/publicdomain/zero/1.0/ */ + +'use strict'; + +// Each firefox update, we should run this check, even +// if its a very "basic" one. Just to make sure that we are +// returning tabs correctly. +add_task(async function test_Tabs_Getter() { + for (let tab of gBrowser.tabs) { + ok(tab.tagName.toLowerCase() === 'tab', 'Each item in gBrowser.tabs is a tab element'); + } + Assert.equal( + gBrowser.tabs.length, + 2, + 'There should be 2 tabs (1 empty tab + 1 about:blank tab) at startup' + ); +}); + +add_task(async function test_Aria_Focusable_Tabs() { + for (let tab of gBrowser.tabContainer.ariaFocusableItems) { + ok(tab.tagName.toLowerCase() === 'tab', 'Each item in ariaFocusableItems is a tab element'); + } + Assert.equal( + gBrowser.tabContainer.ariaFocusableItems.length, + 2, + 'There should be 2 focusable tabs (1 empty tab + 1 about:blank tab) at startup' + ); +}); diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index e2a0c31c4..bbb01f5ee 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -950,6 +950,8 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { window.addEventListener('TabSelect', this.onLocationChange.bind(this)); window.addEventListener('TabBrowserInserted', this.onTabBrowserInserted.bind(this)); + + await this.selectStartPage(); } async selectStartPage() { diff --git a/surfer.json b/surfer.json index e643dbd5b..2614839b2 100644 --- a/surfer.json +++ b/surfer.json @@ -6,7 +6,7 @@ "version": { "product": "firefox", "version": "143.0.4", - "candidate": "143.0.4" + "candidate": "144.0" }, "buildOptions": { "generateBranding": true From 00a70c11a7875e73027ef39ba3f04a5f2f55fcc8 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Tue, 7 Oct 2025 23:12:10 +0200 Subject: [PATCH 044/111] fix: Fixed fullscren urlbar not focusing, b=closes #5229, c=common --- src/zen/common/styles/zen-omnibox.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 12e2c7cf3..846b60d37 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -29,6 +29,9 @@ &[breakout-extend='true'] { --urlbar-container-padding: 0px; + } + + :root[inDOMFullscreen] & { /* See issue https://github.com/zen-browser/desktop/issues/5229 */ visibility: visible; } From 0c5a2aa96dc1006d68aa8dc631a64860d28eff3c Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Wed, 8 Oct 2025 12:49:18 +0200 Subject: [PATCH 045/111] perf: Fixed performance for media controls label, b=no-bug, c=media --- src/zen/media/zen-media-controls.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/zen/media/zen-media-controls.css b/src/zen/media/zen-media-controls.css index 54450aec8..d65e9e1b0 100644 --- a/src/zen/media/zen-media-controls.css +++ b/src/zen/media/zen-media-controls.css @@ -108,6 +108,10 @@ transform: translateY(0) !important; pointer-events: auto; } + + & #zen-media-info-vbox label[overflow] { + animation: zen-back-and-forth-text 10s infinite ease-in-out; + } } & #zen-media-focus-button::after { @@ -255,10 +259,6 @@ margin-left: 0; font-weight: 500; position: relative; /* For the animation */ - - &[overflow] { - animation: zen-back-and-forth-text 10s infinite ease-in-out; - } } } From ba1a59622a318cd9cebf07bf93aed070c1d91056 Mon Sep 17 00:00:00 2001 From: Blake Gearin Date: Wed, 8 Oct 2025 04:49:40 -0600 Subject: [PATCH 046/111] feat: Add config to support more than 12 essential tabs, p=#10731 --- locales/ar/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/ca/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/cs/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/cy/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/da/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/de/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/el/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/en-GB/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/en-US/browser/browser/zen-general.ftl | 4 +-- locales/es-ES/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/et/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/fa/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/fi/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/fr/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/ga-IE/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/he/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/hu/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/id/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/is/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/it/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/ja/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/ko/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/lt/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/nl/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/nn-NO/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/pl/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/pt-BR/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/pt-PT/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/ru/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/sv-SE/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/th/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/tr/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/uk/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/vi/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/zh-CN/browser/browser/zen-general.ftl | 26 +++++++++---------- locales/zh-TW/browser/browser/zen-general.ftl | 26 +++++++++---------- prefs/zen.yaml | 3 +++ src/zen/tabs/ZenPinnedTabManager.mjs | 17 +++++++++--- 38 files changed, 473 insertions(+), 461 deletions(-) diff --git a/locales/ar/browser/browser/zen-general.ftl b/locales/ar/browser/browser/zen-general.ftl index f2b56be25..60ecdbc8d 100644 --- a/locales/ar/browser/browser/zen-general.ftl +++ b/locales/ar/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = الملف الشخصي الحالي unified-extensions-description = تستخدم الإضافات لجلب المزيد من الوظائف الإضافية إلى { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = إعادة تعيين علامة التبويب المثبتة .accesskey = ر -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Remove from Essentials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = استبدال الرابط المثبت بالرابط الحالي .accesskey = C zen-themes-corrupted = ملف التعديل { -brand-short-name } الخاص بك تالف. تم إعادة تعيينه إلى السمة الافتراضية. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = The new URL bar has been enabled, removing the need for new tab pages.

Try opening a new tab to see the new URL bar in action! zen-disable = Disable -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimize .tooltip = Minimize zen-panel-ui-gradient-generator-custom-color = لون مخصص zen-panel-ui-gradient-generator-saved-message = حفظ معامل التدرج بنجاح! zen-copy-current-url-confirmation = The URL has been copied to the clipboard. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel -zen-general-confirm = +zen-general-confirm = .label = Confirm zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = Tab has been successfully renamed! zen-background-tab-opened-toast = New background tab opened! zen-workspace-renamed-toast = Workspace has been successfully renamed! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = إلى المزيد تعرف zen-close-label = Close -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Search... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/ca/browser/browser/zen-general.ftl b/locales/ca/browser/browser/zen-general.ftl index 3e179f989..491b97549 100644 --- a/locales/ca/browser/browser/zen-general.ftl +++ b/locales/ca/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = perfil actual unified-extensions-description = Les extensions aporten funcionalitats addicionals a { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Restableix la pestanya fixada .accesskey = R -tab-context-zen-add-essential = - .label = Afegeix als essentials ({ $num }/12 espais ocupats) +tab-context-zen-add-essential = + .label = Afegeix als essentials ({ $num } / { $max } espais ocupats) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Elimina dels essencials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Substitueix l'URL fixat per l'actual .accesskey = C zen-themes-corrupted = El vostre fitxer de modificacions { -brand-short-name } està malmès. S'ha restablert al tema per defecte. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = La nova barra d'URL s'ha activat, eliminant la necessitat de noves pàgines de pestanya.

Proveu d'obrir una pestanya nova per veure la nova barra d'URL en acció! zen-disable = Deshabilita -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimitza .tooltip = Minimitza zen-panel-ui-gradient-generator-custom-color = Color personalitzat zen-panel-ui-gradient-generator-saved-message = El degradat s'ha desat correctament! zen-copy-current-url-confirmation = L'URL s'ha copiat al porta-retalls. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel·la -zen-general-confirm = +zen-general-confirm = .label = Confirma zen-pinned-tab-replaced = L'URL de la pestanya fixada s'ha substituït per l'URL actual. zen-tabs-renamed = S'ha canviat el nom de la pestanya correctament! zen-background-tab-opened-toast = S'ha obert una nova pestanya de fons! zen-workspace-renamed-toast = S'ha canviat el nom de l'espai de treball correctament! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Espais -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Modificacions # note: Do not translate the "
" tags in the following string zen-learn-more-text = Més informació zen-close-label = Tanca -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Cerca... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icones urlbar-search-mode-zen_actions = Accions diff --git a/locales/cs/browser/browser/zen-general.ftl b/locales/cs/browser/browser/zen-general.ftl index 425c223a7..792a6b740 100644 --- a/locales/cs/browser/browser/zen-general.ftl +++ b/locales/cs/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = aktuální profil unified-extensions-description = Rozšíření slouží k přidání dalších funkcí do prohlížeče { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Resetovat připnuté karty .accesskey = R -tab-context-zen-add-essential = - .label = Přidat do Essentials ({ $num } / 12 zaplněných slotů) +tab-context-zen-add-essential = + .label = Přidat do Essentials ({ $num } / { $max } zaplněných slotů) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Odstranit z Essentials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Nahradit připnutou URL adresu aktuální adresou .accesskey = C zen-themes-corrupted = Váš { -brand-short-name } mods soubor je poškozen. Byl obnoven na výchozí motiv. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Nový adresní řádek je nyní zapnutý, takže už není potřeba otevírat nové karty.

Zkuste otevřít novou kartu a podívejte se, jak funguje! zen-disable = Zavřít -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimalizovat .tooltip = Minimalizovat zen-panel-ui-gradient-generator-custom-color = Vlastní barva zen-panel-ui-gradient-generator-saved-message = Gradient byl úspěšně uložen! zen-copy-current-url-confirmation = URL adresa byla zkopírována do schránky. -zen-general-cancel-label = +zen-general-cancel-label = .label = Zrušit -zen-general-confirm = +zen-general-confirm = .label = Potvrdit zen-pinned-tab-replaced = Připnutá URL adresa panelu byla nahrazena aktuální URL adresou. zen-tabs-renamed = Panel byl úspěšně přejmenován! zen-background-tab-opened-toast = Nová karta na pozadí byla otevřena! zen-workspace-renamed-toast = Pracovní prostor byl úspěšně přejmenován! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Prostory -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Módy # note: Do not translate the "
" tags in the following string zen-learn-more-text = Zjistit více zen-close-label = Zavřít -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Hledat... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emodži -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Ikony urlbar-search-mode-zen_actions = Actions diff --git a/locales/cy/browser/browser/zen-general.ftl b/locales/cy/browser/browser/zen-general.ftl index a9bc98fd0..8eb07bbaa 100644 --- a/locales/cy/browser/browser/zen-general.ftl +++ b/locales/cy/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = proffil gweithredol unified-extensions-description = Mae ehangiadau'n cael ei defnyddio er mwyn ychwanegu fwy o weithrediadau i mewn i { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Ailosod Tab wedi'i Binio .accesskey = R -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Diddymu o Hanfodion .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Ailosod URL wedi'i Binio gyda'r Gyfredol .accesskey = C zen-themes-corrupted = Mae eich ffeil am y mod { -brand-short-name } wedi'i llygru. Maent wedi cael eu hailosod i'r thema rhagosodedig. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Mae'r bar URL newydd wedi'i alluogi, sydd yn dileu'r angen am dudalennau tab newydd.

Ceisiwch agor tab newydd i weld y bar URL newydd ar waith! zen-disable = Analluogi -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimize .tooltip = Minimize zen-panel-ui-gradient-generator-custom-color = Addasu Lliw zen-panel-ui-gradient-generator-saved-message = Llwyddiant arbedi'r graddiant! zen-copy-current-url-confirmation = Mae'r URL wedi'i gopïo i'r clipfwrdd. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel -zen-general-confirm = +zen-general-confirm = .label = Confirm zen-pinned-tab-replaced = Mae URL y tab wedi'i binio wedi'i newid i'r URL gyfredol. zen-tabs-renamed = Llwyddiant ailenwi'r tab! zen-background-tab-opened-toast = New background tab opened! zen-workspace-renamed-toast = Workspace has been successfully renamed! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Learn More zen-close-label = Cau -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Search... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/da/browser/browser/zen-general.ftl b/locales/da/browser/browser/zen-general.ftl index a84ebfefd..43f090a53 100644 --- a/locales/da/browser/browser/zen-general.ftl +++ b/locales/da/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = nuværende profil unified-extensions-description = Udvidelser bruges til at bringe ekstra funktionalitet ind i { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Nulstil fastgjort fane .accesskey = R -tab-context-zen-add-essential = - .label = Føj til Essentielle ({ $num } / 12 pladser fyldt) +tab-context-zen-add-essential = + .label = Føj til Essentielle ({ $num } / { $max } pladser fyldt) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Fjern fra Essentielle .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Erstat fastgjort URL med nuværende .accesskey = C zen-themes-corrupted = Din { -brand-short-name } mods-fil er beskadiget. De er blevet nulstillet til standardtemaet. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Den nye URL-linje er aktiveret og fjerner dermed behovet for nye fanesider.

Prøv at åbne en ny fane for at se den i aktion! zen-disable = Deaktiver -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimer .tooltip = Minimer zen-panel-ui-gradient-generator-custom-color = Brugerdefineret Farve zen-panel-ui-gradient-generator-saved-message = Gradienten blev gemt! zen-copy-current-url-confirmation = URL'en blev kopieret til udklipsholderen. -zen-general-cancel-label = +zen-general-cancel-label = .label = Annuller -zen-general-confirm = +zen-general-confirm = .label = Bekræft zen-pinned-tab-replaced = Den fastgjorte fane-URL blev erstattet med den aktuelle. zen-tabs-renamed = Fanen blev omdøbt! zen-background-tab-opened-toast = Ny baggrundsfane åbnet! zen-workspace-renamed-toast = Arbejdsområde blev omdøbt! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Rum -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Lær mere zen-close-label = Luk -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Søg... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Ikoner urlbar-search-mode-zen_actions = Actions diff --git a/locales/de/browser/browser/zen-general.ftl b/locales/de/browser/browser/zen-general.ftl index 211ee89a7..0558e57ee 100644 --- a/locales/de/browser/browser/zen-general.ftl +++ b/locales/de/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = Aktuelles Profil unified-extensions-description = Erweiterungen werden verwendet, um { -brand-short-name } zusätzliche Funktionen hinzuzufügen. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Angepinnten Tab zurücksetzen .accesskey = R -tab-context-zen-add-essential = - .label = Zu Essentials hinzufügen ({ $num } / 12 Plätze belegt) +tab-context-zen-add-essential = + .label = Zu Essentials hinzufügen ({ $num } / { $max } Plätze belegt) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Aus Essentials entfernen .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Angepinnte URL durch aktuelle ersetzen .accesskey = C zen-themes-corrupted = Ihre { -brand-short-name } Mods-Datei ist beschädigt. Sie wurde auf das Standard-Design zurückgesetzt. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Die neue Adressleiste wurde aktiviert und macht neue Tab-Seiten überflüssig.

Öffnen Sie einen neuen Tab, um die neue Adressleiste in Aktion zu sehen! zen-disable = Deaktivieren -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimieren .tooltip = Minimieren zen-panel-ui-gradient-generator-custom-color = Benutzerdefinierte Farbe zen-panel-ui-gradient-generator-saved-message = Farbverlauf erfolgreich gespeichert! zen-copy-current-url-confirmation = Die URL wurde in die Zwischenablage kopiert. -zen-general-cancel-label = +zen-general-cancel-label = .label = Abbrechen -zen-general-confirm = +zen-general-confirm = .label = Bestätigen zen-pinned-tab-replaced = Die URL des angepinnten Tabs wurde durch die aktuelle URL ersetzt! zen-tabs-renamed = Tab wurde erfolgreich umbenannt! zen-background-tab-opened-toast = Neuer Hintergrund-Tab geöffnet! zen-workspace-renamed-toast = Arbeitsbereich wurde erfolgreich umbenannt! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Arbeitsbereiche -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Mehr erfahren zen-close-label = Schließen -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Suchen... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Symbole urlbar-search-mode-zen_actions = Aktionen diff --git a/locales/el/browser/browser/zen-general.ftl b/locales/el/browser/browser/zen-general.ftl index feda1420c..ac77b2f23 100644 --- a/locales/el/browser/browser/zen-general.ftl +++ b/locales/el/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = τρέχον προφίλ unified-extensions-description = Οι επεκτάσεις χρησιμοποιούνται για να φέρουν περισσότερη επιπλέον λειτουργικότητα στο { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Επαναφορά Καρφιτσωμένης Καρτέλας .accesskey = R -tab-context-zen-add-essential = - .label = Προσθήκη στα Απαραίτητα ({ $num } / 12 θέσεις γεμάτες) +tab-context-zen-add-essential = + .label = Προσθήκη στα Απαραίτητα ({ $num } / { $max } θέσεις γεμάτες) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Αφαίρεση από Απαραίτητα .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Αντικατάσταση καρφιτσωμένου URL με το τρέχον .accesskey = C zen-themes-corrupted = Το αρχείο { -brand-short-name } mods είναι κατεστραμμένο. Έχει γίνει επαναφορά στο προεπιλεγμένο θέμα. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Η νέα γραμμή URL έχει ενεργοποιηθεί, αφαιρώντας την ανάγκη για σελίδες νέας καρτέλας.

Δοκιμάστε να ανοίξετε μια νέα καρτέλα για να δείτε τη νέα γραμμή URL εν δράσει! zen-disable = Απενεργοποίηση -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Ελαχιστοποίηση .tooltip = Ελαχιστοποίηση zen-panel-ui-gradient-generator-custom-color = Προσαρμοσμένο Χρώμα zen-panel-ui-gradient-generator-saved-message = Επιτυχής αποθήκευση της διαβάθμισης! zen-copy-current-url-confirmation = Το URL έχει αντιγραφεί στο πρόχειρο. -zen-general-cancel-label = +zen-general-cancel-label = .label = Ακύρωση -zen-general-confirm = +zen-general-confirm = .label = Επιβεβαίωση zen-pinned-tab-replaced = Το URL της καρφιτσωμένης καρτέλας έχει αντικατασταθεί από το τρέχον URL. zen-tabs-renamed = Η καρτέλα μετονομάστηκε επιτυχώς! zen-background-tab-opened-toast = Άνοιξε νέα καρτέλα στο παρασκήνιο! zen-workspace-renamed-toast = Ο χώρος εργασίας μετονομάστηκε επιτυχώς! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Χώροι -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Μάθετε Περισσότερα zen-close-label = Κλείσιμο -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Αναζήτηση... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/en-GB/browser/browser/zen-general.ftl b/locales/en-GB/browser/browser/zen-general.ftl index f2af54421..aacbfc4da 100644 --- a/locales/en-GB/browser/browser/zen-general.ftl +++ b/locales/en-GB/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = Current profile unified-extensions-description = Extensions are used to bring more extra functionality into { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Reset Pinned Tab .accesskey = R -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Remove from Essentials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Replace Pinned URL with Current .accesskey = C zen-themes-corrupted = Your { -brand-short-name } mods file is corrupted. They have been reset to the default theme. @@ -17,33 +17,33 @@ zen-shortcuts-corrupted = Your { -brand-short-name } shortcuts file is corrupted # note: Do not translate the "
" tags in the following string zen-new-urlbar-notification = The new URL bar has been enabled, removing the need for new tab pages. Try opening a new tab to see the new URL bar in action!

zen-disable = Disable -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimize .tooltip = Minimize zen-panel-ui-gradient-generator-custom-color = Custom colour zen-panel-ui-gradient-generator-saved-message = Successfully saved the gradient! zen-copy-current-url-confirmation = The URL has been copied to the clipboard. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel -zen-general-confirm = +zen-general-confirm = .label = Confirm zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = Tab has been successfully renamed! zen-background-tab-opened-toast = New background tab opened! zen-workspace-renamed-toast = Workspace has been successfully renamed! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Learn More zen-close-label = Close -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Search... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/en-US/browser/browser/zen-general.ftl b/locales/en-US/browser/browser/zen-general.ftl index 4772e428b..9eb37a583 100644 --- a/locales/en-US/browser/browser/zen-general.ftl +++ b/locales/en-US/browser/browser/zen-general.ftl @@ -6,7 +6,7 @@ tab-context-zen-reset-pinned-tab = .label = Reset Pinned Tab .accesskey = R tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E tab-context-zen-remove-essential = .label = Remove from Essentials @@ -88,4 +88,4 @@ zen-site-data-manage-addons = zen-site-data-get-addons = .label = Add Extensions zen-site-data-site-settings = - .label = All Site Settings \ No newline at end of file + .label = All Site Settings diff --git a/locales/es-ES/browser/browser/zen-general.ftl b/locales/es-ES/browser/browser/zen-general.ftl index 19aa9d9ee..e91032ea9 100644 --- a/locales/es-ES/browser/browser/zen-general.ftl +++ b/locales/es-ES/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = perfil actual unified-extensions-description = Las extensiones se utilizan para agregar más funcionalidades a { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Restablecer pestaña fijada .accesskey = R -tab-context-zen-add-essential = - .label = Añadir a esenciales ({ $num } / 12 huecos llenos) +tab-context-zen-add-essential = + .label = Añadir a esenciales ({ $num } / { $max } huecos llenos) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Quitar de esenciales .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Reemplazar la URL fijada con la actual .accesskey = C zen-themes-corrupted = Su archivo de mods de { -brand-short-name } está dañado. Se ha restablecido el tema por defecto. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Se ha habilitado la nueva barra de direcciones, eliminando la necesidad de la página de nueva pestaña.

¡Pruebe a abrir una nueva pestaña para ver la nueva barra de direcciones en acción! zen-disable = Deshabilitar -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimizar .tooltip = Minimizar zen-panel-ui-gradient-generator-custom-color = Color personalizado zen-panel-ui-gradient-generator-saved-message = ¡Gradiente guardado con éxito! zen-copy-current-url-confirmation = La URL se ha copiado al portapapeles. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancelar -zen-general-confirm = +zen-general-confirm = .label = Confirmar zen-pinned-tab-replaced = La URL de la pestaña fijada se ha reemplazado por la URL actual. zen-tabs-renamed = ¡La pestaña se ha renombrado con éxito! zen-background-tab-opened-toast = ¡Nueva pestaña abierta en segundo plano! zen-workspace-renamed-toast = ¡El espacio de trabajo ha sido renombrado con éxito! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Espacios -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Más información zen-close-label = Cerrar -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Buscar... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Iconos urlbar-search-mode-zen_actions = Actions diff --git a/locales/et/browser/browser/zen-general.ftl b/locales/et/browser/browser/zen-general.ftl index 7c4441100..4b2384185 100644 --- a/locales/et/browser/browser/zen-general.ftl +++ b/locales/et/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = praegune profiil unified-extensions-description = Laiendusi kasutatakse täiendava funktsionaalsuse lisamiseks { -brand-short-name }i. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Lähtesta püsikaart .accesskey = p -tab-context-zen-add-essential = - .label = Märgi oluliseks ({ $num } / 12 täidetud) +tab-context-zen-add-essential = + .label = Märgi oluliseks ({ $num } / { $max } täidetud) .accesskey = o -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Eemalda olulistest .accesskey = o -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Asenda püsikaardi URL praegusega .accesskey = p zen-themes-corrupted = Sinu { -brand-short-name } mods-ide fail on vigane. See on nüüd lähtestatud vaikimisi teemaks. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Uus asukohariba on sisse lülitatud, mistõttu pole enam uue kaardi lehte tarvis.

Proovi avada uut kaarti, et näha uut asukohariba! zen-disable = Lülita välja -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimeeri .tooltip = Minimeeri zen-panel-ui-gradient-generator-custom-color = Kohandatud värv zen-panel-ui-gradient-generator-saved-message = Värviüleminek on edukalt salvestatud! zen-copy-current-url-confirmation = URL kopeeriti lõikelauale. -zen-general-cancel-label = +zen-general-cancel-label = .label = Tühista -zen-general-confirm = +zen-general-confirm = .label = Kinnita zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = Kaart on edukalt ümber nimetatud! zen-background-tab-opened-toast = Taustal avati uus kaart! zen-workspace-renamed-toast = Tööruum on edukalt ümber nimetatud! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Tööruumid -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods-id # note: Do not translate the "
" tags in the following string zen-learn-more-text = Rohkem teavet zen-close-label = Sulge -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Otsi... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojid -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Ikoonid urlbar-search-mode-zen_actions = Actions diff --git a/locales/fa/browser/browser/zen-general.ftl b/locales/fa/browser/browser/zen-general.ftl index 7a046afd4..0cf78364a 100644 --- a/locales/fa/browser/browser/zen-general.ftl +++ b/locales/fa/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = نمایهٔ کنونی unified-extensions-description = افزونه‌های در حال استفاده عملکردهای بیشتری به { -brand-short-name } می‌دهند. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Reset Pinned Tab .accesskey = R -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Remove from Essentials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Replace Pinned URL with Current .accesskey = C zen-themes-corrupted = Your { -brand-short-name } mods file is corrupted. They have been reset to the default theme. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = The new URL bar has been enabled, removing the need for new tab pages.

Try opening a new tab to see the new URL bar in action! zen-disable = Disable -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimize .tooltip = Minimize zen-panel-ui-gradient-generator-custom-color = Custom Color zen-panel-ui-gradient-generator-saved-message = Successfully saved the gradient! zen-copy-current-url-confirmation = The URL has been copied to the clipboard. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel -zen-general-confirm = +zen-general-confirm = .label = Confirm zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = Tab has been successfully renamed! zen-background-tab-opened-toast = New background tab opened! zen-workspace-renamed-toast = Workspace has been successfully renamed! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Learn More zen-close-label = Close -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Search... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/fi/browser/browser/zen-general.ftl b/locales/fi/browser/browser/zen-general.ftl index 7330b9882..b2130ac7d 100644 --- a/locales/fi/browser/browser/zen-general.ftl +++ b/locales/fi/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = nykyinen profiili unified-extensions-description = Laajennuksia käytetään tuomaan enemmän ylimääräisiä toimintoja { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Nollaa Kiinnitetty Välilehti .accesskey = R -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Poista olennaisista .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Korvaa kiinnitetty URL-osoite nykyisellä .accesskey = C zen-themes-corrupted = { -brand-short-name } modejasi tiedosto on vioittunut. Ne on palautettu oletusteemaan. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = The new URL bar has been enabled, removing the need for new tab pages.

Try opening a new tab to see the new URL bar in action! zen-disable = Disable -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimize .tooltip = Minimize zen-panel-ui-gradient-generator-custom-color = Muokattu Väri zen-panel-ui-gradient-generator-saved-message = Kaltevuus tallennettu onnistuneesti! zen-copy-current-url-confirmation = The URL has been copied to the clipboard. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel -zen-general-confirm = +zen-general-confirm = .label = Confirm zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = Tab has been successfully renamed! zen-background-tab-opened-toast = New background tab opened! zen-workspace-renamed-toast = Workspace has been successfully renamed! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Learn More zen-close-label = Close -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Search... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/fr/browser/browser/zen-general.ftl b/locales/fr/browser/browser/zen-general.ftl index ac5901c12..a396835a6 100644 --- a/locales/fr/browser/browser/zen-general.ftl +++ b/locales/fr/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = profil actuel unified-extensions-description = Les extensions sont utilisées pour ajouter plus de fonctionnalités à { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Réinitialiser l’onglet épinglé .accesskey = R -tab-context-zen-add-essential = - .label = Ajouter aux Essentials ({ $num }/12 emplacements occupés) +tab-context-zen-add-essential = + .label = Ajouter aux Essentials ({ $num } / { $max } emplacements occupés) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Retirer des Essentials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Remplacer l’URL épinglée par l’actuelle .accesskey = C zen-themes-corrupted = Votre fichier de thèmes { -brand-short-name } est corrompu. Il a été réinitialisé au thème par défaut. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = La nouvelle barre d’adresse a été activée, supprimant la nécessité de nouvelles pages d’onglets.

Essayez d’ouvrir un nouvel onglet pour voir la nouvelle barre d’adresse en action ! zen-disable = Désactiver -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimiser .tooltip = Minimiser zen-panel-ui-gradient-generator-custom-color = Couleur personnalisée zen-panel-ui-gradient-generator-saved-message = Le dégradé a été enregistré avec succès ! zen-copy-current-url-confirmation = L’adresse a été copiée dans le presse-papier. -zen-general-cancel-label = +zen-general-cancel-label = .label = Annuler -zen-general-confirm = +zen-general-confirm = .label = Confirmer zen-pinned-tab-replaced = L’adresse de l'onglet épinglé a été remplacée par l’adresse actuelle. zen-tabs-renamed = L’onglet a été renommé avec succès ! zen-background-tab-opened-toast = Nouvel onglet ouvert en arrière-plan ! zen-workspace-renamed-toast = L'espace de travail a été renommé avec succès ! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Espaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = En savoir plus zen-close-label = Fermer -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Rechercher... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Émojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icônes urlbar-search-mode-zen_actions = Actions diff --git a/locales/ga-IE/browser/browser/zen-general.ftl b/locales/ga-IE/browser/browser/zen-general.ftl index eaa94e10a..a21e5633c 100644 --- a/locales/ga-IE/browser/browser/zen-general.ftl +++ b/locales/ga-IE/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = próifíl reatha unified-extensions-description = Úsáidtear síntí chun níos mó feidhmiúlachta breise a thabhairt isteach i { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Athshocraigh an Cluaisín Prionáilte .accesskey = R -tab-context-zen-add-essential = - .label = Cuir le Bunriachtanais ({ $num } / 12 sliotán líonta) +tab-context-zen-add-essential = + .label = Cuir le Bunriachtanais ({ $num } / { $max } sliotán líonta) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Bain de na Bunriachtanais .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Cuir URL Prionáilte in ionad an URL Reatha .accesskey = C zen-themes-corrupted = Tá do chomhad mods { -brand-short-name } truaillithe. Tá siad athshocraithe chuig an téama réamhshocraithe. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Tá an barra URL nua cumasaithe, rud a fhágann nach bhfuil gá le leathanaigh cluaisín nua.

Bain triail as cluaisín nua a oscailt chun an barra URL nua i mbun oibre a fheiceáil! zen-disable = Díchumasaigh -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Íoslaghdaigh .tooltip = Íoslaghdaigh zen-panel-ui-gradient-generator-custom-color = Dath Saincheaptha zen-panel-ui-gradient-generator-saved-message = Sábháladh an grádán go rathúil! zen-copy-current-url-confirmation = Tá an URL cóipeáilte chuig an ghearrthaisce. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cealaigh -zen-general-confirm = +zen-general-confirm = .label = Deimhnigh zen-pinned-tab-replaced = Tá URL an chluaisín phinnáilte curtha in ionad an URL reatha! zen-tabs-renamed = Athainmníodh an cluaisín go rathúil! zen-background-tab-opened-toast = Tá cluaisín cúlra nua oscailte! zen-workspace-renamed-toast = Athainmníodh an spás oibre go rathúil! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spásanna -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Modanna # note: Do not translate the "
" tags in the following string zen-learn-more-text = Foghlaim Tuilleadh zen-close-label = Dún -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Cuardaigh... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Deilbhíní urlbar-search-mode-zen_actions = Gníomhartha diff --git a/locales/he/browser/browser/zen-general.ftl b/locales/he/browser/browser/zen-general.ftl index 3522defdb..f51f9b74c 100644 --- a/locales/he/browser/browser/zen-general.ftl +++ b/locales/he/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = פרופיל נוכחי unified-extensions-description = הרחבות מוסיפות פונקציונליות נוספת ל{ -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = אפס כרטיסייה מוצמדת .accesskey = ר -tab-context-zen-add-essential = - .label = הוסף לנחוצים ({ $num } / 12 מקומות מלאים) +tab-context-zen-add-essential = + .label = הוסף לנחוצים ({ $num } / { $max } מקומות מלאים) .accesskey = ק -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = הסר מנחוצים .accesskey = ר -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = החלף קישור מוצמד עם הנוכחי .accesskey = ב zen-themes-corrupted = קובץ המודים { -brand-short-name } שלך פגום. הם אופסו לנושא ברירת המחדל. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = סרגל הכתובת החדש הופעל, ומסיר את הצורך בעמודי כרטיסייה חדשה.

נסה לפתוח כרטיסייה חדשה כדי לראות את סרגל הכתובת החדש בפעולה! zen-disable = כבה -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = מזער .tooltip = מזער zen-panel-ui-gradient-generator-custom-color = צבע מותאם אישית zen-panel-ui-gradient-generator-saved-message = מיזוג הצבעים נשמר בהצלחה! zen-copy-current-url-confirmation = הקישור הועתק ללוח. -zen-general-cancel-label = +zen-general-cancel-label = .label = ביטול -zen-general-confirm = +zen-general-confirm = .label = אישור zen-pinned-tab-replaced = קישור כרטיסייה מוצמדת הוחלפה עם הקישור הנוכחי. zen-tabs-renamed = שם הכרטיסייה שונתה בהצלחה! zen-background-tab-opened-toast = לשונית נפתחה ברקע! zen-workspace-renamed-toast = שם הסביבת עבודה שונתה בהצלחה! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = סביבות -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = מודים # note: Do not translate the "
" tags in the following string zen-learn-more-text = מידע נוסף zen-close-label = סגור -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = חיפוש... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = אימוג'ים -zen-icons-picker-svg = +zen-icons-picker-svg = .label = סמלים urlbar-search-mode-zen_actions = Actions diff --git a/locales/hu/browser/browser/zen-general.ftl b/locales/hu/browser/browser/zen-general.ftl index a148fdee3..2b21c676e 100644 --- a/locales/hu/browser/browser/zen-general.ftl +++ b/locales/hu/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = jelenlegi profil unified-extensions-description = A bővítmények a { -brand-short-name }-t új funkciókkal látják el. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Kitűzött lap visszaállítása .accesskey = R -tab-context-zen-add-essential = - .label = Felvétel az alapvetőkbe ({ $num } / 12 hely foglalt) +tab-context-zen-add-essential = + .label = Felvétel az alapvetőkbe ({ $num } / { $max } hely foglalt) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Eltávolítás az alapvetőkből .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Kitűzött lap cseréje a jelenlegi URL-el .accesskey = C zen-themes-corrupted = A te { -brand-short-name } mod fájljaid károsodtak. Vissza lettek állítva az eredeti témára. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Az új URL sáv engedélyezve lett, így nincs szükség új lapokra.

Próbáljon ki egy új lapot nyitni, hogy láthassa az új URL-sávot működés közben! zen-disable = Kikapcsolás -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimalizálás .tooltip = Minimalizálás zen-panel-ui-gradient-generator-custom-color = Egyedi szín zen-panel-ui-gradient-generator-saved-message = Színátmenet sikeresen mentve! zen-copy-current-url-confirmation = Az URL-cím a vágólapra lett másolva. -zen-general-cancel-label = +zen-general-cancel-label = .label = Mégsem -zen-general-confirm = +zen-general-confirm = .label = Megerősítés zen-pinned-tab-replaced = A rögzített lap URL címe helyébe az aktuális URL cím lépett! zen-tabs-renamed = A lap sikeresen át lett nevezve! zen-background-tab-opened-toast = Új lap megnyitva! zen-workspace-renamed-toast = A munkakörnyezet sikeresen át lett nevezve! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Környezetek -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Modok # note: Do not translate the "
" tags in the following string zen-learn-more-text = Tudjon meg többet zen-close-label = Bezárás -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Keresés... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojik -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Ikonok urlbar-search-mode-zen_actions = Actions diff --git a/locales/id/browser/browser/zen-general.ftl b/locales/id/browser/browser/zen-general.ftl index 1cf6f1395..91bd473d1 100644 --- a/locales/id/browser/browser/zen-general.ftl +++ b/locales/id/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = profil saat ini unified-extensions-description = Ekstensi digunakan untuk menambahkan lebih banyak fungsi ekstra ke { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Kembalikan ke URL Awal .accesskey = R -tab-context-zen-add-essential = - .label = Tambahkan ke Essentials ({ $num } / 12 slot terisi) +tab-context-zen-add-essential = + .label = Tambahkan ke Essentials ({ $num } / { $max } slot terisi) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Hapus dari Essentials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Ganti URL Sematan ke URL saat ini .accesskey = C zen-themes-corrupted = Tidak dapat memuat file tema { -brand-short-name } Anda karena rusak. File tersebut telah diatur ulang ke tema default. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Bilah URL baru telah diaktifkan, menghapus kebutuhan untuk halaman tab baru.

Coba buka tab baru untuk melihat bilah URL baru beraksi! zen-disable = Nonaktifkan -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimalkan .tooltip = Minimalkan zen-panel-ui-gradient-generator-custom-color = Warna Kustom zen-panel-ui-gradient-generator-saved-message = Berhasil menyimpan gradien! zen-copy-current-url-confirmation = URL telah disalin ke clipboard. -zen-general-cancel-label = +zen-general-cancel-label = .label = Batalkan -zen-general-confirm = +zen-general-confirm = .label = Konfirmasi zen-pinned-tab-replaced = URL awal dari tab yang disematkan telah diganti dengan URL saat ini. zen-tabs-renamed = Tab telah berhasil diubah namanya! zen-background-tab-opened-toast = Tab baru telah terbuka di latar belakang! zen-workspace-renamed-toast = Ruang Kerja telah berhasil diubah namanya! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Ruang -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Pelajari Lebih Lanjut zen-close-label = Tutup -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Cari... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emoji -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Ikon urlbar-search-mode-zen_actions = Aksi diff --git a/locales/is/browser/browser/zen-general.ftl b/locales/is/browser/browser/zen-general.ftl index 47623b075..3b9022555 100644 --- a/locales/is/browser/browser/zen-general.ftl +++ b/locales/is/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = núverandi prófíl unified-extensions-description = Viðbætur eru notaðar til að koma með meiri auka virkni inn í { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Endursetja Festan Flipa .accesskey = R -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Fjarlægja frá Höfuðatriði .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Setja aftur Fest-URL með Núverandi .accesskey = C zen-themes-corrupted = { -brand-short-name } mods skráin þín er skemmd. Þeir hafa verið endurstilltir á sjálfgefið þema. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Nýja vefslóðastikan hefur verið virkjuð og fjarlægir þörfina á nýjum flipasíðum.

Prófaðu að opna nýjan flipa til að sjá nýju vefslóðastikuna í notkun! zen-disable = Óvirkja -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimize .tooltip = Minimize zen-panel-ui-gradient-generator-custom-color = Sérsniðinn litur zen-panel-ui-gradient-generator-saved-message = Vistað hallann! zen-copy-current-url-confirmation = Slóðin hefur verið afrituð á klippiborðið. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel -zen-general-confirm = +zen-general-confirm = .label = Confirm zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = Tab has been successfully renamed! zen-background-tab-opened-toast = New background tab opened! zen-workspace-renamed-toast = Workspace has been successfully renamed! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Læra Meira zen-close-label = Loka -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Search... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/it/browser/browser/zen-general.ftl b/locales/it/browser/browser/zen-general.ftl index 888c7622d..8196be8d0 100644 --- a/locales/it/browser/browser/zen-general.ftl +++ b/locales/it/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = profilo in uso unified-extensions-description = Le estensioni sono usate per portare più funzionalità in { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Reimposta Scheda Bloccata .accesskey = R -tab-context-zen-add-essential = - .label = Aggiungi a Essentials ({ $num } / 12 slot riempiti) +tab-context-zen-add-essential = + .label = Aggiungi a Essentials ({ $num } / { $max } slot riempiti) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Rimuovi dagli Essenziali .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Sostituisci URL fissato con quello corrente .accesskey = C zen-themes-corrupted = Il tuo file { -brand-short-name } mods è danneggiato. Sono stati reimpostati al tema predefinito. @@ -17,33 +17,33 @@ zen-shortcuts-corrupted = Il file delle scorciatoie per { -brand-short-name } è # note: Do not translate the "
" tags in the following string zen-new-urlbar-notification = La nuova barra degli indirizzi è stata abilitata, eliminando la necessità della pagina di una nuova scheda.

Prova ad aprire una nuova scheda per vedere la nuova barra degli indirizzi in azione! zen-disable = Disabilita -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimizza .tooltip = Minimizza zen-panel-ui-gradient-generator-custom-color = Colore Personalizzato zen-panel-ui-gradient-generator-saved-message = Gradiente salvato con successo! zen-copy-current-url-confirmation = L'URL è stato copiato negli appunti. -zen-general-cancel-label = +zen-general-cancel-label = .label = Annulla -zen-general-confirm = +zen-general-confirm = .label = Conferma zen-pinned-tab-replaced = L'URL della scheda bloccata è stato sostituito con l'URL attuale. zen-tabs-renamed = La scheda è stata rinominata con successo! zen-background-tab-opened-toast = Nuova scheda aperta in background! zen-workspace-renamed-toast = Il Workspace è stato rinominato con successo! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spazi -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mod # note: Do not translate the "
" tags in the following string zen-learn-more-text = Scopri di più zen-close-label = Chiudi -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Cerca... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emoji -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icone urlbar-search-mode-zen_actions = Actions diff --git a/locales/ja/browser/browser/zen-general.ftl b/locales/ja/browser/browser/zen-general.ftl index 59134277a..7e107d4c2 100644 --- a/locales/ja/browser/browser/zen-general.ftl +++ b/locales/ja/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = 使用中のプロファイル unified-extensions-description = 拡張機能は、 { -brand-short-name } に多くの追加機能をもたらすために使用されます。 -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = ピン留めされたタブをリセット .accesskey = R -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Essentialsから削除 .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = ピン留めされた URL を現在のものに置き換え .accesskey = C zen-themes-corrupted = { -brand-short-name } Modファイルが破損しています。既定のテーマにリセットされました。 @@ -19,33 +19,33 @@ zen-new-urlbar-notification = The new URL bar has been enabled, removing the need for new tab pages.

Try opening a new tab to see the new URL bar in action! zen-disable = 無効 -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimize .tooltip = Minimize zen-panel-ui-gradient-generator-custom-color = カスタムカラー zen-panel-ui-gradient-generator-saved-message = グラデーションを正常に保存しました! zen-copy-current-url-confirmation = URLをクリップボードにコピーしました -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel -zen-general-confirm = +zen-general-confirm = .label = Confirm zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = Tab has been successfully renamed! zen-background-tab-opened-toast = New background tab opened! zen-workspace-renamed-toast = Workspace has been successfully renamed! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Learn More zen-close-label = 閉じる -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Search... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/ko/browser/browser/zen-general.ftl b/locales/ko/browser/browser/zen-general.ftl index 113315eb6..9a1562043 100644 --- a/locales/ko/browser/browser/zen-general.ftl +++ b/locales/ko/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = 현재 프로필 unified-extensions-description = 확장 프로그램은 { -brand-short-name }에 더 많은 추가 기능을 제공하는 데 사용됩니다. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = 고정된 탭 초기화 .accesskey = R -tab-context-zen-add-essential = - .label = 에센셜에 추가 ({ $num } / 12 개 추가됨) +tab-context-zen-add-essential = + .label = 에센셜에 추가 ({ $num } / { $max } 개 추가됨) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = 에센셜에서 제거하기 .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = 고정된 URL을 현재 URL로 변경 .accesskey = C zen-themes-corrupted = { -brand-short-name } 모드 파일이 손상되었습니다. 기본 테마로 재설정되었습니다. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = 새 탭 페이지가 필요 없는 새로운 주소 표시줄이 활성화 되었습니다.

새 탭을 열어서 새로운 URL 바를 만나보세요! zen-disable = 비활성화 -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = 최소화 .tooltip = 최소화 zen-panel-ui-gradient-generator-custom-color = 커스텀 색상 zen-panel-ui-gradient-generator-saved-message = 성공적으로 그라데이션을 저장했습니다! zen-copy-current-url-confirmation = URL이 복사되었습니다. -zen-general-cancel-label = +zen-general-cancel-label = .label = 취소 -zen-general-confirm = +zen-general-confirm = .label = 확인 zen-pinned-tab-replaced = 고정 URL이 현재 URL로 변경되었습니다! zen-tabs-renamed = 탭의 이름이 성공적으로 변경되었습니다! zen-background-tab-opened-toast = 새 백그라운드 탭이 열렸습니다! zen-workspace-renamed-toast = 워크스페이스 이름이 변경되었습니다! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = 스페이스 -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = 모드 # note: Do not translate the "
" tags in the following string zen-learn-more-text = 더 알아보기 zen-close-label = 닫기 -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = 검색... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = 이모티콘 -zen-icons-picker-svg = +zen-icons-picker-svg = .label = 아이콘 urlbar-search-mode-zen_actions = 액션 diff --git a/locales/lt/browser/browser/zen-general.ftl b/locales/lt/browser/browser/zen-general.ftl index 42606787f..0f9917e65 100644 --- a/locales/lt/browser/browser/zen-general.ftl +++ b/locales/lt/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = dabartinis profilis unified-extensions-description = Plėtiniai naudojami norint į „{ -brand-short-name }“ įtraukti daugiau papildomų funkcijų. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Atkurti prisegtą kortelę .accesskey = R -tab-context-zen-add-essential = - .label = Įtraukti į būtiniausius ({ $num } / 12 užpildytų vietų) +tab-context-zen-add-essential = + .label = Įtraukti į būtiniausius ({ $num } / { $max } užpildytų vietų) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Šalinti iš būtiniausių .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Pakeisti prisegtą URL adresą dabartiniu .accesskey = C zen-themes-corrupted = Jūsų „{ -brand-short-name }“ modifikacijos failas sugadintas. Jie buvo atkurti į numatytąją temą. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Įjungta nauja URL juosta, todėl nebereikia naujų kortelių puslapių.

Pabandykite atverti naują kortelę, kad pamatytumėte naująją URL juostą! zen-disable = Išjungti -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Sumažinti .tooltip = Sumažinti zen-panel-ui-gradient-generator-custom-color = Pasirinktinė spalva zen-panel-ui-gradient-generator-saved-message = Gradientas sėkmingai įrašytas. zen-copy-current-url-confirmation = URL buvo nukopijuotas į iškarpinę. -zen-general-cancel-label = +zen-general-cancel-label = .label = Atšaukti -zen-general-confirm = +zen-general-confirm = .label = Patvirtinti zen-pinned-tab-replaced = Prisegtos kortelės URL pakeistas dabartiniu URL. zen-tabs-renamed = Kortelė sėkmingai pervadinta. zen-background-tab-opened-toast = Nauja fonos kortelė atverta. zen-workspace-renamed-toast = Darbo sritis sėkmingai pervadintas. -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Erdvės -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Modifikacijos # note: Do not translate the "
" tags in the following string zen-learn-more-text = Sužinoti daugiau zen-close-label = Užverti -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Ieškokite... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Jaustukai -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Piktogramos urlbar-search-mode-zen_actions = Actions diff --git a/locales/nl/browser/browser/zen-general.ftl b/locales/nl/browser/browser/zen-general.ftl index eb4d83cc8..8e5ba7b49 100644 --- a/locales/nl/browser/browser/zen-general.ftl +++ b/locales/nl/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = huidig profiel unified-extensions-description = Extensies worden gebruikt om extra functionaliteit toe te voegen aan { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Vastgezette tabblad resetten .accesskey = R -tab-context-zen-add-essential = - .label = Toevoegen aan Essentials ({ $num } / 12 plekken gevuld) +tab-context-zen-add-essential = + .label = Toevoegen aan Essentials ({ $num } / { $max } plekken gevuld) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Verwijderen uit Essentials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Vastgezette URL vervangen met huidige .accesskey = C zen-themes-corrupted = Je { -brand-short-name } mods bestand is beschadigd. Ze zijn gereset naar het standaard thema. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = De nieuwe URL-balk is ingeschakeld, waardoor nieuwe tabbladen niet meer nodig zijn.

Probeer een nieuw tabblad te openen om de nieuwe URL-balk in actie te zien! zen-disable = Uitschakelen -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimaliseren .tooltip = Minimaliseren zen-panel-ui-gradient-generator-custom-color = Aangepaste kleur zen-panel-ui-gradient-generator-saved-message = Verloop is succesvol opgeslagen! zen-copy-current-url-confirmation = De URL is gekopieerd naar het klembord. -zen-general-cancel-label = +zen-general-cancel-label = .label = Annuleren -zen-general-confirm = +zen-general-confirm = .label = Bevestigen zen-pinned-tab-replaced = Vastgemaakte tabblad URL is vervangen met de huidige URL! zen-tabs-renamed = Tabblad is succesvol hernoemd! zen-background-tab-opened-toast = Nieuw achtergrondtabblad geopend! zen-workspace-renamed-toast = Werkruimte succesvol is hernoemd! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Ruimtes -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Meer leren zen-close-label = Sluiten -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Zoeken… -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/nn-NO/browser/browser/zen-general.ftl b/locales/nn-NO/browser/browser/zen-general.ftl index 5a5206e4f..0677b61af 100644 --- a/locales/nn-NO/browser/browser/zen-general.ftl +++ b/locales/nn-NO/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = current profile unified-extensions-description = Extensions are used to bring more extra functionality into { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Reset Pinned Tab .accesskey = R -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Remove from Essentials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Replace Pinned URL with Current .accesskey = C zen-themes-corrupted = Your { -brand-short-name } mods file is corrupted. They have been reset to the default theme. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = The new URL bar has been enabled, removing the need for new tab pages.

Try opening a new tab to see the new URL bar in action! zen-disable = Disable -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimize .tooltip = Minimize zen-panel-ui-gradient-generator-custom-color = Custom Color zen-panel-ui-gradient-generator-saved-message = Successfully saved the gradient! zen-copy-current-url-confirmation = The URL has been copied to the clipboard. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel -zen-general-confirm = +zen-general-confirm = .label = Confirm zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = Tab has been successfully renamed! zen-background-tab-opened-toast = New background tab opened! zen-workspace-renamed-toast = Workspace has been successfully renamed! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Learn More zen-close-label = Close -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Search... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/pl/browser/browser/zen-general.ftl b/locales/pl/browser/browser/zen-general.ftl index 2d71e23c4..c74068fb8 100644 --- a/locales/pl/browser/browser/zen-general.ftl +++ b/locales/pl/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = Aktualny profil unified-extensions-description = Rozszerzenia są używane do zapewnienia większej liczby dodatkowych funkcji w { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Resetuj przypiętą kartę .accesskey = R -tab-context-zen-add-essential = - .label = Dodaj do Niezbędnych ({ $num } / 12 miejsc wypełnione) +tab-context-zen-add-essential = + .label = Dodaj do Niezbędnych ({ $num } / { $max } miejsc wypełnione) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Usuń z Niezbędnych .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Zastąp przypięty adres URL aktualnym .accesskey = C zen-themes-corrupted = Twój plik modów { -brand-short-name } jest uszkodzony. Zostały one zresetowane do domyślnego stanu. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Nowy pasek adresu został aktywowany, a tym samym strona nowej karty nie jest już potrzebna.

Spróbuj otworzyć nową kartę i wypróbuj nowy pasek adresu w akcji! zen-disable = Deaktywuj -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Zminimalizuj .tooltip = Zminimalizuj zen-panel-ui-gradient-generator-custom-color = Niestandardowy kolor zen-panel-ui-gradient-generator-saved-message = Pomyślnie zapisano gradient! zen-copy-current-url-confirmation = Adres URL został skopiowany do schowka. -zen-general-cancel-label = +zen-general-cancel-label = .label = Anuluj -zen-general-confirm = +zen-general-confirm = .label = Potwierdź zen-pinned-tab-replaced = URL przypiętej karty został zastąpiony bieżącym adresem. zen-tabs-renamed = Nazwa karty została z powodzeniem zmieniona! zen-background-tab-opened-toast = Nowa karta została otworzona w tle! zen-workspace-renamed-toast = Zmieniono nazwę Przestrzeni roboczej! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Przestrzenie -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Modyfikacje # note: Do not translate the "
" tags in the following string zen-learn-more-text = Dowiedz się więcej zen-close-label = Zamknij -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Szukaj... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/pt-BR/browser/browser/zen-general.ftl b/locales/pt-BR/browser/browser/zen-general.ftl index 4b37157b3..dd00db284 100644 --- a/locales/pt-BR/browser/browser/zen-general.ftl +++ b/locales/pt-BR/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = perfil atual unified-extensions-description = As extensões são usadas para trazer mais recursos adicionais para o { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Redefinir Guia Fixada .accesskey = R -tab-context-zen-add-essential = - .label = Adicionar aos Essenciais ({ $num } / 12 espaços preenchidos) +tab-context-zen-add-essential = + .label = Adicionar aos Essenciais ({ $num } / { $max } espaços preenchidos) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Remover dos Essenciais .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Substituir URL da Guia Fixada pela Atual .accesskey = C zen-themes-corrupted = Seu arquivo de modificações { -brand-short-name } está corrompido. Eles foram redefinidos para o tema padrão. @@ -17,33 +17,33 @@ zen-shortcuts-corrupted = Seu arquivo de atalhos { -brand-short-name } está cor # note: Do not translate the "
" tags in the following string zen-new-urlbar-notification = A nova barra de URL foi ativada, removendo a necessidade de novas páginas de guia.

Tente abrir uma nova guia para ver a nova barra de URL em ação! zen-disable = Desativar -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimizar .tooltip = Minimizar zen-panel-ui-gradient-generator-custom-color = Cor Personalizada zen-panel-ui-gradient-generator-saved-message = O gradiente foi salvo com sucesso! zen-copy-current-url-confirmation = A URL foi copiada para a área de transferência. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancelar -zen-general-confirm = +zen-general-confirm = .label = Confirmar zen-pinned-tab-replaced = A URL da guia fixada foi substituída pela URL atual! zen-tabs-renamed = A guia foi renomeada com sucesso! zen-background-tab-opened-toast = Nova guia em segundo plano aberta! zen-workspace-renamed-toast = A área de trabalho foi renomeada com sucesso! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Espaços -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Saiba Mais zen-close-label = Fechar -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Pesquisar... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Ícones urlbar-search-mode-zen_actions = Actions diff --git a/locales/pt-PT/browser/browser/zen-general.ftl b/locales/pt-PT/browser/browser/zen-general.ftl index 4963234ac..059e65876 100644 --- a/locales/pt-PT/browser/browser/zen-general.ftl +++ b/locales/pt-PT/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = perfil atual unified-extensions-description = As extensões são usadas para trazer funcionalidades adicionais para o { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Repor o Separador Fixado .accesskey = R -tab-context-zen-add-essential = - .label = Adicionar aos Essenciais ({ $num }/12 espaços preenchidos) +tab-context-zen-add-essential = + .label = Adicionar aos Essenciais ({ $num } / { $max } espaços preenchidos) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Remover dos Essenciais .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Substituir o URL Fixado pelo URL Atual .accesskey = C zen-themes-corrupted = O seu ficheiro de modificações do { -brand-short-name } está corrompido. Elas foram redefinidas como iguais às do tema padrão. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = A nova barra de URL foi ativada, removendo a necessidade de páginas de novo separador.

Experimente abrir um novo separador para ver a nova barra de URL em ação! zen-disable = Desativar -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimizar .tooltip = Minimizar zen-panel-ui-gradient-generator-custom-color = Cor personalizada zen-panel-ui-gradient-generator-saved-message = Gradiente guardado com sucesso! zen-copy-current-url-confirmation = O URL foi copiado para a área de transferência. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancelar -zen-general-confirm = +zen-general-confirm = .label = Confirmar zen-pinned-tab-replaced = O URL do separador fixado foi substituído pelo URL atual. zen-tabs-renamed = Nome do separador alterado com sucesso! zen-background-tab-opened-toast = Novo separador aberto em segundo plano! zen-workspace-renamed-toast = Nome do espaço de trabalho alterado com sucesso! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Espaços -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Modificações # note: Do not translate the "
" tags in the following string zen-learn-more-text = Saber Mais zen-close-label = Fechar -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Pesquisar... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Ícones urlbar-search-mode-zen_actions = Ações diff --git a/locales/ru/browser/browser/zen-general.ftl b/locales/ru/browser/browser/zen-general.ftl index 6c80884b7..36a47e9c4 100644 --- a/locales/ru/browser/browser/zen-general.ftl +++ b/locales/ru/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = текущий профиль unified-extensions-description = Расширения дополняют функционал { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Сбросить закреплённую вкладку .accesskey = R -tab-context-zen-add-essential = - .label = Добавить в важное ({ $num } из 12 слотов заполнено) +tab-context-zen-add-essential = + .label = Добавить в важное ({ $num } из { $num } слотов заполнено) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Удалить из важного .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Заменить закреплённый адрес на текущий .accesskey = C zen-themes-corrupted = Файл дополнения { -brand-short-name } повреждён. Возвращена тема по умолчанию. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Новая адресная строка активирована, теперь нет необходимости использовать отдельные страницы для новых вкладок.

Попробуйте открыть новую вкладку, чтобы увидеть новую адресную строку в действии! zen-disable = Выключить -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Свернуть .tooltip = Свернуть zen-panel-ui-gradient-generator-custom-color = Пользовательский цвет zen-panel-ui-gradient-generator-saved-message = Градиент успешно сохранён! zen-copy-current-url-confirmation = Ссылка скопирована в буфер обмена. -zen-general-cancel-label = +zen-general-cancel-label = .label = Отменить -zen-general-confirm = +zen-general-confirm = .label = Подтвердить zen-pinned-tab-replaced = Адрес закреплённой вкладки заменён на текущий адрес! zen-tabs-renamed = Вкладка успешно переименована! zen-background-tab-opened-toast = Открыта новая фоновая вкладка! zen-workspace-renamed-toast = Пространство успешно переименовано! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Пространства -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Моды # note: Do not translate the "
" tags in the following string zen-learn-more-text = Узнать больше zen-close-label = Закрыть -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Найти... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Эмодзи -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Иконки urlbar-search-mode-zen_actions = Действия diff --git a/locales/sv-SE/browser/browser/zen-general.ftl b/locales/sv-SE/browser/browser/zen-general.ftl index 0ca33f23e..da4a4413f 100644 --- a/locales/sv-SE/browser/browser/zen-general.ftl +++ b/locales/sv-SE/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = nuvarande profil unified-extensions-description = Tillägg används för att få fler extra funktioner i { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Återställ Fäst flik .accesskey = R -tab-context-zen-add-essential = - .label = Lägg till Essentials ({ $num } / 12 platser fyllda) +tab-context-zen-add-essential = + .label = Lägg till Essentials ({ $num } / { $max } platser fyllda) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Ta bort från Essentials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Ersätt fäst fliks URL med nuvarande .accesskey = C zen-themes-corrupted = Din { -brand-short-name } modds-fil är skadad. De har återställts till standardtemat. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = The new URL bar has been enabled, removing the need for new tab pages.

Try opening a new tab to see the new URL bar in action! zen-disable = Inaktivera -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimera .tooltip = Minimera zen-panel-ui-gradient-generator-custom-color = Anpassad färg zen-panel-ui-gradient-generator-saved-message = Lyckades spara gradienten! zen-copy-current-url-confirmation = Länken har kopierats till urklipp. -zen-general-cancel-label = +zen-general-cancel-label = .label = Avbryt -zen-general-confirm = +zen-general-confirm = .label = Bekräfta zen-pinned-tab-replaced = Den fästa flikens URL har ersatts med den aktuella URL! zen-tabs-renamed = Fliken har fått nytt namn! zen-background-tab-opened-toast = Ny bakgrundsflik öppnad! zen-workspace-renamed-toast = Arbetsytan har fått ett nytt namn! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Arbetsytor -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Läs mer zen-close-label = Stäng -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Sök... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Ikoner urlbar-search-mode-zen_actions = Actions diff --git a/locales/th/browser/browser/zen-general.ftl b/locales/th/browser/browser/zen-general.ftl index 5a5206e4f..0677b61af 100644 --- a/locales/th/browser/browser/zen-general.ftl +++ b/locales/th/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = current profile unified-extensions-description = Extensions are used to bring more extra functionality into { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Reset Pinned Tab .accesskey = R -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Remove from Essentials .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Replace Pinned URL with Current .accesskey = C zen-themes-corrupted = Your { -brand-short-name } mods file is corrupted. They have been reset to the default theme. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = The new URL bar has been enabled, removing the need for new tab pages.

Try opening a new tab to see the new URL bar in action! zen-disable = Disable -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Minimize .tooltip = Minimize zen-panel-ui-gradient-generator-custom-color = Custom Color zen-panel-ui-gradient-generator-saved-message = Successfully saved the gradient! zen-copy-current-url-confirmation = The URL has been copied to the clipboard. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel -zen-general-confirm = +zen-general-confirm = .label = Confirm zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = Tab has been successfully renamed! zen-background-tab-opened-toast = New background tab opened! zen-workspace-renamed-toast = Workspace has been successfully renamed! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Learn More zen-close-label = Close -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Search... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/tr/browser/browser/zen-general.ftl b/locales/tr/browser/browser/zen-general.ftl index 19ea2def8..cc426d665 100644 --- a/locales/tr/browser/browser/zen-general.ftl +++ b/locales/tr/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = mevcut profil unified-extensions-description = Uzantılar { -brand-short-name } daha fazla işlevsellik kazandırmak için kullanılır. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Sabitlenen Sekmeyi Sıfırla .accesskey = R -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Temel Ögelerden Kaldır .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Sabitlenen URL'yi Mevcut ile Değiştir .accesskey = C zen-themes-corrupted = { -brand-short-name } adlı modun dosyaları hatalı. Varsayılan temaya sıfırlandılar. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Yeni sekme sayfalarına ihtiyacı kaldıran yeni URL Bar aktifleşti.

Yeni URL bar'ı görmek için yeni bir sekme açın! zen-disable = Devre dışı bırak -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Küçült .tooltip = Küçült zen-panel-ui-gradient-generator-custom-color = Özel Renk zen-panel-ui-gradient-generator-saved-message = Renkler başarıyla kaydedildi! zen-copy-current-url-confirmation = URL panoya kopyalandı. -zen-general-cancel-label = +zen-general-cancel-label = .label = Cancel -zen-general-confirm = +zen-general-confirm = .label = Onayla zen-pinned-tab-replaced = Başa tutturulmuş sekme URL'si, şimdiki URL ile değiştirildi. zen-tabs-renamed = Sekme başarıyla yeniden adlandırıldı! zen-background-tab-opened-toast = New background tab opened! zen-workspace-renamed-toast = Workspace has been successfully renamed! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Spaces -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Daha Fazla Bilgi zen-close-label = Kapat -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Search... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Emojis -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Icons urlbar-search-mode-zen_actions = Actions diff --git a/locales/uk/browser/browser/zen-general.ftl b/locales/uk/browser/browser/zen-general.ftl index 64539a461..f4fb27fb8 100644 --- a/locales/uk/browser/browser/zen-general.ftl +++ b/locales/uk/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = поточний профіль unified-extensions-description = Розширення використовуються, щоб додати більше функціональних можливостей до { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Скинути прикріплену вкладку .accesskey = Р -tab-context-zen-add-essential = - .label = Додати до Основного ({ $num } / 12 комірок заповнено) +tab-context-zen-add-essential = + .label = Додати до Основного ({ $num } / { $max } комірок заповнено) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Вилучити з основних елементів .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Замінити закріплений URL на поточний .accesskey = C zen-themes-corrupted = Ваш файл модифікацій { -brand-short-name } пошкоджено. Вони були скинуті до типової теми. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Увімкнено новий рядок URL-адрес, що усуває потребу в нових сторінках вкладок.

Спробуйте відкрити нову вкладку, щоб побачити новий рядок URL-адреси в дії! zen-disable = Вимкнути -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Згорнути .tooltip = Згорнути zen-panel-ui-gradient-generator-custom-color = Власний колір zen-panel-ui-gradient-generator-saved-message = Градієнт успішно збережено! zen-copy-current-url-confirmation = URL-адресу було скопійовано до буфера обміну. -zen-general-cancel-label = +zen-general-cancel-label = .label = Скасувати -zen-general-confirm = +zen-general-confirm = .label = Підтвердити zen-pinned-tab-replaced = URL-адресу закріпленої вкладки замінено на поточну URL-адресу. zen-tabs-renamed = Вкладку успішно перейменовано! zen-background-tab-opened-toast = Відкрито нову фонову вкладку! zen-workspace-renamed-toast = Робочий простір успішно перейменовано! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Простори -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Модифікації # note: Do not translate the "
" tags in the following string zen-learn-more-text = Дізнатися більше zen-close-label = Закрити -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Пошук... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Емоджі -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Значки urlbar-search-mode-zen_actions = Дії diff --git a/locales/vi/browser/browser/zen-general.ftl b/locales/vi/browser/browser/zen-general.ftl index 0c73c7861..7b8cf2c71 100644 --- a/locales/vi/browser/browser/zen-general.ftl +++ b/locales/vi/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = hồ sơ hiện tại unified-extensions-description = Các tiện ích mở rộng được sử dụng để mang thêm tính năng vào { -brand-short-name }. -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = Đặt lại thẻ đã ghim .accesskey = R -tab-context-zen-add-essential = - .label = Thêm thẻ vào thường trú (đã thêm { $num } / 12 ) +tab-context-zen-add-essential = + .label = Thêm thẻ vào thường trú (đã thêm { $num } / { $max } ) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = Loại ra khỏi thẻ thường trú .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = Thay thế đường dường dẫn đã gim với hiện tại .accesskey = C zen-themes-corrupted = Thư mục chủ đề { -brand-short-name } của bạn đã bị hư, chúng đã được trả về thiết kế gốc. @@ -19,33 +19,33 @@ zen-new-urlbar-notification = Thanh đường dẫn mới đã được kích hoạt, loại bỏ chức năng của trang "thẻ mới".

Hãy thử tạo một thể để xem cái "mới" của thành đường dẫn! zen-disable = Vô hiệu hóa -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = Thu nhỏ .tooltip = Thu nhỏ zen-panel-ui-gradient-generator-custom-color = Tùy chỉnh màu sắc zen-panel-ui-gradient-generator-saved-message = Lưu tùy chỉnh đổ màu thành công! zen-copy-current-url-confirmation = Đường dẫn đã được chép vào bộ nhớ. -zen-general-cancel-label = +zen-general-cancel-label = .label = Hủy -zen-general-confirm = +zen-general-confirm = .label = Xác nhận zen-pinned-tab-replaced = Đường dẫn trên thẻ gim đã được thay thể bởi đường dẫn hiện tại! zen-tabs-renamed = Thẻ đã được đổi tên! zen-background-tab-opened-toast = Một thẻ mới đã được mở dưới nền! zen-workspace-renamed-toast = Không gian làm việc đã được đổi tên! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = Không gian làm việc -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = Mods # note: Do not translate the "
" tags in the following string zen-learn-more-text = Tìm hiểu thêm zen-close-label = Đóng -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Tìm kiếm... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = Biểu cảm -zen-icons-picker-svg = +zen-icons-picker-svg = .label = Biểu tượng urlbar-search-mode-zen_actions = Actions diff --git a/locales/zh-CN/browser/browser/zen-general.ftl b/locales/zh-CN/browser/browser/zen-general.ftl index 45bba9c94..f9e5c12f6 100644 --- a/locales/zh-CN/browser/browser/zen-general.ftl +++ b/locales/zh-CN/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = 当前配置 unified-extensions-description = 扩展用于为 { -brand-short-name } 带来更多额外功能。 -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = 重置固定标签页 .accesskey = R -tab-context-zen-add-essential = - .label = 添加到常驻标签页(已使用 { $num } / 12) +tab-context-zen-add-essential = + .label = 添加到常驻标签页(已使用 { $num } / { $max }) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = 从常驻标签页中移除 .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = 将固定标签页的 URL 替换为当前页面 URL .accesskey = C zen-themes-corrupted = 您的 { -brand-short-name } 模组文件已损坏。它们已重置为默认主题。 @@ -17,33 +17,33 @@ zen-shortcuts-corrupted = 您的 { -brand-short-name } 快捷键文件已损坏 # note: Do not translate the "
" tags in the following string zen-new-urlbar-notification = 新的 URL 栏已启用,不再需要新标签页。

打开一个新标签页来试试看新 URL 栏! zen-disable = 禁用 -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = 最小化 .tooltip = 最小化 zen-panel-ui-gradient-generator-custom-color = 自定义颜色 zen-panel-ui-gradient-generator-saved-message = 渐变保存成功! zen-copy-current-url-confirmation = 网址已复制到剪贴板。 -zen-general-cancel-label = +zen-general-cancel-label = .label = 取消 -zen-general-confirm = +zen-general-confirm = .label = 确认 zen-pinned-tab-replaced = 固定标签页的网址已更新为当前页面网址。 zen-tabs-renamed = 标签页重命名成功! zen-background-tab-opened-toast = 新的后台标签页已打开 ! zen-workspace-renamed-toast = 工作区重命名成功! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = 工作区 -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = 模组 # note: Do not translate the "
" tags in the following string zen-learn-more-text = 了解更多 zen-close-label = 关闭 -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = 搜索… -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = 表情符号 -zen-icons-picker-svg = +zen-icons-picker-svg = .label = 图标集 urlbar-search-mode-zen_actions = Actions diff --git a/locales/zh-TW/browser/browser/zen-general.ftl b/locales/zh-TW/browser/browser/zen-general.ftl index d76f6d1dd..68948379c 100644 --- a/locales/zh-TW/browser/browser/zen-general.ftl +++ b/locales/zh-TW/browser/browser/zen-general.ftl @@ -1,15 +1,15 @@ zen-panel-ui-current-profile-text = 當前設定檔 unified-extensions-description = 擴充功能可為 { -brand-short-name } 帶來更多額外功能。 -tab-context-zen-reset-pinned-tab = +tab-context-zen-reset-pinned-tab = .label = 重置釘選的分頁 .accesskey = R -tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) +tab-context-zen-add-essential = + .label = Add to Essentials ({ $num } / { $max } slots filled) .accesskey = E -tab-context-zen-remove-essential = +tab-context-zen-remove-essential = .label = 從 Essentials 中移除 .accesskey = R -tab-context-zen-replace-pinned-url-with-current = +tab-context-zen-replace-pinned-url-with-current = .label = 將釘選的網址換成目前的網址 .accesskey = C zen-themes-corrupted = 你的 { -brand-short-name } 模組文件已損壞,它們已重設為預設主題。 @@ -17,33 +17,33 @@ zen-shortcuts-corrupted = 你的 { -brand-short-name } 快捷文件已損壞。 # note: Do not translate the "
" tags in the following string zen-new-urlbar-notification = 新的 URL 欄已啟用,你不再需要新增新分頁。

馬上打開新分頁來看看新的 URL 欄! zen-disable = 停用 -pictureinpicture-minimize-btn = +pictureinpicture-minimize-btn = .aria-label = 最小化 .tooltip = 最小化 zen-panel-ui-gradient-generator-custom-color = 自訂顏色 zen-panel-ui-gradient-generator-saved-message = 已成功儲存漸層! zen-copy-current-url-confirmation = 網址已複製到剪貼簿。 -zen-general-cancel-label = +zen-general-cancel-label = .label = 取消 -zen-general-confirm = +zen-general-confirm = .label = 確認 zen-pinned-tab-replaced = 釘選分頁網址已替換為當前當前網址。 zen-tabs-renamed = 已成功重新命名分頁! zen-background-tab-opened-toast = 已在背景開啟新分頁! zen-workspace-renamed-toast = 已成功重新命名工作區! -zen-library-sidebar-workspaces = +zen-library-sidebar-workspaces = .label = 工作區 -zen-library-sidebar-mods = +zen-library-sidebar-mods = .label = 模組 # note: Do not translate the "
" tags in the following string zen-learn-more-text = 瞭解更多 zen-close-label = 關閉 -zen-singletoolbar-urlbar-placeholder-with-name = +zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = 搜尋... -zen-icons-picker-emoji = +zen-icons-picker-emoji = .label = 表情符號 -zen-icons-picker-svg = +zen-icons-picker-svg = .label = 圖示 urlbar-search-mode-zen_actions = 操作 diff --git a/prefs/zen.yaml b/prefs/zen.yaml index 71744da42..469622931 100644 --- a/prefs/zen.yaml +++ b/prefs/zen.yaml @@ -11,6 +11,9 @@ - name: zen.tabs.rename-tabs value: true +- name: zen.tabs.essentials.max + value: 12 + - name: zen.tabs.show-newtab-vertical value: true diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index f6e7b44f5..a33df17d0 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -38,6 +38,12 @@ 'zen.pinned-tab-manager.close-shortcut-behavior', 'switch' ); + XPCOMUtils.defineLazyPreferenceGetter( + lazy, + 'zenTabsEssentialsMax', + 'zen.tabs.essentials.max', + 12 + ); ChromeUtils.defineESModuleGetters(lazy, { E10SUtils: 'resource://gre/modules/E10SUtils.sys.mjs', }); @@ -68,8 +74,6 @@ } class nsZenPinnedTabManager extends nsZenDOMOperatedFeature { - MAX_ESSENTIALS_TABS = 12; - hasInitializedPins = false; promiseInitializedPinned = new Promise((resolve) => { this._resolvePinnedInitializedInternal = resolve; @@ -140,6 +144,10 @@ return !gZenWorkspaces.privateWindowOrDisabled; } + get maxEssentialTabs() { + return lazy.zenTabsEssentialsMax; + } + async refreshPinnedTabs({ init = false } = {}) { if (!this.enabled) { return; @@ -1055,7 +1063,7 @@ const element = window.MozXULElement.parseXULToFragment(`