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/README.md b/README.md
index b79094c20..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 `150.0.3`! 🚀
-- [`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.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 0439d0657..7bcc95dc3 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
+05272df13c2e4f435b4e0a706715f302b09ef829
\ No newline at end of file
diff --git a/configs/macos/mozconfig b/configs/macos/mozconfig
index 4b2e503ea..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.4.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
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..853f16287 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 = 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
@@ -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 = Cerca la selecció
diff --git a/locales/ca/browser/browser/zen-boosts.ftl b/locales/ca/browser/browser/zen-boosts.ftl
new file mode 100644
index 000000000..588c417b0
--- /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 = Cas
+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 = Exporta la millora
+zen-boost-load =
+ .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 =
+ .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..b0194f747 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 = 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
@@ -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 = Najít Část
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/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/locales/es-ES/browser/browser/preferences/zen-preferences.ftl b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
index 7e81a58a4..305e2f0b6 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 = 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
@@ -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 = Encontrar selección
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..3af79691b
--- /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 = Formato
+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 = 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 = 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..e370988ce 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 = 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
@@ -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 = Aimsigh Rogha
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..2491bae48
--- /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 = Cás
+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 = Borradh Easpórtála
+zen-boost-load =
+ .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 =
+ .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..0437ff86a
--- /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 = Boost exportálása
+zen-boost-load =
+ .label = Boost importálása
+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..fca5ef3b3 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 = 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
@@ -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 = Hitta val
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..c010d0a98
--- /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 = Fall
+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 = Exportera förändring
+zen-boost-load =
+ .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 =
+ .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 = 開新簡白視窗
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/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
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/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/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/prefs/zen/view.yaml b/prefs/zen/view.yaml
index 5a94673a4..69066e600 100644
--- a/prefs/zen/view.yaml
+++ b/prefs/zen/view.yaml
@@ -59,10 +59,10 @@
value: true
- name: zen.view.overflow-webext-toolbar
- value: "@IS_TWILIGHT@"
+ value: true
- name: zen.view.overflow-webext-toolbar-threshold
- value: 50
+ value: 55
- name: zen.view.enable-loading-indicator
value: true
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/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/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js
index 16ddcbc63..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",
@@ -1124,7 +1126,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/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/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/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css
index f265d890d..0c45bc216 100644
--- a/src/browser/themes/shared/zen-icons/icons.css
+++ b/src/browser/themes/shared/zen-icons/icons.css
@@ -436,6 +436,7 @@
}
#zen-copy-current-url-button,
+#share-tab-button,
#zen-site-data-header-share {
list-style-image: url("share.svg");
}
@@ -925,7 +926,7 @@
position: relative;
- list-style-image: url("paintbrush.svg");
+ list-style-image: url("boost.svg");
& .toolbarbutton-text {
display: none;
@@ -938,6 +939,8 @@
& image {
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
+ width: 14px;
+ fill-opacity: 0.7;
}
}
@@ -1067,7 +1070,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 431db3c6f..243cb317a 100644
--- a/src/browser/themes/shared/zen-icons/jar.inc.mn
+++ b/src/browser/themes/shared/zen-icons/jar.inc.mn
@@ -13,6 +13,7 @@
* 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/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
@@ -37,6 +38,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 +104,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,6 +163,7 @@
* 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/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
@@ -185,6 +188,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 +254,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,6 +313,7 @@
* 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/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
@@ -333,6 +338,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 +404,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)
@@ -456,8 +462,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)
@@ -519,8 +525,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/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/layers/AnimationInfo-cpp.patch b/src/gfx/layers/AnimationInfo-cpp.patch
index e9779a101..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..ef112715580b6bb7238e8f37bbe3133e187685dc 100644
+index 1d330056bd7a4e89aac5e5296a3c164fb42b5c42..629fbdd748310c31aeb16b0a8d8e862a99314cc9 100644
--- a/gfx/layers/AnimationInfo.cpp
+++ b/gfx/layers/AnimationInfo.cpp
@@ -14,6 +14,7 @@
@@ -10,12 +10,20 @@ index 1d330056bd7a4e89aac5e5296a3c164fb42b5c42..ef112715580b6bb7238e8f37bbe3133e
#include "nsIContent.h"
#include "nsLayoutUtils.h"
#include "nsRefreshDriver.h"
-@@ -343,7 +344,7 @@ 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);
-+ aAnimatable = zen::nsZenBoostsBackend::FilterColorFromPresContext(aAnimationValue.GetColor(foreground), aFrame->PresContext());
++ nscolor foreground = aFrame->Style()->GetVisitedDependentColor(
++ &nsStyleText::mColor, nullptr);
++ nscolor resolved = aAnimationValue.GetColor(foreground);
++ aAnimatable = aAnimationValue.IsCurrentColor()
++ ? resolved
++ : zen::nsZenBoostsBackend::ResolveStyleColor(resolved,
++ aFrame);
break;
}
case eCSSProperty_opacity:
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/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/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/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/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/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/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/painting/nsImageRenderer-cpp.patch b/src/layout/painting/nsImageRenderer-cpp.patch
new file mode 100644
index 000000000..6323f3471
--- /dev/null
+++ b/src/layout/painting/nsImageRenderer-cpp.patch
@@ -0,0 +1,49 @@
+diff --git a/layout/painting/nsImageRenderer.cpp b/layout/painting/nsImageRenderer.cpp
+index 4acb7670e971024f9c63e48ff711bbdd1dc02301..518543f29f396d819a71edb984879de22f8434a8 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,
+@@ -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(
+- 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/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/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 6f84f6327..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..8dbfbb846b786d51af288989163aacfae12e787c 100644
+index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..85a48f27251756c72db8ed03a673a18e96cf76f9 100644
--- a/layout/style/StyleColor.cpp
+++ b/layout/style/StyleColor.cpp
@@ -8,6 +8,7 @@
@@ -10,25 +10,46 @@ 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(
- }
+@@ -34,23 +35,24 @@ StyleAbsoluteColor StyleColor::ResolveColor(
- return Servo_ResolveColor(this, &aForegroundColor);
-+ };
-+ return zen::nsZenBoostsBackend::ResolveStyleColor(ResolveColorInner());
+ template <>
+ nscolor StyleColor::CalcColor(nscolor aColor) const {
+- return ResolveColor(StyleAbsoluteColor::FromColor(aColor)).ToColor();
++ return ResolveColor(StyleAbsoluteColor::FromColor(aColor)).ToColor(nullptr);
}
template <>
-@@ -68,10 +73,11 @@ nscolor StyleAbsoluteColor::ToColor() const {
+ nscolor StyleColor::CalcColor(
+ const StyleAbsoluteColor& aForegroundColor) const {
+- return ResolveColor(aForegroundColor).ToColor();
++ return ResolveColor(aForegroundColor).ToColor(nullptr);
+ }
+
+ 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);
@@ -38,7 +59,8 @@ index 95c7ae6abea5032bef0466e8d59d212374d7a4d0..8dbfbb846b786d51af288989163aacfa
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/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/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/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..4e8258689
--- /dev/null
+++ b/src/layout/svg/SVGImageContext-cpp.patch
@@ -0,0 +1,58 @@
+diff --git a/layout/svg/SVGImageContext.cpp b/layout/svg/SVGImageContext.cpp
+index ecbda963b75fb70b62885a0c8f7a517011a8d5dc..5f55f0a4174db830656d434b5295835ab18e6619 100644
+--- a/layout/svg/SVGImageContext.cpp
++++ b/layout/svg/SVGImageContext.cpp
+@@ -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;
+- 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/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/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/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/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..2b834bb1d
--- /dev/null
+++ b/src/layout/xul/tree/nsTreeBodyFrame-cpp.patch
@@ -0,0 +1,32 @@
+diff --git a/layout/xul/tree/nsTreeBodyFrame.cpp b/layout/xul/tree/nsTreeBodyFrame.cpp
+index b6aa10336e7994c830e0326298820c3a534f8094..7747c52e5c5d227894d8f7fb377c65861dc51c4c 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);
+@@ -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(
+ }
+
+ 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..24433b060
--- /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..0dc5768ab8bf89f7d6c31ff4c7bd4bb805d64509 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*) 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*) 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/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/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/ZenBoostsEditor.mjs b/src/zen/boosts/ZenBoostsEditor.mjs
index 1708ca752..723229743 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;
+
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.updateButtonToggleVisuals();
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 67abb7bc4..a93492da5 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,
@@ -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);
}
}
}
@@ -539,6 +540,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);
}
@@ -553,7 +560,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/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..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(
@@ -322,13 +311,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 +356,14 @@ export class ZenBoostsChild extends JSWindowActorChild {
this.#loadStyleSheet(boost.styleSheet);
}
+ if (
+ boostData.sizeOverride &&
+ isFinite(boostData.sizeOverride) &&
+ boostData.sizeOverride !== 1
+ ) {
+ browsingContext.fullZoom = boostData.sizeOverride;
+ }
+
browsingContext.isZenBoostsInverted = boostData.smartInvert;
if (boostData.enableColorBoost) {
let primaryColor;
@@ -384,17 +386,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
);
}
@@ -484,7 +486,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 +495,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..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;
- }
- auto 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 1968c6ad1..6a64cd724 100644
--- a/src/zen/boosts/nsZenBoostsBackend.cpp
+++ b/src/zen/boosts/nsZenBoostsBackend.cpp
@@ -4,12 +4,16 @@
#include
#include
+#include
#include
+#include
#include "nsZenBoostsBackend.h"
#include "nsIXULRuntime.h"
#include "nsPresContext.h"
+#include "nsIFrame.h"
+#include "nsIContent.h"
#include "mozilla/ClearOnShutdown.h"
#include "mozilla/StaticPtr.h"
@@ -21,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"
@@ -29,9 +35,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
@@ -48,10 +51,6 @@ namespace zen {
NS_IMPL_ISUPPORTS0(nsZenBoostsBackend)
-nsZenAccentOklab nsZenBoostsBackend::mCachedAccent{0};
-nsZenAccentOklab nsZenBoostsBackend::mCachedComplementary{0};
-float nsZenBoostsBackend::mCachedComplementaryRotationDeg = 0.0f;
-
namespace {
/**
@@ -83,17 +82,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 +132,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 +177,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 +243,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_ =
@@ -300,40 +360,83 @@ 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);
}
/**
- * @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.
+ * 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 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();
+ if (!content || !content->IsInNativeAnonymousSubtree()) {
+ return false;
+ }
+ // 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;
+ }
+ const nsIContent* root = content->GetClosestNativeAnonymousSubtreeRoot();
+ return !root || !root->IsElement() ||
+ !mozilla::PseudoStyle::IsPseudoElement(
+ root->AsElement()->GetPseudoElementType());
+}
+
+/**
+ * @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;
+ // 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;
}
- 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) {
@@ -347,6 +450,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* {
@@ -362,68 +491,34 @@ auto nsZenBoostsBackend::GetInstance() -> nsZenBoostsBackend* {
return sZenBoostsBackend.get();
}
-auto nsZenBoostsBackend::onPresShellEntered(mozilla::dom::Document* aDocument)
- -> void {
- if (auto displayDoc = aDocument->GetDisplayDocument()) {
- onPresShellEntered(displayDoc);
- return;
+[[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;
}
- // 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;
+ // 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;
}
- mCurrentBrowsingContext = browsingContext;
- RefreshCachedBoostState();
-}
-
-auto nsZenBoostsBackend::RefreshCachedBoostState() -> void {
- if (!mCurrentBrowsingContext) {
- mCachedCurrentAccent = 0;
- mCachedCurrentComplementaryRotation = 0.0f;
- mCachedCurrentInverted = false;
- return;
- }
- auto top = mCurrentBrowsingContext->Top();
- mCachedCurrentAccent = top->ZenBoostsData();
- mCachedCurrentComplementaryRotation = top->ZenBoostsComplementaryRotation();
- mCachedCurrentInverted = top->IsZenBoostsInverted();
-}
-
-[[nodiscard]] ZEN_HOT_FUNCTION auto
-nsZenBoostsBackend::FilterColorFromPresContext(nscolor aColor,
- nsPresContext* aPresContext)
- -> nscolor {
ZenBoostData accentNS = 0;
float complementaryRotation = 0.0f;
bool invertColors = false;
- GetZenBoostsDataFromBrowsingContext(&accentNS, &complementaryRotation,
- &invertColors, aPresContext);
+ GetZenBoostsDataForFrame(aFrame, &accentNS, &complementaryRotation,
+ &invertColors);
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,21 +526,4 @@ 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);
-}
-
} // namespace zen
diff --git a/src/zen/boosts/nsZenBoostsBackend.h b/src/zen/boosts/nsZenBoostsBackend.h
index 67f3af6e8..1d2073372 100644
--- a/src/zen/boosts/nsZenBoostsBackend.h
+++ b/src/zen/boosts/nsZenBoostsBackend.h
@@ -9,7 +9,11 @@
#include "nsISupportsImpl.h"
#include "nsPresContext.h"
-#include "mozilla/RefPtr.h"
+class nsIFrame;
+
+namespace mozilla::dom {
+class BrowsingContext;
+}
#define ZEN_BOOSTS_BACKEND_CONTRACTID "@mozilla.org/zen/boosts-backend;1"
@@ -23,6 +27,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
@@ -30,81 +47,28 @@ 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 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).
+ *
+ * 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 StyleColor::ResolveColor for reference.
+ * @see StyleAbsoluteColor::ToColor for reference.
*/
- static auto ResolveStyleColor(mozilla::StyleAbsoluteColor aColor)
- -> mozilla::StyleAbsoluteColor;
-
- /**
- * @see ResolveStyleColor 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;
-
- [[nodiscard]]
- inline auto GetCurrentBrowsingContext() const {
- return mCurrentBrowsingContext;
- }
-
- /**
- * 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;
- /**
- * The presshell of the current document being rendered.
- */
- 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;
-
public:
/**
* @brief Get the singleton instance of the ZenBoostsBackend.
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 @@
-
-
+
+
.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);
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/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,
diff --git a/src/zen/common/zenThemeModifier.js b/src/zen/common/zenThemeModifier.js
index 31449efaa..30f2a42ce 100644
--- a/src/zen/common/zenThemeModifier.js
+++ b/src/zen/common/zenThemeModifier.js
@@ -169,7 +169,15 @@
} else {
document.documentElement.removeAttribute("zen-no-padding");
if (domFullscreen) {
- window.windowUtils.flushLayoutWithoutThrottledAnimations();
+ const selectedBrowser = gBrowser.selectedBrowser;
+ selectedBrowser.style.paddingRight = "0.5px";
+ window.addEventListener(
+ "MozAfterPaint",
+ () => {
+ selectedBrowser.style.paddingRight = "";
+ },
+ { once: true }
+ );
}
}
},
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/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/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,
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)
});
diff --git a/src/zen/kbs/ZenKeyboardShortcuts.mjs b/src/zen/kbs/ZenKeyboardShortcuts.mjs
index c7cadbbbc..b13ec6447 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",
@@ -44,6 +43,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",
@@ -430,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);
@@ -553,16 +559,21 @@ 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) {
+ switch (key) {
+ case " ":
+ str += AppConstants.platform == "macosx" ? "␣" : "Space";
+ break;
+ default:
+ 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 += "←";
@@ -582,18 +593,23 @@ class KeyShortcut {
case "enter":
str += AppConstants.platform == "macosx" ? "↩" : "Enter";
break;
- case "space":
- str += AppConstants.platform == "macosx" ? "␣" : "Space";
- break;
default:
str += normalizedKey;
}
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;
}
@@ -832,7 +848,7 @@ class nsZenKeyboardShortcutsLoader {
}
class nsZenKeyboardShortcutsVersioner {
- static LATEST_KBS_VERSION = 18;
+ static LATEST_KBS_VERSION = 19;
constructor() {}
@@ -1228,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;
}
}
@@ -1500,9 +1528,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,
@@ -1541,4 +1571,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);
+ },
};
diff --git a/src/zen/sessionstore/ZenWindowSync.sys.mjs b/src/zen/sessionstore/ZenWindowSync.sys.mjs
index a8b0f69a1..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) {
@@ -1657,7 +1664,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/spaces/ZenSpaceCreation.mjs b/src/zen/spaces/ZenSpaceCreation.mjs
index 26690eabf..330ca9e02 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,
@@ -261,6 +261,7 @@ class nsZenWorkspaceCreation extends MozXULElement {
}
async onCancelButtonCommand() {
+ document.documentElement.removeAttribute("zen-creating-workspace");
await gZenWorkspaces.changeWorkspaceWithID(this.previousWorkspaceId);
}
diff --git a/src/zen/spaces/ZenSpaceManager.mjs b/src/zen/spaces/ZenSpaceManager.mjs
index 725d652bb..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 {
@@ -1741,13 +1737,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 +1790,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 +1900,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 +1989,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;
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/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs
index 7220fc911..4bed63447 100644
--- a/src/zen/tabs/ZenPinnedTabManager.mjs
+++ b/src/zen/tabs/ZenPinnedTabManager.mjs
@@ -702,6 +702,10 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
}
return tab;
});
+ if (!fromDifferentWindow) {
+ // See gh-13796 and gh-12156
+ ownedTabs = ownedTabs.reverse();
+ }
movingTabs = [...ownedTabs];
if (fromDifferentWindow) {
gBrowser.addRangeToMultiSelectedTabs(
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`
+ );
+ }
+});
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",
diff --git a/surfer.json b/surfer.json
index a7e0075b5..a53e9df9a 100644
--- a/surfer.json
+++ b/surfer.json
@@ -5,8 +5,8 @@
"binaryName": "zen",
"version": {
"product": "firefox",
- "version": "150.0.3",
- "candidate": "151.0",
+ "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"
},
@@ -40,7 +40,7 @@
"brandShortName": "Twilight",
"brandFullName": "Zen Twilight",
"release": {
- "displayVersion": "1.20t",
+ "displayVersion": "1.21t",
"github": {
"repo": "zen-browser/desktop"
}