tor-commits
Threads by month
- ----- 2025 -----
- 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
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
October 2025
- 2 participants
- 198 discussions
[Git][tpo/applications/mullvad-browser][mullvad-browser-128.14.0esr-14.5-1] fixup! BB 40925: Implemented the Security Level component
by ma1 (@ma1) 15 Oct '25
by ma1 (@ma1) 15 Oct '25
15 Oct '25
ma1 pushed to branch mullvad-browser-128.14.0esr-14.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
accaaaf6 by hackademix at 2025-10-15T15:57:20+02:00
fixup! BB 40925: Implemented the Security Level component
BB 44242: Hand over Security Level's WebAssembly controls to NoScript
- - - - -
1 changed file:
- toolkit/components/securitylevel/SecurityLevel.sys.mjs
Changes:
=====================================
toolkit/components/securitylevel/SecurityLevel.sys.mjs
=====================================
@@ -79,6 +79,7 @@ const max_caps = [
"object",
"other",
"script",
+ "wasm",
"webgl",
"noscript",
];
@@ -259,7 +260,6 @@ var initializeNoScriptControl = () => {
// for each security setting. Note that 2-m and 3-m are identical,
// corresponding to the old 2-medium-high setting. We also separately
// bind NoScript settings to the browser.security_level.security_slider
-// (see noscript-control.js).
/* eslint-disable */
// prettier-ignore
const kSecuritySettings = {
@@ -272,7 +272,9 @@ const kSecuritySettings = {
"gfx.font_rendering.opentype_svg.enabled": [, false, false, false, true ],
"svg.disabled": [, true, false, false, false],
"javascript.options.asmjs": [, false, false, false, true ],
- "javascript.options.wasm": [, false, false, false, true ],
+ // tor-browser#44234, tor-browser#44242: this interferes with the correct
+ // functioning of the browser. So, WASM is also handled by NoScript now.
+ "javascript.options.wasm": [, true, true, true, true ],
};
/* eslint-enable */
@@ -339,16 +341,19 @@ var write_setting_to_prefs = function (settingIndex) {
// security settings matches. Otherwise return null.
var read_setting_from_prefs = function (prefNames) {
prefNames = prefNames || Object.keys(kSecuritySettings);
- for (let settingIndex of [1, 2, 3, 4]) {
+ for (const settingIndex of [1, 2, 3, 4]) {
let possibleSetting = true;
// For the given settingIndex, check if all current pref values
// match the setting.
- for (let prefName of prefNames) {
- if (
- kSecuritySettings[prefName][settingIndex] !==
- Services.prefs.getBoolPref(prefName)
- ) {
+ for (const prefName of prefNames) {
+ const wanted = kSecuritySettings[prefName][settingIndex];
+ const actual = Services.prefs.getBoolPref(prefName);
+ if (wanted !== actual) {
possibleSetting = false;
+ logger.info(
+ `${prefName} does not match level ${settingIndex}: ${actual}, should be ${wanted}!`
+ );
+ break;
}
}
if (possibleSetting) {
@@ -373,7 +378,7 @@ var initializeSecurityPrefs = function () {
if (initializedSecPrefs) {
return;
}
- logger.info("Initializing security-prefs.js");
+ logger.info("Initializing security level");
initializedSecPrefs = true;
const wasCustom = Services.prefs.getBoolPref(kCustomPref, false);
@@ -381,6 +386,21 @@ var initializeSecurityPrefs = function () {
// and it should not be custom.
let desiredIndex = Services.prefs.getIntPref(kSliderPref, 4);
desiredIndex = fixupIndex(desiredIndex);
+
+ if (!(wasCustom && desiredIndex == 4)) {
+ // The current level is non-customized Standard, or
+ // Safer / Safest (either customized or not): the global
+ // javascript.options.wasm pref interferes with the correct
+ // functioning of the browser, so instead we rely on NoScript
+ // to disable WebAssembly now (tor-browser#44234, tor-browser#44242).
+ // We skip flipping in customized Standard, because if its value was
+ // found false under such as circumstance, that would suggest
+ // an intentional user choice we don't want to interfere with.
+ // Unlike other javascript.options.* preferences, this one is safe
+ // to flip without a browser restart because it's checked whenever a
+ // context is created.
+ Services.prefs.setBoolPref("javascript.options.wasm", true);
+ }
// Make sure the user has a set preference user value.
Services.prefs.setIntPref(kSliderPref, desiredIndex);
Services.prefs.setBoolPref(kCustomPref, wasCustom);
@@ -453,7 +473,7 @@ var initializeSecurityPrefs = function () {
});
}
- logger.info("security-prefs.js initialization complete");
+ logger.info("Security level initialization complete");
};
// tor-browser#41460: we changed preference names in 12.0.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/acc…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/acc…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][base-browser-128.14.0esr-14.5-1] fixup! BB 40925: Implemented the Security Level component
by ma1 (@ma1) 15 Oct '25
by ma1 (@ma1) 15 Oct '25
15 Oct '25
ma1 pushed to branch base-browser-128.14.0esr-14.5-1 at The Tor Project / Applications / Tor Browser
Commits:
14084797 by hackademix at 2025-10-15T15:57:13+02:00
fixup! BB 40925: Implemented the Security Level component
BB 44242: Hand over Security Level's WebAssembly controls to NoScript
- - - - -
1 changed file:
- toolkit/components/securitylevel/SecurityLevel.sys.mjs
Changes:
=====================================
toolkit/components/securitylevel/SecurityLevel.sys.mjs
=====================================
@@ -79,6 +79,7 @@ const max_caps = [
"object",
"other",
"script",
+ "wasm",
"webgl",
"noscript",
];
@@ -247,7 +248,6 @@ var initializeNoScriptControl = () => {
// for each security setting. Note that 2-m and 3-m are identical,
// corresponding to the old 2-medium-high setting. We also separately
// bind NoScript settings to the browser.security_level.security_slider
-// (see noscript-control.js).
/* eslint-disable */
// prettier-ignore
const kSecuritySettings = {
@@ -260,7 +260,9 @@ const kSecuritySettings = {
"gfx.font_rendering.opentype_svg.enabled": [, false, false, false, true ],
"svg.disabled": [, true, false, false, false],
"javascript.options.asmjs": [, false, false, false, true ],
- "javascript.options.wasm": [, false, false, false, true ],
+ // tor-browser#44234, tor-browser#44242: this interferes with the correct
+ // functioning of the browser. So, WASM is also handled by NoScript now.
+ "javascript.options.wasm": [, true, true, true, true ],
};
/* eslint-enable */
@@ -327,16 +329,19 @@ var write_setting_to_prefs = function (settingIndex) {
// security settings matches. Otherwise return null.
var read_setting_from_prefs = function (prefNames) {
prefNames = prefNames || Object.keys(kSecuritySettings);
- for (let settingIndex of [1, 2, 3, 4]) {
+ for (const settingIndex of [1, 2, 3, 4]) {
let possibleSetting = true;
// For the given settingIndex, check if all current pref values
// match the setting.
- for (let prefName of prefNames) {
- if (
- kSecuritySettings[prefName][settingIndex] !==
- Services.prefs.getBoolPref(prefName)
- ) {
+ for (const prefName of prefNames) {
+ const wanted = kSecuritySettings[prefName][settingIndex];
+ const actual = Services.prefs.getBoolPref(prefName);
+ if (wanted !== actual) {
possibleSetting = false;
+ logger.info(
+ `${prefName} does not match level ${settingIndex}: ${actual}, should be ${wanted}!`
+ );
+ break;
}
}
if (possibleSetting) {
@@ -361,7 +366,7 @@ var initializeSecurityPrefs = function () {
if (initializedSecPrefs) {
return;
}
- logger.info("Initializing security-prefs.js");
+ logger.info("Initializing security level");
initializedSecPrefs = true;
const wasCustom = Services.prefs.getBoolPref(kCustomPref, false);
@@ -369,6 +374,21 @@ var initializeSecurityPrefs = function () {
// and it should not be custom.
let desiredIndex = Services.prefs.getIntPref(kSliderPref, 4);
desiredIndex = fixupIndex(desiredIndex);
+
+ if (!(wasCustom && desiredIndex == 4)) {
+ // The current level is non-customized Standard, or
+ // Safer / Safest (either customized or not): the global
+ // javascript.options.wasm pref interferes with the correct
+ // functioning of the browser, so instead we rely on NoScript
+ // to disable WebAssembly now (tor-browser#44234, tor-browser#44242).
+ // We skip flipping in customized Standard, because if its value was
+ // found false under such as circumstance, that would suggest
+ // an intentional user choice we don't want to interfere with.
+ // Unlike other javascript.options.* preferences, this one is safe
+ // to flip without a browser restart because it's checked whenever a
+ // context is created.
+ Services.prefs.setBoolPref("javascript.options.wasm", true);
+ }
// Make sure the user has a set preference user value.
Services.prefs.setIntPref(kSliderPref, desiredIndex);
Services.prefs.setBoolPref(kCustomPref, wasCustom);
@@ -441,7 +461,7 @@ var initializeSecurityPrefs = function () {
});
}
- logger.info("security-prefs.js initialization complete");
+ logger.info("Security level initialization complete");
};
// tor-browser#41460: we changed preference names in 12.0.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/1408479…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/1408479…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-128.14.0esr-14.5-1] fixup! BB 40925: Implemented the Security Level component
by ma1 (@ma1) 15 Oct '25
by ma1 (@ma1) 15 Oct '25
15 Oct '25
ma1 pushed to branch tor-browser-128.14.0esr-14.5-1 at The Tor Project / Applications / Tor Browser
Commits:
19fc83ce by hackademix at 2025-10-15T15:57:05+02:00
fixup! BB 40925: Implemented the Security Level component
BB 44242: Hand over Security Level's WebAssembly controls to NoScript
- - - - -
1 changed file:
- toolkit/components/securitylevel/SecurityLevel.sys.mjs
Changes:
=====================================
toolkit/components/securitylevel/SecurityLevel.sys.mjs
=====================================
@@ -79,6 +79,7 @@ const max_caps = [
"object",
"other",
"script",
+ "wasm",
"webgl",
"noscript",
];
@@ -247,7 +248,6 @@ var initializeNoScriptControl = () => {
// for each security setting. Note that 2-m and 3-m are identical,
// corresponding to the old 2-medium-high setting. We also separately
// bind NoScript settings to the browser.security_level.security_slider
-// (see noscript-control.js).
/* eslint-disable */
// prettier-ignore
const kSecuritySettings = {
@@ -260,7 +260,9 @@ const kSecuritySettings = {
"gfx.font_rendering.opentype_svg.enabled": [, false, false, false, true ],
"svg.disabled": [, true, false, false, false],
"javascript.options.asmjs": [, false, false, false, true ],
- "javascript.options.wasm": [, false, false, false, true ],
+ // tor-browser#44234, tor-browser#44242: this interferes with the correct
+ // functioning of the browser. So, WASM is also handled by NoScript now.
+ "javascript.options.wasm": [, true, true, true, true ],
};
/* eslint-enable */
@@ -327,16 +329,19 @@ var write_setting_to_prefs = function (settingIndex) {
// security settings matches. Otherwise return null.
var read_setting_from_prefs = function (prefNames) {
prefNames = prefNames || Object.keys(kSecuritySettings);
- for (let settingIndex of [1, 2, 3, 4]) {
+ for (const settingIndex of [1, 2, 3, 4]) {
let possibleSetting = true;
// For the given settingIndex, check if all current pref values
// match the setting.
- for (let prefName of prefNames) {
- if (
- kSecuritySettings[prefName][settingIndex] !==
- Services.prefs.getBoolPref(prefName)
- ) {
+ for (const prefName of prefNames) {
+ const wanted = kSecuritySettings[prefName][settingIndex];
+ const actual = Services.prefs.getBoolPref(prefName);
+ if (wanted !== actual) {
possibleSetting = false;
+ logger.info(
+ `${prefName} does not match level ${settingIndex}: ${actual}, should be ${wanted}!`
+ );
+ break;
}
}
if (possibleSetting) {
@@ -361,7 +366,7 @@ var initializeSecurityPrefs = function () {
if (initializedSecPrefs) {
return;
}
- logger.info("Initializing security-prefs.js");
+ logger.info("Initializing security level");
initializedSecPrefs = true;
const wasCustom = Services.prefs.getBoolPref(kCustomPref, false);
@@ -369,6 +374,21 @@ var initializeSecurityPrefs = function () {
// and it should not be custom.
let desiredIndex = Services.prefs.getIntPref(kSliderPref, 4);
desiredIndex = fixupIndex(desiredIndex);
+
+ if (!(wasCustom && desiredIndex == 4)) {
+ // The current level is non-customized Standard, or
+ // Safer / Safest (either customized or not): the global
+ // javascript.options.wasm pref interferes with the correct
+ // functioning of the browser, so instead we rely on NoScript
+ // to disable WebAssembly now (tor-browser#44234, tor-browser#44242).
+ // We skip flipping in customized Standard, because if its value was
+ // found false under such as circumstance, that would suggest
+ // an intentional user choice we don't want to interfere with.
+ // Unlike other javascript.options.* preferences, this one is safe
+ // to flip without a browser restart because it's checked whenever a
+ // context is created.
+ Services.prefs.setBoolPref("javascript.options.wasm", true);
+ }
// Make sure the user has a set preference user value.
Services.prefs.setIntPref(kSliderPref, desiredIndex);
Services.prefs.setBoolPref(kCustomPref, wasCustom);
@@ -441,7 +461,7 @@ var initializeSecurityPrefs = function () {
});
}
- logger.info("security-prefs.js initialization complete");
+ logger.info("Security level initialization complete");
};
// tor-browser#41460: we changed preference names in 12.0.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/19fc83c…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/19fc83c…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/mullvad-browser][mullvad-browser-140.4.0esr-15.0-1] fixup! BB 40925: Implemented the Security Level component
by ma1 (@ma1) 15 Oct '25
by ma1 (@ma1) 15 Oct '25
15 Oct '25
ma1 pushed to branch mullvad-browser-140.4.0esr-15.0-1 at The Tor Project / Applications / Mullvad Browser
Commits:
42b098c7 by hackademix at 2025-10-15T15:56:42+02:00
fixup! BB 40925: Implemented the Security Level component
BB 44242: Hand over Security Level's WebAssembly controls to NoScript
- - - - -
1 changed file:
- toolkit/components/securitylevel/SecurityLevel.sys.mjs
Changes:
=====================================
toolkit/components/securitylevel/SecurityLevel.sys.mjs
=====================================
@@ -79,6 +79,7 @@ const max_caps = [
"object",
"other",
"script",
+ "wasm",
"webgl",
"noscript",
];
@@ -259,7 +260,6 @@ var initializeNoScriptControl = () => {
// for each security setting. Note that 2-m and 3-m are identical,
// corresponding to the old 2-medium-high setting. We also separately
// bind NoScript settings to the browser.security_level.security_slider
-// (see noscript-control.js).
/* eslint-disable */
// prettier-ignore
const kSecuritySettings = {
@@ -272,7 +272,9 @@ const kSecuritySettings = {
"gfx.font_rendering.opentype_svg.enabled": [, false, false, false, true ],
"svg.disabled": [, true, false, false, false],
"javascript.options.asmjs": [, false, false, false, true ],
- "javascript.options.wasm": [, false, false, false, true ],
+ // tor-browser#44234, tor-browser#44242: this interferes with the correct
+ // functioning of the browser. So, WASM is also handled by NoScript now.
+ "javascript.options.wasm": [, true, true, true, true ],
};
/* eslint-enable */
@@ -339,16 +341,19 @@ var write_setting_to_prefs = function (settingIndex) {
// security settings matches. Otherwise return null.
var read_setting_from_prefs = function (prefNames) {
prefNames = prefNames || Object.keys(kSecuritySettings);
- for (let settingIndex of [1, 2, 3, 4]) {
+ for (const settingIndex of [1, 2, 3, 4]) {
let possibleSetting = true;
// For the given settingIndex, check if all current pref values
// match the setting.
- for (let prefName of prefNames) {
- if (
- kSecuritySettings[prefName][settingIndex] !==
- Services.prefs.getBoolPref(prefName)
- ) {
+ for (const prefName of prefNames) {
+ const wanted = kSecuritySettings[prefName][settingIndex];
+ const actual = Services.prefs.getBoolPref(prefName);
+ if (wanted !== actual) {
possibleSetting = false;
+ logger.info(
+ `${prefName} does not match level ${settingIndex}: ${actual}, should be ${wanted}!`
+ );
+ break;
}
}
if (possibleSetting) {
@@ -373,7 +378,7 @@ var initializeSecurityPrefs = function () {
if (initializedSecPrefs) {
return;
}
- logger.info("Initializing security-prefs.js");
+ logger.info("Initializing security level");
initializedSecPrefs = true;
const wasCustom = Services.prefs.getBoolPref(kCustomPref, false);
@@ -381,6 +386,21 @@ var initializeSecurityPrefs = function () {
// and it should not be custom.
let desiredIndex = Services.prefs.getIntPref(kSliderPref, 4);
desiredIndex = fixupIndex(desiredIndex);
+
+ if (!(wasCustom && desiredIndex == 4)) {
+ // The current level is non-customized Standard, or
+ // Safer / Safest (either customized or not): the global
+ // javascript.options.wasm pref interferes with the correct
+ // functioning of the browser, so instead we rely on NoScript
+ // to disable WebAssembly now (tor-browser#44234, tor-browser#44242).
+ // We skip flipping in customized Standard, because if its value was
+ // found false under such as circumstance, that would suggest
+ // an intentional user choice we don't want to interfere with.
+ // Unlike other javascript.options.* preferences, this one is safe
+ // to flip without a browser restart because it's checked whenever a
+ // context is created.
+ Services.prefs.setBoolPref("javascript.options.wasm", true);
+ }
// Make sure the user has a set preference user value.
Services.prefs.setIntPref(kSliderPref, desiredIndex);
Services.prefs.setBoolPref(kCustomPref, wasCustom);
@@ -460,7 +480,7 @@ var initializeSecurityPrefs = function () {
});
}
- logger.info("security-prefs.js initialization complete");
+ logger.info("Security level initialization complete");
};
// tor-browser#41460: we changed preference names in 12.0.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/42b…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/42b…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][base-browser-140.4.0esr-15.0-1] fixup! BB 40925: Implemented the Security Level component
by ma1 (@ma1) 15 Oct '25
by ma1 (@ma1) 15 Oct '25
15 Oct '25
ma1 pushed to branch base-browser-140.4.0esr-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
29c65ad8 by hackademix at 2025-10-15T15:56:35+02:00
fixup! BB 40925: Implemented the Security Level component
BB 44242: Hand over Security Level's WebAssembly controls to NoScript
- - - - -
1 changed file:
- toolkit/components/securitylevel/SecurityLevel.sys.mjs
Changes:
=====================================
toolkit/components/securitylevel/SecurityLevel.sys.mjs
=====================================
@@ -79,6 +79,7 @@ const max_caps = [
"object",
"other",
"script",
+ "wasm",
"webgl",
"noscript",
];
@@ -247,7 +248,6 @@ var initializeNoScriptControl = () => {
// for each security setting. Note that 2-m and 3-m are identical,
// corresponding to the old 2-medium-high setting. We also separately
// bind NoScript settings to the browser.security_level.security_slider
-// (see noscript-control.js).
/* eslint-disable */
// prettier-ignore
const kSecuritySettings = {
@@ -260,7 +260,9 @@ const kSecuritySettings = {
"gfx.font_rendering.opentype_svg.enabled": [, false, false, false, true ],
"svg.disabled": [, true, false, false, false],
"javascript.options.asmjs": [, false, false, false, true ],
- "javascript.options.wasm": [, false, false, false, true ],
+ // tor-browser#44234, tor-browser#44242: this interferes with the correct
+ // functioning of the browser. So, WASM is also handled by NoScript now.
+ "javascript.options.wasm": [, true, true, true, true ],
};
/* eslint-enable */
@@ -327,16 +329,19 @@ var write_setting_to_prefs = function (settingIndex) {
// security settings matches. Otherwise return null.
var read_setting_from_prefs = function (prefNames) {
prefNames = prefNames || Object.keys(kSecuritySettings);
- for (let settingIndex of [1, 2, 3, 4]) {
+ for (const settingIndex of [1, 2, 3, 4]) {
let possibleSetting = true;
// For the given settingIndex, check if all current pref values
// match the setting.
- for (let prefName of prefNames) {
- if (
- kSecuritySettings[prefName][settingIndex] !==
- Services.prefs.getBoolPref(prefName)
- ) {
+ for (const prefName of prefNames) {
+ const wanted = kSecuritySettings[prefName][settingIndex];
+ const actual = Services.prefs.getBoolPref(prefName);
+ if (wanted !== actual) {
possibleSetting = false;
+ logger.info(
+ `${prefName} does not match level ${settingIndex}: ${actual}, should be ${wanted}!`
+ );
+ break;
}
}
if (possibleSetting) {
@@ -361,7 +366,7 @@ var initializeSecurityPrefs = function () {
if (initializedSecPrefs) {
return;
}
- logger.info("Initializing security-prefs.js");
+ logger.info("Initializing security level");
initializedSecPrefs = true;
const wasCustom = Services.prefs.getBoolPref(kCustomPref, false);
@@ -369,6 +374,21 @@ var initializeSecurityPrefs = function () {
// and it should not be custom.
let desiredIndex = Services.prefs.getIntPref(kSliderPref, 4);
desiredIndex = fixupIndex(desiredIndex);
+
+ if (!(wasCustom && desiredIndex == 4)) {
+ // The current level is non-customized Standard, or
+ // Safer / Safest (either customized or not): the global
+ // javascript.options.wasm pref interferes with the correct
+ // functioning of the browser, so instead we rely on NoScript
+ // to disable WebAssembly now (tor-browser#44234, tor-browser#44242).
+ // We skip flipping in customized Standard, because if its value was
+ // found false under such as circumstance, that would suggest
+ // an intentional user choice we don't want to interfere with.
+ // Unlike other javascript.options.* preferences, this one is safe
+ // to flip without a browser restart because it's checked whenever a
+ // context is created.
+ Services.prefs.setBoolPref("javascript.options.wasm", true);
+ }
// Make sure the user has a set preference user value.
Services.prefs.setIntPref(kSliderPref, desiredIndex);
Services.prefs.setBoolPref(kCustomPref, wasCustom);
@@ -448,7 +468,7 @@ var initializeSecurityPrefs = function () {
});
}
- logger.info("security-prefs.js initialization complete");
+ logger.info("Security level initialization complete");
};
// tor-browser#41460: we changed preference names in 12.0.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/29c65ad…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/29c65ad…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/mullvad-browser][mullvad-browser-140.4.0esr-15.0-1] 2 commits: BB 43869: Hide pens with RFP.
by morgan (@morgan) 15 Oct '25
by morgan (@morgan) 15 Oct '25
15 Oct '25
morgan pushed to branch mullvad-browser-140.4.0esr-15.0-1 at The Tor Project / Applications / Mullvad Browser
Commits:
4517a0aa by Pier Angelo Vendrame at 2025-10-15T13:56:10+00:00
BB 43869: Hide pens with RFP.
- - - - -
1a3fdcf6 by Pier Angelo Vendrame at 2025-10-15T13:56:10+00:00
fixup! Firefox preference overrides.
BB 43869: Remove prefs for touch.
RFP now overrides them.
- - - - -
11 changed files:
- browser/app/profile/001-base-profile.js
- dom/base/Element.cpp
- dom/events/PointerEvent.cpp
- dom/events/PointerEvent.h
- dom/events/PointerEventHandler.cpp
- dom/events/TouchEvent.cpp
- dom/webidl/PointerEvent.webidl
- layout/base/PositionedEventTargeting.cpp
- toolkit/components/resistfingerprinting/RFPTargets.inc
- toolkit/components/resistfingerprinting/nsRFPService.cpp
- widget/WidgetEventImpl.cpp
Changes:
=====================================
browser/app/profile/001-base-profile.js
=====================================
@@ -497,12 +497,6 @@ pref("dom.webmidi.enabled", false); // Bug 41398: Disable Web MIDI API
// randomized IDs when this pref is true).
// Defense-in-depth (already the default value) from Firefox 119 or 120.
pref("media.devices.enumerate.legacy.enabled", false);
-// Touch events (tor-browser#10286, tor-browser#42069, tor-browser#44062)
-#if defined(XP_WIN) || defined(ANDROID)
-pref("dom.w3c_touch_events.enabled", 1);
-#else
-pref("dom.w3c_touch_events.enabled", 0);
-#endif
#ifndef ANDROID
// Bug 42138: Disable touch-based overscroll UX
pref("apz.overscroll.enabled", false);
=====================================
dom/base/Element.cpp
=====================================
@@ -302,11 +302,6 @@ nsDOMAttributeMap* Element::Attributes() {
}
void Element::SetPointerCapture(int32_t aPointerId, ErrorResult& aError) {
- if (OwnerDoc()->ShouldResistFingerprinting(RFPTarget::PointerId) &&
- aPointerId != PointerEventHandler::GetSpoofedPointerIdForRFP()) {
- aError.ThrowNotFoundError("Invalid pointer id");
- return;
- }
const PointerInfo* pointerInfo =
PointerEventHandler::GetPointerInfo(aPointerId);
if (!pointerInfo) {
@@ -334,11 +329,6 @@ void Element::SetPointerCapture(int32_t aPointerId, ErrorResult& aError) {
}
void Element::ReleasePointerCapture(int32_t aPointerId, ErrorResult& aError) {
- if (OwnerDoc()->ShouldResistFingerprinting(RFPTarget::PointerId) &&
- aPointerId != PointerEventHandler::GetSpoofedPointerIdForRFP()) {
- aError.ThrowNotFoundError("Invalid pointer id");
- return;
- }
if (!PointerEventHandler::GetPointerInfo(aPointerId)) {
aError.ThrowNotFoundError("Invalid pointer id");
return;
=====================================
dom/events/PointerEvent.cpp
=====================================
@@ -224,39 +224,78 @@ NS_INTERFACE_MAP_END_INHERITING(MouseEvent)
NS_IMPL_ADDREF_INHERITED(PointerEvent, MouseEvent)
NS_IMPL_RELEASE_INHERITED(PointerEvent, MouseEvent)
-void PointerEvent::GetPointerType(nsAString& aPointerType) {
+uint16_t PointerEvent::ResistantInputSource(CallerType aCallerType) const {
+ const uint16_t inputSource = mEvent->AsPointerEvent()->mInputSource;
+ if (!ShouldResistFingerprinting(aCallerType)) {
+ return inputSource;
+ }
+
+ MOZ_ASSERT(IsTrusted());
+
+ // Bug 1953665: Pen events are inconsistent between platforms.
+ // They might emit touch events on Windows and Android, but only mouse events
+ // in other platforms. In particular, touch is always disabled on macOS.
+#if defined(XP_WIN)
+ if (inputSource == MouseEvent_Binding::MOZ_SOURCE_TOUCH ||
+ inputSource == MouseEvent_Binding::MOZ_SOURCE_MOUSE) {
+ return inputSource;
+ }
+ // Similar to nsWindow::DispatchTouchEventFromWMPointer.
+ switch (mEvent->mMessage) {
+ case ePointerMove:
+ return mEvent->AsPointerEvent()->mPressure == 0
+ ? MouseEvent_Binding::MOZ_SOURCE_MOUSE // hover
+ : MouseEvent_Binding::MOZ_SOURCE_TOUCH;
+ case ePointerUp:
+ case ePointerDown:
+ case ePointerCancel:
+ return MouseEvent_Binding::MOZ_SOURCE_TOUCH;
+ default:
+ return MouseEvent_Binding::MOZ_SOURCE_MOUSE;
+ }
+#elif defined(MOZ_WIDGET_ANDROID)
+ return inputSource == MouseEvent_Binding::MOZ_SOURCE_MOUSE
+ ? MouseEvent_Binding::MOZ_SOURCE_MOUSE
+ : MouseEvent_Binding::MOZ_SOURCE_TOUCH;
+#elif defined(MOZ_WIDGET_GTK)
+ return inputSource == MouseEvent_Binding::MOZ_SOURCE_TOUCH
+ ? MouseEvent_Binding::MOZ_SOURCE_TOUCH
+ : MouseEvent_Binding::MOZ_SOURCE_MOUSE;
+#elif defined(MOZ_WIDGET_COCOA)
+ return MouseEvent_Binding::MOZ_SOURCE_MOUSE;
+#else
+ return inputSource;
+#endif
+}
+
+void PointerEvent::GetPointerType(nsAString& aPointerType,
+ CallerType aCallerType) {
if (mPointerType.isSome()) {
aPointerType = mPointerType.value();
return;
}
-
-#if SPOOFED_MAX_TOUCH_POINTS <= 0
- if (ShouldResistFingerprinting()) {
- aPointerType.AssignLiteral("mouse");
- return;
- }
-#endif
-
- ConvertPointerTypeToString(mEvent->AsPointerEvent()->mInputSource,
- aPointerType);
+ ConvertPointerTypeToString(ResistantInputSource(aCallerType), aPointerType);
}
int32_t PointerEvent::PointerId() {
- return (ShouldResistFingerprinting(true))
- ? PointerEventHandler::GetSpoofedPointerIdForRFP()
- : mEvent->AsPointerEvent()->pointerId;
+ return mEvent->AsPointerEvent()->pointerId;
}
-double PointerEvent::Width() const {
- return ShouldResistFingerprinting() ? 1.0 : mEvent->AsPointerEvent()->mWidth;
+double PointerEvent::Width(CallerType aCallerType) const {
+ return ShouldResistFingerprinting(aCallerType)
+ ? 1.0
+ : mEvent->AsPointerEvent()->mWidth;
}
-double PointerEvent::Height() const {
- return ShouldResistFingerprinting() ? 1.0 : mEvent->AsPointerEvent()->mHeight;
+double PointerEvent::Height(CallerType aCallerType) const {
+ return ShouldResistFingerprinting(aCallerType)
+ ? 1.0
+ : mEvent->AsPointerEvent()->mHeight;
}
-float PointerEvent::Pressure() {
- if (mEvent->mMessage == ePointerUp || !ShouldResistFingerprinting()) {
+float PointerEvent::Pressure(CallerType aCallerType) {
+ if (mEvent->mMessage == ePointerUp ||
+ !ShouldResistFingerprinting(aCallerType)) {
return mEvent->AsPointerEvent()->mPressure;
}
@@ -273,14 +312,14 @@ float PointerEvent::Pressure() {
return spoofedPressure;
}
-float PointerEvent::TangentialPressure() {
- return ShouldResistFingerprinting()
+float PointerEvent::TangentialPressure(CallerType aCallerType) {
+ return ShouldResistFingerprinting(aCallerType)
? 0
: mEvent->AsPointerEvent()->tangentialPressure;
}
-int32_t PointerEvent::TiltX() {
- if (ShouldResistFingerprinting()) {
+int32_t PointerEvent::TiltX(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return 0;
}
if (mTiltX.isSome()) {
@@ -291,8 +330,8 @@ int32_t PointerEvent::TiltX() {
return *mTiltX;
}
-int32_t PointerEvent::TiltY() {
- if (ShouldResistFingerprinting()) {
+int32_t PointerEvent::TiltY(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return 0;
}
if (mTiltY.isSome()) {
@@ -303,12 +342,14 @@ int32_t PointerEvent::TiltY() {
return *mTiltY;
}
-int32_t PointerEvent::Twist() {
- return ShouldResistFingerprinting() ? 0 : mEvent->AsPointerEvent()->twist;
+int32_t PointerEvent::Twist(CallerType aCallerType) {
+ return ShouldResistFingerprinting(aCallerType)
+ ? 0
+ : mEvent->AsPointerEvent()->twist;
}
-double PointerEvent::AltitudeAngle() {
- if (ShouldResistFingerprinting()) {
+double PointerEvent::AltitudeAngle(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return WidgetPointerHelper::GetDefaultAltitudeAngle();
}
if (mAltitudeAngle.isSome()) {
@@ -319,8 +360,8 @@ double PointerEvent::AltitudeAngle() {
return *mAltitudeAngle;
}
-double PointerEvent::AzimuthAngle() {
- if (ShouldResistFingerprinting()) {
+double PointerEvent::AzimuthAngle(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return WidgetPointerHelper::GetDefaultAzimuthAngle();
}
if (mAzimuthAngle.isSome()) {
@@ -421,22 +462,22 @@ void PointerEvent::GetPredictedEvents(
aPointerEvents.AppendElements(mPredictedEvents);
}
-bool PointerEvent::ShouldResistFingerprinting(bool aForPointerId) const {
- // There are three simple situations we don't need to spoof this pointer
+bool PointerEvent::ShouldResistFingerprinting(CallerType aCallerType) const {
+ // There are a few simple situations we don't need to spoof this pointer
// event.
- // 1. The pref privcy.resistFingerprinting' is false, we fast return here
- // since we don't need to do any QI of following codes.
- // 2. This event is generated by scripts.
- // 3. This event is a mouse pointer event.
+ // * We are being called by a System caller
+ // * The pref privcy.resistFingerprinting' is false, we fast return here
+ // since we don't need to do any QI of following codes.
+ // * This event is generated by scripts.
+ // * This event is a mouse pointer event.
// We don't need to check for the system group since pointer events won't be
// dispatched to the system group.
- RFPTarget target =
- aForPointerId ? RFPTarget::PointerId : RFPTarget::PointerEvents;
- if (!nsContentUtils::ShouldResistFingerprinting("Efficiency Check", target) ||
+ RFPTarget target = RFPTarget::PointerEvents;
+ if (aCallerType == CallerType::System ||
+ !nsContentUtils::ShouldResistFingerprinting("Efficiency Check", target) ||
!mEvent->IsTrusted() ||
- (mEvent->AsPointerEvent()->mInputSource ==
- MouseEvent_Binding::MOZ_SOURCE_MOUSE &&
- SPOOFED_MAX_TOUCH_POINTS == 0)) {
+ mEvent->AsPointerEvent()->mInputSource ==
+ MouseEvent_Binding::MOZ_SOURCE_MOUSE) {
return false;
}
=====================================
dom/events/PointerEvent.h
=====================================
@@ -41,17 +41,19 @@ class PointerEvent : public MouseEvent {
PointerEvent* AsPointerEvent() final { return this; }
int32_t PointerId();
- double Width() const;
- double Height() const;
- float Pressure();
- float TangentialPressure();
- int32_t TiltX();
- int32_t TiltY();
- int32_t Twist();
- double AltitudeAngle();
- double AzimuthAngle();
+ double Width(CallerType aCallerType = CallerType::System) const;
+ double Height(CallerType aCallerType = CallerType::System) const;
+ float Pressure(CallerType aCallerType = CallerType::System);
+ float TangentialPressure(CallerType aCallerType = CallerType::System);
+ int32_t TiltX(CallerType aCallerType = CallerType::System);
+ int32_t TiltY(CallerType aCallerType = CallerType::System);
+ int32_t Twist(CallerType aCallerType = CallerType::System);
+ double AltitudeAngle(CallerType aCallerType = CallerType::System);
+ double AzimuthAngle(CallerType aCallerType = CallerType::System);
bool IsPrimary();
- void GetPointerType(nsAString& aPointerType);
+ void GetPointerType(
+ nsAString& aPointerType,
+ mozilla::dom::CallerType aCallerType = CallerType::System);
static bool EnableGetCoalescedEvents(JSContext* aCx, JSObject* aGlobal);
void GetCoalescedEvents(nsTArray<RefPtr<PointerEvent>>& aPointerEvents);
void GetPredictedEvents(nsTArray<RefPtr<PointerEvent>>& aPointerEvents);
@@ -62,7 +64,11 @@ class PointerEvent : public MouseEvent {
private:
// This method returns the boolean to indicate whether spoofing pointer
// event for fingerprinting resistance.
- bool ShouldResistFingerprinting(bool aForPointerId = false) const;
+ bool ShouldResistFingerprinting(
+ CallerType aCallerType = CallerType::System) const;
+
+ uint16_t ResistantInputSource(
+ CallerType aCallerType = CallerType::System) const;
// When the instance is a trusted `pointermove` event but the widget event
// does not have proper coalesced events (typically, the event is synthesized
=====================================
dom/events/PointerEventHandler.cpp
=====================================
@@ -421,32 +421,6 @@ void PointerEventHandler::CheckPointerCaptureState(WidgetPointerEvent* aEvent) {
PointerCaptureInfo* captureInfo = GetPointerCaptureInfo(aEvent->pointerId);
- // When fingerprinting resistance is enabled, we need to map other pointer
- // ids into the spoofed one. We don't have to do the mapping if the capture
- // info exists for the non-spoofed pointer id because of we won't allow
- // content to set pointer capture other than the spoofed one. Thus, it must be
- // from chrome if the capture info exists in this case. And we don't have to
- // do anything if the pointer id is the same as the spoofed one.
- if (nsContentUtils::ShouldResistFingerprinting("Efficiency Check",
- RFPTarget::PointerId) &&
- aEvent->pointerId != (uint32_t)GetSpoofedPointerIdForRFP() &&
- !captureInfo) {
- PointerCaptureInfo* spoofedCaptureInfo =
- GetPointerCaptureInfo(GetSpoofedPointerIdForRFP());
-
- // We need to check the target element's document should resist
- // fingerprinting. If not, we don't need to send a capture event
- // since the capture info of the original pointer id doesn't exist
- // in this case.
- if (!spoofedCaptureInfo || !spoofedCaptureInfo->mPendingElement ||
- !spoofedCaptureInfo->mPendingElement->OwnerDoc()
- ->ShouldResistFingerprinting(RFPTarget::PointerEvents)) {
- return;
- }
-
- captureInfo = spoofedCaptureInfo;
- }
-
if (!captureInfo ||
captureInfo->mPendingElement == captureInfo->mOverrideElement) {
return;
=====================================
dom/events/TouchEvent.cpp
=====================================
@@ -225,38 +225,40 @@ bool TouchEvent::PrefEnabled(nsIDocShell* aDocShell) {
} else if (touchEventsOverride ==
mozilla::dom::TouchEventsOverride::Disabled) {
enabled = false;
+ } else if (nsContentUtils::ShouldResistFingerprinting(
+ aDocShell, RFPTarget::PointerEvents)) {
+#ifdef MOZ_WIDGET_COCOA
+ enabled = false;
+#else
+ enabled = true;
+#endif
} else {
const int32_t prefValue = StaticPrefs::dom_w3c_touch_events_enabled();
if (prefValue == 2) {
- if (nsContentUtils::ShouldResistFingerprinting(
- aDocShell, RFPTarget::PointerEvents)) {
- enabled = SPOOFED_MAX_TOUCH_POINTS != 0;
- } else {
- enabled = PlatformSupportsTouch();
-
- static bool firstTime = true;
- // The touch screen data seems to be inaccurate in the parent process,
- // and we really need the crash annotation in child processes.
- if (firstTime && !XRE_IsParentProcess()) {
- CrashReporter::RecordAnnotationBool(
- CrashReporter::Annotation::HasDeviceTouchScreen, enabled);
- firstTime = false;
- }
+ enabled = PlatformSupportsTouch();
+
+ static bool firstTime = true;
+ // The touch screen data seems to be inaccurate in the parent process,
+ // and we really need the crash annotation in child processes.
+ if (firstTime && !XRE_IsParentProcess()) {
+ CrashReporter::RecordAnnotationBool(
+ CrashReporter::Annotation::HasDeviceTouchScreen, enabled);
+ firstTime = false;
+ }
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
- if (enabled && aDocShell) {
- // APZ might be disabled on this particular widget, in which case
- // TouchEvent support will also be disabled. Try to detect that.
- RefPtr<nsPresContext> pc = aDocShell->GetPresContext();
- if (pc) {
- nsCOMPtr<nsIWidget> widget = pc->GetRootWidget();
- if (widget) {
- enabled &= widget->AsyncPanZoomEnabled();
- }
+ if (enabled && aDocShell) {
+ // APZ might be disabled on this particular widget, in which case
+ // TouchEvent support will also be disabled. Try to detect that.
+ RefPtr<nsPresContext> pc = aDocShell->GetPresContext();
+ if (pc) {
+ nsCOMPtr<nsIWidget> widget = pc->GetRootWidget();
+ if (widget) {
+ enabled &= widget->AsyncPanZoomEnabled();
}
}
-#endif
}
+#endif
} else {
enabled = !!prefValue;
}
=====================================
dom/webidl/PointerEvent.webidl
=====================================
@@ -14,16 +14,26 @@ interface PointerEvent : MouseEvent
readonly attribute long pointerId;
+ [NeedsCallerType]
readonly attribute double width;
+ [NeedsCallerType]
readonly attribute double height;
+ [NeedsCallerType]
readonly attribute float pressure;
+ [NeedsCallerType]
readonly attribute float tangentialPressure;
+ [NeedsCallerType]
readonly attribute long tiltX;
+ [NeedsCallerType]
readonly attribute long tiltY;
+ [NeedsCallerType]
readonly attribute long twist;
+ [NeedsCallerType]
readonly attribute double altitudeAngle;
+ [NeedsCallerType]
readonly attribute double azimuthAngle;
+ [NeedsCallerType]
readonly attribute DOMString pointerType;
readonly attribute boolean isPrimary;
=====================================
layout/base/PositionedEventTargeting.cpp
=====================================
@@ -16,6 +16,7 @@
#include "mozilla/ToString.h"
#include "mozilla/ViewportUtils.h"
#include "mozilla/dom/MouseEventBinding.h"
+#include "mozilla/dom/TouchEvent.h"
#include "mozilla/gfx/Matrix.h"
#include "mozilla/layers/LayersTypes.h"
#include "nsContainerFrame.h"
@@ -173,9 +174,7 @@ static bool HasTouchListener(const nsIContent* aContent) {
return false;
}
- // FIXME: Should this really use the pref rather than TouchEvent::PrefEnabled
- // or such?
- if (!StaticPrefs::dom_w3c_touch_events_enabled()) {
+ if (!TouchEvent::PrefEnabled(aContent->OwnerDoc()->GetDocShell())) {
return false;
}
=====================================
toolkit/components/resistfingerprinting/RFPTargets.inc
=====================================
@@ -34,7 +34,7 @@ ITEM_VALUE(NavigatorHWConcurrency, 16)
ITEM_VALUE(NavigatorOscpu, 17)
ITEM_VALUE(NavigatorPlatform, 18)
ITEM_VALUE(NavigatorUserAgent, 19)
-ITEM_VALUE(PointerId, 20)
+// We no longer use PointerId, it can renamed and reused
ITEM_VALUE(StreamVideoFacingMode, 21)
ITEM_VALUE(JSDateTimeUTC, 22)
ITEM_VALUE(JSMathFdlibm, 23)
@@ -104,6 +104,7 @@ ITEM_VALUE(DiskStorageLimit, 70)
ITEM_VALUE(WebCodecs, 71)
ITEM_VALUE(NavigatorHWConcurrencyTiered,74)
+// !!! Adding a new target? Rename PointerId and repurpose it.
// !!! Don't forget to update kDefaultFingerprintingProtections in nsRFPService.cpp
// if necessary.
=====================================
toolkit/components/resistfingerprinting/nsRFPService.cpp
=====================================
@@ -303,13 +303,6 @@ Maybe<bool> nsRFPService::HandleExeptionalRFPTargets(
StaticPrefs::privacy_spoof_english_DoNotUseDirectly() == 2);
}
- // We don't spoof the pointerId on multi-touch devices.
-#if SPOOFED_MAX_TOUCH_POINTS > 0
- if (aTarget == RFPTarget::PointerId) {
- return Some(false);
- }
-#endif
-
return Nothing();
}
=====================================
widget/WidgetEventImpl.cpp
=====================================
@@ -589,23 +589,6 @@ bool WidgetEvent::IsBlockedForFingerprintingResistance() const {
keyboardEvent->mKeyNameIndex == KEY_NAME_INDEX_Control ||
keyboardEvent->mKeyNameIndex == KEY_NAME_INDEX_AltGraph);
}
- case ePointerEventClass: {
- if (IsPointerEventMessageOriginallyMouseEventMessage(mMessage)) {
- return false;
- }
-
- if (SPOOFED_MAX_TOUCH_POINTS > 0) {
- return false;
- }
-
- const WidgetPointerEvent* pointerEvent = AsPointerEvent();
-
- // We suppress the pointer events if it is not primary for fingerprinting
- // resistance. It is because of that we want to spoof any pointer event
- // into a mouse pointer event and the mouse pointer event only has
- // isPrimary as true.
- return !pointerEvent->mIsPrimary;
- }
default:
return false;
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/fb…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/fb…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][base-browser-140.4.0esr-15.0-1] 2 commits: BB 43869: Hide pens with RFP.
by morgan (@morgan) 15 Oct '25
by morgan (@morgan) 15 Oct '25
15 Oct '25
morgan pushed to branch base-browser-140.4.0esr-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
822f61c9 by Pier Angelo Vendrame at 2025-10-15T13:54:52+00:00
BB 43869: Hide pens with RFP.
- - - - -
0ed3602b by Pier Angelo Vendrame at 2025-10-15T13:54:54+00:00
fixup! Firefox preference overrides.
BB 43869: Remove prefs for touch.
RFP now overrides them.
- - - - -
11 changed files:
- browser/app/profile/001-base-profile.js
- dom/base/Element.cpp
- dom/events/PointerEvent.cpp
- dom/events/PointerEvent.h
- dom/events/PointerEventHandler.cpp
- dom/events/TouchEvent.cpp
- dom/webidl/PointerEvent.webidl
- layout/base/PositionedEventTargeting.cpp
- toolkit/components/resistfingerprinting/RFPTargets.inc
- toolkit/components/resistfingerprinting/nsRFPService.cpp
- widget/WidgetEventImpl.cpp
Changes:
=====================================
browser/app/profile/001-base-profile.js
=====================================
@@ -497,12 +497,6 @@ pref("dom.webmidi.enabled", false); // Bug 41398: Disable Web MIDI API
// randomized IDs when this pref is true).
// Defense-in-depth (already the default value) from Firefox 119 or 120.
pref("media.devices.enumerate.legacy.enabled", false);
-// Touch events (tor-browser#10286, tor-browser#42069, tor-browser#44062)
-#if defined(XP_WIN) || defined(ANDROID)
-pref("dom.w3c_touch_events.enabled", 1);
-#else
-pref("dom.w3c_touch_events.enabled", 0);
-#endif
#ifndef ANDROID
// Bug 42138: Disable touch-based overscroll UX
pref("apz.overscroll.enabled", false);
=====================================
dom/base/Element.cpp
=====================================
@@ -302,11 +302,6 @@ nsDOMAttributeMap* Element::Attributes() {
}
void Element::SetPointerCapture(int32_t aPointerId, ErrorResult& aError) {
- if (OwnerDoc()->ShouldResistFingerprinting(RFPTarget::PointerId) &&
- aPointerId != PointerEventHandler::GetSpoofedPointerIdForRFP()) {
- aError.ThrowNotFoundError("Invalid pointer id");
- return;
- }
const PointerInfo* pointerInfo =
PointerEventHandler::GetPointerInfo(aPointerId);
if (!pointerInfo) {
@@ -334,11 +329,6 @@ void Element::SetPointerCapture(int32_t aPointerId, ErrorResult& aError) {
}
void Element::ReleasePointerCapture(int32_t aPointerId, ErrorResult& aError) {
- if (OwnerDoc()->ShouldResistFingerprinting(RFPTarget::PointerId) &&
- aPointerId != PointerEventHandler::GetSpoofedPointerIdForRFP()) {
- aError.ThrowNotFoundError("Invalid pointer id");
- return;
- }
if (!PointerEventHandler::GetPointerInfo(aPointerId)) {
aError.ThrowNotFoundError("Invalid pointer id");
return;
=====================================
dom/events/PointerEvent.cpp
=====================================
@@ -224,39 +224,78 @@ NS_INTERFACE_MAP_END_INHERITING(MouseEvent)
NS_IMPL_ADDREF_INHERITED(PointerEvent, MouseEvent)
NS_IMPL_RELEASE_INHERITED(PointerEvent, MouseEvent)
-void PointerEvent::GetPointerType(nsAString& aPointerType) {
+uint16_t PointerEvent::ResistantInputSource(CallerType aCallerType) const {
+ const uint16_t inputSource = mEvent->AsPointerEvent()->mInputSource;
+ if (!ShouldResistFingerprinting(aCallerType)) {
+ return inputSource;
+ }
+
+ MOZ_ASSERT(IsTrusted());
+
+ // Bug 1953665: Pen events are inconsistent between platforms.
+ // They might emit touch events on Windows and Android, but only mouse events
+ // in other platforms. In particular, touch is always disabled on macOS.
+#if defined(XP_WIN)
+ if (inputSource == MouseEvent_Binding::MOZ_SOURCE_TOUCH ||
+ inputSource == MouseEvent_Binding::MOZ_SOURCE_MOUSE) {
+ return inputSource;
+ }
+ // Similar to nsWindow::DispatchTouchEventFromWMPointer.
+ switch (mEvent->mMessage) {
+ case ePointerMove:
+ return mEvent->AsPointerEvent()->mPressure == 0
+ ? MouseEvent_Binding::MOZ_SOURCE_MOUSE // hover
+ : MouseEvent_Binding::MOZ_SOURCE_TOUCH;
+ case ePointerUp:
+ case ePointerDown:
+ case ePointerCancel:
+ return MouseEvent_Binding::MOZ_SOURCE_TOUCH;
+ default:
+ return MouseEvent_Binding::MOZ_SOURCE_MOUSE;
+ }
+#elif defined(MOZ_WIDGET_ANDROID)
+ return inputSource == MouseEvent_Binding::MOZ_SOURCE_MOUSE
+ ? MouseEvent_Binding::MOZ_SOURCE_MOUSE
+ : MouseEvent_Binding::MOZ_SOURCE_TOUCH;
+#elif defined(MOZ_WIDGET_GTK)
+ return inputSource == MouseEvent_Binding::MOZ_SOURCE_TOUCH
+ ? MouseEvent_Binding::MOZ_SOURCE_TOUCH
+ : MouseEvent_Binding::MOZ_SOURCE_MOUSE;
+#elif defined(MOZ_WIDGET_COCOA)
+ return MouseEvent_Binding::MOZ_SOURCE_MOUSE;
+#else
+ return inputSource;
+#endif
+}
+
+void PointerEvent::GetPointerType(nsAString& aPointerType,
+ CallerType aCallerType) {
if (mPointerType.isSome()) {
aPointerType = mPointerType.value();
return;
}
-
-#if SPOOFED_MAX_TOUCH_POINTS <= 0
- if (ShouldResistFingerprinting()) {
- aPointerType.AssignLiteral("mouse");
- return;
- }
-#endif
-
- ConvertPointerTypeToString(mEvent->AsPointerEvent()->mInputSource,
- aPointerType);
+ ConvertPointerTypeToString(ResistantInputSource(aCallerType), aPointerType);
}
int32_t PointerEvent::PointerId() {
- return (ShouldResistFingerprinting(true))
- ? PointerEventHandler::GetSpoofedPointerIdForRFP()
- : mEvent->AsPointerEvent()->pointerId;
+ return mEvent->AsPointerEvent()->pointerId;
}
-double PointerEvent::Width() const {
- return ShouldResistFingerprinting() ? 1.0 : mEvent->AsPointerEvent()->mWidth;
+double PointerEvent::Width(CallerType aCallerType) const {
+ return ShouldResistFingerprinting(aCallerType)
+ ? 1.0
+ : mEvent->AsPointerEvent()->mWidth;
}
-double PointerEvent::Height() const {
- return ShouldResistFingerprinting() ? 1.0 : mEvent->AsPointerEvent()->mHeight;
+double PointerEvent::Height(CallerType aCallerType) const {
+ return ShouldResistFingerprinting(aCallerType)
+ ? 1.0
+ : mEvent->AsPointerEvent()->mHeight;
}
-float PointerEvent::Pressure() {
- if (mEvent->mMessage == ePointerUp || !ShouldResistFingerprinting()) {
+float PointerEvent::Pressure(CallerType aCallerType) {
+ if (mEvent->mMessage == ePointerUp ||
+ !ShouldResistFingerprinting(aCallerType)) {
return mEvent->AsPointerEvent()->mPressure;
}
@@ -273,14 +312,14 @@ float PointerEvent::Pressure() {
return spoofedPressure;
}
-float PointerEvent::TangentialPressure() {
- return ShouldResistFingerprinting()
+float PointerEvent::TangentialPressure(CallerType aCallerType) {
+ return ShouldResistFingerprinting(aCallerType)
? 0
: mEvent->AsPointerEvent()->tangentialPressure;
}
-int32_t PointerEvent::TiltX() {
- if (ShouldResistFingerprinting()) {
+int32_t PointerEvent::TiltX(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return 0;
}
if (mTiltX.isSome()) {
@@ -291,8 +330,8 @@ int32_t PointerEvent::TiltX() {
return *mTiltX;
}
-int32_t PointerEvent::TiltY() {
- if (ShouldResistFingerprinting()) {
+int32_t PointerEvent::TiltY(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return 0;
}
if (mTiltY.isSome()) {
@@ -303,12 +342,14 @@ int32_t PointerEvent::TiltY() {
return *mTiltY;
}
-int32_t PointerEvent::Twist() {
- return ShouldResistFingerprinting() ? 0 : mEvent->AsPointerEvent()->twist;
+int32_t PointerEvent::Twist(CallerType aCallerType) {
+ return ShouldResistFingerprinting(aCallerType)
+ ? 0
+ : mEvent->AsPointerEvent()->twist;
}
-double PointerEvent::AltitudeAngle() {
- if (ShouldResistFingerprinting()) {
+double PointerEvent::AltitudeAngle(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return WidgetPointerHelper::GetDefaultAltitudeAngle();
}
if (mAltitudeAngle.isSome()) {
@@ -319,8 +360,8 @@ double PointerEvent::AltitudeAngle() {
return *mAltitudeAngle;
}
-double PointerEvent::AzimuthAngle() {
- if (ShouldResistFingerprinting()) {
+double PointerEvent::AzimuthAngle(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return WidgetPointerHelper::GetDefaultAzimuthAngle();
}
if (mAzimuthAngle.isSome()) {
@@ -421,22 +462,22 @@ void PointerEvent::GetPredictedEvents(
aPointerEvents.AppendElements(mPredictedEvents);
}
-bool PointerEvent::ShouldResistFingerprinting(bool aForPointerId) const {
- // There are three simple situations we don't need to spoof this pointer
+bool PointerEvent::ShouldResistFingerprinting(CallerType aCallerType) const {
+ // There are a few simple situations we don't need to spoof this pointer
// event.
- // 1. The pref privcy.resistFingerprinting' is false, we fast return here
- // since we don't need to do any QI of following codes.
- // 2. This event is generated by scripts.
- // 3. This event is a mouse pointer event.
+ // * We are being called by a System caller
+ // * The pref privcy.resistFingerprinting' is false, we fast return here
+ // since we don't need to do any QI of following codes.
+ // * This event is generated by scripts.
+ // * This event is a mouse pointer event.
// We don't need to check for the system group since pointer events won't be
// dispatched to the system group.
- RFPTarget target =
- aForPointerId ? RFPTarget::PointerId : RFPTarget::PointerEvents;
- if (!nsContentUtils::ShouldResistFingerprinting("Efficiency Check", target) ||
+ RFPTarget target = RFPTarget::PointerEvents;
+ if (aCallerType == CallerType::System ||
+ !nsContentUtils::ShouldResistFingerprinting("Efficiency Check", target) ||
!mEvent->IsTrusted() ||
- (mEvent->AsPointerEvent()->mInputSource ==
- MouseEvent_Binding::MOZ_SOURCE_MOUSE &&
- SPOOFED_MAX_TOUCH_POINTS == 0)) {
+ mEvent->AsPointerEvent()->mInputSource ==
+ MouseEvent_Binding::MOZ_SOURCE_MOUSE) {
return false;
}
=====================================
dom/events/PointerEvent.h
=====================================
@@ -41,17 +41,19 @@ class PointerEvent : public MouseEvent {
PointerEvent* AsPointerEvent() final { return this; }
int32_t PointerId();
- double Width() const;
- double Height() const;
- float Pressure();
- float TangentialPressure();
- int32_t TiltX();
- int32_t TiltY();
- int32_t Twist();
- double AltitudeAngle();
- double AzimuthAngle();
+ double Width(CallerType aCallerType = CallerType::System) const;
+ double Height(CallerType aCallerType = CallerType::System) const;
+ float Pressure(CallerType aCallerType = CallerType::System);
+ float TangentialPressure(CallerType aCallerType = CallerType::System);
+ int32_t TiltX(CallerType aCallerType = CallerType::System);
+ int32_t TiltY(CallerType aCallerType = CallerType::System);
+ int32_t Twist(CallerType aCallerType = CallerType::System);
+ double AltitudeAngle(CallerType aCallerType = CallerType::System);
+ double AzimuthAngle(CallerType aCallerType = CallerType::System);
bool IsPrimary();
- void GetPointerType(nsAString& aPointerType);
+ void GetPointerType(
+ nsAString& aPointerType,
+ mozilla::dom::CallerType aCallerType = CallerType::System);
static bool EnableGetCoalescedEvents(JSContext* aCx, JSObject* aGlobal);
void GetCoalescedEvents(nsTArray<RefPtr<PointerEvent>>& aPointerEvents);
void GetPredictedEvents(nsTArray<RefPtr<PointerEvent>>& aPointerEvents);
@@ -62,7 +64,11 @@ class PointerEvent : public MouseEvent {
private:
// This method returns the boolean to indicate whether spoofing pointer
// event for fingerprinting resistance.
- bool ShouldResistFingerprinting(bool aForPointerId = false) const;
+ bool ShouldResistFingerprinting(
+ CallerType aCallerType = CallerType::System) const;
+
+ uint16_t ResistantInputSource(
+ CallerType aCallerType = CallerType::System) const;
// When the instance is a trusted `pointermove` event but the widget event
// does not have proper coalesced events (typically, the event is synthesized
=====================================
dom/events/PointerEventHandler.cpp
=====================================
@@ -421,32 +421,6 @@ void PointerEventHandler::CheckPointerCaptureState(WidgetPointerEvent* aEvent) {
PointerCaptureInfo* captureInfo = GetPointerCaptureInfo(aEvent->pointerId);
- // When fingerprinting resistance is enabled, we need to map other pointer
- // ids into the spoofed one. We don't have to do the mapping if the capture
- // info exists for the non-spoofed pointer id because of we won't allow
- // content to set pointer capture other than the spoofed one. Thus, it must be
- // from chrome if the capture info exists in this case. And we don't have to
- // do anything if the pointer id is the same as the spoofed one.
- if (nsContentUtils::ShouldResistFingerprinting("Efficiency Check",
- RFPTarget::PointerId) &&
- aEvent->pointerId != (uint32_t)GetSpoofedPointerIdForRFP() &&
- !captureInfo) {
- PointerCaptureInfo* spoofedCaptureInfo =
- GetPointerCaptureInfo(GetSpoofedPointerIdForRFP());
-
- // We need to check the target element's document should resist
- // fingerprinting. If not, we don't need to send a capture event
- // since the capture info of the original pointer id doesn't exist
- // in this case.
- if (!spoofedCaptureInfo || !spoofedCaptureInfo->mPendingElement ||
- !spoofedCaptureInfo->mPendingElement->OwnerDoc()
- ->ShouldResistFingerprinting(RFPTarget::PointerEvents)) {
- return;
- }
-
- captureInfo = spoofedCaptureInfo;
- }
-
if (!captureInfo ||
captureInfo->mPendingElement == captureInfo->mOverrideElement) {
return;
=====================================
dom/events/TouchEvent.cpp
=====================================
@@ -225,38 +225,40 @@ bool TouchEvent::PrefEnabled(nsIDocShell* aDocShell) {
} else if (touchEventsOverride ==
mozilla::dom::TouchEventsOverride::Disabled) {
enabled = false;
+ } else if (nsContentUtils::ShouldResistFingerprinting(
+ aDocShell, RFPTarget::PointerEvents)) {
+#ifdef MOZ_WIDGET_COCOA
+ enabled = false;
+#else
+ enabled = true;
+#endif
} else {
const int32_t prefValue = StaticPrefs::dom_w3c_touch_events_enabled();
if (prefValue == 2) {
- if (nsContentUtils::ShouldResistFingerprinting(
- aDocShell, RFPTarget::PointerEvents)) {
- enabled = SPOOFED_MAX_TOUCH_POINTS != 0;
- } else {
- enabled = PlatformSupportsTouch();
-
- static bool firstTime = true;
- // The touch screen data seems to be inaccurate in the parent process,
- // and we really need the crash annotation in child processes.
- if (firstTime && !XRE_IsParentProcess()) {
- CrashReporter::RecordAnnotationBool(
- CrashReporter::Annotation::HasDeviceTouchScreen, enabled);
- firstTime = false;
- }
+ enabled = PlatformSupportsTouch();
+
+ static bool firstTime = true;
+ // The touch screen data seems to be inaccurate in the parent process,
+ // and we really need the crash annotation in child processes.
+ if (firstTime && !XRE_IsParentProcess()) {
+ CrashReporter::RecordAnnotationBool(
+ CrashReporter::Annotation::HasDeviceTouchScreen, enabled);
+ firstTime = false;
+ }
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
- if (enabled && aDocShell) {
- // APZ might be disabled on this particular widget, in which case
- // TouchEvent support will also be disabled. Try to detect that.
- RefPtr<nsPresContext> pc = aDocShell->GetPresContext();
- if (pc) {
- nsCOMPtr<nsIWidget> widget = pc->GetRootWidget();
- if (widget) {
- enabled &= widget->AsyncPanZoomEnabled();
- }
+ if (enabled && aDocShell) {
+ // APZ might be disabled on this particular widget, in which case
+ // TouchEvent support will also be disabled. Try to detect that.
+ RefPtr<nsPresContext> pc = aDocShell->GetPresContext();
+ if (pc) {
+ nsCOMPtr<nsIWidget> widget = pc->GetRootWidget();
+ if (widget) {
+ enabled &= widget->AsyncPanZoomEnabled();
}
}
-#endif
}
+#endif
} else {
enabled = !!prefValue;
}
=====================================
dom/webidl/PointerEvent.webidl
=====================================
@@ -14,16 +14,26 @@ interface PointerEvent : MouseEvent
readonly attribute long pointerId;
+ [NeedsCallerType]
readonly attribute double width;
+ [NeedsCallerType]
readonly attribute double height;
+ [NeedsCallerType]
readonly attribute float pressure;
+ [NeedsCallerType]
readonly attribute float tangentialPressure;
+ [NeedsCallerType]
readonly attribute long tiltX;
+ [NeedsCallerType]
readonly attribute long tiltY;
+ [NeedsCallerType]
readonly attribute long twist;
+ [NeedsCallerType]
readonly attribute double altitudeAngle;
+ [NeedsCallerType]
readonly attribute double azimuthAngle;
+ [NeedsCallerType]
readonly attribute DOMString pointerType;
readonly attribute boolean isPrimary;
=====================================
layout/base/PositionedEventTargeting.cpp
=====================================
@@ -16,6 +16,7 @@
#include "mozilla/ToString.h"
#include "mozilla/ViewportUtils.h"
#include "mozilla/dom/MouseEventBinding.h"
+#include "mozilla/dom/TouchEvent.h"
#include "mozilla/gfx/Matrix.h"
#include "mozilla/layers/LayersTypes.h"
#include "nsContainerFrame.h"
@@ -173,9 +174,7 @@ static bool HasTouchListener(const nsIContent* aContent) {
return false;
}
- // FIXME: Should this really use the pref rather than TouchEvent::PrefEnabled
- // or such?
- if (!StaticPrefs::dom_w3c_touch_events_enabled()) {
+ if (!TouchEvent::PrefEnabled(aContent->OwnerDoc()->GetDocShell())) {
return false;
}
=====================================
toolkit/components/resistfingerprinting/RFPTargets.inc
=====================================
@@ -34,7 +34,7 @@ ITEM_VALUE(NavigatorHWConcurrency, 16)
ITEM_VALUE(NavigatorOscpu, 17)
ITEM_VALUE(NavigatorPlatform, 18)
ITEM_VALUE(NavigatorUserAgent, 19)
-ITEM_VALUE(PointerId, 20)
+// We no longer use PointerId, it can renamed and reused
ITEM_VALUE(StreamVideoFacingMode, 21)
ITEM_VALUE(JSDateTimeUTC, 22)
ITEM_VALUE(JSMathFdlibm, 23)
@@ -104,6 +104,7 @@ ITEM_VALUE(DiskStorageLimit, 70)
ITEM_VALUE(WebCodecs, 71)
ITEM_VALUE(NavigatorHWConcurrencyTiered,74)
+// !!! Adding a new target? Rename PointerId and repurpose it.
// !!! Don't forget to update kDefaultFingerprintingProtections in nsRFPService.cpp
// if necessary.
=====================================
toolkit/components/resistfingerprinting/nsRFPService.cpp
=====================================
@@ -303,13 +303,6 @@ Maybe<bool> nsRFPService::HandleExeptionalRFPTargets(
StaticPrefs::privacy_spoof_english_DoNotUseDirectly() == 2);
}
- // We don't spoof the pointerId on multi-touch devices.
-#if SPOOFED_MAX_TOUCH_POINTS > 0
- if (aTarget == RFPTarget::PointerId) {
- return Some(false);
- }
-#endif
-
return Nothing();
}
=====================================
widget/WidgetEventImpl.cpp
=====================================
@@ -589,23 +589,6 @@ bool WidgetEvent::IsBlockedForFingerprintingResistance() const {
keyboardEvent->mKeyNameIndex == KEY_NAME_INDEX_Control ||
keyboardEvent->mKeyNameIndex == KEY_NAME_INDEX_AltGraph);
}
- case ePointerEventClass: {
- if (IsPointerEventMessageOriginallyMouseEventMessage(mMessage)) {
- return false;
- }
-
- if (SPOOFED_MAX_TOUCH_POINTS > 0) {
- return false;
- }
-
- const WidgetPointerEvent* pointerEvent = AsPointerEvent();
-
- // We suppress the pointer events if it is not primary for fingerprinting
- // resistance. It is because of that we want to spoof any pointer event
- // into a mouse pointer event and the mouse pointer event only has
- // isPrimary as true.
- return !pointerEvent->mIsPrimary;
- }
default:
return false;
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/2c531e…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/2c531e…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-140.4.0esr-15.0-1] 2 commits: BB 43869: Hide pens with RFP.
by morgan (@morgan) 15 Oct '25
by morgan (@morgan) 15 Oct '25
15 Oct '25
morgan pushed to branch tor-browser-140.4.0esr-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
84fb1585 by Pier Angelo Vendrame at 2025-10-15T13:23:33+00:00
BB 43869: Hide pens with RFP.
- - - - -
be15e46e by Pier Angelo Vendrame at 2025-10-15T13:23:33+00:00
fixup! Firefox preference overrides.
BB 43869: Remove prefs for touch.
RFP now overrides them.
- - - - -
11 changed files:
- browser/app/profile/001-base-profile.js
- dom/base/Element.cpp
- dom/events/PointerEvent.cpp
- dom/events/PointerEvent.h
- dom/events/PointerEventHandler.cpp
- dom/events/TouchEvent.cpp
- dom/webidl/PointerEvent.webidl
- layout/base/PositionedEventTargeting.cpp
- toolkit/components/resistfingerprinting/RFPTargets.inc
- toolkit/components/resistfingerprinting/nsRFPService.cpp
- widget/WidgetEventImpl.cpp
Changes:
=====================================
browser/app/profile/001-base-profile.js
=====================================
@@ -497,12 +497,6 @@ pref("dom.webmidi.enabled", false); // Bug 41398: Disable Web MIDI API
// randomized IDs when this pref is true).
// Defense-in-depth (already the default value) from Firefox 119 or 120.
pref("media.devices.enumerate.legacy.enabled", false);
-// Touch events (tor-browser#10286, tor-browser#42069, tor-browser#44062)
-#if defined(XP_WIN) || defined(ANDROID)
-pref("dom.w3c_touch_events.enabled", 1);
-#else
-pref("dom.w3c_touch_events.enabled", 0);
-#endif
#ifndef ANDROID
// Bug 42138: Disable touch-based overscroll UX
pref("apz.overscroll.enabled", false);
=====================================
dom/base/Element.cpp
=====================================
@@ -302,11 +302,6 @@ nsDOMAttributeMap* Element::Attributes() {
}
void Element::SetPointerCapture(int32_t aPointerId, ErrorResult& aError) {
- if (OwnerDoc()->ShouldResistFingerprinting(RFPTarget::PointerId) &&
- aPointerId != PointerEventHandler::GetSpoofedPointerIdForRFP()) {
- aError.ThrowNotFoundError("Invalid pointer id");
- return;
- }
const PointerInfo* pointerInfo =
PointerEventHandler::GetPointerInfo(aPointerId);
if (!pointerInfo) {
@@ -334,11 +329,6 @@ void Element::SetPointerCapture(int32_t aPointerId, ErrorResult& aError) {
}
void Element::ReleasePointerCapture(int32_t aPointerId, ErrorResult& aError) {
- if (OwnerDoc()->ShouldResistFingerprinting(RFPTarget::PointerId) &&
- aPointerId != PointerEventHandler::GetSpoofedPointerIdForRFP()) {
- aError.ThrowNotFoundError("Invalid pointer id");
- return;
- }
if (!PointerEventHandler::GetPointerInfo(aPointerId)) {
aError.ThrowNotFoundError("Invalid pointer id");
return;
=====================================
dom/events/PointerEvent.cpp
=====================================
@@ -224,39 +224,78 @@ NS_INTERFACE_MAP_END_INHERITING(MouseEvent)
NS_IMPL_ADDREF_INHERITED(PointerEvent, MouseEvent)
NS_IMPL_RELEASE_INHERITED(PointerEvent, MouseEvent)
-void PointerEvent::GetPointerType(nsAString& aPointerType) {
+uint16_t PointerEvent::ResistantInputSource(CallerType aCallerType) const {
+ const uint16_t inputSource = mEvent->AsPointerEvent()->mInputSource;
+ if (!ShouldResistFingerprinting(aCallerType)) {
+ return inputSource;
+ }
+
+ MOZ_ASSERT(IsTrusted());
+
+ // Bug 1953665: Pen events are inconsistent between platforms.
+ // They might emit touch events on Windows and Android, but only mouse events
+ // in other platforms. In particular, touch is always disabled on macOS.
+#if defined(XP_WIN)
+ if (inputSource == MouseEvent_Binding::MOZ_SOURCE_TOUCH ||
+ inputSource == MouseEvent_Binding::MOZ_SOURCE_MOUSE) {
+ return inputSource;
+ }
+ // Similar to nsWindow::DispatchTouchEventFromWMPointer.
+ switch (mEvent->mMessage) {
+ case ePointerMove:
+ return mEvent->AsPointerEvent()->mPressure == 0
+ ? MouseEvent_Binding::MOZ_SOURCE_MOUSE // hover
+ : MouseEvent_Binding::MOZ_SOURCE_TOUCH;
+ case ePointerUp:
+ case ePointerDown:
+ case ePointerCancel:
+ return MouseEvent_Binding::MOZ_SOURCE_TOUCH;
+ default:
+ return MouseEvent_Binding::MOZ_SOURCE_MOUSE;
+ }
+#elif defined(MOZ_WIDGET_ANDROID)
+ return inputSource == MouseEvent_Binding::MOZ_SOURCE_MOUSE
+ ? MouseEvent_Binding::MOZ_SOURCE_MOUSE
+ : MouseEvent_Binding::MOZ_SOURCE_TOUCH;
+#elif defined(MOZ_WIDGET_GTK)
+ return inputSource == MouseEvent_Binding::MOZ_SOURCE_TOUCH
+ ? MouseEvent_Binding::MOZ_SOURCE_TOUCH
+ : MouseEvent_Binding::MOZ_SOURCE_MOUSE;
+#elif defined(MOZ_WIDGET_COCOA)
+ return MouseEvent_Binding::MOZ_SOURCE_MOUSE;
+#else
+ return inputSource;
+#endif
+}
+
+void PointerEvent::GetPointerType(nsAString& aPointerType,
+ CallerType aCallerType) {
if (mPointerType.isSome()) {
aPointerType = mPointerType.value();
return;
}
-
-#if SPOOFED_MAX_TOUCH_POINTS <= 0
- if (ShouldResistFingerprinting()) {
- aPointerType.AssignLiteral("mouse");
- return;
- }
-#endif
-
- ConvertPointerTypeToString(mEvent->AsPointerEvent()->mInputSource,
- aPointerType);
+ ConvertPointerTypeToString(ResistantInputSource(aCallerType), aPointerType);
}
int32_t PointerEvent::PointerId() {
- return (ShouldResistFingerprinting(true))
- ? PointerEventHandler::GetSpoofedPointerIdForRFP()
- : mEvent->AsPointerEvent()->pointerId;
+ return mEvent->AsPointerEvent()->pointerId;
}
-double PointerEvent::Width() const {
- return ShouldResistFingerprinting() ? 1.0 : mEvent->AsPointerEvent()->mWidth;
+double PointerEvent::Width(CallerType aCallerType) const {
+ return ShouldResistFingerprinting(aCallerType)
+ ? 1.0
+ : mEvent->AsPointerEvent()->mWidth;
}
-double PointerEvent::Height() const {
- return ShouldResistFingerprinting() ? 1.0 : mEvent->AsPointerEvent()->mHeight;
+double PointerEvent::Height(CallerType aCallerType) const {
+ return ShouldResistFingerprinting(aCallerType)
+ ? 1.0
+ : mEvent->AsPointerEvent()->mHeight;
}
-float PointerEvent::Pressure() {
- if (mEvent->mMessage == ePointerUp || !ShouldResistFingerprinting()) {
+float PointerEvent::Pressure(CallerType aCallerType) {
+ if (mEvent->mMessage == ePointerUp ||
+ !ShouldResistFingerprinting(aCallerType)) {
return mEvent->AsPointerEvent()->mPressure;
}
@@ -273,14 +312,14 @@ float PointerEvent::Pressure() {
return spoofedPressure;
}
-float PointerEvent::TangentialPressure() {
- return ShouldResistFingerprinting()
+float PointerEvent::TangentialPressure(CallerType aCallerType) {
+ return ShouldResistFingerprinting(aCallerType)
? 0
: mEvent->AsPointerEvent()->tangentialPressure;
}
-int32_t PointerEvent::TiltX() {
- if (ShouldResistFingerprinting()) {
+int32_t PointerEvent::TiltX(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return 0;
}
if (mTiltX.isSome()) {
@@ -291,8 +330,8 @@ int32_t PointerEvent::TiltX() {
return *mTiltX;
}
-int32_t PointerEvent::TiltY() {
- if (ShouldResistFingerprinting()) {
+int32_t PointerEvent::TiltY(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return 0;
}
if (mTiltY.isSome()) {
@@ -303,12 +342,14 @@ int32_t PointerEvent::TiltY() {
return *mTiltY;
}
-int32_t PointerEvent::Twist() {
- return ShouldResistFingerprinting() ? 0 : mEvent->AsPointerEvent()->twist;
+int32_t PointerEvent::Twist(CallerType aCallerType) {
+ return ShouldResistFingerprinting(aCallerType)
+ ? 0
+ : mEvent->AsPointerEvent()->twist;
}
-double PointerEvent::AltitudeAngle() {
- if (ShouldResistFingerprinting()) {
+double PointerEvent::AltitudeAngle(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return WidgetPointerHelper::GetDefaultAltitudeAngle();
}
if (mAltitudeAngle.isSome()) {
@@ -319,8 +360,8 @@ double PointerEvent::AltitudeAngle() {
return *mAltitudeAngle;
}
-double PointerEvent::AzimuthAngle() {
- if (ShouldResistFingerprinting()) {
+double PointerEvent::AzimuthAngle(CallerType aCallerType) {
+ if (ShouldResistFingerprinting(aCallerType)) {
return WidgetPointerHelper::GetDefaultAzimuthAngle();
}
if (mAzimuthAngle.isSome()) {
@@ -421,22 +462,22 @@ void PointerEvent::GetPredictedEvents(
aPointerEvents.AppendElements(mPredictedEvents);
}
-bool PointerEvent::ShouldResistFingerprinting(bool aForPointerId) const {
- // There are three simple situations we don't need to spoof this pointer
+bool PointerEvent::ShouldResistFingerprinting(CallerType aCallerType) const {
+ // There are a few simple situations we don't need to spoof this pointer
// event.
- // 1. The pref privcy.resistFingerprinting' is false, we fast return here
- // since we don't need to do any QI of following codes.
- // 2. This event is generated by scripts.
- // 3. This event is a mouse pointer event.
+ // * We are being called by a System caller
+ // * The pref privcy.resistFingerprinting' is false, we fast return here
+ // since we don't need to do any QI of following codes.
+ // * This event is generated by scripts.
+ // * This event is a mouse pointer event.
// We don't need to check for the system group since pointer events won't be
// dispatched to the system group.
- RFPTarget target =
- aForPointerId ? RFPTarget::PointerId : RFPTarget::PointerEvents;
- if (!nsContentUtils::ShouldResistFingerprinting("Efficiency Check", target) ||
+ RFPTarget target = RFPTarget::PointerEvents;
+ if (aCallerType == CallerType::System ||
+ !nsContentUtils::ShouldResistFingerprinting("Efficiency Check", target) ||
!mEvent->IsTrusted() ||
- (mEvent->AsPointerEvent()->mInputSource ==
- MouseEvent_Binding::MOZ_SOURCE_MOUSE &&
- SPOOFED_MAX_TOUCH_POINTS == 0)) {
+ mEvent->AsPointerEvent()->mInputSource ==
+ MouseEvent_Binding::MOZ_SOURCE_MOUSE) {
return false;
}
=====================================
dom/events/PointerEvent.h
=====================================
@@ -41,17 +41,19 @@ class PointerEvent : public MouseEvent {
PointerEvent* AsPointerEvent() final { return this; }
int32_t PointerId();
- double Width() const;
- double Height() const;
- float Pressure();
- float TangentialPressure();
- int32_t TiltX();
- int32_t TiltY();
- int32_t Twist();
- double AltitudeAngle();
- double AzimuthAngle();
+ double Width(CallerType aCallerType = CallerType::System) const;
+ double Height(CallerType aCallerType = CallerType::System) const;
+ float Pressure(CallerType aCallerType = CallerType::System);
+ float TangentialPressure(CallerType aCallerType = CallerType::System);
+ int32_t TiltX(CallerType aCallerType = CallerType::System);
+ int32_t TiltY(CallerType aCallerType = CallerType::System);
+ int32_t Twist(CallerType aCallerType = CallerType::System);
+ double AltitudeAngle(CallerType aCallerType = CallerType::System);
+ double AzimuthAngle(CallerType aCallerType = CallerType::System);
bool IsPrimary();
- void GetPointerType(nsAString& aPointerType);
+ void GetPointerType(
+ nsAString& aPointerType,
+ mozilla::dom::CallerType aCallerType = CallerType::System);
static bool EnableGetCoalescedEvents(JSContext* aCx, JSObject* aGlobal);
void GetCoalescedEvents(nsTArray<RefPtr<PointerEvent>>& aPointerEvents);
void GetPredictedEvents(nsTArray<RefPtr<PointerEvent>>& aPointerEvents);
@@ -62,7 +64,11 @@ class PointerEvent : public MouseEvent {
private:
// This method returns the boolean to indicate whether spoofing pointer
// event for fingerprinting resistance.
- bool ShouldResistFingerprinting(bool aForPointerId = false) const;
+ bool ShouldResistFingerprinting(
+ CallerType aCallerType = CallerType::System) const;
+
+ uint16_t ResistantInputSource(
+ CallerType aCallerType = CallerType::System) const;
// When the instance is a trusted `pointermove` event but the widget event
// does not have proper coalesced events (typically, the event is synthesized
=====================================
dom/events/PointerEventHandler.cpp
=====================================
@@ -421,32 +421,6 @@ void PointerEventHandler::CheckPointerCaptureState(WidgetPointerEvent* aEvent) {
PointerCaptureInfo* captureInfo = GetPointerCaptureInfo(aEvent->pointerId);
- // When fingerprinting resistance is enabled, we need to map other pointer
- // ids into the spoofed one. We don't have to do the mapping if the capture
- // info exists for the non-spoofed pointer id because of we won't allow
- // content to set pointer capture other than the spoofed one. Thus, it must be
- // from chrome if the capture info exists in this case. And we don't have to
- // do anything if the pointer id is the same as the spoofed one.
- if (nsContentUtils::ShouldResistFingerprinting("Efficiency Check",
- RFPTarget::PointerId) &&
- aEvent->pointerId != (uint32_t)GetSpoofedPointerIdForRFP() &&
- !captureInfo) {
- PointerCaptureInfo* spoofedCaptureInfo =
- GetPointerCaptureInfo(GetSpoofedPointerIdForRFP());
-
- // We need to check the target element's document should resist
- // fingerprinting. If not, we don't need to send a capture event
- // since the capture info of the original pointer id doesn't exist
- // in this case.
- if (!spoofedCaptureInfo || !spoofedCaptureInfo->mPendingElement ||
- !spoofedCaptureInfo->mPendingElement->OwnerDoc()
- ->ShouldResistFingerprinting(RFPTarget::PointerEvents)) {
- return;
- }
-
- captureInfo = spoofedCaptureInfo;
- }
-
if (!captureInfo ||
captureInfo->mPendingElement == captureInfo->mOverrideElement) {
return;
=====================================
dom/events/TouchEvent.cpp
=====================================
@@ -225,38 +225,40 @@ bool TouchEvent::PrefEnabled(nsIDocShell* aDocShell) {
} else if (touchEventsOverride ==
mozilla::dom::TouchEventsOverride::Disabled) {
enabled = false;
+ } else if (nsContentUtils::ShouldResistFingerprinting(
+ aDocShell, RFPTarget::PointerEvents)) {
+#ifdef MOZ_WIDGET_COCOA
+ enabled = false;
+#else
+ enabled = true;
+#endif
} else {
const int32_t prefValue = StaticPrefs::dom_w3c_touch_events_enabled();
if (prefValue == 2) {
- if (nsContentUtils::ShouldResistFingerprinting(
- aDocShell, RFPTarget::PointerEvents)) {
- enabled = SPOOFED_MAX_TOUCH_POINTS != 0;
- } else {
- enabled = PlatformSupportsTouch();
-
- static bool firstTime = true;
- // The touch screen data seems to be inaccurate in the parent process,
- // and we really need the crash annotation in child processes.
- if (firstTime && !XRE_IsParentProcess()) {
- CrashReporter::RecordAnnotationBool(
- CrashReporter::Annotation::HasDeviceTouchScreen, enabled);
- firstTime = false;
- }
+ enabled = PlatformSupportsTouch();
+
+ static bool firstTime = true;
+ // The touch screen data seems to be inaccurate in the parent process,
+ // and we really need the crash annotation in child processes.
+ if (firstTime && !XRE_IsParentProcess()) {
+ CrashReporter::RecordAnnotationBool(
+ CrashReporter::Annotation::HasDeviceTouchScreen, enabled);
+ firstTime = false;
+ }
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
- if (enabled && aDocShell) {
- // APZ might be disabled on this particular widget, in which case
- // TouchEvent support will also be disabled. Try to detect that.
- RefPtr<nsPresContext> pc = aDocShell->GetPresContext();
- if (pc) {
- nsCOMPtr<nsIWidget> widget = pc->GetRootWidget();
- if (widget) {
- enabled &= widget->AsyncPanZoomEnabled();
- }
+ if (enabled && aDocShell) {
+ // APZ might be disabled on this particular widget, in which case
+ // TouchEvent support will also be disabled. Try to detect that.
+ RefPtr<nsPresContext> pc = aDocShell->GetPresContext();
+ if (pc) {
+ nsCOMPtr<nsIWidget> widget = pc->GetRootWidget();
+ if (widget) {
+ enabled &= widget->AsyncPanZoomEnabled();
}
}
-#endif
}
+#endif
} else {
enabled = !!prefValue;
}
=====================================
dom/webidl/PointerEvent.webidl
=====================================
@@ -14,16 +14,26 @@ interface PointerEvent : MouseEvent
readonly attribute long pointerId;
+ [NeedsCallerType]
readonly attribute double width;
+ [NeedsCallerType]
readonly attribute double height;
+ [NeedsCallerType]
readonly attribute float pressure;
+ [NeedsCallerType]
readonly attribute float tangentialPressure;
+ [NeedsCallerType]
readonly attribute long tiltX;
+ [NeedsCallerType]
readonly attribute long tiltY;
+ [NeedsCallerType]
readonly attribute long twist;
+ [NeedsCallerType]
readonly attribute double altitudeAngle;
+ [NeedsCallerType]
readonly attribute double azimuthAngle;
+ [NeedsCallerType]
readonly attribute DOMString pointerType;
readonly attribute boolean isPrimary;
=====================================
layout/base/PositionedEventTargeting.cpp
=====================================
@@ -16,6 +16,7 @@
#include "mozilla/ToString.h"
#include "mozilla/ViewportUtils.h"
#include "mozilla/dom/MouseEventBinding.h"
+#include "mozilla/dom/TouchEvent.h"
#include "mozilla/gfx/Matrix.h"
#include "mozilla/layers/LayersTypes.h"
#include "nsContainerFrame.h"
@@ -173,9 +174,7 @@ static bool HasTouchListener(const nsIContent* aContent) {
return false;
}
- // FIXME: Should this really use the pref rather than TouchEvent::PrefEnabled
- // or such?
- if (!StaticPrefs::dom_w3c_touch_events_enabled()) {
+ if (!TouchEvent::PrefEnabled(aContent->OwnerDoc()->GetDocShell())) {
return false;
}
=====================================
toolkit/components/resistfingerprinting/RFPTargets.inc
=====================================
@@ -34,7 +34,7 @@ ITEM_VALUE(NavigatorHWConcurrency, 16)
ITEM_VALUE(NavigatorOscpu, 17)
ITEM_VALUE(NavigatorPlatform, 18)
ITEM_VALUE(NavigatorUserAgent, 19)
-ITEM_VALUE(PointerId, 20)
+// We no longer use PointerId, it can renamed and reused
ITEM_VALUE(StreamVideoFacingMode, 21)
ITEM_VALUE(JSDateTimeUTC, 22)
ITEM_VALUE(JSMathFdlibm, 23)
@@ -104,6 +104,7 @@ ITEM_VALUE(DiskStorageLimit, 70)
ITEM_VALUE(WebCodecs, 71)
ITEM_VALUE(NavigatorHWConcurrencyTiered,74)
+// !!! Adding a new target? Rename PointerId and repurpose it.
// !!! Don't forget to update kDefaultFingerprintingProtections in nsRFPService.cpp
// if necessary.
=====================================
toolkit/components/resistfingerprinting/nsRFPService.cpp
=====================================
@@ -303,13 +303,6 @@ Maybe<bool> nsRFPService::HandleExeptionalRFPTargets(
StaticPrefs::privacy_spoof_english_DoNotUseDirectly() == 2);
}
- // We don't spoof the pointerId on multi-touch devices.
-#if SPOOFED_MAX_TOUCH_POINTS > 0
- if (aTarget == RFPTarget::PointerId) {
- return Some(false);
- }
-#endif
-
#ifdef ANDROID
if (aTarget == RFPTarget::FontVisibilityBaseSystem ||
aTarget == RFPTarget::FontVisibilityLangPack) {
=====================================
widget/WidgetEventImpl.cpp
=====================================
@@ -589,23 +589,6 @@ bool WidgetEvent::IsBlockedForFingerprintingResistance() const {
keyboardEvent->mKeyNameIndex == KEY_NAME_INDEX_Control ||
keyboardEvent->mKeyNameIndex == KEY_NAME_INDEX_AltGraph);
}
- case ePointerEventClass: {
- if (IsPointerEventMessageOriginallyMouseEventMessage(mMessage)) {
- return false;
- }
-
- if (SPOOFED_MAX_TOUCH_POINTS > 0) {
- return false;
- }
-
- const WidgetPointerEvent* pointerEvent = AsPointerEvent();
-
- // We suppress the pointer events if it is not primary for fingerprinting
- // resistance. It is because of that we want to spoof any pointer event
- // into a mouse pointer event and the mouse pointer event only has
- // isPrimary as true.
- return !pointerEvent->mIsPrimary;
- }
default:
return false;
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/7966a2…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/7966a2…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser-update-responses][main] release: new version, 14.5.9 (Android-only, amended)
by ma1 (@ma1) 15 Oct '25
by ma1 (@ma1) 15 Oct '25
15 Oct '25
ma1 pushed to branch main at The Tor Project / Applications / Tor Browser update responses
Commits:
5e9c60ba by hackademix at 2025-10-15T15:18:57+02:00
release: new version, 14.5.9 (Android-only, amended)
- - - - -
2 changed files:
- + update_3/release/.htaccess
- + update_3/release/downloads.json
Changes:
=====================================
update_3/release/.htaccess
=====================================
@@ -0,0 +1,23 @@
+RewriteEngine On
+# bug 26570: Redirect pre-8.0 stable users to a separate update directory
+RewriteRule ^[^/]+/[4567]\..*/.* https://aus1.torproject.org/torbrowser/update_pre8.0/release/$0 [last]
+# tor-browser-build#40678: Force all <=11.5.7 users to update through 11.5.8 before 12.0
+RewriteRule ^[^/]+/[89]\..*/.* https://aus1.torproject.org/torbrowser/update_pre12.0/release/$0 [last]
+RewriteRule ^[^/]+/10\..*/.* https://aus1.torproject.org/torbrowser/update_pre12.0/release/$0 [last]
+RewriteRule ^[^/]+/11\.0.*/.* https://aus1.torproject.org/torbrowser/update_pre12.0/release/$0 [last]
+RewriteRule ^[^/]+/11\.5/.* https://aus1.torproject.org/torbrowser/update_pre12.0/release/$0 [last]
+RewriteRule ^[^/]+/11\.5\.[01234567]/.* https://aus1.torproject.org/torbrowser/update_pre12.0/release/$0 [last]
+# tor-browser-build#41270: make 13.5.7 a watershed update
+RewriteRule ^[^/]+/1[12]\.[05].*/.* https://aus1.torproject.org/torbrowser/update_pre14.0/release/$0 [last]
+RewriteRule ^[^/]+/13\.0.*/.* https://aus1.torproject.org/torbrowser/update_pre14.0/release/$0 [last]
+RewriteRule ^[^/]+/13\.5/.* https://aus1.torproject.org/torbrowser/update_pre14.0/release/$0 [last]
+RewriteRule ^[^/]+/13\.5\.[0123456]/.* https://aus1.torproject.org/torbrowser/update_pre14.0/release/$0 [last]
+RewriteRule ^Linux_aarch64-gcc3/(.*) linux-aarch64/$1 [last]
+RewriteRule ^Linux_x86-gcc3/(.*) linux-i686/$1 [last]
+RewriteRule ^Linux_x86_64-gcc3/(.*) linux-x86_64/$1 [last]
+RewriteRule ^Darwin_x86_64-gcc3/(.*) macos/$1 [last]
+RewriteRule ^Darwin_aarch64-gcc3/(.*) macos/$1 [last]
+RewriteRule ^WINNT_x86-gcc3/(.*) windows-i686/$1 [last]
+RewriteRule ^WINNT_x86-gcc3-x86/(.*) windows-i686/$1 [last]
+RewriteRule ^WINNT_x86-gcc3-x64/(.*) windows-i686/$1 [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/(.*) windows-x86_64/$1 [last]
=====================================
update_3/release/downloads.json
=====================================
@@ -0,0 +1,37 @@
+{
+ "comment" : "This file is deprecated and should not be used. Please use the files download-$platform.json instead.",
+ "downloads" : {
+ "linux-i686" : {
+ "ALL" : {
+ "binary" : "https://dist.torproject.org/torbrowser/14.5.8/tor-browser-linux-i686-14.5.8…",
+ "sig" : "https://dist.torproject.org/torbrowser/14.5.8/tor-browser-linux-i686-14.5.8…"
+ }
+ },
+ "linux-x86_64" : {
+ "ALL" : {
+ "binary" : "https://dist.torproject.org/torbrowser/14.5.8/tor-browser-linux-x86_64-14.5…",
+ "sig" : "https://dist.torproject.org/torbrowser/14.5.8/tor-browser-linux-x86_64-14.5…"
+ }
+ },
+ "macos" : {
+ "ALL" : {
+ "binary" : "https://dist.torproject.org/torbrowser/14.5.8/tor-browser-macos-14.5.8.dmg",
+ "sig" : "https://dist.torproject.org/torbrowser/14.5.8/tor-browser-macos-14.5.8.dmg.…"
+ }
+ },
+ "win32" : {
+ "ALL" : {
+ "binary" : "https://dist.torproject.org/torbrowser/14.5.8/tor-browser-windows-i686-port…",
+ "sig" : "https://dist.torproject.org/torbrowser/14.5.8/tor-browser-windows-i686-port…"
+ }
+ },
+ "win64" : {
+ "ALL" : {
+ "binary" : "https://dist.torproject.org/torbrowser/14.5.8/tor-browser-windows-x86_64-po…",
+ "sig" : "https://dist.torproject.org/torbrowser/14.5.8/tor-browser-windows-x86_64-po…"
+ }
+ }
+ },
+ "tag" : "tbb-14.5.8-build1",
+ "version" : "14.5.8"
+}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-140.4.0esr-15.0-1] fixup! [android] Disable features and functionality
by morgan (@morgan) 15 Oct '25
by morgan (@morgan) 15 Oct '25
15 Oct '25
morgan pushed to branch tor-browser-140.4.0esr-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
7966a205 by Dan Ballard at 2025-10-15T13:18:10+00:00
fixup! [android] Disable features and functionality
Bug 43676: preemptively disable unified trust panel by default so we are tracking for next ESR
- - - - -
1 changed file:
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
Changes:
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
=====================================
@@ -2090,7 +2090,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
*/
var enableUnifiedTrustPanel by booleanPreference(
key = appContext.getPreferenceKey(R.string.pref_key_enable_unified_trust_panel),
- default = FeatureFlags.UNIFIED_TRUST_PANEL,
+ default = false
)
/**
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/7966a20…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/7966a20…
You're receiving this email because of your account on gitlab.torproject.org.
1
0