morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: b45d554c by Henry Wilkes at 2026-08-10T15:31:38+00:00 fixup! BB 41916: Letterboxing preferences UI BB 45079: Move letterboxing controls into appearance settings. - - - - - 8c8eb548 by Henry Wilkes at 2026-08-10T15:31:38+00:00 fixup! Base Browser strings BB 45079: Combine letterboxing setting strings together. - - - - - fcb13195 by Henry Wilkes at 2026-08-10T15:31:38+00:00 fixup! Tor Browser localization migration scripts. TB 45079: Add migration to combine letterboxing setting strings together. - - - - - 9 changed files: - browser/components/preferences/config/appearance.mjs - browser/components/preferences/letterboxing.js → browser/components/preferences/config/letterboxing.mjs - browser/components/preferences/jar.mn - − browser/components/preferences/letterboxing.inc.xhtml - browser/components/preferences/main.inc.xhtml - browser/components/preferences/main.js - browser/components/preferences/preferences.js - toolkit/locales/en-US/toolkit/global/base-browser.ftl - + tools/torbrowser/l10n/migrations/bug-45079-letterboxing-settings-single.py Changes: ===================================== browser/components/preferences/config/appearance.mjs ===================================== @@ -5,6 +5,11 @@ import { Preferences } from "chrome://global/content/preferences/Preferences.mjs"; import { SettingGroupManager } from "chrome://browser/content/preferences/config/SettingGroupManager.mjs"; +ChromeUtils.importESModule( + "chrome://browser/content/preferences/config/letterboxing.mjs", + { global: "current" } +); + const FORCED_COLORS_QUERY = matchMedia("(forced-colors)"); Preferences.addAll([ ===================================== browser/components/preferences/letterboxing.js → browser/components/preferences/config/letterboxing.mjs ===================================== @@ -1,5 +1,5 @@ -/* import-globals-from preferences.js */ -/* import-globals-from findInPage.js */ +import { Preferences } from "chrome://global/content/preferences/Preferences.mjs"; +import { SettingGroupManager } from "chrome://browser/content/preferences/config/SettingGroupManager.mjs"; Preferences.addAll([ { @@ -22,21 +22,29 @@ Preferences.addSetting({ }); Preferences.addSetting({ - id: "letterboxingRememberSize", - pref: "privacy.resistFingerprinting.letterboxing.rememberSize", + id: "letterboxingWindowSize", deps: ["letterboxingEnabled", "resistFingerprinting"], visible: ({ letterboxingEnabled, resistFingerprinting }) => { return letterboxingEnabled.value && resistFingerprinting.value; }, }); +Preferences.addSetting({ + id: "letterboxingRememberSize", + pref: "privacy.resistFingerprinting.letterboxing.rememberSize", +}); + Preferences.addSetting({ id: "letterboxingContentAlignment", - pref: "privacy.resistFingerprinting.letterboxing.vcenter", deps: ["letterboxingEnabled", "resistFingerprinting"], visible: ({ letterboxingEnabled, resistFingerprinting }) => { return letterboxingEnabled.value && resistFingerprinting.value; }, +}); + +Preferences.addSetting({ + id: "letterboxingContentAlignmentOptions", + pref: "privacy.resistFingerprinting.letterboxing.vcenter", get: val => { return val ? "middle" : "top"; }, @@ -57,28 +65,21 @@ Preferences.addSetting({ return; } letterboxingEnabled.value = true; - setTimeout(() => { - // Need to re-search to remove the "hidden" attribute on the groupbox - // elements (after the data-hidden-from-search attributes are changed by - // the "visible" callback). - // TODO: Is this an upstream issue that "hidden" is not removed? - if (!gSearchResultsPane.query) { - search(gLastCategory.category, "data-category"); - } - // Button should have focus when activated but will be hidden now, - // so re-assign focus to the newly revealed options. - Services.focus.moveFocus( - window, - buttonEl, - Services.focus.MOVEFOCUS_FORWARD, - 0 - ); - }); + // Button should have focus when activated but will be hidden now, + // so re-assign focus after the new section is revealed. + document + .getElementById("letterboxingWindowSize") + .updateComplete.then(() => { + document.getElementById("letterboxingRememberSize").focus(); + }); }, }); SettingGroupManager.registerGroups({ - letterboxingDisabled: { + letterboxing: { + l10nId: "letterboxing-settings-group", + supportPage: "tor-manual:features__fingerprinting-protections___letterboxing", + headingLevel: 2, items: [ { id: "letterboxingShouldEnable", @@ -93,63 +94,55 @@ SettingGroupManager.registerGroups({ }, ], }, - ], - }, - letterboxingSize: { - l10nId: "letterboxing-window-size-group", - headingLevel: 2, - items: [ { - id: "letterboxingRememberSize", - l10nId: "letterboxing-remember-size", - control: "moz-checkbox", + id: "letterboxingWindowSize", + l10nId: "letterboxing-window-size-group", + control: "moz-fieldset", + controlAttrs: { + headinglevel: 3, + }, + items: [ + { + id: "letterboxingRememberSize", + l10nId: "letterboxing-remember-size", + control: "moz-checkbox", + }, + ], }, - ], - }, - letterboxingAlignment: { - l10nId: "letterboxing-alignment-group", - headingLevel: 2, - items: [ { id: "letterboxingContentAlignment", - control: "moz-visual-picker", - options: [ + l10nId: "letterboxing-alignment-group", + control: "moz-fieldset", + controlAttrs: { + headinglevel: 3, + }, + items: [ { - value: "top", - l10nId: "letterboxing-alignment-top-option", - controlAttrs: { - class: "setting-chooser-item letterboxing-chooser-item", - imagesrc: - "chrome://browser/content/preferences/letterboxing-top.svg", - }, - }, - { - value: "middle", - l10nId: "letterboxing-alignment-middle-option", - controlAttrs: { - class: "setting-chooser-item letterboxing-chooser-item", - imagesrc: - "chrome://browser/content/preferences/letterboxing-middle.svg", - }, + id: "letterboxingContentAlignmentOptions", + control: "moz-visual-picker", + options: [ + { + value: "top", + l10nId: "letterboxing-alignment-top-option", + controlAttrs: { + class: "setting-chooser-item letterboxing-chooser-item", + imagesrc: + "chrome://browser/content/preferences/letterboxing-top.svg", + }, + }, + { + value: "middle", + l10nId: "letterboxing-alignment-middle-option", + controlAttrs: { + class: "setting-chooser-item letterboxing-chooser-item", + imagesrc: + "chrome://browser/content/preferences/letterboxing-middle.svg", + }, + }, + ], }, ], }, ], }, }); - -var gLetterboxingPrefs = { - init() { - const rfpSetting = Preferences.getSetting("resistFingerprinting"); - const updateCategoryVisibility = () => { - document - .getElementById("letterboxingCategory") - .classList.toggle("hide-all-letterboxing", !rfpSetting.value); - }; - rfpSetting.on("change", updateCategoryVisibility); - updateCategoryVisibility(); - initSettingGroup("letterboxingDisabled"); - initSettingGroup("letterboxingSize"); - initSettingGroup("letterboxingAlignment"); - }, -}; ===================================== browser/components/preferences/jar.mn ===================================== @@ -71,7 +71,7 @@ browser.jar: content/browser/preferences/widgets/update-state.mjs (widgets/update-state/update-state.mjs) content/browser/preferences/widgets/update-state.css (widgets/update-state/update-state.css) - content/browser/preferences/letterboxing.js - content/browser/preferences/letterboxing.css - content/browser/preferences/letterboxing-middle.svg - content/browser/preferences/letterboxing-top.svg + content/browser/preferences/config/letterboxing.mjs (config/letterboxing.mjs) + content/browser/preferences/letterboxing.css (letterboxing.css) + content/browser/preferences/letterboxing-middle.svg (letterboxing-middle.svg) + content/browser/preferences/letterboxing-top.svg (letterboxing-top.svg) ===================================== browser/components/preferences/letterboxing.inc.xhtml deleted ===================================== @@ -1,26 +0,0 @@ -<script src="chrome://browser/content/preferences/letterboxing.js" /> -<vbox - id="letterboxingCategory" - class="subcategory" - hidden="true" - data-category="paneGeneral" -> - <html:h1 data-l10n-id="letterboxing-header" /> - <description class="letterboxing-overview description-deemphasized"> - <html:span data-l10n-id="letterboxing-overview"></html:span> - <html:a - is="moz-support-link" - support-page="tor-manual:features__fingerprinting-protections___letterboxing" - data-l10n-id="letterboxing-learn-more" - ></html:a> - </description> -</vbox> -<groupbox data-category="paneGeneral" hidden="true"> - <html:setting-group groupid="letterboxingDisabled"></html:setting-group> -</groupbox> -<groupbox data-category="paneGeneral" hidden="true"> - <html:setting-group groupid="letterboxingSize"></html:setting-group> -</groupbox> -<groupbox data-category="paneGeneral" hidden="true"> - <html:setting-group groupid="letterboxingAlignment"></html:setting-group> -</groupbox> ===================================== browser/components/preferences/main.inc.xhtml ===================================== @@ -40,7 +40,7 @@ <html:setting-group groupid="browserLayout" data-category="paneGeneral" data-subcategory="layout" data-srd-migrated="" hidden="true"></html:setting-group> <!-- Letterboxing --> -#include ./letterboxing.inc.xhtml +<html:setting-group data-category="paneGeneral" groupid="letterboxing" data-srd-migrated="" hidden="true"></html:setting-group> <hbox id="languageAndAppearanceCategory" class="subcategory" ===================================== browser/components/preferences/main.js ===================================== @@ -10,7 +10,6 @@ /** @import { HandlerInfoWrapper, ApplicationListItem } from './config/downloads.mjs';*/ /* import-globals-from extensionControlled.js */ -/* import-globals-from letterboxing.js */ /* import-globals-from preferences.js */ /* import-globals-from /toolkit/mozapps/preferences/fontbuilder.js */ /* import-globals-from /browser/base/content/aboutDialog-appUpdater.js */ @@ -841,6 +840,7 @@ var gMainPane = { initSettingGroup("tabs"); initSettingGroup("profiles"); initSettingGroup("profilePane"); + initSettingGroup("letterboxing"); setEventListener("manageBrowserLanguagesButton", "command", function () { gMainPane.showBrowserLanguagesSubDialog({ search: false }); @@ -857,8 +857,6 @@ var gMainPane = { // Listen for window unload so we can remove our preference observers. window.addEventListener("unload", this); - gLetterboxingPrefs.init(); - // Notify observers that the UI is now ready Services.obs.notifyObservers(window, "main-pane-loaded"); this.setInitialized(); ===================================== browser/components/preferences/preferences.js ===================================== @@ -245,7 +245,7 @@ const CONFIG_PANES = Object.freeze({ }, appearance: { l10nId: "preferences-appearance-header", - groupIds: ["appearance", "browserTheme", "relatedSettings"], + groupIds: ["appearance", "browserTheme", "letterboxing", "relatedSettings"], module: "chrome://browser/content/preferences/config/appearance.mjs", iconSrc: "chrome://global/skin/icons/eye.svg", visible: () => srdSectionPrefs.all, ===================================== toolkit/locales/en-US/toolkit/global/base-browser.ftl ===================================== @@ -81,6 +81,12 @@ letterboxing-header = Letterboxing # "Letterboxing" should be treated as a feature/product name, and likely not changed in other languages. letterboxing-overview = { -brand-short-name }'s Letterboxing feature restricts websites to display at specific sizes, making it harder to single out users on the basis of their window or screen size. letterboxing-learn-more = Learn more +# The word "Letterboxing" is the proper noun for the Tor Browser feature, and is therefore capitalised. +# "Letterboxing" should be treated as a feature/product name, and likely not changed in other languages. +# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser". +letterboxing-settings-group = + .label = Letterboxing + .description = { -brand-short-name }'s Letterboxing feature restricts websites to display at specific sizes, making it harder to single out users on the basis of their window or screen size. letterboxing-window-size-group = .label = Window size letterboxing-remember-size = ===================================== tools/torbrowser/l10n/migrations/bug-45079-letterboxing-settings-single.py ===================================== @@ -0,0 +1,16 @@ +from fluent.migrate.helpers import transforms_from + + +def migrate(ctx): + ctx.add_transforms( + "base-browser.ftl", + "base-browser.ftl", + transforms_from( + """ +letterboxing-settings-group = + .label = { COPY_PATTERN(path, "letterboxing-header") } + .description = { COPY_PATTERN(path, "letterboxing-overview") } +""", + path="base-browser.ftl", + ), + ) View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/492c55b... -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/492c55b... You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
participants (1)
-
morgan (@morgan)