lists.torproject.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

tbb-commits

Thread Start a new thread
Threads by month
  • ----- 2026 -----
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2015 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2014 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
tbb-commits@lists.torproject.org

  • 1 participants
  • 20880 discussions
[Git][tpo/applications/tor-browser-build][maint-15.0] Bug 41850: Update keyring/torbrowser.gpg for new subkey
by boklm (@boklm) 12 Aug '26

12 Aug '26
boklm pushed to branch maint-15.0 at The Tor Project / Applications / tor-browser-build Commits: f01c77f9 by Nicolas Vigier at 2026-08-12T09:45:13+02:00 Bug 41850: Update keyring/torbrowser.gpg for new subkey Also update expiration date of the main key. - - - - - 1 changed file: - keyring/torbrowser.gpg Changes: ===================================== keyring/torbrowser.gpg ===================================== Binary files a/keyring/torbrowser.gpg and b/keyring/torbrowser.gpg differ View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/f… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/f… 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
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Bug 41850: Update keyring/torbrowser.gpg for new subkey
by boklm (@boklm) 12 Aug '26

12 Aug '26
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 7e6cd044 by Nicolas Vigier at 2026-08-11T20:10:01+02:00 Bug 41850: Update keyring/torbrowser.gpg for new subkey Also update expiration date of the main key. - - - - - 1 changed file: - keyring/torbrowser.gpg Changes: ===================================== keyring/torbrowser.gpg ===================================== Binary files a/keyring/torbrowser.gpg and b/keyring/torbrowser.gpg differ View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/7… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/7… 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
1 0
0 0
[Git][tpo/applications/tor-browser-build][maint-15.0] Bug 41831: Update libevent to 2.1.13.
by Pier Angelo Vendrame (@pierov) 12 Aug '26

12 Aug '26
Pier Angelo Vendrame pushed to branch maint-15.0 at The Tor Project / Applications / tor-browser-build Commits: a2e88ca9 by Pier Angelo Vendrame at 2026-08-11T17:31:47+02:00 Bug 41831: Update libevent to 2.1.13. Also, add nickm's key to keyrings/libevent.gpg. - - - - - 2 changed files: - keyring/libevent.gpg - projects/libevent/config Changes: ===================================== keyring/libevent.gpg ===================================== Binary files a/keyring/libevent.gpg and b/keyring/libevent.gpg differ ===================================== projects/libevent/config ===================================== @@ -1,5 +1,5 @@ # vim: filetype=yaml sw=2 -version: 2.1.12 +version: 2.1.13 git_url: https://github.com/libevent/libevent.git git_hash: 'release-[% c("version") %]-stable' tag_gpg_id: 1 View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/a… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/a… 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
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-153.0esr-16.0-1] fixup! Base Browser strings
by morgan (@morgan) 11 Aug '26

11 Aug '26
morgan pushed to branch mullvad-browser-153.0esr-16.0-1 at The Tor Project / Applications / Mullvad Browser Commits: 71212888 by Henry Wilkes at 2026-08-11T11:55:01+00:00 fixup! Base Browser strings BB 45079: Drop old letterboxing strings. - - - - - 1 changed file: - toolkit/locales/en-US/toolkit/global/base-browser.ftl Changes: ===================================== toolkit/locales/en-US/toolkit/global/base-browser.ftl ===================================== @@ -74,13 +74,6 @@ new-identity-blocked-home-ignore-button = Load it anyway ## Preferences - Letterboxing. -# 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. -letterboxing-header = Letterboxing -# 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. -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". View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/712… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/712… 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
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] fixup! Base Browser strings
by morgan (@morgan) 11 Aug '26

11 Aug '26
morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 43fea19f by Henry Wilkes at 2026-08-11T11:49:18+00:00 fixup! Base Browser strings BB 45079: Drop old letterboxing strings. - - - - - 1 changed file: - toolkit/locales/en-US/toolkit/global/base-browser.ftl Changes: ===================================== toolkit/locales/en-US/toolkit/global/base-browser.ftl ===================================== @@ -74,13 +74,6 @@ new-identity-blocked-home-ignore-button = Load it anyway ## Preferences - Letterboxing. -# 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. -letterboxing-header = Letterboxing -# 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. -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". View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/43fea19… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/43fea19… 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
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] 2 commits: fixup! TB 30237: Add v3 onion services client authentication prompt
by morgan (@morgan) 11 Aug '26

