From ef259f58aa1836c6d8428ff1229f774f5c44c6b8 Mon Sep 17 00:00:00 2001
From: Andrey Bochkarev <50177704+octaviusz@users.noreply.github.com>
Date: Mon, 18 May 2026 23:26:49 +0300
Subject: [PATCH 01/31] no-bug: Fix cyclic workspace switching (gh-13743)
---
src/zen/drag-and-drop/ZenDragAndDrop.js | 2 +-
src/zen/spaces/ZenSpaceManager.mjs | 55 ++++++++++++++++++-------
src/zen/spaces/zen-workspaces.css | 2 +
3 files changed, 42 insertions(+), 17 deletions(-)
diff --git a/src/zen/drag-and-drop/ZenDragAndDrop.js b/src/zen/drag-and-drop/ZenDragAndDrop.js
index 360e8f75f..0c9d9d427 100644
--- a/src/zen/drag-and-drop/ZenDragAndDrop.js
+++ b/src/zen/drag-and-drop/ZenDragAndDrop.js
@@ -725,7 +725,7 @@
.changeWorkspaceShortcut(
isNearLeftEdge ? -1 : 1,
false,
- /* Disable wrapping */ true
+ /* Disable wrapping */ false
)
.then(spaceChanged => {
this.#onSpaceChanged(spaceChanged, dt);
diff --git a/src/zen/spaces/ZenSpaceManager.mjs b/src/zen/spaces/ZenSpaceManager.mjs
index 725d652bb..a16f88711 100644
--- a/src/zen/spaces/ZenSpaceManager.mjs
+++ b/src/zen/spaces/ZenSpaceManager.mjs
@@ -1741,13 +1741,26 @@ class nsZenWorkspaces {
const otherContainersEssentials = document.querySelectorAll(
`#zen-essentials .zen-workspace-tabs-section`
);
+ let nextSpaceIdx;
+ const spaceLen = workspaces.length;
+ if (offsetPixels > 0) {
+ nextSpaceIdx = (workspaceIndex - 1 + spaceLen) % spaceLen;
+ } else if (offsetPixels < 0) {
+ nextSpaceIdx = (workspaceIndex + 1) % spaceLen;
+ } else {
+ nextSpaceIdx = workspaceIndex;
+ }
const workspaceContextId = workspace.containerTabId;
- const nextWorkspaceContextId =
- workspaces[workspaceIndex + (offsetPixels > 0 ? -1 : 1)]?.containerTabId;
+ const nextWorkspaceContextId = workspaces[nextSpaceIdx]?.containerTabId;
for (const otherWorkspace of workspaces) {
const element = this.workspaceElement(otherWorkspace.uuid);
- const newTransform =
- -(workspaceIndex - workspaces.indexOf(otherWorkspace)) * 100;
+ let diff = workspaces.indexOf(otherWorkspace) - workspaceIndex;
+ if (diff > Math.floor(spaceLen / 2)) {
+ diff -= spaceLen;
+ } else if (diff < -Math.floor(spaceLen / 2)) {
+ diff += spaceLen;
+ }
+ const newTransform = diff * 100;
element.style.transform = `translateX(${newTransform + offsetPixels / 2}%)`;
}
// Hide other essentials with different containerTabId
@@ -1781,8 +1794,7 @@ class nsZenWorkspaces {
}
if (offsetPixels) {
// Find the next workspace we are scrolling to
- const nextWorkspace =
- workspaces[workspaceIndex + (offsetPixels > 0 ? -1 : 1)];
+ const nextWorkspace = workspaces[nextSpaceIdx];
if (nextWorkspace) {
const {
gradient: nextGradient,
@@ -1892,10 +1904,17 @@ class nsZenWorkspaces {
this._animatingChange = true;
const animations = [];
const workspaces = this.getWorkspaces();
+ const spaceLen = workspaces.length;
const newWorkspaceIndex = workspaces.findIndex(
w => w.uuid === newWorkspace.uuid
);
- const isGoingLeft = newWorkspaceIndex <= previousWorkspaceIndex;
+ let diff = newWorkspaceIndex - previousWorkspaceIndex;
+ if (diff > Math.floor(spaceLen / 2)) {
+ diff -= spaceLen;
+ } else if (diff < -Math.floor(spaceLen / 2)) {
+ diff += spaceLen;
+ }
+ const isGoingLeft = diff < 0;
const clonedEssentials = [];
if (shouldAnimate && this.shouldAnimateEssentials && previousWorkspace) {
for (const workspace of workspaces) {
@@ -1974,19 +1993,23 @@ class nsZenWorkspaces {
const elementWorkspaceIndex = workspaces.findIndex(
w => w.uuid === elementWorkspaceId
);
- const offset = -(newWorkspaceIndex - elementWorkspaceIndex) * 100;
+ let offset = elementWorkspaceIndex - newWorkspaceIndex;
+ if (offset > Math.floor(spaceLen / 2)) {
+ offset -= spaceLen;
+ } else if (offset < -Math.floor(spaceLen / 2)) {
+ offset += spaceLen;
+ }
+ offset = offset * 100;
const newTransform = `translateX(${offset}%)`;
// Only animate the workspace that is coming in, to avoid having multiple workspaces
// animating off-screen at the same time which can cause performance issues. With an off
// set of 1 or -1, so we animate the current workspace and the next one.
- const goingLeft = newWorkspaceIndex < previousWorkspaceIndex;
- const willBeVisible =
- (goingLeft &&
- elementWorkspaceIndex >= newWorkspaceIndex &&
- elementWorkspaceIndex <= previousWorkspaceIndex) ||
- (!goingLeft &&
- elementWorkspaceIndex <= newWorkspaceIndex &&
- elementWorkspaceIndex >= previousWorkspaceIndex);
+ const totalDistance = Math.abs(diff);
+ const distanceToElement = isGoingLeft
+ ? (previousWorkspaceIndex - elementWorkspaceIndex + spaceLen) % spaceLen
+ : (elementWorkspaceIndex - previousWorkspaceIndex + spaceLen) %
+ spaceLen;
+ const willBeVisible = distanceToElement <= totalDistance;
if (shouldAnimate) {
if (!willBeVisible) {
element.style.transform = newTransform;
diff --git a/src/zen/spaces/zen-workspaces.css b/src/zen/spaces/zen-workspaces.css
index 97c0d89be..f2260e55e 100644
--- a/src/zen/spaces/zen-workspaces.css
+++ b/src/zen/spaces/zen-workspaces.css
@@ -314,6 +314,8 @@
/* mark: workspace element */
zen-workspace {
+ --toolbar-color: var(--toolbox-textcolor) !important;
+
flex-direction: column;
width: calc(100% + var(--zen-toolbox-padding) * 2);
position: absolute;
From 1b9408ecb0e69eba6653ef55d529ca4c5b10b69b Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Tue, 19 May 2026 23:58:00 +0200
Subject: [PATCH 02/31] no-bug: Add polish to finished boosts implementation
(gh-13762)
Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
---
package.json | 1 +
prefs/zen/boosts.yaml | 2 +-
src/browser/themes/shared/zen-icons/icons.css | 6 +-
.../themes/shared/zen-icons/jar.inc.mn | 37 ++--
.../themes/shared/zen-icons/nucleo/dice.svg | 5 +
src/gfx/layers/AnimationInfo-cpp.patch | 16 +-
src/layout/style/StyleColor-cpp.patch | 22 +--
src/zen/boosts/ZenBoostsManager.sys.mjs | 6 +
src/zen/boosts/ZenZapOverlayChild.sys.mjs | 13 +-
src/zen/boosts/actors/ZenBoostsChild.sys.mjs | 12 +-
.../boosts/gtest/TestZenBoostsColorFilter.cpp | 121 ++++++++++++
src/zen/boosts/gtest/moz.build | 9 +
src/zen/boosts/moz.build | 4 +
src/zen/boosts/nsZenBCOverrides.cpp | 2 +-
src/zen/boosts/nsZenBoostsBackend.cpp | 180 ++++++++++++------
src/zen/boosts/nsZenBoostsBackend.h | 58 ++++--
src/zen/tests/boosts/browser.toml | 1 +
.../boosts/browser_boost_selector_escaping.js | 94 +++++++++
18 files changed, 465 insertions(+), 124 deletions(-)
create mode 100644 src/browser/themes/shared/zen-icons/nucleo/dice.svg
create mode 100644 src/zen/boosts/gtest/TestZenBoostsColorFilter.cpp
create mode 100644 src/zen/boosts/gtest/moz.build
create mode 100644 src/zen/tests/boosts/browser_boost_selector_escaping.js
diff --git a/package.json b/package.json
index 0ebf49c20..6e7fd8fd0 100644
--- a/package.json
+++ b/package.json
@@ -28,6 +28,7 @@
"surfer": "surfer",
"test": "python3 scripts/run_tests.py",
"test:dbg": "python3 scripts/run_tests.py --jsdebugger --debug-on-failure",
+ "test:gtest": "cd engine && ./mach gtest",
"ffprefs": "cd tools/ffprefs && cargo run --bin ffprefs -- ../../",
"lc": "surfer license-check",
"lc:fix": "surfer license-check --fix",
diff --git a/prefs/zen/boosts.yaml b/prefs/zen/boosts.yaml
index b0de3d3fa..b9ab5b473 100644
--- a/prefs/zen/boosts.yaml
+++ b/prefs/zen/boosts.yaml
@@ -3,7 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
- name: zen.boosts.enabled
- value: "@IS_TWILIGHT@"
+ value: true
- name: zen.boosts.dissolve-on-zap
value: true
diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css
index 1f7779e35..cb1b6f892 100644
--- a/src/browser/themes/shared/zen-icons/icons.css
+++ b/src/browser/themes/shared/zen-icons/icons.css
@@ -924,7 +924,7 @@
position: relative;
- list-style-image: url("paintbrush.svg");
+ list-style-image: url("boost.svg");
& .toolbarbutton-text {
display: none;
@@ -937,6 +937,8 @@
& image {
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
+ width: 14px;
+ fill-opacity: 0.7;
}
}
@@ -1066,7 +1068,7 @@
}
#zen-boost-shuffle {
- list-style-image: url("arrow-rotate-anticlockwise.svg");
+ list-style-image: url("dice.svg");
}
#zen-boost-css-picker {
diff --git a/src/browser/themes/shared/zen-icons/jar.inc.mn b/src/browser/themes/shared/zen-icons/jar.inc.mn
index be1479dcf..b252b3f52 100644
--- a/src/browser/themes/shared/zen-icons/jar.inc.mn
+++ b/src/browser/themes/shared/zen-icons/jar.inc.mn
@@ -13,13 +13,13 @@
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
+* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
* skin/classic/browser/zen-icons/bookmark.svg (../shared/zen-icons/nucleo/bookmark.svg)
* skin/classic/browser/zen-icons/boost.svg (../shared/zen-icons/nucleo/boost.svg)
-* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/brackets-curly.svg (../shared/zen-icons/nucleo/brackets-curly.svg)
* skin/classic/browser/zen-icons/camera-blocked.svg (../shared/zen-icons/nucleo/camera-blocked.svg)
* skin/classic/browser/zen-icons/camera-fill.svg (../shared/zen-icons/nucleo/camera-fill.svg)
@@ -37,6 +37,7 @@
* skin/classic/browser/zen-icons/desktop-notification-fill.svg (../shared/zen-icons/nucleo/desktop-notification-fill.svg)
* skin/classic/browser/zen-icons/desktop-notification.svg (../shared/zen-icons/nucleo/desktop-notification.svg)
* skin/classic/browser/zen-icons/developer.svg (../shared/zen-icons/nucleo/developer.svg)
+* skin/classic/browser/zen-icons/dice.svg (../shared/zen-icons/nucleo/dice.svg)
* skin/classic/browser/zen-icons/downloads.svg (../shared/zen-icons/nucleo/downloads.svg)
* skin/classic/browser/zen-icons/drag-indicator.svg (../shared/zen-icons/nucleo/drag-indicator.svg)
* skin/classic/browser/zen-icons/duplicate-tab.svg (../shared/zen-icons/nucleo/duplicate-tab.svg)
@@ -102,26 +103,26 @@
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
-* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
+* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
-* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
+* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
-* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
+* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
-* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
+* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
@@ -161,13 +162,13 @@
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
+* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
* skin/classic/browser/zen-icons/bookmark.svg (../shared/zen-icons/nucleo/bookmark.svg)
* skin/classic/browser/zen-icons/boost.svg (../shared/zen-icons/nucleo/boost.svg)
-* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/brackets-curly.svg (../shared/zen-icons/nucleo/brackets-curly.svg)
* skin/classic/browser/zen-icons/camera-blocked.svg (../shared/zen-icons/nucleo/camera-blocked.svg)
* skin/classic/browser/zen-icons/camera-fill.svg (../shared/zen-icons/nucleo/camera-fill.svg)
@@ -185,6 +186,7 @@
* skin/classic/browser/zen-icons/desktop-notification-fill.svg (../shared/zen-icons/nucleo/desktop-notification-fill.svg)
* skin/classic/browser/zen-icons/desktop-notification.svg (../shared/zen-icons/nucleo/desktop-notification.svg)
* skin/classic/browser/zen-icons/developer.svg (../shared/zen-icons/nucleo/developer.svg)
+* skin/classic/browser/zen-icons/dice.svg (../shared/zen-icons/nucleo/dice.svg)
* skin/classic/browser/zen-icons/downloads.svg (../shared/zen-icons/nucleo/downloads.svg)
* skin/classic/browser/zen-icons/drag-indicator.svg (../shared/zen-icons/nucleo/drag-indicator.svg)
* skin/classic/browser/zen-icons/duplicate-tab.svg (../shared/zen-icons/nucleo/duplicate-tab.svg)
@@ -250,26 +252,26 @@
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
-* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
+* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
-* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
+* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
-* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
+* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
-* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
+* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
@@ -309,13 +311,13 @@
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
+* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
* skin/classic/browser/zen-icons/bookmark.svg (../shared/zen-icons/nucleo/bookmark.svg)
* skin/classic/browser/zen-icons/boost.svg (../shared/zen-icons/nucleo/boost.svg)
-* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/brackets-curly.svg (../shared/zen-icons/nucleo/brackets-curly.svg)
* skin/classic/browser/zen-icons/camera-blocked.svg (../shared/zen-icons/nucleo/camera-blocked.svg)
* skin/classic/browser/zen-icons/camera-fill.svg (../shared/zen-icons/nucleo/camera-fill.svg)
@@ -333,6 +335,7 @@
* skin/classic/browser/zen-icons/desktop-notification-fill.svg (../shared/zen-icons/nucleo/desktop-notification-fill.svg)
* skin/classic/browser/zen-icons/desktop-notification.svg (../shared/zen-icons/nucleo/desktop-notification.svg)
* skin/classic/browser/zen-icons/developer.svg (../shared/zen-icons/nucleo/developer.svg)
+* skin/classic/browser/zen-icons/dice.svg (../shared/zen-icons/nucleo/dice.svg)
* skin/classic/browser/zen-icons/downloads.svg (../shared/zen-icons/nucleo/downloads.svg)
* skin/classic/browser/zen-icons/drag-indicator.svg (../shared/zen-icons/nucleo/drag-indicator.svg)
* skin/classic/browser/zen-icons/duplicate-tab.svg (../shared/zen-icons/nucleo/duplicate-tab.svg)
@@ -398,26 +401,26 @@
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
-* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
+* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
-* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
+* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
-* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
+* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
-* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
+* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
@@ -453,8 +456,8 @@
* skin/classic/browser/zen-icons/selectable/basket.svg (../shared/zen-icons/common/selectable/basket.svg)
* skin/classic/browser/zen-icons/selectable/bed.svg (../shared/zen-icons/common/selectable/bed.svg)
* skin/classic/browser/zen-icons/selectable/bell.svg (../shared/zen-icons/common/selectable/bell.svg)
-* skin/classic/browser/zen-icons/selectable/book.svg (../shared/zen-icons/common/selectable/book.svg)
* skin/classic/browser/zen-icons/selectable/bookmark.svg (../shared/zen-icons/common/selectable/bookmark.svg)
+* skin/classic/browser/zen-icons/selectable/book.svg (../shared/zen-icons/common/selectable/book.svg)
* skin/classic/browser/zen-icons/selectable/briefcase.svg (../shared/zen-icons/common/selectable/briefcase.svg)
* skin/classic/browser/zen-icons/selectable/brush.svg (../shared/zen-icons/common/selectable/brush.svg)
* skin/classic/browser/zen-icons/selectable/bug.svg (../shared/zen-icons/common/selectable/bug.svg)
@@ -516,8 +519,8 @@
* skin/classic/browser/zen-icons/selectable/shapes.svg (../shared/zen-icons/common/selectable/shapes.svg)
* skin/classic/browser/zen-icons/selectable/shirt.svg (../shared/zen-icons/common/selectable/shirt.svg)
* skin/classic/browser/zen-icons/selectable/skull.svg (../shared/zen-icons/common/selectable/skull.svg)
-* skin/classic/browser/zen-icons/selectable/square.svg (../shared/zen-icons/common/selectable/square.svg)
* skin/classic/browser/zen-icons/selectable/squares.svg (../shared/zen-icons/common/selectable/squares.svg)
+* skin/classic/browser/zen-icons/selectable/square.svg (../shared/zen-icons/common/selectable/square.svg)
* skin/classic/browser/zen-icons/selectable/star-1.svg (../shared/zen-icons/common/selectable/star-1.svg)
* skin/classic/browser/zen-icons/selectable/star.svg (../shared/zen-icons/common/selectable/star.svg)
* skin/classic/browser/zen-icons/selectable/stats-chart.svg (../shared/zen-icons/common/selectable/stats-chart.svg)
diff --git a/src/browser/themes/shared/zen-icons/nucleo/dice.svg b/src/browser/themes/shared/zen-icons/nucleo/dice.svg
new file mode 100644
index 000000000..7a6197e79
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/nucleo/dice.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/gfx/layers/AnimationInfo-cpp.patch b/src/gfx/layers/AnimationInfo-cpp.patch
index e9779a101..aa58cdcbc 100644
--- a/src/gfx/layers/AnimationInfo-cpp.patch
+++ b/src/gfx/layers/AnimationInfo-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/gfx/layers/AnimationInfo.cpp b/gfx/layers/AnimationInfo.cpp
-index 1d330056bd7a4e89aac5e5296a3c164fb42b5c42..ef112715580b6bb7238e8f37bbe3133e187685dc 100644
+index 1d330056bd7a4e89aac5e5296a3c164fb42b5c42..38bfbcfcaf0c791ee817aafbd24b1cad67974e62 100644
--- a/gfx/layers/AnimationInfo.cpp
+++ b/gfx/layers/AnimationInfo.cpp
@@ -14,6 +14,7 @@
@@ -10,12 +10,22 @@ index 1d330056bd7a4e89aac5e5296a3c164fb42b5c42..ef112715580b6bb7238e8f37bbe3133e
#include "nsIContent.h"
#include "nsLayoutUtils.h"
#include "nsRefreshDriver.h"
-@@ -343,7 +344,7 @@ static void SetAnimatable(NonCustomCSSPropertyId aProperty,
+@@ -343,7 +344,17 @@ static void SetAnimatable(NonCustomCSSPropertyId aProperty,
// resolve currentColor at this moment.
nscolor foreground =
aFrame->Style()->GetVisitedDependentColor(&nsStyleText::mColor);
- aAnimatable = aAnimationValue.GetColor(foreground);
-+ aAnimatable = zen::nsZenBoostsBackend::FilterColorFromPresContext(aAnimationValue.GetColor(foreground), aFrame->PresContext());
++ nscolor resolved = aAnimationValue.GetColor(foreground);
++ // |foreground| is already boost-resolved through
++ // StyleAbsoluteColor::ToColor, so a currentColor keyframe is already
++ // filtered; only absolute keyframe colors still need the boost applied
++ // here, exactly once, so the composited transition endpoint matches the
++ // resting/static paint and doesn't snap when the transition ends.
++ aAnimatable =
++ aAnimationValue.IsCurrentColor()
++ ? resolved
++ : zen::nsZenBoostsBackend::FilterColorFromPresContext(
++ resolved, aFrame->PresContext());
break;
}
case eCSSProperty_opacity:
diff --git a/src/layout/style/StyleColor-cpp.patch b/src/layout/style/StyleColor-cpp.patch
index 6f84f6327..ef81c99dc 100644
--- a/src/layout/style/StyleColor-cpp.patch
+++ b/src/layout/style/StyleColor-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/layout/style/StyleColor.cpp b/layout/style/StyleColor.cpp
-index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..8dbfbb846b786d51af288989163aacfae12e787c 100644
+index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..3b2118e224141f5151a31ac663dfbe17864ef182 100644
--- a/layout/style/StyleColor.cpp
+++ b/layout/style/StyleColor.cpp
@@ -8,6 +8,7 @@
@@ -10,25 +10,7 @@ index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..8dbfbb846b786d51af288989163aacfa
namespace mozilla {
-@@ -21,6 +22,8 @@ bool StyleColor::MaybeTransparent() const {
- template <>
- StyleAbsoluteColor StyleColor::ResolveColor(
- const StyleAbsoluteColor& aForegroundColor) const {
-+ auto ResolveColorInner = [this,
-+ &aForegroundColor]() -> StyleAbsoluteColor {
- if (IsAbsolute()) {
- return AsAbsolute();
- }
-@@ -30,6 +33,8 @@ StyleAbsoluteColor StyleColor::ResolveColor(
- }
-
- return Servo_ResolveColor(this, &aForegroundColor);
-+ };
-+ return zen::nsZenBoostsBackend::ResolveStyleColor(ResolveColorInner());
- }
-
- template <>
-@@ -68,10 +73,11 @@ nscolor StyleAbsoluteColor::ToColor() const {
+@@ -68,10 +69,11 @@ nscolor StyleAbsoluteColor::ToColor() const {
auto green = std::clamp(srgb.components._1, 0.0f, 1.0f);
auto blue = std::clamp(srgb.components._2, 0.0f, 1.0f);
diff --git a/src/zen/boosts/ZenBoostsManager.sys.mjs b/src/zen/boosts/ZenBoostsManager.sys.mjs
index 67abb7bc4..0525b5378 100644
--- a/src/zen/boosts/ZenBoostsManager.sys.mjs
+++ b/src/zen/boosts/ZenBoostsManager.sys.mjs
@@ -539,6 +539,12 @@ class nsZenBoostsManager {
const directoryPath = this.#cssPath;
const savePath = PathUtils.join(directoryPath, fileName);
+ if (!css || css.trim() === "") {
+ if (await IOUtils.exists(savePath)) {
+ await IOUtils.remove(savePath);
+ }
+ return;
+ }
await IOUtils.makeDirectory(directoryPath, { createAncestors: true });
await IOUtils.writeUTF8(savePath, css);
}
diff --git a/src/zen/boosts/ZenZapOverlayChild.sys.mjs b/src/zen/boosts/ZenZapOverlayChild.sys.mjs
index df7c10cc0..7b8b4ed35 100644
--- a/src/zen/boosts/ZenZapOverlayChild.sys.mjs
+++ b/src/zen/boosts/ZenZapOverlayChild.sys.mjs
@@ -26,6 +26,7 @@ export class ZapOverlay {
#dissolvePoolSize = 5;
#dissolveEffectPool = [];
#currentDissolveIndex = 0;
+ #onZapDoneClick = null;
/**
* @param {*} document Webpage document
@@ -77,10 +78,8 @@ export class ZapOverlay {
*/
#initializeElements() {
this.zapDoneButton = this.getElementById("zap-done");
- this.zapDoneButton.addEventListener(
- "click",
- this.#disableZapMode.bind(this)
- );
+ this.#onZapDoneClick = this.#disableZapMode.bind(this);
+ this.zapDoneButton.addEventListener("click", this.#onZapDoneClick);
this.#updateZappedList();
}
@@ -355,6 +354,12 @@ export class ZapOverlay {
dissolve.tearDown();
});
+ if (this.zapDoneButton && this.#onZapDoneClick) {
+ this.zapDoneButton.removeEventListener("click", this.#onZapDoneClick);
+ }
+ this.#onZapDoneClick = null;
+ this.zapDoneButton = null;
+
if (this.#content) {
try {
this.document.removeAnonymousContent(this.#content);
diff --git a/src/zen/boosts/actors/ZenBoostsChild.sys.mjs b/src/zen/boosts/actors/ZenBoostsChild.sys.mjs
index 1ea6b1e60..78260f30a 100644
--- a/src/zen/boosts/actors/ZenBoostsChild.sys.mjs
+++ b/src/zen/boosts/actors/ZenBoostsChild.sys.mjs
@@ -322,13 +322,18 @@ export class ZenBoostsChild extends JSWindowActorChild {
return p;
}
+ get #hostWithoutPort() {
+ const host = this.browsingContext.topWindow?.location.host;
+ return host?.split(":")[0];
+ }
+
/**
* Aquires the boost data for this website
*
* @returns {object} Boost data for the current website
*/
getWebsiteBoost() {
- const domain = this.browsingContext.topWindow?.location?.host;
+ const domain = this.#hostWithoutPort;
if (!domain) {
return null;
}
@@ -362,6 +367,7 @@ export class ZenBoostsChild extends JSWindowActorChild {
this.#loadStyleSheet(boost.styleSheet);
}
+ browsingContext.fullZoom = boostData.sizeOverride;
browsingContext.isZenBoostsInverted = boostData.smartInvert;
if (boostData.enableColorBoost) {
let primaryColor;
@@ -484,7 +490,7 @@ export class ZenBoostsChild extends JSWindowActorChild {
}
addZapSelector(selector) {
- const domain = this.browsingContext.topWindow?.location?.host;
+ const domain = this.#hostWithoutPort;
this.sendQuery("ZenBoost:ZapSelector", {
action: "add",
selector,
@@ -493,7 +499,7 @@ export class ZenBoostsChild extends JSWindowActorChild {
}
removeZapSelector(selector) {
- const domain = this.browsingContext.topWindow?.location?.host;
+ const domain = this.#hostWithoutPort;
this.sendQuery("ZenBoost:ZapSelector", {
action: "remove",
selector,
diff --git a/src/zen/boosts/gtest/TestZenBoostsColorFilter.cpp b/src/zen/boosts/gtest/TestZenBoostsColorFilter.cpp
new file mode 100644
index 000000000..e378451d0
--- /dev/null
+++ b/src/zen/boosts/gtest/TestZenBoostsColorFilter.cpp
@@ -0,0 +1,121 @@
+/* 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/. */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/nsZenBoostsBackend.h"
+
+using zen::detail::FilterColorChannel;
+using zen::detail::InvertColorChannel;
+using zen::detail::PrecomputeAccent;
+using zen::detail::RotateAccent;
+
+namespace {
+
+// A spread of representative input colors (opaque unless noted).
+const nscolor kColors[] = {
+ NS_RGBA(255, 0, 0, 255), // pure red
+ NS_RGBA(0, 255, 0, 255), // pure green
+ NS_RGBA(0, 0, 255, 255), // pure blue
+ NS_RGBA(0, 0, 0, 255), // black
+ NS_RGBA(255, 255, 255, 255), // white
+ NS_RGBA(128, 128, 128, 255), // mid gray
+ NS_RGBA(18, 52, 86, 200), // arbitrary, semi-transparent
+ NS_RGBA(240, 17, 99, 1), // near-min alpha
+};
+
+// The accent stores the contrast/strength in its alpha byte
+// (NS_GET_CONTRAST == NS_GET_A). 0 means "no tint".
+zen::nsZenAccentOklab MakeAccent(uint8_t r, uint8_t g, uint8_t b,
+ uint8_t contrast) {
+ return PrecomputeAccent(NS_RGBA(r, g, b, contrast));
+}
+
+} // namespace
+
+// The headline invariant: filtering must never change opacity. The whole
+// pipeline overloads the alpha byte for contrast on the *accent*, but a
+// filtered *content* color must keep its original alpha.
+TEST(ZenBoostsColorFilter, PreservesAlpha)
+{
+ const zen::nsZenAccentOklab accent = MakeAccent(80, 120, 200, 180);
+ const zen::nsZenAccentOklab complementary = RotateAccent(accent, 180.0f);
+
+ for (nscolor c : kColors) {
+ const nscolor out = FilterColorChannel(c, accent, complementary);
+ EXPECT_EQ(NS_GET_A(out), NS_GET_A(c)) << "alpha changed for input " << c;
+ }
+}
+
+// Fully transparent colors are invisible; the filter must pass them through
+// untouched (and must not interpret their zero alpha as contrast).
+TEST(ZenBoostsColorFilter, TransparentPassthrough)
+{
+ const zen::nsZenAccentOklab accent = MakeAccent(80, 120, 200, 180);
+ const zen::nsZenAccentOklab complementary = RotateAccent(accent, 90.0f);
+
+ const nscolor transparent = NS_RGBA(255, 0, 0, 0);
+ EXPECT_EQ(FilterColorChannel(transparent, accent, complementary),
+ transparent);
+ EXPECT_EQ(InvertColorChannel(transparent), transparent);
+}
+
+// Same inputs must always yield the same output (no hidden global state in
+// the math itself; the production cache lives outside these primitives).
+TEST(ZenBoostsColorFilter, Deterministic)
+{
+ const zen::nsZenAccentOklab accent = MakeAccent(33, 200, 90, 200);
+ const zen::nsZenAccentOklab complementary = RotateAccent(accent, 200.0f);
+
+ for (nscolor c : kColors) {
+ const nscolor a = FilterColorChannel(c, accent, complementary);
+ const nscolor b = FilterColorChannel(c, accent, complementary);
+ EXPECT_EQ(a, b);
+ EXPECT_EQ(InvertColorChannel(c), InvertColorChannel(c));
+ }
+}
+
+// A zero-contrast accent means "no boost strength": the color must come back
+// essentially unchanged (allow +/-1 per channel for sRGB<->Oklab rounding).
+TEST(ZenBoostsColorFilter, ZeroContrastIsNearIdentity)
+{
+ const zen::nsZenAccentOklab accent = MakeAccent(200, 50, 50, 0);
+ const zen::nsZenAccentOklab complementary = RotateAccent(accent, 180.0f);
+
+ for (nscolor c : kColors) {
+ if (NS_GET_A(c) == 0) {
+ continue;
+ }
+ const nscolor out = FilterColorChannel(c, accent, complementary);
+ EXPECT_NEAR(NS_GET_R(out), NS_GET_R(c), 1);
+ EXPECT_NEAR(NS_GET_G(out), NS_GET_G(c), 1);
+ EXPECT_NEAR(NS_GET_B(out), NS_GET_B(c), 1);
+ EXPECT_EQ(NS_GET_A(out), NS_GET_A(c));
+ }
+}
+
+// Guards against a regression that turns the filter into a no-op: a strong
+// accent applied to a neutral gray must actually move the color.
+TEST(ZenBoostsColorFilter, StrongAccentActuallyTints)
+{
+ const zen::nsZenAccentOklab accent = MakeAccent(20, 130, 240, 255);
+ const zen::nsZenAccentOklab complementary = RotateAccent(accent, 30.0f);
+
+ const nscolor gray = NS_RGBA(128, 128, 128, 255);
+ const nscolor out = FilterColorChannel(gray, accent, complementary);
+
+ const bool moved = NS_GET_R(out) != NS_GET_R(gray) ||
+ NS_GET_G(out) != NS_GET_G(gray) ||
+ NS_GET_B(out) != NS_GET_B(gray);
+ EXPECT_TRUE(moved) << "a full-strength accent should tint mid gray";
+ EXPECT_EQ(NS_GET_A(out), NS_GET_A(gray));
+}
+
+// Inversion must also preserve opacity.
+TEST(ZenBoostsColorFilter, InvertPreservesAlpha)
+{
+ for (nscolor c : kColors) {
+ EXPECT_EQ(NS_GET_A(InvertColorChannel(c)), NS_GET_A(c));
+ }
+}
diff --git a/src/zen/boosts/gtest/moz.build b/src/zen/boosts/gtest/moz.build
new file mode 100644
index 000000000..cc14100b7
--- /dev/null
+++ b/src/zen/boosts/gtest/moz.build
@@ -0,0 +1,9 @@
+# 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/.
+
+UNIFIED_SOURCES += [
+ "TestZenBoostsColorFilter.cpp",
+]
+
+FINAL_LIBRARY = "xul-gtest"
diff --git a/src/zen/boosts/moz.build b/src/zen/boosts/moz.build
index 211d68fc2..a436cf3de 100644
--- a/src/zen/boosts/moz.build
+++ b/src/zen/boosts/moz.build
@@ -26,3 +26,7 @@ SOURCES += [
]
FINAL_LIBRARY = "xul"
+
+TEST_DIRS += [
+ "gtest",
+]
diff --git a/src/zen/boosts/nsZenBCOverrides.cpp b/src/zen/boosts/nsZenBCOverrides.cpp
index 0be59563e..306d35bf7 100644
--- a/src/zen/boosts/nsZenBCOverrides.cpp
+++ b/src/zen/boosts/nsZenBCOverrides.cpp
@@ -43,7 +43,7 @@ static void RefreshBoostCacheIfMatchesCurrent(BrowsingContext* aChanged) {
if (!backend) {
return;
}
- auto current = backend->GetCurrentBrowsingContext();
+ RefPtr current = backend->GetCurrentBrowsingContext();
if (!current || current->Top() != aChanged) {
return;
}
diff --git a/src/zen/boosts/nsZenBoostsBackend.cpp b/src/zen/boosts/nsZenBoostsBackend.cpp
index 1968c6ad1..1a54b0264 100644
--- a/src/zen/boosts/nsZenBoostsBackend.cpp
+++ b/src/zen/boosts/nsZenBoostsBackend.cpp
@@ -4,7 +4,9 @@
#include
#include
+#include
#include
+#include
#include "nsZenBoostsBackend.h"
@@ -48,10 +50,6 @@ namespace zen {
NS_IMPL_ISUPPORTS0(nsZenBoostsBackend)
-nsZenAccentOklab nsZenBoostsBackend::mCachedAccent{0};
-nsZenAccentOklab nsZenBoostsBackend::mCachedComplementary{0};
-float nsZenBoostsBackend::mCachedComplementaryRotationDeg = 0.0f;
-
namespace {
/**
@@ -83,17 +81,43 @@ static inline float linearToSrgb(float c) {
static inline float fastCbrt(float x) {
if (x == 0.0f) return 0.0f;
float a = std::abs(x);
- union {
- float f;
- uint32_t i;
- } u = {a};
- u.i = u.i / 3 + 0x2a504a2e;
- float y = u.f;
+ // Bit-level initial guess. Use memcpy rather than a union to avoid the
+ // undefined behaviour of type-punning through a union member in C++.
+ uint32_t i;
+ std::memcpy(&i, &a, sizeof(i));
+ i = i / 3 + 0x2a504a2e;
+ float y;
+ std::memcpy(&y, &i, sizeof(y));
y = (2.0f * y + a / (y * y)) * (1.0f / 3.0f);
y = (2.0f * y + a / (y * y)) * (1.0f / 3.0f);
return x < 0.0f ? -y : y;
}
+/**
+ * @brief sRGB(0..255) -> linear lookup table. The filter only ever feeds
+ * integer 8-bit channels through srgbToLinear, so the 256 possible results
+ * are precomputed once instead of calling std::pow three times per color on
+ * the per-color hot path. Built lazily on first use; the function-local
+ * static makes initialization thread-safe.
+ */
+static inline const std::array& SrgbLinearTable() {
+ static const std::array kTable = [] {
+ std::array table{};
+ for (int i = 0; i < 256; ++i) {
+ table[i] = srgbToLinear(i * (1.0f / 255.0f));
+ }
+ return table;
+ }();
+ return kTable;
+}
+
+/**
+ * @brief Linearizes an 8-bit sRGB channel via the precomputed table.
+ */
+static inline float srgbToLinear8(uint8_t aChannel) {
+ return SrgbLinearTable()[aChannel];
+}
+
/**
* @brief Precomputes the Oklab values for a given accent color. This allows us
* to efficiently apply the accent color as a filter to other colors without
@@ -107,13 +131,9 @@ ZEN_HOT_FUNCTION
inline static auto zenPrecomputeAccent(nscolor aAccentColor) {
constexpr float inv255 = 1.0f / 255.0f;
- const float r = NS_GET_R(aAccentColor) * inv255;
- const float g = NS_GET_G(aAccentColor) * inv255;
- const float b = NS_GET_B(aAccentColor) * inv255;
-
- const float lr = srgbToLinear(r);
- const float lg = srgbToLinear(g);
- const float lb = srgbToLinear(b);
+ const float lr = srgbToLinear8(NS_GET_R(aAccentColor));
+ const float lg = srgbToLinear8(NS_GET_G(aAccentColor));
+ const float lb = srgbToLinear8(NS_GET_B(aAccentColor));
const float l_ =
fastCbrt(0.4122214708f * lr + 0.5363325363f * lg + 0.0514459929f * lb);
@@ -156,6 +176,45 @@ inline static nsZenAccentOklab zenRotateAccent(const nsZenAccentOklab& aBase,
};
}
+/**
+ * @brief Small round-robin cache of precomputed accents. Painting several
+ * boosted tabs with different accents interleaved would otherwise recompute
+ * the Oklab base accent (with cbrt) and the rotated complementary accent on
+ * every single color. Keyed by the accent nscolor and the complementary hue
+ * rotation. Main-thread only (same threading assumption as the per-color
+ * paint path it serves).
+ */
+struct AccentCacheEntry {
+ nscolor accentNS = 0;
+ float rotationDeg = 0.0f;
+ bool valid = false;
+ nsZenAccentOklab accent{};
+ nsZenAccentOklab complementary{};
+};
+
+static constexpr size_t kAccentCacheSize = 4;
+static AccentCacheEntry sAccentCache[kAccentCacheSize];
+static size_t sAccentCacheNext = 0;
+
+ZEN_HOT_FUNCTION
+static const AccentCacheEntry& GetCachedAccent(nscolor aAccentNS,
+ float aRotationDeg) {
+ for (const auto& entry : sAccentCache) {
+ if (entry.valid && entry.accentNS == aAccentNS &&
+ entry.rotationDeg == aRotationDeg) {
+ return entry;
+ }
+ }
+ AccentCacheEntry& slot = sAccentCache[sAccentCacheNext];
+ sAccentCacheNext = (sAccentCacheNext + 1) % kAccentCacheSize;
+ slot.accentNS = aAccentNS;
+ slot.rotationDeg = aRotationDeg;
+ slot.accent = zenPrecomputeAccent(aAccentNS);
+ slot.complementary = zenRotateAccent(slot.accent, aRotationDeg);
+ slot.valid = true;
+ return slot;
+}
+
/**
* @brief Applies a duotone color filter to transform an original color toward
* one of two accent colors. The original color's perceived lightness decides
@@ -183,10 +242,10 @@ inline static nsZenAccentOklab zenRotateAccent(const nsZenAccentOklab& aBase,
constexpr float inv255 = 1.0f / 255.0f;
const float blendFactor = contrast * inv255;
- // sRGB -> linear
- const float lr = srgbToLinear(NS_GET_R(aOriginalColor) * inv255);
- const float lg = srgbToLinear(NS_GET_G(aOriginalColor) * inv255);
- const float lb = srgbToLinear(NS_GET_B(aOriginalColor) * inv255);
+ // sRGB -> linear (8-bit channels via the precomputed table)
+ const float lr = srgbToLinear8(NS_GET_R(aOriginalColor));
+ const float lg = srgbToLinear8(NS_GET_G(aOriginalColor));
+ const float lb = srgbToLinear8(NS_GET_B(aOriginalColor));
// Linear RGB -> LMS -> cube root -> Oklab (fused)
const float l_ =
@@ -347,6 +406,32 @@ inline static void GetZenBoostsDataFromBrowsingContext(
} // namespace
+namespace detail {
+
+// Thin forwarders that give unit tests access to the pure color math without
+// pulling in the singleton / BrowsingContext. They are defined here, after the
+// anonymous namespace, so they can reach those file-local implementations.
+nsZenAccentOklab PrecomputeAccent(nscolor aAccentColor) {
+ return zenPrecomputeAccent(aAccentColor);
+}
+
+nsZenAccentOklab RotateAccent(const nsZenAccentOklab& aBase,
+ float aRotationDeg) {
+ return zenRotateAccent(aBase, aRotationDeg);
+}
+
+nscolor FilterColorChannel(nscolor aOriginalColor,
+ const nsZenAccentOklab& aAccent,
+ const nsZenAccentOklab& aComplementary) {
+ return zenFilterColorChannel(aOriginalColor, aAccent, aComplementary);
+}
+
+nscolor InvertColorChannel(nscolor aColor) {
+ return zenInvertColorChannel(aColor);
+}
+
+} // namespace detail
+
static mozilla::StaticRefPtr sZenBoostsBackend;
auto nsZenBoostsBackend::GetInstance() -> nsZenBoostsBackend* {
@@ -376,18 +461,25 @@ auto nsZenBoostsBackend::onPresShellEntered(mozilla::dom::Document* aDocument)
if (!browsingContext) {
return;
}
- mCurrentBrowsingContext = browsingContext;
+ mCurrentBrowsingContextId = browsingContext->Id();
RefreshCachedBoostState();
}
+already_AddRefed
+nsZenBoostsBackend::GetCurrentBrowsingContext() const {
+ return mozilla::dom::BrowsingContext::Get(mCurrentBrowsingContextId);
+}
+
auto nsZenBoostsBackend::RefreshCachedBoostState() -> void {
- if (!mCurrentBrowsingContext) {
+ RefPtr current =
+ mozilla::dom::BrowsingContext::Get(mCurrentBrowsingContextId);
+ if (!current) {
mCachedCurrentAccent = 0;
mCachedCurrentComplementaryRotation = 0.0f;
mCachedCurrentInverted = false;
return;
}
- auto top = mCurrentBrowsingContext->Top();
+ auto top = current->Top();
mCachedCurrentAccent = top->ZenBoostsData();
mCachedCurrentComplementaryRotation = top->ZenBoostsComplementaryRotation();
mCachedCurrentInverted = top->IsZenBoostsInverted();
@@ -397,33 +489,27 @@ auto nsZenBoostsBackend::RefreshCachedBoostState() -> void {
nsZenBoostsBackend::FilterColorFromPresContext(nscolor aColor,
nsPresContext* aPresContext)
-> nscolor {
+ if (NS_GET_A(aColor) == 0) {
+ // Skip processing fully transparent colors since they won't be visible and
+ // we want to avoid unnecessary computations. This also prevents issues with
+ // using the alpha channel for contrast information in the accent color.
+ return aColor;
+ }
ZenBoostData accentNS = 0;
float complementaryRotation = 0.0f;
bool invertColors = false;
GetZenBoostsDataFromBrowsingContext(&accentNS, &complementaryRotation,
&invertColors, aPresContext);
if (accentNS) {
- if (mCachedAccent.accentNS != accentNS) {
- mCachedAccent = zenPrecomputeAccent(accentNS);
- // Trigger a recompute of the complementary accent since
- // it depends on the base accent.
- mCachedComplementary.accentNS = 0;
- }
- // Derive the complementary accent by rotating the base accent's hue by the
- // boost's complementary rotation. Cached so the per-color hot path only
- // recomputes it when the base accent or rotation changes.
- if (mCachedComplementary.accentNS != accentNS ||
- mCachedComplementaryRotationDeg != complementaryRotation) {
- mCachedComplementary =
- zenRotateAccent(mCachedAccent, complementaryRotation);
- mCachedComplementaryRotationDeg = complementaryRotation;
- }
- // Apply a filter-like tint:
+ // Resolve (and cache) the base + complementary accent for this accent and
+ // complementary rotation. Apply a filter-like tint:
// - Preserve the original color's perceived luminance
// - Map hue/chroma toward the base or complementary accent depending on
// the original color's lightness
// - Keep the original alpha
- aColor = zenFilterColorChannel(aColor, mCachedAccent, mCachedComplementary);
+ const AccentCacheEntry& cached =
+ GetCachedAccent(accentNS, complementaryRotation);
+ aColor = zenFilterColorChannel(aColor, cached.accent, cached.complementary);
}
if (invertColors) {
aColor = zenInvertColorChannel(aColor);
@@ -431,20 +517,8 @@ nsZenBoostsBackend::FilterColorFromPresContext(nscolor aColor,
return aColor;
}
-[[nodiscard]] ZEN_HOT_FUNCTION auto nsZenBoostsBackend::ResolveStyleColor(
- mozilla::StyleAbsoluteColor aColor) -> mozilla::StyleAbsoluteColor {
- const auto resultColor = FilterColorFromPresContext(aColor.ToColor());
- return mozilla::StyleAbsoluteColor::FromColor(resultColor);
-}
-
[[nodiscard]] ZEN_HOT_FUNCTION auto nsZenBoostsBackend::ResolveStyleColor(
nscolor aColor) -> nscolor {
- if (NS_GET_A(aColor) == 0) {
- // Skip processing fully transparent colors since they won't be visible and
- // we want to avoid unnecessary computations. This also prevents issues with
- // using the alpha channel for contrast information in the accent color.
- return aColor;
- }
return FilterColorFromPresContext(aColor);
}
diff --git a/src/zen/boosts/nsZenBoostsBackend.h b/src/zen/boosts/nsZenBoostsBackend.h
index 67f3af6e8..81ca1d95b 100644
--- a/src/zen/boosts/nsZenBoostsBackend.h
+++ b/src/zen/boosts/nsZenBoostsBackend.h
@@ -10,6 +10,13 @@
#include "nsPresContext.h"
#include "mozilla/RefPtr.h"
+#include "mozilla/AlreadyAddRefed.h"
+
+#include
+
+namespace mozilla::dom {
+class BrowsingContext;
+}
#define ZEN_BOOSTS_BACKEND_CONTRACTID "@mozilla.org/zen/boosts-backend;1"
@@ -23,6 +30,19 @@ struct nsZenAccentOklab {
float contrastFactor;
};
+namespace detail {
+// Pure color-math primitives, exposed for unit testing. These have no
+// dependency on the singleton, the BrowsingContext, or the process type, so
+// they can be exercised directly from gtest.
+nsZenAccentOklab PrecomputeAccent(nscolor aAccentColor);
+nsZenAccentOklab RotateAccent(const nsZenAccentOklab& aBase,
+ float aRotationDeg);
+nscolor FilterColorChannel(nscolor aOriginalColor,
+ const nsZenAccentOklab& aAccent,
+ const nsZenAccentOklab& aComplementary);
+nscolor InvertColorChannel(nscolor aColor);
+} // namespace detail
+
class nsZenBoostsBackend final : public nsISupports {
public:
NS_DECL_ISUPPORTS
@@ -36,17 +56,15 @@ class nsZenBoostsBackend final : public nsISupports {
bool mCurrentFrameIsAnonymousContent = false;
/**
- * @brief Resolve a StyleAbsoluteColor to take into account Zen boosts.
+ * @brief Resolve a color to take into account Zen boosts. This is the single
+ * place style colors are filtered; it is reached for every style color via
+ * StyleAbsoluteColor::ToColor. Do not add a second StyleColor::ResolveColor
+ * filter on top of this or colors get filtered multiple times (which also
+ * makes resting colors disagree with composited transition endpoints).
* @param aColor The color to resolve.
* @return The resolved color with Zen boost filters applied, or the original
* color if no boost is active.
- * @see StyleColor::ResolveColor for reference.
- */
- static auto ResolveStyleColor(mozilla::StyleAbsoluteColor aColor)
- -> mozilla::StyleAbsoluteColor;
-
- /**
- * @see ResolveStyleColor for reference.
+ * @see StyleAbsoluteColor::ToColor for reference.
*/
static auto ResolveStyleColor(nscolor aColor) -> nscolor;
@@ -73,10 +91,13 @@ class nsZenBoostsBackend final : public nsISupports {
*/
auto RefreshCachedBoostState() -> void;
- [[nodiscard]]
- inline auto GetCurrentBrowsingContext() const {
- return mCurrentBrowsingContext;
- }
+ /**
+ * Resolves the current top BrowsingContext from its stored id. May return
+ * null if it has since been discarded. Not on the per-color hot path; the
+ * hot path uses the mCachedCurrent* fields instead.
+ */
+ [[nodiscard]] already_AddRefed
+ GetCurrentBrowsingContext() const;
/**
* Cached boost data for the current top BrowsingContext, refreshed on
@@ -95,15 +116,12 @@ class nsZenBoostsBackend final : public nsISupports {
~nsZenBoostsBackend() = default;
/**
- * The presshell of the current document being rendered.
+ * Id of the top BrowsingContext of the current document being rendered.
+ * Stored as an id rather than a strong RefPtr so the process-wide singleton
+ * does not keep a navigated-away BrowsingContext (and its subtree) alive
+ * until the next presshell entry.
*/
- RefPtr mCurrentBrowsingContext;
-
- static nsZenAccentOklab mCachedAccent;
- // Base accent with its Oklab hue rotated by mCachedComplementaryRotationDeg,
- // recomputed only when the base accent or rotation changes.
- static nsZenAccentOklab mCachedComplementary;
- static float mCachedComplementaryRotationDeg;
+ uint64_t mCurrentBrowsingContextId = 0;
public:
/**
diff --git a/src/zen/tests/boosts/browser.toml b/src/zen/tests/boosts/browser.toml
index c24f62f6a..9cacfe47f 100644
--- a/src/zen/tests/boosts/browser.toml
+++ b/src/zen/tests/boosts/browser.toml
@@ -8,5 +8,6 @@ support-files = [
]
["browser_boost_selector_basic.js"]
+["browser_boost_selector_escaping.js"]
["browser_boost_selector_invalid.js"]
["browser_boost_selector_nthchild.js"]
diff --git a/src/zen/tests/boosts/browser_boost_selector_escaping.js b/src/zen/tests/boosts/browser_boost_selector_escaping.js
new file mode 100644
index 000000000..5a3e299b6
--- /dev/null
+++ b/src/zen/tests/boosts/browser_boost_selector_escaping.js
@@ -0,0 +1,94 @@
+/* Any copyright is dedicated to the Public Domain.
+ https://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Covers code paths the basic/invalid/nthchild tests don't:
+// - getIdentification() running ids/classes through CSS.escape()
+// - the ancestor-disambiguation while-loop in traverse(), which only runs
+// when the exact path still matches more than one element.
+
+add_task(async function test_getSelectionPath_escapesSpecialChars() {
+ const doc = document.implementation.createHTMLDocument("TestEscape");
+
+ const container = doc.createElement("div");
+ // Characters that are invalid in a CSS selector unless escaped.
+ container.id = "with.dot:and#hash";
+ const target = doc.createElement("span");
+ target.className = "foo:bar baz.qux";
+ target.textContent = "target";
+ container.appendChild(target);
+ doc.body.appendChild(container);
+
+ const component = new SelectorComponent(doc, null, [], () => {});
+
+ const path = component.getSelectionPath(doc, 0, target);
+ ok(path, "A path should be generated for an element with special chars");
+
+ // The unescaped raw strings must not leak into the selector verbatim.
+ ok(
+ !path.includes("with.dot:and#hash"),
+ "Raw unescaped id must not appear in the selector"
+ );
+
+ // The generated selector must be valid and resolve back to the target.
+ let matched;
+ try {
+ matched = doc.querySelectorAll(path);
+ } catch (e) {
+ ok(false, `Generated selector should be parseable, got: ${e}`);
+ return;
+ }
+ ok(
+ Array.from(matched).includes(target),
+ "Escaped selector must still match the original element"
+ );
+ Assert.equal(
+ matched.length,
+ 1,
+ "Selector should uniquely identify the element"
+ );
+});
+
+add_task(async function test_getSelectionPath_disambiguatesAncestors() {
+ const doc = document.implementation.createHTMLDocument("TestAncestors");
+
+ // Two structurally identical subtrees. The leaf elements carry no id/class,
+ // so disambiguation must climb ancestors until the path is unique. The two
+ // wrappers differ only by id, forcing the ancestor-walk loop in traverse().
+ const makeBranch = wrapperId => {
+ const wrapper = doc.createElement("section");
+ wrapper.id = wrapperId;
+ const mid = doc.createElement("div");
+ const leaf = doc.createElement("span");
+ leaf.textContent = "leaf";
+ mid.appendChild(leaf);
+ wrapper.appendChild(mid);
+ doc.body.appendChild(wrapper);
+ return leaf;
+ };
+
+ const leafA = makeBranch("branch-a");
+ const leafB = makeBranch("branch-b");
+
+ const component = new SelectorComponent(doc, null, [], () => {});
+
+ for (const [leaf, label] of [
+ [leafA, "branch-a"],
+ [leafB, "branch-b"],
+ ]) {
+ const path = component.getSelectionPath(doc, 0, leaf);
+ ok(path, `Path generated for the leaf under ${label}`);
+
+ const matched = doc.querySelectorAll(path);
+ Assert.equal(
+ matched.length,
+ 1,
+ `Selector for the ${label} leaf must be unique despite an identical sibling subtree`
+ );
+ ok(
+ matched[0] === leaf,
+ `Selector must resolve to the correct ${label} leaf, not the other branch`
+ );
+ }
+});
From d5d86dbfa5ef6a45048b449176513ed4270c2a0b Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Wed, 20 May 2026 00:29:25 +0200
Subject: [PATCH 03/31] no-bug: Fixed `continue where you left off` not working
anymore (gh-13764)
---
prefs/zen/mods.yaml | 3 ---
src/zen/common/modules/ZenUIManager.mjs | 2 +-
src/zen/common/zenThemeModifier.js | 3 ---
src/zen/compact-mode/ZenCompactMode.mjs | 1 +
src/zen/spaces/ZenSpaceManager.mjs | 6 +-----
5 files changed, 3 insertions(+), 12 deletions(-)
diff --git a/prefs/zen/mods.yaml b/prefs/zen/mods.yaml
index 207c7e074..86f1f00c0 100644
--- a/prefs/zen/mods.yaml
+++ b/prefs/zen/mods.yaml
@@ -12,9 +12,6 @@
value: "@cond"
condition: "defined(MOZILLA_OFFICIAL)"
-- name: zen.rice.share.notice.accepted
- value: false
-
# === Mark: Site Injection ===
- name: zen.injections.match-urls
diff --git a/src/zen/common/modules/ZenUIManager.mjs b/src/zen/common/modules/ZenUIManager.mjs
index 67e26a3be..beef37687 100644
--- a/src/zen/common/modules/ZenUIManager.mjs
+++ b/src/zen/common/modules/ZenUIManager.mjs
@@ -1358,6 +1358,7 @@ window.gZenVerticalTabsManager = {
if (!this._hasSetSingleToolbar) {
buttonsTarget.append(this._topButtonsSeparatorElement);
}
+ this._hasSetSingleToolbar = true;
for (const button of elements) {
this.appendCustomizableItem(this._topButtonsSeparatorElement, button);
}
@@ -1381,7 +1382,6 @@ window.gZenVerticalTabsManager = {
titlebar.parentNode.moveBefore(navBar, titlebar);
}
document.documentElement.setAttribute("zen-single-toolbar", true);
- this._hasSetSingleToolbar = true;
} else if (this._hasSetSingleToolbar) {
this._hasSetSingleToolbar = false;
// Do the opposite
diff --git a/src/zen/common/zenThemeModifier.js b/src/zen/common/zenThemeModifier.js
index 31449efaa..109a6a63c 100644
--- a/src/zen/common/zenThemeModifier.js
+++ b/src/zen/common/zenThemeModifier.js
@@ -168,9 +168,6 @@
document.documentElement.setAttribute("zen-no-padding", true);
} else {
document.documentElement.removeAttribute("zen-no-padding");
- if (domFullscreen) {
- window.windowUtils.flushLayoutWithoutThrottledAnimations();
- }
}
},
diff --git a/src/zen/compact-mode/ZenCompactMode.mjs b/src/zen/compact-mode/ZenCompactMode.mjs
index a4b046bf2..a29d6dd13 100644
--- a/src/zen/compact-mode/ZenCompactMode.mjs
+++ b/src/zen/compact-mode/ZenCompactMode.mjs
@@ -724,6 +724,7 @@ window.gZenCompactModeManager = {
} else {
if (attr === "zen-has-hover") {
element.removeAttribute("zen-has-implicit-hover");
+ gURLBar.updateTextOverflow();
}
element.removeAttribute(attr);
// Only remove if none of the verified attributes are present
diff --git a/src/zen/spaces/ZenSpaceManager.mjs b/src/zen/spaces/ZenSpaceManager.mjs
index a16f88711..36ca9c50e 100644
--- a/src/zen/spaces/ZenSpaceManager.mjs
+++ b/src/zen/spaces/ZenSpaceManager.mjs
@@ -926,11 +926,7 @@ class nsZenWorkspaces {
if (gZenUIManager.testingEnabled || !this.workspaceEnabled) {
return;
}
- // note: We cant access `gZenVerticalTabsManager._canReplaceNewTab` this early
- if (
- isEmpty &&
- Services.prefs.getBoolPref("zen.urlbar.replace-newtab", true)
- ) {
+ if (isEmpty) {
tab._markedForReplacement = true;
this._tabToRemoveForEmpty = tab;
} else {
From 035e5931fce3877083d8f7b1df872e906653ac8d Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Wed, 20 May 2026 11:53:23 +0200
Subject: [PATCH 04/31] gh-10594: Video controls going under the screen when in
fullscreen (gh-13769)
---
.../tabbrowser/content/tabgroup-js.patch | 23 +++++++++++--------
src/zen/common/zenThemeModifier.js | 11 +++++++++
2 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/src/browser/components/tabbrowser/content/tabgroup-js.patch b/src/browser/components/tabbrowser/content/tabgroup-js.patch
index 5b242496c..60b9eafae 100644
--- a/src/browser/components/tabbrowser/content/tabgroup-js.patch
+++ b/src/browser/components/tabbrowser/content/tabgroup-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js
-index d1be14df27d76a191eaff05502c030fd68c46738..30e8dda663df8e96dbed5fe5f12f828c1a15b335 100644
+index d1be14df27d76a191eaff05502c030fd68c46738..e9b5e90e39b594a6119081c8d707fb4a064fea9b 100644
--- a/browser/components/tabbrowser/content/tabgroup.js
+++ b/browser/components/tabbrowser/content/tabgroup.js
@@ -14,11 +14,11 @@
@@ -147,7 +147,7 @@ index d1be14df27d76a191eaff05502c030fd68c46738..30e8dda663df8e96dbed5fe5f12f828c
});
}
-@@ -478,13 +511,65 @@
+@@ -478,13 +511,68 @@
* @returns {MozTabbrowserTab[]}
*/
get tabs() {
@@ -162,8 +162,9 @@ index d1be14df27d76a191eaff05502c030fd68c46738..30e8dda663df8e96dbed5fe5f12f828c
+ tabsCollect.push(item);
+ if (gBrowser.isTabGroup(item)) {
+ tabsCollect.push(...item.tabs);
-+ }
-+ }
+ }
+ }
+- return childrenArray.filter(node => node.matches("tab"));
+ return tabsCollect.filter(node => node.matches("tab"));
+ }
+
@@ -189,9 +190,8 @@ index d1be14df27d76a191eaff05502c030fd68c46738..30e8dda663df8e96dbed5fe5f12f828c
+ result.push(labelContainer);
+ }
+ result.push(...item.childGroupsAndTabs);
- }
- }
-- return childrenArray.filter(node => node.matches("tab"));
++ }
++ }
+ return result;
+ }
+
@@ -210,6 +210,9 @@ index d1be14df27d76a191eaff05502c030fd68c46738..30e8dda663df8e96dbed5fe5f12f828c
+ return false;
+ }
+ }
++ if (this.pinned && gZenWorkspaces.activeWorkspaceElement?.hasCollapsedPinnedTabs) {
++ return false;
++ }
+ return true;
+ }
+
@@ -218,7 +221,7 @@ index d1be14df27d76a191eaff05502c030fd68c46738..30e8dda663df8e96dbed5fe5f12f828c
}
/**
-@@ -592,7 +677,6 @@
+@@ -592,7 +680,6 @@
);
} else {
if (tabOrSplitView.pinned) {
@@ -226,7 +229,7 @@ index d1be14df27d76a191eaff05502c030fd68c46738..30e8dda663df8e96dbed5fe5f12f828c
}
let tabToMove =
this.ownerGlobal === tabOrSplitView.ownerGlobal
-@@ -661,7 +745,7 @@
+@@ -661,7 +748,7 @@
*/
on_click(event) {
let isToggleElement =
@@ -235,7 +238,7 @@ index d1be14df27d76a191eaff05502c030fd68c46738..30e8dda663df8e96dbed5fe5f12f828c
event.target === this.#overflowCountLabel;
if (isToggleElement && event.button === 0) {
event.preventDefault();
-@@ -740,5 +824,6 @@
+@@ -740,5 +827,6 @@
}
}
diff --git a/src/zen/common/zenThemeModifier.js b/src/zen/common/zenThemeModifier.js
index 109a6a63c..d3e70d28f 100644
--- a/src/zen/common/zenThemeModifier.js
+++ b/src/zen/common/zenThemeModifier.js
@@ -168,6 +168,17 @@
document.documentElement.setAttribute("zen-no-padding", true);
} else {
document.documentElement.removeAttribute("zen-no-padding");
+ if (domFullscreen) {
+ const selectedBrowser = gBrowser.selectedBrowser;
+ selectedBrowser.style.paddingRight = "env(hairline)";
+ window.addEventListener(
+ "MozAfterPaint",
+ () => {
+ selectedBrowser.style.paddingRight = "";
+ },
+ { once: true }
+ );
+ }
}
},
From f9c4575c786e492664b6f83e91f26293e33c9f61 Mon Sep 17 00:00:00 2001
From: Ashvin Jangid <142579833+ashvwinn@users.noreply.github.com>
Date: Wed, 20 May 2026 16:16:11 +0530
Subject: [PATCH 05/31] gh-13767: fix special key shortcuts displaying
incorrectly until page reload (gh-13768)
The problem was that `input.value` was getting the raw shortcut and not
really converting it to the normalized displayable string.
There was no method to just get the `displayString` for a shortcut
without creating a new one, so I put that logic into
`gZenZenKeyboardShortcutsManager`. The static function in `KeyShortcut`
class is just to reduce code duplication.
fixes: #13767
---
.../components/preferences/zen-settings.js | 2 +-
src/zen/kbs/ZenKeyboardShortcuts.mjs | 45 ++++++++++++++-----
2 files changed, 36 insertions(+), 11 deletions(-)
diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js
index 16ddcbc63..052f0217c 100644
--- a/src/browser/components/preferences/zen-settings.js
+++ b/src/browser/components/preferences/zen-settings.js
@@ -1124,7 +1124,7 @@ var gZenCKSSettings = {
this._hasSafed = false;
input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-invalid`);
input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-not-set`);
- input.value = modifiers.toDisplayString() + shortcut;
+ input.value = modifiers.toDisplayString() + gZenKeyboardShortcutsManager.getKeyDisplay(shortcut);
this._latestValidKey = shortcut;
},
};
diff --git a/src/zen/kbs/ZenKeyboardShortcuts.mjs b/src/zen/kbs/ZenKeyboardShortcuts.mjs
index c7cadbbbc..98dd08da3 100644
--- a/src/zen/kbs/ZenKeyboardShortcuts.mjs
+++ b/src/zen/kbs/ZenKeyboardShortcuts.mjs
@@ -553,16 +553,15 @@ class KeyShortcut {
};
}
- toDisplayString() {
- let str = this.#modifiers.toDisplayString();
-
- if (this.#key) {
- str += this.#key.toUpperCase();
- } else if (this.#keycode) {
+ static keyToDisplayString(key, keycode) {
+ let str = "";
+ if (key) {
+ str += key.toUpperCase();
+ } else if (keycode) {
// Get the key from the value
- for (let [key, value] of Object.entries(KEYCODE_MAP)) {
- if (value == this.#keycode) {
- const normalizedKey = key.toLowerCase();
+ for (let [k, value] of Object.entries(KEYCODE_MAP)) {
+ if (value == keycode) {
+ const normalizedKey = k.toLowerCase();
switch (normalizedKey) {
case "arrowleft":
str += "←";
@@ -591,9 +590,17 @@ class KeyShortcut {
break;
}
}
- } else {
+ }
+ return str;
+ }
+
+ toDisplayString() {
+ if (!this.#key && !this.#keycode) {
return "";
}
+
+ let str = this.#modifiers.toDisplayString();
+ str += KeyShortcut.keyToDisplayString(this.#key, this.#keycode);
return str;
}
@@ -1541,4 +1548,22 @@ window.gZenKeyboardShortcutsManager = {
}
return null;
},
+
+ getKeyDisplay(shortcut) {
+ if (shortcut == "") {
+ return "";
+ }
+
+ let key = shortcut;
+ let keycode = "";
+ for (let kc of Object.keys(KEYCODE_MAP)) {
+ if (kc == shortcut.toUpperCase()) {
+ keycode = KEYCODE_MAP[kc];
+ key = "";
+ break;
+ }
+ }
+
+ return KeyShortcut.keyToDisplayString(key, keycode);
+ },
};
From 1c3b74c508171fdf3985711540b509fd41ecc02b Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Wed, 20 May 2026 13:35:55 +0200
Subject: [PATCH 06/31] no-bug: Increase toolbar overflow threshold (gh-13771)
---
prefs/zen/view.yaml | 2 +-
src/zen/glance/ZenGlanceManager.mjs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/prefs/zen/view.yaml b/prefs/zen/view.yaml
index 5a94673a4..172523ec5 100644
--- a/prefs/zen/view.yaml
+++ b/prefs/zen/view.yaml
@@ -62,7 +62,7 @@
value: "@IS_TWILIGHT@"
- name: zen.view.overflow-webext-toolbar-threshold
- value: 50
+ value: 55
- name: zen.view.enable-loading-indicator
value: true
diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs
index e2d83eb74..2eba42111 100644
--- a/src/zen/glance/ZenGlanceManager.mjs
+++ b/src/zen/glance/ZenGlanceManager.mjs
@@ -35,7 +35,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
// Arc animation configuration
#ARC_CONFIG = Object.freeze({
ARC_STEPS: 80, // Browser interpolates between keyframes natively
- MAX_ARC_HEIGHT: 25,
+ MAX_ARC_HEIGHT: 20,
ARC_HEIGHT_RATIO: 0.2, // Arc height = distance * ratio (capped at MAX_ARC_HEIGHT)
});
From 8840bd77ae943403854c52753801bd95b18efd22 Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Wed, 20 May 2026 13:39:12 +0200
Subject: [PATCH 07/31] no-bug: Let overflowable webexts toolbar ride the train
(gh-13772)
---
prefs/zen/view.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/prefs/zen/view.yaml b/prefs/zen/view.yaml
index 172523ec5..69066e600 100644
--- a/prefs/zen/view.yaml
+++ b/prefs/zen/view.yaml
@@ -59,7 +59,7 @@
value: true
- name: zen.view.overflow-webext-toolbar
- value: "@IS_TWILIGHT@"
+ value: true
- name: zen.view.overflow-webext-toolbar-threshold
value: 55
From ae14d052900c1d445a9c14c875bb23fc168ad9da Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Wed, 20 May 2026 16:51:06 +0200
Subject: [PATCH 08/31] no-bug: Update to Firefox `151.0` (gh-13775)
---
README.md | 2 +-
build/firefox-cache/l10n-last-commit-hash | 2 +-
surfer.json | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index b79094c20..b99274606 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,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 `150.0.3`! 🚀
+- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `151.0`! 🚀
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 151.0`!
### Contributing
diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash
index 0439d0657..f6c433445 100644
--- a/build/firefox-cache/l10n-last-commit-hash
+++ b/build/firefox-cache/l10n-last-commit-hash
@@ -1 +1 @@
-0c5fe3a13813ee9cee3324047c8f0294bb8f2aff
\ No newline at end of file
+10b4efc5a79c2ab80de3b22771b1d36b9b225920
\ No newline at end of file
diff --git a/surfer.json b/surfer.json
index a7e0075b5..cb55e66a5 100644
--- a/surfer.json
+++ b/surfer.json
@@ -5,7 +5,7 @@
"binaryName": "zen",
"version": {
"product": "firefox",
- "version": "150.0.3",
+ "version": "151.0",
"candidate": "151.0",
"candidateBuild": 1
},
@@ -40,7 +40,7 @@
"brandShortName": "Twilight",
"brandFullName": "Zen Twilight",
"release": {
- "displayVersion": "1.20t",
+ "displayVersion": "1.21t",
"github": {
"repo": "zen-browser/desktop"
}
From 81d30b906accedb073758c2c56c1b61667a65ca6 Mon Sep 17 00:00:00 2001
From: Ashvin Jangid <142579833+ashvwinn@users.noreply.github.com>
Date: Thu, 21 May 2026 12:44:18 +0530
Subject: [PATCH 09/31] gh-13776: fix shortcut conflict detection failing with
special keys (gh-13777)
---
src/zen/kbs/ZenKeyboardShortcuts.mjs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/zen/kbs/ZenKeyboardShortcuts.mjs b/src/zen/kbs/ZenKeyboardShortcuts.mjs
index 98dd08da3..82653c77a 100644
--- a/src/zen/kbs/ZenKeyboardShortcuts.mjs
+++ b/src/zen/kbs/ZenKeyboardShortcuts.mjs
@@ -44,6 +44,10 @@ const KEYCODE_MAP = {
SCROLL_LOCK: "VK_SCROLL",
};
+const REVERSE_KEYCODE_MAP = Object.fromEntries(
+ Object.entries(KEYCODE_MAP).map(([k, v]) => [v, k])
+);
+
const defaultKeyboardGroups = {
windowAndTabManagement: [
"zen-window-new-shortcut",
@@ -1507,9 +1511,11 @@ window.gZenKeyboardShortcutsManager = {
continue;
}
+ const keyNameOrCode = targetShortcut.getKeyNameOrCode();
+ const key = REVERSE_KEYCODE_MAP[keyNameOrCode] ?? keyNameOrCode;
if (
targetShortcut.getModifiers().equals(modifiers) &&
- targetShortcut.getKeyNameOrCode()?.toLowerCase() == realShortcut
+ key?.toLowerCase() == realShortcut
) {
return {
hasConflicts: true,
From b726dc80524aa6cb13a1d4ba64fd293d61af2716 Mon Sep 17 00:00:00 2001
From: Ashvin Jangid <142579833+ashvwinn@users.noreply.github.com>
Date: Thu, 21 May 2026 12:44:33 +0530
Subject: [PATCH 10/31] gh-13612: display "Space" key name correctly in
keyboard shortcuts page (gh-13774)
---
src/zen/kbs/ZenKeyboardShortcuts.mjs | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/zen/kbs/ZenKeyboardShortcuts.mjs b/src/zen/kbs/ZenKeyboardShortcuts.mjs
index 82653c77a..8073afd22 100644
--- a/src/zen/kbs/ZenKeyboardShortcuts.mjs
+++ b/src/zen/kbs/ZenKeyboardShortcuts.mjs
@@ -32,7 +32,6 @@ const KEYCODE_MAP = {
TAB: "VK_TAB",
ENTER: "VK_RETURN",
ESCAPE: "VK_ESCAPE",
- SPACE: "VK_SPACE",
ARROWLEFT: "VK_LEFT",
ARROWRIGHT: "VK_RIGHT",
ARROWUP: "VK_UP",
@@ -560,7 +559,13 @@ class KeyShortcut {
static keyToDisplayString(key, keycode) {
let str = "";
if (key) {
- str += key.toUpperCase();
+ switch (key) {
+ case " ":
+ str += AppConstants.platform == "macosx" ? "␣" : "Space";
+ break;
+ default:
+ str += key.toUpperCase();
+ }
} else if (keycode) {
// Get the key from the value
for (let [k, value] of Object.entries(KEYCODE_MAP)) {
@@ -585,9 +590,6 @@ class KeyShortcut {
case "enter":
str += AppConstants.platform == "macosx" ? "↩" : "Enter";
break;
- case "space":
- str += AppConstants.platform == "macosx" ? "␣" : "Space";
- break;
default:
str += normalizedKey;
}
From 0b9f0bbe9115b681644e1de3e78d5368636cd7f8 Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Thu, 21 May 2026 09:21:19 +0200
Subject: [PATCH 11/31] no-bug: Lower boosts radius for macos (gh-13784)
---
src/zen/boosts/zen-boosts.css | 3 ---
1 file changed, 3 deletions(-)
diff --git a/src/zen/boosts/zen-boosts.css b/src/zen/boosts/zen-boosts.css
index 0b80ee2e1..94afd3f1d 100644
--- a/src/zen/boosts/zen-boosts.css
+++ b/src/zen/boosts/zen-boosts.css
@@ -106,9 +106,6 @@ body {
& button {
border-radius: 6px;
- @media (-moz-platform: macos) {
- border-radius: 10px;
- }
padding: 0 !important;
min-width: fit-content !important;
From cd1616d1c00e875dfb5e64289f858f59e0b4e6ee Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Thu, 21 May 2026 18:18:18 +0200
Subject: [PATCH 12/31] gh-13761: Fixed closing a split view selecting it on
other windows (gh-13790)
---
README.md | 4 ++--
src/zen/sessionstore/ZenWindowSync.sys.mjs | 4 +++-
src/zen/split-view/ZenViewSplitter.mjs | 2 +-
surfer.json | 4 ++--
4 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index b99274606..5e46f4dc9 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 `151.0`! 🚀
-- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 151.0`!
+- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `151.0.1`! 🚀
+- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 151.0.1`!
### Contributing
diff --git a/src/zen/sessionstore/ZenWindowSync.sys.mjs b/src/zen/sessionstore/ZenWindowSync.sys.mjs
index a8b0f69a1..ede60adeb 100644
--- a/src/zen/sessionstore/ZenWindowSync.sys.mjs
+++ b/src/zen/sessionstore/ZenWindowSync.sys.mjs
@@ -1657,7 +1657,9 @@ class nsZenWindowSync {
this.#runOnAllWindows(window, win => {
const targetTab = this.getItemFromWindow(win, tab.id);
if (targetTab && win.gZenViewSplitter) {
- win.gZenViewSplitter.removeTabFromGroup(targetTab);
+ win.gZenViewSplitter.removeTabFromGroup(targetTab, undefined, {
+ changeTab: false,
+ });
}
});
}
diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs
index 2dc68c03c..344938714 100644
--- a/src/zen/split-view/ZenViewSplitter.mjs
+++ b/src/zen/split-view/ZenViewSplitter.mjs
@@ -2294,7 +2294,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
// Unsplit the tab and exit from the drag view
this.dropZone?.removeAttribute("enabled");
this.disableTabRearrangeView(event);
- this.removeTabFromSplit(browserContainer);
+ this.removeTabFromSplit(event, browserContainer);
return true;
}
return false;
diff --git a/surfer.json b/surfer.json
index cb55e66a5..ef7606370 100644
--- a/surfer.json
+++ b/surfer.json
@@ -5,8 +5,8 @@
"binaryName": "zen",
"version": {
"product": "firefox",
- "version": "151.0",
- "candidate": "151.0",
+ "version": "151.0.1",
+ "candidate": "151.0.1",
"candidateBuild": 1
},
"buildOptions": {
From 7196527509ee8bacafeaf575db7d659c6f46b503 Mon Sep 17 00:00:00 2001
From: fen4flo <75260616+FlorianButz@users.noreply.github.com>
Date: Fri, 22 May 2026 17:31:25 +0200
Subject: [PATCH 13/31] gh-13796: Fix tab order reversing on dnd & boosts
window size / initial color state (gh-13799)
Co-authored-by: Mr. M
Signed-off-by: fen4flo <75260616+FlorianButz@users.noreply.github.com>
---
prefs/privatefox/disablemozilla.yaml | 7 +
src/zen/boosts/ZenBoostsEditor.mjs | 155 +++++++++----------
src/zen/boosts/ZenBoostsManager.sys.mjs | 7 +-
src/zen/boosts/actors/ZenBoostsChild.sys.mjs | 17 +-
src/zen/boosts/nsZenBoostsBackend.cpp | 17 +-
src/zen/boosts/zen-boost-editor.inc.xhtml | 22 +--
src/zen/boosts/zen-boosts.css | 14 ++
src/zen/tabs/ZenPinnedTabManager.mjs | 4 +
8 files changed, 140 insertions(+), 103 deletions(-)
diff --git a/prefs/privatefox/disablemozilla.yaml b/prefs/privatefox/disablemozilla.yaml
index 41b7d06e7..e974e977b 100644
--- a/prefs/privatefox/disablemozilla.yaml
+++ b/prefs/privatefox/disablemozilla.yaml
@@ -44,3 +44,10 @@
- name: browser.taskbarTabs.enabled
value: false
+
+- name: browser.contentblocking.report.hide_vpn_banner
+ value: true
+ locked: true
+
+- name: browser.vpn_promo.enabled
+ value: false
diff --git a/src/zen/boosts/ZenBoostsEditor.mjs b/src/zen/boosts/ZenBoostsEditor.mjs
index 1708ca752..f362abe13 100644
--- a/src/zen/boosts/ZenBoostsEditor.mjs
+++ b/src/zen/boosts/ZenBoostsEditor.mjs
@@ -65,6 +65,7 @@ export class nsZenBoostEditor {
once: true,
});
+ this.doc.getElementById("zenBoostWindow").setAttribute("editor", "boost");
this.doc.getElementById("zen-boost-editor-root").style.display = "flex";
this.doc.getElementById("zen-boost-code-editor-root").style.display =
"none";
@@ -366,20 +367,22 @@ export class nsZenBoostEditor {
// being smaller than it should be
this._boostEditorWidth = this.editorWindow.outerWidth;
- this.editorWindow.resizeTo(
- this._codeEditorWidth,
- this.editorWindow.outerHeight
- );
- if (openRightAligned) {
- this.editorWindow.moveTo(
- this.editorWindow.screenX - offset,
- this.editorWindow.screenY
+ this.editorWindow.requestAnimationFrame(() => {
+ this.editorWindow.resizeTo(
+ this._codeEditorWidth,
+ this.editorWindow.outerHeight
);
- }
+ if (openRightAligned) {
+ this.editorWindow.moveTo(
+ this.editorWindow.screenX - offset,
+ this.editorWindow.screenY
+ );
+ }
- this.doc.getElementById("zen-boost-editor-root").style.display = "none";
- this.doc.getElementById("zen-boost-code-editor-root").style.display =
- "initial";
+ this.doc.getElementById("zen-boost-editor-root").style.display = "none";
+ this.doc.getElementById("zen-boost-code-editor-root").style.display =
+ "initial";
+ });
}
/**
@@ -397,20 +400,22 @@ export class nsZenBoostEditor {
}
windowElem.setAttribute("editor", "boost");
- this.editorWindow.resizeTo(
- this._boostEditorWidth,
- this.editorWindow.outerHeight
- );
- if (openRightAligned) {
- this.editorWindow.moveTo(
- this.editorWindow.screenX + offset,
- this.editorWindow.screenY
+ this.editorWindow.requestAnimationFrame(() => {
+ this.editorWindow.resizeTo(
+ this._boostEditorWidth,
+ this.editorWindow.outerHeight
);
- }
+ if (openRightAligned) {
+ this.editorWindow.moveTo(
+ this.editorWindow.screenX + offset,
+ this.editorWindow.screenY
+ );
+ }
- this.doc.getElementById("zen-boost-editor-root").style.display = "flex";
- this.doc.getElementById("zen-boost-code-editor-root").style.display =
- "none";
+ this.doc.getElementById("zen-boost-editor-root").style.display = "flex";
+ this.doc.getElementById("zen-boost-code-editor-root").style.display =
+ "none";
+ });
// Disable picker mode
this.disableAllPickers();
@@ -564,6 +569,9 @@ ${cssSelector} {
this.wasDragging = true;
event.preventDefault();
+ this.currentBoostData.changeWasMade = true;
+ this.updateButtonToggleVisuals();
+
if (this.dragTarget == "zen-boost-color-picker-dot-secondary") {
this.setSecondaryDotPos(event.clientX, event.clientY);
} else if (event.target.id != "zen-boost-magic-theme") {
@@ -670,20 +678,6 @@ ${cssSelector} {
panel.openPopup(event.target, "bottomcenter topcenter", 0, 2);
}
- /**
- * Resets the color picker dot to the default position (default state).
- */
- resetDotPosition() {
- const gradient = this.doc.querySelector(".zen-boost-color-picker-gradient");
- const rect = gradient.getBoundingClientRect();
- const padding = 50;
- const centerX = rect.left + rect.width / 2;
- const centerY = rect.top + rect.height / 2;
- const radius = (rect.width - padding) / 2;
-
- this.setDotPos(centerX + radius / 1.25, centerY);
- }
-
/**
* Handles clicks on the theme picker gradient or magic theme button.
* Updates the dot position or toggles auto-theme mode based on the click target.
@@ -695,14 +689,16 @@ ${cssSelector} {
this.currentBoostData.changeWasMade = true;
+ this.currentBoostData.enableColorBoost = true;
+ this.updateButtonToggleVisuals();
+
if (event.target.id == "zen-boost-magic-theme") {
- this.currentBoostData.enableColorBoost = true;
this.currentBoostData.autoTheme = !this.currentBoostData.autoTheme;
- this.updateButtonToggleVisuals();
this.updateCurrentBoost();
} else if (this.dragTarget != "zen-boost-color-picker-dot-secondary") {
this.setDotPos(event.clientX, event.clientY, !this.wasDragging);
}
+
this.wasDragging = false;
}
@@ -1310,6 +1306,23 @@ ${cssSelector} {
const resetBoost = this.doc.getElementById("zen-boost-edit-reset");
const popup = this.doc.getElementById("zenBoostContextMenu");
+ popup.addEventListener(
+ "popupshown",
+ () => {
+ // Don't give the user following options if the boost
+ // is not going to save / not currently saved (unchanged)
+ let shouldDisable = !this.currentBoostData.changeWasMade;
+ const items = [renameBoost, deleteBoost, resetBoost];
+ for (let item of items) {
+ if (shouldDisable) {
+ item.setAttribute("disabled", "");
+ } else {
+ item.removeAttribute("disabled");
+ }
+ }
+ },
+ { once: true }
+ );
popup.openPopup(
event.target,
"bottomcenter topcenter",
@@ -1319,12 +1332,6 @@ ${cssSelector} {
false /* attributesOverride */,
event
);
-
- // Don't give the user following options if the boost
- // is not going to save / not currently saved (unchanged)
- renameBoost.disabled = !this.currentBoostData.changeWasMade;
- deleteBoost.disabled = !this.currentBoostData.changeWasMade;
- resetBoost.disabled = !this.currentBoostData.changeWasMade;
}
/**
@@ -1566,44 +1573,32 @@ ${cssSelector} {
}
if (
- this.currentBoostData.dotPos.x == null ||
- this.currentBoostData.dotPos.y == null
- ) {
- this.resetDotPosition();
- } else {
// Test if the stored position is a non-normalized dot position
- if (
- this.currentBoostData.dotPos.x > 1 ||
- this.currentBoostData.dotPos.x < 0 ||
- this.currentBoostData.dotPos.y > 1 ||
- this.currentBoostData.dotPos.y < 0
- ) {
- // Normalize position
- this.currentBoostData.dotPos.x =
- this.currentBoostData.dotPos.x / rect.width;
- this.currentBoostData.dotPos.y =
- this.currentBoostData.dotPos.y / rect.height;
- }
-
- // Convert normalized position to relative position
- const xPos = this.currentBoostData.dotPos.x * rect.width;
- const yPos = this.currentBoostData.dotPos.y * rect.height;
-
- dot.style.left = `${xPos}px`;
- dot.style.top = `${yPos}px`;
- }
-
- if (
- this.currentBoostData.secondaryDotPos?.x != null &&
- this.currentBoostData.secondaryDotPos?.y != null
+ this.currentBoostData.dotPos.x > 1 ||
+ this.currentBoostData.dotPos.x < 0 ||
+ this.currentBoostData.dotPos.y > 1 ||
+ this.currentBoostData.dotPos.y < 0
) {
- const xPosSec = this.currentBoostData.secondaryDotPos.x * rect.width;
- const yPosSec = this.currentBoostData.secondaryDotPos.y * rect.height;
-
- dotSec.style.left = `${xPosSec}px`;
- dotSec.style.top = `${yPosSec}px`;
+ // Normalize position
+ this.currentBoostData.dotPos.x =
+ this.currentBoostData.dotPos.x / rect.width;
+ this.currentBoostData.dotPos.y =
+ this.currentBoostData.dotPos.y / rect.height;
}
+ // Convert normalized position to relative position
+ const xPos = this.currentBoostData.dotPos.x * rect.width;
+ const yPos = this.currentBoostData.dotPos.y * rect.height;
+
+ dot.style.left = `${xPos}px`;
+ dot.style.top = `${yPos}px`;
+
+ const xPosSec = this.currentBoostData.secondaryDotPos.x * rect.width;
+ const yPosSec = this.currentBoostData.secondaryDotPos.y * rect.height;
+
+ dotSec.style.left = `${xPosSec}px`;
+ dotSec.style.top = `${yPosSec}px`;
+
this.editorWindow._editor.setText(this.currentBoostData.customCSS || "");
this.updateFontButtonVisuals();
diff --git a/src/zen/boosts/ZenBoostsManager.sys.mjs b/src/zen/boosts/ZenBoostsManager.sys.mjs
index 0525b5378..b9bb534ed 100644
--- a/src/zen/boosts/ZenBoostsManager.sys.mjs
+++ b/src/zen/boosts/ZenBoostsManager.sys.mjs
@@ -115,11 +115,11 @@ class nsZenBoostsManager {
boostName: "My Boost",
dotAngleDeg: 0,
- dotPos: { x: null, y: null },
+ dotPos: { x: 0.76, y: 0.66 },
dotDistance: 0,
secondaryDotAngleDegDelta: 55,
- secondaryDotPos: { x: null, y: null },
+ secondaryDotPos: { x: 0.5, y: 0.81 },
brightness: 0.5,
saturation: 0.5,
@@ -559,7 +559,8 @@ class nsZenBoostsManager {
const domainEntry = this.#getDomainEntry(domain);
if (domainEntry) {
- return domainEntry.boostEntries.has(domainEntry.activeBoostId);
+ const boost = this.loadActiveBoostFromStore(domain);
+ return boost?.boostEntry.boostData.changeWasMade ?? false;
}
return false;
diff --git a/src/zen/boosts/actors/ZenBoostsChild.sys.mjs b/src/zen/boosts/actors/ZenBoostsChild.sys.mjs
index 78260f30a..637d81909 100644
--- a/src/zen/boosts/actors/ZenBoostsChild.sys.mjs
+++ b/src/zen/boosts/actors/ZenBoostsChild.sys.mjs
@@ -367,7 +367,14 @@ export class ZenBoostsChild extends JSWindowActorChild {
this.#loadStyleSheet(boost.styleSheet);
}
- browsingContext.fullZoom = boostData.sizeOverride;
+ if (
+ boostData.sizeOverride &&
+ isFinite(boostData.sizeOverride) &&
+ boostData.sizeOverride !== 1
+ ) {
+ browsingContext.fullZoom = boostData.sizeOverride;
+ }
+
browsingContext.isZenBoostsInverted = boostData.smartInvert;
if (boostData.enableColorBoost) {
let primaryColor;
@@ -390,17 +397,17 @@ export class ZenBoostsChild extends JSWindowActorChild {
// using the same modifiers as the color above
primaryColor = this.#buildBoostColor(
primaryGradientColor[0],
- primaryGradientColor[1] * (1 - boostData.saturation),
- 0.1 + primaryGradientColor[2] * 0.9 * boostData.brightness,
+ 1 - boostData.saturation,
+ 0.1 + 0.9 * boostData.brightness,
boostData
);
} else {
primaryColor = this.#buildBoostColor(
boostData.dotAngleDeg,
/* already is [0, 1] */
- boostData.dotDistance * (1 - boostData.saturation),
+ 1 - boostData.saturation,
/* lightness range from [0.1, 0.9] */
- 0.1 + boostData.dotDistance * 0.8 * boostData.brightness,
+ 0.1 + 0.9 * boostData.brightness,
boostData
);
}
diff --git a/src/zen/boosts/nsZenBoostsBackend.cpp b/src/zen/boosts/nsZenBoostsBackend.cpp
index 1a54b0264..b94e2890f 100644
--- a/src/zen/boosts/nsZenBoostsBackend.cpp
+++ b/src/zen/boosts/nsZenBoostsBackend.cpp
@@ -359,15 +359,24 @@ inline static nscolor zenInvertColorChannel(nscolor aColor) {
const auto gShifted = sum - gInv;
const auto bShifted = sum - bInv;
- // Compress the channel range into [FLOOR, 255] so dark inversions are
- // lifted while light inversions are left untouched. This preserves hue
- // since all three channels are scaled by the same factor.
+ // If the resulting color is light, leave it untouched: mixing in the floor
+ // would raise its lowest channel and wash the color out toward grey. Only
+ // dark results get the floor lift, which keeps them off pure black.
+ const auto luma = (rShifted * 54 + gShifted * 183 + bShifted * 19) >> 8;
+ if (luma > 127) {
+ return NS_RGBA(static_cast(rShifted),
+ static_cast(gShifted),
+ static_cast(bShifted), a);
+ }
+
+ // Compress the dark channel range into [FLOOR, 255] so dark inversions are
+ // lifted off pure black. This preserves hue since all three channels are
+ // scaled by the same factor.
const auto channelFloor = INVERT_CHANNEL_FLOOR();
const uint32_t range = 255 - channelFloor;
const auto lift = [channelFloor, range](uint8_t c) -> uint8_t {
return static_cast(channelFloor + (c * range) / 255);
};
-
return NS_RGBA(lift(rShifted), lift(gShifted), lift(bShifted), a);
}
diff --git a/src/zen/boosts/zen-boost-editor.inc.xhtml b/src/zen/boosts/zen-boost-editor.inc.xhtml
index 508dc9c42..15c75f57c 100644
--- a/src/zen/boosts/zen-boost-editor.inc.xhtml
+++ b/src/zen/boosts/zen-boost-editor.inc.xhtml
@@ -132,18 +132,18 @@
-
-
+
+
Date: Sat, 23 May 2026 08:16:22 +0200
Subject: [PATCH 14/31] no-bug: Update macos SDK version to `26.5` (gh-13807)
---
.github/workflows/macos-release-build.yml | 6 ++++++
configs/macos/mozconfig | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml
index 66f2789f0..b3395f0f1 100644
--- a/.github/workflows/macos-release-build.yml
+++ b/.github/workflows/macos-release-build.yml
@@ -48,6 +48,12 @@ jobs:
with:
node-version-file: ".nvmrc"
+ - name: Log SDK versions
+ run: |
+ ls /Library/Developer/CommandLineTools/SDKs/
+ xcrun --show-sdk-version
+ xcrun --show-sdk-path
+
- name: Run sccache-cache
uses: mozilla-actions/sccache-action@main
if: ${{ inputs.use-sccache }}
diff --git a/configs/macos/mozconfig b/configs/macos/mozconfig
index 4b2e503ea..e7f655940 100644
--- a/configs/macos/mozconfig
+++ b/configs/macos/mozconfig
@@ -8,7 +8,7 @@ ac_add_options --disable-dmd
ac_add_options --enable-eme=widevine
if test "$ZEN_RELEASE"; then
- ac_add_options --with-macos-sdk=/Library/Developer/CommandLineTools/SDKs/MacOSX26.4.sdk
+ ac_add_options --with-macos-sdk=/Library/Developer/CommandLineTools/SDKs/MacOSX26.5.sdk
fi
if test "$ZEN_RELEASE"; then
From 29226112f5b6040eba26c8ac867971cb994a201d Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Sat, 23 May 2026 08:31:03 +0200
Subject: [PATCH 15/31] no-bug: Fallbac to macos SDK version 26.4 if 26.5
doesnt exist (gh-13808)
---
configs/macos/mozconfig | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/configs/macos/mozconfig b/configs/macos/mozconfig
index e7f655940..c838095cd 100644
--- a/configs/macos/mozconfig
+++ b/configs/macos/mozconfig
@@ -8,7 +8,13 @@ ac_add_options --disable-dmd
ac_add_options --enable-eme=widevine
if test "$ZEN_RELEASE"; then
- ac_add_options --with-macos-sdk=/Library/Developer/CommandLineTools/SDKs/MacOSX26.5.sdk
+ ALLOWED_SDKS="26.5 26.4"
+ for SDK in $ALLOWED_SDKS; do
+ if [ -d "/Library/Developer/CommandLineTools/SDKs/MacOSX${SDK}.sdk" ]; then
+ ac_add_options --with-macos-sdk=/Library/Developer/CommandLineTools/SDKs/MacOSX${SDK}.sdk
+ break
+ fi
+ done
fi
if test "$ZEN_RELEASE"; then
From 09ed192fc4be871a9fab1986e40ce90f3e18db9c Mon Sep 17 00:00:00 2001
From: Ashvin Jangid <142579833+ashvwinn@users.noreply.github.com>
Date: Sat, 23 May 2026 15:56:13 +0530
Subject: [PATCH 16/31] gh-13642: fix unexpected sidebar width increase in
compact mode (gh-13794)
`getAndApplySidebarWidth()` does handle this case but in the condition
it requires the event.
```
if (
event &&
shouldRecalculate &&
sidebarExpanded &&
!gZenVerticalTabsManager._hadSidebarCollapse
) {
return;
}
```
If the function does not return here then it makes the
`--zen-sidebar-width` = `--actual-zen-sidebar-width` which adds the
padding's width to the sidebar.
I don't know if not passing event in the function was intentional, but
this seems to fix the issue.
fixes: #13642
---
src/zen/common/modules/ZenUIManager.mjs | 2 +-
src/zen/spaces/ZenSpaceCreation.mjs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/zen/common/modules/ZenUIManager.mjs b/src/zen/common/modules/ZenUIManager.mjs
index beef37687..4553c5bb6 100644
--- a/src/zen/common/modules/ZenUIManager.mjs
+++ b/src/zen/common/modules/ZenUIManager.mjs
@@ -1510,7 +1510,7 @@ window.gZenVerticalTabsManager = {
this.navigatorToolbox.after(splitter);
window.dispatchEvent(new Event("resize"));
if (!isCompactMode) {
- gZenCompactModeManager.getAndApplySidebarWidth();
+ gZenCompactModeManager.getAndApplySidebarWidth({});
}
gZenUIManager.updateTabsToolbar();
this.rebuildURLBarMenus();
diff --git a/src/zen/spaces/ZenSpaceCreation.mjs b/src/zen/spaces/ZenSpaceCreation.mjs
index 26690eabf..5792d2120 100644
--- a/src/zen/spaces/ZenSpaceCreation.mjs
+++ b/src/zen/spaces/ZenSpaceCreation.mjs
@@ -219,7 +219,7 @@ class nsZenWorkspaceCreation extends MozXULElement {
document.getElementById("nav-bar").style.visibility = "collapse";
}
this.style.visibility = "visible";
- gZenCompactModeManager.getAndApplySidebarWidth();
+ gZenCompactModeManager.getAndApplySidebarWidth({});
this.resolveInitialized();
let animation = gZenUIManager.motion.animate(
this.elementsToAnimate,
From 999a78d65605e88c3cf2b867c5eef0e731f2a4bd Mon Sep 17 00:00:00 2001
From: fen4flo <75260616+FlorianButz@users.noreply.github.com>
Date: Sat, 23 May 2026 15:28:45 +0200
Subject: [PATCH 17/31] no-bug: Fix manager not writing to file after boost
toggle (gh-13815)
---
src/zen/boosts/ZenBoostsManager.sys.mjs | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/zen/boosts/ZenBoostsManager.sys.mjs b/src/zen/boosts/ZenBoostsManager.sys.mjs
index b9bb534ed..a93492da5 100644
--- a/src/zen/boosts/ZenBoostsManager.sys.mjs
+++ b/src/zen/boosts/ZenBoostsManager.sys.mjs
@@ -312,6 +312,7 @@ class nsZenBoostsManager {
Services.obs.notifyObservers(null, "zen-boosts-active-change", { id });
+ this.#writeToDisk(this.registeredDomains);
this.#stylesManager.invalidateStyleForDomain(domain);
this.notify();
}
@@ -327,23 +328,23 @@ class nsZenBoostsManager {
if (domainEntry) {
if (domainEntry.boostEntries.has(id)) {
+ let unloadStyles = false;
if (domainEntry.activeBoostId === id) {
domainEntry.activeBoostId = null;
Services.obs.notifyObservers(null, "zen-boosts-active-change", {
id: null,
});
-
- this.#stylesManager.invalidateStyleForDomain(domain);
- this.notify(true);
+ unloadStyles = true;
} else {
domainEntry.activeBoostId = id;
Services.obs.notifyObservers(null, "zen-boosts-active-change", {
id,
});
-
- this.#stylesManager.invalidateStyleForDomain(domain);
- this.notify();
}
+
+ this.#writeToDisk(this.registeredDomains);
+ this.#stylesManager.invalidateStyleForDomain(domain);
+ this.notify(unloadStyles);
}
}
}
From 8f905e7abd9d4b0c145ea9f5ad3b02190308831f Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Sun, 24 May 2026 11:00:54 +0200
Subject: [PATCH 18/31] no-bug: Fix boosts picker showing wrong auto theme
choice (gh-13821)
---
src/zen/boosts/ZenBoostsEditor.mjs | 2 +-
src/zen/boosts/zen-boosts.css | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/zen/boosts/ZenBoostsEditor.mjs b/src/zen/boosts/ZenBoostsEditor.mjs
index f362abe13..723229743 100644
--- a/src/zen/boosts/ZenBoostsEditor.mjs
+++ b/src/zen/boosts/ZenBoostsEditor.mjs
@@ -690,7 +690,6 @@ ${cssSelector} {
this.currentBoostData.changeWasMade = true;
this.currentBoostData.enableColorBoost = true;
- this.updateButtonToggleVisuals();
if (event.target.id == "zen-boost-magic-theme") {
this.currentBoostData.autoTheme = !this.currentBoostData.autoTheme;
@@ -699,6 +698,7 @@ ${cssSelector} {
this.setDotPos(event.clientX, event.clientY, !this.wasDragging);
}
+ this.updateButtonToggleVisuals();
this.wasDragging = false;
}
diff --git a/src/zen/boosts/zen-boosts.css b/src/zen/boosts/zen-boosts.css
index d82f0e48e..f0b3c43ba 100644
--- a/src/zen/boosts/zen-boosts.css
+++ b/src/zen/boosts/zen-boosts.css
@@ -17,8 +17,8 @@
}
#zenBoostWindow[editor="boost"] {
- min-width: 192px;
- max-width: 192px;
+ min-width: 184px;
+ max-width: 184px;
}
#zenBoostWindow[editor="code"] {
@@ -239,9 +239,9 @@ body {
}
#zen-boost-filter-wrapper {
- padding: 20px;
+ padding: 16px;
gap: 14px;
- padding-top: 10px;
+ padding-top: 6px;
background-color: #fcfcfe;
From 7e449ccdc9a73f1566ca71d7a18fbb7ffbab7326 Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Mon, 25 May 2026 19:58:28 +0200
Subject: [PATCH 19/31] gh-10594: Increase the padding size when entering
fullscreen (gh-13848)
---
.../components/customizableui/CustomizableUI-sys-mjs.patch | 4 ++--
src/zen/common/styles/zen-theme.css | 2 +-
src/zen/common/zenThemeModifier.js | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch
index 4b057e3d2..861ba1f81 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 5905271a3343efa04b45f5d1a63bfca3de342755..af76922c1ba0b35a0072ec044f7d0860f9295d9d 100644
+index 5905271a3343efa04b45f5d1a63bfca3de342755..37f57de0ad72271d4c6e188ab9841b23b95f08d0 100644
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
@@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
@@ -195,7 +195,7 @@ index 5905271a3343efa04b45f5d1a63bfca3de342755..af76922c1ba0b35a0072ec044f7d0860
+ win.gZenVerticalTabsManager._hasSetSingleToolbar &&
+ Services.prefs.getBoolPref("zen.view.overflow-webext-toolbar", true) &&
+ !win.gURLBar.hasAttribute("breakout-extend")) {
-+ const availSelectors = ":is(#page-action-buttons, #zen-copy-url-button, .unified-extensions-item)";
++ const availSelectors = ":is(#page-action-buttons, #zen-copy-url-button, .unified-extensions-item, .urlbar-addon-page-action)";
+ const width = [
+ ...win.gURLBar._inputContainer.querySelectorAll(availSelectors),
+ ...win.document.getElementById("zen-overflow-extensions-list").querySelectorAll(availSelectors)
diff --git a/src/zen/common/styles/zen-theme.css b/src/zen/common/styles/zen-theme.css
index 1c6571ab3..815dd2a34 100644
--- a/src/zen/common/styles/zen-theme.css
+++ b/src/zen/common/styles/zen-theme.css
@@ -167,7 +167,7 @@
--toolbarbutton-hover-background: var(--zen-toolbar-element-bg-hover) !important;
--zen-toolbar-button-size: 16px;
@media (-moz-platform: macos) {
- --zen-toolbar-button-size: 18px;
+ --zen-toolbar-button-size: 17px;
}
/* Using a semitransparent background preserves the tinting from the backdrop.
diff --git a/src/zen/common/zenThemeModifier.js b/src/zen/common/zenThemeModifier.js
index d3e70d28f..30f2a42ce 100644
--- a/src/zen/common/zenThemeModifier.js
+++ b/src/zen/common/zenThemeModifier.js
@@ -170,7 +170,7 @@
document.documentElement.removeAttribute("zen-no-padding");
if (domFullscreen) {
const selectedBrowser = gBrowser.selectedBrowser;
- selectedBrowser.style.paddingRight = "env(hairline)";
+ selectedBrowser.style.paddingRight = "0.5px";
window.addEventListener(
"MozAfterPaint",
() => {
From 69e76e51b7ac0aba91a586e260fb1e1c2f536adf Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Mon, 25 May 2026 19:58:38 +0200
Subject: [PATCH 20/31] gh-13844: Fixed boosts not working when anon content
exists (gh-13847)
---
src/gfx/layers/AnimationInfo-cpp.patch | 26 ++---
src/layout/base/PresShell-cpp.patch | 7 +-
src/layout/generic/ViewportFrame-cpp.patch | 33 ------
src/layout/generic/nsContainerFrame-cpp.patch | 47 ++++++++
src/layout/generic/nsIFrame-h.patch | 13 +++
src/layout/generic/nsImageFrame-cpp.patch | 13 +++
src/layout/generic/nsTextFrame-cpp.patch | 13 +++
src/layout/generic/nsTextPaintStyle-cpp.patch | 67 +++++++++++
src/layout/mathml/nsMathMLChar-cpp.patch | 13 +++
src/layout/painting/nsCSSRendering-cpp.patch | 87 ++++++++++++++
src/layout/painting/nsDisplayList-cpp.patch | 23 ----
src/layout/style/ComputedStyle-cpp.patch | 65 +++++++++++
src/layout/style/ComputedStyle-h.patch | 22 ++++
src/layout/style/StyleColor-cpp.patch | 34 +++++-
src/layout/style/StyleColorInlines-h.patch | 13 +++
src/layout/svg/FilterInstance-cpp.patch | 13 +++
src/layout/svg/SVGTextFrame-cpp.patch | 28 +++++
src/layout/tables/nsTableFrame-cpp.patch | 13 +++
src/layout/xul/tree/nsTreeBodyFrame-cpp.patch | 23 ++++
src/servo/ports/geckolib/cbindgen-toml.patch | 30 +++++
src/zen/boosts/actors/ZenBoostsChild.sys.mjs | 33 ++----
src/zen/boosts/nsZenBCOverrides.cpp | 15 ---
src/zen/boosts/nsZenBoostsBackend.cpp | 106 ++++++------------
src/zen/boosts/nsZenBoostsBackend.h | 70 ++----------
src/zen/common/sys/ZenActorsManager.sys.mjs | 3 +-
25 files changed, 565 insertions(+), 245 deletions(-)
delete mode 100644 src/layout/generic/ViewportFrame-cpp.patch
create mode 100644 src/layout/generic/nsContainerFrame-cpp.patch
create mode 100644 src/layout/generic/nsIFrame-h.patch
create mode 100644 src/layout/generic/nsImageFrame-cpp.patch
create mode 100644 src/layout/generic/nsTextFrame-cpp.patch
create mode 100644 src/layout/generic/nsTextPaintStyle-cpp.patch
create mode 100644 src/layout/mathml/nsMathMLChar-cpp.patch
create mode 100644 src/layout/painting/nsCSSRendering-cpp.patch
delete mode 100644 src/layout/painting/nsDisplayList-cpp.patch
create mode 100644 src/layout/style/ComputedStyle-cpp.patch
create mode 100644 src/layout/style/ComputedStyle-h.patch
create mode 100644 src/layout/style/StyleColorInlines-h.patch
create mode 100644 src/layout/svg/FilterInstance-cpp.patch
create mode 100644 src/layout/svg/SVGTextFrame-cpp.patch
create mode 100644 src/layout/tables/nsTableFrame-cpp.patch
create mode 100644 src/layout/xul/tree/nsTreeBodyFrame-cpp.patch
create mode 100644 src/servo/ports/geckolib/cbindgen-toml.patch
diff --git a/src/gfx/layers/AnimationInfo-cpp.patch b/src/gfx/layers/AnimationInfo-cpp.patch
index aa58cdcbc..7a91671c6 100644
--- a/src/gfx/layers/AnimationInfo-cpp.patch
+++ b/src/gfx/layers/AnimationInfo-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/gfx/layers/AnimationInfo.cpp b/gfx/layers/AnimationInfo.cpp
-index 1d330056bd7a4e89aac5e5296a3c164fb42b5c42..38bfbcfcaf0c791ee817aafbd24b1cad67974e62 100644
+index 1d330056bd7a4e89aac5e5296a3c164fb42b5c42..629fbdd748310c31aeb16b0a8d8e862a99314cc9 100644
--- a/gfx/layers/AnimationInfo.cpp
+++ b/gfx/layers/AnimationInfo.cpp
@@ -14,6 +14,7 @@
@@ -10,22 +10,20 @@ index 1d330056bd7a4e89aac5e5296a3c164fb42b5c42..38bfbcfcaf0c791ee817aafbd24b1cad
#include "nsIContent.h"
#include "nsLayoutUtils.h"
#include "nsRefreshDriver.h"
-@@ -343,7 +344,17 @@ static void SetAnimatable(NonCustomCSSPropertyId aProperty,
+@@ -341,9 +342,13 @@ static void SetAnimatable(NonCustomCSSPropertyId aProperty,
+ case eCSSProperty_background_color: {
+ // We don't support color animation on the compositor yet so that we can
// resolve currentColor at this moment.
- nscolor foreground =
- aFrame->Style()->GetVisitedDependentColor(&nsStyleText::mColor);
+- nscolor foreground =
+- aFrame->Style()->GetVisitedDependentColor(&nsStyleText::mColor);
- aAnimatable = aAnimationValue.GetColor(foreground);
++ nscolor foreground = aFrame->Style()->GetVisitedDependentColor(
++ &nsStyleText::mColor, nullptr);
+ nscolor resolved = aAnimationValue.GetColor(foreground);
-+ // |foreground| is already boost-resolved through
-+ // StyleAbsoluteColor::ToColor, so a currentColor keyframe is already
-+ // filtered; only absolute keyframe colors still need the boost applied
-+ // here, exactly once, so the composited transition endpoint matches the
-+ // resting/static paint and doesn't snap when the transition ends.
-+ aAnimatable =
-+ aAnimationValue.IsCurrentColor()
-+ ? resolved
-+ : zen::nsZenBoostsBackend::FilterColorFromPresContext(
-+ resolved, aFrame->PresContext());
++ aAnimatable = aAnimationValue.IsCurrentColor()
++ ? resolved
++ : zen::nsZenBoostsBackend::ResolveStyleColor(resolved,
++ aFrame);
break;
}
case eCSSProperty_opacity:
diff --git a/src/layout/base/PresShell-cpp.patch b/src/layout/base/PresShell-cpp.patch
index c24995ca5..3ec1da1b6 100644
--- a/src/layout/base/PresShell-cpp.patch
+++ b/src/layout/base/PresShell-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp
-index b5930f71e362eb78f74888e1b33b2a6f9dbb4ea4..dc1ba0b462402f62e47fcb32e2d7cd1a671a7fd8 100644
+index b5930f71e362eb78f74888e1b33b2a6f9dbb4ea4..2105911a18b64e210d3125fec1bfa8058ca07d4e 100644
--- a/layout/base/PresShell.cpp
+++ b/layout/base/PresShell.cpp
@@ -135,6 +135,7 @@
@@ -10,12 +10,13 @@ index b5930f71e362eb78f74888e1b33b2a6f9dbb4ea4..dc1ba0b462402f62e47fcb32e2d7cd1a
#include "nsAnimationManager.h"
#include "nsAutoLayoutPhase.h"
#include "nsCOMArray.h"
-@@ -5572,7 +5573,7 @@ nscolor PresShell::GetDefaultBackgroundColorToDraw() const {
+@@ -5572,7 +5573,8 @@ nscolor PresShell::GetDefaultBackgroundColorToDraw() const {
if (!mPresContext) {
return NS_RGB(255, 255, 255);
}
- return mPresContext->DefaultBackgroundColor();
-+ return zen::nsZenBoostsBackend::FilterColorFromPresContext(mPresContext->DefaultBackgroundColor(), mPresContext);
++ return zen::nsZenBoostsBackend::ResolveStyleColor(
++ mPresContext->DefaultBackgroundColor(), GetRootFrame());
}
void PresShell::UpdateCanvasBackground() {
diff --git a/src/layout/generic/ViewportFrame-cpp.patch b/src/layout/generic/ViewportFrame-cpp.patch
deleted file mode 100644
index 5f5e0294d..000000000
--- a/src/layout/generic/ViewportFrame-cpp.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-diff --git a/layout/generic/ViewportFrame.cpp b/layout/generic/ViewportFrame.cpp
-index 9d1c25c3834da50fd7dfa3a9583144f5817ee231..08b69a63ea3a8067861984fa2fcd25435c921c0d 100644
---- a/layout/generic/ViewportFrame.cpp
-+++ b/layout/generic/ViewportFrame.cpp
-@@ -23,6 +23,7 @@
- #include "nsLayoutUtils.h"
- #include "nsPlaceholderFrame.h"
- #include "nsSubDocumentFrame.h"
-+#include "mozilla/nsZenBoostsBackend.h"
-
- using namespace mozilla;
-
-@@ -291,15 +292,20 @@ ViewportFrame::BuildDisplayListForViewTransitionsAndNACTopLayer(
- }
- }
-
-+ bool isAnonContent = false;
- if (dom::Element* container = doc->GetCustomContentContainer()) {
- if (nsIFrame* frame = container->GetPrimaryFrame()) {
- MOZ_ASSERT(frame->StyleDisplay()->mTopLayer != StyleTopLayer::None,
- "ua.css should ensure this");
- MOZ_ASSERT(frame->HasAnyStateBits(NS_FRAME_OUT_OF_FLOW));
-+ isAnonContent = frame->ContentIsRootOfNativeAnonymousSubtree();
- BuildDisplayListForTopLayerFrame(aBuilder, frame, &topLayerList);
- }
- }
-
-+ if (auto zenBackend = zen::nsZenBoostsBackend::GetInstance()) {
-+ zenBackend->mCurrentFrameIsAnonymousContent = isAnonContent;
-+ }
- return MaybeWrapTopLayerList(
- aBuilder, uint16_t(TopLayerIndex::ViewTransitionsAndAnonymousContent),
- topLayerList);
diff --git a/src/layout/generic/nsContainerFrame-cpp.patch b/src/layout/generic/nsContainerFrame-cpp.patch
new file mode 100644
index 000000000..e8d69b552
--- /dev/null
+++ b/src/layout/generic/nsContainerFrame-cpp.patch
@@ -0,0 +1,47 @@
+diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp
+index c27fec39f9e32e61f0e335e5880ce3e97074965b..7b4f7760dcf92ead74c9f89cfc7a067892af9e34 100644
+--- a/layout/generic/nsContainerFrame.cpp
++++ b/layout/generic/nsContainerFrame.cpp
+@@ -349,7 +349,8 @@ class nsDisplaySelectionOverlay final : public nsPaintedDisplayItem {
+ nsDisplayListBuilder* aDisplayListBuilder) override;
+ NS_DISPLAY_DECL_NAME("SelectionOverlay", TYPE_SELECTION_OVERLAY)
+
+- static DeviceColor ComputeColorFromSelectionStyle(const ComputedStyle&);
++ static DeviceColor ComputeColorFromSelectionStyle(const ComputedStyle&,
++ const nsIFrame*);
+ static DeviceColor ApplyTransparencyIfNecessary(nscolor);
+
+ private:
+@@ -371,9 +372,9 @@ DeviceColor nsDisplaySelectionOverlay::ApplyTransparencyIfNecessary(
+ }
+
+ DeviceColor nsDisplaySelectionOverlay::ComputeColorFromSelectionStyle(
+- const ComputedStyle& aStyle) {
+- return ApplyTransparencyIfNecessary(
+- aStyle.GetVisitedDependentColor(&nsStyleBackground::mBackgroundColor));
++ const ComputedStyle& aStyle, const nsIFrame* aFrame) {
++ return ApplyTransparencyIfNecessary(aStyle.GetVisitedDependentColor(
++ &nsStyleBackground::mBackgroundColor, aFrame));
+ }
+
+ void nsDisplaySelectionOverlay::Paint(nsDisplayListBuilder* aBuilder,
+@@ -472,7 +473,8 @@ void nsContainerFrame::DisplaySelectionOverlay(nsDisplayListBuilder* aBuilder,
+ ComputeHighlightSelectionStyle(sd->mHighlightData.mHighlightName)) {
+ aList->AppendNewToTopWithIndex(
+ aBuilder, this, index++,
+- nsDisplaySelectionOverlay::ComputeColorFromSelectionStyle(*style));
++ nsDisplaySelectionOverlay::ComputeColorFromSelectionStyle(*style,
++ this));
+ }
+ }
+
+@@ -480,7 +482,8 @@ void nsContainerFrame::DisplaySelectionOverlay(nsDisplayListBuilder* aBuilder,
+ if (normal) {
+ DeviceColor color;
+ if (RefPtr style = ComputeSelectionStyle(selectionValue)) {
+- color = nsDisplaySelectionOverlay::ComputeColorFromSelectionStyle(*style);
++ color = nsDisplaySelectionOverlay::ComputeColorFromSelectionStyle(*style,
++ this);
+ } else {
+ LookAndFeel::ColorID colorID;
+ if (selectionValue == nsISelectionController::SELECTION_ON) {
diff --git a/src/layout/generic/nsIFrame-h.patch b/src/layout/generic/nsIFrame-h.patch
new file mode 100644
index 000000000..be0b97926
--- /dev/null
+++ b/src/layout/generic/nsIFrame-h.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h
+index 588b00d7ee115f0a7513e357af7ab5eee28311c1..bf07b69c7e7957e6e558403e069f16e2dec3cad0 100644
+--- a/layout/generic/nsIFrame.h
++++ b/layout/generic/nsIFrame.h
+@@ -1008,7 +1008,7 @@ class nsIFrame : public nsQueryFrame {
+ /** Also forward GetVisitedDependentColor to the style */
+ template
+ nscolor GetVisitedDependentColor(T S::* aField) {
+- return mComputedStyle->GetVisitedDependentColor(aField);
++ return mComputedStyle->GetVisitedDependentColor(aField, this);
+ }
+
+ /**
diff --git a/src/layout/generic/nsImageFrame-cpp.patch b/src/layout/generic/nsImageFrame-cpp.patch
new file mode 100644
index 000000000..d64f3fd46
--- /dev/null
+++ b/src/layout/generic/nsImageFrame-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/generic/nsImageFrame.cpp b/layout/generic/nsImageFrame.cpp
+index c4ff60477e3061aeeecbdedb5ad8054d3808ab6e..40857d430eda576c4fca613857860f32abb39e2d 100644
+--- a/layout/generic/nsImageFrame.cpp
++++ b/layout/generic/nsImageFrame.cpp
+@@ -1764,7 +1764,7 @@ void nsImageFrame::DisplayAltText(nsPresContext* aPresContext,
+ const nsRect& aRect) {
+ // Set font and color
+ aRenderingContext.SetColor(
+- sRGBColor::FromABGR(StyleText()->mColor.ToColor()));
++ sRGBColor::FromABGR(StyleText()->mColor.ToColor(this)));
+ RefPtr fm =
+ nsLayoutUtils::GetInflatedFontMetricsForFrame(this);
+
diff --git a/src/layout/generic/nsTextFrame-cpp.patch b/src/layout/generic/nsTextFrame-cpp.patch
new file mode 100644
index 000000000..0c8afe005
--- /dev/null
+++ b/src/layout/generic/nsTextFrame-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp
+index e7f7943a19d3ac71872d0a8439b6ed90e8fd423d..eb3e84fabc67d95b6d194b5aaf3aaef7c38480c0 100644
+--- a/layout/generic/nsTextFrame.cpp
++++ b/layout/generic/nsTextFrame.cpp
+@@ -6381,7 +6381,7 @@ void nsTextFrame::DrawSelectionDecorations(
+ computedStyleFromPseudo->StyleTextReset()->mTextDecorationStyle;
+ params.color =
+ computedStyleFromPseudo->StyleTextReset()
+- ->mTextDecorationColor.CalcColor(*computedStyleFromPseudo);
++ ->mTextDecorationColor.CalcColor(*computedStyleFromPseudo, this);
+ params.decoration =
+ computedStyleFromPseudo->StyleTextReset()->mTextDecorationLine;
+ params.descentLimit = -1.f;
diff --git a/src/layout/generic/nsTextPaintStyle-cpp.patch b/src/layout/generic/nsTextPaintStyle-cpp.patch
new file mode 100644
index 000000000..9ff579abb
--- /dev/null
+++ b/src/layout/generic/nsTextPaintStyle-cpp.patch
@@ -0,0 +1,67 @@
+diff --git a/layout/generic/nsTextPaintStyle.cpp b/layout/generic/nsTextPaintStyle.cpp
+index 5d1bf44687e925aff67f44c8e0629f7f06e84e98..1fa60a4d91edc60ba733cefc5f73ab8b7684d02a 100644
+--- a/layout/generic/nsTextPaintStyle.cpp
++++ b/layout/generic/nsTextPaintStyle.cpp
+@@ -240,7 +240,7 @@ bool nsTextPaintStyle::GetTargetTextColor(nscolor* aForeColor) {
+ (mTargetTextPseudoStyle->HasAuthorSpecifiedTextColor() ||
+ mTargetTextPseudoStyle->HasAuthorSpecifiedBorderOrBackground())) {
+ *aForeColor = mTargetTextPseudoStyle->GetVisitedDependentColor(
+- &nsStyleText::mWebkitTextFillColor);
++ &nsStyleText::mWebkitTextFillColor, mFrame);
+ return mTargetTextPseudoStyle->HasAuthorSpecifiedTextColor();
+ }
+ *aForeColor = LookAndFeel::Color(
+@@ -257,7 +257,7 @@ bool nsTextPaintStyle::GetTargetTextBackgroundColor(nscolor* aBackColor) {
+ (mTargetTextPseudoStyle->HasAuthorSpecifiedTextColor() ||
+ mTargetTextPseudoStyle->HasAuthorSpecifiedBorderOrBackground())) {
+ *aBackColor = mTargetTextPseudoStyle->GetVisitedDependentColor(
+- &nsStyleBackground::mBackgroundColor);
++ &nsStyleBackground::mBackgroundColor, mFrame);
+ return NS_GET_A(*aBackColor) != 0;
+ }
+ *aBackColor = LookAndFeel::Color(
+@@ -295,7 +295,8 @@ bool nsTextPaintStyle::GetCustomHighlightTextColor(nsAtom* aHighlightName,
+ return false;
+ }
+
+- *aForeColor = highlightStyle->GetVisitedDependentColor(&nsStyleText::mColor);
++ *aForeColor =
++ highlightStyle->GetVisitedDependentColor(&nsStyleText::mColor, mFrame);
+
+ return highlightStyle->HasAuthorSpecifiedTextColor();
+ }
+@@ -317,7 +318,7 @@ bool nsTextPaintStyle::GetCustomHighlightBackgroundColor(nsAtom* aHighlightName,
+ }
+
+ *aBackColor = highlightStyle->GetVisitedDependentColor(
+- &nsStyleBackground::mBackgroundColor);
++ &nsStyleBackground::mBackgroundColor, mFrame);
+ return NS_GET_A(*aBackColor) != 0;
+ }
+
+@@ -466,19 +467,19 @@ bool nsTextPaintStyle::InitSelectionColorsAndShadow() {
+ // this is web content or chrome content. See bug 2029839.
+ if (!mFrame->PresContext()->Document()->ChromeRulesEnabled()) {
+ mSelectionBGColor = mSelectionPseudoStyle->GetVisitedDependentColor(
+- &nsStyleBackground::mBackgroundColor);
+- mSelectionTextColor =
+- mSelectionPseudoStyle->GetVisitedDependentColor(&nsStyleText::mColor);
++ &nsStyleBackground::mBackgroundColor, mFrame);
++ mSelectionTextColor = mSelectionPseudoStyle->GetVisitedDependentColor(
++ &nsStyleText::mColor, mFrame);
+ return true;
+ }
+
+ if (nscolor bgColor = mSelectionPseudoStyle->GetVisitedDependentColor(
+- &nsStyleBackground::mBackgroundColor);
++ &nsStyleBackground::mBackgroundColor, mFrame);
+ mSelectionPseudoStyle->HasAuthorSpecifiedTextColor() ||
+ NS_GET_A(bgColor) > 0) {
+ mSelectionBGColor = bgColor;
+- mSelectionTextColor =
+- mSelectionPseudoStyle->GetVisitedDependentColor(&nsStyleText::mColor);
++ mSelectionTextColor = mSelectionPseudoStyle->GetVisitedDependentColor(
++ &nsStyleText::mColor, mFrame);
+ return true;
+ }
+ }
diff --git a/src/layout/mathml/nsMathMLChar-cpp.patch b/src/layout/mathml/nsMathMLChar-cpp.patch
new file mode 100644
index 000000000..a541b1a68
--- /dev/null
+++ b/src/layout/mathml/nsMathMLChar-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/mathml/nsMathMLChar.cpp b/layout/mathml/nsMathMLChar.cpp
+index befaf7fed81a486f61e1186775c138ce5473a057..c7eb36dc9fcd06f8641d2d1a974e75eb24e07669 100644
+--- a/layout/mathml/nsMathMLChar.cpp
++++ b/layout/mathml/nsMathMLChar.cpp
+@@ -1686,7 +1686,7 @@ void nsMathMLChar::PaintForeground(nsIFrame* aForFrame,
+
+ // Set color ...
+ nscolor fgColor = computedStyle->GetVisitedDependentColor(
+- &nsStyleText::mWebkitTextFillColor);
++ &nsStyleText::mWebkitTextFillColor, aForFrame);
+ if (aIsSelected) {
+ // get color to use for selection from the look&feel object
+ fgColor = LookAndFeel::Color(LookAndFeel::ColorID::Highlighttext, aForFrame,
diff --git a/src/layout/painting/nsCSSRendering-cpp.patch b/src/layout/painting/nsCSSRendering-cpp.patch
new file mode 100644
index 000000000..3adf1e693
--- /dev/null
+++ b/src/layout/painting/nsCSSRendering-cpp.patch
@@ -0,0 +1,87 @@
+diff --git a/layout/painting/nsCSSRendering.cpp b/layout/painting/nsCSSRendering.cpp
+index a581b039a8681f7d8191edfad100d287af38592e..4cd3d6695a04a42d806c36f8d5a324cac9efda34 100644
+--- a/layout/painting/nsCSSRendering.cpp
++++ b/layout/painting/nsCSSRendering.cpp
+@@ -598,7 +598,8 @@ void nsCSSRendering::ComputePixelRadii(const nsRectCornerRadii& aRadii,
+ }
+ }
+
+-static Maybe GetBorderIfVisited(const ComputedStyle& aStyle) {
++static Maybe GetBorderIfVisited(const ComputedStyle& aStyle,
++ const nsIFrame* aFrame) {
+ Maybe result;
+ // Don't check RelevantLinkVisited here, since we want to take the
+ // same amount of time whether or not it's true.
+@@ -611,7 +612,7 @@ static Maybe GetBorderIfVisited(const ComputedStyle& aStyle) {
+ auto& newBorder = result.ref();
+ for (const auto side : mozilla::AllPhysicalSides()) {
+ nscolor color = aStyle.GetVisitedDependentColor(
+- nsStyleBorder::BorderColorFieldFor(side));
++ nsStyleBorder::BorderColorFieldFor(side), aFrame);
+ newBorder.BorderColorFor(side) = StyleColor::FromColor(color);
+ }
+
+@@ -624,7 +625,7 @@ ImgDrawResult nsCSSRendering::PaintBorder(
+ ComputedStyle* aStyle, PaintBorderFlags aFlags, Sides aSkipSides) {
+ AUTO_PROFILER_LABEL("nsCSSRendering::PaintBorder", GRAPHICS);
+
+- Maybe visitedBorder = GetBorderIfVisited(*aStyle);
++ Maybe visitedBorder = GetBorderIfVisited(*aStyle, aForFrame);
+ return PaintBorderWithStyleBorder(
+ aPresContext, aRenderingContext, aForFrame, aDirtyRect, aBorderArea,
+ visitedBorder.refOr(*aStyle->StyleBorder()), aStyle, aFlags, aSkipSides);
+@@ -634,7 +635,7 @@ Maybe nsCSSRendering::CreateBorderRenderer(
+ nsPresContext* aPresContext, DrawTarget* aDrawTarget, nsIFrame* aForFrame,
+ const nsRect& aDirtyRect, const nsRect& aBorderArea, ComputedStyle* aStyle,
+ bool* aOutBorderIsEmpty, Sides aSkipSides) {
+- Maybe visitedBorder = GetBorderIfVisited(*aStyle);
++ Maybe visitedBorder = GetBorderIfVisited(*aStyle, aForFrame);
+ return CreateBorderRendererWithStyleBorder(
+ aPresContext, aDrawTarget, aForFrame, aDirtyRect, aBorderArea,
+ visitedBorder.refOr(*aStyle->StyleBorder()), aStyle, aOutBorderIsEmpty,
+@@ -649,7 +650,7 @@ ImgDrawResult nsCSSRendering::CreateWebRenderCommandsForBorder(
+ mozilla::layers::RenderRootStateManager* aManager,
+ nsDisplayListBuilder* aDisplayListBuilder) {
+ const auto* style = aForFrame->Style();
+- Maybe visitedBorder = GetBorderIfVisited(*style);
++ Maybe visitedBorder = GetBorderIfVisited(*style, aForFrame);
+ return nsCSSRendering::CreateWebRenderCommandsForBorderWithStyleBorder(
+ aItem, aForFrame, aBorderArea, aBuilder, aResources, aSc, aManager,
+ aDisplayListBuilder, visitedBorder.refOr(*style->StyleBorder()));
+@@ -785,7 +786,7 @@ static nsCSSBorderRenderer ConstructBorderRenderer(
+ // pull out styles, colors
+ for (const auto i : mozilla::AllPhysicalSides()) {
+ borderStyles[i] = aStyleBorder.GetBorderStyle(i);
+- borderColors[i] = aStyleBorder.BorderColorFor(i).CalcColor(*aStyle);
++ borderColors[i] = aStyleBorder.BorderColorFor(i).CalcColor(*aStyle, aForFrame);
+ }
+
+ PrintAsFormatString(
+@@ -1005,7 +1006,7 @@ nsCSSRendering::CreateBorderRendererForNonThemedOutline(
+ // This handles treating the initial color as 'currentColor'; if we
+ // ever want 'invert' back we'll need to do a bit of work here too.
+ nscolor outlineColor =
+- aStyle->GetVisitedDependentColor(&nsStyleOutline::mOutlineColor);
++ aStyle->GetVisitedDependentColor(&nsStyleOutline::mOutlineColor, aForFrame);
+ nscolor outlineColors[4] = {outlineColor, outlineColor, outlineColor,
+ outlineColor};
+
+@@ -2341,7 +2342,7 @@ static Maybe CalcScrollbarColor(nsIFrame* aFrame,
+ const auto& color = aKind == ScrollbarColorKind::Thumb
+ ? colors.AsColors().thumb
+ : colors.AsColors().track;
+- return Some(color.CalcColor(*scrollbarStyle));
++ return Some(color.CalcColor(*scrollbarStyle, aFrame));
+ }
+
+ static nscolor GetBackgroundColor(nsIFrame* aFrame,
+@@ -2367,7 +2368,8 @@ static nscolor GetBackgroundColor(nsIFrame* aFrame,
+ default:
+ break;
+ }
+- return aStyle->GetVisitedDependentColor(&nsStyleBackground::mBackgroundColor);
++ return aStyle->GetVisitedDependentColor(&nsStyleBackground::mBackgroundColor,
++ aFrame);
+ }
+
+ nscolor nsCSSRendering::DetermineBackgroundColor(nsPresContext* aPresContext,
diff --git a/src/layout/painting/nsDisplayList-cpp.patch b/src/layout/painting/nsDisplayList-cpp.patch
deleted file mode 100644
index 716ccb545..000000000
--- a/src/layout/painting/nsDisplayList-cpp.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-diff --git a/layout/painting/nsDisplayList.cpp b/layout/painting/nsDisplayList.cpp
-index 4488dc2025da64fbad0e0ec998793a476de640ef..82990853e7279723666635ab8d9a929ede3f3aca 100644
---- a/layout/painting/nsDisplayList.cpp
-+++ b/layout/painting/nsDisplayList.cpp
-@@ -81,6 +81,7 @@
- #include "mozilla/layers/WebRenderLayerManager.h"
- #include "mozilla/layers/WebRenderMessages.h"
- #include "mozilla/layers/WebRenderScrollData.h"
-+#include "mozilla/nsZenBoostsBackend.h"
- #include "nsCSSProps.h"
- #include "nsCSSRendering.h"
- #include "nsCSSRenderingGradients.h"
-@@ -1252,6 +1253,10 @@ void nsDisplayListBuilder::EnterPresShell(const nsIFrame* aReferenceFrame,
- docShell->GetWindowDraggingAllowed(&mWindowDraggingAllowed);
- }
-
-+ if (auto zenBackend = zen::nsZenBoostsBackend::GetInstance(); zenBackend && !mIsInChromePresContext) {
-+ zenBackend->onPresShellEntered(pc->Document());
-+ }
-+
- state->mTouchEventPrefEnabledDoc = dom::TouchEvent::PrefEnabled(docShell);
-
- if (auto* vt = pc->Document()->GetActiveViewTransition()) {
diff --git a/src/layout/style/ComputedStyle-cpp.patch b/src/layout/style/ComputedStyle-cpp.patch
new file mode 100644
index 000000000..6c403dde6
--- /dev/null
+++ b/src/layout/style/ComputedStyle-cpp.patch
@@ -0,0 +1,65 @@
+diff --git a/layout/style/ComputedStyle.cpp b/layout/style/ComputedStyle.cpp
+index 18308d7891aab4ff0542e774190abeed6aad7c59..453da8ffa14ee5f31fbce873721779cbadce240d 100644
+--- a/layout/style/ComputedStyle.cpp
++++ b/layout/style/ComputedStyle.cpp
+@@ -285,29 +285,32 @@ static nscolor GetVisitedDependentColorInternal(const ComputedStyle& aStyle,
+ }
+
+ static nscolor ExtractColor(const ComputedStyle& aStyle,
+- const StyleAbsoluteColor& aColor) {
+- return aColor.ToColor();
++ const StyleAbsoluteColor& aColor,
++ const nsIFrame* aFrame) {
++ return aColor.ToColor(aFrame);
+ }
+
+ static nscolor ExtractColor(const ComputedStyle& aStyle,
+- const StyleColor& aColor) {
+- return aColor.CalcColor(aStyle);
++ const StyleColor& aColor, const nsIFrame* aFrame) {
++ return aColor.CalcColor(aStyle, aFrame);
+ }
+
+ // Currently caret-color, the only property in the list which is a ColorOrAuto,
+ // always maps auto to currentcolor.
+ static nscolor ExtractColor(const ComputedStyle& aStyle,
+- const StyleColorOrAuto& aColor) {
++ const StyleColorOrAuto& aColor,
++ const nsIFrame* aFrame) {
+ if (aColor.IsAuto()) {
+- return ExtractColor(aStyle, StyleColor::CurrentColor());
++ return ExtractColor(aStyle, StyleColor::CurrentColor(), aFrame);
+ }
+- return ExtractColor(aStyle, aColor.AsColor());
++ return ExtractColor(aStyle, aColor.AsColor(), aFrame);
+ }
+
+ static nscolor ExtractColor(const ComputedStyle& aStyle,
+- const StyleSVGPaint& aPaintServer) {
++ const StyleSVGPaint& aPaintServer,
++ const nsIFrame* aFrame) {
+ return aPaintServer.kind.IsColor()
+- ? ExtractColor(aStyle, aPaintServer.kind.AsColor())
++ ? ExtractColor(aStyle, aPaintServer.kind.AsColor(), aFrame)
+ : NS_RGBA(0, 0, 0, 0);
+ }
+
+@@ -315,14 +318,14 @@ static nscolor ExtractColor(const ComputedStyle& aStyle,
+ #define GENERATE_VISITED_COLOR_TEMPLATE(name_, fields_) \
+ template <> \
+ nscolor ComputedStyle::GetVisitedDependentColor( \
+- decltype(nsStyle##name_::MOZ_ARG_1 fields_) nsStyle##name_::* aField) \
+- const { \
++ decltype(nsStyle##name_::MOZ_ARG_1 fields_) nsStyle##name_::* aField, \
++ const nsIFrame* aFrame) const { \
+ MOZ_ASSERT(MOZ_FOR_EACH(STYLE_FIELD, (nsStyle##name_, ), fields_) false, \
+ "Getting visited-dependent color for a field in nsStyle" #name_ \
+ " which is not listed in nsCSSVisitedDependentPropList.h"); \
+ return GetVisitedDependentColorInternal( \
+- *this, [aField](const ComputedStyle& aStyle) { \
+- return ExtractColor(aStyle, aStyle.Style##name_()->*aField); \
++ *this, [aField, aFrame](const ComputedStyle& aStyle) { \
++ return ExtractColor(aStyle, aStyle.Style##name_()->*aField, aFrame); \
+ }); \
+ }
+ FOR_EACH_VISITED_DEPENDENT_STYLE_STRUCT(GENERATE_VISITED_COLOR_TEMPLATE)
diff --git a/src/layout/style/ComputedStyle-h.patch b/src/layout/style/ComputedStyle-h.patch
new file mode 100644
index 000000000..16345644c
--- /dev/null
+++ b/src/layout/style/ComputedStyle-h.patch
@@ -0,0 +1,22 @@
+diff --git a/layout/style/ComputedStyle.h b/layout/style/ComputedStyle.h
+index 661ec439dea1bc59dbc4507c9788df8821ea9086..7aa21f5388d6e3b5f1a85e38acdd646254ca8b01 100644
+--- a/layout/style/ComputedStyle.h
++++ b/layout/style/ComputedStyle.h
+@@ -18,6 +18,7 @@
+
+ enum nsChangeHint : uint32_t;
+ class nsWindowSizes;
++class nsIFrame;
+
+ #define FORWARD_STRUCT(name_) struct nsStyle##name_;
+ FOR_EACH_STYLE_STRUCT(FORWARD_STRUCT, FORWARD_STRUCT)
+@@ -338,7 +339,8 @@ class ComputedStyle {
+ * been listed in nsCSSVisitedDependentPropList.h.
+ */
+ template
+- nscolor GetVisitedDependentColor(T S::* aField) const;
++ nscolor GetVisitedDependentColor(T S::* aField,
++ const nsIFrame* aFrame) const;
+
+ /**
+ * aColors should be a two element array of nscolor in which the first
diff --git a/src/layout/style/StyleColor-cpp.patch b/src/layout/style/StyleColor-cpp.patch
index ef81c99dc..7f0e9423b 100644
--- a/src/layout/style/StyleColor-cpp.patch
+++ b/src/layout/style/StyleColor-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/layout/style/StyleColor.cpp b/layout/style/StyleColor.cpp
-index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..3b2118e224141f5151a31ac663dfbe17864ef182 100644
+index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..234a5fc3d94c341d6f8aea8f619661054d2f6a49 100644
--- a/layout/style/StyleColor.cpp
+++ b/layout/style/StyleColor.cpp
@@ -8,6 +8,7 @@
@@ -10,7 +10,34 @@ index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..3b2118e224141f5151a31ac663dfbe17
namespace mozilla {
-@@ -68,10 +69,11 @@ nscolor StyleAbsoluteColor::ToColor() const {
+@@ -44,13 +45,14 @@ nscolor StyleColor::CalcColor(
+ }
+
+ template <>
+-nscolor StyleColor::CalcColor(const ComputedStyle& aStyle) const {
+- return ResolveColor(aStyle.StyleText()->mColor).ToColor();
++nscolor StyleColor::CalcColor(const ComputedStyle& aStyle,
++ const nsIFrame* aFrame) const {
++ return ResolveColor(aStyle.StyleText()->mColor).ToColor(aFrame);
+ }
+
+ template <>
+ nscolor StyleColor::CalcColor(const nsIFrame* aFrame) const {
+- return ResolveColor(aFrame->StyleText()->mColor).ToColor();
++ return ResolveColor(aFrame->StyleText()->mColor).ToColor(aFrame);
+ }
+
+ StyleAbsoluteColor StyleAbsoluteColor::ToColorSpace(
+@@ -58,7 +60,7 @@ StyleAbsoluteColor StyleAbsoluteColor::ToColorSpace(
+ return Servo_ConvertColorSpace(this, aColorSpace);
+ }
+
+-nscolor StyleAbsoluteColor::ToColor() const {
++nscolor StyleAbsoluteColor::ToColor(const nsIFrame* aFrame) const {
+ auto srgb = ToColorSpace(StyleColorSpace::Srgb);
+
+ // TODO(tlouw): Needs gamut mapping here. Right now we just hard clip the
+@@ -68,10 +70,12 @@ nscolor StyleAbsoluteColor::ToColor() const {
auto green = std::clamp(srgb.components._1, 0.0f, 1.0f);
auto blue = std::clamp(srgb.components._2, 0.0f, 1.0f);
@@ -20,7 +47,8 @@ index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..3b2118e224141f5151a31ac663dfbe17
nsStyleUtil::FloatToColorComponent(green),
nsStyleUtil::FloatToColorComponent(blue),
- nsStyleUtil::FloatToColorComponent(srgb.alpha));
-+ nsStyleUtil::FloatToColorComponent(srgb.alpha)));
++ nsStyleUtil::FloatToColorComponent(srgb.alpha)),
++ aFrame);
}
} // namespace mozilla
diff --git a/src/layout/style/StyleColorInlines-h.patch b/src/layout/style/StyleColorInlines-h.patch
new file mode 100644
index 000000000..839901a46
--- /dev/null
+++ b/src/layout/style/StyleColorInlines-h.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/style/StyleColorInlines.h b/layout/style/StyleColorInlines.h
+index 332f715ca2a11c98afcb80a870da98c038a7e4f0..a5bddde67165fcb40d40b3aec76a9d19d8880d64 100644
+--- a/layout/style/StyleColorInlines.h
++++ b/layout/style/StyleColorInlines.h
+@@ -66,7 +66,7 @@ template <>
+ nscolor StyleColor::CalcColor(nscolor) const;
+
+ template <>
+-nscolor StyleColor::CalcColor(const ComputedStyle&) const;
++nscolor StyleColor::CalcColor(const ComputedStyle&, const nsIFrame*) const;
+
+ template <>
+ nscolor StyleColor::CalcColor(const nsIFrame*) const;
diff --git a/src/layout/svg/FilterInstance-cpp.patch b/src/layout/svg/FilterInstance-cpp.patch
new file mode 100644
index 000000000..3ff53172b
--- /dev/null
+++ b/src/layout/svg/FilterInstance-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/svg/FilterInstance.cpp b/layout/svg/FilterInstance.cpp
+index 499f824aaeed6ac014974ff11848cf40ac0bba09..bec724baf0ae97cd9dea59a1609d8ea9baaad715 100644
+--- a/layout/svg/FilterInstance.cpp
++++ b/layout/svg/FilterInstance.cpp
+@@ -1681,7 +1681,7 @@ nsresult FilterInstance::BuildPrimitivesForFilter(
+ // If we don't have a frame, use opaque black for shadows with unspecified
+ // shadow colors.
+ nscolor shadowFallbackColor =
+- mTargetFrame ? mTargetFrame->StyleText()->mColor.ToColor()
++ mTargetFrame ? mTargetFrame->StyleText()->mColor.ToColor(mTargetFrame)
+ : NS_RGB(0, 0, 0);
+
+ CSSFilterInstance cssFilterInstance(aFilter, shadowFallbackColor,
diff --git a/src/layout/svg/SVGTextFrame-cpp.patch b/src/layout/svg/SVGTextFrame-cpp.patch
new file mode 100644
index 000000000..33e45c798
--- /dev/null
+++ b/src/layout/svg/SVGTextFrame-cpp.patch
@@ -0,0 +1,28 @@
+diff --git a/layout/svg/SVGTextFrame.cpp b/layout/svg/SVGTextFrame.cpp
+index 93f6f2a704734314586fa16b6a45b434f9c2304d..4503ee2b48be39bb2e61962316ef43ad292a7b27 100644
+--- a/layout/svg/SVGTextFrame.cpp
++++ b/layout/svg/SVGTextFrame.cpp
+@@ -2662,9 +2662,9 @@ void SVGTextDrawPathCallbacks::ApplyOpacity(
+ sRGBColor& aColor, const StyleSVGPaint& aPaint,
+ const StyleSVGOpacity& aOpacity) const {
+ if (aPaint.kind.tag == StyleSVGPaintKind::Tag::Color) {
+- aColor.a *=
+- sRGBColor::FromABGR(aPaint.kind.AsColor().CalcColor(*mFrame->Style()))
+- .a;
++ aColor.a *= sRGBColor::FromABGR(
++ aPaint.kind.AsColor().CalcColor(*mFrame->Style(), mFrame))
++ .a;
+ }
+ aColor.a *= SVGUtils::GetOpacity(aOpacity, mContextPaint);
+ }
+@@ -5076,8 +5076,8 @@ bool SVGTextFrame::ShouldRenderAsPath(nsTextFrame* aFrame,
+ // It's possible nsTextFrame will support non-opaque shadows in the future,
+ // in which case this test can be removed.
+ if (style->mFill.kind.IsColor() && aFrame->StyleText()->HasTextShadow() &&
+- NS_GET_A(style->mFill.kind.AsColor().CalcColor(*aFrame->Style())) !=
+- 0xFF) {
++ NS_GET_A(style->mFill.kind.AsColor().CalcColor(*aFrame->Style(),
++ aFrame)) != 0xFF) {
+ return true;
+ }
+
diff --git a/src/layout/tables/nsTableFrame-cpp.patch b/src/layout/tables/nsTableFrame-cpp.patch
new file mode 100644
index 000000000..7c480c702
--- /dev/null
+++ b/src/layout/tables/nsTableFrame-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp
+index 7c39ea94392dc158656621dfbee1be72bbcd46f8..e2fe47662b92ac6fb7fe2177d1d2cdab500bb969 100644
+--- a/layout/tables/nsTableFrame.cpp
++++ b/layout/tables/nsTableFrame.cpp
+@@ -4088,7 +4088,7 @@ static void GetColorAndStyle(const nsIFrame* aFrame, WritingMode aTableWM,
+ return;
+ }
+ *aColor = aFrame->Style()->GetVisitedDependentColor(
+- nsStyleBorder::BorderColorFieldFor(physicalSide));
++ nsStyleBorder::BorderColorFieldFor(physicalSide), aFrame);
+
+ if (aWidth) {
+ *aWidth = styleData->GetComputedBorderWidth(physicalSide);
diff --git a/src/layout/xul/tree/nsTreeBodyFrame-cpp.patch b/src/layout/xul/tree/nsTreeBodyFrame-cpp.patch
new file mode 100644
index 000000000..30fc951a7
--- /dev/null
+++ b/src/layout/xul/tree/nsTreeBodyFrame-cpp.patch
@@ -0,0 +1,23 @@
+diff --git a/layout/xul/tree/nsTreeBodyFrame.cpp b/layout/xul/tree/nsTreeBodyFrame.cpp
+index b6aa10336e7994c830e0326298820c3a534f8094..b3ddb7b9b3ceb8b868e7e48e02fdb70a876c9019 100644
+--- a/layout/xul/tree/nsTreeBodyFrame.cpp
++++ b/layout/xul/tree/nsTreeBodyFrame.cpp
+@@ -2865,7 +2865,8 @@ ImgDrawResult nsTreeBodyFrame::PaintCell(
+
+ const nsStyleBorder* borderStyle = lineContext->StyleBorder();
+ // Resolve currentcolor values against the treeline context
+- nscolor color = borderStyle->mBorderLeftColor.CalcColor(*lineContext);
++ nscolor color =
++ borderStyle->mBorderLeftColor.CalcColor(*lineContext, this);
+ ColorPattern colorPatt(ToDeviceColor(color));
+
+ StyleBorderStyle style = borderStyle->GetBorderStyle(eSideLeft);
+@@ -3340,7 +3341,7 @@ ImgDrawResult nsTreeBodyFrame::PaintText(
+ }
+
+ aRenderingContext.SetColor(
+- sRGBColor::FromABGR(textContext->StyleText()->mColor.ToColor()));
++ sRGBColor::FromABGR(textContext->StyleText()->mColor.ToColor(this)));
+ nsLayoutUtils::DrawString(
+ this, *fontMet, &aRenderingContext, text.get(), text.Length(),
+ textRect.TopLeft() + nsPoint(0, baseline), cellContext);
diff --git a/src/servo/ports/geckolib/cbindgen-toml.patch b/src/servo/ports/geckolib/cbindgen-toml.patch
new file mode 100644
index 000000000..0bf358476
--- /dev/null
+++ b/src/servo/ports/geckolib/cbindgen-toml.patch
@@ -0,0 +1,30 @@
+diff --git a/servo/ports/geckolib/cbindgen.toml b/servo/ports/geckolib/cbindgen.toml
+index e9ae0149e80a241b2a32ce445deb923af2fac445..464f4e8b853d26bd2da327de8bf8bb50e5ab8599 100644
+--- a/servo/ports/geckolib/cbindgen.toml
++++ b/servo/ports/geckolib/cbindgen.toml
+@@ -679,9 +679,9 @@ renaming_overrides_prefixing = true
+ nscolor CalcColor(const nsIFrame*) const;
+ /**
+ * Compute the final color, taking into account the foreground color from the
+- * style.
++ * style. The frame, when supplied, is used to resolve Zen boosts.
+ */
+- nscolor CalcColor(const ComputedStyle&) const;
++ nscolor CalcColor(const ComputedStyle&, const nsIFrame* = nullptr) const;
+ /**
+ * Compute the final color, making the argument the foreground color.
+ */
+@@ -704,9 +704,11 @@ renaming_overrides_prefixing = true
+
+ /**
+ * Convert this color to an nscolor. The color will be converted to sRGB first
+- * if required.
++ * if required. The frame, when supplied, is used to resolve Zen boosts; pass
++ * the frame the color is being resolved for so boosts can be derived from its
++ * document, or null to skip boost resolution.
+ */
+- nscolor ToColor() const;
++ nscolor ToColor(const nsIFrame* = nullptr) const;
+ """
+
+ "OwnedSlice" = """
diff --git a/src/zen/boosts/actors/ZenBoostsChild.sys.mjs b/src/zen/boosts/actors/ZenBoostsChild.sys.mjs
index 637d81909..597a74c09 100644
--- a/src/zen/boosts/actors/ZenBoostsChild.sys.mjs
+++ b/src/zen/boosts/actors/ZenBoostsChild.sys.mjs
@@ -70,6 +70,17 @@ export class ZenBoostsChild extends JSWindowActorChild {
static PREVENTABLE_SET = new Set(ZenBoostsChild.PREVENTABLE_EVENTS);
+ actorCreated() {
+ this.#applyBoostForPageIfAvailable();
+ }
+
+ didDestroy() {
+ if (this.#currentState === ZenBoostsChild.STATES.ZAP) {
+ this.disableZapMode();
+ }
+ this.#removeEventListeners();
+ }
+
/**
* Inverse of https://searchfox.org/firefox-main/rev/1a8c62b86277005f907151bc5389cf5c5091e76f/gfx/src/nsColor.h#23-27
*
@@ -179,28 +190,6 @@ export class ZenBoostsChild extends JSWindowActorChild {
return [h * 60, s, l];
}
- /**
- * Handles DOM events for the actor. Applies boost settings when a document
- * element is inserted.
- *
- * @param {Event} event - The DOM event to handle.
- */
- handleEvent(event) {
- switch (event.type) {
- case "unload":
- if (this.#currentState === ZenBoostsChild.STATES.ZAP) {
- this.disableZapMode();
- }
- this.#removeEventListeners();
- break;
- case "DOMWindowCreated":
- this.#applyBoostForPageIfAvailable();
- break;
- default:
- break;
- }
- }
-
handleZapEvent(event) {
if (ZenBoostsChild.ALL_EVENTS_SET.has(event.type)) {
this.#overlay.handleEvent(
diff --git a/src/zen/boosts/nsZenBCOverrides.cpp b/src/zen/boosts/nsZenBCOverrides.cpp
index 306d35bf7..cafe19c5a 100644
--- a/src/zen/boosts/nsZenBCOverrides.cpp
+++ b/src/zen/boosts/nsZenBCOverrides.cpp
@@ -38,18 +38,6 @@ void BrowsingContext::WalkPresContexts(Callback&& aCallback) {
});
}
-static void RefreshBoostCacheIfMatchesCurrent(BrowsingContext* aChanged) {
- auto* backend = zen::nsZenBoostsBackend::GetInstance();
- if (!backend) {
- return;
- }
- RefPtr current = backend->GetCurrentBrowsingContext();
- if (!current || current->Top() != aChanged) {
- return;
- }
- backend->RefreshCachedBoostState();
-}
-
/**
* @brief Called when the ZenBoostsData field is set on a browsing context.
* Triggers a restyle if the boost data has changed.
@@ -61,7 +49,6 @@ void BrowsingContext::DidSet(FieldIndex,
if (ZenBoostsData() == aOldValue) {
return;
}
- RefreshBoostCacheIfMatchesCurrent(this);
PresContextAffectingFieldChanged();
TRIGGER_PRES_CONTEXT_RESTYLE();
}
@@ -79,7 +66,6 @@ void BrowsingContext::DidSet(FieldIndex,
if (ZenBoostsComplementaryRotation() == aOldValue) {
return;
}
- RefreshBoostCacheIfMatchesCurrent(this);
PresContextAffectingFieldChanged();
TRIGGER_PRES_CONTEXT_RESTYLE();
}
@@ -95,7 +81,6 @@ void BrowsingContext::DidSet(FieldIndex,
if (IsZenBoostsInverted() == aOldValue) {
return;
}
- RefreshBoostCacheIfMatchesCurrent(this);
PresContextAffectingFieldChanged();
TRIGGER_PRES_CONTEXT_RESTYLE();
}
diff --git a/src/zen/boosts/nsZenBoostsBackend.cpp b/src/zen/boosts/nsZenBoostsBackend.cpp
index b94e2890f..3c12f3e15 100644
--- a/src/zen/boosts/nsZenBoostsBackend.cpp
+++ b/src/zen/boosts/nsZenBoostsBackend.cpp
@@ -12,6 +12,8 @@
#include "nsIXULRuntime.h"
#include "nsPresContext.h"
+#include "nsIFrame.h"
+#include "nsIContent.h"
#include "mozilla/ClearOnShutdown.h"
#include "mozilla/StaticPtr.h"
@@ -31,9 +33,6 @@
#define INVERT_CHANNEL_FLOOR() \
(mozilla::StaticPrefs::zen_boosts_invert_channel_floor_AtStartup())
-#define SHOULD_APPLY_BOOSTS_TO_ANONYMOUS_CONTENT() \
- (!mozilla::StaticPrefs::zen_boosts_disable_on_anonymous_content_AtStartup())
-
#if defined(__clang__) || defined(__GNUC__)
# define ZEN_HOT_FUNCTION __attribute__((hot))
#else
@@ -381,27 +380,36 @@ inline static nscolor zenInvertColorChannel(nscolor aColor) {
}
/**
- * @brief Retrieves the current boost data from the browsing context. When
- * called without aPresContext, reads the precomputed cache populated on
- * presshell entry; otherwise resolves from the supplied PresContext.
+ * @brief Whether the given frame belongs to anonymous content that boosts must
+ * not touch (devtools highlighters, screenshots, the boosts overlays
+ * themselves, and other native-anonymous UI such as scrollbars). A null frame
+ * gives no document to anchor the boost on, so it is treated the same way.
*/
ZEN_HOT_FUNCTION
-inline static void GetZenBoostsDataFromBrowsingContext(
- ZenBoostData* aData, float* aComplementaryRotation, bool* aIsInverted,
- nsPresContext* aPresContext = nullptr) {
- auto zenBoosts = nsZenBoostsBackend::GetInstance();
- if (!zenBoosts || (zenBoosts->mCurrentFrameIsAnonymousContent &&
- !SHOULD_APPLY_BOOSTS_TO_ANONYMOUS_CONTENT())) {
+inline static bool IsBoostExemptFrame(const nsIFrame* aFrame) {
+ if (!aFrame) {
+ return true;
+ }
+ const nsIContent* content = aFrame->GetContent();
+ return content && content->IsInNativeAnonymousSubtree();
+}
+
+/**
+ * @brief Retrieves the boost data for the document the given frame belongs to.
+ * Resolves from the frame's PresContext -> Document -> top BrowsingContext,
+ * which carries the accent/inversion fields.
+ */
+ZEN_HOT_FUNCTION
+inline static void GetZenBoostsDataForFrame(const nsIFrame* aFrame,
+ ZenBoostData* aData,
+ float* aComplementaryRotation,
+ bool* aIsInverted) {
+ nsPresContext* presContext = aFrame->PresContext();
+ if (!presContext) {
return;
}
- if (!aPresContext) {
- *aData = zenBoosts->mCachedCurrentAccent;
- *aComplementaryRotation = zenBoosts->mCachedCurrentComplementaryRotation;
- *aIsInverted = zenBoosts->mCachedCurrentInverted;
- return;
- }
- mozilla::dom::BrowsingContext* browsingContext = nullptr;
- if (auto document = aPresContext->Document()) {
+ const mozilla::dom::BrowsingContext* browsingContext = nullptr;
+ if (auto document = presContext->Document()) {
browsingContext = document->GetBrowsingContext();
}
if (!browsingContext) {
@@ -456,59 +464,24 @@ auto nsZenBoostsBackend::GetInstance() -> nsZenBoostsBackend* {
return sZenBoostsBackend.get();
}
-auto nsZenBoostsBackend::onPresShellEntered(mozilla::dom::Document* aDocument)
- -> void {
- if (auto displayDoc = aDocument->GetDisplayDocument()) {
- onPresShellEntered(displayDoc);
- return;
- }
- // Note that aDocument can be null when entering anonymous content frames.
- // We explicitly do this to prevent applying boosts to anonymous content, such
- // as devtools or screenshots.
- mozilla::dom::BrowsingContext* browsingContext =
- aDocument ? aDocument->GetBrowsingContext() : nullptr;
- if (!browsingContext) {
- return;
- }
- mCurrentBrowsingContextId = browsingContext->Id();
- RefreshCachedBoostState();
-}
-
-already_AddRefed
-nsZenBoostsBackend::GetCurrentBrowsingContext() const {
- return mozilla::dom::BrowsingContext::Get(mCurrentBrowsingContextId);
-}
-
-auto nsZenBoostsBackend::RefreshCachedBoostState() -> void {
- RefPtr current =
- mozilla::dom::BrowsingContext::Get(mCurrentBrowsingContextId);
- if (!current) {
- mCachedCurrentAccent = 0;
- mCachedCurrentComplementaryRotation = 0.0f;
- mCachedCurrentInverted = false;
- return;
- }
- auto top = current->Top();
- mCachedCurrentAccent = top->ZenBoostsData();
- mCachedCurrentComplementaryRotation = top->ZenBoostsComplementaryRotation();
- mCachedCurrentInverted = top->IsZenBoostsInverted();
-}
-
-[[nodiscard]] ZEN_HOT_FUNCTION auto
-nsZenBoostsBackend::FilterColorFromPresContext(nscolor aColor,
- nsPresContext* aPresContext)
- -> nscolor {
+[[nodiscard]] ZEN_HOT_FUNCTION auto nsZenBoostsBackend::ResolveStyleColor(
+ nscolor aColor, const nsIFrame* aFrame) -> nscolor {
if (NS_GET_A(aColor) == 0) {
// Skip processing fully transparent colors since they won't be visible and
// we want to avoid unnecessary computations. This also prevents issues with
// using the alpha channel for contrast information in the accent color.
return aColor;
}
+ // Boosts are only supported in content; GetInstance() is null in the parent
+ // process, which keeps the browser chrome from being tinted.
+ if (!GetInstance() || IsBoostExemptFrame(aFrame)) {
+ return aColor;
+ }
ZenBoostData accentNS = 0;
float complementaryRotation = 0.0f;
bool invertColors = false;
- GetZenBoostsDataFromBrowsingContext(&accentNS, &complementaryRotation,
- &invertColors, aPresContext);
+ GetZenBoostsDataForFrame(aFrame, &accentNS, &complementaryRotation,
+ &invertColors);
if (accentNS) {
// Resolve (and cache) the base + complementary accent for this accent and
// complementary rotation. Apply a filter-like tint:
@@ -526,9 +499,4 @@ nsZenBoostsBackend::FilterColorFromPresContext(nscolor aColor,
return aColor;
}
-[[nodiscard]] ZEN_HOT_FUNCTION auto nsZenBoostsBackend::ResolveStyleColor(
- nscolor aColor) -> nscolor {
- return FilterColorFromPresContext(aColor);
-}
-
} // namespace zen
diff --git a/src/zen/boosts/nsZenBoostsBackend.h b/src/zen/boosts/nsZenBoostsBackend.h
index 81ca1d95b..1d2073372 100644
--- a/src/zen/boosts/nsZenBoostsBackend.h
+++ b/src/zen/boosts/nsZenBoostsBackend.h
@@ -9,10 +9,7 @@
#include "nsISupportsImpl.h"
#include "nsPresContext.h"
-#include "mozilla/RefPtr.h"
-#include "mozilla/AlreadyAddRefed.h"
-
-#include
+class nsIFrame;
namespace mozilla::dom {
class BrowsingContext;
@@ -49,80 +46,29 @@ class nsZenBoostsBackend final : public nsISupports {
explicit nsZenBoostsBackend() = default;
- /**
- * Indicates whether the current frame being rendered is for anonymous
- * content.
- */
- bool mCurrentFrameIsAnonymousContent = false;
-
/**
* @brief Resolve a color to take into account Zen boosts. This is the single
* place style colors are filtered; it is reached for every style color via
* StyleAbsoluteColor::ToColor. Do not add a second StyleColor::ResolveColor
* filter on top of this or colors get filtered multiple times (which also
* makes resting colors disagree with composited transition endpoints).
+ *
+ * The boost state is derived from the frame the color is being resolved for:
+ * its document's top BrowsingContext carries the accent/inversion data. When
+ * @p aFrame is null, or belongs to anonymous content (devtools, screenshots,
+ * the boosts overlays themselves), the color is returned unfiltered.
* @param aColor The color to resolve.
+ * @param aFrame The frame the color is being resolved for, or null.
* @return The resolved color with Zen boost filters applied, or the original
* color if no boost is active.
* @see StyleAbsoluteColor::ToColor for reference.
*/
- static auto ResolveStyleColor(nscolor aColor) -> nscolor;
-
- /**
- * @brief Filter a color based on the current Zen boost settings.
- * @param aColor The color to filter.
- * @param aPresContext The presentation context to use for filtering.
- * @return The filtered color.
- */
- static auto FilterColorFromPresContext(nscolor aColor,
- nsPresContext* aPresContext = nullptr)
+ static auto ResolveStyleColor(nscolor aColor, const nsIFrame* aFrame)
-> nscolor;
- /**
- * @brief Called when a presshell is entered during rendering.
- * @param aDocument The document associated with the presshell being entered.
- */
- auto onPresShellEntered(mozilla::dom::Document* aDocument) -> void;
-
- /**
- * @brief Refresh the cached boost state from the current top BrowsingContext.
- * Called from onPresShellEntered and from BrowsingContext::DidSet hooks when
- * the underlying boost fields change.
- */
- auto RefreshCachedBoostState() -> void;
-
- /**
- * Resolves the current top BrowsingContext from its stored id. May return
- * null if it has since been discarded. Not on the per-color hot path; the
- * hot path uses the mCachedCurrent* fields instead.
- */
- [[nodiscard]] already_AddRefed
- GetCurrentBrowsingContext() const;
-
- /**
- * Cached boost data for the current top BrowsingContext, refreshed on
- * presshell entry and on DidSet hooks. Read by the per-color hot path so
- * that boost-off pages don't pay for a BrowsingContext walk on every color
- * resolve.
- */
- ZenBoostData mCachedCurrentAccent = 0;
- // Hue rotation in degrees applied to the base accent to derive the
- // complementary accent. Zero means the complementary accent equals the base
- // accent (the duotone collapses to a single-accent tint).
- float mCachedCurrentComplementaryRotation = 0.0f;
- bool mCachedCurrentInverted = false;
-
private:
~nsZenBoostsBackend() = default;
- /**
- * Id of the top BrowsingContext of the current document being rendered.
- * Stored as an id rather than a strong RefPtr so the process-wide singleton
- * does not keep a navigated-away BrowsingContext (and its subtree) alive
- * until the next presshell entry.
- */
- uint64_t mCurrentBrowsingContextId = 0;
-
public:
/**
* @brief Get the singleton instance of the ZenBoostsBackend.
diff --git a/src/zen/common/sys/ZenActorsManager.sys.mjs b/src/zen/common/sys/ZenActorsManager.sys.mjs
index 766193ad3..759167674 100644
--- a/src/zen/common/sys/ZenActorsManager.sys.mjs
+++ b/src/zen/common/sys/ZenActorsManager.sys.mjs
@@ -67,8 +67,9 @@ if (!Services.appinfo.inSafeMode) {
child: {
esModuleURI: "resource:///actors/ZenBoostsChild.sys.mjs",
events: {
+ // Needed to let the actor be created, please don't remove
+ // without checking if boosts still work without it, thanks <3
DOMWindowCreated: {},
- unload: {},
},
},
allFrames: true,
From 6f41ffe02d83ccdfd3b4da72ee638141c1e4c8a1 Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Mon, 25 May 2026 21:28:52 +0200
Subject: [PATCH 21/31] gh-13853: Fixed sidebar flickering on private windows
(gh-13855)
---
prefs/firefox/browser.yaml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/prefs/firefox/browser.yaml b/prefs/firefox/browser.yaml
index 23db6a4e4..341577cac 100644
--- a/prefs/firefox/browser.yaml
+++ b/prefs/firefox/browser.yaml
@@ -87,6 +87,10 @@
value: false
locked: true
+# See gh-13853 for details on why we should disable this preference
+- name: browser.privatebrowsing.resetPBM.enabled
+ value: false
+
# See gh-12985 for details on the following preferences
- name: browser.search.widget.new
value: true
From 346219c3b4877cc325c65e8934d8ed7c498498f1 Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Mon, 25 May 2026 21:47:27 +0200
Subject: [PATCH 22/31] gh-13851: Fixed pressing `u` duplicating tabs
(gh-13856)
---
.../browser/preferences/zen-preferences.ftl | 3 ++-
.../components/preferences/zen-settings.js | 2 ++
src/zen/kbs/ZenKeyboardShortcuts.mjs | 19 +++++++++++++++++--
3 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/locales/en-US/browser/browser/preferences/zen-preferences.ftl b/locales/en-US/browser/browser/preferences/zen-preferences.ftl
index 6ec2bcf30..b403bad5a 100644
--- a/locales/en-US/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/en-US/browser/browser/preferences/zen-preferences.ftl
@@ -358,4 +358,5 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Blank Window
-zen-duplicate-tab-shortcut = Duplicate Tab
\ No newline at end of file
+zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js
index 052f0217c..2d6bef1a8 100644
--- a/src/browser/components/preferences/zen-settings.js
+++ b/src/browser/components/preferences/zen-settings.js
@@ -793,6 +793,7 @@ const zenMissingKeyboardShortcutL10n = {
key_selectTab7: "zen-key-select-tab-7",
key_selectTab8: "zen-key-select-tab-8",
key_selectLastTab: "zen-key-select-tab-last",
+ key_duplicateTab: "customkeys-file-duplicate-tab",
key_showAllTabs: "zen-key-show-all-tabs",
key_gotoHistory: "zen-key-goto-history",
@@ -801,6 +802,7 @@ const zenMissingKeyboardShortcutL10n = {
key_redo: "zen-key-redo",
key_inspectorMac: "zen-key-inspector-mac",
+ key_findSelection: "zen-key-find-selection",
// Devtools
key_toggleToolbox: "zen-devtools-toggle-shortcut",
diff --git a/src/zen/kbs/ZenKeyboardShortcuts.mjs b/src/zen/kbs/ZenKeyboardShortcuts.mjs
index 8073afd22..b13ec6447 100644
--- a/src/zen/kbs/ZenKeyboardShortcuts.mjs
+++ b/src/zen/kbs/ZenKeyboardShortcuts.mjs
@@ -433,11 +433,14 @@ class KeyShortcut {
if (this.#keycode) {
key.setAttribute("keycode", this.#keycode);
key.removeAttribute("key");
- } else {
+ } else if (this.#key) {
// note to "mr. macos": Better use setAttribute, because without it, there's a
// risk of malforming the XUL element.
key.setAttribute("key", this.#key);
key.removeAttribute("keycode");
+ } else {
+ key.removeAttribute("key");
+ key.removeAttribute("keycode");
}
key.setAttribute("group", this.#group);
@@ -845,7 +848,7 @@ class nsZenKeyboardShortcutsLoader {
}
class nsZenKeyboardShortcutsVersioner {
- static LATEST_KBS_VERSION = 18;
+ static LATEST_KBS_VERSION = 19;
constructor() {}
@@ -1241,6 +1244,18 @@ class nsZenKeyboardShortcutsVersioner {
);
}
+ if (version < 19) {
+ // Migrate from version 18 to 19.
+ // Disable "key_duplicateTab" since we already had "cmd_zenDuplicateTab" before Firefox 151.
+ for (let shortcut of data) {
+ if (shortcut.getID() == "key_duplicateTab") {
+ shortcut.shouldBeEmpty = true;
+ shortcut.setDisabled(true);
+ break;
+ }
+ }
+ }
+
return data;
}
}
From b94dd3b927b0419c47eb3b41a92dfc8a0b28ce19 Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Tue, 26 May 2026 12:00:14 +0200
Subject: [PATCH 23/31] gh-13868: Fixed tabs getting clipped when collapsing
folders (gh-13869)
---
src/zen/folders/ZenFolders.mjs | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs
index bce1923a4..3267d579f 100644
--- a/src/zen/folders/ZenFolders.mjs
+++ b/src/zen/folders/ZenFolders.mjs
@@ -1566,7 +1566,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
const tabsContainer = group.groupContainer;
tabsContainer.removeAttribute("hidden");
- tabsContainer.style.overflow = "hidden";
+ tabsContainer.style.overflowY = "hidden";
const groupStart = group.groupStartElement;
const itemsToShow = this.#normalizeGroupItems(group.childGroupsAndTabs);
@@ -1615,7 +1615,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
}
const afterMarginTop = () => {
- tabsContainer.style.overflow = "";
+ tabsContainer.style.overflowY = "";
if (group.hasAttribute("has-active")) {
const activeTabs = group.activeTabs;
const folders = new Map();
@@ -1859,14 +1859,14 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
const tabsContainer = currentGroup.groupContainer;
const groupStart = currentGroup.groupStartElement;
- tabsContainer.style.overflow = "clip";
+ tabsContainer.style.overflowY = "clip";
if (tabsContainer.hasAttribute("hidden")) {
tabsContainer.removeAttribute("hidden");
}
const afterMarginTop = () => {
- tabsContainer.style.overflow = "";
+ tabsContainer.style.overflowY = "";
};
animations.push(
@@ -1972,7 +1972,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
const heightContainer = expand
? 0
: this.#calculateHeightShift(tabsContainer, []);
- tabsContainer.style.overflow = "clip";
+ tabsContainer.style.overflowY = "clip";
this.#createAnimation(
groupStart,
From e82012ff1c5bab351afecea714ca1f3aa4fb336b Mon Sep 17 00:00:00 2001
From: Ashvin Jangid <142579833+ashvwinn@users.noreply.github.com>
Date: Wed, 27 May 2026 01:22:37 +0530
Subject: [PATCH 24/31] gh-13879: fix sidebar UI breaking on cancelling space
creation (gh-13880)
---
src/zen/spaces/ZenSpaceCreation.mjs | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/zen/spaces/ZenSpaceCreation.mjs b/src/zen/spaces/ZenSpaceCreation.mjs
index 5792d2120..330ca9e02 100644
--- a/src/zen/spaces/ZenSpaceCreation.mjs
+++ b/src/zen/spaces/ZenSpaceCreation.mjs
@@ -261,6 +261,7 @@ class nsZenWorkspaceCreation extends MozXULElement {
}
async onCancelButtonCommand() {
+ document.documentElement.removeAttribute("zen-creating-workspace");
await gZenWorkspaces.changeWorkspaceWithID(this.previousWorkspaceId);
}
From 7f08cf437abbacaf7b381af64c5ea6ffd8c503b6 Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Tue, 26 May 2026 22:27:54 +0200
Subject: [PATCH 25/31] gh-13844: Part 2 - Fixed boosts not working for linear
gradients (gh-13882)
Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
---
src/accessible/base/TextAttrs-cpp.patch | 18 +++++
.../ia2/ia2AccessibleComponent-cpp.patch | 13 ++++
.../canvas/CanvasRenderingContext2D-cpp.patch | 14 ++++
src/dom/html/HTMLInputElement-cpp.patch | 13 ++++
.../libeditor/HTMLAbsPositionEditor-cpp.patch | 13 ++++
src/gfx/thebes/gfxUtils-cpp.patch | 16 ++++
src/gfx/thebes/gfxUtils-h.patch | 23 ++++++
.../painting/nsCSSRenderingBorders-cpp.patch | 14 ++++
.../nsCSSRenderingGradients-cpp.patch | 78 +++++++++++++++++++
.../painting/nsCSSRenderingGradients-h.patch | 59 ++++++++++++++
src/layout/painting/nsImageRenderer-cpp.patch | 40 ++++++++++
src/layout/style/GeckoBindings-cpp.patch | 13 ++++
src/layout/style/StyleColor-cpp.patch | 16 +++-
src/layout/style/nsStyleStruct-cpp.patch | 13 ++++
src/layout/svg/SVGContextPaint-cpp.patch | 13 ++++
src/layout/svg/SVGGradientFrame-cpp.patch | 42 ++++++++++
src/layout/svg/SVGImageContext-cpp.patch | 21 +++++
src/layout/svg/SVGUtils-cpp.patch | 60 ++++++++++++++
src/layout/svg/SVGUtils-h.patch | 13 ++++
src/layout/xul/tree/nsTreeBodyFrame-cpp.patch | 11 ++-
src/servo/ports/geckolib/cbindgen-toml.patch | 6 +-
src/widget/ScrollbarDrawing-cpp.patch | 23 ++++++
src/widget/ScrollbarDrawingCocoa-cpp.patch | 15 ++++
src/widget/ScrollbarDrawingWin11-cpp.patch | 22 ++++++
src/widget/ThemeColors-cpp.patch | 13 ++++
src/zen/boosts/nsZenBoostsBackend.cpp | 23 +++++-
src/zen/common/styles/zen-popup.css | 19 +----
27 files changed, 599 insertions(+), 25 deletions(-)
create mode 100644 src/accessible/base/TextAttrs-cpp.patch
create mode 100644 src/accessible/windows/ia2/ia2AccessibleComponent-cpp.patch
create mode 100644 src/dom/canvas/CanvasRenderingContext2D-cpp.patch
create mode 100644 src/dom/html/HTMLInputElement-cpp.patch
create mode 100644 src/editor/libeditor/HTMLAbsPositionEditor-cpp.patch
create mode 100644 src/gfx/thebes/gfxUtils-cpp.patch
create mode 100644 src/gfx/thebes/gfxUtils-h.patch
create mode 100644 src/layout/painting/nsCSSRenderingBorders-cpp.patch
create mode 100644 src/layout/painting/nsCSSRenderingGradients-cpp.patch
create mode 100644 src/layout/painting/nsCSSRenderingGradients-h.patch
create mode 100644 src/layout/painting/nsImageRenderer-cpp.patch
create mode 100644 src/layout/style/GeckoBindings-cpp.patch
create mode 100644 src/layout/style/nsStyleStruct-cpp.patch
create mode 100644 src/layout/svg/SVGContextPaint-cpp.patch
create mode 100644 src/layout/svg/SVGGradientFrame-cpp.patch
create mode 100644 src/layout/svg/SVGImageContext-cpp.patch
create mode 100644 src/layout/svg/SVGUtils-cpp.patch
create mode 100644 src/layout/svg/SVGUtils-h.patch
create mode 100644 src/widget/ScrollbarDrawing-cpp.patch
create mode 100644 src/widget/ScrollbarDrawingCocoa-cpp.patch
create mode 100644 src/widget/ScrollbarDrawingWin11-cpp.patch
create mode 100644 src/widget/ThemeColors-cpp.patch
diff --git a/src/accessible/base/TextAttrs-cpp.patch b/src/accessible/base/TextAttrs-cpp.patch
new file mode 100644
index 000000000..b88ca20d4
--- /dev/null
+++ b/src/accessible/base/TextAttrs-cpp.patch
@@ -0,0 +1,18 @@
+diff --git a/accessible/base/TextAttrs.cpp b/accessible/base/TextAttrs.cpp
+index d2ce06bef67ecb6d6ccb798a62d7f2759dd9da18..fb4952df9aa54d4085a282dc269a48ad72979b8b 100644
+--- a/accessible/base/TextAttrs.cpp
++++ b/accessible/base/TextAttrs.cpp
+@@ -237,11 +237,11 @@ bool TextAttrsMgr::BGColorTextAttr::GetColor(nsIFrame* aFrame,
+ TextAttrsMgr::ColorTextAttr::ColorTextAttr(nsIFrame* aRootFrame,
+ nsIFrame* aFrame)
+ : TTextAttr(!aFrame) {
+- mRootNativeValue = aRootFrame->StyleText()->mColor.ToColor();
++ mRootNativeValue = aRootFrame->StyleText()->mColor.ToColor(aRootFrame);
+ mIsRootDefined = true;
+
+ if (aFrame) {
+- mNativeValue = aFrame->StyleText()->mColor.ToColor();
++ mNativeValue = aFrame->StyleText()->mColor.ToColor(aFrame);
+ mIsDefined = true;
+ }
+ }
diff --git a/src/accessible/windows/ia2/ia2AccessibleComponent-cpp.patch b/src/accessible/windows/ia2/ia2AccessibleComponent-cpp.patch
new file mode 100644
index 000000000..d751fa9b8
--- /dev/null
+++ b/src/accessible/windows/ia2/ia2AccessibleComponent-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/accessible/windows/ia2/ia2AccessibleComponent.cpp b/accessible/windows/ia2/ia2AccessibleComponent.cpp
+index 7837fdee3db339543f8b3d95dcb23ebe99aed8dc..207adf3ded9848b84ec89e94f80e8e02f161923c 100644
+--- a/accessible/windows/ia2/ia2AccessibleComponent.cpp
++++ b/accessible/windows/ia2/ia2AccessibleComponent.cpp
+@@ -81,7 +81,7 @@ ia2AccessibleComponent::get_foreground(IA2Color* aForeground) {
+ if (!acc) return CO_E_OBJNOTCONNECTED;
+
+ nsIFrame* frame = acc->GetFrame();
+- if (frame) *aForeground = frame->StyleText()->mColor.ToColor();
++ if (frame) *aForeground = frame->StyleText()->mColor.ToColor(frame);
+
+ return S_OK;
+ }
diff --git a/src/dom/canvas/CanvasRenderingContext2D-cpp.patch b/src/dom/canvas/CanvasRenderingContext2D-cpp.patch
new file mode 100644
index 000000000..5a4821efc
--- /dev/null
+++ b/src/dom/canvas/CanvasRenderingContext2D-cpp.patch
@@ -0,0 +1,14 @@
+diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp
+index ca400d3aed179ebef8e005206f29b419ae56afc4..4d4e56f4a222bd61dea82638f3e0b30fbe56a176 100644
+--- a/dom/canvas/CanvasRenderingContext2D.cpp
++++ b/dom/canvas/CanvasRenderingContext2D.cpp
+@@ -1326,7 +1326,8 @@ Maybe CanvasRenderingContext2D::ParseColor(
+ RefPtr canvasStyle =
+ nsComputedDOMStyle::GetComputedStyle(mCanvasElement);
+ if (canvasStyle) {
+- return Some(canvasStyle->StyleText()->mColor.ToColor());
++ return Some(canvasStyle->StyleText()->mColor.ToColor(
++ mCanvasElement->GetPrimaryFrame()));
+ }
+ }
+ return data.mColor;
diff --git a/src/dom/html/HTMLInputElement-cpp.patch b/src/dom/html/HTMLInputElement-cpp.patch
new file mode 100644
index 000000000..cae2a6ce0
--- /dev/null
+++ b/src/dom/html/HTMLInputElement-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp
+index 3374a88b9335de1659df548fe8c18610f675b336..540f22697e7b85bca2fd6d3fe952ed3944216e17 100644
+--- a/dom/html/HTMLInputElement.cpp
++++ b/dom/html/HTMLInputElement.cpp
+@@ -768,7 +768,7 @@ static void SerializeColorForHTMLCompatibility(const StyleAbsoluteColor& aColor,
+ // Raw StyleAbsoluteColor can have floats outside of 0-1 range e.g. when
+ // display-p3 color is converted to srgb, and ToColor guarantees to fit the
+ // values within the range.
+- nscolor color = aColor.ToColor();
++ nscolor color = aColor.ToColor(nullptr);
+ aResult.Truncate();
+ aResult.AppendPrintf("#%02x%02x%02x", NS_GET_R(color), NS_GET_G(color),
+ NS_GET_B(color));
diff --git a/src/editor/libeditor/HTMLAbsPositionEditor-cpp.patch b/src/editor/libeditor/HTMLAbsPositionEditor-cpp.patch
new file mode 100644
index 000000000..919f7a30c
--- /dev/null
+++ b/src/editor/libeditor/HTMLAbsPositionEditor-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/editor/libeditor/HTMLAbsPositionEditor.cpp b/editor/libeditor/HTMLAbsPositionEditor.cpp
+index 44bd8ba90e9828423742d768e64ad6204b3cf134..49d5c9512137ce28ac463223098515f6912452b1 100644
+--- a/editor/libeditor/HTMLAbsPositionEditor.cpp
++++ b/editor/libeditor/HTMLAbsPositionEditor.cpp
+@@ -1001,7 +1001,7 @@ nsresult HTMLEditor::GetTemporaryStyleForFocusedPositionedElement(
+
+ static const uint8_t kBlackBgTrigger = 0xd0;
+
+- auto color = style->StyleText()->mColor.ToColor();
++ auto color = style->StyleText()->mColor.ToColor(aElement.GetPrimaryFrame());
+ if (NS_GET_R(color) >= kBlackBgTrigger &&
+ NS_GET_G(color) >= kBlackBgTrigger &&
+ NS_GET_B(color) >= kBlackBgTrigger) {
diff --git a/src/gfx/thebes/gfxUtils-cpp.patch b/src/gfx/thebes/gfxUtils-cpp.patch
new file mode 100644
index 000000000..4227df26d
--- /dev/null
+++ b/src/gfx/thebes/gfxUtils-cpp.patch
@@ -0,0 +1,16 @@
+diff --git a/gfx/thebes/gfxUtils.cpp b/gfx/thebes/gfxUtils.cpp
+index 6c19c572f06e8c4c97ce3f9dd390a32832e2f527..d11cbad2ee32a1507316809893e9c42a883e6c12 100644
+--- a/gfx/thebes/gfxUtils.cpp
++++ b/gfx/thebes/gfxUtils.cpp
+@@ -1743,8 +1743,9 @@ DeviceColor ToDeviceColor(nscolor aColor) {
+ return ToDeviceColor(sRGBColor::FromABGR(aColor));
+ }
+
+-DeviceColor ToDeviceColor(const StyleAbsoluteColor& aColor) {
+- return ToDeviceColor(aColor.ToColor());
++DeviceColor ToDeviceColor(const StyleAbsoluteColor& aColor,
++ const nsIFrame* aFrame) {
++ return ToDeviceColor(aColor.ToColor(aFrame));
+ }
+
+ sRGBColor ToSRGBColor(const StyleAbsoluteColor& aColor) {
diff --git a/src/gfx/thebes/gfxUtils-h.patch b/src/gfx/thebes/gfxUtils-h.patch
new file mode 100644
index 000000000..548a9875a
--- /dev/null
+++ b/src/gfx/thebes/gfxUtils-h.patch
@@ -0,0 +1,23 @@
+diff --git a/gfx/thebes/gfxUtils.h b/gfx/thebes/gfxUtils.h
+index 55f874429fd8cbb7a0a469eba33f6c777a5bc5f7..8cf0567d81fcae7413cee6df9471d1fa1738fc4a 100644
+--- a/gfx/thebes/gfxUtils.h
++++ b/gfx/thebes/gfxUtils.h
+@@ -598,6 +598,9 @@ class ElementOrArray {
+ };
+
+ struct StyleAbsoluteColor;
++} // namespace mozilla
++class nsIFrame;
++namespace mozilla {
+
+ namespace gfx {
+
+@@ -609,7 +612,7 @@ namespace gfx {
+ * applicable).
+ */
+ DeviceColor ToDeviceColor(const sRGBColor&);
+-DeviceColor ToDeviceColor(const StyleAbsoluteColor&);
++DeviceColor ToDeviceColor(const StyleAbsoluteColor&, const nsIFrame*);
+ DeviceColor ToDeviceColor(nscolor);
+
+ sRGBColor ToSRGBColor(const StyleAbsoluteColor&);
diff --git a/src/layout/painting/nsCSSRenderingBorders-cpp.patch b/src/layout/painting/nsCSSRenderingBorders-cpp.patch
new file mode 100644
index 000000000..8837c1382
--- /dev/null
+++ b/src/layout/painting/nsCSSRenderingBorders-cpp.patch
@@ -0,0 +1,14 @@
+diff --git a/layout/painting/nsCSSRenderingBorders.cpp b/layout/painting/nsCSSRenderingBorders.cpp
+index fd2524fd78b1709363afda35e4b0d4320913d9ec..c5b90bc789cdd7f8b0b661ca99b8c7f4d01e6d68 100644
+--- a/layout/painting/nsCSSRenderingBorders.cpp
++++ b/layout/painting/nsCSSRenderingBorders.cpp
+@@ -3624,7 +3624,8 @@ ImgDrawResult nsCSSBorderImageRenderer::CreateWebRenderCommands(
+ case StyleImage::Tag::Gradient: {
+ const StyleGradient& gradient = *mImageRenderer.GetGradientData();
+ nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(
+- aForFrame->PresContext(), aForFrame->Style(), gradient, mImageSize);
++ aForFrame->PresContext(), aForFrame->Style(), aForFrame, gradient,
++ mImageSize);
+
+ wr::ExtendMode extendMode;
+ nsTArray stops;
diff --git a/src/layout/painting/nsCSSRenderingGradients-cpp.patch b/src/layout/painting/nsCSSRenderingGradients-cpp.patch
new file mode 100644
index 000000000..e41ca7dc7
--- /dev/null
+++ b/src/layout/painting/nsCSSRenderingGradients-cpp.patch
@@ -0,0 +1,78 @@
+diff --git a/layout/painting/nsCSSRenderingGradients.cpp b/layout/painting/nsCSSRenderingGradients.cpp
+index 80a9d36ca865bbcd090d7aa556270a698447b016..2b1e0a70ed7e6f975c51a0912598c7903552ab20 100644
+--- a/layout/painting/nsCSSRenderingGradients.cpp
++++ b/layout/painting/nsCSSRenderingGradients.cpp
+@@ -667,7 +667,8 @@ static nsTArray ComputeColorStops(ComputedStyle* aComputedStyle,
+
+ nsCSSGradientRenderer nsCSSGradientRenderer::Create(
+ nsPresContext* aPresContext, ComputedStyle* aComputedStyle,
+- const StyleGradient& aGradient, const nsSize& aIntrinsicSize) {
++ const nsIFrame* aFrame, const StyleGradient& aGradient,
++ const nsSize& aIntrinsicSize) {
+ auto srcSize = CSSSize::FromAppUnits(aIntrinsicSize);
+
+ // Compute "gradient line" start and end relative to the intrinsic size of
+@@ -704,6 +705,7 @@ nsCSSGradientRenderer nsCSSGradientRenderer::Create(
+
+ nsCSSGradientRenderer renderer;
+ renderer.mPresContext = aPresContext;
++ renderer.mFrame = aFrame;
+ renderer.mGradient = &aGradient;
+ renderer.mStops = std::move(stops);
+ renderer.mLineStart = {
+@@ -992,9 +994,10 @@ void nsCSSGradientRenderer::Paint(gfxContext& aContext, const nsRect& aDest,
+ GradientStopInterpolator(
+ const nsTArray& aStops,
+ const StyleColorInterpolationMethod& aStyleColorInterpolationMethod,
+- bool aExtend, nsTArray& aResult)
++ bool aExtend, nsTArray& aResult,
++ const nsIFrame* aFrame)
+ : ColorStopInterpolator(aStops, aStyleColorInterpolationMethod,
+- aExtend),
++ aExtend, aFrame),
+ mStops(aResult) {}
+ void CreateStop(float aPosition, gfx::DeviceColor aColor) {
+ mStops.AppendElement(gfx::GradientStop{aPosition, aColor});
+@@ -1007,12 +1010,12 @@ void nsCSSGradientRenderer::Paint(gfxContext& aContext, const nsRect& aDest,
+ bool extend = !isRepeat && styleColorInterpolationMethod.hue ==
+ StyleHueInterpolationMethod::Longer;
+ GradientStopInterpolator interpolator(mStops, styleColorInterpolationMethod,
+- extend, rawStops);
++ extend, rawStops, mFrame);
+ interpolator.CreateStops();
+ } else {
+ rawStops.SetLength(mStops.Length());
+ for (uint32_t i = 0; i < mStops.Length(); i++) {
+- rawStops[i].color = ToDeviceColor(mStops[i].mColor);
++ rawStops[i].color = ToDeviceColor(mStops[i].mColor, mFrame);
+ rawStops[i].color.a *= aOpacity;
+ rawStops[i].offset = stopScale * (mStops[i].mPosition - stopOrigin);
+ }
+@@ -1203,8 +1206,10 @@ class MOZ_STACK_CLASS WrColorStopInterpolator
+ WrColorStopInterpolator(
+ const nsTArray& aStops,
+ const StyleColorInterpolationMethod& aStyleColorInterpolationMethod,
+- float aOpacity, nsTArray& aResult, bool aExtend)
+- : ColorStopInterpolator(aStops, aStyleColorInterpolationMethod, aExtend),
++ float aOpacity, nsTArray& aResult, bool aExtend,
++ const nsIFrame* aFrame)
++ : ColorStopInterpolator(aStops, aStyleColorInterpolationMethod, aExtend,
++ aFrame),
+ mResult(aResult),
+ mOpacity(aOpacity),
+ mOutputStop(0) {}
+@@ -1284,12 +1289,12 @@ void nsCSSGradientRenderer::BuildWebRenderParameters(
+ styleColorInterpolationMethod.hue ==
+ StyleHueInterpolationMethod::Longer;
+ WrColorStopInterpolator interpolator(mStops, styleColorInterpolationMethod,
+- aOpacity, aStops, extend);
++ aOpacity, aStops, extend, mFrame);
+ interpolator.CreateStops();
+ } else {
+ aStops.SetLength(mStops.Length());
+ for (uint32_t i = 0; i < mStops.Length(); i++) {
+- aStops[i].color = wr::ToColorF(ToDeviceColor(mStops[i].mColor));
++ aStops[i].color = wr::ToColorF(ToDeviceColor(mStops[i].mColor, mFrame));
+ aStops[i].color.a *= aOpacity;
+ aStops[i].offset = (float)mStops[i].mPosition;
+ }
diff --git a/src/layout/painting/nsCSSRenderingGradients-h.patch b/src/layout/painting/nsCSSRenderingGradients-h.patch
new file mode 100644
index 000000000..661e7785f
--- /dev/null
+++ b/src/layout/painting/nsCSSRenderingGradients-h.patch
@@ -0,0 +1,59 @@
+diff --git a/layout/painting/nsCSSRenderingGradients.h b/layout/painting/nsCSSRenderingGradients.h
+index 30f665f7cacabb15fb6a1656385c5936d42be48b..8c4c4147ee8ec6812e9418f95b7b7c0358dcb735 100644
+--- a/layout/painting/nsCSSRenderingGradients.h
++++ b/layout/painting/nsCSSRenderingGradients.h
+@@ -42,10 +42,11 @@ class MOZ_STACK_CLASS ColorStopInterpolator {
+ ColorStopInterpolator(
+ const nsTArray& aStops,
+ const StyleColorInterpolationMethod& aStyleColorInterpolationMethod,
+- bool aExtend)
++ bool aExtend, const nsIFrame* aFrame)
+ : mStyleColorInterpolationMethod(aStyleColorInterpolationMethod),
+ mStops(aStops),
+- mExtend(aExtend) {}
++ mExtend(aExtend),
++ mFrame(aFrame) {}
+
+ void CreateStops() {
+ // This loop intentionally iterates extra stops at the beginning and end
+@@ -96,7 +97,7 @@ class MOZ_STACK_CLASS ColorStopInterpolator {
+ Servo_InterpolateColor(mStyleColorInterpolationMethod,
+ &start.mColor, &end.mColor, progress);
+ static_cast(this)->CreateStop(float(position),
+- gfx::ToDeviceColor(color));
++ gfx::ToDeviceColor(color, mFrame));
+ }
+ }
+ }
+@@ -108,6 +109,7 @@ class MOZ_STACK_CLASS ColorStopInterpolator {
+ // which only matters if this is a CSS non-repeating gradient with
+ // StyleHueInterpolationMethod::Longer (only valid for hsl/hwb/lch/oklch).
+ bool mExtend;
++ const nsIFrame* mFrame;
+
+ // This could be made tunable, but at 1.0/128 the error is largely
+ // irrelevant, as WebRender re-encodes it to 128 pairs of stops.
+@@ -126,6 +128,7 @@ class nsCSSGradientRenderer final {
+ */
+ static nsCSSGradientRenderer Create(nsPresContext* aPresContext,
+ ComputedStyle* aComputedStyle,
++ const nsIFrame* aFrame,
+ const StyleGradient& aGradient,
+ const nsSize& aIntrinsiceSize);
+
+@@ -173,6 +176,7 @@ class nsCSSGradientRenderer final {
+ private:
+ nsCSSGradientRenderer()
+ : mPresContext(nullptr),
++ mFrame(nullptr),
+ mGradient(nullptr),
+ mRadiusX(0.0),
+ mRadiusY(0.0),
+@@ -192,6 +196,7 @@ class nsCSSGradientRenderer final {
+ const nsSize& aRepeatSize, bool aForceRepeatToCoverTiles);
+
+ nsPresContext* mPresContext;
++ const nsIFrame* mFrame;
+ const StyleGradient* mGradient;
+ nsTArray mStops;
+ gfxPoint mLineStart, mLineEnd; // only for linear/radial gradients
diff --git a/src/layout/painting/nsImageRenderer-cpp.patch b/src/layout/painting/nsImageRenderer-cpp.patch
new file mode 100644
index 000000000..574f1c0f6
--- /dev/null
+++ b/src/layout/painting/nsImageRenderer-cpp.patch
@@ -0,0 +1,40 @@
+diff --git a/layout/painting/nsImageRenderer.cpp b/layout/painting/nsImageRenderer.cpp
+index 4acb7670e971024f9c63e48ff711bbdd1dc02301..9ac1ae1b66eb6fb10195cd3709e0e29d8d53b574 100644
+--- a/layout/painting/nsImageRenderer.cpp
++++ b/layout/painting/nsImageRenderer.cpp
+@@ -90,7 +90,7 @@ static already_AddRefed GetSymbolicIconImage(nsAtom* aName,
+ if (NS_WARN_IF(!XRE_IsParentProcess())) {
+ return nullptr;
+ }
+- const auto fg = aFrame->StyleText()->mColor.ToColor();
++ const auto fg = aFrame->StyleText()->mColor.ToColor(aFrame);
+ auto key = std::make_tuple(aName, aScale, fg);
+ auto* cache = aFrame->GetProperty(SymbolicImageCacheProp());
+ if (!cache) {
+@@ -567,7 +567,7 @@ ImgDrawResult nsImageRenderer::Draw(nsPresContext* aPresContext,
+ }
+ case StyleImage::Tag::Gradient: {
+ nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(
+- aPresContext, mForFrame->Style(), *mGradientData, mSize);
++ aPresContext, mForFrame->Style(), mForFrame, *mGradientData, mSize);
+
+ renderer.Paint(*ctx, aDest, aFill, aRepeatSize, aSrc, aDirtyRect,
+ aOpacity);
+@@ -644,7 +644,7 @@ ImgDrawResult nsImageRenderer::BuildWebRenderDisplayItems(
+ switch (mType) {
+ case StyleImage::Tag::Gradient: {
+ nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(
+- aPresContext, mForFrame->Style(), *mGradientData, mSize);
++ aPresContext, mForFrame->Style(), mForFrame, *mGradientData, mSize);
+
+ renderer.BuildWebRenderDisplayItems(aBuilder, aSc, aDest, aFill,
+ aRepeatSize, aSrc,
+@@ -1076,7 +1076,7 @@ ImgDrawResult nsImageRenderer::DrawShapeImage(nsPresContext* aPresContext,
+
+ if (mImage->IsGradient()) {
+ nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(
+- aPresContext, mForFrame->Style(), *mGradientData, mSize);
++ aPresContext, mForFrame->Style(), mForFrame, *mGradientData, mSize);
+ nsRect dest(nsPoint(0, 0), mSize);
+ renderer.Paint(aRenderingContext, dest, dest, mSize,
+ CSSIntRect::FromAppUnitsRounded(dest), dest, 1.0);
diff --git a/src/layout/style/GeckoBindings-cpp.patch b/src/layout/style/GeckoBindings-cpp.patch
new file mode 100644
index 000000000..0c9df23d6
--- /dev/null
+++ b/src/layout/style/GeckoBindings-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/style/GeckoBindings.cpp b/layout/style/GeckoBindings.cpp
+index 56a16d313a5d30d12edf1f94459db1027af87002..3722f2d6ce6c0864956fed2b00c71a3286edc674 100644
+--- a/layout/style/GeckoBindings.cpp
++++ b/layout/style/GeckoBindings.cpp
+@@ -1068,7 +1068,7 @@ void Gecko_SetFontPaletteOverride(
+ return;
+ }
+ aValues->mOverrides.AppendElement(gfx::FontPaletteValueSet::OverrideColor{
+- uint32_t(aIndex), gfx::sRGBColor::FromABGR(aColor->ToColor())});
++ uint32_t(aIndex), gfx::sRGBColor::FromABGR(aColor->ToColor(nullptr))});
+ }
+
+ void Gecko_EnsureImageLayersLength(nsStyleImageLayers* aLayers, size_t aLen,
diff --git a/src/layout/style/StyleColor-cpp.patch b/src/layout/style/StyleColor-cpp.patch
index 7f0e9423b..f5aa44115 100644
--- a/src/layout/style/StyleColor-cpp.patch
+++ b/src/layout/style/StyleColor-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/layout/style/StyleColor.cpp b/layout/style/StyleColor.cpp
-index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..234a5fc3d94c341d6f8aea8f619661054d2f6a49 100644
+index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..85a48f27251756c72db8ed03a673a18e96cf76f9 100644
--- a/layout/style/StyleColor.cpp
+++ b/layout/style/StyleColor.cpp
@@ -8,6 +8,7 @@
@@ -10,7 +10,19 @@ index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..234a5fc3d94c341d6f8aea8f61966105
namespace mozilla {
-@@ -44,13 +45,14 @@ nscolor StyleColor::CalcColor(
+@@ -34,23 +35,24 @@ StyleAbsoluteColor StyleColor::ResolveColor(
+
+ template <>
+ nscolor StyleColor::CalcColor(nscolor aColor) const {
+- return ResolveColor(StyleAbsoluteColor::FromColor(aColor)).ToColor();
++ return ResolveColor(StyleAbsoluteColor::FromColor(aColor)).ToColor(nullptr);
+ }
+
+ template <>
+ nscolor StyleColor::CalcColor(
+ const StyleAbsoluteColor& aForegroundColor) const {
+- return ResolveColor(aForegroundColor).ToColor();
++ return ResolveColor(aForegroundColor).ToColor(nullptr);
}
template <>
diff --git a/src/layout/style/nsStyleStruct-cpp.patch b/src/layout/style/nsStyleStruct-cpp.patch
new file mode 100644
index 000000000..b4617b093
--- /dev/null
+++ b/src/layout/style/nsStyleStruct-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp
+index 80ca0cc08bc675359fbb09100eca43c8e3b9d413..d3ea525f6d84568c4e997a142bbfef6435d21034 100644
+--- a/layout/style/nsStyleStruct.cpp
++++ b/layout/style/nsStyleStruct.cpp
+@@ -2208,7 +2208,7 @@ nscolor nsStyleBackground::BackgroundColor(const nsIFrame* aFrame) const {
+ }
+
+ nscolor nsStyleBackground::BackgroundColor(const ComputedStyle* aStyle) const {
+- return mBackgroundColor.CalcColor(*aStyle);
++ return mBackgroundColor.CalcColor(*aStyle, nullptr);
+ }
+
+ bool nsStyleBackground::IsTransparent(const nsIFrame* aFrame) const {
diff --git a/src/layout/svg/SVGContextPaint-cpp.patch b/src/layout/svg/SVGContextPaint-cpp.patch
new file mode 100644
index 000000000..38110341c
--- /dev/null
+++ b/src/layout/svg/SVGContextPaint-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/svg/SVGContextPaint.cpp b/layout/svg/SVGContextPaint.cpp
+index 3df8728978c1b48ca326c852feb0553091a99673..9f9096205c3dd3551c41c547a1aee667c0a51238 100644
+--- a/layout/svg/SVGContextPaint.cpp
++++ b/layout/svg/SVGContextPaint.cpp
+@@ -143,7 +143,7 @@ static void SetupInheritablePaint(const DrawTarget* aDrawTarget,
+ }
+
+ nscolor color = SVGUtils::GetFallbackOrPaintColor(
+- *aFrame->Style(), aFillOrStroke, aDefaultFallbackColor);
++ *aFrame->Style(), aFillOrStroke, aDefaultFallbackColor, aFrame);
+ aTargetPaint.SetColor(color);
+ }
+
diff --git a/src/layout/svg/SVGGradientFrame-cpp.patch b/src/layout/svg/SVGGradientFrame-cpp.patch
new file mode 100644
index 000000000..f79ff277b
--- /dev/null
+++ b/src/layout/svg/SVGGradientFrame-cpp.patch
@@ -0,0 +1,42 @@
+diff --git a/layout/svg/SVGGradientFrame.cpp b/layout/svg/SVGGradientFrame.cpp
+index 9c66d90fc0292abcab30c912968d3f84c0e181ff..aec0b2e48965729ccff19d632ac5e8fd04fd09eb 100644
+--- a/layout/svg/SVGGradientFrame.cpp
++++ b/layout/svg/SVGGradientFrame.cpp
+@@ -229,8 +229,9 @@ class MOZ_STACK_CLASS SVGColorStopInterpolator
+ SVGColorStopInterpolator(
+ gfxPattern* aGradient, const nsTArray& aStops,
+ const StyleColorInterpolationMethod& aStyleColorInterpolationMethod,
+- bool aExtend)
+- : ColorStopInterpolator(aStops, aStyleColorInterpolationMethod, aExtend),
++ bool aExtend, const nsIFrame* aFrame)
++ : ColorStopInterpolator(aStops, aStyleColorInterpolationMethod, aExtend,
++ aFrame),
+ mGradient(aGradient) {}
+
+ void CreateStop(float aPosition, DeviceColor aColor) {
+@@ -270,7 +271,8 @@ already_AddRefed SVGGradientFrame::GetPaintServerPattern(
+ if (nStops == 1 || GradientVectorLengthIsZero()) {
+ // The gradient paints a single colour, using the stop-color of the last
+ // gradient step if there are more than one.
+- return do_AddRef(new gfxPattern(ToDeviceColor(stops.LastElement().mColor)));
++ return do_AddRef(
++ new gfxPattern(ToDeviceColor(stops.LastElement().mColor, aSource)));
+ }
+
+ // Get the transform list (if there is one). We do this after the returns
+@@ -313,12 +315,13 @@ already_AddRefed SVGGradientFrame::GetPaintServerPattern(
+ static constexpr auto interpolationMethod = StyleColorInterpolationMethod{
+ StyleColorSpace::SrgbLinear, StyleHueInterpolationMethod::Shorter};
+ SVGColorStopInterpolator interpolator(gradient, stops, interpolationMethod,
+- false);
++ false, aSource);
+ interpolator.CreateStops();
+ } else {
+ // setup standard sRGB stops
+ for (const auto& stop : stops) {
+- gradient->AddColorStop(stop.mPosition, ToDeviceColor(stop.mColor));
++ gradient->AddColorStop(stop.mPosition,
++ ToDeviceColor(stop.mColor, aSource));
+ }
+ }
+
diff --git a/src/layout/svg/SVGImageContext-cpp.patch b/src/layout/svg/SVGImageContext-cpp.patch
new file mode 100644
index 000000000..e14b964cd
--- /dev/null
+++ b/src/layout/svg/SVGImageContext-cpp.patch
@@ -0,0 +1,21 @@
+diff --git a/layout/svg/SVGImageContext.cpp b/layout/svg/SVGImageContext.cpp
+index ecbda963b75fb70b62885a0c8f7a517011a8d5dc..1200a51aee7db4ee1a014308581ada1002c0d05f 100644
+--- a/layout/svg/SVGImageContext.cpp
++++ b/layout/svg/SVGImageContext.cpp
+@@ -57,12 +57,14 @@ void SVGImageContext::MaybeStoreContextPaint(SVGImageContext& aContext,
+ if ((style->mMozContextProperties.bits & StyleContextPropertyBits::FILL) &&
+ style->mFill.kind.IsColor()) {
+ haveContextPaint = true;
+- contextPaint->SetFill(style->mFill.kind.AsColor().CalcColor(aStyle));
++ contextPaint->SetFill(
++ style->mFill.kind.AsColor().CalcColor(aStyle, nullptr));
+ }
+ if ((style->mMozContextProperties.bits & StyleContextPropertyBits::STROKE) &&
+ style->mStroke.kind.IsColor()) {
+ haveContextPaint = true;
+- contextPaint->SetStroke(style->mStroke.kind.AsColor().CalcColor(aStyle));
++ contextPaint->SetStroke(
++ style->mStroke.kind.AsColor().CalcColor(aStyle, nullptr));
+ }
+ if (style->mMozContextProperties.bits &
+ StyleContextPropertyBits::FILL_OPACITY) {
diff --git a/src/layout/svg/SVGUtils-cpp.patch b/src/layout/svg/SVGUtils-cpp.patch
new file mode 100644
index 000000000..577ca64ba
--- /dev/null
+++ b/src/layout/svg/SVGUtils-cpp.patch
@@ -0,0 +1,60 @@
+diff --git a/layout/svg/SVGUtils.cpp b/layout/svg/SVGUtils.cpp
+index 93b73e1c665ea8e011af7026810db6cd23c8049b..004d1d0637d62fcde25a924df5392a7dc64f75dc 100644
+--- a/layout/svg/SVGUtils.cpp
++++ b/layout/svg/SVGUtils.cpp
+@@ -1154,23 +1154,23 @@ gfxRect SVGUtils::PathExtentsToMaxStrokeExtents(const gfxRect& aPathExtents,
+ /* static */
+ nscolor SVGUtils::GetFallbackOrPaintColor(
+ const ComputedStyle& aStyle, StyleSVGPaint nsStyleSVG::* aFillOrStroke,
+- nscolor aDefaultContextFallbackColor) {
++ nscolor aDefaultContextFallbackColor, const nsIFrame* aFrame) {
+ const auto& paint = aStyle.StyleSVG()->*aFillOrStroke;
+ nscolor color;
+ switch (paint.kind.tag) {
+ case StyleSVGPaintKind::Tag::PaintServer:
+ color = paint.fallback.IsColor()
+- ? paint.fallback.AsColor().CalcColor(aStyle)
++ ? paint.fallback.AsColor().CalcColor(aStyle, aFrame)
+ : NS_RGBA(0, 0, 0, 0);
+ break;
+ case StyleSVGPaintKind::Tag::ContextStroke:
+ case StyleSVGPaintKind::Tag::ContextFill:
+ color = paint.fallback.IsColor()
+- ? paint.fallback.AsColor().CalcColor(aStyle)
++ ? paint.fallback.AsColor().CalcColor(aStyle, aFrame)
+ : aDefaultContextFallbackColor;
+ break;
+ default:
+- color = paint.kind.AsColor().CalcColor(aStyle);
++ color = paint.kind.AsColor().CalcColor(aStyle, aFrame);
+ break;
+ }
+ if (const auto* styleIfVisited = aStyle.GetStyleIfVisited()) {
+@@ -1184,7 +1184,8 @@ nscolor SVGUtils::GetFallbackOrPaintColor(
+ // another simple color.
+ if (paintIfVisited.kind.IsColor() && paint.kind.IsColor()) {
+ nscolor colors[2] = {
+- color, paintIfVisited.kind.AsColor().CalcColor(*styleIfVisited)};
++ color,
++ paintIfVisited.kind.AsColor().CalcColor(*styleIfVisited, aFrame)};
+ return ComputedStyle::CombineVisitedColors(colors,
+ aStyle.RelevantLinkVisited());
+ }
+@@ -1254,7 +1255,7 @@ void SVGUtils::MakeFillPatternFor(nsIFrame* aFrame, gfxContext* aContext,
+ // objectBoundingBox where the width or height of the object is zero.
+ // See http://www.w3.org/TR/SVG11/coords.html#ObjectBoundingBox
+ sRGBColor color(sRGBColor::FromABGR(GetFallbackOrPaintColor(
+- *aFrame->Style(), &nsStyleSVG::mFill, NS_RGB(0, 0, 0))));
++ *aFrame->Style(), &nsStyleSVG::mFill, NS_RGB(0, 0, 0), aFrame)));
+ color.a *= fillOpacity;
+ aOutPattern->InitColorPattern(ToDeviceColor(color));
+ }
+@@ -1321,7 +1322,7 @@ void SVGUtils::MakeStrokePatternFor(nsIFrame* aFrame, gfxContext* aContext,
+ // objectBoundingBox where the width or height of the object is zero.
+ // See http://www.w3.org/TR/SVG11/coords.html#ObjectBoundingBox
+ sRGBColor color(sRGBColor::FromABGR(GetFallbackOrPaintColor(
+- *aFrame->Style(), &nsStyleSVG::mStroke, NS_RGBA(0, 0, 0, 0))));
++ *aFrame->Style(), &nsStyleSVG::mStroke, NS_RGBA(0, 0, 0, 0), aFrame)));
+ color.a *= strokeOpacity;
+ aOutPattern->InitColorPattern(ToDeviceColor(color));
+ }
diff --git a/src/layout/svg/SVGUtils-h.patch b/src/layout/svg/SVGUtils-h.patch
new file mode 100644
index 000000000..6adbbff91
--- /dev/null
+++ b/src/layout/svg/SVGUtils-h.patch
@@ -0,0 +1,13 @@
+diff --git a/layout/svg/SVGUtils.h b/layout/svg/SVGUtils.h
+index 1f1f7ad6b78e5c411651fee30bbbfeb784257e0a..28c7332aae411c4220bd00af08b491d31d2eb090 100644
+--- a/layout/svg/SVGUtils.h
++++ b/layout/svg/SVGUtils.h
+@@ -428,7 +428,7 @@ class SVGUtils final {
+
+ static nscolor GetFallbackOrPaintColor(
+ const ComputedStyle&, StyleSVGPaint nsStyleSVG::* aFillOrStroke,
+- nscolor aDefaultContextFallbackColor);
++ nscolor aDefaultContextFallbackColor, const nsIFrame* aFrame);
+
+ static void MakeFillPatternFor(nsIFrame* aFrame, gfxContext* aContext,
+ GeneralPattern* aOutPattern,
diff --git a/src/layout/xul/tree/nsTreeBodyFrame-cpp.patch b/src/layout/xul/tree/nsTreeBodyFrame-cpp.patch
index 30fc951a7..2b834bb1d 100644
--- a/src/layout/xul/tree/nsTreeBodyFrame-cpp.patch
+++ b/src/layout/xul/tree/nsTreeBodyFrame-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/layout/xul/tree/nsTreeBodyFrame.cpp b/layout/xul/tree/nsTreeBodyFrame.cpp
-index b6aa10336e7994c830e0326298820c3a534f8094..b3ddb7b9b3ceb8b868e7e48e02fdb70a876c9019 100644
+index b6aa10336e7994c830e0326298820c3a534f8094..7747c52e5c5d227894d8f7fb377c65861dc51c4c 100644
--- a/layout/xul/tree/nsTreeBodyFrame.cpp
+++ b/layout/xul/tree/nsTreeBodyFrame.cpp
@@ -2865,7 +2865,8 @@ ImgDrawResult nsTreeBodyFrame::PaintCell(
@@ -12,6 +12,15 @@ index b6aa10336e7994c830e0326298820c3a534f8094..b3ddb7b9b3ceb8b868e7e48e02fdb70a
ColorPattern colorPatt(ToDeviceColor(color));
StyleBorderStyle style = borderStyle->GetBorderStyle(eSideLeft);
+@@ -3300,7 +3301,7 @@ ImgDrawResult nsTreeBodyFrame::PaintText(
+ textRect.Deflate(bp);
+
+ // Set our color.
+- ColorPattern color(ToDeviceColor(textContext->StyleText()->mColor));
++ ColorPattern color(ToDeviceColor(textContext->StyleText()->mColor, this));
+
+ // Draw decorations.
+ StyleTextDecorationLine decorations =
@@ -3340,7 +3341,7 @@ ImgDrawResult nsTreeBodyFrame::PaintText(
}
diff --git a/src/servo/ports/geckolib/cbindgen-toml.patch b/src/servo/ports/geckolib/cbindgen-toml.patch
index 0bf358476..24433b060 100644
--- a/src/servo/ports/geckolib/cbindgen-toml.patch
+++ b/src/servo/ports/geckolib/cbindgen-toml.patch
@@ -1,5 +1,5 @@
diff --git a/servo/ports/geckolib/cbindgen.toml b/servo/ports/geckolib/cbindgen.toml
-index e9ae0149e80a241b2a32ce445deb923af2fac445..464f4e8b853d26bd2da327de8bf8bb50e5ab8599 100644
+index e9ae0149e80a241b2a32ce445deb923af2fac445..0dc5768ab8bf89f7d6c31ff4c7bd4bb805d64509 100644
--- a/servo/ports/geckolib/cbindgen.toml
+++ b/servo/ports/geckolib/cbindgen.toml
@@ -679,9 +679,9 @@ renaming_overrides_prefixing = true
@@ -10,7 +10,7 @@ index e9ae0149e80a241b2a32ce445deb923af2fac445..464f4e8b853d26bd2da327de8bf8bb50
+ * style. The frame, when supplied, is used to resolve Zen boosts.
*/
- nscolor CalcColor(const ComputedStyle&) const;
-+ nscolor CalcColor(const ComputedStyle&, const nsIFrame* = nullptr) const;
++ nscolor CalcColor(const ComputedStyle&, const nsIFrame*) const;
/**
* Compute the final color, making the argument the foreground color.
*/
@@ -24,7 +24,7 @@ index e9ae0149e80a241b2a32ce445deb923af2fac445..464f4e8b853d26bd2da327de8bf8bb50
+ * document, or null to skip boost resolution.
*/
- nscolor ToColor() const;
-+ nscolor ToColor(const nsIFrame* = nullptr) const;
++ nscolor ToColor(const nsIFrame*) const;
"""
"OwnedSlice" = """
diff --git a/src/widget/ScrollbarDrawing-cpp.patch b/src/widget/ScrollbarDrawing-cpp.patch
new file mode 100644
index 000000000..43e784ca0
--- /dev/null
+++ b/src/widget/ScrollbarDrawing-cpp.patch
@@ -0,0 +1,23 @@
+diff --git a/widget/ScrollbarDrawing.cpp b/widget/ScrollbarDrawing.cpp
+index fec73f8a8cbfbf952f1d14f1a4eb2b20f9b5aad4..375ef5654cf61e4dea102588679d2ac2060d299a 100644
+--- a/widget/ScrollbarDrawing.cpp
++++ b/widget/ScrollbarDrawing.cpp
+@@ -121,7 +121,7 @@ sRGBColor ScrollbarDrawing::ComputeScrollbarTrackColor(
+ const nsStyleUI* ui = aStyle.StyleUI();
+ if (ui->mScrollbarColor.IsColors()) {
+ return sRGBColor::FromABGR(
+- ui->mScrollbarColor.AsColors().track.CalcColor(aStyle));
++ ui->mScrollbarColor.AsColors().track.CalcColor(aStyle, aFrame));
+ }
+ static constexpr sRGBColor sDefaultDarkTrackColor =
+ sRGBColor::FromU8(20, 20, 25, 77);
+@@ -143,7 +143,8 @@ sRGBColor ScrollbarDrawing::ComputeScrollbarThumbColor(
+ const nsStyleUI* ui = aStyle.StyleUI();
+ if (ui->mScrollbarColor.IsColors()) {
+ return sRGBColor::FromABGR(ThemeColors::AdjustUnthemedScrollbarThumbColor(
+- ui->mScrollbarColor.AsColors().thumb.CalcColor(aStyle), aElementState));
++ ui->mScrollbarColor.AsColors().thumb.CalcColor(aStyle, aFrame),
++ aElementState));
+ }
+
+ auto systemColor = [&] {
diff --git a/src/widget/ScrollbarDrawingCocoa-cpp.patch b/src/widget/ScrollbarDrawingCocoa-cpp.patch
new file mode 100644
index 000000000..a1df0b9a7
--- /dev/null
+++ b/src/widget/ScrollbarDrawingCocoa-cpp.patch
@@ -0,0 +1,15 @@
+diff --git a/widget/ScrollbarDrawingCocoa.cpp b/widget/ScrollbarDrawingCocoa.cpp
+index f0dff9276f9880034c800413c4afc2400136b35a..1dd5b53bfda64e1d3b4c1870680fa1a43de0e6fb 100644
+--- a/widget/ScrollbarDrawingCocoa.cpp
++++ b/widget/ScrollbarDrawingCocoa.cpp
+@@ -61,8 +61,8 @@ static ScrollbarParams ComputeScrollbarParams(nsIFrame* aFrame,
+ if (ui->HasCustomScrollbars()) {
+ const auto& colors = ui->mScrollbarColor.AsColors();
+ params.isCustom = true;
+- params.trackColor = colors.track.CalcColor(aStyle);
+- params.faceColor = colors.thumb.CalcColor(aStyle);
++ params.trackColor = colors.track.CalcColor(aStyle, aFrame);
++ params.faceColor = colors.thumb.CalcColor(aStyle, aFrame);
+ }
+
+ return params;
diff --git a/src/widget/ScrollbarDrawingWin11-cpp.patch b/src/widget/ScrollbarDrawingWin11-cpp.patch
new file mode 100644
index 000000000..aa707014d
--- /dev/null
+++ b/src/widget/ScrollbarDrawingWin11-cpp.patch
@@ -0,0 +1,22 @@
+diff --git a/widget/ScrollbarDrawingWin11.cpp b/widget/ScrollbarDrawingWin11.cpp
+index be059ca615d1e0281af64984cfc8121be2f6e305..6326c98b369d948052c3cb1df13c8cfaaa472f5c 100644
+--- a/widget/ScrollbarDrawingWin11.cpp
++++ b/widget/ScrollbarDrawingWin11.cpp
+@@ -78,7 +78,7 @@ sRGBColor ScrollbarDrawingWin11::ComputeScrollbarTrackColor(
+ const nsStyleUI* ui = aStyle.StyleUI();
+ if (ui->mScrollbarColor.IsColors()) {
+ return sRGBColor::FromABGR(
+- ui->mScrollbarColor.AsColors().track.CalcColor(aStyle));
++ ui->mScrollbarColor.AsColors().track.CalcColor(aStyle, aFrame));
+ }
+ return aColors.IsDark() ? sRGBColor::FromU8(23, 23, 23, 255)
+ : sRGBColor::FromU8(240, 240, 240, 255);
+@@ -94,7 +94,7 @@ sRGBColor ScrollbarDrawingWin11::ComputeScrollbarThumbColor(
+ const nscolor baseColor = [&] {
+ const nsStyleUI* ui = aStyle.StyleUI();
+ if (ui->mScrollbarColor.IsColors()) {
+- return ui->mScrollbarColor.AsColors().thumb.CalcColor(aStyle);
++ return ui->mScrollbarColor.AsColors().thumb.CalcColor(aStyle, aFrame);
+ }
+ return aColors.IsDark() ? NS_RGBA(149, 149, 149, 255)
+ : NS_RGBA(133, 133, 133, 255);
diff --git a/src/widget/ThemeColors-cpp.patch b/src/widget/ThemeColors-cpp.patch
new file mode 100644
index 000000000..c4f7c6167
--- /dev/null
+++ b/src/widget/ThemeColors-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/widget/ThemeColors.cpp b/widget/ThemeColors.cpp
+index 0ac3a8cbb04258312cba20a89a23700c6fd1b49f..dfd5203c1a795fc14befa88a474f241dd16e9c8f 100644
+--- a/widget/ThemeColors.cpp
++++ b/widget/ThemeColors.cpp
+@@ -113,7 +113,7 @@ ThemeAccentColor::ThemeAccentColor(const ComputedStyle& aStyle,
+ }
+ MOZ_ASSERT(color.IsColor());
+ nscolor accentColor =
+- ColorPalette::EnsureOpaque(color.AsColor().CalcColor(aStyle));
++ ColorPalette::EnsureOpaque(color.AsColor().CalcColor(aStyle, nullptr));
+ if (sRGBColor::FromABGR(accentColor) == mDefaultPalette->mAccent) {
+ return;
+ }
diff --git a/src/zen/boosts/nsZenBoostsBackend.cpp b/src/zen/boosts/nsZenBoostsBackend.cpp
index 3c12f3e15..f9eaf6461 100644
--- a/src/zen/boosts/nsZenBoostsBackend.cpp
+++ b/src/zen/boosts/nsZenBoostsBackend.cpp
@@ -25,6 +25,8 @@
#include "mozilla/dom/Document.h"
#include "mozilla/dom/DocumentInlines.h"
#include "mozilla/dom/BrowsingContext.h"
+#include "mozilla/dom/Element.h"
+#include "mozilla/PseudoStyleType.h"
#include "mozilla/StaticPrefs_zen.h"
@@ -384,6 +386,8 @@ inline static nscolor zenInvertColorChannel(nscolor aColor) {
* not touch (devtools highlighters, screenshots, the boosts overlays
* themselves, and other native-anonymous UI such as scrollbars). A null frame
* gives no document to anchor the boost on, so it is treated the same way.
+ * CSS generated content (::before/::after/::marker/::backdrop) is
+ * native-anonymous too but is author content, so it is not exempt.
*/
ZEN_HOT_FUNCTION
inline static bool IsBoostExemptFrame(const nsIFrame* aFrame) {
@@ -391,7 +395,24 @@ inline static bool IsBoostExemptFrame(const nsIFrame* aFrame) {
return true;
}
const nsIContent* content = aFrame->GetContent();
- return content && content->IsInNativeAnonymousSubtree();
+ if (!content || !content->IsInNativeAnonymousSubtree()) {
+ return false;
+ }
+ if (const nsIContent* root =
+ content->GetClosestNativeAnonymousSubtreeRoot()) {
+ if (root->IsElement()) {
+ switch (root->AsElement()->GetPseudoElementType()) {
+ case mozilla::PseudoStyleType::Before:
+ case mozilla::PseudoStyleType::After:
+ case mozilla::PseudoStyleType::Marker:
+ case mozilla::PseudoStyleType::Backdrop:
+ return false;
+ default:
+ break;
+ }
+ }
+ }
+ return true;
}
/**
diff --git a/src/zen/common/styles/zen-popup.css b/src/zen/common/styles/zen-popup.css
index 8c29733b0..68c64b713 100644
--- a/src/zen/common/styles/zen-popup.css
+++ b/src/zen/common/styles/zen-popup.css
@@ -8,7 +8,6 @@
@import url("chrome://browser/content/zen-styles/zen-panels/dialog.css");
:root {
- --panel-subview-body-padding: 2px 0;
--arrowpanel-menuitem-border-radius: 5px;
--arrowpanel-menuitem-margin: var(--uc-arrowpanel-menuitem-margin-block) var(--uc-arrowpanel-menuitem-margin-inline);
--arrowpanel-menuitem-padding-block: 8px;
@@ -68,8 +67,7 @@ panel {
}
.widget-overflow-list .toolbarbutton-1:not(.toolbarbutton-combined) > .toolbarbutton-text,
-.subviewbutton:not(#appMenu-zoom-controls > .subviewbutton) > .toolbarbutton-icon + .toolbarbutton-text,
-#appMenu-fxa-label2 > vbox {
+.subviewbutton:not(#appMenu-zoom-controls > .subviewbutton) > .toolbarbutton-icon + .toolbarbutton-text {
padding-inline-start: var(--uc-arrowpanel-menuicon-margin-inline);
}
@@ -88,17 +86,6 @@ panel {
white-space: nowrap;
}
-/* Firefox profile avatar in appmenu */
-#appMenu-fxa-label2::before {
- content: "";
- display: -moz-box;
- height: var(--size-item-small);
- width: var(--size-item-small);
- background: var(--avatar-image-url) 0/16px;
- scale: 1.25;
- border-radius: 99px;
-}
-
/* disable proton account separator */
#appMenu-fxa-separator {
border-image: none;
@@ -108,10 +95,6 @@ panel {
padding-block: 0;
}
-#appMenu-fxa-status2:not([fxastatus]) > #appMenu-fxa-label2 {
- margin-inline-end: calc(var(--arrowpanel-menuitem-padding-inline) * -1);
-}
-
/* zoom controls */
#appMenu-zoom-controls {
border-top: 1px solid var(--panel-separator-color);
From 1c29206e079e0b94ceeeadbbfd09006b22063e96 Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Tue, 26 May 2026 23:14:36 +0200
Subject: [PATCH 26/31] gh-12284: Sync upstream Firefox to version `151.0.2`
(gh-13875)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This PR syncs the upstream Firefox to version 151.0.2.
* ⚠️ Some patches did not apply cleanly. Please review them carefully.
@mr-cheffy please review and merge this PR.
---------
Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
---
README.md | 4 ++--
build/firefox-cache/l10n-last-commit-hash | 2 +-
src/browser/modules/URILoadingHelper-sys-mjs.patch | 12 ++++++------
src/zen/sessionstore/ZenWindowSync.sys.mjs | 9 ++++++++-
surfer.json | 6 +++---
5 files changed, 20 insertions(+), 13 deletions(-)
diff --git a/README.md b/README.md
index 5e46f4dc9..cb51a0f61 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 `151.0.1`! 🚀
-- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 151.0.1`!
+- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `151.0.2`! 🚀
+- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 151.0.2`!
### Contributing
diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash
index f6c433445..7bcc95dc3 100644
--- a/build/firefox-cache/l10n-last-commit-hash
+++ b/build/firefox-cache/l10n-last-commit-hash
@@ -1 +1 @@
-10b4efc5a79c2ab80de3b22771b1d36b9b225920
\ No newline at end of file
+05272df13c2e4f435b4e0a706715f302b09ef829
\ No newline at end of file
diff --git a/src/browser/modules/URILoadingHelper-sys-mjs.patch b/src/browser/modules/URILoadingHelper-sys-mjs.patch
index a804e232a..82ac3592b 100644
--- a/src/browser/modules/URILoadingHelper-sys-mjs.patch
+++ b/src/browser/modules/URILoadingHelper-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/modules/URILoadingHelper.sys.mjs b/browser/modules/URILoadingHelper.sys.mjs
-index ed6b9fda700b2b4b35836a77a4da953377a72f4b..22acedcf1006f994ec8b6bf8991b4202e12a6f39 100644
+index bd2e54e914b171df9b8bcc7dcbc2388e9641f6c6..8b3cb6542bea3fb89e47adc93cb13f94447450e2 100644
--- a/browser/modules/URILoadingHelper.sys.mjs
+++ b/browser/modules/URILoadingHelper.sys.mjs
-@@ -224,6 +224,7 @@ function openInWindow(url, params, sourceWindow) {
+@@ -228,6 +228,7 @@ function openInWindow(url, params, sourceWindow) {
features,
sa
);
@@ -10,7 +10,7 @@ index ed6b9fda700b2b4b35836a77a4da953377a72f4b..22acedcf1006f994ec8b6bf8991b4202
}
function openInCurrentTab(targetBrowser, url, uriObj, params) {
-@@ -541,7 +542,7 @@ export const URILoadingHelper = {
+@@ -545,7 +546,7 @@ export const URILoadingHelper = {
// page. If a load request bounces off for the currently selected tab,
// we'll open a new tab instead.
let tab = w.gBrowser.getTabForBrowser(targetBrowser);
@@ -19,7 +19,7 @@ index ed6b9fda700b2b4b35836a77a4da953377a72f4b..22acedcf1006f994ec8b6bf8991b4202
where = "tab";
targetBrowser = null;
} else if (
-@@ -974,7 +975,7 @@ export const URILoadingHelper = {
+@@ -978,7 +979,7 @@ export const URILoadingHelper = {
ignoreQueryString || replaceQueryString,
ignoreFragmentWhenComparing
);
@@ -28,8 +28,8 @@ index ed6b9fda700b2b4b35836a77a4da953377a72f4b..22acedcf1006f994ec8b6bf8991b4202
for (let i = 0; i < browsers.length; i++) {
let browser = browsers[i];
let browserCompare = cleanURL(
-@@ -1026,7 +1027,7 @@ export const URILoadingHelper = {
- aSplitView.replaceTab(tabToReplace, tabToMove);
+@@ -1034,7 +1035,7 @@ export const URILoadingHelper = {
+ }
aSplitView.ownerGlobal.focus();
} else {
- aWindow.gBrowser.tabContainer.selectedIndex = i;
diff --git a/src/zen/sessionstore/ZenWindowSync.sys.mjs b/src/zen/sessionstore/ZenWindowSync.sys.mjs
index ede60adeb..12993d74b 100644
--- a/src/zen/sessionstore/ZenWindowSync.sys.mjs
+++ b/src/zen/sessionstore/ZenWindowSync.sys.mjs
@@ -1534,7 +1534,14 @@ class nsZenWindowSync {
window.removeEventListener(eventName, this);
}
delete window.gZenWindowSync;
- this.#moveAllActiveTabsToOtherWindowsForClose(window);
+ const { promise, resolve } = Promise.withResolvers();
+ this.#docShellSwitchPromise = promise;
+ try {
+ this.#moveAllActiveTabsToOtherWindowsForClose(window);
+ } catch (e) {
+ console.error(`Error moving active tabs to other windows on close:`, e);
+ }
+ resolve();
}
on_WindowCloseAndBrowserFlushed(aBrowsers) {
diff --git a/surfer.json b/surfer.json
index ef7606370..a53e9df9a 100644
--- a/surfer.json
+++ b/surfer.json
@@ -5,8 +5,8 @@
"binaryName": "zen",
"version": {
"product": "firefox",
- "version": "151.0.1",
- "candidate": "151.0.1",
+ "version": "151.0.2",
+ "candidate": "151.0.2",
"candidateBuild": 1
},
"buildOptions": {
@@ -20,7 +20,7 @@
"brandShortName": "Zen",
"brandFullName": "Zen Browser",
"release": {
- "displayVersion": "1.20b",
+ "displayVersion": "1.20.1b",
"github": {
"repo": "zen-browser/desktop"
},
From 0863d7f4c05f5d0625ce12d82cd1b3ada7515ef9 Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Tue, 26 May 2026 23:37:42 +0200
Subject: [PATCH 27/31] no-bug: New Crowdin updates (gh-13866)
---
.../browser/preferences/zen-preferences.ftl | 2 +
locales/ar/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/bg/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/bs/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/ca/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/cs/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 4 +-
locales/cy/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
locales/cy/browser/browser/zen-general.ftl | 2 +-
locales/cy/browser/browser/zen-split-view.ftl | 6 +-
.../cy/browser/browser/zen-vertical-tabs.ftl | 4 +-
.../browser/preferences/zen-preferences.ftl | 2 +
locales/da/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/de/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/el/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
locales/el/browser/browser/zen-general.ftl | 4 +-
.../browser/preferences/zen-preferences.ftl | 2 +
locales/en-GB/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/es-ES/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/et/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/eu/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/fa/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/fi/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/fr/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/ga-IE/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 10 ++--
locales/he/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
locales/he/browser/browser/zen-general.ftl | 6 +-
locales/he/browser/browser/zen-menubar.ftl | 2 +-
.../he/browser/browser/zen-vertical-tabs.ftl | 4 +-
locales/he/browser/browser/zen-workspaces.ftl | 2 +-
.../browser/preferences/zen-preferences.ftl | 2 +
locales/hu/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/id/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/is/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/it/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/ja/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/ko/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 10 ++--
locales/lt/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
locales/lt/browser/browser/zen-general.ftl | 4 +-
.../browser/preferences/zen-preferences.ftl | 2 +
locales/nb/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/nl/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/nn-NO/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/pl/browser/browser/zen-boosts.ftl | 59 +++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 24 ++++----
locales/pt-BR/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/pt-PT/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/ro/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/ru/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
locales/ru/browser/browser/zen-general.ftl | 2 +-
.../browser/preferences/zen-preferences.ftl | 2 +
locales/sk/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/sv-SE/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/th/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/tr/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 2 +
locales/uk/browser/browser/zen-boosts.ftl | 59 +++++++++++++++++++
locales/uk/browser/browser/zen-split-view.ftl | 4 +-
.../browser/preferences/zen-preferences.ftl | 4 +-
locales/vi/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
locales/vi/browser/browser/zen-general.ftl | 6 +-
locales/vi/browser/browser/zen-split-view.ftl | 6 +-
.../vi/browser/browser/zen-vertical-tabs.ftl | 2 +-
.../browser/preferences/zen-preferences.ftl | 2 +
locales/zh-CN/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
.../browser/preferences/zen-preferences.ftl | 22 +++----
locales/zh-TW/browser/browser/zen-boosts.ftl | 58 ++++++++++++++++++
locales/zh-TW/browser/browser/zen-general.ftl | 8 +--
97 files changed, 2524 insertions(+), 62 deletions(-)
create mode 100644 locales/ar/browser/browser/zen-boosts.ftl
create mode 100644 locales/bg/browser/browser/zen-boosts.ftl
create mode 100644 locales/bs/browser/browser/zen-boosts.ftl
create mode 100644 locales/ca/browser/browser/zen-boosts.ftl
create mode 100644 locales/cs/browser/browser/zen-boosts.ftl
create mode 100644 locales/cy/browser/browser/zen-boosts.ftl
create mode 100644 locales/da/browser/browser/zen-boosts.ftl
create mode 100644 locales/de/browser/browser/zen-boosts.ftl
create mode 100644 locales/el/browser/browser/zen-boosts.ftl
create mode 100644 locales/en-GB/browser/browser/zen-boosts.ftl
create mode 100644 locales/es-ES/browser/browser/zen-boosts.ftl
create mode 100644 locales/et/browser/browser/zen-boosts.ftl
create mode 100644 locales/eu/browser/browser/zen-boosts.ftl
create mode 100644 locales/fa/browser/browser/zen-boosts.ftl
create mode 100644 locales/fi/browser/browser/zen-boosts.ftl
create mode 100644 locales/fr/browser/browser/zen-boosts.ftl
create mode 100644 locales/ga-IE/browser/browser/zen-boosts.ftl
create mode 100644 locales/he/browser/browser/zen-boosts.ftl
create mode 100644 locales/hu/browser/browser/zen-boosts.ftl
create mode 100644 locales/id/browser/browser/zen-boosts.ftl
create mode 100644 locales/is/browser/browser/zen-boosts.ftl
create mode 100644 locales/it/browser/browser/zen-boosts.ftl
create mode 100644 locales/ja/browser/browser/zen-boosts.ftl
create mode 100644 locales/ko/browser/browser/zen-boosts.ftl
create mode 100644 locales/lt/browser/browser/zen-boosts.ftl
create mode 100644 locales/nb/browser/browser/zen-boosts.ftl
create mode 100644 locales/nl/browser/browser/zen-boosts.ftl
create mode 100644 locales/nn-NO/browser/browser/zen-boosts.ftl
create mode 100644 locales/pl/browser/browser/zen-boosts.ftl
create mode 100644 locales/pt-BR/browser/browser/zen-boosts.ftl
create mode 100644 locales/pt-PT/browser/browser/zen-boosts.ftl
create mode 100644 locales/ro/browser/browser/zen-boosts.ftl
create mode 100644 locales/ru/browser/browser/zen-boosts.ftl
create mode 100644 locales/sk/browser/browser/zen-boosts.ftl
create mode 100644 locales/sv-SE/browser/browser/zen-boosts.ftl
create mode 100644 locales/th/browser/browser/zen-boosts.ftl
create mode 100644 locales/tr/browser/browser/zen-boosts.ftl
create mode 100644 locales/uk/browser/browser/zen-boosts.ftl
create mode 100644 locales/vi/browser/browser/zen-boosts.ftl
create mode 100644 locales/zh-CN/browser/browser/zen-boosts.ftl
create mode 100644 locales/zh-TW/browser/browser/zen-boosts.ftl
diff --git a/locales/ar/browser/browser/preferences/zen-preferences.ftl b/locales/ar/browser/browser/preferences/zen-preferences.ftl
index c8d4332a5..a7b2acc92 100644
--- a/locales/ar/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ar/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = التبديل إلى مساحة العمل 9
zen-workspace-shortcut-switch-10 = التبديل إلى مساحة العمل 10
zen-workspace-shortcut-forward = إلى الأمام فضاء العمل
zen-workspace-shortcut-backward = مساحة العمل الخلفية
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = تبديل عرض شريط العرض
zen-pinned-tab-shortcut-reset = إعادة تعيين علامة التبويب المثبتة إلى عنوان URL المثبت
zen-split-view-shortcut-grid = تبديل عرض تقسيم الشبكة
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = قلب إمكانية الوصول
zen-close-all-unpinned-tabs-shortcut = إغلاق جميع علامات التبويب الغير مثبتة
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/ar/browser/browser/zen-boosts.ftl b/locales/ar/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/ar/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/bg/browser/browser/preferences/zen-preferences.ftl b/locales/bg/browser/browser/preferences/zen-preferences.ftl
index ed26f72b8..a43ff8124 100644
--- a/locales/bg/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/bg/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Switch to Workspace 9
zen-workspace-shortcut-switch-10 = Switch to Workspace 10
zen-workspace-shortcut-forward = Forward Workspace
zen-workspace-shortcut-backward = Backward Workspace
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Toggle Sidebar's Width
zen-pinned-tab-shortcut-reset = Reset Pinned Tab to Pinned URL
zen-split-view-shortcut-grid = Toggle Split View Grid
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/bg/browser/browser/zen-boosts.ftl b/locales/bg/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/bg/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/bs/browser/browser/preferences/zen-preferences.ftl b/locales/bs/browser/browser/preferences/zen-preferences.ftl
index ed26f72b8..a43ff8124 100644
--- a/locales/bs/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/bs/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Switch to Workspace 9
zen-workspace-shortcut-switch-10 = Switch to Workspace 10
zen-workspace-shortcut-forward = Forward Workspace
zen-workspace-shortcut-backward = Backward Workspace
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Toggle Sidebar's Width
zen-pinned-tab-shortcut-reset = Reset Pinned Tab to Pinned URL
zen-split-view-shortcut-grid = Toggle Split View Grid
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/bs/browser/browser/zen-boosts.ftl b/locales/bs/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/bs/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/ca/browser/browser/preferences/zen-preferences.ftl b/locales/ca/browser/browser/preferences/zen-preferences.ftl
index 4b9b2c758..b7477fb97 100644
--- a/locales/ca/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ca/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Canvia a l'espai de treball 9
zen-workspace-shortcut-switch-10 = Canvia a l'espai de treball 10
zen-workspace-shortcut-forward = Espai de treball següent
zen-workspace-shortcut-backward = Espai de treball anterior
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Commuta l'amplada de la barra lateral
zen-pinned-tab-shortcut-reset = Restableix la pestanya fixada a l'URL fixat
zen-split-view-shortcut-grid = Commuta la quadrícula de la vista dividida
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Commuta l'accessibilitat
zen-close-all-unpinned-tabs-shortcut = Tanca totes les pestanyes no fixades
zen-new-unsynced-window-shortcut = Nova finestra en blanc
zen-duplicate-tab-shortcut = Duplica la pestanya
+zen-key-find-selection = Find Selection
diff --git a/locales/ca/browser/browser/zen-boosts.ftl b/locales/ca/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..877c5afb2
--- /dev/null
+++ b/locales/ca/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Reanomena la millora
+zen-boost-edit-shuffle =
+ .label = Barreja les vibracions
+zen-boost-edit-reset =
+ .label = Restableix totes les edicions
+zen-boost-edit-delete =
+ .label = Suprimeix la millora
+zen-boost-size = Mida
+zen-boost-case = Case
+zen-boost-zap = Amaga
+zen-boost-code = Codi
+zen-boost-back = Enrere
+zen-boost-shuffle =
+ .tooltiptext = Barreja les configuracions de millora
+zen-boost-invert =
+ .tooltiptext = Inversió intel·ligent dels colors
+zen-boost-controls =
+ .tooltiptext = Controls de color avançats
+zen-boost-disable =
+ .tooltiptext = Desactiva els ajustos de color
+zen-boost-text-case-toggle =
+ .tooltiptext = Commuta majúscules/minúscules
+zen-boost-css-picker =
+ .tooltiptext = Trieu el selector
+zen-boost-css-inspector =
+ .tooltiptext = Obre l'inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brillantor
+zen-bootst-color-original-saturation = Saturació original
+zen-add-zap-helper = Feu clic als elements de la pàgina per amagar-los
+zen-remove-zap-helper = ← Feu clic per mostrar
+zen-select-this = Insereix un selector per a això
+zen-select-related = Insereix un selector per a elements relacionats
+zen-select-cancel = Cancel·la
+zen-zap-this = Amaga això
+zen-zap-related = Amaga tots els elements relacionats
+zen-zap-cancel = Cancel·la
+zen-zap-done = Fet
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No hi ha elements amagats
+ [1] { $elementCount } element amagat
+ *[other] { $elementCount } elements amagats
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = S'ha exportat la millora!
+zen-site-data-boosts = Millores
+zen-site-data-create-boost =
+ .tooltiptext = Creu una nova millora
+zen-boost-rename-boost-prompt = Voleu reanomenar la millora?
diff --git a/locales/cs/browser/browser/preferences/zen-preferences.ftl b/locales/cs/browser/browser/preferences/zen-preferences.ftl
index fdacf7348..97baced60 100644
--- a/locales/cs/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/cs/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Přepnout na pracovní prostor 9
zen-workspace-shortcut-switch-10 = Přepnout do pracovního prostoru 10
zen-workspace-shortcut-forward = Přeposlat pracovní prostor
zen-workspace-shortcut-backward = Zpětný pracovní prostor
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Přepnout šířku postranního panelu
zen-pinned-tab-shortcut-reset = Obnovit připnuté záložky na připnuté URL
zen-split-view-shortcut-grid = Přepnout rozdělený pohled v mřížce
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Přepnout přístupnost
zen-close-all-unpinned-tabs-shortcut = Zavřít všechny nepřipnuté panely
zen-new-unsynced-window-shortcut = Nové nesynchronizované okno
zen-duplicate-tab-shortcut = Duplikovat panel
+zen-key-find-selection = Find Selection
diff --git a/locales/cs/browser/browser/zen-boosts.ftl b/locales/cs/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/cs/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/cy/browser/browser/preferences/zen-preferences.ftl b/locales/cy/browser/browser/preferences/zen-preferences.ftl
index 080a9aa69..2a24fed35 100644
--- a/locales/cy/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/cy/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Symud i Gofod Gwaith 9
zen-workspace-shortcut-switch-10 = Symud i Gofod Gwaith 10
zen-workspace-shortcut-forward = Gofod Gwaith Ymlaen
zen-workspace-shortcut-backward = Gofod Gwaith Nôl
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Toglo Lled y Bar Ochr
zen-pinned-tab-shortcut-reset = Ailosod y Tab wedi'i Binio i URL wedi'i Binio
zen-split-view-shortcut-grid = Toglo Grid Golwg Hollt
@@ -317,4 +318,5 @@ zen-devtools-toggle-dom-shortcut = Toglo DOM
zen-devtools-toggle-accessibility-shortcut = Toglo Hygyrchedd
zen-close-all-unpinned-tabs-shortcut = Cau Pob Tab Heb ei Binio
zen-new-unsynced-window-shortcut = Ffenestr Wag Newydd
-zen-duplicate-tab-shortcut = Duplicate Tab
+zen-duplicate-tab-shortcut = Tab Dyblyg
+zen-key-find-selection = Find Selection
diff --git a/locales/cy/browser/browser/zen-boosts.ftl b/locales/cy/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/cy/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/cy/browser/browser/zen-general.ftl b/locales/cy/browser/browser/zen-general.ftl
index aa8a8074e..752f932a3 100644
--- a/locales/cy/browser/browser/zen-general.ftl
+++ b/locales/cy/browser/browser/zen-general.ftl
@@ -50,7 +50,7 @@ zen-pinned-tab-replaced = Mae URL y tab wedi'i binio wedi'i newid i'r URL gyfred
zen-tabs-renamed = Mae'r tab wedi cael ei ailenwi'n llwyddiannus!
zen-background-tab-opened-toast = Tab cefndir newydd wedi'i agor!
zen-workspace-renamed-toast = Mae'r Man Gwaith wedi cael ei ailenwi'n llwyddiannus!
-zen-split-view-limit-toast = Can't add more panels to the split view!
+zen-split-view-limit-toast = Methu ychwanegu mwy o baneli at y golwg hollt!
zen-toggle-compact-mode-button =
.label = Modd Cryno
.tooltiptext = Togglo Modd Cryno
diff --git a/locales/cy/browser/browser/zen-split-view.ftl b/locales/cy/browser/browser/zen-split-view.ftl
index e0aa8889e..34035ddca 100644
--- a/locales/cy/browser/browser/zen-split-view.ftl
+++ b/locales/cy/browser/browser/zen-split-view.ftl
@@ -5,9 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [-1] Split out tab
- [1] Add split view...
- *[other] Join { $tabCount } Tabs
+ [-1] Rhannu tab
+ [1] Ychwanegu golwg hollt...
+ *[other] Uno { $tabCount } Tab
}
.accesskey = H
zen-split-link =
diff --git a/locales/cy/browser/browser/zen-vertical-tabs.ftl b/locales/cy/browser/browser/zen-vertical-tabs.ftl
index 688e6aa86..b2e15ef5f 100644
--- a/locales/cy/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/cy/browser/browser/zen-vertical-tabs.ftl
@@ -18,8 +18,8 @@ zen-toolbar-context-compact-mode-hide-both =
.label = Cuddio'r ddau
.accesskey = C
zen-toolbar-context-move-to-folder =
- .label = Move to Folder...
- .accesskey = M
+ .label = Symud i Ffolder...
+ .accesskey = S
zen-toolbar-context-new-folder =
.label = Ffolder Newydd
.accesskey = N
diff --git a/locales/da/browser/browser/preferences/zen-preferences.ftl b/locales/da/browser/browser/preferences/zen-preferences.ftl
index c710dc69c..9e90de776 100644
--- a/locales/da/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/da/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Skift til arbejdsområde 9
zen-workspace-shortcut-switch-10 = Skift til arbejdsområde 10
zen-workspace-shortcut-forward = Fremad Arbejdsområde
zen-workspace-shortcut-backward = Bagudrettet Arbejdsrum
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Skift sidepanelets bredde
zen-pinned-tab-shortcut-reset = Nulstil fastgjort fane til fastgjort URL
zen-split-view-shortcut-grid = Opdelt visning i gitter til/fra
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Vis/skjul Tilgængelighed
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/da/browser/browser/zen-boosts.ftl b/locales/da/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/da/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/de/browser/browser/preferences/zen-preferences.ftl b/locales/de/browser/browser/preferences/zen-preferences.ftl
index 86aff9c81..d58554d05 100644
--- a/locales/de/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/de/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Zu Arbeitsbereich 9 wechseln
zen-workspace-shortcut-switch-10 = Zu Arbeitsbereich 10 wechseln
zen-workspace-shortcut-forward = Zum nächsten Arbeitsbereich wechseln
zen-workspace-shortcut-backward = Zum vorherigen Arbeitsbereich wechseln
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Seitenleisten-Breite umschalten
zen-pinned-tab-shortcut-reset = Angehefteten Tab zurücksetzen
zen-split-view-shortcut-grid = Raster-Layout für geteilte Ansicht umschalten
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Barrierefreiheit umschalten
zen-close-all-unpinned-tabs-shortcut = Alle nicht angehefteten Tabs schließen
zen-new-unsynced-window-shortcut = Neues leeres Fenster
zen-duplicate-tab-shortcut = Tab duplizieren
+zen-key-find-selection = Find Selection
diff --git a/locales/de/browser/browser/zen-boosts.ftl b/locales/de/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..21d9907ab
--- /dev/null
+++ b/locales/de/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Boost umbenennen
+zen-boost-edit-shuffle =
+ .label = Vibes mischen
+zen-boost-edit-reset =
+ .label = Alle Änderungen zurücksetzen
+zen-boost-edit-delete =
+ .label = Boost löschen
+zen-boost-size = Größe
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Zurück
+zen-boost-shuffle =
+ .tooltiptext = Boost-Einstellungen mischen
+zen-boost-invert =
+ .tooltiptext = Farben intelligent invertieren
+zen-boost-controls =
+ .tooltiptext = Erweiterte Farbeinstellungen
+zen-boost-disable =
+ .tooltiptext = Farbanpassungen deaktivieren
+zen-boost-text-case-toggle =
+ .tooltiptext = Schreibweise umschalten
+zen-boost-css-picker =
+ .tooltiptext = Selektor auswählen
+zen-boost-css-inspector =
+ .tooltiptext = Inspektor öffnen
+zen-bootst-color-contrast = Kontrast
+zen-bootst-color-brightness = Helligkeit
+zen-bootst-color-original-saturation = Ausgangssättigung
+zen-add-zap-helper = Klicke auf Elemente auf der Seite, um sie mit Zap zu markieren
+zen-remove-zap-helper = ← Erneut klicken zum Wiederherstellen
+zen-select-this = Selektor für dieses Element einfügen
+zen-select-related = Selektor für verwandte Elemente einfügen
+zen-select-cancel = Abbrechen
+zen-zap-this = Dieses entfernen
+zen-zap-related = Alle verwandten Elemente entfernen
+zen-zap-cancel = Abbrechen
+zen-zap-done = Fertig
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Keine Elemente entfernt
+ [1] { $elementCount } Element entfernt
+ *[other] { $elementCount } Elemente entfernt
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exportiert!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Neuen Boost erstellen
+zen-boost-rename-boost-prompt = Boost umbenennen?
diff --git a/locales/el/browser/browser/preferences/zen-preferences.ftl b/locales/el/browser/browser/preferences/zen-preferences.ftl
index d46b987d2..61e2f7bdd 100644
--- a/locales/el/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/el/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Εναλλαγή στο Χώρο Εργασί
zen-workspace-shortcut-switch-10 = Εναλλαγή στο Χώρο Εργασίας 10
zen-workspace-shortcut-forward = Προώθηση Χώρου Εργασίας
zen-workspace-shortcut-backward = Πίσω Χώρος Εργασίας
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Εναλλαγή Πλάτους Πλευρικής Μπάρας
zen-pinned-tab-shortcut-reset = Επαναφορά Καρφιτσωμένης Καρτέλας στο Καρφιτσωμένο URL
zen-split-view-shortcut-grid = Εναλλαγή Πλέγματος Διαιρεμένης Προβολής
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Εναλλαγή Προσβασιμ
zen-close-all-unpinned-tabs-shortcut = Κλείσιμο όλων των μη καρφιτσωμένων καρτελών
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Διπλασιασμός Καρτέλας
+zen-key-find-selection = Find Selection
diff --git a/locales/el/browser/browser/zen-boosts.ftl b/locales/el/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/el/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/el/browser/browser/zen-general.ftl b/locales/el/browser/browser/zen-general.ftl
index 2966c4ca8..7e9c8c2ff 100644
--- a/locales/el/browser/browser/zen-general.ftl
+++ b/locales/el/browser/browser/zen-general.ftl
@@ -7,7 +7,7 @@ unified-extensions-description = Οι επεκτάσεις χρησιμοποι
tab-context-zen-reset-pinned-tab =
.label =
{ $isEssential ->
- [true] Επαναφορά Απαραίτητης Καρτέλας
+ [true] Επαναφορά Απαραίτητης Καρτέλας
*[false] Επαναφορά Καρφιτσωμένης Καρτέλας
}
.accesskey = R
@@ -21,7 +21,7 @@ tab-context-zen-remove-essential =
tab-context-zen-replace-pinned-url-with-current =
.label =
{ $isEssential ->
- [true] Αντικατάσταση Απαραίτητης διεύθυνσής με την τωρινή
+ [true] Αντικατάσταση Απαραίτητης διεύθυνσής με την τωρινή
*[false] Αντικατάσταση Καρφιτσωμένης διεύθυνσής με την τωρινή
}
.accesskey = C
diff --git a/locales/en-GB/browser/browser/preferences/zen-preferences.ftl b/locales/en-GB/browser/browser/preferences/zen-preferences.ftl
index a7e3f3c3f..295f8542e 100644
--- a/locales/en-GB/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/en-GB/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Switch to Workspace 9
zen-workspace-shortcut-switch-10 = Switch to Workspace 10
zen-workspace-shortcut-forward = Forward Workspace
zen-workspace-shortcut-backward = Backward Workspace
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Toggle Sidebar's Width
zen-pinned-tab-shortcut-reset = Reset Pinned Tab to Pinned URL
zen-split-view-shortcut-grid = Toggle Split View Grid
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/en-GB/browser/browser/zen-boosts.ftl b/locales/en-GB/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/en-GB/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/es-ES/browser/browser/preferences/zen-preferences.ftl b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
index 7e81a58a4..ac75637f5 100644
--- a/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Cambiar a espacio de trabajo 9
zen-workspace-shortcut-switch-10 = Cambiar a espacio de trabajo 10
zen-workspace-shortcut-forward = Espacio de trabajo siguiente
zen-workspace-shortcut-backward = Espacio de trabajo anterior
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Cambiar el ancho de la barra lateral
zen-pinned-tab-shortcut-reset = Restablecer pestaña fijada a la URL fijada
zen-split-view-shortcut-grid = Cambiar a vista dividida en cuadrícula
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Alternar accesibilidad
zen-close-all-unpinned-tabs-shortcut = Cerrar todas las pestañas sin fijar
zen-new-unsynced-window-shortcut = Nueva ventana no sincronizada
zen-duplicate-tab-shortcut = Duplicar pestaña
+zen-key-find-selection = Find Selection
diff --git a/locales/es-ES/browser/browser/zen-boosts.ftl b/locales/es-ES/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..dfb4cdbd4
--- /dev/null
+++ b/locales/es-ES/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Renombrar Boost
+zen-boost-edit-shuffle =
+ .label = Ambiente aleatorio
+zen-boost-edit-reset =
+ .label = Restablecer todas las ediciones
+zen-boost-edit-delete =
+ .label = Borrar Boost
+zen-boost-size = Tamaño
+zen-boost-case = Case
+zen-boost-zap = Borrar
+zen-boost-code = Código
+zen-boost-back = Atrás
+zen-boost-shuffle =
+ .tooltiptext = Ajustes de Boost aleatorios
+zen-boost-invert =
+ .tooltiptext = Invertir colores
+zen-boost-controls =
+ .tooltiptext = Controles de color avanzados
+zen-boost-disable =
+ .tooltiptext = Desactivar ajustes de color
+zen-boost-text-case-toggle =
+ .tooltiptext = Alternar mayúsculas/minúsculas
+zen-boost-css-picker =
+ .tooltiptext = Escoger selector
+zen-boost-css-inspector =
+ .tooltiptext = Abrir inspector
+zen-bootst-color-contrast = Contraste
+zen-bootst-color-brightness = Brillo
+zen-bootst-color-original-saturation = Saturación original
+zen-add-zap-helper = Haga clic en los elementos de la página para borrarlos
+zen-remove-zap-helper = ← Clic para deshacer
+zen-select-this = Insertar selector para esto
+zen-select-related = Insertar selector para relacionados
+zen-select-cancel = Cancelar
+zen-zap-this = Borrar esto
+zen-zap-related = Borrar todos los elementos relacionados
+zen-zap-cancel = Cancelar
+zen-zap-done = Hecho
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Ningún elemento borrado
+ [1] { $elementCount } elemento borrado
+ *[other] { $elementCount } elementos borrados
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = ¡Boost exportado!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Crear nuevo Boost
+zen-boost-rename-boost-prompt = ¿Renombrar Boost?
diff --git a/locales/et/browser/browser/preferences/zen-preferences.ftl b/locales/et/browser/browser/preferences/zen-preferences.ftl
index c15f1b56d..9aa14af82 100644
--- a/locales/et/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/et/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Lülitu tööruumi 9
zen-workspace-shortcut-switch-10 = Lülitu tööruumi 10
zen-workspace-shortcut-forward = Järgmine tööruum
zen-workspace-shortcut-backward = Eelmine tööruum
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Laienda/ahenda külgriba
zen-pinned-tab-shortcut-reset = Lähtesta püsikaart algsele URL-ile
zen-split-view-shortcut-grid = Lülita jaotatud vaate ruudustik sisse/välja
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Lülita ligipääsetavuse sektsioon
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/et/browser/browser/zen-boosts.ftl b/locales/et/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/et/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/eu/browser/browser/preferences/zen-preferences.ftl b/locales/eu/browser/browser/preferences/zen-preferences.ftl
index 728fc5f2e..cc6082d37 100644
--- a/locales/eu/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/eu/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Switch to Workspace 9
zen-workspace-shortcut-switch-10 = Switch to Workspace 10
zen-workspace-shortcut-forward = Forward Workspace
zen-workspace-shortcut-backward = Backward Workspace
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Toggle Sidebar's Width
zen-pinned-tab-shortcut-reset = Reset Pinned Tab to Pinned URL
zen-split-view-shortcut-grid = Toggle Split View Grid
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Blank Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/eu/browser/browser/zen-boosts.ftl b/locales/eu/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/eu/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/fa/browser/browser/preferences/zen-preferences.ftl b/locales/fa/browser/browser/preferences/zen-preferences.ftl
index 8f63791ca..7ed3131a5 100644
--- a/locales/fa/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/fa/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Switch to Workspace 9
zen-workspace-shortcut-switch-10 = Switch to Workspace 10
zen-workspace-shortcut-forward = Forward Workspace
zen-workspace-shortcut-backward = Backward Workspace
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Toggle Sidebar's Width
zen-pinned-tab-shortcut-reset = Reset Pinned Tab to Pinned URL
zen-split-view-shortcut-grid = Toggle Split View Grid
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/fa/browser/browser/zen-boosts.ftl b/locales/fa/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/fa/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/fi/browser/browser/preferences/zen-preferences.ftl b/locales/fi/browser/browser/preferences/zen-preferences.ftl
index 7f518ecc6..08f86534f 100644
--- a/locales/fi/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/fi/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Vaihda työtilaan 9
zen-workspace-shortcut-switch-10 = Vaihda työtilaan 10
zen-workspace-shortcut-forward = Eteenpäin Työtila
zen-workspace-shortcut-backward = Taaksepäin Työtila
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Vaihda Sivupalkin Leveys
zen-pinned-tab-shortcut-reset = Nollaa kiinnitetty välilehti kiinnitettyyn URL-osoitteeseen
zen-split-view-shortcut-grid = Vaihda Jaettu Näkymä ruudukkoon
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Vaihda Esteettömyystilaan
zen-close-all-unpinned-tabs-shortcut = Sulje kaikki kiinnittämättömät välilehdet
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/fi/browser/browser/zen-boosts.ftl b/locales/fi/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/fi/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/fr/browser/browser/preferences/zen-preferences.ftl b/locales/fr/browser/browser/preferences/zen-preferences.ftl
index f2deb00b8..d5828a59c 100644
--- a/locales/fr/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/fr/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Basculer vers l’espace de travail 9
zen-workspace-shortcut-switch-10 = Basculer vers l’espace de travail 10
zen-workspace-shortcut-forward = Espace de travail suivant
zen-workspace-shortcut-backward = Espace de travail précédent
+zen-workspace-shortcut-create = Créer un nouvel espace de travail
zen-sidebar-shortcut-toggle = Afficher/Masquer la largeur de la barre latérale
zen-pinned-tab-shortcut-reset = Réinitialiser l’onglet épinglé à l’URL d’origine
zen-split-view-shortcut-grid = Activer/désactiver la vue fractionnée en grille
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Afficher l’onglet Accessibilité
zen-close-all-unpinned-tabs-shortcut = Fermer tous les onglets non épinglés
zen-new-unsynced-window-shortcut = Nouvelle fenêtre vierge
zen-duplicate-tab-shortcut = Dupliquer l'onglet
+zen-key-find-selection = Rechercher dans la sélection
diff --git a/locales/fr/browser/browser/zen-boosts.ftl b/locales/fr/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..d06ad7610
--- /dev/null
+++ b/locales/fr/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Renommer le Boost
+zen-boost-edit-shuffle =
+ .label = Ambiances aléatoires
+zen-boost-edit-reset =
+ .label = Réinitialiser toutes les modifications
+zen-boost-edit-delete =
+ .label = Supprimer le Boost
+zen-boost-size = Taille
+zen-boost-case = Casse
+zen-boost-zap = Masquer
+zen-boost-code = Code
+zen-boost-back = Retour
+zen-boost-shuffle =
+ .tooltiptext = Mélanger les paramètres du Boost
+zen-boost-invert =
+ .tooltiptext = Inversion intelligente des couleurs
+zen-boost-controls =
+ .tooltiptext = Contrôles de couleurs avancés
+zen-boost-disable =
+ .tooltiptext = Désactiver les ajustements de couleur
+zen-boost-text-case-toggle =
+ .tooltiptext = Activer/désactiver la casse
+zen-boost-css-picker =
+ .tooltiptext = Choisir le sélecteur
+zen-boost-css-inspector =
+ .tooltiptext = Ouvrir l'inspecteur
+zen-bootst-color-contrast = Contraste
+zen-bootst-color-brightness = Luminosité
+zen-bootst-color-original-saturation = Saturation originale
+zen-add-zap-helper = Cliquez sur des éléments de la page pour les zapper
+zen-remove-zap-helper = ← Cliquez pour démasquer
+zen-select-this = Insérer un sélecteur pour ceci
+zen-select-related = Insérer un sélecteur pour les correspondances
+zen-select-cancel = Annuler
+zen-zap-this = Masquer ceci
+zen-zap-related = Masquer tous les éléments liés
+zen-zap-cancel = Annuler
+zen-zap-done = Terminé
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Aucun élément masqué
+ [1] { $elementCount } élément masqué
+ *[other] { $elementCount } éléments masqués
+ }
+zen-boost-save =
+ .label = Exporter le Boost
+zen-boost-load =
+ .label = Importer un Boost
+zen-panel-ui-boosts-exported-message = Boost exporté !
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Créer un nouveau Boost
+zen-boost-rename-boost-prompt = Renommer le Boost ?
diff --git a/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl b/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
index 10f96fedd..45215b2fa 100644
--- a/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Athraigh go Spás Oibre 9
zen-workspace-shortcut-switch-10 = Athraigh go Spás Oibre 10
zen-workspace-shortcut-forward = Spás Oibre Ar Aghaidh
zen-workspace-shortcut-backward = Spás Oibre Ar Ais
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Leithead an Bharra Taoibh a Scoránaigh
zen-pinned-tab-shortcut-reset = Athshocraigh an Cluaisín Prionáilte go dtí an URL Prionáilte
zen-split-view-shortcut-grid = Eangach Radharc Scoilte a Athsholáthar
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Scoránaigh Inrochtaineacht
zen-close-all-unpinned-tabs-shortcut = Dún Gach Cluaisín Gan Phionáil
zen-new-unsynced-window-shortcut = Fuinneog Nua Neamhshioncrónaithe
zen-duplicate-tab-shortcut = Cluaisín Dúblach
+zen-key-find-selection = Find Selection
diff --git a/locales/ga-IE/browser/browser/zen-boosts.ftl b/locales/ga-IE/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..ecf56e102
--- /dev/null
+++ b/locales/ga-IE/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Athainmnigh an Treisiú
+zen-boost-edit-shuffle =
+ .label = Vibes Measctha
+zen-boost-edit-reset =
+ .label = Athshocraigh Gach Eagarthóireacht
+zen-boost-edit-delete =
+ .label = Scrios an Treisiú
+zen-boost-size = Méid
+zen-boost-case = Case
+zen-boost-zap = Zapáil
+zen-boost-code = Cód
+zen-boost-back = Ar ais
+zen-boost-shuffle =
+ .tooltiptext = Socruithe Treisithe Measctha
+zen-boost-invert =
+ .tooltiptext = Dathanna Inbhéartaithe Cliste
+zen-boost-controls =
+ .tooltiptext = Rialuithe Dath Ardleibhéil
+zen-boost-disable =
+ .tooltiptext = Díchumasaigh Coigeartuithe Datha
+zen-boost-text-case-toggle =
+ .tooltiptext = Cás Téacs a Athrú
+zen-boost-css-picker =
+ .tooltiptext = Roghnóir Roghnaigh
+zen-boost-css-inspector =
+ .tooltiptext = Oscail an Cigire
+zen-bootst-color-contrast = Codarsnacht
+zen-bootst-color-brightness = Gile
+zen-bootst-color-original-saturation = Sáithiú Bunaidh
+zen-add-zap-helper = Cliceáil ar eilimintí ar an leathanach chun iad a Zapáil
+zen-remove-zap-helper = ← Cliceáil chun Dízipáil
+zen-select-this = Cuir roghnóir isteach don seo
+zen-select-related = Cuir isteach roghnóir le haghaidh gaolmhar
+zen-select-cancel = Cealaigh
+zen-zap-this = Zapáil seo
+zen-zap-related = Zapáil gach eilimint ghaolmhar
+zen-zap-cancel = Cealaigh
+zen-zap-done = Déanta
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Gan aon eilimintí Zapáilte
+ [1] { $elementCount } eilimint Zapáilte
+ *[other] { $elementCount } eilimintí Zapáilte
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Borradh easpórtáilte!
+zen-site-data-boosts = Borradh
+zen-site-data-create-boost =
+ .tooltiptext = Cruthaigh borradh nua
+zen-boost-rename-boost-prompt = Athainmnigh Borradh?
diff --git a/locales/he/browser/browser/preferences/zen-preferences.ftl b/locales/he/browser/browser/preferences/zen-preferences.ftl
index fc21b7eb8..974be8fd7 100644
--- a/locales/he/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/he/browser/browser/preferences/zen-preferences.ftl
@@ -47,7 +47,7 @@ zen-tabs-select-recently-used-on-close =
zen-tabs-close-on-back-with-no-history =
.label = סגירת הלשונית ומעבר ללשונית האם שלה (או ללשונית שהכי נמצאת בשימוש) בעת לחיצה על כפתור החזרה כשאין היסטוריית גלישה
zen-settings-workspaces-sync-unpinned-tabs =
- .label = Sync only pinned tabs in workspaces
+ .label = סנכרון הלשוניות המוצמדות של מרחבי העבודה בלבד
zen-tabs-cycle-by-attribute =
.label = הקיצור Ctrl+Tab מחליף בין לשוניות חיוניות ולשוניות במרחב העבודה בלבד
zen-tabs-cycle-ignore-pending-tabs =
@@ -139,7 +139,7 @@ zen-themes-auto-update =
zen-settings-workspaces-force-container-tabs-to-workspace =
.label = העברה למרחב עבודה שבו מוגדרת מגירת ברירת מחדל לפתיחת לשוניות במגירה
zen-theme-marketplace-link = כניסה לחנות
-zen-dark-theme-styles-header = עיצובים כהים
+zen-dark-theme-styles-header = ערכות נושא בסגנון כ
zen-dark-theme-styles-description = אפשר לשנות את העיצוב הכהה לטעמך
zen-dark-theme-styles-amoled = עיצוב לילה
zen-dark-theme-styles-default = עיצוב לילה ברירת מחדל
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = מעבר למרחב עבודה 9
zen-workspace-shortcut-switch-10 = מעבר למרחב עבודה 10
zen-workspace-shortcut-forward = העברת מרחב העבודה קדימה
zen-workspace-shortcut-backward = העברת מרחב העבודה אחורה
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = הפעל/כבה עובי של סרגל צד
zen-pinned-tab-shortcut-reset = איפוס הלשונית המוצמדת לכתובת המוצמדת
zen-split-view-shortcut-grid = הפעל/כבה תצוגה מפוצלת רשת
@@ -304,7 +305,7 @@ zen-bookmark-show-sidebar-shortcut = הצג סרגל צד סימניות
zen-bookmark-show-toolbar-shortcut = הצג סרגל סימניות
zen-devtools-toggle-shortcut = הפעל/כבה DevTools
zen-devtools-toggle-browser-toolbox-shortcut = הפעל/כבה את ארגז הכלים של הדפדפן
-zen-devtools-toggle-browser-console-shortcut = הפעל/כבה קונסולת דפדפן
+zen-devtools-toggle-browser-console-shortcut = הפעלת/כיבוי מסוף דפדפן
zen-devtools-toggle-responsive-design-mode-shortcut = הפעלת/כיבוי מצב עיצוב מסתגל
zen-devtools-toggle-inspector-shortcut = הפעל/כבה בודק
zen-devtools-toggle-web-console-shortcut = הפעל/כבה קונסולת אתר
@@ -317,4 +318,5 @@ zen-devtools-toggle-dom-shortcut = הפעל/כבה DOM
zen-devtools-toggle-accessibility-shortcut = הפעל/כבה נגישות
zen-close-all-unpinned-tabs-shortcut = סגירת כל הלשוניות שאינן מוצמדות
zen-new-unsynced-window-shortcut = חלון לא מסונכרן חדש
-zen-duplicate-tab-shortcut = Duplicate Tab
+zen-duplicate-tab-shortcut = שכפול לשונית
+zen-key-find-selection = Find Selection
diff --git a/locales/he/browser/browser/zen-boosts.ftl b/locales/he/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..3f9d31f62
--- /dev/null
+++ b/locales/he/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = צבעים הפוכים חכמים
+zen-boost-controls =
+ .tooltiptext = בקרת צבע מתקדמת
+zen-boost-disable =
+ .tooltiptext = השבתת התאמות צבע
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = ניגודיות
+zen-bootst-color-brightness = בהירות
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = ביטול
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = ביטול
+zen-zap-done = סיום
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/he/browser/browser/zen-general.ftl b/locales/he/browser/browser/zen-general.ftl
index 0cf72f91c..dd85f9dc0 100644
--- a/locales/he/browser/browser/zen-general.ftl
+++ b/locales/he/browser/browser/zen-general.ftl
@@ -39,7 +39,7 @@ pictureinpicture-minimize-btn =
.tooltip = מזעור
zen-panel-ui-gradient-generator-custom-color = צבע מותאם אישית
zen-copy-current-url-confirmation = הכתובת הנוכחית הועתקה!
-zen-copy-current-url-as-markdown-confirmation = Copied current URL as Markdown!
+zen-copy-current-url-as-markdown-confirmation = הכתובת הנוכחית הועתקה בתור Markdown!
zen-general-cancel-label =
.label = ביטול
zen-general-confirm =
@@ -48,7 +48,7 @@ zen-pinned-tab-replaced = כתובת הלשונית המוצמדת הוחלפה
zen-tabs-renamed = שם הלשונית השתנה בהצלחה!
zen-background-tab-opened-toast = לשונית נפתחה ברקע!
zen-workspace-renamed-toast = שם מרחב העבודה השתנה בהצלחה!
-zen-split-view-limit-toast = Can't add more panels to the split view!
+zen-split-view-limit-toast = אי אפשר להוסיף עוד לוחיות לתצוגה המפוצלת!
zen-toggle-compact-mode-button =
.label = מצב חסכוני
.tooltiptext = הפעלת/כיבוי מצב חסכוני
@@ -122,4 +122,4 @@ zen-window-sync-migration-dialog-message = Zen עכשיו מסנכרן חלונ
zen-window-sync-migration-dialog-learn-more = מידע נוסף
zen-window-sync-migration-dialog-accept = הבנתי
zen-appmenu-new-blank-window =
- .label = New blank window
+ .label = חלון ריק חדש
diff --git a/locales/he/browser/browser/zen-menubar.ftl b/locales/he/browser/browser/zen-menubar.ftl
index fbf94053c..298dec51b 100644
--- a/locales/he/browser/browser/zen-menubar.ftl
+++ b/locales/he/browser/browser/zen-menubar.ftl
@@ -19,4 +19,4 @@ zen-menubar-appearance-light =
zen-menubar-appearance-dark =
.label = כהה
zen-menubar-new-blank-window =
- .label = New Blank Window
+ .label = חלון ריק חדש
diff --git a/locales/he/browser/browser/zen-vertical-tabs.ftl b/locales/he/browser/browser/zen-vertical-tabs.ftl
index 28121137b..2ee834f31 100644
--- a/locales/he/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/he/browser/browser/zen-vertical-tabs.ftl
@@ -18,8 +18,8 @@ zen-toolbar-context-compact-mode-hide-both =
.label = הסתרת שני הסרגלים
.accesskey = י
zen-toolbar-context-move-to-folder =
- .label = Move to Folder...
- .accesskey = M
+ .label = העברה לתיקייה...
+ .accesskey = צ
zen-toolbar-context-new-folder =
.label = תיקייה חדשה
.accesskey = מ
diff --git a/locales/he/browser/browser/zen-workspaces.ftl b/locales/he/browser/browser/zen-workspaces.ftl
index 57e9ce821..e35618442 100644
--- a/locales/he/browser/browser/zen-workspaces.ftl
+++ b/locales/he/browser/browser/zen-workspaces.ftl
@@ -10,7 +10,7 @@ zen-panel-ui-workspaces-create =
zen-panel-ui-folder-create =
.label = יצירת תיקייה
zen-panel-ui-live-folder-create =
- .label = Live Folder
+ .label = תיקייה חיה
zen-panel-ui-new-empty-split =
.label = פיצול חדש
zen-workspaces-panel-context-delete =
diff --git a/locales/hu/browser/browser/preferences/zen-preferences.ftl b/locales/hu/browser/browser/preferences/zen-preferences.ftl
index 02da4b7a0..d0cc5bbce 100644
--- a/locales/hu/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/hu/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Kilencedik munkakörnyezetre váltás
zen-workspace-shortcut-switch-10 = Tizedik munkakörnyezetre váltás
zen-workspace-shortcut-forward = Következő munkakörnyezet
zen-workspace-shortcut-backward = Előző munkakörnyezet
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Oldalsáv szélességének váltása
zen-pinned-tab-shortcut-reset = Rögzített lap visszaállítása rögzítéskori URL-re
zen-split-view-shortcut-grid = Osztott nézet grid ki-/bekapcsolása
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Hozzáférhetőség kapcsolása
zen-close-all-unpinned-tabs-shortcut = Összes rögzítetlen lap bezárása
zen-new-unsynced-window-shortcut = Új szinkronizálatlan ablak
zen-duplicate-tab-shortcut = Lap duplikálása
+zen-key-find-selection = Find Selection
diff --git a/locales/hu/browser/browser/zen-boosts.ftl b/locales/hu/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..2cdbb4a75
--- /dev/null
+++ b/locales/hu/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Boost átnevezése
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Minden módosítás visszaállítása
+zen-boost-edit-delete =
+ .label = Boost törlése
+zen-boost-size = Méret
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Kód
+zen-boost-back = Vissza
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Színek intelligens invertálása
+zen-boost-controls =
+ .tooltiptext = Speciális színbeállítások
+zen-boost-disable =
+ .tooltiptext = Színbeállítások letiltása
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Vizsgáló megnyitása
+zen-bootst-color-contrast = Kontraszt
+zen-bootst-color-brightness = Fényerő
+zen-bootst-color-original-saturation = Eredeti szaturáció
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Mégse
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Mégse
+zen-zap-done = Kész
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boostok exportálva!
+zen-site-data-boosts = Boostok
+zen-site-data-create-boost =
+ .tooltiptext = Új boost létrehozása
+zen-boost-rename-boost-prompt = Boost átnevezése?
diff --git a/locales/id/browser/browser/preferences/zen-preferences.ftl b/locales/id/browser/browser/preferences/zen-preferences.ftl
index 7f5e29879..61fb563cf 100644
--- a/locales/id/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/id/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Beralih ke Ruang Kerja 9
zen-workspace-shortcut-switch-10 = Beralih ke Ruang Kerja 10
zen-workspace-shortcut-forward = Ruang Kerja setelahnya
zen-workspace-shortcut-backward = Ruang Kerja sebelumnya
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Peralihan lebar Bilah sisi
zen-pinned-tab-shortcut-reset = Setel ulang Tab yang Disematkan ke URL awal
zen-split-view-shortcut-grid = Beralih ke Panel terbagi
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Ubah Aksesibilitas
zen-close-all-unpinned-tabs-shortcut = Tutup Semua Tab yang Tidak Disematkan
zen-new-unsynced-window-shortcut = Jendela Kosong Baru
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/id/browser/browser/zen-boosts.ftl b/locales/id/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/id/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/is/browser/browser/preferences/zen-preferences.ftl b/locales/is/browser/browser/preferences/zen-preferences.ftl
index db2e11183..11ac037c8 100644
--- a/locales/is/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/is/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Skipta yfir á vinnusvæði 9
zen-workspace-shortcut-switch-10 = Skipta yfir á vinnusvæði 10
zen-workspace-shortcut-forward = Vinnusvæði áfram
zen-workspace-shortcut-backward = Vinnusvæði afturábak
+zen-workspace-shortcut-create = Búa til nýtt vinnusvæði
zen-sidebar-shortcut-toggle = Víxla breidd hliðarspjalds
zen-pinned-tab-shortcut-reset = Endursetja festan flipa á festa slóð
zen-split-view-shortcut-grid = Víxla reitaskiptu klofnu yfirliti
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Víxla auðvelduðu aðgengi af/á
zen-close-all-unpinned-tabs-shortcut = Loka öllum ófestum flipum
zen-new-unsynced-window-shortcut = Nýr auður gluggi
zen-duplicate-tab-shortcut = Tvítaka flipa
+zen-key-find-selection = Finna valið
diff --git a/locales/is/browser/browser/zen-boosts.ftl b/locales/is/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..52a18cd59
--- /dev/null
+++ b/locales/is/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Endurnefna endurhönnun
+zen-boost-edit-shuffle =
+ .label = Stokka áhrif
+zen-boost-edit-reset =
+ .label = Frumstilla allar breytingar
+zen-boost-edit-delete =
+ .label = Eyða endurhönnun
+zen-boost-size = Stærð
+zen-boost-case = Stafstaða
+zen-boost-zap = Einangra (zap)
+zen-boost-code = Kóði
+zen-boost-back = Til baka
+zen-boost-shuffle =
+ .tooltiptext = Stokka endurhönnunarstillingum
+zen-boost-invert =
+ .tooltiptext = Snjall umsnúningur lita
+zen-boost-controls =
+ .tooltiptext = Ítarlegar litastýringar
+zen-boost-disable =
+ .tooltiptext = Gera litabreytingar óvirkar
+zen-boost-text-case-toggle =
+ .tooltiptext = Víxla stafstöðu texta
+zen-boost-css-picker =
+ .tooltiptext = Veljari
+zen-boost-css-inspector =
+ .tooltiptext = Opna rýni
+zen-bootst-color-contrast = Birtuskil
+zen-bootst-color-brightness = Birtustig
+zen-bootst-color-original-saturation = Upprunaleg litmettun
+zen-add-zap-helper = Smelltu á atriði á síðunni til að einangra þau (zap)
+zen-remove-zap-helper = ← Smelltu til að taka úr einangrun
+zen-select-this = Setja inn veljara fyrir þetta
+zen-select-related = Setja inn veljara fyrir skyld atriði
+zen-select-cancel = Hætta við
+zen-zap-this = Einangra þetta
+zen-zap-related = Einangra öll skyld atriði
+zen-zap-cancel = Hætta við
+zen-zap-done = Lokið
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Engin einindi einangruð
+ [1] { $elementCount } einindi einangrað
+ *[other] { $elementCount } einindi einangruð
+ }
+zen-boost-save =
+ .label = Flytja út endurhönnun
+zen-boost-load =
+ .label = Flytja inn endurhönnun
+zen-panel-ui-boosts-exported-message = Endurhönnun flutt út!
+zen-site-data-boosts = Endurhannanir (boosts)
+zen-site-data-create-boost =
+ .tooltiptext = Búa til nýja endurhönnun (boost)
+zen-boost-rename-boost-prompt = Endurnefna endurhönnun?
diff --git a/locales/it/browser/browser/preferences/zen-preferences.ftl b/locales/it/browser/browser/preferences/zen-preferences.ftl
index 91ddbba1b..36a85b054 100644
--- a/locales/it/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/it/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Passa allo spazio di lavoro 9
zen-workspace-shortcut-switch-10 = Passa allo spazio di lavoro 10
zen-workspace-shortcut-forward = Spazio Successivo
zen-workspace-shortcut-backward = Spazio Precedente
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Attiva/Disattiva Larghezza Barra Laterale
zen-pinned-tab-shortcut-reset = Reimposta la scheda bloccata all'URL bloccata
zen-split-view-shortcut-grid = Attiva/Disattiva Griglia Visualizzazione Dividi
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Attiva/Disattiva Accessibilità
zen-close-all-unpinned-tabs-shortcut = Chiudi Tutte Le Schede Non Bloccate
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/it/browser/browser/zen-boosts.ftl b/locales/it/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/it/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/ja/browser/browser/preferences/zen-preferences.ftl b/locales/ja/browser/browser/preferences/zen-preferences.ftl
index feab7607a..63a8186a9 100644
--- a/locales/ja/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ja/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = ワークスペース9に切り替える
zen-workspace-shortcut-switch-10 = ワークスペース10に切り替える
zen-workspace-shortcut-forward = 次のワークスペースに移動
zen-workspace-shortcut-backward = 前のワークスペースへ移動
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = サイドバーの幅を切り替える
zen-pinned-tab-shortcut-reset = ピン留めされたタブをピン留めしたURLにリセット
zen-split-view-shortcut-grid = 分割表示グリッドの切り替え
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = アクセシビリティの切り
zen-close-all-unpinned-tabs-shortcut = ピン留めされていないすべてのタブを閉じる
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = タブを複製
+zen-key-find-selection = Find Selection
diff --git a/locales/ja/browser/browser/zen-boosts.ftl b/locales/ja/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..5a5586994
--- /dev/null
+++ b/locales/ja/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = ブーストの名前を変更
+zen-boost-edit-shuffle =
+ .label = バイブをシャッフル
+zen-boost-edit-reset =
+ .label = すべての編集をリセット
+zen-boost-edit-delete =
+ .label = ブーストを削除
+zen-boost-size = サイズ
+zen-boost-case = Case
+zen-boost-zap = ザップ
+zen-boost-code = コード
+zen-boost-back = 戻る
+zen-boost-shuffle =
+ .tooltiptext = ブースト設定をシャッフル
+zen-boost-invert =
+ .tooltiptext = スマートな色の反転
+zen-boost-controls =
+ .tooltiptext = 高度なカラーコントロール
+zen-boost-disable =
+ .tooltiptext = 色の調整を無効にする
+zen-boost-text-case-toggle =
+ .tooltiptext = テキストケースの切り替え
+zen-boost-css-picker =
+ .tooltiptext = セレクターを選択
+zen-boost-css-inspector =
+ .tooltiptext = インスペクタを開く
+zen-bootst-color-contrast = コントラスト
+zen-bootst-color-brightness = 明るさ
+zen-bootst-color-original-saturation = 元の彩度
+zen-add-zap-helper = Zap にページ上の要素をクリックします
+zen-remove-zap-helper = ←クリックして解除
+zen-select-this = このセレクターを挿入
+zen-select-related = 関連するセレクターを挿入
+zen-select-cancel = キャンセル
+zen-zap-this = これをZap
+zen-zap-related = 関連するすべての要素をZap
+zen-zap-cancel = キャンセル
+zen-zap-done = 完了
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] 要素なし zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = ブーストがエクスポートされました!
+zen-site-data-boosts = ブースト
+zen-site-data-create-boost =
+ .tooltiptext = 新しいブーストを作成
+zen-boost-rename-boost-prompt = ブーストの名前を変更しますか?
diff --git a/locales/ko/browser/browser/preferences/zen-preferences.ftl b/locales/ko/browser/browser/preferences/zen-preferences.ftl
index a1f34396e..1a5b6544a 100644
--- a/locales/ko/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ko/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = 워크스페이스 9로 전환
zen-workspace-shortcut-switch-10 = 워크스페이스 10으로 전환
zen-workspace-shortcut-forward = 다음 워크스페이스로
zen-workspace-shortcut-backward = 이전 워크스페이스로
+zen-workspace-shortcut-create = 새 워크스페이스 생성
zen-sidebar-shortcut-toggle = 사이드바 넓이 켜기/끄기
zen-pinned-tab-shortcut-reset = 고정된 탭 URL 초기화
zen-split-view-shortcut-grid = 그리드 스플릿 뷰 전환
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = 접근성 탭 전환
zen-close-all-unpinned-tabs-shortcut = 모든 고정되지 않은 탭 닫기
zen-new-unsynced-window-shortcut = 새 비동기화 창
zen-duplicate-tab-shortcut = 탭 복제
+zen-key-find-selection = 선택된 부분 찾기
diff --git a/locales/ko/browser/browser/zen-boosts.ftl b/locales/ko/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..1b49b35d9
--- /dev/null
+++ b/locales/ko/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = 부스트 이름 변경
+zen-boost-edit-shuffle =
+ .label = 느낌 바꾸기
+zen-boost-edit-reset =
+ .label = 모든 수정 초기화
+zen-boost-edit-delete =
+ .label = 부스트 삭제
+zen-boost-size = 크기
+zen-boost-case = 케이스
+zen-boost-zap = 날리기
+zen-boost-code = 코드
+zen-boost-back = 뒤로
+zen-boost-shuffle =
+ .tooltiptext = 부스트 무작위 설정
+zen-boost-invert =
+ .tooltiptext = 자동 색 반전
+zen-boost-controls =
+ .tooltiptext = 고급 색 설정
+zen-boost-disable =
+ .tooltiptext = 색 변경 비활성화
+zen-boost-text-case-toggle =
+ .tooltiptext = 대문자 설정 전환
+zen-boost-css-picker =
+ .tooltiptext = 선택자 선택
+zen-boost-css-inspector =
+ .tooltiptext = 검사기 열기
+zen-bootst-color-contrast = 대비
+zen-bootst-color-brightness = 밝기
+zen-bootst-color-original-saturation = 원본 채도
+zen-add-zap-helper = 페이지 내의 요소를 클릭해서 날려버리세요
+zen-remove-zap-helper = ← 클릭하여 되살리기
+zen-select-this = 이 요소의 선택자 삽입
+zen-select-related = 연관된 요소의 선택자 삽입
+zen-select-cancel = 취소
+zen-zap-this = 이 요소 날리기
+zen-zap-related = 모든 관련된 요소 날리기
+zen-zap-cancel = 취소
+zen-zap-done = 완료
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] 요소가 날려지지 않았습니다
+ [1] { $elementCount }개의 요소가 날아갔습니다
+ *[other] { $elementCount }개의 요소가 날아갔습니다
+ }
+zen-boost-save =
+ .label = 부스트 내보내기
+zen-boost-load =
+ .label = 부스트 불러오기
+zen-panel-ui-boosts-exported-message = 부스트를 내보냈습니다!
+zen-site-data-boosts = 부스트
+zen-site-data-create-boost =
+ .tooltiptext = 새 부스트 생성
+zen-boost-rename-boost-prompt = 부스트 이름을 수정하시겠습니까?
diff --git a/locales/lt/browser/browser/preferences/zen-preferences.ftl b/locales/lt/browser/browser/preferences/zen-preferences.ftl
index 47df9d551..e156f4da5 100644
--- a/locales/lt/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/lt/browser/browser/preferences/zen-preferences.ftl
@@ -16,12 +16,12 @@ sync-engine-workspaces =
.label = Darbo sritys
.tooltiptext = Sinchronizuokite savo darbo sritis tarp įrenginių
.accesskey = W
-zen-glance-title = Spartusis pažiūrėjimas
-zen-glance-header = Bendrieji sparčiojo pažiūrėjimo nustatymai
+zen-glance-title = „Glance“
+zen-glance-header = Bendrieji „Glance“ nustatymai
zen-glance-description = Gaukite sparčią savo nuorodų apžvalgą neatverdami jų naujoje kortelėje.
zen-glance-trigger-label = Paleidimo būdas
zen-glance-enabled =
- .label = Įjungti spartų pažiūrėjimą
+ .label = Įjungti „Glance“
zen-glance-trigger-ctrl-click =
.label = Vald + spausti
zen-glance-trigger-alt-click =
@@ -268,7 +268,7 @@ zen-close-tab-shortcut = Užverti kortelę
zen-compact-mode-shortcut-show-sidebar = Perjungti slankančią šoninę juostą
zen-compact-mode-shortcut-show-toolbar = Perjungti slankančią įrankių juostą
zen-compact-mode-shortcut-toggle = Perjungti kompaktinį režimą
-zen-glance-expand = Išskleisti spartų pažiūrėjimą
+zen-glance-expand = Išskleisti „Glance“
zen-workspace-shortcut-switch-1 = Perjungti į 1 darbo sritį
zen-workspace-shortcut-switch-2 = Perjungti į 2 darbo sritį
zen-workspace-shortcut-switch-3 = Perjungti į 3 darbo sritį
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Perjungti į 9 darbo sritį
zen-workspace-shortcut-switch-10 = Perjungti į 10 darbo sritį
zen-workspace-shortcut-forward = Pirmyn darbo sritį
zen-workspace-shortcut-backward = Atgal darbo sritį
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Perjungti šoninės juostos plotį
zen-pinned-tab-shortcut-reset = Atkurti prisegtą kortelę į prisegtą URL
zen-split-view-shortcut-grid = Perjungti skaidymo rodinį tinkleliu
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Perjungti prieinamumą
zen-close-all-unpinned-tabs-shortcut = Užverti visas neprisegtas korteles
zen-new-unsynced-window-shortcut = Naujas tuščias langas
zen-duplicate-tab-shortcut = Dubliuoti kortelę
+zen-key-find-selection = Find Selection
diff --git a/locales/lt/browser/browser/zen-boosts.ftl b/locales/lt/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..8a1c758ec
--- /dev/null
+++ b/locales/lt/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Atkurti visus redagavimus
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Dydis
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Kodas
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Kontrastas
+zen-bootst-color-brightness = Šviesumas
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Atsisakyti
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/lt/browser/browser/zen-general.ftl b/locales/lt/browser/browser/zen-general.ftl
index 17f8c20b2..5f91e697b 100644
--- a/locales/lt/browser/browser/zen-general.ftl
+++ b/locales/lt/browser/browser/zen-general.ftl
@@ -107,7 +107,7 @@ zen-site-data-setting-site-protection = Stebėjimo apsauga
zen-site-data-panel-feature-callout-title = Nauji namai priedams, leidimams ir daugiau
zen-site-data-panel-feature-callout-subtitle = Spustelėkite piktogramą, kad tvarkytumėte svetainės nustatymus, peržiūrėtumėte saugumo informaciją, pasiektumėte plėtinius ir atliktumėte įprastus veiksmus.
zen-open-link-in-glance =
- .label = Atverti nuorodą spartiuojame pažiūrėjime
+ .label = Atverti nuorodą rodinyje „Glance“
.accesskey = G
zen-sidebar-notification-updated-heading = Naujinimas baigtas.
@@ -116,7 +116,7 @@ zen-sidebar-notification-updated-heading = Naujinimas baigtas.
zen-sidebar-notification-updated-label = Kas naujo naršyklėje „{ -brand-short-name }“
zen-sidebar-notification-updated-tooltip =
.title = Peržiūrėti leidimo pastabas
-zen-sidebar-notification-restart-safe-mode-label = Kažkas sugedo?
+zen-sidebar-notification-restart-safe-mode-label = Kažkas neveikia?
zen-sidebar-notification-restart-safe-mode-tooltip =
.title = Paleisti iš naujo saugioje režime
zen-window-sync-migration-dialog-title = Išlaikykite savo langus sinchronizuotus
diff --git a/locales/nb/browser/browser/preferences/zen-preferences.ftl b/locales/nb/browser/browser/preferences/zen-preferences.ftl
index 0feb70cca..38868994a 100644
--- a/locales/nb/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/nb/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Bytt til arbeidsområde 9
zen-workspace-shortcut-switch-10 = Bytt til arbeidsområde 10
zen-workspace-shortcut-forward = Fremover arbeidsområde
zen-workspace-shortcut-backward = Bakover arbeidsområde
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Veksle sidepanelets bredde
zen-pinned-tab-shortcut-reset = Tilbakestill festet fane til festet nettadresse
zen-split-view-shortcut-grid = Veksle splittet visnings-nett
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Veksle Tilgjengelighet
zen-close-all-unpinned-tabs-shortcut = Lukk alle ufestede faner
zen-new-unsynced-window-shortcut = Nytt tomt vindu
zen-duplicate-tab-shortcut = Dupliser fane
+zen-key-find-selection = Find Selection
diff --git a/locales/nb/browser/browser/zen-boosts.ftl b/locales/nb/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..658411d08
--- /dev/null
+++ b/locales/nb/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Endre navnet på Boost
+zen-boost-edit-shuffle =
+ .label = Bland Vibes
+zen-boost-edit-reset =
+ .label = Tilbakestill redigeringer
+zen-boost-edit-delete =
+ .label = Slett Boost
+zen-boost-size = Størrelse
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Kode
+zen-boost-back = Tilbake
+zen-boost-shuffle =
+ .tooltiptext = Bland Boost-innstillinger
+zen-boost-invert =
+ .tooltiptext = Smart-inverter farger
+zen-boost-controls =
+ .tooltiptext = Avanserte fargeinnstillinger
+zen-boost-disable =
+ .tooltiptext = Deaktiver fargejusteringer
+zen-boost-text-case-toggle =
+ .tooltiptext = Veksle stor/liten bokstav i skrift
+zen-boost-css-picker =
+ .tooltiptext = Velgselektor
+zen-boost-css-inspector =
+ .tooltiptext = Åpne inspektør
+zen-bootst-color-contrast = Kontrast
+zen-bootst-color-brightness = Lysstyrke
+zen-bootst-color-original-saturation = Opprinnelig fargemetning
+zen-add-zap-helper = Klikk elementer på siden for å Zappe dem
+zen-remove-zap-helper = ← Klikk for å avzappe
+zen-select-this = Sett inn slektor for dette
+zen-select-related = Sett inn selektor for relaterte
+zen-select-cancel = Avbryt
+zen-zap-this = Zap dette
+zen-zap-related = Zap alle relaterte elementer
+zen-zap-cancel = Avbryt
+zen-zap-done = Ferdig
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Ingen elementer zappet
+ [1] { $elementCount } elementer zappet
+ *[other] { $elementCount } elementer zappet
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Booster eksportert!
+zen-site-data-boosts = Booster
+zen-site-data-create-boost =
+ .tooltiptext = Lag ny Boost
+zen-boost-rename-boost-prompt = Endre navn på Boost?
diff --git a/locales/nl/browser/browser/preferences/zen-preferences.ftl b/locales/nl/browser/browser/preferences/zen-preferences.ftl
index 1db60e73f..ac7e8ac4b 100644
--- a/locales/nl/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/nl/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Schakelen naar werkruimte 9
zen-workspace-shortcut-switch-10 = Schakelen naar werkruimte 10
zen-workspace-shortcut-forward = Volgende werkruimte
zen-workspace-shortcut-backward = Vorige werkruimte
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Zijbalk breedte togglen
zen-pinned-tab-shortcut-reset = Vastgezette tab resetten naar vastgezette URL
zen-split-view-shortcut-grid = Gesplitste weergave raster togglen
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Toegankelijkheid togglen
zen-close-all-unpinned-tabs-shortcut = Alle niet-vastgezette tabbladen sluiten
zen-new-unsynced-window-shortcut = Nieuw leeg venster
zen-duplicate-tab-shortcut = Tabblad dupliceren
+zen-key-find-selection = Find Selection
diff --git a/locales/nl/browser/browser/zen-boosts.ftl b/locales/nl/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/nl/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl b/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl
index 61552982c..3b6670d6d 100644
--- a/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Switch to Workspace 9
zen-workspace-shortcut-switch-10 = Switch to Workspace 10
zen-workspace-shortcut-forward = Forward Workspace
zen-workspace-shortcut-backward = Backward Workspace
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Toggle Sidebar's Width
zen-pinned-tab-shortcut-reset = Reset Pinned Tab to Pinned URL
zen-split-view-shortcut-grid = Toggle Split View Grid
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/nn-NO/browser/browser/zen-boosts.ftl b/locales/nn-NO/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/nn-NO/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/pl/browser/browser/preferences/zen-preferences.ftl b/locales/pl/browser/browser/preferences/zen-preferences.ftl
index 32fb99b1b..bb0b0f05e 100644
--- a/locales/pl/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/pl/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Przełącz na obszar roboczy 9
zen-workspace-shortcut-switch-10 = Przełącz na obszar roboczy 10
zen-workspace-shortcut-forward = Następny obszar roboczy
zen-workspace-shortcut-backward = Poprzedni obszar roboczy
+zen-workspace-shortcut-create = Stwórz nową przestrzeń roboczą
zen-sidebar-shortcut-toggle = Przełącz szerokość panelu bocznego
zen-pinned-tab-shortcut-reset = Przywróć przypiętą kartę do przypiętego adresu URL
zen-split-view-shortcut-grid = Przełącz widok podziału na siatkę
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Włącz Dostępność
zen-close-all-unpinned-tabs-shortcut = Zamknij wszystkie nieprzypięte karty
zen-new-unsynced-window-shortcut = Nowe niesynchronizowane okno
zen-duplicate-tab-shortcut = Duplikuj kartę
+zen-key-find-selection = Znajdź zaznaczenie
diff --git a/locales/pl/browser/browser/zen-boosts.ftl b/locales/pl/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7d1e3f33a
--- /dev/null
+++ b/locales/pl/browser/browser/zen-boosts.ftl
@@ -0,0 +1,59 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Zmień nazwę Boosta
+zen-boost-edit-shuffle =
+ .label = Losuj styl
+zen-boost-edit-reset =
+ .label = Zresetuj wszystkie zmiany
+zen-boost-edit-delete =
+ .label = Usuń Boost
+zen-boost-size = Rozmiar
+zen-boost-case = Wielkość liter
+zen-boost-zap = Ukryj
+zen-boost-code = Kod
+zen-boost-back = Cofnij
+zen-boost-shuffle =
+ .tooltiptext = Losuj ustawienia Boosta
+zen-boost-invert =
+ .tooltiptext = Inteligentne odwrócenie kolorów
+zen-boost-controls =
+ .tooltiptext = Zaawansowane ustawienia kolorów
+zen-boost-disable =
+ .tooltiptext = Wyłącz dostosowanie kolorów
+zen-boost-text-case-toggle =
+ .tooltiptext = Przełącz wielkość liter
+zen-boost-css-picker =
+ .tooltiptext = Wybierz selektor
+zen-boost-css-inspector =
+ .tooltiptext = Otwórz Inspektor
+zen-bootst-color-contrast = Kontrast
+zen-bootst-color-brightness = Jasność
+zen-bootst-color-original-saturation = Oryginalne nasycenie
+zen-add-zap-helper = Kliknij elementy na stronie, aby je ukryć
+zen-remove-zap-helper = ← Kliknij, aby cofnąć ukrycie
+zen-select-this = Wstaw selektor dla tego elementu
+zen-select-related = Wstaw selektor dla powiązanych elementów
+zen-select-cancel = Anuluj
+zen-zap-this = Ukryj to
+zen-zap-related = Ukryj wszystkie powiązane elementy
+zen-zap-cancel = Anuluj
+zen-zap-done = Gotowe
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Nie ukryto żadnych elementów
+ [1] Ukryto {$elementCount} element
+ [few] Ukryto {$elementCount} elementy
+ *[other] Ukryto {$elementCount} elementów
+ }
+zen-boost-save =
+ .label = Eksportuj Boosta
+zen-boost-load =
+ .label = Importuj Boosta
+zen-panel-ui-boosts-exported-message = Boost został wyeksportowany!
+zen-site-data-boosts = Boosty
+zen-site-data-create-boost =
+ .tooltiptext = Utwórz nowy Boost
+zen-boost-rename-boost-prompt = Zmienić nazwę Boosta?
diff --git a/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl b/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl
index 8bc0fee98..63e8299c6 100644
--- a/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl
@@ -33,7 +33,7 @@ zen-glance-trigger-meta-click =
zen-look-and-feel-compact-view-header = Exibir em modo compacto
zen-look-and-feel-compact-view-description = Apenas mostre as barras de ferramentas que você usa!
zen-look-and-feel-compact-view-enabled =
- .label = Ativar modo compacto de { -brand-short-name }'s
+ .label = Ativar modo compacto de { -brand-short-name }s
zen-look-and-feel-compact-view-top-toolbar =
.label = Ocultar também a barra de ferramentas superior no modo compacto
zen-look-and-feel-compact-toolbar-flash-popup =
@@ -98,17 +98,17 @@ zen-vertical-tabs-newtab-top-button-up =
.label = Mover o botão de nova aba para o topo
zen-vertical-tabs-expand-tabs-by-default = Expandir abas por padrão
zen-vertical-tabs-dont-expand-tabs-by-default = Não expandir abas por padrão
-zen-vertical-tabs-expand-tabs-on-hover = Expandir Abas no Aerobarco (não funciona no modo compacto)
+zen-vertical-tabs-expand-tabs-on-hover = Expandir abas ao passar o mouse (não vai funcionar no modo compacto)
zen-vertical-tabs-expand-tabs-header = Como expandir abas
zen-vertical-tabs-expand-tabs-description = Escolha como expandir abas na barra lateral
zen-theme-marketplace-header = Zen Mods
zen-theme-disable-all-enabled =
- .title = Desativar todos os temas
+ .title = Desativar todos os mods
zen-theme-disable-all-disabled =
- .title = Ativar todos os temas
-zen-theme-marketplace-description = Encontre e instale temas da loja.
+ .title = Ativar todos os mods
+zen-theme-marketplace-description = Encontre e instale mods da loja.
zen-theme-marketplace-remove-button =
- .label = Remover tema
+ .label = Remover mod
zen-theme-marketplace-check-for-updates-button =
.label = Procurar por atualizações
zen-theme-marketplace-import-button =
@@ -119,14 +119,14 @@ zen-theme-marketplace-import-success = Mods importados com sucesso
zen-theme-marketplace-import-failure = Ocorreu um erro ao importar os mods
zen-theme-marketplace-export-success = Mods exportados com sucesso
zen-theme-marketplace-export-failure = Ocorreu um erro ao exportar os mods
-zen-theme-marketplace-updates-success = Tema atualizado com sucesso
+zen-theme-marketplace-updates-success = Mods atualizados com sucesso
zen-theme-marketplace-updates-failure = Nenhuma atualização encontrada!
zen-theme-marketplace-toggle-enabled-button =
- .title = Desativar tema
+ .title = Desabilitar mod
zen-theme-marketplace-toggle-disabled-button =
- .title = Ativar tema
+ .title = Habilitar mod
zen-theme-marketplace-remove-confirmation = Tem certeza que deseja remover este mod?
-zen-theme-marketplace-close-modal = FECHAR
+zen-theme-marketplace-close-modal = Fechar
zen-theme-marketplace-theme-header-title =
.title = Seletor CSS: { $name }
zen-theme-marketplace-dropdown-default-label =
@@ -162,7 +162,7 @@ category-zen-CKS =
.tooltiptext = { pane-zen-CKS-title }
pane-settings-CKS-title = Atalhos { -brand-short-name }
category-zen-marketplace =
- .tooltiptext = Mods do Zen
+ .tooltiptext = Zen Mods
zen-settings-CKS-header = Personalize seus atalhos de teclado
zen-settings-CKS-description = Altere os atalhos de teclado padrão ao seu gosto e melhore a sua experiência de navegação
zen-settings-CKS-disable-firefox =
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Mudar para Área de Trabalho 9
zen-workspace-shortcut-switch-10 = Mudar para Área de Trabalho 10
zen-workspace-shortcut-forward = Encaminhar espaço de trabalho
zen-workspace-shortcut-backward = Workspace Anterior
+zen-workspace-shortcut-create = Criar novo Espaço
zen-sidebar-shortcut-toggle = Alternar Largura do painel
zen-pinned-tab-shortcut-reset = Restaurar a Guia Fixado para a URL fixada
zen-split-view-shortcut-grid = Alternar grade de visualização dividida
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Ativar/Desativar Acessibilidade
zen-close-all-unpinned-tabs-shortcut = Fechar Todas as Abas Não Fixadas
zen-new-unsynced-window-shortcut = Nova Janela Dessincronizada
zen-duplicate-tab-shortcut = Duplicar Aba
+zen-key-find-selection = Encontrar Selecionado
diff --git a/locales/pt-BR/browser/browser/zen-boosts.ftl b/locales/pt-BR/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..6ae7e53e6
--- /dev/null
+++ b/locales/pt-BR/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Renomear Boost
+zen-boost-edit-shuffle =
+ .label = Misturar Vibes
+zen-boost-edit-reset =
+ .label = Redefinir Todas as Edições
+zen-boost-edit-delete =
+ .label = Excluir Boost
+zen-boost-size = Tamanho
+zen-boost-case = Caixa
+zen-boost-zap = Zap
+zen-boost-code = Código
+zen-boost-back = Voltar
+zen-boost-shuffle =
+ .tooltiptext = Misturar Configurações do Boost
+zen-boost-invert =
+ .tooltiptext = Inversão Inteligente de Cores
+zen-boost-controls =
+ .tooltiptext = Controles Avançados de Cores
+zen-boost-disable =
+ .tooltiptext = Desativar Ajusta de Cores
+zen-boost-text-case-toggle =
+ .tooltiptext = Ativar Caixa de Texto
+zen-boost-css-picker =
+ .tooltiptext = Ferramenta de Seleção
+zen-boost-css-inspector =
+ .tooltiptext = Abrir Inspetor
+zen-bootst-color-contrast = Contraste
+zen-bootst-color-brightness = Brilho
+zen-bootst-color-original-saturation = Saturação Original
+zen-add-zap-helper = Clique em elementos da página para dar um Zap neles
+zen-remove-zap-helper = Clique para Deszapar
+zen-select-this = Inserir seletor para isto
+zen-select-related = Inserir seletor para relacionados
+zen-select-cancel = Cancelar
+zen-zap-this = Zap isso
+zen-zap-related = Zap em todos os elementos relacionados
+zen-zap-cancel = Cancelar
+zen-zap-done = Pronto
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Nenhum elemento zapeado
+ [1] { $elementCount } elemento zapeado
+ *[other] { $elementCount } elementos zapeados
+ }
+zen-boost-save =
+ .label = Exportar Boost
+zen-boost-load =
+ .label = Importar Boost
+zen-panel-ui-boosts-exported-message = Boost exportado!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Criar novo boost
+zen-boost-rename-boost-prompt = Renomear Boost?
diff --git a/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl b/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl
index 8ed17f431..a501737b7 100644
--- a/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Mudar para o Espaço de Trabalho 9
zen-workspace-shortcut-switch-10 = Mudar para o Espaço de Trabalho 10
zen-workspace-shortcut-forward = Espaço de Trabalho Seguinte
zen-workspace-shortcut-backward = Espaço de Trabalho Anterior
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Alternar largura da Barra Lateral
zen-pinned-tab-shortcut-reset = Repor o Separador Fixado para a URL Fixada
zen-split-view-shortcut-grid = Ativar Vista Dividida em Grelha
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Alternar Acessibilidade
zen-close-all-unpinned-tabs-shortcut = Fechar Todos os Separadores Não Fixados
zen-new-unsynced-window-shortcut = Nova janela sem sincronização
zen-duplicate-tab-shortcut = Duplicar Separador
+zen-key-find-selection = Find Selection
diff --git a/locales/pt-PT/browser/browser/zen-boosts.ftl b/locales/pt-PT/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/pt-PT/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/ro/browser/browser/preferences/zen-preferences.ftl b/locales/ro/browser/browser/preferences/zen-preferences.ftl
index ed26f72b8..a43ff8124 100644
--- a/locales/ro/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ro/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Switch to Workspace 9
zen-workspace-shortcut-switch-10 = Switch to Workspace 10
zen-workspace-shortcut-forward = Forward Workspace
zen-workspace-shortcut-backward = Backward Workspace
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Toggle Sidebar's Width
zen-pinned-tab-shortcut-reset = Reset Pinned Tab to Pinned URL
zen-split-view-shortcut-grid = Toggle Split View Grid
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/ro/browser/browser/zen-boosts.ftl b/locales/ro/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/ro/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/ru/browser/browser/preferences/zen-preferences.ftl b/locales/ru/browser/browser/preferences/zen-preferences.ftl
index 4942900e9..bd2d72876 100644
--- a/locales/ru/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ru/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Переключиться на простра
zen-workspace-shortcut-switch-10 = Переключиться на пространство 10
zen-workspace-shortcut-forward = Следующее пространство
zen-workspace-shortcut-backward = Предыдущее пространство
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Ширина боковой панели
zen-pinned-tab-shortcut-reset = Восстановить адрес закрепленной вкладки
zen-split-view-shortcut-grid = Переключить разделение сетки вида
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Включить/выключить
zen-close-all-unpinned-tabs-shortcut = Закрыть все не закреплённые вкладки
zen-new-unsynced-window-shortcut = Новое пустое окно
zen-duplicate-tab-shortcut = Дублировать вкладку
+zen-key-find-selection = Find Selection
diff --git a/locales/ru/browser/browser/zen-boosts.ftl b/locales/ru/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/ru/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/ru/browser/browser/zen-general.ftl b/locales/ru/browser/browser/zen-general.ftl
index af51df15e..d5d80ae37 100644
--- a/locales/ru/browser/browser/zen-general.ftl
+++ b/locales/ru/browser/browser/zen-general.ftl
@@ -50,7 +50,7 @@ zen-pinned-tab-replaced = Адрес закреплённой вкладки з
zen-tabs-renamed = Вкладка успешно переименована!
zen-background-tab-opened-toast = Открыта новая фоновая вкладка!
zen-workspace-renamed-toast = Пространство успешно переименовано!
-zen-split-view-limit-toast = Can't add more panels to the split view!
+zen-split-view-limit-toast = Невозможно добавить больше панелей в раздельный вид!
zen-toggle-compact-mode-button =
.label = Компактный режим
.tooltiptext = Переключить компактный режим
diff --git a/locales/sk/browser/browser/preferences/zen-preferences.ftl b/locales/sk/browser/browser/preferences/zen-preferences.ftl
index 91d5cd501..ba3976eb2 100644
--- a/locales/sk/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/sk/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Prepnúť na pracovnú plochu 9
zen-workspace-shortcut-switch-10 = Prepnúť na pracovnú plochu 10
zen-workspace-shortcut-forward = Nasledujúca pracovná plocha
zen-workspace-shortcut-backward = Predchádzajúca pracovná plocha
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Prepnúť šírku bočného panela
zen-pinned-tab-shortcut-reset = Obnoviť pripnutú kartu na pôvodnú URL
zen-split-view-shortcut-grid = Prepnúť mriežku rozdeleného zobrazenia
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Prepnúť prístupnosť
zen-close-all-unpinned-tabs-shortcut = Zatvoriť všetky nepripnuté karty
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/sk/browser/browser/zen-boosts.ftl b/locales/sk/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/sk/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl b/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
index 5734cbcc6..9a144f5b0 100644
--- a/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Växla till arbetsyta 9
zen-workspace-shortcut-switch-10 = Växla till arbetsyta 10
zen-workspace-shortcut-forward = Vidarebefordra arbetsyta
zen-workspace-shortcut-backward = Bakåt arbetsyta
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Växla sidofältets bredd
zen-pinned-tab-shortcut-reset = Återställ Fäst flik till Pinned URL
zen-split-view-shortcut-grid = Växla delad vy rutnät
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Växla tillgänglighetsinställning
zen-close-all-unpinned-tabs-shortcut = Stäng alla flikar som inte är fästa
zen-new-unsynced-window-shortcut = Nytt tomt fönster
zen-duplicate-tab-shortcut = Duplicera flik
+zen-key-find-selection = Find Selection
diff --git a/locales/sv-SE/browser/browser/zen-boosts.ftl b/locales/sv-SE/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..e784c0f25
--- /dev/null
+++ b/locales/sv-SE/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Byt namn på förändring
+zen-boost-edit-shuffle =
+ .label = Blanda vibbar
+zen-boost-edit-reset =
+ .label = Återställ alla redigeringar
+zen-boost-edit-delete =
+ .label = Ta bort förändring
+zen-boost-size = Storlek
+zen-boost-case = Case
+zen-boost-zap = Zappa
+zen-boost-code = Kod
+zen-boost-back = Tillbaka
+zen-boost-shuffle =
+ .tooltiptext = Inställningar för blandningsförändring
+zen-boost-invert =
+ .tooltiptext = Smart invertera färger
+zen-boost-controls =
+ .tooltiptext = Avancerade färgkontroller
+zen-boost-disable =
+ .tooltiptext = Inaktivera färgjusteringar
+zen-boost-text-case-toggle =
+ .tooltiptext = Växla textfall
+zen-boost-css-picker =
+ .tooltiptext = Välj väljare
+zen-boost-css-inspector =
+ .tooltiptext = Öppna inspektör
+zen-bootst-color-contrast = Kontrast
+zen-bootst-color-brightness = Ljusstyrka
+zen-bootst-color-original-saturation = Ursprunglig mättnad
+zen-add-zap-helper = Klicka på element på sidan för att zappa dem
+zen-remove-zap-helper = ← Klicka för att avzappa
+zen-select-this = Infoga väljare för detta
+zen-select-related = Infoga väljare för relaterade
+zen-select-cancel = Avbryt
+zen-zap-this = Zappa detta
+zen-zap-related = Zappa alla relaterade element
+zen-zap-cancel = Avbryt
+zen-zap-done = Klart
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Inga element zappade
+ [1] { $elementCount } element zappade
+ *[other] { $elementCount } flera element zappade
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Förändring exporterad!
+zen-site-data-boosts = Förändringar
+zen-site-data-create-boost =
+ .tooltiptext = Skapa ny förändring
+zen-boost-rename-boost-prompt = Byt namn på förändring?
diff --git a/locales/th/browser/browser/preferences/zen-preferences.ftl b/locales/th/browser/browser/preferences/zen-preferences.ftl
index 809b5601a..4a8417a09 100644
--- a/locales/th/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/th/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = สลับไปใช้พื้นที
zen-workspace-shortcut-switch-10 = สลับไปใช้พื้นที่ทำงานที่ 10
zen-workspace-shortcut-forward = ไปยังพื้นที่ทำงานก่อนหน้า
zen-workspace-shortcut-backward = ไปยังพื้นที่ทำงานด้านหลัง
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Toggle Sidebar's Width
zen-pinned-tab-shortcut-reset = Reset Pinned Tab to Pinned URL
zen-split-view-shortcut-grid = Toggle Split View Grid
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
zen-duplicate-tab-shortcut = Duplicate Tab
+zen-key-find-selection = Find Selection
diff --git a/locales/th/browser/browser/zen-boosts.ftl b/locales/th/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7211fa124
--- /dev/null
+++ b/locales/th/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Rename Boost
+zen-boost-edit-shuffle =
+ .label = Shuffle Vibes
+zen-boost-edit-reset =
+ .label = Reset All Edits
+zen-boost-edit-delete =
+ .label = Delete Boost
+zen-boost-size = Size
+zen-boost-case = Case
+zen-boost-zap = Zap
+zen-boost-code = Code
+zen-boost-back = Back
+zen-boost-shuffle =
+ .tooltiptext = Shuffle Boost Settings
+zen-boost-invert =
+ .tooltiptext = Smart Invert Colors
+zen-boost-controls =
+ .tooltiptext = Advanced Color Controls
+zen-boost-disable =
+ .tooltiptext = Disable Color Adjustments
+zen-boost-text-case-toggle =
+ .tooltiptext = Toggle Text Case
+zen-boost-css-picker =
+ .tooltiptext = Pick Selector
+zen-boost-css-inspector =
+ .tooltiptext = Open Inspector
+zen-bootst-color-contrast = Contrast
+zen-bootst-color-brightness = Brightness
+zen-bootst-color-original-saturation = Original Saturation
+zen-add-zap-helper = Click elements on the page to Zap them
+zen-remove-zap-helper = ← Click to Unzap
+zen-select-this = Insert selector for this
+zen-select-related = Insert selector for related
+zen-select-cancel = Cancel
+zen-zap-this = Zap this
+zen-zap-related = Zap all related elements
+zen-zap-cancel = Cancel
+zen-zap-done = Done
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] No elements zapped
+ [1] { $elementCount } element zapped
+ *[other] { $elementCount } elements zapped
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost exported!
+zen-site-data-boosts = Boosts
+zen-site-data-create-boost =
+ .tooltiptext = Create new boost
+zen-boost-rename-boost-prompt = Rename Boost?
diff --git a/locales/tr/browser/browser/preferences/zen-preferences.ftl b/locales/tr/browser/browser/preferences/zen-preferences.ftl
index 9fe0debf3..44f39df3c 100644
--- a/locales/tr/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/tr/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = 9. çalışma alanına geç
zen-workspace-shortcut-switch-10 = 10. çalışma alanına geç
zen-workspace-shortcut-forward = Sonraki çalışma alanı
zen-workspace-shortcut-backward = Önceki çalışma alanı
+zen-workspace-shortcut-create = Yeni çalışma alanı oluştur
zen-sidebar-shortcut-toggle = Kenar çubuğu genişliğini değiştir
zen-pinned-tab-shortcut-reset = Sabitlenen sekmeyi sabitlenen URL'ye sıfırla
zen-split-view-shortcut-grid = Izgaralı bölünmüş görünümü aç/kapat
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Erişilebilirliği aç/kapat
zen-close-all-unpinned-tabs-shortcut = Sabitlenmemiş tüm sekmeleri kapat
zen-new-unsynced-window-shortcut = Yeni boş pencere
zen-duplicate-tab-shortcut = Sekmeyi çoğalt
+zen-key-find-selection = Seçimi bul
diff --git a/locales/tr/browser/browser/zen-boosts.ftl b/locales/tr/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..7c78e7c03
--- /dev/null
+++ b/locales/tr/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Boost’u yeniden adlandır
+zen-boost-edit-shuffle =
+ .label = Vibe'ları karıştır
+zen-boost-edit-reset =
+ .label = Tüm düzenlemeleri sıfırla
+zen-boost-edit-delete =
+ .label = Boost’u sil
+zen-boost-size = Boyut
+zen-boost-case = Büyük/küçük harf
+zen-boost-zap = Zap
+zen-boost-code = Kod
+zen-boost-back = Geri
+zen-boost-shuffle =
+ .tooltiptext = Boost ayarlarını karıştır
+zen-boost-invert =
+ .tooltiptext = Renkleri ters çevir
+zen-boost-controls =
+ .tooltiptext = Gelişmiş renk kontrolleri
+zen-boost-disable =
+ .tooltiptext = Renk ayarlarını devre dışı bırak
+zen-boost-text-case-toggle =
+ .tooltiptext = Metin büyük/küçük harf değişimini aç/kapat
+zen-boost-css-picker =
+ .tooltiptext = Seçici seç
+zen-boost-css-inspector =
+ .tooltiptext = Denetleyiciyi aç
+zen-bootst-color-contrast = Kontrast
+zen-bootst-color-brightness = Parlaklık
+zen-bootst-color-original-saturation = Orijinal doygunluk
+zen-add-zap-helper = Sayfadaki ögelere tıklayarak onları Zap ile kaldırın
+zen-remove-zap-helper = ← Unzap için tıklayın
+zen-select-this = Bu öge için seçici ekle
+zen-select-related = İlgili ögeler için seçici ekle
+zen-select-cancel = İptal
+zen-zap-this = Bunu Zap ile kaldır
+zen-zap-related = İlgili tüm ögeleri Zap ile kaldır
+zen-zap-cancel = İptal
+zen-zap-done = Bitti
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Hiç öge Zap’lenmedi
+ [1] { $elementCount } öge Zap’lenmiş
+ *[other] { $elementCount } öge Zap’lenmiş
+ }
+zen-boost-save =
+ .label = Boost’u dışa aktar
+zen-boost-load =
+ .label = Boost’u içe aktar
+zen-panel-ui-boosts-exported-message = Boost dışa aktarıldı!
+zen-site-data-boosts = Boost'lar
+zen-site-data-create-boost =
+ .tooltiptext = Yeni Boost oluştur
+zen-boost-rename-boost-prompt = Boost yeniden adlandırılsın mı?
diff --git a/locales/uk/browser/browser/preferences/zen-preferences.ftl b/locales/uk/browser/browser/preferences/zen-preferences.ftl
index 3dcce31ba..c2860504c 100644
--- a/locales/uk/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/uk/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Перейти на робочу област
zen-workspace-shortcut-switch-10 = Перейти на робочу область 10
zen-workspace-shortcut-forward = Наступний робочий простір
zen-workspace-shortcut-backward = Попередній робочий простір
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Перемкнути ширину бічної панелі
zen-pinned-tab-shortcut-reset = Скинути прикріплену вкладку до закріпленої URL-адреси
zen-split-view-shortcut-grid = Перемкнути розділену сітку
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Увімк. / Вимк. досту
zen-close-all-unpinned-tabs-shortcut = Закрити всі відкріплені вкладки
zen-new-unsynced-window-shortcut = Нове несинхронізоване вікно
zen-duplicate-tab-shortcut = Дублювати вкладку
+zen-key-find-selection = Find Selection
diff --git a/locales/uk/browser/browser/zen-boosts.ftl b/locales/uk/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..3e5c35c98
--- /dev/null
+++ b/locales/uk/browser/browser/zen-boosts.ftl
@@ -0,0 +1,59 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Перейменувати підсилення
+zen-boost-edit-shuffle =
+ .label = Змінити стиль
+zen-boost-edit-reset =
+ .label = Скинути всі зміни
+zen-boost-edit-delete =
+ .label = Видалити підсилення
+zen-boost-size = Розмір
+zen-boost-case = Case
+zen-boost-zap = Сховати
+zen-boost-code = Код
+zen-boost-back = Назад
+zen-boost-shuffle =
+ .tooltiptext = Налаштування зміни стилю
+zen-boost-invert =
+ .tooltiptext = Розумна інверсія кольорів
+zen-boost-controls =
+ .tooltiptext = Розширені налаштування кольору
+zen-boost-disable =
+ .tooltiptext = Вимкнути налаштування кольору
+zen-boost-text-case-toggle =
+ .tooltiptext = Змінити регістр тексту
+zen-boost-css-picker =
+ .tooltiptext = Вибір селектора
+zen-boost-css-inspector =
+ .tooltiptext = Відкрити інспектора
+zen-bootst-color-contrast = Контраст
+zen-bootst-color-brightness = Яскравість
+zen-bootst-color-original-saturation = Оригінальна насиченість
+zen-add-zap-helper = Клацніть на елементи на сторінці, щоби сховати їх
+zen-remove-zap-helper = ← Клацніть, аби знову показати
+zen-select-this = Вставити селектор для цього
+zen-select-related = Вставити селектор для пов’язаних елементів
+zen-select-cancel = Скасувати
+zen-zap-this = Сховати їх
+zen-zap-related = Сховати всі пов’язані елементи
+zen-zap-cancel = Скасувати
+zen-zap-done = Готово
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Жоден елемент не сховано
+ [1] Сховано {$elementCount} елемент
+ [few] Сховано {$elementCount} елементи
+ *[other] Сховано {$elementCount} елементів
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Підсилення експортовано!
+zen-site-data-boosts = Підсилення
+zen-site-data-create-boost =
+ .tooltiptext = Створити нове підсилення
+zen-boost-rename-boost-prompt = Перейменувати підсилення?
diff --git a/locales/uk/browser/browser/zen-split-view.ftl b/locales/uk/browser/browser/zen-split-view.ftl
index 77ea3247f..4a6b7ca9b 100644
--- a/locales/uk/browser/browser/zen-split-view.ftl
+++ b/locales/uk/browser/browser/zen-split-view.ftl
@@ -7,8 +7,8 @@ tab-zen-split-tabs =
{ $tabCount ->
[-1] Відокремити вкладку
[1] Додати розділений перегляд...
- [few] Об’єднати { $tabCount } вкладки
- *[other] Об’єднати { $tabCount } вкладок
+ [few] Об’єднати { $tabCount } вкладки
+ *[other] Об’єднати { $tabCount } вкладок
}
.accesskey = S
zen-split-link =
diff --git a/locales/vi/browser/browser/preferences/zen-preferences.ftl b/locales/vi/browser/browser/preferences/zen-preferences.ftl
index cc89ed45d..1158ff2aa 100644
--- a/locales/vi/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/vi/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = Chuyển sang không gian làm việc 9
zen-workspace-shortcut-switch-10 = Chuyển sang không gian làm việc 10
zen-workspace-shortcut-forward = Không gian làm việc tiếp theo
zen-workspace-shortcut-backward = Không gian làm việc trước
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = Điều chỉnh độ rộng thanh bên
zen-pinned-tab-shortcut-reset = Đặt lại thẻ đã ghim về địa chỉ gốc
zen-split-view-shortcut-grid = Bật/Tắt chia lưới
@@ -317,4 +318,5 @@ zen-devtools-toggle-dom-shortcut = Bật/Tắt DOM
zen-devtools-toggle-accessibility-shortcut = Bật/Tắt trợ năng
zen-close-all-unpinned-tabs-shortcut = Đóng tất cả thẻ chưa ghim
zen-new-unsynced-window-shortcut = Cửa sổ trống mới
-zen-duplicate-tab-shortcut = Duplicate Tab
+zen-duplicate-tab-shortcut = Nhân đôi tab
+zen-key-find-selection = Find Selection
diff --git a/locales/vi/browser/browser/zen-boosts.ftl b/locales/vi/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..734f49741
--- /dev/null
+++ b/locales/vi/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = Đổi tên cải tiến
+zen-boost-edit-shuffle =
+ .label = Trộn Vibe
+zen-boost-edit-reset =
+ .label = Đặt lại tất cả chỉnh sửa
+zen-boost-edit-delete =
+ .label = Xóa cải tiến
+zen-boost-size = Kích thước
+zen-boost-case = Case
+zen-boost-zap = Khử
+zen-boost-code = Code
+zen-boost-back = Quay lại
+zen-boost-shuffle =
+ .tooltiptext = Xáo trộn cài đặt cải tiến
+zen-boost-invert =
+ .tooltiptext = Đảo ngược màu thông minh
+zen-boost-controls =
+ .tooltiptext = Chỉnh màu nâng cao
+zen-boost-disable =
+ .tooltiptext = Tắt điều chỉnh màu
+zen-boost-text-case-toggle =
+ .tooltiptext = Chuyển đổi kiểu chữ
+zen-boost-css-picker =
+ .tooltiptext = Chọn phần tử
+zen-boost-css-inspector =
+ .tooltiptext = Mở trình kiểm tra
+zen-bootst-color-contrast = Độ tương phản
+zen-bootst-color-brightness = Độ sáng
+zen-bootst-color-original-saturation = Độ bão hòa gốc
+zen-add-zap-helper = Nhấp vào các phần tử trên trang để Khử chúng
+zen-remove-zap-helper = ← Nhấp để khôi phục
+zen-select-this = Nhập bộ chọn cho phần tử này
+zen-select-related = Nhập bộ chọn cho các phần tử liên quan
+zen-select-cancel = Hủy
+zen-zap-this = Khử phần tử này
+zen-zap-related = Khử tất cả phần tử liên quan
+zen-zap-cancel = Hủy
+zen-zap-done = Xong
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] Chưa khử phần tử nào
+ [1] Đã khử { $elementCount } phần tử
+ *[other] Đã khử { $elementCount } phần tử
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Đã xuất cải tiến!
+zen-site-data-boosts = Cải tiến
+zen-site-data-create-boost =
+ .tooltiptext = Tạo cải tiến mới
+zen-boost-rename-boost-prompt = Đổi tên cải tiến?
diff --git a/locales/vi/browser/browser/zen-general.ftl b/locales/vi/browser/browser/zen-general.ftl
index 71e6413c8..405d42a21 100644
--- a/locales/vi/browser/browser/zen-general.ftl
+++ b/locales/vi/browser/browser/zen-general.ftl
@@ -2,7 +2,7 @@
# 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-panel-ui-current-profile-text = Hồ sơ hiện tại
+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 =
.label =
@@ -14,7 +14,7 @@ tab-context-zen-reset-pinned-tab =
tab-context-zen-add-essential =
.label = Thêm vào thẻ chính
.accesskey = E
-tab-context-zen-add-essential-badge = Đã dùng { $num } / { $max } vị trí
+tab-context-zen-add-essential-badge = { $num } / { $max }
tab-context-zen-remove-essential =
.label = Gỡ khỏi thẻ chính
.accesskey = R
@@ -48,7 +48,7 @@ zen-pinned-tab-replaced = URL của thẻ đã ghim đã được thay thế b
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-split-view-limit-toast = Can't add more panels to the split view!
+zen-split-view-limit-toast = Không thể chia thêm màn hình!
zen-toggle-compact-mode-button =
.label = Chế độ thu gọn
.tooltiptext = Bật Chế độ thu gọn
diff --git a/locales/vi/browser/browser/zen-split-view.ftl b/locales/vi/browser/browser/zen-split-view.ftl
index ec563698d..8487bb03e 100644
--- a/locales/vi/browser/browser/zen-split-view.ftl
+++ b/locales/vi/browser/browser/zen-split-view.ftl
@@ -5,9 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [-1] Split out tab
- [1] Add split view...
- *[other] Join { $tabCount } Tabs
+ [-1] Tách thẻ
+ [1] Chia đôi màn hình...
+ *[other] Gộp { $tabCount } thẻ
}
.accesskey = S
zen-split-link =
diff --git a/locales/vi/browser/browser/zen-vertical-tabs.ftl b/locales/vi/browser/browser/zen-vertical-tabs.ftl
index ae63b8b3b..6d07a6796 100644
--- a/locales/vi/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/vi/browser/browser/zen-vertical-tabs.ftl
@@ -18,7 +18,7 @@ zen-toolbar-context-compact-mode-hide-both =
.label = Ẩn cả hai
.accesskey = H
zen-toolbar-context-move-to-folder =
- .label = Move to Folder...
+ .label = Chuyển vào thư mục...
.accesskey = M
zen-toolbar-context-new-folder =
.label = Thư mục mới
diff --git a/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl b/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl
index da82d2771..cc5014b4f 100644
--- a/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl
@@ -281,6 +281,7 @@ zen-workspace-shortcut-switch-9 = 切换到工作区 9
zen-workspace-shortcut-switch-10 = 切换到工作区 10
zen-workspace-shortcut-forward = 下一个工作区
zen-workspace-shortcut-backward = 上一个工作区
+zen-workspace-shortcut-create = Create New Workspace
zen-sidebar-shortcut-toggle = 折叠/展开侧边栏
zen-pinned-tab-shortcut-reset = 重置固定标签页至其固定的 URL
zen-split-view-shortcut-grid = 切换网格分屏视图
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = 切换无障碍环境
zen-close-all-unpinned-tabs-shortcut = 关闭所有未固定的标签页
zen-new-unsynced-window-shortcut = 新建空白窗口
zen-duplicate-tab-shortcut = 克隆标签页
+zen-key-find-selection = Find Selection
diff --git a/locales/zh-CN/browser/browser/zen-boosts.ftl b/locales/zh-CN/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..be617b8c7
--- /dev/null
+++ b/locales/zh-CN/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = 重命名 Boost
+zen-boost-edit-shuffle =
+ .label = 随机氛围
+zen-boost-edit-reset =
+ .label = 重置所有编辑
+zen-boost-edit-delete =
+ .label = 删除 Boost
+zen-boost-size = 尺寸
+zen-boost-case = Case
+zen-boost-zap = 屏蔽
+zen-boost-code = 代码
+zen-boost-back = 返回
+zen-boost-shuffle =
+ .tooltiptext = 随机 Boost 设置
+zen-boost-invert =
+ .tooltiptext = 智能反转颜色
+zen-boost-controls =
+ .tooltiptext = 高级颜色控制
+zen-boost-disable =
+ .tooltiptext = 禁用颜色调整
+zen-boost-text-case-toggle =
+ .tooltiptext = 切换文本大小写
+zen-boost-css-picker =
+ .tooltiptext = 选取选择器
+zen-boost-css-inspector =
+ .tooltiptext = 打开查看器
+zen-bootst-color-contrast = 对比度
+zen-bootst-color-brightness = 亮度
+zen-bootst-color-original-saturation = 初始饱和度
+zen-add-zap-helper = 点击页面上的元素以将其屏蔽
+zen-remove-zap-helper = ← 点击以取消屏蔽
+zen-select-this = 插入此元素的选择器
+zen-select-related = 插入相关元素的选择器
+zen-select-cancel = 取消
+zen-zap-this = 屏蔽此元素
+zen-zap-related = 屏蔽所有相关元素
+zen-zap-cancel = 取消
+zen-zap-done = 完成
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] 没有已屏蔽的元素
+ [1] 已屏蔽 { $elementCount } 个元素
+ *[other] 已屏蔽 { $elementCount } 个元素
+ }
+zen-boost-save =
+ .label = Export Boost
+zen-boost-load =
+ .label = Import Boost
+zen-panel-ui-boosts-exported-message = Boost 已导出!
+zen-site-data-boosts = Boost
+zen-site-data-create-boost =
+ .tooltiptext = 新建 Boost
+zen-boost-rename-boost-prompt = 重命名 Boost 吗?
diff --git a/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl b/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl
index 0b7a4eb24..e47b873db 100644
--- a/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl
@@ -52,11 +52,11 @@ zen-tabs-cycle-by-attribute =
.label = Ctrl+Tab 僅會在 Essential 分頁或是 Workspace 分頁之間切換
zen-tabs-cycle-ignore-pending-tabs =
.label = 使用 Ctrl+Tab 切換分頁時,忽略卸載的分頁
-zen-tabs-cycle-by-attribute-warning = Ctrl+Tab 將按最近使用順序循環,因為該設定已啟用
+zen-tabs-cycle-by-attribute-warning = 依當前設定,Ctrl+Tab 將按最近使用順序循環
zen-look-and-feel-compact-toolbar-themed =
- .label = 將主題顏色套用至緊湊模式時的工具欄
+ .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 = 釘選分頁的額外行為
@@ -89,7 +89,7 @@ zen-key-conflict = 與 { $group } -> { $shortcut } 衝突
pane-zen-theme-title = 主題設定
zen-vertical-tabs-title = 側邊欄與分頁排版
zen-vertical-tabs-header = 垂直分頁
-zen-vertical-tabs-description = 用垂直的排版來管理你的分頁
+zen-vertical-tabs-description = 用垂直列表來管理你的分頁
zen-vertical-tabs-show-expand-button =
.label = 顯示擴展按鈕
zen-vertical-tabs-newtab-on-tab-list =
@@ -122,9 +122,9 @@ zen-theme-marketplace-export-failure = 匯出模組時發生錯誤
zen-theme-marketplace-updates-success = 主題更新成功
zen-theme-marketplace-updates-failure = 找不到任何更新!
zen-theme-marketplace-toggle-enabled-button =
- .title = 關閉佈景主題
+ .title = 關閉模組
zen-theme-marketplace-toggle-disabled-button =
- .title = 啟用佈景主題
+ .title = 啟用模組
zen-theme-marketplace-remove-confirmation = 您確定要移除此模組?
zen-theme-marketplace-close-modal = 關閉
zen-theme-marketplace-theme-header-title =
@@ -145,9 +145,9 @@ zen-dark-theme-styles-amoled = 夜間主題
zen-dark-theme-styles-default = 預設深色主題
zen-dark-theme-styles-colorful = 有趣的深色主題
zen-compact-mode-styles-left = 隱藏分頁欄
-zen-compact-mode-styles-top = 隱藏功能列
+zen-compact-mode-styles-top = 隱藏頂端列
zen-compact-mode-styles-both = 隱藏兩者
-zen-urlbar-title = Zen 網址欄
+zen-urlbar-title = Zen 網址列
zen-urlbar-header = 網址列一般設定
zen-urlbar-description = 自訂義您喜歡的網址列
zen-urlbar-behavior-label = 行為
@@ -164,7 +164,7 @@ pane-settings-CKS-title = { -brand-short-name } 快捷鍵
category-zen-marketplace =
.tooltiptext = Zen 模組
zen-settings-CKS-header = 自定義您的快捷鍵
-zen-settings-CKS-description = 依據您的愛好來更改預設的快捷鍵以進一步改善瀏覽體驗
+zen-settings-CKS-description = 依您喜好來更改預設的快捷鍵以進一步改善瀏覽體驗
zen-settings-CKS-disable-firefox =
.label = 停用 { -brand-short-name } 的預設快捷鍵
zen-settings-CKS-duplicate-shortcut =
@@ -281,9 +281,10 @@ zen-workspace-shortcut-switch-9 = 切換至工作區 9
zen-workspace-shortcut-switch-10 = 切換至工作區 10
zen-workspace-shortcut-forward = 下一個工作區
zen-workspace-shortcut-backward = 上一個工作區
+zen-workspace-shortcut-create = 新增工作區
zen-sidebar-shortcut-toggle = 切換側邊欄寬度
zen-pinned-tab-shortcut-reset = 重置釘選分頁至其初始的網址
-zen-split-view-shortcut-grid = 切換分割畫面
+zen-split-view-shortcut-grid = 切換分割畫面排列
zen-split-view-shortcut-vertical = 切換垂直分割畫面
zen-split-view-shortcut-horizontal = 切換水平分割畫面
zen-split-view-shortcut-unsplit = 關閉分割畫面
@@ -318,3 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = 開啟輔助功能
zen-close-all-unpinned-tabs-shortcut = 關閉所有未釘選的分頁
zen-new-unsynced-window-shortcut = 開新簡白視窗
zen-duplicate-tab-shortcut = 複製分頁
+zen-key-find-selection = 尋找選取文字
diff --git a/locales/zh-TW/browser/browser/zen-boosts.ftl b/locales/zh-TW/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..d9fefbb04
--- /dev/null
+++ b/locales/zh-TW/browser/browser/zen-boosts.ftl
@@ -0,0 +1,58 @@
+# 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/.
+
+zen-boost-edit-rename =
+ .label = 重新命名
+zen-boost-edit-shuffle =
+ .label = 換個感覺
+zen-boost-edit-reset =
+ .label = 回復原狀
+zen-boost-edit-delete =
+ .label = 刪除樣式
+zen-boost-size = 縮放
+zen-boost-case = 大小寫
+zen-boost-zap = Zap
+zen-boost-code = 樣式表
+zen-boost-back = 返回
+zen-boost-shuffle =
+ .tooltiptext = 重骰設定
+zen-boost-invert =
+ .tooltiptext = 反轉色調
+zen-boost-controls =
+ .tooltiptext = 色調進階調整
+zen-boost-disable =
+ .tooltiptext = 禁用色調變動
+zen-boost-text-case-toggle =
+ .tooltiptext = 切換文字大小寫
+zen-boost-css-picker =
+ .tooltiptext = 汲取選擇器
+zen-boost-css-inspector =
+ .tooltiptext = 開啟檢測器
+zen-bootst-color-contrast = 對比
+zen-bootst-color-brightness = 亮度
+zen-bootst-color-original-saturation = 飽和度
+zen-add-zap-helper = 選擇要 Zap的元素
+zen-remove-zap-helper = ← 按此取消zap
+zen-select-this = 加入此元素的選擇器
+zen-select-related = 加入關連元素的選擇器
+zen-select-cancel = 取消
+zen-zap-this = Zap
+zen-zap-related = Zap關連元素
+zen-zap-cancel = 取消
+zen-zap-done = 完成
+zen-unzap-tooltip =
+ { $elementCount ->
+ [0] 沒有被Zap的元素
+ [1] { $elementCount } 個元素已Zap
+ *[other] { $elementCount } 個元素已Zap
+ }
+zen-boost-save =
+ .label = 匯出 Boost
+zen-boost-load =
+ .label = 匯入 Boost
+zen-panel-ui-boosts-exported-message = Boost已匯出!
+zen-site-data-boosts = Boost
+zen-site-data-create-boost =
+ .tooltiptext = 建立新Boost
+zen-boost-rename-boost-prompt = 重新命名為?
diff --git a/locales/zh-TW/browser/browser/zen-general.ftl b/locales/zh-TW/browser/browser/zen-general.ftl
index 2f32fe5eb..99476e47b 100644
--- a/locales/zh-TW/browser/browser/zen-general.ftl
+++ b/locales/zh-TW/browser/browser/zen-general.ftl
@@ -45,9 +45,9 @@ zen-general-cancel-label =
zen-general-confirm =
.label = 確認
zen-pinned-tab-replaced = 釘選分頁網址已替換為當前網址!
-zen-tabs-renamed = 已成功重新命名分頁!
-zen-background-tab-opened-toast = 已在背景開啟新分頁!
-zen-workspace-renamed-toast = 已成功重新命名工作區!
+zen-tabs-renamed = 成功重新命名分頁!
+zen-background-tab-opened-toast = 新分頁已在背景開啟!
+zen-workspace-renamed-toast = 成功重新命名工作區!
zen-split-view-limit-toast = 無法加入更多分頁至分割畫面!
zen-toggle-compact-mode-button =
.label = 緊湊模式
@@ -122,4 +122,4 @@ zen-window-sync-migration-dialog-message = Zen現在能同步同裝置上的各
zen-window-sync-migration-dialog-learn-more = 了解更多
zen-window-sync-migration-dialog-accept = 明白了
zen-appmenu-new-blank-window =
- .label = 新簡白視窗
+ .label = 開新簡白視窗
From 89267dfea01466a78aa4d2229f0f2d1d3e57eaa5 Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Wed, 27 May 2026 08:45:30 +0200
Subject: [PATCH 28/31] no-bug: Add a `New Boost` urlbar action (gh-13884)
Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
---
src/zen/urlbar/ZenUBGlobalActions.sys.mjs | 43 +++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs
index 607b05ada..bfc789bb5 100644
--- a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs
+++ b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs
@@ -81,6 +81,49 @@ const globalActionsTemplate = [
return !tab.hasAttribute("zen-empty-tab") && tab.pinned;
},
},
+ {
+ label: "New Boost",
+ icon: "chrome://browser/skin/zen-icons/boost.svg",
+ isAvailable: window => {
+ if (!isNotEmptyTab(window)) {
+ return false;
+ }
+
+ // Keep this action consistent with the rest of the Boosts UI.
+ if (!Services.prefs.getBoolPref("zen.boosts.enabled", false)) {
+ return false;
+ }
+
+ const uri = window.gBrowser.currentURI;
+ return !!uri?.schemeIs && (uri.schemeIs("http") || uri.schemeIs("https"));
+ },
+ command: window => {
+ const uri = window.gBrowser.currentURI;
+ if (!uri?.schemeIs || !(uri.schemeIs("http") || uri.schemeIs("https"))) {
+ return;
+ }
+
+ let domain = "";
+ try {
+ domain = uri.host;
+ } catch {
+ return;
+ }
+
+ if (!domain) {
+ return;
+ }
+
+ const { gZenBoostsManager } = ChromeUtils.importESModule(
+ "resource:///modules/zen/boosts/ZenBoostsManager.sys.mjs"
+ );
+ const boost = gZenBoostsManager.createNewBoost(domain);
+ if (!boost) {
+ return;
+ }
+ gZenBoostsManager.openBoostWindow(window, boost, uri);
+ },
+ },
{
label: "Next Space",
command: "cmd_zenWorkspaceForward",
From 2fb59e2c824a7024d73612e5555da0cf70f71dee Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Wed, 27 May 2026 11:28:17 +0200
Subject: [PATCH 29/31] no-bug: New Crowdin updates (gh-13886)
---
locales/ca/browser/browser/preferences/zen-preferences.ftl | 4 ++--
locales/ca/browser/browser/zen-boosts.ftl | 6 +++---
locales/cs/browser/browser/preferences/zen-preferences.ftl | 4 ++--
.../es-ES/browser/browser/preferences/zen-preferences.ftl | 4 ++--
locales/es-ES/browser/browser/zen-boosts.ftl | 6 +++---
.../ga-IE/browser/browser/preferences/zen-preferences.ftl | 4 ++--
locales/ga-IE/browser/browser/zen-boosts.ftl | 6 +++---
locales/hu/browser/browser/zen-boosts.ftl | 4 ++--
.../sv-SE/browser/browser/preferences/zen-preferences.ftl | 4 ++--
locales/sv-SE/browser/browser/zen-boosts.ftl | 6 +++---
10 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/locales/ca/browser/browser/preferences/zen-preferences.ftl b/locales/ca/browser/browser/preferences/zen-preferences.ftl
index b7477fb97..853f16287 100644
--- a/locales/ca/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ca/browser/browser/preferences/zen-preferences.ftl
@@ -281,7 +281,7 @@ zen-workspace-shortcut-switch-9 = Canvia a l'espai de treball 9
zen-workspace-shortcut-switch-10 = Canvia a l'espai de treball 10
zen-workspace-shortcut-forward = Espai de treball següent
zen-workspace-shortcut-backward = Espai de treball anterior
-zen-workspace-shortcut-create = Create New Workspace
+zen-workspace-shortcut-create = Crea un nou espai de treball
zen-sidebar-shortcut-toggle = Commuta l'amplada de la barra lateral
zen-pinned-tab-shortcut-reset = Restableix la pestanya fixada a l'URL fixat
zen-split-view-shortcut-grid = Commuta la quadrícula de la vista dividida
@@ -319,4 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Commuta l'accessibilitat
zen-close-all-unpinned-tabs-shortcut = Tanca totes les pestanyes no fixades
zen-new-unsynced-window-shortcut = Nova finestra en blanc
zen-duplicate-tab-shortcut = Duplica la pestanya
-zen-key-find-selection = Find Selection
+zen-key-find-selection = Cerca la selecció
diff --git a/locales/ca/browser/browser/zen-boosts.ftl b/locales/ca/browser/browser/zen-boosts.ftl
index 877c5afb2..588c417b0 100644
--- a/locales/ca/browser/browser/zen-boosts.ftl
+++ b/locales/ca/browser/browser/zen-boosts.ftl
@@ -11,7 +11,7 @@ zen-boost-edit-reset =
zen-boost-edit-delete =
.label = Suprimeix la millora
zen-boost-size = Mida
-zen-boost-case = Case
+zen-boost-case = Cas
zen-boost-zap = Amaga
zen-boost-code = Codi
zen-boost-back = Enrere
@@ -48,9 +48,9 @@ zen-unzap-tooltip =
*[other] { $elementCount } elements amagats
}
zen-boost-save =
- .label = Export Boost
+ .label = Exporta la millora
zen-boost-load =
- .label = Import Boost
+ .label = Importa la millora
zen-panel-ui-boosts-exported-message = S'ha exportat la millora!
zen-site-data-boosts = Millores
zen-site-data-create-boost =
diff --git a/locales/cs/browser/browser/preferences/zen-preferences.ftl b/locales/cs/browser/browser/preferences/zen-preferences.ftl
index 97baced60..b0194f747 100644
--- a/locales/cs/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/cs/browser/browser/preferences/zen-preferences.ftl
@@ -281,7 +281,7 @@ zen-workspace-shortcut-switch-9 = Přepnout na pracovní prostor 9
zen-workspace-shortcut-switch-10 = Přepnout do pracovního prostoru 10
zen-workspace-shortcut-forward = Přeposlat pracovní prostor
zen-workspace-shortcut-backward = Zpětný pracovní prostor
-zen-workspace-shortcut-create = Create New Workspace
+zen-workspace-shortcut-create = Nový Workspace
zen-sidebar-shortcut-toggle = Přepnout šířku postranního panelu
zen-pinned-tab-shortcut-reset = Obnovit připnuté záložky na připnuté URL
zen-split-view-shortcut-grid = Přepnout rozdělený pohled v mřížce
@@ -319,4 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Přepnout přístupnost
zen-close-all-unpinned-tabs-shortcut = Zavřít všechny nepřipnuté panely
zen-new-unsynced-window-shortcut = Nové nesynchronizované okno
zen-duplicate-tab-shortcut = Duplikovat panel
-zen-key-find-selection = Find Selection
+zen-key-find-selection = Najít Část
diff --git a/locales/es-ES/browser/browser/preferences/zen-preferences.ftl b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
index ac75637f5..305e2f0b6 100644
--- a/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
@@ -281,7 +281,7 @@ zen-workspace-shortcut-switch-9 = Cambiar a espacio de trabajo 9
zen-workspace-shortcut-switch-10 = Cambiar a espacio de trabajo 10
zen-workspace-shortcut-forward = Espacio de trabajo siguiente
zen-workspace-shortcut-backward = Espacio de trabajo anterior
-zen-workspace-shortcut-create = Create New Workspace
+zen-workspace-shortcut-create = Crear nuevo espacio de trabajo
zen-sidebar-shortcut-toggle = Cambiar el ancho de la barra lateral
zen-pinned-tab-shortcut-reset = Restablecer pestaña fijada a la URL fijada
zen-split-view-shortcut-grid = Cambiar a vista dividida en cuadrícula
@@ -319,4 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Alternar accesibilidad
zen-close-all-unpinned-tabs-shortcut = Cerrar todas las pestañas sin fijar
zen-new-unsynced-window-shortcut = Nueva ventana no sincronizada
zen-duplicate-tab-shortcut = Duplicar pestaña
-zen-key-find-selection = Find Selection
+zen-key-find-selection = Encontrar selección
diff --git a/locales/es-ES/browser/browser/zen-boosts.ftl b/locales/es-ES/browser/browser/zen-boosts.ftl
index dfb4cdbd4..3af79691b 100644
--- a/locales/es-ES/browser/browser/zen-boosts.ftl
+++ b/locales/es-ES/browser/browser/zen-boosts.ftl
@@ -11,7 +11,7 @@ zen-boost-edit-reset =
zen-boost-edit-delete =
.label = Borrar Boost
zen-boost-size = Tamaño
-zen-boost-case = Case
+zen-boost-case = Formato
zen-boost-zap = Borrar
zen-boost-code = Código
zen-boost-back = Atrás
@@ -48,9 +48,9 @@ zen-unzap-tooltip =
*[other] { $elementCount } elementos borrados
}
zen-boost-save =
- .label = Export Boost
+ .label = Exportar Boost
zen-boost-load =
- .label = Import Boost
+ .label = Importar Boost
zen-panel-ui-boosts-exported-message = ¡Boost exportado!
zen-site-data-boosts = Boosts
zen-site-data-create-boost =
diff --git a/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl b/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
index 45215b2fa..e370988ce 100644
--- a/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
@@ -281,7 +281,7 @@ zen-workspace-shortcut-switch-9 = Athraigh go Spás Oibre 9
zen-workspace-shortcut-switch-10 = Athraigh go Spás Oibre 10
zen-workspace-shortcut-forward = Spás Oibre Ar Aghaidh
zen-workspace-shortcut-backward = Spás Oibre Ar Ais
-zen-workspace-shortcut-create = Create New Workspace
+zen-workspace-shortcut-create = Cruthaigh Spás Oibre Nua
zen-sidebar-shortcut-toggle = Leithead an Bharra Taoibh a Scoránaigh
zen-pinned-tab-shortcut-reset = Athshocraigh an Cluaisín Prionáilte go dtí an URL Prionáilte
zen-split-view-shortcut-grid = Eangach Radharc Scoilte a Athsholáthar
@@ -319,4 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Scoránaigh Inrochtaineacht
zen-close-all-unpinned-tabs-shortcut = Dún Gach Cluaisín Gan Phionáil
zen-new-unsynced-window-shortcut = Fuinneog Nua Neamhshioncrónaithe
zen-duplicate-tab-shortcut = Cluaisín Dúblach
-zen-key-find-selection = Find Selection
+zen-key-find-selection = Aimsigh Rogha
diff --git a/locales/ga-IE/browser/browser/zen-boosts.ftl b/locales/ga-IE/browser/browser/zen-boosts.ftl
index ecf56e102..2491bae48 100644
--- a/locales/ga-IE/browser/browser/zen-boosts.ftl
+++ b/locales/ga-IE/browser/browser/zen-boosts.ftl
@@ -11,7 +11,7 @@ zen-boost-edit-reset =
zen-boost-edit-delete =
.label = Scrios an Treisiú
zen-boost-size = Méid
-zen-boost-case = Case
+zen-boost-case = Cás
zen-boost-zap = Zapáil
zen-boost-code = Cód
zen-boost-back = Ar ais
@@ -48,9 +48,9 @@ zen-unzap-tooltip =
*[other] { $elementCount } eilimintí Zapáilte
}
zen-boost-save =
- .label = Export Boost
+ .label = Borradh Easpórtála
zen-boost-load =
- .label = Import Boost
+ .label = Borradh Iompórtála
zen-panel-ui-boosts-exported-message = Borradh easpórtáilte!
zen-site-data-boosts = Borradh
zen-site-data-create-boost =
diff --git a/locales/hu/browser/browser/zen-boosts.ftl b/locales/hu/browser/browser/zen-boosts.ftl
index 2cdbb4a75..0437ff86a 100644
--- a/locales/hu/browser/browser/zen-boosts.ftl
+++ b/locales/hu/browser/browser/zen-boosts.ftl
@@ -48,9 +48,9 @@ zen-unzap-tooltip =
*[other] { $elementCount } elements zapped
}
zen-boost-save =
- .label = Export Boost
+ .label = Boost exportálása
zen-boost-load =
- .label = Import Boost
+ .label = Boost importálása
zen-panel-ui-boosts-exported-message = Boostok exportálva!
zen-site-data-boosts = Boostok
zen-site-data-create-boost =
diff --git a/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl b/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
index 9a144f5b0..fca5ef3b3 100644
--- a/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
@@ -281,7 +281,7 @@ zen-workspace-shortcut-switch-9 = Växla till arbetsyta 9
zen-workspace-shortcut-switch-10 = Växla till arbetsyta 10
zen-workspace-shortcut-forward = Vidarebefordra arbetsyta
zen-workspace-shortcut-backward = Bakåt arbetsyta
-zen-workspace-shortcut-create = Create New Workspace
+zen-workspace-shortcut-create = Skapa ny arbetsyta
zen-sidebar-shortcut-toggle = Växla sidofältets bredd
zen-pinned-tab-shortcut-reset = Återställ Fäst flik till Pinned URL
zen-split-view-shortcut-grid = Växla delad vy rutnät
@@ -319,4 +319,4 @@ zen-devtools-toggle-accessibility-shortcut = Växla tillgänglighetsinställning
zen-close-all-unpinned-tabs-shortcut = Stäng alla flikar som inte är fästa
zen-new-unsynced-window-shortcut = Nytt tomt fönster
zen-duplicate-tab-shortcut = Duplicera flik
-zen-key-find-selection = Find Selection
+zen-key-find-selection = Hitta val
diff --git a/locales/sv-SE/browser/browser/zen-boosts.ftl b/locales/sv-SE/browser/browser/zen-boosts.ftl
index e784c0f25..c010d0a98 100644
--- a/locales/sv-SE/browser/browser/zen-boosts.ftl
+++ b/locales/sv-SE/browser/browser/zen-boosts.ftl
@@ -11,7 +11,7 @@ zen-boost-edit-reset =
zen-boost-edit-delete =
.label = Ta bort förändring
zen-boost-size = Storlek
-zen-boost-case = Case
+zen-boost-case = Fall
zen-boost-zap = Zappa
zen-boost-code = Kod
zen-boost-back = Tillbaka
@@ -48,9 +48,9 @@ zen-unzap-tooltip =
*[other] { $elementCount } flera element zappade
}
zen-boost-save =
- .label = Export Boost
+ .label = Exportera förändring
zen-boost-load =
- .label = Import Boost
+ .label = Importera förändring
zen-panel-ui-boosts-exported-message = Förändring exporterad!
zen-site-data-boosts = Förändringar
zen-site-data-create-boost =
From 8a0a6cbede134bd54aa809441c96817fd360c9dc Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Wed, 27 May 2026 13:39:22 +0200
Subject: [PATCH 30/31] gh-13844: Part 3 - Fixed text inputs not being filtered
through boosts (gh-13893)
---
src/image/AutoRestoreSVGState-h.patch | 14 ++++
src/layout/base/nsPresContext-h.patch | 39 +++++++++
src/layout/painting/nsImageRenderer-cpp.patch | 13 ++-
src/layout/svg/SVGImageContext-cpp.patch | 41 +++++++++-
src/layout/svg/SVGImageContext-h.patch | 80 +++++++++++++++++++
src/widget/Theme-cpp.patch | 56 +++++++++++++
src/widget/Theme-h.patch | 19 +++++
src/zen/boosts/nsZenBoostsBackend.cpp | 38 +++++----
8 files changed, 280 insertions(+), 20 deletions(-)
create mode 100644 src/image/AutoRestoreSVGState-h.patch
create mode 100644 src/layout/base/nsPresContext-h.patch
create mode 100644 src/layout/svg/SVGImageContext-h.patch
create mode 100644 src/widget/Theme-cpp.patch
create mode 100644 src/widget/Theme-h.patch
diff --git a/src/image/AutoRestoreSVGState-h.patch b/src/image/AutoRestoreSVGState-h.patch
new file mode 100644
index 000000000..bd6502135
--- /dev/null
+++ b/src/image/AutoRestoreSVGState-h.patch
@@ -0,0 +1,14 @@
+diff --git a/image/AutoRestoreSVGState.h b/image/AutoRestoreSVGState.h
+index be639a7b78c13c2d56be49a9690bf711ccaf0a8f..28bea58034ead1206d77521934e92d3a69bfd84b 100644
+--- a/image/AutoRestoreSVGState.h
++++ b/image/AutoRestoreSVGState.h
+@@ -47,6 +47,9 @@ class MOZ_STACK_CLASS AutoRestoreSVGState final {
+ }
+ return dom::PrefersColorSchemeOverride::None;
+ }());
++ pc->SetZenBoostsOverride(aSVGContext.GetZenBoostsAccent(),
++ aSVGContext.GetZenBoostsComplementaryRotation(),
++ aSVGContext.GetZenBoostsInverted());
+ }
+
+ aSVGDocumentWrapper->mIsDrawing = true;
diff --git a/src/layout/base/nsPresContext-h.patch b/src/layout/base/nsPresContext-h.patch
new file mode 100644
index 000000000..f408114e4
--- /dev/null
+++ b/src/layout/base/nsPresContext-h.patch
@@ -0,0 +1,39 @@
+diff --git a/layout/base/nsPresContext.h b/layout/base/nsPresContext.h
+index 13aa7141c8e5297d0dd6aa9bd78fd32f050e8123..149a89e928d354f116c54f71605830f5ec6b7f8a 100644
+--- a/layout/base/nsPresContext.h
++++ b/layout/base/nsPresContext.h
+@@ -594,6 +594,22 @@ class nsPresContext : public nsISupports,
+ */
+ void SetColorSchemeOverride(mozilla::dom::PrefersColorSchemeOverride);
+
++ // Zen boosts override. SVG images render in their own document, which has no
++ // BrowsingContext to carry the page's boost, so the host propagates it here.
++ void SetZenBoostsOverride(nscolor aAccent, float aComplementaryRotation,
++ bool aInverted) {
++ mZenBoostsOverrideAccent = aAccent;
++ mZenBoostsOverrideComplementaryRotation = aComplementaryRotation;
++ mZenBoostsOverrideInverted = aInverted;
++ mHasZenBoostsOverride = true;
++ }
++ bool HasZenBoostsOverride() const { return mHasZenBoostsOverride; }
++ nscolor ZenBoostsOverrideAccent() const { return mZenBoostsOverrideAccent; }
++ float ZenBoostsOverrideComplementaryRotation() const {
++ return mZenBoostsOverrideComplementaryRotation;
++ }
++ bool ZenBoostsOverrideInverted() const { return mZenBoostsOverrideInverted; }
++
+ /**
+ * Return the device's screen size in inches, for font size
+ * inflation.
+@@ -1441,6 +1457,11 @@ class nsPresContext : public nsISupports,
+ mozilla::dom::PrefersColorSchemeOverride mOverriddenOrEmbedderColorScheme;
+ mozilla::StyleForcedColors mForcedColors;
+
++ nscolor mZenBoostsOverrideAccent = 0;
++ float mZenBoostsOverrideComplementaryRotation = 0.0f;
++ bool mZenBoostsOverrideInverted = false;
++ bool mHasZenBoostsOverride = false;
++
+ protected:
+ virtual ~nsPresContext();
+
diff --git a/src/layout/painting/nsImageRenderer-cpp.patch b/src/layout/painting/nsImageRenderer-cpp.patch
index 574f1c0f6..6323f3471 100644
--- a/src/layout/painting/nsImageRenderer-cpp.patch
+++ b/src/layout/painting/nsImageRenderer-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/layout/painting/nsImageRenderer.cpp b/layout/painting/nsImageRenderer.cpp
-index 4acb7670e971024f9c63e48ff711bbdd1dc02301..9ac1ae1b66eb6fb10195cd3709e0e29d8d53b574 100644
+index 4acb7670e971024f9c63e48ff711bbdd1dc02301..518543f29f396d819a71edb984879de22f8434a8 100644
--- a/layout/painting/nsImageRenderer.cpp
+++ b/layout/painting/nsImageRenderer.cpp
@@ -90,7 +90,7 @@ static already_AddRefed GetSymbolicIconImage(nsAtom* aName,
@@ -29,7 +29,16 @@ index 4acb7670e971024f9c63e48ff711bbdd1dc02301..9ac1ae1b66eb6fb10195cd3709e0e29d
renderer.BuildWebRenderDisplayItems(aBuilder, aSc, aDest, aFill,
aRepeatSize, aSrc,
-@@ -1076,7 +1076,7 @@ ImgDrawResult nsImageRenderer::DrawShapeImage(nsPresContext* aPresContext,
+@@ -670,6 +670,8 @@ ImgDrawResult nsImageRenderer::BuildWebRenderDisplayItems(
+ nsPresContext::AppUnitsToIntCSSPixels(aDest.height)};
+
+ SVGImageContext svgContext(Some(destCSSSize));
++ SVGImageContext::MaybeStoreZenBoosts(svgContext,
++ *mForFrame->PresContext());
+ Maybe region;
+
+ const int32_t appUnitsPerDevPixel =
+@@ -1076,7 +1078,7 @@ ImgDrawResult nsImageRenderer::DrawShapeImage(nsPresContext* aPresContext,
if (mImage->IsGradient()) {
nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(
diff --git a/src/layout/svg/SVGImageContext-cpp.patch b/src/layout/svg/SVGImageContext-cpp.patch
index e14b964cd..4e8258689 100644
--- a/src/layout/svg/SVGImageContext-cpp.patch
+++ b/src/layout/svg/SVGImageContext-cpp.patch
@@ -1,8 +1,45 @@
diff --git a/layout/svg/SVGImageContext.cpp b/layout/svg/SVGImageContext.cpp
-index ecbda963b75fb70b62885a0c8f7a517011a8d5dc..1200a51aee7db4ee1a014308581ada1002c0d05f 100644
+index ecbda963b75fb70b62885a0c8f7a517011a8d5dc..5f55f0a4174db830656d434b5295835ab18e6619 100644
--- a/layout/svg/SVGImageContext.cpp
+++ b/layout/svg/SVGImageContext.cpp
-@@ -57,12 +57,14 @@ void SVGImageContext::MaybeStoreContextPaint(SVGImageContext& aContext,
+@@ -10,6 +10,7 @@
+ #include "mozilla/LookAndFeel.h"
+ #include "mozilla/ServoCSSParser.h"
+ #include "mozilla/StaticPrefs_svg.h"
++#include "mozilla/dom/BrowsingContext.h"
+ #include "mozilla/dom/Document.h"
+ #include "nsIFrame.h"
+ #include "nsISVGPaintContext.h"
+@@ -18,6 +19,19 @@
+
+ namespace mozilla {
+
++/* static */
++void SVGImageContext::MaybeStoreZenBoosts(SVGImageContext& aContext,
++ const nsPresContext& aPresContext) {
++ if (dom::Document* doc = aPresContext.Document()) {
++ if (dom::BrowsingContext* bc = doc->GetBrowsingContext()) {
++ bc = bc->Top();
++ aContext.SetZenBoosts(bc->ZenBoostsData(),
++ bc->ZenBoostsComplementaryRotation(),
++ bc->IsZenBoostsInverted());
++ }
++ }
++}
++
+ /* static */
+ void SVGImageContext::MaybeStoreContextPaint(SVGImageContext& aContext,
+ nsIFrame* aFromFrame,
+@@ -43,6 +57,8 @@ void SVGImageContext::MaybeStoreContextPaint(SVGImageContext& aContext,
+ aContext.SetColorScheme(Some(scheme));
+ }
+
++ MaybeStoreZenBoosts(aContext, aPresContext);
++
+ const nsStyleSVG* style = aStyle.StyleSVG();
+ if (!style->ExposesContextProperties()) {
+ // Content must have '-moz-context-properties' set to the names of the
+@@ -57,12 +73,14 @@ void SVGImageContext::MaybeStoreContextPaint(SVGImageContext& aContext,
if ((style->mMozContextProperties.bits & StyleContextPropertyBits::FILL) &&
style->mFill.kind.IsColor()) {
haveContextPaint = true;
diff --git a/src/layout/svg/SVGImageContext-h.patch b/src/layout/svg/SVGImageContext-h.patch
new file mode 100644
index 000000000..c0cff0a5d
--- /dev/null
+++ b/src/layout/svg/SVGImageContext-h.patch
@@ -0,0 +1,80 @@
+diff --git a/layout/svg/SVGImageContext.h b/layout/svg/SVGImageContext.h
+index 159d9cbbd0711076ee6c2a71a3da04bd92a0102c..daefc40590c4d7d7fac9db25c6ec4ba2424dded5 100644
+--- a/layout/svg/SVGImageContext.h
++++ b/layout/svg/SVGImageContext.h
+@@ -6,6 +6,7 @@
+ #define LAYOUT_SVG_SVGIMAGECONTEXT_H_
+
+ #include "Units.h"
++#include "nsColor.h"
+ #include "mozilla/Maybe.h"
+ #include "mozilla/SVGContextPaint.h"
+ #include "mozilla/SVGPreserveAspectRatio.h"
+@@ -63,6 +64,11 @@ class SVGImageContext {
+ nsISVGPaintContext* aPaintContext,
+ imgIContainer* aImgContainer);
+
++ // Carry the host document's Zen boost into the image context so the image
++ // renders with the same accent/inversion as the page.
++ static void MaybeStoreZenBoosts(SVGImageContext& aContext,
++ const nsPresContext& aPresContext);
++
+ const Maybe& GetViewportSize() const { return mViewportSize; }
+
+ void SetViewportSize(const Maybe& aSize) {
+@@ -75,6 +81,21 @@ class SVGImageContext {
+ mColorScheme = aScheme;
+ }
+
++ // Zen boosts state carried from the host document so the image renders with
++ // the same boost. Part of the cache key below so boosted and unboosted
++ // renderings don't collide.
++ void SetZenBoosts(nscolor aAccent, float aComplementaryRotation,
++ bool aInverted) {
++ mZenBoostsAccent = aAccent;
++ mZenBoostsComplementaryRotation = aComplementaryRotation;
++ mZenBoostsInverted = aInverted;
++ }
++ nscolor GetZenBoostsAccent() const { return mZenBoostsAccent; }
++ float GetZenBoostsComplementaryRotation() const {
++ return mZenBoostsComplementaryRotation;
++ }
++ bool GetZenBoostsInverted() const { return mZenBoostsInverted; }
++
+ const Maybe& GetPreserveAspectRatio() const {
+ return mPreserveAspectRatio;
+ }
+@@ -107,7 +128,11 @@ class SVGImageContext {
+
+ return contextPaintIsEqual && mViewportSize == aOther.mViewportSize &&
+ mPreserveAspectRatio == aOther.mPreserveAspectRatio &&
+- mColorScheme == aOther.mColorScheme;
++ mColorScheme == aOther.mColorScheme &&
++ mZenBoostsAccent == aOther.mZenBoostsAccent &&
++ mZenBoostsComplementaryRotation ==
++ aOther.mZenBoostsComplementaryRotation &&
++ mZenBoostsInverted == aOther.mZenBoostsInverted;
+ }
+
+ bool operator!=(const SVGImageContext&) const = default;
+@@ -119,7 +144,9 @@ class SVGImageContext {
+ }
+ return HashGeneric(hash, mViewportSize.map(HashSize).valueOr(0),
+ mPreserveAspectRatio.map(HashPAR).valueOr(0),
+- mColorScheme.map(HashColorScheme).valueOr(0));
++ mColorScheme.map(HashColorScheme).valueOr(0),
++ mZenBoostsAccent, mZenBoostsComplementaryRotation,
++ mZenBoostsInverted);
+ }
+
+ private:
+@@ -138,6 +165,9 @@ class SVGImageContext {
+ Maybe mViewportSize;
+ Maybe mPreserveAspectRatio;
+ Maybe mColorScheme;
++ nscolor mZenBoostsAccent = 0;
++ float mZenBoostsComplementaryRotation = 0.0f;
++ bool mZenBoostsInverted = false;
+ };
+
+ } // namespace mozilla
diff --git a/src/widget/Theme-cpp.patch b/src/widget/Theme-cpp.patch
new file mode 100644
index 000000000..1b88b2c75
--- /dev/null
+++ b/src/widget/Theme-cpp.patch
@@ -0,0 +1,56 @@
+diff --git a/widget/Theme.cpp b/widget/Theme.cpp
+index 766a8ca4bc6fcc98f719ad4f472b20bc1d198ac9..be4419cfafb55e5cac8f5de741185ee3cabc4722 100644
+--- a/widget/Theme.cpp
++++ b/widget/Theme.cpp
+@@ -18,6 +18,7 @@
+ #include "mozilla/RelativeLuminanceUtils.h"
+ #include "mozilla/ScrollContainerFrame.h"
+ #include "mozilla/StaticPrefs_widget.h"
++#include "mozilla/nsZenBoostsBackend.h"
+ #include "mozilla/webrender/WebRenderAPI.h"
+ #include "nsCSSColorUtils.h"
+ #include "nsCSSRendering.h"
+@@ -670,10 +671,15 @@ template
+ void Theme::PaintTextField(PaintBackendData& aPaintData,
+ const LayoutDeviceRect& aRect,
+ const ElementState& aState, const Colors& aColors,
+- DPIRatio aDpiRatio) {
++ DPIRatio aDpiRatio, const nsIFrame* aFrame) {
+ auto [backgroundColor, borderColor] =
+ ComputeTextfieldColors(aState, aColors, OutlineCoversBorder::Yes);
+
++ // The default field background comes from a theme/system color rather than a
++ // resolved style color, so apply Zen boosts here to match boosted content.
++ backgroundColor = sRGBColor::FromABGR(zen::nsZenBoostsBackend::ResolveStyleColor(
++ backgroundColor.ToABGR(), aFrame));
++
+ const CSSCoord radius = 2.0f;
+
+ ThemeDrawing::PaintRoundedRectWithRadius(aPaintData, aRect, backgroundColor,
+@@ -690,9 +696,9 @@ template
+ void Theme::PaintListbox(PaintBackendData& aPaintData,
+ const LayoutDeviceRect& aRect,
+ const ElementState& aState, const Colors& aColors,
+- DPIRatio aDpiRatio) {
++ DPIRatio aDpiRatio, const nsIFrame* aFrame) {
+ // We happen to share style between text fields and list boxes.
+- return PaintTextField(aPaintData, aRect, aState, aColors, aDpiRatio);
++ return PaintTextField(aPaintData, aRect, aState, aColors, aDpiRatio, aFrame);
+ }
+
+ template
+@@ -1158,10 +1164,12 @@ bool Theme::DoDrawWidgetBackground(PaintBackendData& aPaintData,
+ case StyleAppearance::Textfield:
+ case StyleAppearance::NumberInput:
+ case StyleAppearance::PasswordInput:
+- PaintTextField(aPaintData, devPxRect, elementState, colors, dpiRatio);
++ PaintTextField(aPaintData, devPxRect, elementState, colors, dpiRatio,
++ aFrame);
+ break;
+ case StyleAppearance::Listbox:
+- PaintListbox(aPaintData, devPxRect, elementState, colors, dpiRatio);
++ PaintListbox(aPaintData, devPxRect, elementState, colors, dpiRatio,
++ aFrame);
+ break;
+ case StyleAppearance::Menulist:
+ PaintMenulist(aPaintData, devPxRect, elementState, colors, dpiRatio);
diff --git a/src/widget/Theme-h.patch b/src/widget/Theme-h.patch
new file mode 100644
index 000000000..e7aad5d42
--- /dev/null
+++ b/src/widget/Theme-h.patch
@@ -0,0 +1,19 @@
+diff --git a/widget/Theme.h b/widget/Theme.h
+index 4e0acbb25b9e39b712a2d96d8dee366dfdce4a01..9aa377ca9f0d7f96d938339d198b797ceebbc602 100644
+--- a/widget/Theme.h
++++ b/widget/Theme.h
+@@ -161,10 +161,12 @@ class Theme : protected nsNativeTheme, public nsITheme {
+ const ElementState&, DPIRatio);
+ template
+ void PaintTextField(PaintBackendData&, const LayoutDeviceRect&,
+- const ElementState&, const Colors&, DPIRatio);
++ const ElementState&, const Colors&, DPIRatio,
++ const nsIFrame*);
+ template
+ void PaintListbox(PaintBackendData&, const LayoutDeviceRect&,
+- const ElementState&, const Colors&, DPIRatio);
++ const ElementState&, const Colors&, DPIRatio,
++ const nsIFrame*);
+ template
+ void PaintMenulist(PaintBackendData&, const LayoutDeviceRect&,
+ const ElementState&, const Colors&, DPIRatio);
diff --git a/src/zen/boosts/nsZenBoostsBackend.cpp b/src/zen/boosts/nsZenBoostsBackend.cpp
index f9eaf6461..6a64cd724 100644
--- a/src/zen/boosts/nsZenBoostsBackend.cpp
+++ b/src/zen/boosts/nsZenBoostsBackend.cpp
@@ -386,8 +386,9 @@ inline static nscolor zenInvertColorChannel(nscolor aColor) {
* not touch (devtools highlighters, screenshots, the boosts overlays
* themselves, and other native-anonymous UI such as scrollbars). A null frame
* gives no document to anchor the boost on, so it is treated the same way.
- * CSS generated content (::before/::after/::marker/::backdrop) is
- * native-anonymous too but is author content, so it is not exempt.
+ * Author-facing content that happens to be native-anonymous is not exempt:
+ * UA-widget form-control internals (including the text the user types into an
+ * input), and pseudo-elements such as ::before/::after/::marker/::placeholder.
*/
ZEN_HOT_FUNCTION
inline static bool IsBoostExemptFrame(const nsIFrame* aFrame) {
@@ -398,21 +399,17 @@ inline static bool IsBoostExemptFrame(const nsIFrame* aFrame) {
if (!content || !content->IsInNativeAnonymousSubtree()) {
return false;
}
- if (const nsIContent* root =
- content->GetClosestNativeAnonymousSubtreeRoot()) {
- if (root->IsElement()) {
- switch (root->AsElement()->GetPseudoElementType()) {
- case mozilla::PseudoStyleType::Before:
- case mozilla::PseudoStyleType::After:
- case mozilla::PseudoStyleType::Marker:
- case mozilla::PseudoStyleType::Backdrop:
- return false;
- default:
- break;
- }
- }
+ // Form-control internals (and media controls) live in UA-widget shadow
+ // trees; the text typed into an input is author content and should be
+ // boosted. Classic native-anonymous UI (scrollbars, devtools) has no
+ // containing shadow and falls through to the pseudo-element check below.
+ if (content->GetContainingShadow()) {
+ return false;
}
- return true;
+ const nsIContent* root = content->GetClosestNativeAnonymousSubtreeRoot();
+ return !root || !root->IsElement() ||
+ !mozilla::PseudoStyle::IsPseudoElement(
+ root->AsElement()->GetPseudoElementType());
}
/**
@@ -429,6 +426,15 @@ inline static void GetZenBoostsDataForFrame(const nsIFrame* aFrame,
if (!presContext) {
return;
}
+ // SVG images render in their own document with no BrowsingContext; the host
+ // propagates its boost onto the image document's PresContext instead.
+ if (presContext->HasZenBoostsOverride()) {
+ *aData = presContext->ZenBoostsOverrideAccent();
+ *aComplementaryRotation =
+ presContext->ZenBoostsOverrideComplementaryRotation();
+ *aIsInverted = presContext->ZenBoostsOverrideInverted();
+ return;
+ }
const mozilla::dom::BrowsingContext* browsingContext = nullptr;
if (auto document = presContext->Document()) {
browsingContext = document->GetBrowsingContext();
From 5bbbadd77be956deaf91633cd4f0611403b0ba53 Mon Sep 17 00:00:00 2001
From: arieleli01212
Date: Wed, 27 May 2026 17:24:28 +0300
Subject: [PATCH 31/31] gh-13857: Use Zen icon for share toolbar button
(gh-13896)
Fixes #13857.
This updates the toolbar share button to use Zen's shared icon set
instead of the upstream Firefox asset. The downloads button already
points at the Zen icon set, so this keeps the two toolbar icons visually
consistent.
Validation:
- Checked that `share-tab-button` is the Firefox toolbar share button
id.
- Confirmed the repo lint script requires the generated `engine`
checkout, which is not present in this clone.
Co-authored-by: arieleli01212 <207917221+arieleli01212@users.noreply.github.com>
---
src/browser/themes/shared/zen-icons/icons.css | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css
index cb1b6f892..ed143a42b 100644
--- a/src/browser/themes/shared/zen-icons/icons.css
+++ b/src/browser/themes/shared/zen-icons/icons.css
@@ -435,6 +435,7 @@
}
#zen-copy-current-url-button,
+#share-tab-button,
#zen-site-data-header-share {
list-style-image: url("share.svg");
}