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:
Changes:
browser/components/preferences/config/appearance.mjs
| ... |
... |
@@ -5,6 +5,11 @@ |
|
5
|
5
|
import { Preferences } from "chrome://global/content/preferences/Preferences.mjs";
|
|
6
|
6
|
import { SettingGroupManager } from "chrome://browser/content/preferences/config/SettingGroupManager.mjs";
|
|
7
|
7
|
|
|
|
8
|
+ChromeUtils.importESModule(
|
|
|
9
|
+ "chrome://browser/content/preferences/config/letterboxing.mjs",
|
|
|
10
|
+ { global: "current" }
|
|
|
11
|
+);
|
|
|
12
|
+
|
|
8
|
13
|
const FORCED_COLORS_QUERY = matchMedia("(forced-colors)");
|
|
9
|
14
|
|
|
10
|
15
|
Preferences.addAll([
|
browser/components/preferences/letterboxing.js
→
browser/components/preferences/config/letterboxing.mjs
|
1
|
|
-/* import-globals-from preferences.js */
|
|
2
|
|
-/* import-globals-from findInPage.js */
|
|
|
1
|
+import { Preferences } from "chrome://global/content/preferences/Preferences.mjs";
|
|
|
2
|
+import { SettingGroupManager } from "chrome://browser/content/preferences/config/SettingGroupManager.mjs";
|
|
3
|
3
|
|
|
4
|
4
|
Preferences.addAll([
|
|
5
|
5
|
{
|
| ... |
... |
@@ -22,21 +22,29 @@ Preferences.addSetting({ |
|
22
|
22
|
});
|
|
23
|
23
|
|
|
24
|
24
|
Preferences.addSetting({
|
|
25
|
|
- id: "letterboxingRememberSize",
|
|
26
|
|
- pref: "privacy.resistFingerprinting.letterboxing.rememberSize",
|
|
|
25
|
+ id: "letterboxingWindowSize",
|
|
27
|
26
|
deps: ["letterboxingEnabled", "resistFingerprinting"],
|
|
28
|
27
|
visible: ({ letterboxingEnabled, resistFingerprinting }) => {
|
|
29
|
28
|
return letterboxingEnabled.value && resistFingerprinting.value;
|
|
30
|
29
|
},
|
|
31
|
30
|
});
|
|
32
|
31
|
|
|
|
32
|
+Preferences.addSetting({
|
|
|
33
|
+ id: "letterboxingRememberSize",
|
|
|
34
|
+ pref: "privacy.resistFingerprinting.letterboxing.rememberSize",
|
|
|
35
|
+});
|
|
|
36
|
+
|
|
33
|
37
|
Preferences.addSetting({
|
|
34
|
38
|
id: "letterboxingContentAlignment",
|
|
35
|
|
- pref: "privacy.resistFingerprinting.letterboxing.vcenter",
|
|
36
|
39
|
deps: ["letterboxingEnabled", "resistFingerprinting"],
|
|
37
|
40
|
visible: ({ letterboxingEnabled, resistFingerprinting }) => {
|
|
38
|
41
|
return letterboxingEnabled.value && resistFingerprinting.value;
|
|
39
|
42
|
},
|
|
|
43
|
+});
|
|
|
44
|
+
|
|
|
45
|
+Preferences.addSetting({
|
|
|
46
|
+ id: "letterboxingContentAlignmentOptions",
|
|
|
47
|
+ pref: "privacy.resistFingerprinting.letterboxing.vcenter",
|
|
40
|
48
|
get: val => {
|
|
41
|
49
|
return val ? "middle" : "top";
|
|
42
|
50
|
},
|
| ... |
... |
@@ -57,28 +65,21 @@ Preferences.addSetting({ |
|
57
|
65
|
return;
|
|
58
|
66
|
}
|
|
59
|
67
|
letterboxingEnabled.value = true;
|
|
60
|
|
- setTimeout(() => {
|
|
61
|
|
- // Need to re-search to remove the "hidden" attribute on the groupbox
|
|
62
|
|
- // elements (after the data-hidden-from-search attributes are changed by
|
|
63
|
|
- // the "visible" callback).
|
|
64
|
|
- // TODO: Is this an upstream issue that "hidden" is not removed?
|
|
65
|
|
- if (!gSearchResultsPane.query) {
|
|
66
|
|
- search(gLastCategory.category, "data-category");
|
|
67
|
|
- }
|
|
68
|
|
- // Button should have focus when activated but will be hidden now,
|
|
69
|
|
- // so re-assign focus to the newly revealed options.
|
|
70
|
|
- Services.focus.moveFocus(
|
|
71
|
|
- window,
|
|
72
|
|
- buttonEl,
|
|
73
|
|
- Services.focus.MOVEFOCUS_FORWARD,
|
|
74
|
|
- 0
|
|
75
|
|
- );
|
|
76
|
|
- });
|
|
|
68
|
+ // Button should have focus when activated but will be hidden now,
|
|
|
69
|
+ // so re-assign focus after the new section is revealed.
|
|
|
70
|
+ document
|
|
|
71
|
+ .getElementById("letterboxingWindowSize")
|
|
|
72
|
+ .updateComplete.then(() => {
|
|
|
73
|
+ document.getElementById("letterboxingRememberSize").focus();
|
|
|
74
|
+ });
|
|
77
|
75
|
},
|
|
78
|
76
|
});
|
|
79
|
77
|
|
|
80
|
78
|
SettingGroupManager.registerGroups({
|
|
81
|
|
- letterboxingDisabled: {
|
|
|
79
|
+ letterboxing: {
|
|
|
80
|
+ l10nId: "letterboxing-settings-group",
|
|
|
81
|
+ supportPage: "tor-manual:features__fingerprinting-protections___letterboxing",
|
|
|
82
|
+ headingLevel: 2,
|
|
82
|
83
|
items: [
|
|
83
|
84
|
{
|
|
84
|
85
|
id: "letterboxingShouldEnable",
|
| ... |
... |
@@ -93,63 +94,55 @@ SettingGroupManager.registerGroups({ |
|
93
|
94
|
},
|
|
94
|
95
|
],
|
|
95
|
96
|
},
|
|
96
|
|
- ],
|
|
97
|
|
- },
|
|
98
|
|
- letterboxingSize: {
|
|
99
|
|
- l10nId: "letterboxing-window-size-group",
|
|
100
|
|
- headingLevel: 2,
|
|
101
|
|
- items: [
|
|
102
|
97
|
{
|
|
103
|
|
- id: "letterboxingRememberSize",
|
|
104
|
|
- l10nId: "letterboxing-remember-size",
|
|
105
|
|
- control: "moz-checkbox",
|
|
|
98
|
+ id: "letterboxingWindowSize",
|
|
|
99
|
+ l10nId: "letterboxing-window-size-group",
|
|
|
100
|
+ control: "moz-fieldset",
|
|
|
101
|
+ controlAttrs: {
|
|
|
102
|
+ headinglevel: 3,
|
|
|
103
|
+ },
|
|
|
104
|
+ items: [
|
|
|
105
|
+ {
|
|
|
106
|
+ id: "letterboxingRememberSize",
|
|
|
107
|
+ l10nId: "letterboxing-remember-size",
|
|
|
108
|
+ control: "moz-checkbox",
|
|
|
109
|
+ },
|
|
|
110
|
+ ],
|
|
106
|
111
|
},
|
|
107
|
|
- ],
|
|
108
|
|
- },
|
|
109
|
|
- letterboxingAlignment: {
|
|
110
|
|
- l10nId: "letterboxing-alignment-group",
|
|
111
|
|
- headingLevel: 2,
|
|
112
|
|
- items: [
|
|
113
|
112
|
{
|
|
114
|
113
|
id: "letterboxingContentAlignment",
|
|
115
|
|
- control: "moz-visual-picker",
|
|
116
|
|
- options: [
|
|
|
114
|
+ l10nId: "letterboxing-alignment-group",
|
|
|
115
|
+ control: "moz-fieldset",
|
|
|
116
|
+ controlAttrs: {
|
|
|
117
|
+ headinglevel: 3,
|
|
|
118
|
+ },
|
|
|
119
|
+ items: [
|
|
117
|
120
|
{
|
|
118
|
|
- value: "top",
|
|
119
|
|
- l10nId: "letterboxing-alignment-top-option",
|
|
120
|
|
- controlAttrs: {
|
|
121
|
|
- class: "setting-chooser-item letterboxing-chooser-item",
|
|
122
|
|
- imagesrc:
|
|
123
|
|
- "chrome://browser/content/preferences/letterboxing-top.svg",
|
|
124
|
|
- },
|
|
125
|
|
- },
|
|
126
|
|
- {
|
|
127
|
|
- value: "middle",
|
|
128
|
|
- l10nId: "letterboxing-alignment-middle-option",
|
|
129
|
|
- controlAttrs: {
|
|
130
|
|
- class: "setting-chooser-item letterboxing-chooser-item",
|
|
131
|
|
- imagesrc:
|
|
132
|
|
- "chrome://browser/content/preferences/letterboxing-middle.svg",
|
|
133
|
|
- },
|
|
|
121
|
+ id: "letterboxingContentAlignmentOptions",
|
|
|
122
|
+ control: "moz-visual-picker",
|
|
|
123
|
+ options: [
|
|
|
124
|
+ {
|
|
|
125
|
+ value: "top",
|
|
|
126
|
+ l10nId: "letterboxing-alignment-top-option",
|
|
|
127
|
+ controlAttrs: {
|
|
|
128
|
+ class: "setting-chooser-item letterboxing-chooser-item",
|
|
|
129
|
+ imagesrc:
|
|
|
130
|
+ "chrome://browser/content/preferences/letterboxing-top.svg",
|
|
|
131
|
+ },
|
|
|
132
|
+ },
|
|
|
133
|
+ {
|
|
|
134
|
+ value: "middle",
|
|
|
135
|
+ l10nId: "letterboxing-alignment-middle-option",
|
|
|
136
|
+ controlAttrs: {
|
|
|
137
|
+ class: "setting-chooser-item letterboxing-chooser-item",
|
|
|
138
|
+ imagesrc:
|
|
|
139
|
+ "chrome://browser/content/preferences/letterboxing-middle.svg",
|
|
|
140
|
+ },
|
|
|
141
|
+ },
|
|
|
142
|
+ ],
|
|
134
|
143
|
},
|
|
135
|
144
|
],
|
|
136
|
145
|
},
|
|
137
|
146
|
],
|
|
138
|
147
|
},
|
|
139
|
148
|
}); |
|
140
|
|
-
|
|
141
|
|
-var gLetterboxingPrefs = {
|
|
142
|
|
- init() {
|
|
143
|
|
- const rfpSetting = Preferences.getSetting("resistFingerprinting");
|
|
144
|
|
- const updateCategoryVisibility = () => {
|
|
145
|
|
- document
|
|
146
|
|
- .getElementById("letterboxingCategory")
|
|
147
|
|
- .classList.toggle("hide-all-letterboxing", !rfpSetting.value);
|
|
148
|
|
- };
|
|
149
|
|
- rfpSetting.on("change", updateCategoryVisibility);
|
|
150
|
|
- updateCategoryVisibility();
|
|
151
|
|
- initSettingGroup("letterboxingDisabled");
|
|
152
|
|
- initSettingGroup("letterboxingSize");
|
|
153
|
|
- initSettingGroup("letterboxingAlignment");
|
|
154
|
|
- },
|
|
155
|
|
-}; |
browser/components/preferences/jar.mn
| ... |
... |
@@ -71,7 +71,7 @@ browser.jar: |
|
71
|
71
|
content/browser/preferences/widgets/update-state.mjs (widgets/update-state/update-state.mjs)
|
|
72
|
72
|
content/browser/preferences/widgets/update-state.css (widgets/update-state/update-state.css)
|
|
73
|
73
|
|
|
74
|
|
- content/browser/preferences/letterboxing.js
|
|
75
|
|
- content/browser/preferences/letterboxing.css
|
|
76
|
|
- content/browser/preferences/letterboxing-middle.svg
|
|
77
|
|
- content/browser/preferences/letterboxing-top.svg |
|
|
74
|
+ content/browser/preferences/config/letterboxing.mjs (config/letterboxing.mjs)
|
|
|
75
|
+ content/browser/preferences/letterboxing.css (letterboxing.css)
|
|
|
76
|
+ content/browser/preferences/letterboxing-middle.svg (letterboxing-middle.svg)
|
|
|
77
|
+ content/browser/preferences/letterboxing-top.svg (letterboxing-top.svg) |
browser/components/preferences/letterboxing.inc.xhtml
deleted
|
1
|
|
-<script src="">"chrome://browser/content/preferences/letterboxing.js" />
|
|
2
|
|
-<vbox
|
|
3
|
|
- id="letterboxingCategory"
|
|
4
|
|
- class="subcategory"
|
|
5
|
|
- hidden="true"
|
|
6
|
|
- data-category="paneGeneral"
|
|
7
|
|
->
|
|
8
|
|
- <html:h1 data-l10n-id="letterboxing-header" />
|
|
9
|
|
- <description class="letterboxing-overview description-deemphasized">
|
|
10
|
|
- <html:span data-l10n-id="letterboxing-overview"></html:span>
|
|
11
|
|
- <html:a
|
|
12
|
|
- is="moz-support-link"
|
|
13
|
|
- support-page="tor-manual:features__fingerprinting-protections___letterboxing"
|
|
14
|
|
- data-l10n-id="letterboxing-learn-more"
|
|
15
|
|
- ></html:a>
|
|
16
|
|
- </description>
|
|
17
|
|
-</vbox>
|
|
18
|
|
-<groupbox data-category="paneGeneral" hidden="true">
|
|
19
|
|
- <html:setting-group groupid="letterboxingDisabled"></html:setting-group>
|
|
20
|
|
-</groupbox>
|
|
21
|
|
-<groupbox data-category="paneGeneral" hidden="true">
|
|
22
|
|
- <html:setting-group groupid="letterboxingSize"></html:setting-group>
|
|
23
|
|
-</groupbox>
|
|
24
|
|
-<groupbox data-category="paneGeneral" hidden="true">
|
|
25
|
|
- <html:setting-group groupid="letterboxingAlignment"></html:setting-group>
|
|
26
|
|
-</groupbox> |
browser/components/preferences/main.inc.xhtml
| ... |
... |
@@ -40,7 +40,7 @@ |
|
40
|
40
|
<html:setting-group groupid="browserLayout" data-category="paneGeneral" data-subcategory="layout" data-srd-migrated="" hidden="true"></html:setting-group>
|
|
41
|
41
|
|
|
42
|
42
|
<!-- Letterboxing -->
|
|
43
|
|
-#include ./letterboxing.inc.xhtml
|
|
|
43
|
+<html:setting-group data-category="paneGeneral" groupid="letterboxing" data-srd-migrated="" hidden="true"></html:setting-group>
|
|
44
|
44
|
|
|
45
|
45
|
<hbox id="languageAndAppearanceCategory"
|
|
46
|
46
|
class="subcategory"
|
browser/components/preferences/main.js
| ... |
... |
@@ -10,7 +10,6 @@ |
|
10
|
10
|
/** @import { HandlerInfoWrapper, ApplicationListItem } from './config/downloads.mjs';*/
|
|
11
|
11
|
|
|
12
|
12
|
/* import-globals-from extensionControlled.js */
|
|
13
|
|
-/* import-globals-from letterboxing.js */
|
|
14
|
13
|
/* import-globals-from preferences.js */
|
|
15
|
14
|
/* import-globals-from /toolkit/mozapps/preferences/fontbuilder.js */
|
|
16
|
15
|
/* import-globals-from /browser/base/content/aboutDialog-appUpdater.js */
|
| ... |
... |
@@ -841,6 +840,7 @@ var gMainPane = { |
|
841
|
840
|
initSettingGroup("tabs");
|
|
842
|
841
|
initSettingGroup("profiles");
|
|
843
|
842
|
initSettingGroup("profilePane");
|
|
|
843
|
+ initSettingGroup("letterboxing");
|
|
844
|
844
|
|
|
845
|
845
|
setEventListener("manageBrowserLanguagesButton", "command", function () {
|
|
846
|
846
|
gMainPane.showBrowserLanguagesSubDialog({ search: false });
|
| ... |
... |
@@ -857,8 +857,6 @@ var gMainPane = { |
|
857
|
857
|
// Listen for window unload so we can remove our preference observers.
|
|
858
|
858
|
window.addEventListener("unload", this);
|
|
859
|
859
|
|
|
860
|
|
- gLetterboxingPrefs.init();
|
|
861
|
|
-
|
|
862
|
860
|
// Notify observers that the UI is now ready
|
|
863
|
861
|
Services.obs.notifyObservers(window, "main-pane-loaded");
|
|
864
|
862
|
this.setInitialized();
|
browser/components/preferences/preferences.js
| ... |
... |
@@ -245,7 +245,7 @@ const CONFIG_PANES = Object.freeze({ |
|
245
|
245
|
},
|
|
246
|
246
|
appearance: {
|
|
247
|
247
|
l10nId: "preferences-appearance-header",
|
|
248
|
|
- groupIds: ["appearance", "browserTheme", "relatedSettings"],
|
|
|
248
|
+ groupIds: ["appearance", "browserTheme", "letterboxing", "relatedSettings"],
|
|
249
|
249
|
module: "chrome://browser/content/preferences/config/appearance.mjs",
|
|
250
|
250
|
iconSrc: "chrome://global/skin/icons/eye.svg",
|
|
251
|
251
|
visible: () => srdSectionPrefs.all,
|
toolkit/locales/en-US/toolkit/global/base-browser.ftl
| ... |
... |
@@ -81,6 +81,12 @@ letterboxing-header = Letterboxing |
|
81
|
81
|
# "Letterboxing" should be treated as a feature/product name, and likely not changed in other languages.
|
|
82
|
82
|
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.
|
|
83
|
83
|
letterboxing-learn-more = Learn more
|
|
|
84
|
+# The word "Letterboxing" is the proper noun for the Tor Browser feature, and is therefore capitalised.
|
|
|
85
|
+# "Letterboxing" should be treated as a feature/product name, and likely not changed in other languages.
|
|
|
86
|
+# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser".
|
|
|
87
|
+letterboxing-settings-group =
|
|
|
88
|
+ .label = Letterboxing
|
|
|
89
|
+ .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.
|
|
84
|
90
|
letterboxing-window-size-group =
|
|
85
|
91
|
.label = Window size
|
|
86
|
92
|
letterboxing-remember-size =
|
tools/torbrowser/l10n/migrations/bug-45079-letterboxing-settings-single.py
|
|
1
|
+from fluent.migrate.helpers import transforms_from
|
|
|
2
|
+
|
|
|
3
|
+
|
|
|
4
|
+def migrate(ctx):
|
|
|
5
|
+ ctx.add_transforms(
|
|
|
6
|
+ "base-browser.ftl",
|
|
|
7
|
+ "base-browser.ftl",
|
|
|
8
|
+ transforms_from(
|
|
|
9
|
+ """
|
|
|
10
|
+letterboxing-settings-group =
|
|
|
11
|
+ .label = { COPY_PATTERN(path, "letterboxing-header") }
|
|
|
12
|
+ .description = { COPY_PATTERN(path, "letterboxing-overview") }
|
|
|
13
|
+""",
|
|
|
14
|
+ path="base-browser.ftl",
|
|
|
15
|
+ ),
|
|
|
16
|
+ ) |
|