11 Aug '26
morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 3122fae2 by Henry Wilkes at 2026-08-11T11:29:38+00:00 fixup! TB 30237: Add v3 onion services client authentication prompt TB 45200: Include onion authentication in the new password settings. - - - - - 3066ef32 by Henry Wilkes at 2026-08-11T11:29:38+00:00 fixup! Tor Browser strings TB 45200: Modify the saved keys button text. - - - - - 3 changed files: - browser/components/preferences/config/passwords-autofill.mjs - browser/components/preferences/preferences.js - toolkit/locales/en-US/toolkit/global/tor-browser.ftl Changes: ===================================== browser/components/preferences/config/passwords-autofill.mjs ===================================== @@ -797,7 +797,7 @@ SettingGroupManager.registerGroups({ { id: "onionSiteSavedKeys", control: "moz-box-button", - l10nId: "onion-site-authentication-saved-keys-button", + l10nId: "onion-site-authentication-saved-keys-button2", }, ], }, ===================================== browser/components/preferences/preferences.js ===================================== @@ -393,7 +393,7 @@ const CONFIG_PANES = Object.freeze({ passwordsAutofill: { l10nId: "preferences-passwords-autofill-header", iconSrc: "chrome://browser/skin/login.svg", - groupIds: ["passwords", "payments", "addresses"], + groupIds: ["passwords", "onionSiteAuthentication", "payments", "addresses"], module: "chrome://browser/content/preferences/config/passwords-autofill.mjs", visible: () => srdSectionEnabled("passwordsAutofill"), ===================================== toolkit/locales/en-US/toolkit/global/tor-browser.ftl ===================================== @@ -746,8 +746,8 @@ onion-site-authentication-group = .label = Onion site authentication .description = Some onion sites require that you identify yourself with a key (a kind of password) before you can access them. # Here "key" is a noun, and refers to a special code that gives the user access to a website. -onion-site-authentication-saved-keys-button = - .label = Saved keys… +onion-site-authentication-saved-keys-button2 = + .label = Manage saved keys ## Onion site saved keys dialog. ## "Onion site" is an abbreviation of "onion website": a website whose domain URL ends in ".onion", which is reachable through the Tor network. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/5fac28… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/5fac28… 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
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-153.0esr-16.0-1] MB 446: Selective Saving Mode Backend
by Pier Angelo Vendrame (@pierov) 11 Aug '26

11 Aug '26
Pier Angelo Vendrame pushed to branch mullvad-browser-153.0esr-16.0-1 at The Tor Project / Applications / Mullvad Browser Commits: 59bcec0c by june wilde at 2026-08-10T10:28:18-07:00 MB 446: Selective Saving Mode Backend - - - - - 11 changed files: - browser/app/profile/000-mullvad-browser.js - toolkit/components/moz.build - + toolkit/components/selectivesavingmode/SelectiveSavingMode.manifest - + toolkit/components/selectivesavingmode/SelectiveSavingMode.sys.mjs - + toolkit/components/selectivesavingmode/components.conf - + toolkit/components/selectivesavingmode/content/broom-clean.svg - + toolkit/components/selectivesavingmode/content/broom-saved.svg - + toolkit/components/selectivesavingmode/jar.mn - + toolkit/components/selectivesavingmode/moz.build - + toolkit/components/selectivesavingmode/tests/xpcshell/test_selective_saving_mode.js - + toolkit/components/selectivesavingmode/tests/xpcshell/xpcshell.toml Changes: ===================================== browser/app/profile/000-mullvad-browser.js ===================================== @@ -39,3 +39,20 @@ pref("app.update.url.details", "https://mullvad.net/download/browser"); pref("app.update.badgeWaitTime", 0); // point to our feedback url rather than Mozilla's pref("app.feedback.baseURL", "https://mullvad.net/help/tag/browser/"); + +// mullvad-browser#446: Default to unconfigured for selective saving mode for alpha +// Controls what selective saving mode the browser operates in. +// On initial startup the selective saving toolkit component sets this mode pref +// when the user hasn't modified any of the prefs this pref controls. Otherwise, +// the mode is set to selective saving +// +// 0 = mode has yet to be configured +// 1 = always on private browsing mode (old default) +// 2 = selective saving mode (new default) +// 3 = normal browsing mode +pref("browser.selectiveSavingMode", 0); +#if MOZ_UPDATE_CHANNEL == release +pref("browser.selectiveSavingMode.enabled", false); +#else +pref("browser.selectiveSavingMode.enabled", true); +#endif ===================================== toolkit/components/moz.build ===================================== @@ -78,6 +78,7 @@ DIRS += [ "resistfingerprinting", "search", "securitylevel", + "selectivesavingmode", "sessionstore", "shell", "startup", ===================================== toolkit/components/selectivesavingmode/SelectiveSavingMode.manifest ===================================== @@ -0,0 +1 @@ +category profile-after-change SelectiveSavingMode @torproject.org/selective-saving-mode;1 ===================================== toolkit/components/selectivesavingmode/SelectiveSavingMode.sys.mjs ===================================== @@ -0,0 +1,229 @@ +/* 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/. */ + +// Pref to select browsing mode via this component +export const kSelectiveSavingModePref = "browser.selectiveSavingMode"; + +// Selective Saving Mode underlaying functionality prefs +// Sanitize site data upon shutdown +const kSanitizeOnShutdown = "privacy.sanitize.sanitizeOnShutdown"; +// Start browser in private window +const kPrivateBrowsingAutostart = "browser.privatebrowsing.autostart"; +// Keep site permissions stored in memory rather than on disk +const kKeepPermissionInMemory = "permissions.memory_only"; + +// Valid options for the browsing mode pref to be set to +export const SelectiveSavingModes = Object.freeze({ + unconfigured: 0, + total_clearing: 1, + selective_saving: 2, + normal_browsing: 3, + custom: 4, +}); + +// A table of all prefs used to move between default browsing modes. +const kSelectiveSavingModeSettings = { + total_clearing: { + [kSanitizeOnShutdown]: true, + [kPrivateBrowsingAutostart]: true, + [kKeepPermissionInMemory]: true, + }, + selective_saving: { + [kSanitizeOnShutdown]: true, + [kPrivateBrowsingAutostart]: false, + [kKeepPermissionInMemory]: false, + }, + normal_browsing: { + [kSanitizeOnShutdown]: false, + [kPrivateBrowsingAutostart]: false, + [kKeepPermissionInMemory]: false, + }, +}; + +/** + * Selective Saving Mode Pref Controller + * + * Listens for and handles changes in prefs relevant to Selective Saving Mode in + * order to keep the browsing mode pref and the corresponding functionality + * prefs in sync with each other each time any of the aforementioned prefs are + * changed + */ +export class SelectiveSavingPrefController { + QueryInterface = ChromeUtils.generateQI(["nsIObserver"]); + + /** + * Initialize pref controller + */ + init() { + if (!Services.prefs.getBoolPref("browser.selectiveSavingMode.enabled")) { + return; + } + + if ( + Services.prefs.getIntPref(kSelectiveSavingModePref) === + SelectiveSavingModes.unconfigured + ) { + this.#setBrowsingModeFromPrefs(); + } else { + this.#setPrefsFromBrowsingMode(); + } + + this.#createPreferenceObservers(); + } + + /** + * Shutdown pref controller + */ + shutdown() { + this.#removePreferenceObservers(); + } + + /** + * Component hook for observing relevant event messages + * + * @param {string} aSubject + * @param {string} aTopic + */ + observe(aSubject, aTopic) { + if (aTopic === "profile-after-change") { + this.init(); + } + } + + /** + * Sets current Selective Saving browsing mode to closely match how + * functionality prefs are configured in kSelectiveSavingModeSettings + */ + #setBrowsingModeFromPrefs() { + const currentSanitizePref = Services.prefs.getBoolPref(kSanitizeOnShutdown); + const currentAutostartPref = Services.prefs.getBoolPref( + kPrivateBrowsingAutostart + ); + const currentPermissionPref = Services.prefs.getBoolPref( + kKeepPermissionInMemory + ); + + for (let [mode, settings] of Object.entries(kSelectiveSavingModeSettings)) { + if ( + currentSanitizePref === settings[kSanitizeOnShutdown] && + currentAutostartPref === settings[kPrivateBrowsingAutostart] && + currentPermissionPref === settings[kKeepPermissionInMemory] + ) { + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes[mode] + ); + return; + } + } + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.custom + ); + } + + /** + * A wrapper for setBrowsingModeFromPrefs to reset pref observers + */ + #setModeAndResetObservers = () => { + this.#removePreferenceObservers(); + this.#setBrowsingModeFromPrefs(); + this.#createPreferenceObservers(); + }; + + /** + * Sets current Selective Saving functionality prefs to closely match the + * currently assigned browsing mode. Corrects for anomalous settings if present + * as well + */ + #setPrefsFromBrowsingMode() { + let currentBrowsingMode = Services.prefs.getIntPref( + kSelectiveSavingModePref + ); + + const mode = Object.entries(SelectiveSavingModes).find( + ([, value]) => value === currentBrowsingMode + )?.[0]; + + if ( + mode === undefined || + currentBrowsingMode === SelectiveSavingModes.unconfigured + ) { + this.#setBrowsingModeFromPrefs(); + return; + } + + if (kSelectiveSavingModeSettings[mode]) { + Services.prefs.setBoolPref( + kSanitizeOnShutdown, + kSelectiveSavingModeSettings[mode][kSanitizeOnShutdown] + ); + Services.prefs.setBoolPref( + kPrivateBrowsingAutostart, + kSelectiveSavingModeSettings[mode][kPrivateBrowsingAutostart] + ); + Services.prefs.setBoolPref( + kKeepPermissionInMemory, + kSelectiveSavingModeSettings[mode][kKeepPermissionInMemory] + ); + } + } + + /** + * A wrapper for setPrefsFromBrowsingMode to reset pref observers + */ + #setPrefsAndResetObservers = () => { + this.#removePreferenceObservers(); + this.#setPrefsFromBrowsingMode(); + this.#createPreferenceObservers(); + }; + + /** + * A helper function for standing up pref observers with the correct callback + */ + #createPreferenceObservers() { + Services.prefs.addObserver( + kSelectiveSavingModePref, + this.#setPrefsAndResetObservers + ); + + Services.prefs.addObserver( + kSanitizeOnShutdown, + this.#setModeAndResetObservers + ); + Services.prefs.addObserver( + kPrivateBrowsingAutostart, + this.#setModeAndResetObservers + ); + Services.prefs.addObserver( + kKeepPermissionInMemory, + this.#setModeAndResetObservers + ); + } + + /** + * A helper function for disabling pref observers keyed to their respective + * callbacks + */ + #removePreferenceObservers() { + Services.prefs.removeObserver( + kSelectiveSavingModePref, + this.#setPrefsAndResetObservers + ); + + Services.prefs.removeObserver( + kSanitizeOnShutdown, + this.#setModeAndResetObservers + ); + Services.prefs.removeObserver( + kPrivateBrowsingAutostart, + this.#setModeAndResetObservers + ); + Services.prefs.removeObserver( + kKeepPermissionInMemory, + this.#setModeAndResetObservers + ); + } +} /* Selective Saving Mode Pref Controller */ ===================================== toolkit/components/selectivesavingmode/components.conf ===================================== @@ -0,0 +1,14 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +Classes = [ + { + "cid": "{b4a1073c-9e3c-4ce7-b13b-c100f5c64ccb}", + "contract_ids": [ + "@torproject.org/selective-saving-mode;1", + ], + "esModule": "moz-src:///toolkit/components/selectivesavingmode/SelectiveSavingMode.sys.mjs", + "constructor": "SelectiveSavingPrefController", + } +] ===================================== toolkit/components/selectivesavingmode/content/broom-clean.svg ===================================== @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <g fill="context-fill" fill-opacity="context-fill-opacity"> + <path d="m13.5383 14.5627c-.1712-.0053-.3194-.1334-.3505-.3028-.0419-.294-.1441-.5789-.3001-.8369-.2583-.1558-.5436-.2579-.838-.2998-.1694-.0313-.2974-.1793-.3026-.3501-.0053-.1708.1136-.3146.2813-.3402.2944-.0329.5762-.1254.8284-.272.1426-.2476.2313-.5243.2608-.8129.0237-.1679.1662-.2884.3372-.2851.1699.0042.3181.1295.3517.2973.0471.2931.1533.5763.312.8323.2565.1573.5396.263.8326.3109.1682.0345.2929.1836.2958.3536.0028.17-.1171.3116-.2843.3357-.2894.0285-.5669.1172-.8147.2604-.1462.2521-.2386.5335-.2717.8274-.025.167-.1675.2861-.3379.2822z"/> + <path d="m6.49858 2.99992c-.14675-.00459-.27377-.11436-.3004-.25961-.03593-.25196-.12354-.49621-.25729-.71731-.22137-.13358-.46594-.22109-.71822-.25699-.14526-.02682-.25492-.15363-.25945-.30004-.00454-.14641.09737-.26967.24112-.29164.25236-.02817.49393-.10747.71013-.233093.12217-.2123.19825-.449454.22353-.696834.0203-.143878.14242-.24714456.28897-.24434753.14565.00358504.27273.11100153.30149.25484453.0404.251183.13139.493923.2674.713349.21988.134841.46256.225461.71364.266481.14417.02957.25114.15744.25358.30313.00244.1457-.10035.26707-.24368.28774-.2481.02441-.48592.10041-.69835.22319-.1253.2161-.20449.45729-.23284.7092-.0214.14312-.14361.24521-.28963.24193z"/> + <path d="m1.82093 5.3609c-.15279-.00473-.28512-.11875-.31315-.26981-.02739-.18014-.08781-.35525-.1782-.51643-.16152-.09021-.336989-.15052-.517512-.17788-.151437-.02794-.265749-.16003-.270474-.31254-.004724-.15251.101518-.2809.251381-.30378.181146-.02145.355265-.07593.513815-.16075.08209-.15545.13363-.32622.15197-.50355.02095-.15059.14903-.25861.3025-.25512.15164.00368.28404.11525.31428.26484.03021.18029.09338.35503.18632.51538.16048.09192.33508.15452.51517.18469.1503.0308.26181.164.26435.31577.00254.15176-.10462.27819-.25404.29971-.17764.01914-.34855.07141-.50396.15412-.08502.1582-.13963.33194-.16114.5127-.022.14911-.14912.25571-.30131.25265z"/> + <path clip-rule="evenodd" d="m15.3213 1.06694c.2441-.244076.2441-.639804 0-.883882-.2441-.2440775-.6398-.2440774-.8839 0l-5.96506 5.965062h-.50519c-1.996-1.09517-4.49023.42233-6.49079 1.63948-.41545.25277-.80961.49258-1.173597.69335-.16756.10002-.289261.26641-.30145394.48048-.01219156.21407.06079654.41038.21802994.56743l1.243691 1.24224 2.37084-1.02603c.15392-.06661.30331.14022.18601.25753l-1.66213 1.6621 1.46329 1.4616 1.66126-1.6613c.1173-.1173.32413.0321.25752.186l-1.02482 2.3682 1.25462 1.2531c.15724.157.35379.23.56815.2178.19095-.0561.35851-.1561.45869-.3234.20012-.3592.43577-.7455.68321-1.1511 1.22241-2.0039 2.73233-4.47901 1.66484-6.47533v-.49654zm-7.46715 6.55077c1.12692 1.12692.64113 2.69369-.05278 3.70149h-.50137l-3.13-3.1492v-.5c1.00858-.68566 2.56556-1.17088 3.68415-.05229z" fill-rule="evenodd"/> + </g> +</svg> ===================================== toolkit/components/selectivesavingmode/content/broom-saved.svg ===================================== @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <g fill="context-fill" fill-opacity="context-fill-opacity"> + <path d="M1.31604 2.56132C1.07376 2.31905 0.680954 2.31905 0.438678 2.56132C0.196403 2.8036 0.196403 3.1964 0.438678 3.43868L12.3649 15.3649C12.6072 15.6072 13 15.6072 13.2423 15.3649C13.4845 15.1226 13.4845 14.7298 13.2423 14.4875L1.31604 2.56132Z" /> + <path d="M5.75301 6.99811C5.17481 7.10048 4.6182 7.36528 4.17 7.66998V8.16998L7.29989 11.3194H7.80184C8.11144 10.8697 8.37762 10.3082 8.47957 9.72467L9.40926 10.6544C9.01989 11.8129 8.31279 12.978 7.67977 14.0157C7.43234 14.4213 7.19629 14.8079 6.99617 15.1671C6.89602 15.3341 6.72885 15.4342 6.53817 15.4903C6.32389 15.5024 6.12701 15.4295 5.96981 15.2725L4.71492 14.0196L5.74031 11.6514C5.8069 11.4976 5.59983 11.3479 5.4825 11.4649L3.82137 13.126L2.3575 11.6651L4.01961 10.003C4.13689 9.88571 3.98795 9.67869 3.83406 9.74518L1.46297 10.7715L0.219804 9.52936C0.0625708 9.37231 -0.0111371 9.17507 0.00105446 8.961C0.0133896 8.74714 0.135367 8.58049 0.302812 8.48053C0.666747 8.27978 1.06126 8.03989 1.47664 7.78717C2.50628 7.16073 3.6674 6.45677 4.82332 6.06842L5.75301 6.99811ZM14.4375 0.182679C14.6816 -0.0610732 15.0773 -0.0611198 15.3213 0.182679C15.5654 0.426757 15.5654 0.823367 15.3213 1.06744L9.34481 7.04401V7.5401C9.6249 8.06391 9.72625 8.62084 9.70321 9.19342L6.28426 5.77545C6.86809 5.75137 7.43503 5.85671 7.96688 6.1485H8.47274L14.4375 0.182679Z" /> + </g> +</svg> ===================================== toolkit/components/selectivesavingmode/jar.mn ===================================== @@ -0,0 +1,7 @@ +# 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/. + +toolkit.jar: + content/global/selectivesaving/broom-clean.svg (content/broom-clean.svg) + content/global/selectivesaving/broom-saved.svg (content/broom-saved.svg) ===================================== toolkit/components/selectivesavingmode/moz.build ===================================== @@ -0,0 +1,23 @@ +# 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/. + +XPCSHELL_TESTS_MANIFESTS += [ + "tests/xpcshell/xpcshell.toml", +] + +MOZ_SRC_FILES += [ + "SelectiveSavingMode.sys.mjs", +] + +XPCOM_MANIFESTS += [ + "components.conf", +] + +EXTRA_COMPONENTS += [ + "SelectiveSavingMode.manifest", +] + +JAR_MANIFESTS += [ + "jar.mn", +] ===================================== toolkit/components/selectivesavingmode/tests/xpcshell/test_selective_saving_mode.js ===================================== @@ -0,0 +1,755 @@ +/* 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/. */ + +"use strict"; + +const { + SelectiveSavingPrefController, + SelectiveSavingModes, + kSelectiveSavingModePref, +} = ChromeUtils.importESModule( + "moz-src:///toolkit/components/selectivesavingmode/SelectiveSavingMode.sys.mjs" +); + +// secondary prefs +const kSanitizeOnShutdown = "privacy.sanitize.sanitizeOnShutdown"; +const kPrivateBrowsingAutostart = "browser.privatebrowsing.autostart"; +const kKeepPermissionInMemory = "permissions.memory_only"; + +const controller = new SelectiveSavingPrefController(); + +function resetToTotalSavingPrefs() { + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kKeepPermissionInMemory, true); +} + +registerCleanupFunction(async () => { + controller.shutdown(); +}); + +add_task(async function test_init_from_secondary_prefs() { + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.unconfigured + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kKeepPermissionInMemory, true); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.total_clearing, + "After pref controller init from unconfigured state, primary pref should be set to total clearing due to the way secondary prefs were set earlier" + ); + + controller.shutdown(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.unconfigured + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.selective_saving, + "After pref controller init from unconfigured state, primary pref should be set to selective saving due to the way secondary prefs were set earlier" + ); + + controller.shutdown(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.unconfigured + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.normal_browsing, + "After pref controller init from unconfigured state, primary pref should be set to normal browsing due to the way secondary prefs were set earlier" + ); + + controller.shutdown(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.unconfigured + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + "After pref controller init from unconfigured state, primary pref should be set to custom browsing due to the way secondary prefs were set earlier" + ); + + controller.shutdown(); +}); + +add_task(async function test_init_from_secondary_prefs() { + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.total_clearing + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kKeepPermissionInMemory, true); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.total_clearing, + "After pref controller init from total clearing mode configured state (primary and secondary), primary pref shouldn't be changed from total clearing" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + true, + "After pref controller init from total clearing mode configured state (primary and secondary), secondary pref for sanitize on shutdown should be set to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + true, + "After pref controller init from total clearing mode configured state (primary and secondary), secondary pref for pbm autostart should be set to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + true, + "After pref controller init from total clearing mode configured state (primary and secondary), secondary pref for memory only permissions should be set to true" + ); + + controller.shutdown(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.selective_saving + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.selective_saving, + "After pref controller init from selective saving configured state (primary and secondary), primary pref shouldn't be changed from selective saving" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + true, + "After pref controller init from selective saving mode configured state (primary and secondary), secondary pref for sanitize on shutdown should be set to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + false, + "After pref controller init from selective saving mode configured state (primary and secondary), secondary pref for pbm autostart should be set to false" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + false, + "After pref controller init from selective saving mode configured state (primary and secondary), secondary pref for memory only permissions should be set to false" + ); + + controller.shutdown(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.normal_browsing + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.normal_browsing, + "After pref controller init from normal browsing mode configured state (primary and secondary), primary pref shouldn't be changed from normal browsing" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + false, + "After pref controller init from normal browsing mode configured state (primary and secondary), secondary pref for sanitize on shutdown should be set to false" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + false, + "After pref controller init from normal browsing mode configured state (primary and secondary), secondary pref for pbm autostart should be set to false" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + false, + "After pref controller init from normal browsing mode configured state (primary and secondary), secondary pref for memory only permissions should be set to false" + ); + + controller.shutdown(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.custom + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + "After pref controller init from custom mode configured state (primary and secondary), primary pref shouldn't be changed from custom" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + true, + "After pref contoller init from total clearing mode configured state (primary and secondary), secondary pref for sanitize on shutdown should be set to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + true, + "After pref contoller init from total clearing mode configured state (primary and secondary), secondary pref for pbm autostart should be set to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + false, + "After pref contoller init from total clearing mode configured state (primary and secondary), secondary pref for memory only permissions should be set to false" + ); + + controller.shutdown(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.total_clearing + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.total_clearing, + "After pref controller init from configured state, primary pref shouldn't be changed from total clearing" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + true, + "After pref contoller init from total clearing mode configured state, secondary pref for sanitize on shutdown should be set to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + true, + "After pref contoller init from total clearing mode configured state, secondary pref for pbm autostart should be set to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + true, + "After pref contoller init from total clearing mode configured state, secondary pref for memory only permissions should be set to true" + ); + + controller.shutdown(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.selective_saving + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.selective_saving, + "After pref controller init from configured state, primary pref shouldn't be changed from normal browsing" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + true, + "After pref contoller init from selective saving mode configured state, secondary pref for sanitize on shutdown should be set to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + false, + "After pref contoller init from selective saving mode configured state, secondary pref for pbm autostart should be set to false" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + false, + "After pref contoller init from selective saving mode configured state, secondary pref for memory only permissions should be set to false" + ); + + controller.shutdown(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.normal_browsing + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kKeepPermissionInMemory, true); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.normal_browsing, + "After pref controller init from configured state, primary pref shouldn't be changed from normal browsing" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + false, + "After pref contoller init from normal browsing mode configured state, secondary pref for sanitize on shutdown should be set to false" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + false, + "After pref contoller init from normal browsing mode configured state, secondary pref for pbm autostart should be set to false" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + false, + "After pref contoller init from normal browsing mode configured state, secondary pref for memory only permissions should be set to false" + ); + + controller.shutdown(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.custom + ); + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + controller.init(); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + "After pref controller init from configured state, primary pref shouldn't be changed from custom" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + false, + "After pref contoller init from custom mode configured state, secondary pref for sanitize on shutdown should remain unchanged" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + false, + "After pref contoller init from custom mode configured state, secondary pref for pbm autostart should remain unchanged" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + false, + "After pref contoller init from custom mode configured state, secondary pref for memory only permissions should remain unchanged" + ); +}); + +add_task(async function test_secondary_prefs_update_mode() { + controller.init(); + + Services.prefs.setBoolPref(kKeepPermissionInMemory, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.total_clearing, + "After pref update mode should be set to total clearing" + ); + + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.selective_saving, + "After pref update mode should be set to selective saving" + ); + + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.normal_browsing, + "After pref update mode should be set to normal browsing" + ); + + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.normal_browsing, + "Duplicate for idempotency. after pref update mode should be set to normal browsing" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + false, + "Duplicate for idempotency. Changing browsing mode to normal browsing should set sanitize on shutdown to false" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + false, + "Duplicate for idempotency. Changing browsing mode to normal browsing should set pbm autostart to false" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + false, + "Duplicate for idempotency. Changing browsing mode to normal browsing should set memory only permissions to false" + ); + + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + "After pref update mode should be set to custom" + ); + + resetToTotalSavingPrefs(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.custom + ); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.selective_saving, + "Manually changing to custom browsing via primary pref then changing secondary prefs to match another browsing mode should leave custom browsing" + ); + + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + "Secondary Prefs set to (true, true, false) should result in Custom Browsing Mode" + ); + + Services.prefs.setBoolPref(kSanitizeOnShutdown, true); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kKeepPermissionInMemory, true); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + "Secondary Prefs set to (true, false, true) should result in Custom Browsing Mode" + ); + + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kKeepPermissionInMemory, true); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + "Secondary Prefs set to (false, false, true) should result in Custom Browsing Mode" + ); + + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + "Secondary Prefs set to (false, true, false) should result in Custom Browsing Mode" + ); + + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, true); + Services.prefs.setBoolPref(kKeepPermissionInMemory, true); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + "Secondary Prefs set to (false, true, true) should result in Custom Browsing Mode" + ); +}); + +add_task(async function test_mode_updates_from_secondary_prefs() { + controller.init(); + + Services.prefs.setBoolPref(kKeepPermissionInMemory, false); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, false); + Services.prefs.setBoolPref(kSanitizeOnShutdown, false); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.total_clearing + ); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.total_clearing, + "Changing browsing mode to total clearing should set browsing mode to match" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + true, + "Changing browsing mode to total clearing should set sanitize on shutdown to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + true, + "Changing browsing mode to total clearing should set pbm autostart to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + true, + "Changing browsing mode to total clearing should set memory only permissions to true" + ); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.total_clearing + ); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.total_clearing, + "Duplicate for idempotency. Changing browsing mode to total clearing should set browsing mode to match" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + true, + "Duplicate for idempotency. Changing browsing mode to total clearing should set sanitize on shutdown to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + true, + "Duplicate for idempotency. Changing browsing mode to total clearing should set pbm autostart to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + true, + "Duplicate for idempotency. Changing browsing mode to total clearing should set memory only permissions to true" + ); + + resetToTotalSavingPrefs(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.selective_saving + ); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.selective_saving, + "Changing browsing mode to selective saving should set browsing mode to match" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + true, + "Changing browsing mode to selective saving should set sanitize on shutdown to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + false, + "Changing browsing mode to selective saving should set pbm autostart to false" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + false, + "Changing browsing mode to selective saving should set memory only permissions to false" + ); + + resetToTotalSavingPrefs(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.normal_browsing + ); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.normal_browsing, + "Changing browsing mode to normal browsing should set browsing mode to match" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + false, + "Changing browsing mode to normal browsing should set sanitize on shutdown to true" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + false, + "Changing browsing mode to normal browsing should set pbm autostart to false" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + false, + "Changing browsing mode to normal browsing should set memory only permissions to false" + ); + + resetToTotalSavingPrefs(); + + for (const sanitize of [false, true]) { + for (const pbmAutostart of [false, true]) { + for (const permissions of [false, true]) { + Services.prefs.setBoolPref(kSanitizeOnShutdown, sanitize); + Services.prefs.setBoolPref(kPrivateBrowsingAutostart, pbmAutostart); + Services.prefs.setBoolPref(kKeepPermissionInMemory, permissions); + + if (sanitize && pbmAutostart && permissions) { + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.total_clearing, + "pref settings for true true true should result in total clearing" + ); + } else if (sanitize && !pbmAutostart && !permissions) { + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.selective_saving, + "pref settings for true false false should result in selective saving" + ); + } else if (!sanitize && !pbmAutostart && !permissions) { + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.normal_browsing, + "pref settings for false false false should result in normal browsing" + ); + } else { + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + `pref settings of ${sanitize} ${pbmAutostart} ${permissions} should result in custom browsing` + ); + } + } + } + } + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.custom + ); + + Assert.equal( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.custom, + "Manually changing to custom browsing via primary pref should happen regardless of secondary prefs" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + true, + "Changing browsing mode to custom should leave sanitize on shutdown as previously set" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + true, + "Changing browsing mode to custom should leave pbm autostart as previously set" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + true, + "Changing browsing mode to custom should leave memory only permissions as previously set" + ); + + resetToTotalSavingPrefs(); + + Services.prefs.setIntPref( + kSelectiveSavingModePref, + SelectiveSavingModes.unconfigured + ); + + Assert.notEqual( + Services.prefs.getIntPref(kSelectiveSavingModePref), + SelectiveSavingModes.unconfigured, + "Manually changing to unconfigured mode via primary pref should set primary pref based on secondary prefs" + ); + + Assert.equal( + Services.prefs.getBoolPref(kSanitizeOnShutdown), + true, + "Changing browsing mode to unconfigured should leave sanitize on shutdown as previously set" + ); + + Assert.equal( + Services.prefs.getBoolPref(kPrivateBrowsingAutostart), + true, + "Changing browsing mode to unconfigured should leave pbm autostart to true as previously set" + ); + + Assert.equal( + Services.prefs.getBoolPref(kKeepPermissionInMemory), + true, + "Changing browsing mode to unconfigured should leave memory only permissions to true as previously set" + ); +}); ===================================== toolkit/components/selectivesavingmode/tests/xpcshell/xpcshell.toml ===================================== @@ -0,0 +1,7 @@ +[DEFAULT] +tags = "mullvad" +prefs = [ + "browser.selectiveSavingMode.enabled=true" +] + +["test_selective_saving_mode.js"] View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/59b… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/59b… 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
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] fixup! [android] Disable features and functionality
by Dan Ballard (@dan) 10 Aug '26

10 Aug '26
Dan Ballard pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 5fac2896 by clairehurst at 2026-08-10T14:56:50-07:00 fixup! [android] Disable features and functionality Bug 45098: Remove share link button - - - - - 3 changed files: - mobile/android/android-components/components/compose/browser-toolbar/src/main/java/mozilla/components/compose/browser/toolbar/ActionContainer.kt - mobile/android/android-components/components/compose/browser-toolbar/src/main/java/mozilla/components/compose/browser/toolbar/concept/Action.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt Changes: ===================================== mobile/android/android-components/components/compose/browser-toolbar/src/main/java/mozilla/components/compose/browser/toolbar/ActionContainer.kt ===================================== @@ -37,6 +37,8 @@ import mozilla.components.compose.browser.toolbar.ui.TabCounter import mozilla.components.compose.browser.toolbar.ui.ActionButton as ActionButtonComposable import mozilla.components.ui.icons.R as iconsR +import mozilla.components.compose.browser.toolbar.concept.NoopAction + /** * A container for displaying [Action]s. * @@ -122,6 +124,8 @@ fun ActionContainer( ) } } + + else -> NoopAction() } } } ===================================== mobile/android/android-components/components/compose/browser-toolbar/src/main/java/mozilla/components/compose/browser/toolbar/concept/Action.kt ===================================== @@ -189,3 +189,5 @@ sealed class Action { val onClick: BrowserToolbarInteraction, ) : Action() } + +class NoopAction : Action() ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt ===================================== @@ -143,6 +143,8 @@ import mozilla.components.lib.state.Action as MVIAction import mozilla.components.ui.icons.R as iconsR import mozilla.components.ui.tabcounter.R as tabcounterR +import mozilla.components.compose.browser.toolbar.concept.NoopAction + @VisibleForTesting internal sealed class DisplayActions(override val source: Source) : BrowserToolbarEvent { data class MenuClicked(override val source: Source) : DisplayActions(source) @@ -1318,17 +1320,13 @@ class BrowserToolbarMiddleware( ) } - ToolbarAction.Share -> ActionButtonRes( - drawableResId = iconsR.drawable.mozac_ic_share_android_24, - contentDescription = R.string.browser_menu_share, - onClick = ShareClicked(source), - ) - ToolbarAction.Homepage -> ActionButtonRes( drawableResId = iconsR.drawable.mozac_ic_home_24, contentDescription = R.string.browser_menu_homepage, onClick = HomepageClicked(source), ) + + else -> NoopAction() } private fun buildSiteInfoAction( View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/5fac289… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/5fac289… 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
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-153.0esr-16.0-1] 2 commits: fixup! BB 41916: Letterboxing preferences UI
by morgan (@morgan) 10 Aug '26

10 Aug '26
morgan pushed to branch mullvad-browser-153.0esr-16.0-1 at The Tor Project / Applications / Mullvad Browser Commits: 37b63f8b by Henry Wilkes at 2026-08-10T16:39:30+00:00 fixup! BB 41916: Letterboxing preferences UI BB 45079: Move letterboxing controls into appearance settings. - - - - - 74547cf2 by Henry Wilkes at 2026-08-10T16:39:35+00:00 fixup! Base Browser strings BB 45079: Combine letterboxing setting strings together. - - - - - 8 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 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 */ @@ -834,6 +833,7 @@ var gMainPane = { initSettingGroup("tabs"); initSettingGroup("profiles"); initSettingGroup("profilePane"); + initSettingGroup("letterboxing"); setEventListener("manageBrowserLanguagesButton", "command", function () { gMainPane.showBrowserLanguagesSubDialog({ search: false }); @@ -850,8 +850,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 ===================================== @@ -244,7 +244,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 = View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/b0… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/b0… 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
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] 3 commits: fixup! BB 41916: Letterboxing preferences UI
by morgan (@morgan) 10 Aug '26

10 Aug '26
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/492c55… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/492c55… 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
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • ...
  • 2088
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.