henry pushed to branch mullvad-browser-150.0a1-16.0-2 at The Tor Project / Applications / Mullvad Browser
Commits:
-
be8738c3
by Henry Wilkes at 2026-05-06T11:18:56+01:00
-
e63b568b
by Henry Wilkes at 2026-05-06T11:18:57+01:00
-
38da32fb
by Henry Wilkes at 2026-05-06T11:18:58+01:00
-
51a082c1
by Henry Wilkes at 2026-05-06T11:18:59+01:00
-
32a0cff7
by Henry Wilkes at 2026-05-06T11:19:00+01:00
-
7d2243b5
by Henry Wilkes at 2026-05-06T11:19:49+01:00
4 changed files:
- browser/components/preferences/main.inc.xhtml
- browser/components/preferences/main.js
- browser/components/preferences/privacy.inc.xhtml
- browser/components/preferences/privacy.js
Changes:
| ... | ... | @@ -50,7 +50,7 @@ |
| 50 | 50 | </hbox>
|
| 51 | 51 | |
| 52 | 52 | <!-- Website appearance -->
|
| 53 | -<html:setting-group groupid="appearance" data-category="paneGeneral" hidden="true" data-hidden-from-search="true"></html:setting-group>
|
|
| 53 | +<html:setting-group groupid="appearance" data-category="paneGeneral" hidden="true"></html:setting-group>
|
|
| 54 | 54 | |
| 55 | 55 | <!-- Colors -->
|
| 56 | 56 | <html:setting-group id="contrastControlGroup" groupid="contrast" data-category="paneGeneral" hidden="true" />
|
| ... | ... | @@ -78,6 +78,10 @@ function canShowAiFeature(featureSetting, defaultSetting) { |
| 78 | 78 | }
|
| 79 | 79 | |
| 80 | 80 | Preferences.addAll([
|
| 81 | + // Rather than add "privacy.resistFingerprinting" in privacy.js, we add it
|
|
| 82 | + // early so we can define the "resistFingerprinting" `Setting` in this file.
|
|
| 83 | + // See below. See tor-browser#44630.
|
|
| 84 | + { id: "privacy.resistFingerprinting", type: "bool" },
|
|
| 81 | 85 | // Startup
|
| 82 | 86 | { id: "browser.startup.page", type: "int" },
|
| 83 | 87 | { id: "browser.startup.windowsLaunchOnLogin.enabled", type: "bool" },
|
| ... | ... | @@ -273,6 +277,18 @@ if (AppConstants.MOZ_UPDATER) { |
| 273 | 277 | }
|
| 274 | 278 | }
|
| 275 | 279 | |
| 280 | +// Rather than add "resistFingerprinting" in privacy.js, we add it to the
|
|
| 281 | +// settings early so we can have it be part of the setting config's `deps` field
|
|
| 282 | +// early. See tor-browser#44630.
|
|
| 283 | +// In particular, `Setting.deps` is lazy set. For many settings, this will only
|
|
| 284 | +// be set *after* all settings have been added. However, for settings with a
|
|
| 285 | +// `setup` field, the `deps` value will be set during construction, so we need
|
|
| 286 | +// the corresponding dependency available prior to construction.
|
|
| 287 | +Preferences.addSetting({
|
|
| 288 | + id: "resistFingerprinting",
|
|
| 289 | + pref: "privacy.resistFingerprinting",
|
|
| 290 | +});
|
|
| 291 | + |
|
| 276 | 292 | Preferences.addSetting({
|
| 277 | 293 | id: "privateBrowsingAutoStart",
|
| 278 | 294 | pref: "browser.privatebrowsing.autostart",
|
| ... | ... | @@ -482,6 +498,12 @@ Preferences.addSetting({ |
| 482 | 498 | Preferences.addSetting({
|
| 483 | 499 | id: "useSmoothScrolling",
|
| 484 | 500 | pref: "general.smoothScroll",
|
| 501 | + deps: ["resistFingerprinting"],
|
|
| 502 | + visible: ({ resistFingerprinting }) => {
|
|
| 503 | + // Hide "smooth scrolling" when using resist fingerprinting (RFP) because
|
|
| 504 | + // the preference should be ignored. tor-browser#42070.
|
|
| 505 | + return !resistFingerprinting.value;
|
|
| 506 | + },
|
|
| 485 | 507 | });
|
| 486 | 508 | |
| 487 | 509 | Preferences.addSetting({
|
| ... | ... | @@ -560,6 +582,11 @@ Preferences.addSetting({ |
| 560 | 582 | Preferences.addSetting({
|
| 561 | 583 | id: "alwaysUnderlineLinks",
|
| 562 | 584 | pref: "layout.css.always_underline_links",
|
| 585 | + // Hide "always underline links" because it can be used for fingerprinting. At
|
|
| 586 | + // the time of implementation, this is the case with or without RFP, so we
|
|
| 587 | + // hide this unconditionally.
|
|
| 588 | + // tor-browser#43117.
|
|
| 589 | + visible: () => false,
|
|
| 563 | 590 | });
|
| 564 | 591 | Preferences.addSetting({
|
| 565 | 592 | id: "searchStartTyping",
|
| ... | ... | @@ -618,10 +645,14 @@ Preferences.addSetting({ |
| 618 | 645 | Preferences.addSetting({
|
| 619 | 646 | id: "cfrRecommendations",
|
| 620 | 647 | pref: "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons",
|
| 648 | + // Hide feature recommendation (CFR). tor-browser#43118.
|
|
| 649 | + visible: () => false,
|
|
| 621 | 650 | });
|
| 622 | 651 | Preferences.addSetting({
|
| 623 | 652 | id: "cfrRecommendations-features",
|
| 624 | 653 | pref: "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features",
|
| 654 | + // Hide feature recommendation (CFR). tor-browser#43118.
|
|
| 655 | + visible: () => false,
|
|
| 625 | 656 | });
|
| 626 | 657 | |
| 627 | 658 | Preferences.addSetting({
|
| ... | ... | @@ -687,11 +718,17 @@ Preferences.addSetting({ |
| 687 | 718 | });
|
| 688 | 719 | Preferences.addSetting({
|
| 689 | 720 | id: "web-appearance-override-warning",
|
| 721 | + deps: ["resistFingerprinting"],
|
|
| 690 | 722 | setup: emitChange => {
|
| 691 | 723 | FORCED_COLORS_QUERY.addEventListener("change", emitChange);
|
| 692 | 724 | return () => FORCED_COLORS_QUERY.removeEventListener("change", emitChange);
|
| 693 | 725 | },
|
| 694 | - visible: () => {
|
|
| 726 | + visible: ({ resistFingerprinting }) => {
|
|
| 727 | + // Hide web appearance settings when using resist fingerprinting (RFP).
|
|
| 728 | + // tor-browser#41739.
|
|
| 729 | + if (resistFingerprinting.value) {
|
|
| 730 | + return false;
|
|
| 731 | + }
|
|
| 695 | 732 | return FORCED_COLORS_QUERY.matches;
|
| 696 | 733 | },
|
| 697 | 734 | });
|
| ... | ... | @@ -701,6 +738,12 @@ Preferences.addSetting( |
| 701 | 738 | id: "web-appearance-chooser",
|
| 702 | 739 | themeNames: ["dark", "light", "auto"],
|
| 703 | 740 | pref: "layout.css.prefers-color-scheme.content-override",
|
| 741 | + deps: ["resistFingerprinting"],
|
|
| 742 | + visible: ({ resistFingerprinting }) => {
|
|
| 743 | + // Hide web appearance settings when using resist fingerprinting (RFP).
|
|
| 744 | + // tor-browser#41739.
|
|
| 745 | + return !resistFingerprinting.value;
|
|
| 746 | + },
|
|
| 704 | 747 | setup(emitChange) {
|
| 705 | 748 | Services.obs.addObserver(emitChange, "look-and-feel-changed");
|
| 706 | 749 | return () =>
|
| ... | ... | @@ -733,6 +776,12 @@ Preferences.addSetting( |
| 733 | 776 | |
| 734 | 777 | Preferences.addSetting({
|
| 735 | 778 | id: "web-appearance-manage-themes-link",
|
| 779 | + deps: ["resistFingerprinting"],
|
|
| 780 | + visible: ({ resistFingerprinting }) => {
|
|
| 781 | + // Hide web appearance settings when using resist fingerprinting (RFP).
|
|
| 782 | + // tor-browser#41739.
|
|
| 783 | + return !resistFingerprinting.value;
|
|
| 784 | + },
|
|
| 736 | 785 | onUserClick: e => {
|
| 737 | 786 | e.preventDefault();
|
| 738 | 787 | // @ts-ignore topChromeWindow global
|
| ... | ... | @@ -3166,10 +3215,10 @@ SettingGroupManager.registerGroups({ |
| 3166 | 3215 | id: "useAutoScroll",
|
| 3167 | 3216 | l10nId: "browsing-use-autoscroll",
|
| 3168 | 3217 | },
|
| 3169 | - // {
|
|
| 3170 | - // id: "useSmoothScrolling",
|
|
| 3171 | - // l10nId: "browsing-use-smooth-scrolling",
|
|
| 3172 | - // },
|
|
| 3218 | + {
|
|
| 3219 | + id: "useSmoothScrolling",
|
|
| 3220 | + l10nId: "browsing-use-smooth-scrolling",
|
|
| 3221 | + },
|
|
| 3173 | 3222 | {
|
| 3174 | 3223 | id: "useOverlayScrollbars",
|
| 3175 | 3224 | l10nId: "browsing-gtk-use-non-overlay-scrollbars",
|
| ... | ... | @@ -3186,10 +3235,10 @@ SettingGroupManager.registerGroups({ |
| 3186 | 3235 | id: "useFullKeyboardNavigation",
|
| 3187 | 3236 | l10nId: "browsing-use-full-keyboard-navigation",
|
| 3188 | 3237 | },
|
| 3189 | - // {
|
|
| 3190 | - // id: "alwaysUnderlineLinks",
|
|
| 3191 | - // l10nId: "browsing-always-underline-links",
|
|
| 3192 | - // },
|
|
| 3238 | + {
|
|
| 3239 | + id: "alwaysUnderlineLinks",
|
|
| 3240 | + l10nId: "browsing-always-underline-links",
|
|
| 3241 | + },
|
|
| 3193 | 3242 | {
|
| 3194 | 3243 | id: "searchStartTyping",
|
| 3195 | 3244 | l10nId: "browsing-search-on-start-typing",
|
| ... | ... | @@ -3210,18 +3259,18 @@ SettingGroupManager.registerGroups({ |
| 3210 | 3259 | l10nId: "browsing-media-control",
|
| 3211 | 3260 | supportPage: "media-keyboard-control",
|
| 3212 | 3261 | },
|
| 3213 | - // {
|
|
| 3214 | - // id: "cfrRecommendations",
|
|
| 3215 | - // l10nId: "browsing-cfr-recommendations",
|
|
| 3216 | - // supportPage: "extensionrecommendations",
|
|
| 3217 | - // subcategory: "cfraddons",
|
|
| 3218 | - // },
|
|
| 3219 | - // {
|
|
| 3220 | - // id: "cfrRecommendations-features",
|
|
| 3221 | - // l10nId: "browsing-cfr-features",
|
|
| 3222 | - // supportPage: "extensionrecommendations",
|
|
| 3223 | - // subcategory: "cfrfeatures",
|
|
| 3224 | - // },
|
|
| 3262 | + {
|
|
| 3263 | + id: "cfrRecommendations",
|
|
| 3264 | + l10nId: "browsing-cfr-recommendations",
|
|
| 3265 | + supportPage: "extensionrecommendations",
|
|
| 3266 | + subcategory: "cfraddons",
|
|
| 3267 | + },
|
|
| 3268 | + {
|
|
| 3269 | + id: "cfrRecommendations-features",
|
|
| 3270 | + l10nId: "browsing-cfr-features",
|
|
| 3271 | + supportPage: "extensionrecommendations",
|
|
| 3272 | + subcategory: "cfrfeatures",
|
|
| 3273 | + },
|
|
| 3225 | 3274 | {
|
| 3226 | 3275 | id: "linkPreviewEnabled",
|
| 3227 | 3276 | l10nId: "link-preview-settings-enable",
|
| ... | ... | @@ -3812,6 +3861,21 @@ SettingGroupManager.registerGroups({ |
| 3812 | 3861 | },
|
| 3813 | 3862 | ],
|
| 3814 | 3863 | },
|
| 3864 | + // Hide the payments and addresses settings. tor-browser#44460.
|
|
| 3865 | + // NOTE: "payments" and "addresses" are usually configured in
|
|
| 3866 | + // FormAutofillPreferences.sys.mjs. But this never runs because the "autofill"
|
|
| 3867 | + // extension is excluded from the build. So we configure them ourselves with
|
|
| 3868 | + // an empty config. See tor-browser#44630.
|
|
| 3869 | + payments: {
|
|
| 3870 | + hidden: true,
|
|
| 3871 | + hiddenFromSearch: true,
|
|
| 3872 | + items: [],
|
|
| 3873 | + },
|
|
| 3874 | + addresses: {
|
|
| 3875 | + hidden: true,
|
|
| 3876 | + hiddenFromSearch: true,
|
|
| 3877 | + items: [],
|
|
| 3878 | + },
|
|
| 3815 | 3879 | history: {
|
| 3816 | 3880 | l10nId: "history-group",
|
| 3817 | 3881 | headingLevel: 2,
|
| ... | ... | @@ -393,7 +393,7 @@ |
| 393 | 393 | </vbox>
|
| 394 | 394 | </vbox>
|
| 395 | 395 | </groupbox>
|
| 396 | -<html:setting-group id="nonTechnicalPrivacyGroup" groupid="nonTechnicalPrivacy" data-category="panePrivacy" data-hidden-from-search="true" hidden="true" data-srd-groupid="nonTechnicalPrivacy2"/>
|
|
| 396 | +<html:setting-group id="nonTechnicalPrivacyGroup" groupid="nonTechnicalPrivacy" data-category="panePrivacy" hidden="true" data-srd-groupid="nonTechnicalPrivacy2"/>
|
|
| 397 | 397 | <html:setting-group groupid="nonTechnicalPrivacy2" data-category="panePrivacy" hidden="true"/>
|
| 398 | 398 | |
| 399 | 399 | <!-- Firefox VPN - IP Protection -->
|
| ... | ... | @@ -554,13 +554,8 @@ |
| 554 | 554 | |
| 555 | 555 | <html:setting-group groupid="passwords" hidden="true" data-category="panePrivacy" />
|
| 556 | 556 | |
| 557 | -<!-- groupid="payments" and groupid="addresses" are configured by
|
|
| 558 | - - FormAutofillPreferences.sys.mjs via FormAutofillStatus. But since the
|
|
| 559 | - - "autofill" extension is excluded from the build, FormAutofillStatus is
|
|
| 560 | - - never initialised. So we add the would-be data-hidden-* attributes
|
|
| 561 | - - explicitly here instead. See tor-browser#44460. -->
|
|
| 562 | -<html:setting-group data-category="panePrivacy" data-subcategory="payment-methods-autofill credit-card-autofill" groupid="payments" data-group="formAutofill" hidden="true" data-hidden-from-search="true" data-hidden-by-setting-group="" />
|
|
| 563 | -<html:setting-group data-category="panePrivacy" data-subcategory="addresses-autofill address-autofill" groupid="addresses" data-group="formAutofill" hidden="true" data-hidden-from-search="true" data-hidden-by-setting-group="" />
|
|
| 557 | +<html:setting-group data-category="panePrivacy" data-subcategory="payment-methods-autofill credit-card-autofill" groupid="payments" data-group="formAutofill" hidden="true" />
|
|
| 558 | +<html:setting-group data-category="panePrivacy" data-subcategory="addresses-autofill address-autofill" groupid="addresses" data-group="formAutofill" hidden="true" />
|
|
| 564 | 559 | |
| 565 | 560 | <!-- History -->
|
| 566 | 561 | <html:setting-group groupid="history" data-category="panePrivacy" hidden="true" data-srd-groupid="history2"/>
|
| ... | ... | @@ -158,7 +158,6 @@ Preferences.addAll([ |
| 158 | 158 | { id: "privacy.fingerprintingProtection.pbmode", type: "bool" },
|
| 159 | 159 | |
| 160 | 160 | // Resist Fingerprinting
|
| 161 | - { id: "privacy.resistFingerprinting", type: "bool" },
|
|
| 162 | 161 | { id: "privacy.resistFingerprinting.pbmode", type: "bool" },
|
| 163 | 162 | |
| 164 | 163 | // Social tracking
|
| ... | ... | @@ -909,12 +908,18 @@ if (SECURITY_PRIVACY_STATUS_CARD_ENABLED) { |
| 909 | 908 | "etpCustomEnabled",
|
| 910 | 909 | ...SECURITY_WARNINGS.map(warning => warning.id),
|
| 911 | 910 | ],
|
| 911 | + // Hide the privacy card. tor-browser#44829.
|
|
| 912 | + visible: () => false,
|
|
| 912 | 913 | });
|
| 913 | 914 | |
| 914 | 915 | Preferences.addSetting({
|
| 915 | 916 | id: "warningCard",
|
| 916 | 917 | deps: SECURITY_WARNINGS.map(warning => warning.id),
|
| 917 | 918 | visible: deps => {
|
| 919 | + // Hide the privacy card's warnings. tor-browser#44829.
|
|
| 920 | + if (AppConstants.BASE_BROWSER_VERSION) {
|
|
| 921 | + return false;
|
|
| 922 | + }
|
|
| 918 | 923 | const count = Object.values(deps).filter(
|
| 919 | 924 | depSetting => depSetting.visible
|
| 920 | 925 | ).length;
|
| ... | ... | @@ -1247,6 +1252,10 @@ Preferences.addSetting({ |
| 1247 | 1252 | pref: "privacy.globalprivacycontrol.enabled",
|
| 1248 | 1253 | deps: ["gpcFunctionalityEnabled"],
|
| 1249 | 1254 | visible: ({ gpcFunctionalityEnabled }) => {
|
| 1255 | + // Hide GPC. tor-browser#42777.
|
|
| 1256 | + if (AppConstants.BASE_BROWSER_VERSION) {
|
|
| 1257 | + return false;
|
|
| 1258 | + }
|
|
| 1250 | 1259 | return gpcFunctionalityEnabled.value;
|
| 1251 | 1260 | },
|
| 1252 | 1261 | });
|
| ... | ... | @@ -1258,6 +1267,13 @@ Preferences.addSetting({ |
| 1258 | 1267 | id: "relayIntegration",
|
| 1259 | 1268 | deps: ["savePasswords", "relayFeature"],
|
| 1260 | 1269 | visible: () => {
|
| 1270 | + // Hide Firefox Relay. tor-browser#43109 and tor-browser#42814.
|
|
| 1271 | + // NOTE: Whilst `FirefoxRelay.isDisabled` is `true` due to preferences we
|
|
| 1272 | + // set for Base Browser, `FirefoxRelay.isAvailable` is also `true` in this
|
|
| 1273 | + // case, hence why we still need to hide this unconditionally.
|
|
| 1274 | + if (AppConstants.BASE_BROWSER_VERSION) {
|
|
| 1275 | + return false;
|
|
| 1276 | + }
|
|
| 1261 | 1277 | return FirefoxRelay.isAvailable;
|
| 1262 | 1278 | },
|
| 1263 | 1279 | disabled: ({ savePasswords, relayFeature }) => {
|
| ... | ... | @@ -2643,6 +2659,8 @@ Preferences.addSetting({ |
| 2643 | 2659 | |
| 2644 | 2660 | Preferences.addSetting({
|
| 2645 | 2661 | id: "etpStatusBoxGroup",
|
| 2662 | + // Hide enhanced tracking protection (ETP). tor-browser#26345.
|
|
| 2663 | + visible: () => false,
|
|
| 2646 | 2664 | });
|
| 2647 | 2665 | |
| 2648 | 2666 | Preferences.addSetting({
|
| ... | ... | @@ -2675,6 +2693,8 @@ Preferences.addSetting({ |
| 2675 | 2693 | |
| 2676 | 2694 | Preferences.addSetting({
|
| 2677 | 2695 | id: "protectionsDashboardLink",
|
| 2696 | + // Hide enhanced tracking protection (ETP). tor-browser#26345.
|
|
| 2697 | + visible: () => false,
|
|
| 2678 | 2698 | });
|
| 2679 | 2699 | |
| 2680 | 2700 | Preferences.addSetting({
|
| ... | ... | @@ -2727,11 +2747,6 @@ Preferences.addSetting({ |
| 2727 | 2747 | },
|
| 2728 | 2748 | });
|
| 2729 | 2749 | |
| 2730 | -Preferences.addSetting({
|
|
| 2731 | - id: "resistFingerprinting",
|
|
| 2732 | - pref: "privacy.resistFingerprinting",
|
|
| 2733 | -});
|
|
| 2734 | - |
|
| 2735 | 2750 | Preferences.addSetting({
|
| 2736 | 2751 | id: "resistFingerprintingPBM",
|
| 2737 | 2752 | pref: "privacy.resistFingerprinting.pbmode",
|
| ... | ... | @@ -3560,6 +3575,12 @@ var gPrivacyPane = { |
| 3560 | 3575 | initSettingGroup("cookiesAndSiteData2");
|
| 3561 | 3576 | initSettingGroup("certificates");
|
| 3562 | 3577 | initSettingGroup("ipprotection");
|
| 3578 | + // NOTE: "payments" and "addresses" are usually initialised by
|
|
| 3579 | + // FormAutofillPreferences.sys.mjs via FormAutofillStatus. But this never
|
|
| 3580 | + // runs because the "autofill" extension is excluded from the build. So we
|
|
| 3581 | + // initialise them ourselves with an empty config. See tor-browser#44630.
|
|
| 3582 | + initSettingGroup("payments");
|
|
| 3583 | + initSettingGroup("addresses");
|
|
| 3563 | 3584 | initSettingGroup("history");
|
| 3564 | 3585 | initSettingGroup("history2");
|
| 3565 | 3586 | initSettingGroup("permissions");
|