tbb-commits
Threads by month
- ----- 2025 -----
- 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
March 2024
- 1 participants
- 178 discussions

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.9.0esr-13.5-1] Bug 1886852 - Avoid registering unnecessary MessageManager listeners when SHIP is enabled, r=smaug!
by ma1 (@ma1) 26 Mar '24
by ma1 (@ma1) 26 Mar '24
26 Mar '24
ma1 pushed to branch mullvad-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
b6e29f24 by Nika Layzell at 2024-03-26T18:25:59+01:00
Bug 1886852 - Avoid registering unnecessary MessageManager listeners when SHIP is enabled, r=smaug!
Differential Revision: https://phabricator.services.mozilla.com/D205377
- - - - -
1 changed file:
- browser/components/sessionstore/SessionStore.sys.mjs
Changes:
=====================================
browser/components/sessionstore/SessionStore.sys.mjs
=====================================
@@ -1422,6 +1422,13 @@ var SessionStoreInternal = {
* and thus enables communication with OOP tabs.
*/
receiveMessage(aMessage) {
+ if (Services.appinfo.sessionHistoryInParent) {
+ throw new Error(
+ `received unexpected message '${aMessage.name}' with ` +
+ `sessionHistoryInParent enabled`
+ );
+ }
+
// If we got here, that means we're dealing with a frame message
// manager message, so the target will be a <xul:browser>.
var browser = aMessage.target;
@@ -1600,14 +1607,14 @@ var SessionStoreInternal = {
// internal data about the window.
aWindow.__SSi = this._generateWindowID();
- let mm = aWindow.getGroupMessageManager("browsers");
- MESSAGES.forEach(msg => {
- let listenWhenClosed = CLOSED_MESSAGES.has(msg);
- mm.addMessageListener(msg, this, listenWhenClosed);
- });
-
- // Load the frame script after registering listeners.
if (!Services.appinfo.sessionHistoryInParent) {
+ let mm = aWindow.getGroupMessageManager("browsers");
+ MESSAGES.forEach(msg => {
+ let listenWhenClosed = CLOSED_MESSAGES.has(msg);
+ mm.addMessageListener(msg, this, listenWhenClosed);
+ });
+
+ // Load the frame script after registering listeners.
mm.loadFrameScript(
"chrome://browser/content/content-sessionStore.js",
true,
@@ -2083,8 +2090,10 @@ var SessionStoreInternal = {
// Cache the window state until it is completely gone.
DyingWindowCache.set(aWindow, winData);
- let mm = aWindow.getGroupMessageManager("browsers");
- MESSAGES.forEach(msg => mm.removeMessageListener(msg, this));
+ if (!Services.appinfo.sessionHistoryInParent) {
+ let mm = aWindow.getGroupMessageManager("browsers");
+ MESSAGES.forEach(msg => mm.removeMessageListener(msg, this));
+ }
this._saveableClosedWindowData.delete(winData);
delete aWindow.__SSi;
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/b6e…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/b6e…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][base-browser-115.9.0esr-13.5-1] Bug 1886852 - Avoid registering unnecessary MessageManager listeners when SHIP is enabled, r=smaug!
by ma1 (@ma1) 26 Mar '24
by ma1 (@ma1) 26 Mar '24
26 Mar '24
ma1 pushed to branch base-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
8e8ac7a1 by Nika Layzell at 2024-03-26T18:23:53+01:00
Bug 1886852 - Avoid registering unnecessary MessageManager listeners when SHIP is enabled, r=smaug!
Differential Revision: https://phabricator.services.mozilla.com/D205377
- - - - -
1 changed file:
- browser/components/sessionstore/SessionStore.sys.mjs
Changes:
=====================================
browser/components/sessionstore/SessionStore.sys.mjs
=====================================
@@ -1422,6 +1422,13 @@ var SessionStoreInternal = {
* and thus enables communication with OOP tabs.
*/
receiveMessage(aMessage) {
+ if (Services.appinfo.sessionHistoryInParent) {
+ throw new Error(
+ `received unexpected message '${aMessage.name}' with ` +
+ `sessionHistoryInParent enabled`
+ );
+ }
+
// If we got here, that means we're dealing with a frame message
// manager message, so the target will be a <xul:browser>.
var browser = aMessage.target;
@@ -1600,14 +1607,14 @@ var SessionStoreInternal = {
// internal data about the window.
aWindow.__SSi = this._generateWindowID();
- let mm = aWindow.getGroupMessageManager("browsers");
- MESSAGES.forEach(msg => {
- let listenWhenClosed = CLOSED_MESSAGES.has(msg);
- mm.addMessageListener(msg, this, listenWhenClosed);
- });
-
- // Load the frame script after registering listeners.
if (!Services.appinfo.sessionHistoryInParent) {
+ let mm = aWindow.getGroupMessageManager("browsers");
+ MESSAGES.forEach(msg => {
+ let listenWhenClosed = CLOSED_MESSAGES.has(msg);
+ mm.addMessageListener(msg, this, listenWhenClosed);
+ });
+
+ // Load the frame script after registering listeners.
mm.loadFrameScript(
"chrome://browser/content/content-sessionStore.js",
true,
@@ -2083,8 +2090,10 @@ var SessionStoreInternal = {
// Cache the window state until it is completely gone.
DyingWindowCache.set(aWindow, winData);
- let mm = aWindow.getGroupMessageManager("browsers");
- MESSAGES.forEach(msg => mm.removeMessageListener(msg, this));
+ if (!Services.appinfo.sessionHistoryInParent) {
+ let mm = aWindow.getGroupMessageManager("browsers");
+ MESSAGES.forEach(msg => mm.removeMessageListener(msg, this));
+ }
this._saveableClosedWindowData.delete(winData);
delete aWindow.__SSi;
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/8e8ac7a…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/8e8ac7a…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.9.0esr-13.5-1] Bug 42472: Spoof timezone in XSLT.
by Pier Angelo Vendrame (@pierov) 26 Mar '24
by Pier Angelo Vendrame (@pierov) 26 Mar '24
26 Mar '24
Pier Angelo Vendrame pushed to branch mullvad-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
a18ee3be by Pier Angelo Vendrame at 2024-03-26T18:21:50+01:00
Bug 42472: Spoof timezone in XSLT.
- - - - -
1 changed file:
- dom/xslt/xslt/txEXSLTFunctions.cpp
Changes:
=====================================
dom/xslt/xslt/txEXSLTFunctions.cpp
=====================================
@@ -591,7 +591,14 @@ nsresult txEXSLTFunctionCall::evaluate(txIEvalContext* aContext,
// http://exslt.org/date/functions/date-time/
PRExplodedTime prtime;
- PR_ExplodeTime(PR_Now(), PR_LocalTimeParameters, &prtime);
+ PR_ExplodeTime(
+ PR_Now(),
+ // We are not allowed to access the Document when evaluating this, so
+ // fall back to the general function.
+ nsContentUtils::ShouldResistFingerprinting(RFPTarget::Unknown)
+ ? PR_GMTParameters
+ : PR_LocalTimeParameters,
+ &prtime);
int32_t offset =
(prtime.tm_params.tp_gmt_offset + prtime.tm_params.tp_dst_offset) /
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/a18…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/a18…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][base-browser-115.9.0esr-13.5-1] Bug 42472: Spoof timezone in XSLT.
by Pier Angelo Vendrame (@pierov) 26 Mar '24
by Pier Angelo Vendrame (@pierov) 26 Mar '24
26 Mar '24
Pier Angelo Vendrame pushed to branch base-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
d81946dd by Pier Angelo Vendrame at 2024-03-26T18:21:17+01:00
Bug 42472: Spoof timezone in XSLT.
- - - - -
1 changed file:
- dom/xslt/xslt/txEXSLTFunctions.cpp
Changes:
=====================================
dom/xslt/xslt/txEXSLTFunctions.cpp
=====================================
@@ -591,7 +591,14 @@ nsresult txEXSLTFunctionCall::evaluate(txIEvalContext* aContext,
// http://exslt.org/date/functions/date-time/
PRExplodedTime prtime;
- PR_ExplodeTime(PR_Now(), PR_LocalTimeParameters, &prtime);
+ PR_ExplodeTime(
+ PR_Now(),
+ // We are not allowed to access the Document when evaluating this, so
+ // fall back to the general function.
+ nsContentUtils::ShouldResistFingerprinting(RFPTarget::Unknown)
+ ? PR_GMTParameters
+ : PR_LocalTimeParameters,
+ &prtime);
int32_t offset =
(prtime.tm_params.tp_gmt_offset + prtime.tm_params.tp_dst_offset) /
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/d81946d…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/d81946d…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.9.0esr-13.5-1] Bug 42472: Spoof timezone in XSLT.
by Pier Angelo Vendrame (@pierov) 26 Mar '24
by Pier Angelo Vendrame (@pierov) 26 Mar '24
26 Mar '24
Pier Angelo Vendrame pushed to branch tor-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
570b6c56 by Pier Angelo Vendrame at 2024-03-26T18:04:32+01:00
Bug 42472: Spoof timezone in XSLT.
- - - - -
1 changed file:
- dom/xslt/xslt/txEXSLTFunctions.cpp
Changes:
=====================================
dom/xslt/xslt/txEXSLTFunctions.cpp
=====================================
@@ -591,7 +591,14 @@ nsresult txEXSLTFunctionCall::evaluate(txIEvalContext* aContext,
// http://exslt.org/date/functions/date-time/
PRExplodedTime prtime;
- PR_ExplodeTime(PR_Now(), PR_LocalTimeParameters, &prtime);
+ PR_ExplodeTime(
+ PR_Now(),
+ // We are not allowed to access the Document when evaluating this, so
+ // fall back to the general function.
+ nsContentUtils::ShouldResistFingerprinting(RFPTarget::Unknown)
+ ? PR_GMTParameters
+ : PR_LocalTimeParameters,
+ &prtime);
int32_t offset =
(prtime.tm_params.tp_gmt_offset + prtime.tm_params.tp_dst_offset) /
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/570b6c5…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/570b6c5…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser][mullvad-browser-115.9.0esr-13.5-1] 3 commits: Revert "fixup! Tor Browser localization migration scripts."
by richard (@richard) 25 Mar '24
by richard (@richard) 25 Mar '24
25 Mar '24
richard pushed to branch mullvad-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser
Commits:
e32712bc by Richard Pospesel at 2024-03-25T22:19:40+00:00
Revert "fixup! Tor Browser localization migration scripts."
This reverts commit a8282d9ca507994cf21025f22c6ba3e13d5e3973.
- - - - -
edaaba1d by Henry Wilkes at 2024-03-25T22:25:35+00:00
fixup! Bug 40925: Implemented the Security Level component
Bug 42214: Migrate security level strings to Fluent.
- - - - -
a166803d by Henry Wilkes at 2024-03-25T22:27:49+00:00
fixup! Base Browser strings
Bug 42214: Migrate security level strings to Fluent.
Also change some strings to be sentence case in English.
- - - - -
7 changed files:
- browser/components/preferences/preferences.xhtml
- browser/components/securitylevel/content/securityLevel.js
- browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
- browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
- browser/locales/en-US/browser/base-browser.ftl
- browser/locales/jar.mn
- − tools/torbrowser/l10n/migrations/bug-42211-new-identity.py
Changes:
=====================================
browser/components/preferences/preferences.xhtml
=====================================
@@ -58,6 +58,7 @@
<link rel="localization" href="security/certificates/certManager.ftl"/>
<link rel="localization" href="security/certificates/deviceManager.ftl"/>
<link rel="localization" href="toolkit/updates/history.ftl"/>
+ <link rel="localization" href="browser/base-browser.ftl"/>
<link rel="localization" href="browser/mullvad-browser/preferences.ftl"/>
<link rel="shortcut icon" href="chrome://global/skin/icons/settings.svg"/>
=====================================
browser/components/securitylevel/content/securityLevel.js
=====================================
@@ -8,65 +8,6 @@ ChromeUtils.defineModuleGetter(
"resource://gre/modules/SecurityLevel.jsm"
);
-XPCOMUtils.defineLazyGetter(this, "SecurityLevelStrings", () => {
- let strings = {
- // Generic terms
- security_level: "Security Level",
- security_level_standard: "Standard",
- security_level_safer: "Safer",
- security_level_safest: "Safest",
- security_level_tooltip_standard: "Security Level: Standard",
- security_level_tooltip_safer: "Security Level: Safer",
- security_level_tooltip_safest: "Security Level: Safest",
- // Shown only for custom level
- security_level_custom: "Custom",
- security_level_restore: "Restore Defaults",
- security_level_learn_more: "Learn more",
- // Panel
- security_level_open_settings: "Settings…",
- security_level_standard_summary:
- "All browser and website features are enabled.",
- security_level_safer_summary:
- "Disables website features that are often dangerous, causing some sites to lose functionality.",
- security_level_safest_summary:
- "Only allows website features required for static sites and basic services. These changes affect images, media, and scripts.",
- security_level_custom_heading: "Custom security level configured",
- security_level_custom_summary:
- "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.",
- // Security level section in about:preferences#privacy
- security_level_overview:
- "Disable certain web features that can be used to attack your security and anonymity.",
- security_level_list_safer: "At the safer setting:",
- security_level_list_safest: "At the safest setting:",
- // Strings for descriptions
- security_level_js_https_only: "JavaScript is disabled on non-HTTPS sites.",
- security_level_js_disabled:
- "JavaScript is disabled by default on all sites.",
- security_level_limit_typography:
- "Some fonts and math symbols are disabled.",
- security_level_limit_typography_svg:
- "Some fonts, icons, math symbols, and images are disabled.",
- security_level_limit_media:
- "Audio and video (HTML5 media), and WebGL are click-to-play.",
- };
- let bundle = null;
- try {
- bundle = Services.strings.createBundle(
- "chrome://browser/locale/securityLevel.properties"
- );
- } catch (e) {
- console.warn("Could not load the Security Level strings");
- }
- if (bundle) {
- for (const key of Object.keys(strings)) {
- try {
- strings[key] = bundle.GetStringFromName(key);
- } catch (e) {}
- }
- }
- return strings;
-});
-
/*
Security Level Button Code
@@ -100,12 +41,30 @@ var SecurityLevelButton = {
if (!level) {
return;
}
- const customStr = SecurityLevelPrefs.securityCustom ? "_custom" : "";
- this._button.setAttribute("level", `${level}${customStr}`);
- this._button.setAttribute(
- "tooltiptext",
- SecurityLevelStrings[`security_level_tooltip_${level}`]
- );
+ const custom = SecurityLevelPrefs.securityCustom;
+ this._button.setAttribute("level", custom ? `${level}_custom` : level);
+
+ let l10nIdLevel;
+ switch (level) {
+ case "standard":
+ l10nIdLevel = "security-level-toolbar-button-standard";
+ break;
+ case "safer":
+ l10nIdLevel = "security-level-toolbar-button-safer";
+ break;
+ case "safest":
+ l10nIdLevel = "security-level-toolbar-button-safest";
+ break;
+ default:
+ throw Error(`Unhandled level: ${level}`);
+ }
+ if (custom) {
+ // Don't distinguish between the different levels when in the custom
+ // state. We just want to emphasise that it is custom rather than any
+ // specific level.
+ l10nIdLevel = "security-level-toolbar-button-custom";
+ }
+ document.l10n.setAttributes(this._button, l10nIdLevel);
},
/**
@@ -159,7 +118,6 @@ var SecurityLevelButton = {
window.gNavToolbox.palette.querySelector("#security-level-button");
// Set a label to be be used as the accessible name, and to be shown in the
// overflow menu and during customization.
- this._button.setAttribute("label", SecurityLevelStrings.security_level);
this._button.addEventListener("command", () => this.openPopup());
// set the initial class based off of the current pref
this._configUIFromPrefs();
@@ -213,21 +171,12 @@ var SecurityLevelPanel = {
settingsButton: document.getElementById("securityLevel-settings"),
};
- document.getElementById("securityLevel-header").textContent =
- SecurityLevelStrings.security_level;
- this._elements.customName.textContent =
- SecurityLevelStrings.security_level_custom;
const learnMoreEl = document.getElementById("securityLevel-learnMore");
- learnMoreEl.textContent = SecurityLevelStrings.security_level_learn_more;
learnMoreEl.addEventListener("click", event => {
window.openTrustedLinkIn(learnMoreEl.href, "tab");
this.hide();
event.preventDefault();
});
- this._elements.restoreDefaultsButton.textContent =
- SecurityLevelStrings.security_level_restore;
- this._elements.settingsButton.textContent =
- SecurityLevelStrings.security_level_open_settings;
this._elements.restoreDefaultsButton.addEventListener("command", () => {
this.restoreDefaults();
@@ -268,11 +217,30 @@ var SecurityLevelPanel = {
// Descriptions change based on security level
this._elements.background.setAttribute("level", level);
- this._elements.levelName.textContent =
- SecurityLevelStrings[`security_level_${level}`];
- this._elements.summary.textContent = custom
- ? SecurityLevelStrings.security_level_custom_summary
- : SecurityLevelStrings[`security_level_${level}_summary`];
+ let l10nIdLevel;
+ let l10nIdSummary;
+ switch (level) {
+ case "standard":
+ l10nIdLevel = "security-level-panel-level-standard";
+ l10nIdSummary = "security-level-summary-standard";
+ break;
+ case "safer":
+ l10nIdLevel = "security-level-panel-level-safer";
+ l10nIdSummary = "security-level-summary-safer";
+ break;
+ case "safest":
+ l10nIdLevel = "security-level-panel-level-safest";
+ l10nIdSummary = "security-level-summary-safest";
+ break;
+ default:
+ throw Error(`Unhandled level: ${level}`);
+ }
+ if (custom) {
+ l10nIdSummary = "security-level-summary-custom";
+ }
+
+ document.l10n.setAttributes(this._elements.levelName, l10nIdLevel);
+ document.l10n.setAttributes(this._elements.summary, l10nIdSummary);
},
/**
@@ -358,25 +326,13 @@ var SecurityLevelPreferences = {
this._customNotification = document.getElementById(
"securityLevel-customNotification"
);
- this._radiogroup = document.getElementById("securityLevel-radiogroup");
-
- document.querySelector("#securityLevel-groupbox h2").textContent =
- SecurityLevelStrings.security_level;
- document.getElementById("securityLevel-overview").textContent =
- SecurityLevelStrings.security_level_overview;
document
- .getElementById("securityLevel-learnMore")
- .setAttribute("value", SecurityLevelStrings.security_level_learn_more);
-
- document.getElementById("securityLevel-customHeading").textContent =
- SecurityLevelStrings.security_level_custom_heading;
- document.getElementById("securityLevel-customDescription").textContent =
- SecurityLevelStrings.security_level_custom_summary;
- const restoreDefaultsButton = document.getElementById(
- "securityLevel-restoreDefaults"
- );
- restoreDefaultsButton.textContent =
- SecurityLevelStrings.security_level_restore;
+ .getElementById("securityLevel-restoreDefaults")
+ .addEventListener("command", () => {
+ SecurityLevelPrefs.securityCustom = false;
+ });
+
+ this._radiogroup = document.getElementById("securityLevel-radiogroup");
this._radioOptions = Array.from(
this._radiogroup.querySelectorAll(".securityLevel-radio-option"),
@@ -384,46 +340,7 @@ var SecurityLevelPreferences = {
return { container, radio: container.querySelector("radio") };
}
);
- const descListItemsMap = {
- safer: [
- SecurityLevelStrings.security_level_js_https_only,
- SecurityLevelStrings.security_level_limit_typography,
- SecurityLevelStrings.security_level_limit_media,
- ],
- safest: [
- SecurityLevelStrings.security_level_js_disabled,
- SecurityLevelStrings.security_level_limit_typography_svg,
- SecurityLevelStrings.security_level_limit_media,
- ],
- };
- for (const { container, radio } of this._radioOptions) {
- const level = radio.value;
- radio.setAttribute(
- "label",
- SecurityLevelStrings[`security_level_${level}`]
- );
- container.querySelector(".summary").textContent =
- SecurityLevelStrings[`security_level_${level}_summary`];
- const descListItems = descListItemsMap[level];
- if (!descListItems) {
- continue;
- }
- const descrList = container.querySelector(
- ".securityLevel-descriptionList"
- );
- // TODO: Add the elements in securityLevelPreferences.inc.xhtml again
- // when we switch to Fluent
- for (const text of descListItems) {
- let elem = document.createXULElement("description");
- elem.textContent = text;
- elem.className = "indent";
- descrList.append(elem);
- }
- }
- restoreDefaultsButton.addEventListener("command", () => {
- SecurityLevelPrefs.securityCustom = false;
- });
this._radiogroup.addEventListener("select", () => {
SecurityLevelPrefs.securityLevel = this._radiogroup.value;
});
=====================================
browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
=====================================
@@ -7,20 +7,35 @@
level="top"
class="cui-widget-panel panel-no-padding">
<box class="panel-header">
- <html:h1 id="securityLevel-header"></html:h1>
+ <html:h1
+ id="securityLevel-header"
+ data-l10n-id="security-level-panel-heading"
+ ></html:h1>
</box>
<toolbarseparator id="securityLevel-separator"></toolbarseparator>
<vbox id="securityLevel-background" class="panel-subview-body">
<html:p id="securityLevel-subheading">
<html:span id="securityLevel-level"></html:span>
- <html:span id="securityLevel-custom"></html:span>
+ <html:span
+ id="securityLevel-custom"
+ data-l10n-id="security-level-panel-custom-badge"
+ ></html:span>
</html:p>
<html:p id="securityLevel-summary"></html:p>
- <html:a id="securityLevel-learnMore" href="https://mullvad.net/en/browser/hard-facts#security-levels">
- </html:a>
+ <html:a
+ id="securityLevel-learnMore"
+ data-l10n-id="security-level-panel-learn-more-link"
+ href="https://mullvad.net/en/browser/hard-facts#security-levels"
+ ></html:a>
</vbox>
<hbox class="panel-footer">
- <button id="securityLevel-settings"/>
- <button id="securityLevel-restoreDefaults"/>
+ <button
+ id="securityLevel-settings"
+ data-l10n-id="security-level-panel-open-settings-button"
+ />
+ <button
+ id="securityLevel-restoreDefaults"
+ data-l10n-id="security-level-restore-defaults-button"
+ />
</hbox>
</panel>
=====================================
browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
=====================================
@@ -2,36 +2,63 @@
data-category="panePrivacy"
data-subcategory="securitylevel"
hidden="true">
- <label><html:h2></html:h2></label>
+ <label>
+ <html:h2 data-l10n-id="security-level-preferences-heading"></html:h2>
+ </label>
<vbox flex="1">
<description flex="1">
- <html:span id="securityLevel-overview" class="tail-with-learn-more">
- </html:span>
- <label id="securityLevel-learnMore"
- class="learnMore text-link"
- is="text-link"
- href="https://mullvad.net/en/browser/hard-facts#security-levels"/>
+ <html:span
+ id="securityLevel-overview"
+ class="tail-with-learn-more"
+ data-l10n-id="security-level-preferences-overview"
+ ></html:span>
+ <label
+ id="securityLevel-learnMore"
+ class="learnMore text-link"
+ is="text-link"
+ data-l10n-id="security-level-preferences-learn-more-link"
+ href="https://mullvad.net/en/browser/hard-facts#security-levels"
+ />
</description>
- <hbox id="securityLevel-customNotification"
- class="info-box-container"
- flex="1">
+ <hbox
+ id="securityLevel-customNotification"
+ class="info-box-container"
+ flex="1"
+ >
<hbox class="info-icon-container">
<image class="info-icon securityLevel-custom-warning-icon"/>
</hbox>
<vbox flex="1">
- <label id="securityLevel-customHeading"/>
- <description id="securityLevel-customDescription" flex="1"/>
+ <label
+ id="securityLevel-customHeading"
+ data-l10n-id="security-level-preferences-custom-heading"
+ />
+ <description
+ id="securityLevel-customDescription"
+ data-l10n-id="security-level-summary-custom"
+ flex="1"
+ />
</vbox>
<hbox align="center">
- <button id="securityLevel-restoreDefaults"/>
+ <button
+ id="securityLevel-restoreDefaults"
+ data-l10n-id="security-level-restore-defaults-button"
+ />
</hbox>
</hbox>
<radiogroup id="securityLevel-radiogroup">
<vbox class="securityLevel-radio-option">
- <radio value="standard"
- aria-describedby="securityLevelSummary-standard"/>
+ <radio
+ value="standard"
+ data-l10n-id="security-level-preferences-level-standard"
+ aria-describedby="securityLevelSummary-standard"
+ />
<vbox id="securityLevelSummary-standard">
- <description class="summary indent" flex="1"/>
+ <description
+ class="summary indent"
+ flex="1"
+ data-l10n-id="security-level-summary-standard"
+ />
</vbox>
</vbox>
<vbox class="securityLevel-radio-option">
@@ -40,19 +67,59 @@
- securityLevel-descriptionList is shown or hidden, its text content
- is included or excluded from the accessible description,
- respectively. -->
- <radio value="safer"
- aria-describedby="securityLevelSummary-safer"/>
+ <radio
+ value="safer"
+ data-l10n-id="security-level-preferences-level-safer"
+ aria-describedby="securityLevelSummary-safer"
+ />
<vbox id="securityLevelSummary-safer">
- <description class="summary indent" flex="1"/>
- <vbox class="securityLevel-descriptionList indent"/>
+ <description
+ class="summary indent"
+ flex="1"
+ data-l10n-id="security-level-summary-safer"
+ />
+ <vbox class="securityLevel-descriptionList indent">
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-https-only-javascript"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-media"
+ />
+ </vbox>
</vbox>
</vbox>
<vbox class="securityLevel-radio-option">
- <radio value="safest"
- aria-describedby="securityLevelSummary-safest"/>
+ <radio
+ value="safest"
+ data-l10n-id="security-level-preferences-level-safest"
+ aria-describedby="securityLevelSummary-safest"
+ />
<vbox id="securityLevelSummary-safest">
- <description class="summary indent" flex="1"/>
- <vbox class="securityLevel-descriptionList indent"/>
+ <description
+ class="summary indent"
+ flex="1"
+ data-l10n-id="security-level-summary-safest"
+ />
+ <vbox class="securityLevel-descriptionList indent">
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-disabled-javascript"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols-and-images"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-media"
+ />
+ </vbox>
</vbox>
</vbox>
</radiogroup>
=====================================
browser/locales/en-US/browser/base-browser.ftl
=====================================
@@ -70,6 +70,7 @@ new-identity-dialog-confirm =
new-identity-blocked-home-notification = { -brand-short-name } blocked your homepage ({ $url }) from loading because it might recognize your previous session.
# Button to continue loading the home page, despite the warning message.
new-identity-blocked-home-ignore-button = Load it anyway
+
## Preferences - Letterboxing.
# The word "Letterboxing" is the proper noun for the Tor Browser feature, and is therefore capitalised.
@@ -94,3 +95,74 @@ letterboxing-disabled-description = Letterboxing is currently disabled.
# "Letterboxing" should be treated as a feature/product name, and likely not changed in other languages.
letterboxing-enable-button =
.label = Enable Letterboxing
+
+## Security level toolbar button.
+## Uses sentence case in English (US).
+## ".label" is the accessible name, and shown in the overflow menu and when customizing the toolbar.
+
+security-level-toolbar-button-standard =
+ .label = Security level
+ .tooltiptext = Security level: Standard
+security-level-toolbar-button-safer =
+ .label = Security level
+ .tooltiptext = Security level: Safer
+security-level-toolbar-button-safest =
+ .label = Security level
+ .tooltiptext = Security level: Safest
+# Used when the user is in some custom configuration that does not match a security level.
+security-level-toolbar-button-custom =
+ .label = Security level
+ .tooltiptext = Security level: Custom
+
+## Security level popup panel.
+
+# Uses sentence case in English (US).
+security-level-panel-heading = Security level
+
+security-level-panel-level-standard = Standard
+security-level-panel-level-safer = Safer
+security-level-panel-level-safest = Safest
+security-level-panel-learn-more-link = Learn more
+# Button to open security level settings.
+security-level-panel-open-settings-button = Settings…
+
+## Security level settings.
+
+security-level-preferences-heading = Security Level
+security-level-preferences-overview = Disable certain web features that can be used to attack your security and anonymity.
+security-level-preferences-learn-more-link = Learn more
+security-level-preferences-level-standard =
+ .label = Standard
+security-level-preferences-level-safer =
+ .label = Safer
+security-level-preferences-level-safest =
+ .label = Safest
+
+## Security level summaries shown in security panel and settings.
+
+security-level-summary-standard = All browser and website features are enabled.
+security-level-summary-safer = Disables website features that are often dangerous, causing some sites to lose functionality.
+security-level-summary-safest = Only allows website features required for static sites and basic services. These changes affect images, media, and scripts.
+
+## Security level feature bullet points.
+## Shown in the settings under the security level when it is selected.
+
+security-level-preferences-bullet-https-only-javascript = JavaScript is disabled on non-HTTPS sites.
+security-level-preferences-bullet-limit-font-and-symbols = Some fonts and math symbols are disabled.
+security-level-preferences-bullet-limit-media = Audio and video (HTML5 media), and WebGL are click-to-play.
+security-level-preferences-bullet-disabled-javascript = JavaScript is disabled by default on all sites.
+security-level-preferences-bullet-limit-font-and-symbols-and-images = Some fonts, icons, math symbols, and images are disabled.
+
+## Custom security level.
+## Some custom preferences configuration has placed the user outside one of the standard three levels.
+
+# Shown in the security level panel as an orange badge next to the expected level.
+security-level-panel-custom-badge = Custom
+# Shown in the security level settings in a warning box.
+security-level-preferences-custom-heading = Custom security level configured
+# Description of custom state and recommended action.
+# Shown in the security level panel and settings.
+security-level-summary-custom = Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.
+# Button to undo custom changes to the security level and place the user in one of the standard security levels.
+# Shown in the security level panel and settings.
+security-level-restore-defaults-button = Restore defaults
=====================================
browser/locales/jar.mn
=====================================
@@ -32,5 +32,4 @@
locale/browser/safebrowsing/safebrowsing.properties (%chrome/browser/safebrowsing/safebrowsing.properties)
locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties)
locale/browser/syncSetup.properties (%chrome/browser/syncSetup.properties)
- locale/browser/securityLevel.properties (%chrome/browser/securityLevel.properties)
% locale browser-region @AB_CD@ %locale/browser-region/
=====================================
tools/torbrowser/l10n/migrations/bug-42211-new-identity.py deleted
=====================================
@@ -1,48 +0,0 @@
-import fluent.syntax.ast as FTL
-from fluent.migrate.helpers import TERM_REFERENCE, transforms_from
-from fluent.migrate.transforms import REPLACE
-
-
-def migrate(ctx):
- legacy_path = "newIdentity.properties"
-
- ctx.add_transforms(
- "base-browser.ftl",
- "base-browser.ftl",
- transforms_from(
- """
-menu-new-identity =
- .label = { COPY(path, "new_identity") }
- .accesskey = { COPY(path, "new_identity_menu_accesskey") }
-appmenuitem-new-identity =
- .label = { COPY(path, "new_identity_sentence_case") }
-toolbar-new-identity =
- .label = { COPY(path, "new_identity_sentence_case") }
- .tooltiptext = { toolbar-new-identity.label }
-
-new-identity-dialog-title = { COPY(path, "new_identity_prompt_title") }
-new-identity-dialog-never-ask-checkbox =
- .label = { COPY(path, "new_identity_ask_again") }
-
-new-identity-blocked-home-ignore-button = { COPY(path, "new_identity_home_load_button") }
-""",
- path=legacy_path,
- )
- + [
- # Replace "%S" with "{ -brand-short-name }" in confirm button.
- FTL.Message(
- id=FTL.Identifier("new-identity-dialog-confirm"),
- value=None,
- attributes=[
- FTL.Attribute(
- id=FTL.Identifier("label"),
- value=REPLACE(
- legacy_path,
- "new_identity_restart",
- {"%1$S": TERM_REFERENCE("brand-short-name")},
- ),
- ),
- ],
- ),
- ],
- )
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/4d…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/4d…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][base-browser-115.9.0esr-13.5-1] 3 commits: Revert "fixup! Tor Browser localization migration scripts."
by richard (@richard) 25 Mar '24
by richard (@richard) 25 Mar '24
25 Mar '24
richard pushed to branch base-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
ba14a74d by Richard Pospesel at 2024-03-25T22:15:25+00:00
Revert "fixup! Tor Browser localization migration scripts."
This reverts commit 57b8a1d5daf53afed32a8b02aca2508eecfc9bd7.
- - - - -
c14810dd by Henry Wilkes at 2024-03-25T22:16:38+00:00
fixup! Bug 40925: Implemented the Security Level component
Bug 42214: Migrate security level strings to Fluent.
- - - - -
8f87ed96 by Henry Wilkes at 2024-03-25T22:17:23+00:00
fixup! Base Browser strings
Bug 42214: Migrate security level strings to Fluent.
Also change some strings to be sentence case in English.
- - - - -
7 changed files:
- browser/components/preferences/preferences.xhtml
- browser/components/securitylevel/content/securityLevel.js
- browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
- browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
- browser/locales/en-US/browser/base-browser.ftl
- browser/locales/jar.mn
- − tools/torbrowser/l10n/migrations/bug-42211-new-identity.py
Changes:
=====================================
browser/components/preferences/preferences.xhtml
=====================================
@@ -58,6 +58,7 @@
<link rel="localization" href="security/certificates/certManager.ftl"/>
<link rel="localization" href="security/certificates/deviceManager.ftl"/>
<link rel="localization" href="toolkit/updates/history.ftl"/>
+ <link rel="localization" href="browser/base-browser.ftl"/>
<link rel="shortcut icon" href="chrome://global/skin/icons/settings.svg"/>
=====================================
browser/components/securitylevel/content/securityLevel.js
=====================================
@@ -8,65 +8,6 @@ ChromeUtils.defineModuleGetter(
"resource://gre/modules/SecurityLevel.jsm"
);
-XPCOMUtils.defineLazyGetter(this, "SecurityLevelStrings", () => {
- let strings = {
- // Generic terms
- security_level: "Security Level",
- security_level_standard: "Standard",
- security_level_safer: "Safer",
- security_level_safest: "Safest",
- security_level_tooltip_standard: "Security Level: Standard",
- security_level_tooltip_safer: "Security Level: Safer",
- security_level_tooltip_safest: "Security Level: Safest",
- // Shown only for custom level
- security_level_custom: "Custom",
- security_level_restore: "Restore Defaults",
- security_level_learn_more: "Learn more",
- // Panel
- security_level_open_settings: "Settings…",
- security_level_standard_summary:
- "All browser and website features are enabled.",
- security_level_safer_summary:
- "Disables website features that are often dangerous, causing some sites to lose functionality.",
- security_level_safest_summary:
- "Only allows website features required for static sites and basic services. These changes affect images, media, and scripts.",
- security_level_custom_heading: "Custom security level configured",
- security_level_custom_summary:
- "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.",
- // Security level section in about:preferences#privacy
- security_level_overview:
- "Disable certain web features that can be used to attack your security and anonymity.",
- security_level_list_safer: "At the safer setting:",
- security_level_list_safest: "At the safest setting:",
- // Strings for descriptions
- security_level_js_https_only: "JavaScript is disabled on non-HTTPS sites.",
- security_level_js_disabled:
- "JavaScript is disabled by default on all sites.",
- security_level_limit_typography:
- "Some fonts and math symbols are disabled.",
- security_level_limit_typography_svg:
- "Some fonts, icons, math symbols, and images are disabled.",
- security_level_limit_media:
- "Audio and video (HTML5 media), and WebGL are click-to-play.",
- };
- let bundle = null;
- try {
- bundle = Services.strings.createBundle(
- "chrome://browser/locale/securityLevel.properties"
- );
- } catch (e) {
- console.warn("Could not load the Security Level strings");
- }
- if (bundle) {
- for (const key of Object.keys(strings)) {
- try {
- strings[key] = bundle.GetStringFromName(key);
- } catch (e) {}
- }
- }
- return strings;
-});
-
/*
Security Level Button Code
@@ -100,12 +41,30 @@ var SecurityLevelButton = {
if (!level) {
return;
}
- const customStr = SecurityLevelPrefs.securityCustom ? "_custom" : "";
- this._button.setAttribute("level", `${level}${customStr}`);
- this._button.setAttribute(
- "tooltiptext",
- SecurityLevelStrings[`security_level_tooltip_${level}`]
- );
+ const custom = SecurityLevelPrefs.securityCustom;
+ this._button.setAttribute("level", custom ? `${level}_custom` : level);
+
+ let l10nIdLevel;
+ switch (level) {
+ case "standard":
+ l10nIdLevel = "security-level-toolbar-button-standard";
+ break;
+ case "safer":
+ l10nIdLevel = "security-level-toolbar-button-safer";
+ break;
+ case "safest":
+ l10nIdLevel = "security-level-toolbar-button-safest";
+ break;
+ default:
+ throw Error(`Unhandled level: ${level}`);
+ }
+ if (custom) {
+ // Don't distinguish between the different levels when in the custom
+ // state. We just want to emphasise that it is custom rather than any
+ // specific level.
+ l10nIdLevel = "security-level-toolbar-button-custom";
+ }
+ document.l10n.setAttributes(this._button, l10nIdLevel);
},
/**
@@ -159,7 +118,6 @@ var SecurityLevelButton = {
window.gNavToolbox.palette.querySelector("#security-level-button");
// Set a label to be be used as the accessible name, and to be shown in the
// overflow menu and during customization.
- this._button.setAttribute("label", SecurityLevelStrings.security_level);
this._button.addEventListener("command", () => this.openPopup());
// set the initial class based off of the current pref
this._configUIFromPrefs();
@@ -213,21 +171,12 @@ var SecurityLevelPanel = {
settingsButton: document.getElementById("securityLevel-settings"),
};
- document.getElementById("securityLevel-header").textContent =
- SecurityLevelStrings.security_level;
- this._elements.customName.textContent =
- SecurityLevelStrings.security_level_custom;
const learnMoreEl = document.getElementById("securityLevel-learnMore");
- learnMoreEl.textContent = SecurityLevelStrings.security_level_learn_more;
learnMoreEl.addEventListener("click", event => {
window.openTrustedLinkIn(learnMoreEl.href, "tab");
this.hide();
event.preventDefault();
});
- this._elements.restoreDefaultsButton.textContent =
- SecurityLevelStrings.security_level_restore;
- this._elements.settingsButton.textContent =
- SecurityLevelStrings.security_level_open_settings;
this._elements.restoreDefaultsButton.addEventListener("command", () => {
this.restoreDefaults();
@@ -268,11 +217,30 @@ var SecurityLevelPanel = {
// Descriptions change based on security level
this._elements.background.setAttribute("level", level);
- this._elements.levelName.textContent =
- SecurityLevelStrings[`security_level_${level}`];
- this._elements.summary.textContent = custom
- ? SecurityLevelStrings.security_level_custom_summary
- : SecurityLevelStrings[`security_level_${level}_summary`];
+ let l10nIdLevel;
+ let l10nIdSummary;
+ switch (level) {
+ case "standard":
+ l10nIdLevel = "security-level-panel-level-standard";
+ l10nIdSummary = "security-level-summary-standard";
+ break;
+ case "safer":
+ l10nIdLevel = "security-level-panel-level-safer";
+ l10nIdSummary = "security-level-summary-safer";
+ break;
+ case "safest":
+ l10nIdLevel = "security-level-panel-level-safest";
+ l10nIdSummary = "security-level-summary-safest";
+ break;
+ default:
+ throw Error(`Unhandled level: ${level}`);
+ }
+ if (custom) {
+ l10nIdSummary = "security-level-summary-custom";
+ }
+
+ document.l10n.setAttributes(this._elements.levelName, l10nIdLevel);
+ document.l10n.setAttributes(this._elements.summary, l10nIdSummary);
},
/**
@@ -358,25 +326,13 @@ var SecurityLevelPreferences = {
this._customNotification = document.getElementById(
"securityLevel-customNotification"
);
- this._radiogroup = document.getElementById("securityLevel-radiogroup");
-
- document.querySelector("#securityLevel-groupbox h2").textContent =
- SecurityLevelStrings.security_level;
- document.getElementById("securityLevel-overview").textContent =
- SecurityLevelStrings.security_level_overview;
document
- .getElementById("securityLevel-learnMore")
- .setAttribute("value", SecurityLevelStrings.security_level_learn_more);
-
- document.getElementById("securityLevel-customHeading").textContent =
- SecurityLevelStrings.security_level_custom_heading;
- document.getElementById("securityLevel-customDescription").textContent =
- SecurityLevelStrings.security_level_custom_summary;
- const restoreDefaultsButton = document.getElementById(
- "securityLevel-restoreDefaults"
- );
- restoreDefaultsButton.textContent =
- SecurityLevelStrings.security_level_restore;
+ .getElementById("securityLevel-restoreDefaults")
+ .addEventListener("command", () => {
+ SecurityLevelPrefs.securityCustom = false;
+ });
+
+ this._radiogroup = document.getElementById("securityLevel-radiogroup");
this._radioOptions = Array.from(
this._radiogroup.querySelectorAll(".securityLevel-radio-option"),
@@ -384,46 +340,7 @@ var SecurityLevelPreferences = {
return { container, radio: container.querySelector("radio") };
}
);
- const descListItemsMap = {
- safer: [
- SecurityLevelStrings.security_level_js_https_only,
- SecurityLevelStrings.security_level_limit_typography,
- SecurityLevelStrings.security_level_limit_media,
- ],
- safest: [
- SecurityLevelStrings.security_level_js_disabled,
- SecurityLevelStrings.security_level_limit_typography_svg,
- SecurityLevelStrings.security_level_limit_media,
- ],
- };
- for (const { container, radio } of this._radioOptions) {
- const level = radio.value;
- radio.setAttribute(
- "label",
- SecurityLevelStrings[`security_level_${level}`]
- );
- container.querySelector(".summary").textContent =
- SecurityLevelStrings[`security_level_${level}_summary`];
- const descListItems = descListItemsMap[level];
- if (!descListItems) {
- continue;
- }
- const descrList = container.querySelector(
- ".securityLevel-descriptionList"
- );
- // TODO: Add the elements in securityLevelPreferences.inc.xhtml again
- // when we switch to Fluent
- for (const text of descListItems) {
- let elem = document.createXULElement("description");
- elem.textContent = text;
- elem.className = "indent";
- descrList.append(elem);
- }
- }
- restoreDefaultsButton.addEventListener("command", () => {
- SecurityLevelPrefs.securityCustom = false;
- });
this._radiogroup.addEventListener("select", () => {
SecurityLevelPrefs.securityLevel = this._radiogroup.value;
});
=====================================
browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
=====================================
@@ -7,20 +7,35 @@
level="top"
class="cui-widget-panel panel-no-padding">
<box class="panel-header">
- <html:h1 id="securityLevel-header"></html:h1>
+ <html:h1
+ id="securityLevel-header"
+ data-l10n-id="security-level-panel-heading"
+ ></html:h1>
</box>
<toolbarseparator id="securityLevel-separator"></toolbarseparator>
<vbox id="securityLevel-background" class="panel-subview-body">
<html:p id="securityLevel-subheading">
<html:span id="securityLevel-level"></html:span>
- <html:span id="securityLevel-custom"></html:span>
+ <html:span
+ id="securityLevel-custom"
+ data-l10n-id="security-level-panel-custom-badge"
+ ></html:span>
</html:p>
<html:p id="securityLevel-summary"></html:p>
- <html:a id="securityLevel-learnMore" href="about:manual#security-settings">
- </html:a>
+ <html:a
+ id="securityLevel-learnMore"
+ data-l10n-id="security-level-panel-learn-more-link"
+ href="about:manual#security-settings"
+ ></html:a>
</vbox>
<hbox class="panel-footer">
- <button id="securityLevel-settings"/>
- <button id="securityLevel-restoreDefaults"/>
+ <button
+ id="securityLevel-settings"
+ data-l10n-id="security-level-panel-open-settings-button"
+ />
+ <button
+ id="securityLevel-restoreDefaults"
+ data-l10n-id="security-level-restore-defaults-button"
+ />
</hbox>
</panel>
=====================================
browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
=====================================
@@ -2,37 +2,64 @@
data-category="panePrivacy"
data-subcategory="securitylevel"
hidden="true">
- <label><html:h2></html:h2></label>
+ <label>
+ <html:h2 data-l10n-id="security-level-preferences-heading"></html:h2>
+ </label>
<vbox flex="1">
<description flex="1">
- <html:span id="securityLevel-overview" class="tail-with-learn-more">
- </html:span>
- <label id="securityLevel-learnMore"
- class="learnMore text-link"
- is="text-link"
- href="about:manual#security-settings"
- useoriginprincipal="true"/>
+ <html:span
+ id="securityLevel-overview"
+ class="tail-with-learn-more"
+ data-l10n-id="security-level-preferences-overview"
+ ></html:span>
+ <label
+ id="securityLevel-learnMore"
+ class="learnMore text-link"
+ is="text-link"
+ data-l10n-id="security-level-preferences-learn-more-link"
+ href="about:manual#security-settings"
+ useoriginprincipal="true"
+ />
</description>
- <hbox id="securityLevel-customNotification"
- class="info-box-container"
- flex="1">
+ <hbox
+ id="securityLevel-customNotification"
+ class="info-box-container"
+ flex="1"
+ >
<hbox class="info-icon-container">
<image class="info-icon securityLevel-custom-warning-icon"/>
</hbox>
<vbox flex="1">
- <label id="securityLevel-customHeading"/>
- <description id="securityLevel-customDescription" flex="1"/>
+ <label
+ id="securityLevel-customHeading"
+ data-l10n-id="security-level-preferences-custom-heading"
+ />
+ <description
+ id="securityLevel-customDescription"
+ data-l10n-id="security-level-summary-custom"
+ flex="1"
+ />
</vbox>
<hbox align="center">
- <button id="securityLevel-restoreDefaults"/>
+ <button
+ id="securityLevel-restoreDefaults"
+ data-l10n-id="security-level-restore-defaults-button"
+ />
</hbox>
</hbox>
<radiogroup id="securityLevel-radiogroup">
<vbox class="securityLevel-radio-option">
- <radio value="standard"
- aria-describedby="securityLevelSummary-standard"/>
+ <radio
+ value="standard"
+ data-l10n-id="security-level-preferences-level-standard"
+ aria-describedby="securityLevelSummary-standard"
+ />
<vbox id="securityLevelSummary-standard">
- <description class="summary indent" flex="1"/>
+ <description
+ class="summary indent"
+ flex="1"
+ data-l10n-id="security-level-summary-standard"
+ />
</vbox>
</vbox>
<vbox class="securityLevel-radio-option">
@@ -41,19 +68,59 @@
- securityLevel-descriptionList is shown or hidden, its text content
- is included or excluded from the accessible description,
- respectively. -->
- <radio value="safer"
- aria-describedby="securityLevelSummary-safer"/>
+ <radio
+ value="safer"
+ data-l10n-id="security-level-preferences-level-safer"
+ aria-describedby="securityLevelSummary-safer"
+ />
<vbox id="securityLevelSummary-safer">
- <description class="summary indent" flex="1"/>
- <vbox class="securityLevel-descriptionList indent"/>
+ <description
+ class="summary indent"
+ flex="1"
+ data-l10n-id="security-level-summary-safer"
+ />
+ <vbox class="securityLevel-descriptionList indent">
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-https-only-javascript"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-media"
+ />
+ </vbox>
</vbox>
</vbox>
<vbox class="securityLevel-radio-option">
- <radio value="safest"
- aria-describedby="securityLevelSummary-safest"/>
+ <radio
+ value="safest"
+ data-l10n-id="security-level-preferences-level-safest"
+ aria-describedby="securityLevelSummary-safest"
+ />
<vbox id="securityLevelSummary-safest">
- <description class="summary indent" flex="1"/>
- <vbox class="securityLevel-descriptionList indent"/>
+ <description
+ class="summary indent"
+ flex="1"
+ data-l10n-id="security-level-summary-safest"
+ />
+ <vbox class="securityLevel-descriptionList indent">
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-disabled-javascript"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols-and-images"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-media"
+ />
+ </vbox>
</vbox>
</vbox>
</radiogroup>
=====================================
browser/locales/en-US/browser/base-browser.ftl
=====================================
@@ -70,6 +70,7 @@ new-identity-dialog-confirm =
new-identity-blocked-home-notification = { -brand-short-name } blocked your homepage ({ $url }) from loading because it might recognize your previous session.
# Button to continue loading the home page, despite the warning message.
new-identity-blocked-home-ignore-button = Load it anyway
+
## Preferences - Letterboxing.
# The word "Letterboxing" is the proper noun for the Tor Browser feature, and is therefore capitalised.
@@ -94,3 +95,74 @@ letterboxing-disabled-description = Letterboxing is currently disabled.
# "Letterboxing" should be treated as a feature/product name, and likely not changed in other languages.
letterboxing-enable-button =
.label = Enable Letterboxing
+
+## Security level toolbar button.
+## Uses sentence case in English (US).
+## ".label" is the accessible name, and shown in the overflow menu and when customizing the toolbar.
+
+security-level-toolbar-button-standard =
+ .label = Security level
+ .tooltiptext = Security level: Standard
+security-level-toolbar-button-safer =
+ .label = Security level
+ .tooltiptext = Security level: Safer
+security-level-toolbar-button-safest =
+ .label = Security level
+ .tooltiptext = Security level: Safest
+# Used when the user is in some custom configuration that does not match a security level.
+security-level-toolbar-button-custom =
+ .label = Security level
+ .tooltiptext = Security level: Custom
+
+## Security level popup panel.
+
+# Uses sentence case in English (US).
+security-level-panel-heading = Security level
+
+security-level-panel-level-standard = Standard
+security-level-panel-level-safer = Safer
+security-level-panel-level-safest = Safest
+security-level-panel-learn-more-link = Learn more
+# Button to open security level settings.
+security-level-panel-open-settings-button = Settings…
+
+## Security level settings.
+
+security-level-preferences-heading = Security Level
+security-level-preferences-overview = Disable certain web features that can be used to attack your security and anonymity.
+security-level-preferences-learn-more-link = Learn more
+security-level-preferences-level-standard =
+ .label = Standard
+security-level-preferences-level-safer =
+ .label = Safer
+security-level-preferences-level-safest =
+ .label = Safest
+
+## Security level summaries shown in security panel and settings.
+
+security-level-summary-standard = All browser and website features are enabled.
+security-level-summary-safer = Disables website features that are often dangerous, causing some sites to lose functionality.
+security-level-summary-safest = Only allows website features required for static sites and basic services. These changes affect images, media, and scripts.
+
+## Security level feature bullet points.
+## Shown in the settings under the security level when it is selected.
+
+security-level-preferences-bullet-https-only-javascript = JavaScript is disabled on non-HTTPS sites.
+security-level-preferences-bullet-limit-font-and-symbols = Some fonts and math symbols are disabled.
+security-level-preferences-bullet-limit-media = Audio and video (HTML5 media), and WebGL are click-to-play.
+security-level-preferences-bullet-disabled-javascript = JavaScript is disabled by default on all sites.
+security-level-preferences-bullet-limit-font-and-symbols-and-images = Some fonts, icons, math symbols, and images are disabled.
+
+## Custom security level.
+## Some custom preferences configuration has placed the user outside one of the standard three levels.
+
+# Shown in the security level panel as an orange badge next to the expected level.
+security-level-panel-custom-badge = Custom
+# Shown in the security level settings in a warning box.
+security-level-preferences-custom-heading = Custom security level configured
+# Description of custom state and recommended action.
+# Shown in the security level panel and settings.
+security-level-summary-custom = Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.
+# Button to undo custom changes to the security level and place the user in one of the standard security levels.
+# Shown in the security level panel and settings.
+security-level-restore-defaults-button = Restore defaults
=====================================
browser/locales/jar.mn
=====================================
@@ -32,5 +32,4 @@
locale/browser/safebrowsing/safebrowsing.properties (%chrome/browser/safebrowsing/safebrowsing.properties)
locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties)
locale/browser/syncSetup.properties (%chrome/browser/syncSetup.properties)
- locale/browser/securityLevel.properties (%chrome/browser/securityLevel.properties)
% locale browser-region @AB_CD@ %locale/browser-region/
=====================================
tools/torbrowser/l10n/migrations/bug-42211-new-identity.py deleted
=====================================
@@ -1,48 +0,0 @@
-import fluent.syntax.ast as FTL
-from fluent.migrate.helpers import TERM_REFERENCE, transforms_from
-from fluent.migrate.transforms import REPLACE
-
-
-def migrate(ctx):
- legacy_path = "newIdentity.properties"
-
- ctx.add_transforms(
- "base-browser.ftl",
- "base-browser.ftl",
- transforms_from(
- """
-menu-new-identity =
- .label = { COPY(path, "new_identity") }
- .accesskey = { COPY(path, "new_identity_menu_accesskey") }
-appmenuitem-new-identity =
- .label = { COPY(path, "new_identity_sentence_case") }
-toolbar-new-identity =
- .label = { COPY(path, "new_identity_sentence_case") }
- .tooltiptext = { toolbar-new-identity.label }
-
-new-identity-dialog-title = { COPY(path, "new_identity_prompt_title") }
-new-identity-dialog-never-ask-checkbox =
- .label = { COPY(path, "new_identity_ask_again") }
-
-new-identity-blocked-home-ignore-button = { COPY(path, "new_identity_home_load_button") }
-""",
- path=legacy_path,
- )
- + [
- # Replace "%S" with "{ -brand-short-name }" in confirm button.
- FTL.Message(
- id=FTL.Identifier("new-identity-dialog-confirm"),
- value=None,
- attributes=[
- FTL.Attribute(
- id=FTL.Identifier("label"),
- value=REPLACE(
- legacy_path,
- "new_identity_restart",
- {"%1$S": TERM_REFERENCE("brand-short-name")},
- ),
- ),
- ],
- ),
- ],
- )
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/d3f79d…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/d3f79d…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.9.0esr-13.5-1] 3 commits: fixup! Bug 40925: Implemented the Security Level component
by richard (@richard) 25 Mar '24
by richard (@richard) 25 Mar '24
25 Mar '24
richard pushed to branch tor-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
74db46f9 by Henry Wilkes at 2024-03-25T21:54:25+00:00
fixup! Bug 40925: Implemented the Security Level component
Bug 42214: Migrate security level strings to Fluent.
- - - - -
142836ed by Henry Wilkes at 2024-03-25T21:54:25+00:00
fixup! Base Browser strings
Bug 42214: Migrate security level strings to Fluent.
Also change some strings to be sentence case in English.
- - - - -
4338bda1 by Henry Wilkes at 2024-03-25T21:54:25+00:00
fixup! Tor Browser localization migration scripts.
Bug 42214: Migrate security level strings to Fluent.
- - - - -
7 changed files:
- browser/components/preferences/preferences.xhtml
- browser/components/securitylevel/content/securityLevel.js
- browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
- browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
- browser/locales/en-US/browser/base-browser.ftl
- browser/locales/jar.mn
- + tools/torbrowser/l10n/migrations/bug-42214-security-level.py
Changes:
=====================================
browser/components/preferences/preferences.xhtml
=====================================
@@ -60,6 +60,7 @@
<link rel="localization" href="security/certificates/certManager.ftl"/>
<link rel="localization" href="security/certificates/deviceManager.ftl"/>
<link rel="localization" href="toolkit/updates/history.ftl"/>
+ <link rel="localization" href="browser/base-browser.ftl"/>
<link rel="localization" href="browser/tor-browser.ftl"/>
<link rel="shortcut icon" href="chrome://global/skin/icons/settings.svg"/>
=====================================
browser/components/securitylevel/content/securityLevel.js
=====================================
@@ -8,65 +8,6 @@ ChromeUtils.defineModuleGetter(
"resource://gre/modules/SecurityLevel.jsm"
);
-XPCOMUtils.defineLazyGetter(this, "SecurityLevelStrings", () => {
- let strings = {
- // Generic terms
- security_level: "Security Level",
- security_level_standard: "Standard",
- security_level_safer: "Safer",
- security_level_safest: "Safest",
- security_level_tooltip_standard: "Security Level: Standard",
- security_level_tooltip_safer: "Security Level: Safer",
- security_level_tooltip_safest: "Security Level: Safest",
- // Shown only for custom level
- security_level_custom: "Custom",
- security_level_restore: "Restore Defaults",
- security_level_learn_more: "Learn more",
- // Panel
- security_level_open_settings: "Settings…",
- security_level_standard_summary:
- "All browser and website features are enabled.",
- security_level_safer_summary:
- "Disables website features that are often dangerous, causing some sites to lose functionality.",
- security_level_safest_summary:
- "Only allows website features required for static sites and basic services. These changes affect images, media, and scripts.",
- security_level_custom_heading: "Custom security level configured",
- security_level_custom_summary:
- "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.",
- // Security level section in about:preferences#privacy
- security_level_overview:
- "Disable certain web features that can be used to attack your security and anonymity.",
- security_level_list_safer: "At the safer setting:",
- security_level_list_safest: "At the safest setting:",
- // Strings for descriptions
- security_level_js_https_only: "JavaScript is disabled on non-HTTPS sites.",
- security_level_js_disabled:
- "JavaScript is disabled by default on all sites.",
- security_level_limit_typography:
- "Some fonts and math symbols are disabled.",
- security_level_limit_typography_svg:
- "Some fonts, icons, math symbols, and images are disabled.",
- security_level_limit_media:
- "Audio and video (HTML5 media), and WebGL are click-to-play.",
- };
- let bundle = null;
- try {
- bundle = Services.strings.createBundle(
- "chrome://browser/locale/securityLevel.properties"
- );
- } catch (e) {
- console.warn("Could not load the Security Level strings");
- }
- if (bundle) {
- for (const key of Object.keys(strings)) {
- try {
- strings[key] = bundle.GetStringFromName(key);
- } catch (e) {}
- }
- }
- return strings;
-});
-
/*
Security Level Button Code
@@ -100,12 +41,30 @@ var SecurityLevelButton = {
if (!level) {
return;
}
- const customStr = SecurityLevelPrefs.securityCustom ? "_custom" : "";
- this._button.setAttribute("level", `${level}${customStr}`);
- this._button.setAttribute(
- "tooltiptext",
- SecurityLevelStrings[`security_level_tooltip_${level}`]
- );
+ const custom = SecurityLevelPrefs.securityCustom;
+ this._button.setAttribute("level", custom ? `${level}_custom` : level);
+
+ let l10nIdLevel;
+ switch (level) {
+ case "standard":
+ l10nIdLevel = "security-level-toolbar-button-standard";
+ break;
+ case "safer":
+ l10nIdLevel = "security-level-toolbar-button-safer";
+ break;
+ case "safest":
+ l10nIdLevel = "security-level-toolbar-button-safest";
+ break;
+ default:
+ throw Error(`Unhandled level: ${level}`);
+ }
+ if (custom) {
+ // Don't distinguish between the different levels when in the custom
+ // state. We just want to emphasise that it is custom rather than any
+ // specific level.
+ l10nIdLevel = "security-level-toolbar-button-custom";
+ }
+ document.l10n.setAttributes(this._button, l10nIdLevel);
},
/**
@@ -159,7 +118,6 @@ var SecurityLevelButton = {
window.gNavToolbox.palette.querySelector("#security-level-button");
// Set a label to be be used as the accessible name, and to be shown in the
// overflow menu and during customization.
- this._button.setAttribute("label", SecurityLevelStrings.security_level);
this._button.addEventListener("command", () => this.openPopup());
// set the initial class based off of the current pref
this._configUIFromPrefs();
@@ -213,21 +171,12 @@ var SecurityLevelPanel = {
settingsButton: document.getElementById("securityLevel-settings"),
};
- document.getElementById("securityLevel-header").textContent =
- SecurityLevelStrings.security_level;
- this._elements.customName.textContent =
- SecurityLevelStrings.security_level_custom;
const learnMoreEl = document.getElementById("securityLevel-learnMore");
- learnMoreEl.textContent = SecurityLevelStrings.security_level_learn_more;
learnMoreEl.addEventListener("click", event => {
window.openTrustedLinkIn(learnMoreEl.href, "tab");
this.hide();
event.preventDefault();
});
- this._elements.restoreDefaultsButton.textContent =
- SecurityLevelStrings.security_level_restore;
- this._elements.settingsButton.textContent =
- SecurityLevelStrings.security_level_open_settings;
this._elements.restoreDefaultsButton.addEventListener("command", () => {
this.restoreDefaults();
@@ -268,11 +217,30 @@ var SecurityLevelPanel = {
// Descriptions change based on security level
this._elements.background.setAttribute("level", level);
- this._elements.levelName.textContent =
- SecurityLevelStrings[`security_level_${level}`];
- this._elements.summary.textContent = custom
- ? SecurityLevelStrings.security_level_custom_summary
- : SecurityLevelStrings[`security_level_${level}_summary`];
+ let l10nIdLevel;
+ let l10nIdSummary;
+ switch (level) {
+ case "standard":
+ l10nIdLevel = "security-level-panel-level-standard";
+ l10nIdSummary = "security-level-summary-standard";
+ break;
+ case "safer":
+ l10nIdLevel = "security-level-panel-level-safer";
+ l10nIdSummary = "security-level-summary-safer";
+ break;
+ case "safest":
+ l10nIdLevel = "security-level-panel-level-safest";
+ l10nIdSummary = "security-level-summary-safest";
+ break;
+ default:
+ throw Error(`Unhandled level: ${level}`);
+ }
+ if (custom) {
+ l10nIdSummary = "security-level-summary-custom";
+ }
+
+ document.l10n.setAttributes(this._elements.levelName, l10nIdLevel);
+ document.l10n.setAttributes(this._elements.summary, l10nIdSummary);
},
/**
@@ -358,25 +326,13 @@ var SecurityLevelPreferences = {
this._customNotification = document.getElementById(
"securityLevel-customNotification"
);
- this._radiogroup = document.getElementById("securityLevel-radiogroup");
-
- document.querySelector("#securityLevel-groupbox h2").textContent =
- SecurityLevelStrings.security_level;
- document.getElementById("securityLevel-overview").textContent =
- SecurityLevelStrings.security_level_overview;
document
- .getElementById("securityLevel-learnMore")
- .setAttribute("value", SecurityLevelStrings.security_level_learn_more);
-
- document.getElementById("securityLevel-customHeading").textContent =
- SecurityLevelStrings.security_level_custom_heading;
- document.getElementById("securityLevel-customDescription").textContent =
- SecurityLevelStrings.security_level_custom_summary;
- const restoreDefaultsButton = document.getElementById(
- "securityLevel-restoreDefaults"
- );
- restoreDefaultsButton.textContent =
- SecurityLevelStrings.security_level_restore;
+ .getElementById("securityLevel-restoreDefaults")
+ .addEventListener("command", () => {
+ SecurityLevelPrefs.securityCustom = false;
+ });
+
+ this._radiogroup = document.getElementById("securityLevel-radiogroup");
this._radioOptions = Array.from(
this._radiogroup.querySelectorAll(".securityLevel-radio-option"),
@@ -384,46 +340,7 @@ var SecurityLevelPreferences = {
return { container, radio: container.querySelector("radio") };
}
);
- const descListItemsMap = {
- safer: [
- SecurityLevelStrings.security_level_js_https_only,
- SecurityLevelStrings.security_level_limit_typography,
- SecurityLevelStrings.security_level_limit_media,
- ],
- safest: [
- SecurityLevelStrings.security_level_js_disabled,
- SecurityLevelStrings.security_level_limit_typography_svg,
- SecurityLevelStrings.security_level_limit_media,
- ],
- };
- for (const { container, radio } of this._radioOptions) {
- const level = radio.value;
- radio.setAttribute(
- "label",
- SecurityLevelStrings[`security_level_${level}`]
- );
- container.querySelector(".summary").textContent =
- SecurityLevelStrings[`security_level_${level}_summary`];
- const descListItems = descListItemsMap[level];
- if (!descListItems) {
- continue;
- }
- const descrList = container.querySelector(
- ".securityLevel-descriptionList"
- );
- // TODO: Add the elements in securityLevelPreferences.inc.xhtml again
- // when we switch to Fluent
- for (const text of descListItems) {
- let elem = document.createXULElement("description");
- elem.textContent = text;
- elem.className = "indent";
- descrList.append(elem);
- }
- }
- restoreDefaultsButton.addEventListener("command", () => {
- SecurityLevelPrefs.securityCustom = false;
- });
this._radiogroup.addEventListener("select", () => {
SecurityLevelPrefs.securityLevel = this._radiogroup.value;
});
=====================================
browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
=====================================
@@ -7,20 +7,35 @@
level="top"
class="cui-widget-panel panel-no-padding">
<box class="panel-header">
- <html:h1 id="securityLevel-header"></html:h1>
+ <html:h1
+ id="securityLevel-header"
+ data-l10n-id="security-level-panel-heading"
+ ></html:h1>
</box>
<toolbarseparator id="securityLevel-separator"></toolbarseparator>
<vbox id="securityLevel-background" class="panel-subview-body">
<html:p id="securityLevel-subheading">
<html:span id="securityLevel-level"></html:span>
- <html:span id="securityLevel-custom"></html:span>
+ <html:span
+ id="securityLevel-custom"
+ data-l10n-id="security-level-panel-custom-badge"
+ ></html:span>
</html:p>
<html:p id="securityLevel-summary"></html:p>
- <html:a id="securityLevel-learnMore" href="about:manual#security-settings">
- </html:a>
+ <html:a
+ id="securityLevel-learnMore"
+ data-l10n-id="security-level-panel-learn-more-link"
+ href="about:manual#security-settings"
+ ></html:a>
</vbox>
<hbox class="panel-footer">
- <button id="securityLevel-settings"/>
- <button id="securityLevel-restoreDefaults"/>
+ <button
+ id="securityLevel-settings"
+ data-l10n-id="security-level-panel-open-settings-button"
+ />
+ <button
+ id="securityLevel-restoreDefaults"
+ data-l10n-id="security-level-restore-defaults-button"
+ />
</hbox>
</panel>
=====================================
browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
=====================================
@@ -2,37 +2,64 @@
data-category="panePrivacy"
data-subcategory="securitylevel"
hidden="true">
- <label><html:h2></html:h2></label>
+ <label>
+ <html:h2 data-l10n-id="security-level-preferences-heading"></html:h2>
+ </label>
<vbox flex="1">
<description flex="1">
- <html:span id="securityLevel-overview" class="tail-with-learn-more">
- </html:span>
- <label id="securityLevel-learnMore"
- class="learnMore text-link"
- is="text-link"
- href="about:manual#security-settings"
- useoriginprincipal="true"/>
+ <html:span
+ id="securityLevel-overview"
+ class="tail-with-learn-more"
+ data-l10n-id="security-level-preferences-overview"
+ ></html:span>
+ <label
+ id="securityLevel-learnMore"
+ class="learnMore text-link"
+ is="text-link"
+ data-l10n-id="security-level-preferences-learn-more-link"
+ href="about:manual#security-settings"
+ useoriginprincipal="true"
+ />
</description>
- <hbox id="securityLevel-customNotification"
- class="info-box-container"
- flex="1">
+ <hbox
+ id="securityLevel-customNotification"
+ class="info-box-container"
+ flex="1"
+ >
<hbox class="info-icon-container">
<image class="info-icon securityLevel-custom-warning-icon"/>
</hbox>
<vbox flex="1">
- <label id="securityLevel-customHeading"/>
- <description id="securityLevel-customDescription" flex="1"/>
+ <label
+ id="securityLevel-customHeading"
+ data-l10n-id="security-level-preferences-custom-heading"
+ />
+ <description
+ id="securityLevel-customDescription"
+ data-l10n-id="security-level-summary-custom"
+ flex="1"
+ />
</vbox>
<hbox align="center">
- <button id="securityLevel-restoreDefaults"/>
+ <button
+ id="securityLevel-restoreDefaults"
+ data-l10n-id="security-level-restore-defaults-button"
+ />
</hbox>
</hbox>
<radiogroup id="securityLevel-radiogroup">
<vbox class="securityLevel-radio-option">
- <radio value="standard"
- aria-describedby="securityLevelSummary-standard"/>
+ <radio
+ value="standard"
+ data-l10n-id="security-level-preferences-level-standard"
+ aria-describedby="securityLevelSummary-standard"
+ />
<vbox id="securityLevelSummary-standard">
- <description class="summary indent" flex="1"/>
+ <description
+ class="summary indent"
+ flex="1"
+ data-l10n-id="security-level-summary-standard"
+ />
</vbox>
</vbox>
<vbox class="securityLevel-radio-option">
@@ -41,19 +68,59 @@
- securityLevel-descriptionList is shown or hidden, its text content
- is included or excluded from the accessible description,
- respectively. -->
- <radio value="safer"
- aria-describedby="securityLevelSummary-safer"/>
+ <radio
+ value="safer"
+ data-l10n-id="security-level-preferences-level-safer"
+ aria-describedby="securityLevelSummary-safer"
+ />
<vbox id="securityLevelSummary-safer">
- <description class="summary indent" flex="1"/>
- <vbox class="securityLevel-descriptionList indent"/>
+ <description
+ class="summary indent"
+ flex="1"
+ data-l10n-id="security-level-summary-safer"
+ />
+ <vbox class="securityLevel-descriptionList indent">
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-https-only-javascript"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-media"
+ />
+ </vbox>
</vbox>
</vbox>
<vbox class="securityLevel-radio-option">
- <radio value="safest"
- aria-describedby="securityLevelSummary-safest"/>
+ <radio
+ value="safest"
+ data-l10n-id="security-level-preferences-level-safest"
+ aria-describedby="securityLevelSummary-safest"
+ />
<vbox id="securityLevelSummary-safest">
- <description class="summary indent" flex="1"/>
- <vbox class="securityLevel-descriptionList indent"/>
+ <description
+ class="summary indent"
+ flex="1"
+ data-l10n-id="security-level-summary-safest"
+ />
+ <vbox class="securityLevel-descriptionList indent">
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-disabled-javascript"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols-and-images"
+ />
+ <description
+ class="indent"
+ data-l10n-id="security-level-preferences-bullet-limit-media"
+ />
+ </vbox>
</vbox>
</vbox>
</radiogroup>
=====================================
browser/locales/en-US/browser/base-browser.ftl
=====================================
@@ -70,6 +70,7 @@ new-identity-dialog-confirm =
new-identity-blocked-home-notification = { -brand-short-name } blocked your homepage ({ $url }) from loading because it might recognize your previous session.
# Button to continue loading the home page, despite the warning message.
new-identity-blocked-home-ignore-button = Load it anyway
+
## Preferences - Letterboxing.
# The word "Letterboxing" is the proper noun for the Tor Browser feature, and is therefore capitalised.
@@ -94,3 +95,74 @@ letterboxing-disabled-description = Letterboxing is currently disabled.
# "Letterboxing" should be treated as a feature/product name, and likely not changed in other languages.
letterboxing-enable-button =
.label = Enable Letterboxing
+
+## Security level toolbar button.
+## Uses sentence case in English (US).
+## ".label" is the accessible name, and shown in the overflow menu and when customizing the toolbar.
+
+security-level-toolbar-button-standard =
+ .label = Security level
+ .tooltiptext = Security level: Standard
+security-level-toolbar-button-safer =
+ .label = Security level
+ .tooltiptext = Security level: Safer
+security-level-toolbar-button-safest =
+ .label = Security level
+ .tooltiptext = Security level: Safest
+# Used when the user is in some custom configuration that does not match a security level.
+security-level-toolbar-button-custom =
+ .label = Security level
+ .tooltiptext = Security level: Custom
+
+## Security level popup panel.
+
+# Uses sentence case in English (US).
+security-level-panel-heading = Security level
+
+security-level-panel-level-standard = Standard
+security-level-panel-level-safer = Safer
+security-level-panel-level-safest = Safest
+security-level-panel-learn-more-link = Learn more
+# Button to open security level settings.
+security-level-panel-open-settings-button = Settings…
+
+## Security level settings.
+
+security-level-preferences-heading = Security Level
+security-level-preferences-overview = Disable certain web features that can be used to attack your security and anonymity.
+security-level-preferences-learn-more-link = Learn more
+security-level-preferences-level-standard =
+ .label = Standard
+security-level-preferences-level-safer =
+ .label = Safer
+security-level-preferences-level-safest =
+ .label = Safest
+
+## Security level summaries shown in security panel and settings.
+
+security-level-summary-standard = All browser and website features are enabled.
+security-level-summary-safer = Disables website features that are often dangerous, causing some sites to lose functionality.
+security-level-summary-safest = Only allows website features required for static sites and basic services. These changes affect images, media, and scripts.
+
+## Security level feature bullet points.
+## Shown in the settings under the security level when it is selected.
+
+security-level-preferences-bullet-https-only-javascript = JavaScript is disabled on non-HTTPS sites.
+security-level-preferences-bullet-limit-font-and-symbols = Some fonts and math symbols are disabled.
+security-level-preferences-bullet-limit-media = Audio and video (HTML5 media), and WebGL are click-to-play.
+security-level-preferences-bullet-disabled-javascript = JavaScript is disabled by default on all sites.
+security-level-preferences-bullet-limit-font-and-symbols-and-images = Some fonts, icons, math symbols, and images are disabled.
+
+## Custom security level.
+## Some custom preferences configuration has placed the user outside one of the standard three levels.
+
+# Shown in the security level panel as an orange badge next to the expected level.
+security-level-panel-custom-badge = Custom
+# Shown in the security level settings in a warning box.
+security-level-preferences-custom-heading = Custom security level configured
+# Description of custom state and recommended action.
+# Shown in the security level panel and settings.
+security-level-summary-custom = Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.
+# Button to undo custom changes to the security level and place the user in one of the standard security levels.
+# Shown in the security level panel and settings.
+security-level-restore-defaults-button = Restore defaults
=====================================
browser/locales/jar.mn
=====================================
@@ -33,6 +33,5 @@
locale/browser/safebrowsing/safebrowsing.properties (%chrome/browser/safebrowsing/safebrowsing.properties)
locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties)
locale/browser/syncSetup.properties (%chrome/browser/syncSetup.properties)
- locale/browser/securityLevel.properties (%chrome/browser/securityLevel.properties)
locale/browser/cryptoSafetyPrompt.properties (%chrome/browser/cryptoSafetyPrompt.properties)
% locale browser-region @AB_CD@ %locale/browser-region/
=====================================
tools/torbrowser/l10n/migrations/bug-42214-security-level.py
=====================================
@@ -0,0 +1,43 @@
+from fluent.migrate.helpers import transforms_from
+
+
+def migrate(ctx):
+ ctx.add_transforms(
+ "base-browser.ftl",
+ "base-browser.ftl",
+ transforms_from(
+ """
+security-level-panel-level-standard = { COPY(path, "security_level_standard") }
+security-level-panel-level-safer = { COPY(path, "security_level_safer") }
+security-level-panel-level-safest = { COPY(path, "security_level_safest") }
+security-level-panel-learn-more-link = { COPY(path, "security_level_learn_more") }
+security-level-panel-open-settings-button = { COPY(path, "security_level_open_settings") }
+
+security-level-preferences-heading = { COPY(path, "security_level") }
+security-level-preferences-overview = { COPY(path, "security_level_overview") }
+security-level-preferences-learn-more-link = { COPY(path, "security_level_learn_more") }
+security-level-preferences-level-standard =
+ .label = { COPY(path, "security_level_standard") }
+security-level-preferences-level-safer =
+ .label = { COPY(path, "security_level_safer") }
+security-level-preferences-level-safest =
+ .label = { COPY(path, "security_level_safest") }
+
+security-level-summary-standard = { COPY(path, "security_level_standard_summary") }
+security-level-summary-safer = { COPY(path, "security_level_safer_summary") }
+security-level-summary-safest = { COPY(path, "security_level_safest_summary") }
+
+
+security-level-preferences-bullet-https-only-javascript = { COPY(path, "security_level_js_https_only") }
+security-level-preferences-bullet-limit-font-and-symbols = { COPY(path, "security_level_limit_typography") }
+security-level-preferences-bullet-limit-media = { COPY(path, "security_level_limit_media") }
+security-level-preferences-bullet-disabled-javascript = { COPY(path, "security_level_js_disabled") }
+security-level-preferences-bullet-limit-font-and-symbols-and-images = { COPY(path, "security_level_limit_typography_svg") }
+
+security-level-panel-custom-badge = { COPY(path, "security_level_custom") }
+security-level-preferences-custom-heading = { COPY(path, "security_level_custom_heading") }
+security-level-summary-custom = { COPY(path, "security_level_custom_summary") }
+""",
+ path="securityLevel.properties",
+ ),
+ )
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/966b7f…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/966b7f…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/tor-browser][tor-browser-115.9.0esr-13.5-1] 5 commits: fixup! Bug 3455: Add DomainIsolator, for isolating circuit by domain.
by richard (@richard) 25 Mar '24
by richard (@richard) 25 Mar '24
25 Mar '24
richard pushed to branch tor-browser-115.9.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
99d4a1de by Henry Wilkes at 2024-03-25T09:42:29+00:00
fixup! Bug 3455: Add DomainIsolator, for isolating circuit by domain.
Bug 42209: Migrate tor circuit strings to Fluent.
- - - - -
56ce4cc1 by Henry Wilkes at 2024-03-25T09:42:30+00:00
fixup! Bug 41600: Add a tor circuit display panel.
Bug 42209: Migrate tor circuit strings to Fluent.
- - - - -
76f869d5 by Henry Wilkes at 2024-03-25T09:42:31+00:00
fixup! Tor Browser strings
Bug 42209: Migrate tor circuit strings to Fluent.
- - - - -
724dfc5f by Henry Wilkes at 2024-03-25T09:42:31+00:00
fixup! Add TorStrings module for localization
Bug 42209: Migrate tor circuit strings to Fluent.
- - - - -
966b7f30 by Henry Wilkes at 2024-03-25T09:42:32+00:00
fixup! Tor Browser localization migration scripts.
Bug 42209: Migrate tor circuit strings to Fluent.
- - - - -
11 changed files:
- browser/base/content/appmenu-viewcache.inc.xhtml
- browser/base/content/browser-menubar.inc
- browser/base/content/navigator-toolbox.inc.xhtml
- browser/components/torcircuit/content/torCircuitPanel.css
- browser/components/torcircuit/content/torCircuitPanel.inc.xhtml
- browser/components/torcircuit/content/torCircuitPanel.js
- browser/locales/en-US/browser/tor-browser.ftl
- toolkit/torbutton/chrome/locale/en-US/torbutton.dtd
- toolkit/torbutton/chrome/locale/en-US/torbutton.properties
- tools/torbrowser/l10n/migrate.py
- + tools/torbrowser/l10n/migrations/bug-42209-tor-circuit.py
Changes:
=====================================
browser/base/content/appmenu-viewcache.inc.xhtml
=====================================
@@ -62,7 +62,7 @@
<toolbarbutton id="appMenuNewCircuit"
class="subviewbutton"
key="new-circuit-key"
- label="&torbutton.context_menu.new_circuit_sentence_case;"
+ data-l10n-id="appmenuitem-new-tor-circuit"
oncommand="TorDomainIsolator.newCircuitForBrowser(gBrowser);"/>
<toolbarseparator/>
<toolbarbutton id="appMenu-bookmarks-button"
=====================================
browser/base/content/browser-menubar.inc
=====================================
@@ -32,9 +32,7 @@
<menuitem id="menu_newIdentity"
key="new-identity-key" data-l10n-id="menu-new-identity"/>
<menuitem id="menu_newCircuit"
- accesskey="&torbutton.context_menu.new_circuit_key;"
- key="new-circuit-key"
- label="&torbutton.context_menu.new_circuit;"
+ key="new-circuit-key" data-l10n-id="menu-new-tor-circuit"
oncommand="TorDomainIsolator.newCircuitForBrowser(gBrowser);"/>
<menuseparator/>
<menuitem id="menu_openLocation"
=====================================
browser/base/content/navigator-toolbox.inc.xhtml
=====================================
@@ -198,7 +198,7 @@
role="button"
class="identity-box-button"
align="center"
- tooltiptext="&torbutton.circuit_display.title;"
+ data-l10n-id="tor-circuit-urlbar-button"
hidden="true">
<image id="tor-circuit-button-icon"/>
</box>
@@ -621,9 +621,8 @@
data-l10n-id="toolbar-new-identity"/>
<toolbarbutton id="new-circuit-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
- label="&torbutton.context_menu.new_circuit;"
- oncommand="TorDomainIsolator.newCircuitForBrowser(gBrowser);"
- tooltiptext="&torbutton.context_menu.new_circuit;"/>
+ data-l10n-id="toolbar-new-tor-circuit"
+ oncommand="TorDomainIsolator.newCircuitForBrowser(gBrowser);"/>
<toolbarbutton id="fullscreen-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
observes="View:FullScreen"
=====================================
browser/components/torcircuit/content/torCircuitPanel.css
=====================================
@@ -120,6 +120,15 @@
background-repeat: no-repeat;
}
+.tor-circuit-node-item:not([hidden]) {
+ display: flex;
+ align-items: baseline;
+}
+
+.tor-circuit-node-item > * {
+ flex: 0 0 auto;
+}
+
@media (prefers-color-scheme: dark) {
.tor-circuit-node-item {
/* Light Gray 90 */
@@ -146,9 +155,9 @@
.tor-circuit-region-flag {
margin-inline-end: 0.5em;
height: 16px;
- vertical-align: sub;
+ align-self: center;
/* Don't occupy any vertical height. */
- margin-block-start: -16px;
+ margin-block: -8px;
}
.tor-circuit-region-flag.no-region-flag-src {
@@ -158,7 +167,7 @@
.tor-circuit-addresses {
font-size: smaller;
font-family: monospace;
- margin-inline-start: 0.25em;
+ margin-inline-start: 0.75em;
}
/* Footer buttons */
=====================================
browser/components/torcircuit/content/torCircuitPanel.inc.xhtml
=====================================
@@ -19,44 +19,67 @@
<vbox class="panel-header">
<html:h1 id="tor-circuit-heading"></html:h1>
<html:div id="tor-circuit-alias" hidden="hidden">
- <html:img src="chrome://browser/content/tor-circuit-redirect.svg"
- alt="" />
+ <html:img
+ src="chrome://browser/content/tor-circuit-redirect.svg"
+ alt=""
+ />
<html:p id="tor-circuit-alias-label">
- <html:a />
+ <html:a class="tor-circuit-alias-link" data-l10n-name="alias-link" />
</html:p>
</html:div>
</vbox>
<toolbarseparator/>
<vbox id="tor-circuit-panel-body" class="panel-subview-body">
- <html:p id="tor-circuit-node-list-name">&torbutton.circuit_display.title;</html:p>
+ <html:p
+ id="tor-circuit-node-list-name"
+ data-l10n-id="tor-circuit-panel-node-list-introduction"
+ ></html:p>
<html:ol id="tor-circuit-node-list">
- <html:li id="tor-circuit-start-item"
- class="tor-circuit-node-item">
- </html:li>
- <html:li id="tor-circuit-relays-item"
- class="tor-circuit-node-item tor-circuit-relays-item">
- </html:li>
- <html:li id="tor-circuit-end-item"
- class="tor-circuit-node-item">
- </html:li>
+ <html:li
+ id="tor-circuit-start-item"
+ class="tor-circuit-node-item"
+ data-l10n-id="tor-circuit-panel-node-browser"
+ ></html:li>
+ <html:li
+ id="tor-circuit-relays-item"
+ class="tor-circuit-node-item tor-circuit-relays-item"
+ data-l10n-id="tor-circuit-panel-node-onion-relays"
+ ></html:li>
+ <html:li
+ id="tor-circuit-end-item"
+ class="tor-circuit-node-item"
+ ></html:li>
</html:ol>
+ <html:template id="tor-circuit-node-item-template">
+ <html:li class="tor-circuit-node-item">
+ <html:img class="tor-circuit-region-flag" alt="" />
+ <html:span class="tor-circuit-node-name"></html:span>
+ <html:span class="tor-circuit-addresses"></html:span>
+ </html:li>
+ </html:template>
</vbox>
<toolbarseparator/>
<!-- NOTE: To fully benefit from the .subviewbutton styling, we need to use
- a xul:toolbarbutton rather than a html:button.
- By default, a xul:toolbarbutton is not focusable so we need to add
- tabindex. -->
- <toolbarbutton id="tor-circuit-new-circuit"
- class="subviewbutton panel-subview-footer-button tor-circuit-button"
- tabindex="0"
- aria-labelledby="tor-circuit-new-circuit-label"
- aria-describedby="tor-circuit-new-circuit-description">
+ <toolbarbutton
+ id="tor-circuit-new-circuit"
+ class="subviewbutton panel-subview-footer-button tor-circuit-button"
+ tabindex="0"
+ aria-labelledby="tor-circuit-new-circuit-label"
+ aria-describedby="tor-circuit-new-circuit-description"
+ >
<vbox align="start">
- <label id="tor-circuit-new-circuit-label"
- class="toolbarbutton-text"
- value="&torbutton.context_menu.new_circuit_sentence_case;"/>
- <label id="tor-circuit-new-circuit-description"
- class="tor-circuit-button-description"/>
+ <label
+ id="tor-circuit-new-circuit-label"
+ class="toolbarbutton-text"
+ data-l10n-id="tor-circuit-panel-new-button"
+ />
+ <label
+ id="tor-circuit-new-circuit-description"
+ class="tor-circuit-button-description"
+ />
</vbox>
</toolbarbutton>
</vbox>
=====================================
browser/components/torcircuit/content/torCircuitPanel.js
=====================================
@@ -34,6 +34,12 @@ var gTorCircuitPanel = {
* @type {bool}
*/
_isActive: false,
+ /**
+ * The template element for circuit nodes.
+ *
+ * @type {HTMLTemplateElement?}
+ */
+ _nodeItemTemplate: null,
/**
* The topic on which circuit changes are broadcast.
@@ -62,7 +68,6 @@ var gTorCircuitPanel = {
heading: document.getElementById("tor-circuit-heading"),
alias: document.getElementById("tor-circuit-alias"),
aliasLabel: document.getElementById("tor-circuit-alias-label"),
- aliasLink: document.querySelector("#tor-circuit-alias-label a"),
aliasMenu: document.getElementById("tor-circuit-panel-alias-menu"),
list: document.getElementById("tor-circuit-node-list"),
relaysItem: document.getElementById("tor-circuit-relays-item"),
@@ -73,30 +78,24 @@ var gTorCircuitPanel = {
};
this.toolbarButton = document.getElementById("tor-circuit-button");
- // TODO: These strings should be set in the HTML markup with fluent.
-
- // NOTE: There is already whitespace before and after the link from the
- // XHTML markup.
- const [aliasBefore, aliasAfter] = this._getString(
- "torbutton.circuit_display.connected-to-alias",
- // Placeholder is replaced with the same placeholder. This is a bit of a
- // hack since we want the inserted address to be the rich anchor
- // element already in the DOM, rather than a plain address.
- // We won't have to do this with fluent by using data-l10n-name on the
- // anchor element.
- ["%S"]
- ).split("%S");
- this._panelElements.aliasLabel.prepend(aliasBefore);
- this._panelElements.aliasLabel.append(aliasAfter);
-
- this._panelElements.aliasLink.addEventListener("click", event => {
+ // We add listeners for the .tor-circuit-alias-link.
+ // NOTE: We have to add the listeners to the parent element because the
+ // link (with data-l10n-name="alias-link") will be replaced with a new
+ // cloned instance every time the parent gets re-translated.
+ this._panelElements.aliasLabel.addEventListener("click", event => {
+ if (!this._aliasLink.contains(event.target)) {
+ return;
+ }
event.preventDefault();
if (event.button !== 0) {
return;
}
this._openAlias("tab");
});
- this._panelElements.aliasLink.addEventListener("contextmenu", event => {
+ this._panelElements.aliasLabel.addEventListener("contextmenu", event => {
+ if (!this._aliasLink.contains(event.target)) {
+ return;
+ }
event.preventDefault();
this._panelElements.aliasMenu.openPopupAtScreen(
event.screenX,
@@ -119,21 +118,15 @@ var gTorCircuitPanel = {
document
.getElementById("tor-circuit-panel-alias-menu-copy")
.addEventListener("command", () => {
- if (!this._panelElements.aliasLink.href) {
+ const alias = this._aliasLink?.href;
+ if (!alias) {
return;
}
Cc["@mozilla.org/widget/clipboardhelper;1"]
.getService(Ci.nsIClipboardHelper)
- .copyString(this._panelElements.aliasLink.href);
+ .copyString(alias);
});
- document.getElementById("tor-circuit-start-item").textContent =
- this._getString("torbutton.circuit_display.this_browser");
-
- this._panelElements.relaysItem.textContent = this._getString(
- "torbutton.circuit_display.onion-site-relays"
- );
-
// Button is a xul:toolbarbutton, so we use "command" rather than "click".
document
.getElementById("tor-circuit-new-circuit")
@@ -176,6 +169,13 @@ var gTorCircuitPanel = {
this.show();
});
+ this._nodeItemTemplate = document.getElementById(
+ "tor-circuit-node-item-template"
+ );
+ // Prepare the unknown region name for the current locale.
+ // NOTE: We expect this to complete before the first call to _updateBody.
+ this._localeChanged();
+
this._locationListener = {
onLocationChange: (webProgress, request, locationURI, flags) => {
if (
@@ -194,6 +194,7 @@ var gTorCircuitPanel = {
// Get notifications for circuit changes.
Services.obs.addObserver(this, this.TOR_CIRCUIT_TOPIC);
+ Services.obs.addObserver(this, "intl:app-locales-changed");
},
/**
@@ -203,15 +204,21 @@ var gTorCircuitPanel = {
this._isActive = false;
gBrowser.removeProgressListener(this._locationListener);
Services.obs.removeObserver(this, this.TOR_CIRCUIT_TOPIC);
+ Services.obs.removeObserver(this, "intl:app-locales-changed");
},
/**
* Observe circuit changes.
*/
observe(subject, topic, data) {
- if (topic === this.TOR_CIRCUIT_TOPIC) {
- // TODO: Maybe check if we actually need to do something earlier.
- this._updateCurrentBrowser();
+ switch (topic) {
+ case this.TOR_CIRCUIT_TOPIC:
+ // TODO: Maybe check if we actually need to do something earlier.
+ this._updateCurrentBrowser();
+ break;
+ case "intl:app-locales-changed":
+ this._localeChanged();
+ break;
}
},
@@ -231,6 +238,19 @@ var gTorCircuitPanel = {
this.panel.hidePopup();
},
+ /**
+ * Get the current alias link instance.
+ *
+ * Note that this element instance may change whenever its parent element
+ * (#tor-circuit-alias-label) is re-translated. Attributes should be copied to
+ * the new instance.
+ */
+ get _aliasLink() {
+ return this._panelElements.aliasLabel.querySelector(
+ ".tor-circuit-alias-link"
+ );
+ },
+
/**
* Open the onion alias present in the alias link.
*
@@ -238,12 +258,13 @@ var gTorCircuitPanel = {
* window.
*/
_openAlias(where) {
- if (!this._panelElements.aliasLink.href) {
+ const url = this._aliasLink?.href;
+ if (!url) {
return;
}
// We hide the panel before opening the link.
this.hide();
- window.openWebLinkIn(this._panelElements.aliasLink.href, where);
+ window.openWebLinkIn(url, where);
},
/**
@@ -351,11 +372,6 @@ var gTorCircuitPanel = {
this.toolbarButton.hidden = false;
- if (this.panel.state !== "open" && this.panel.state !== "showing") {
- // Don't update the panel content if it is not open or about to open.
- return;
- }
-
this._updateCircuitPanel();
},
@@ -383,35 +399,15 @@ var gTorCircuitPanel = {
return alias;
},
- /**
- * Get a string from the properties bundle.
- *
- * @param {string} name - The string name.
- * @param {string[]} args - The arguments to pass to the string.
- *
- * @returns {string} The string.
- */
- _getString(name, args = []) {
- if (!this._stringBundle) {
- this._stringBundle = Services.strings.createBundle(
- "chrome://torbutton/locale/torbutton.properties"
- );
- }
- try {
- return this._stringBundle.formatStringFromName(name, args);
- } catch {}
- if (!this._fallbackStringBundle) {
- this._fallbackStringBundle = Services.strings.createBundle(
- "resource://torbutton/locale/en-US/torbutton.properties"
- );
- }
- return this._fallbackStringBundle.formatStringFromName(name, args);
- },
-
/**
* Updates the circuit display in the panel to show the current browser data.
*/
_updateCircuitPanel() {
+ if (this.panel.state !== "open" && this.panel.state !== "showing") {
+ // Don't update the panel content if it is not open or about to open.
+ return;
+ }
+
// NOTE: The _currentBrowserData.nodes data may be stale. In particular, the
// circuit may have expired already, or we're still waiting on the new
// circuit.
@@ -426,6 +422,9 @@ var gTorCircuitPanel = {
this.hide();
return;
}
+
+ this._log.debug("Updating circuit panel");
+
let domain = this._currentBrowserData.domain;
const onionAlias = this._getOnionAlias(domain);
@@ -447,24 +446,31 @@ var gTorCircuitPanel = {
* @param {string?} scheme - The scheme in use for the current domain.
*/
_updateHeading(domain, onionAlias, scheme) {
- this._panelElements.heading.textContent = this._getString(
- "torbutton.circuit_display.heading",
+ document.l10n.setAttributes(
+ this._panelElements.heading,
+ "tor-circuit-panel-heading",
// Only shorten the onion domain if it has no alias.
- [TorUIUtils.shortenOnionAddress(domain)]
+ { host: TorUIUtils.shortenOnionAddress(domain) }
);
if (onionAlias) {
- this._panelElements.aliasLink.textContent =
- TorUIUtils.shortenOnionAddress(onionAlias);
if (scheme === "http" || scheme === "https") {
// We assume the same scheme as the current page for the alias, which we
// expect to be either http or https.
// NOTE: The href property is partially presentational so that the link
// location appears on hover.
- this._panelElements.aliasLink.href = `${scheme}://${onionAlias}`;
+ // NOTE: The href attribute should be copied to any new instances of
+ // .tor-circuit-alias-link (with data-l10n-name="alias-link") when the
+ // parent _panelElements.aliasLabel gets re-translated.
+ this._aliasLink.href = `${scheme}://${onionAlias}`;
} else {
- this._panelElements.aliasLink.removeAttribute("href");
+ this._aliasLink.removeAttribute("href");
}
+ document.l10n.setAttributes(
+ this._panelElements.aliasLabel,
+ "tor-circuit-panel-alias",
+ { alias: TorUIUtils.shortenOnionAddress(onionAlias) }
+ );
this._showPanelElement(this._panelElements.alias, true);
} else {
this._showPanelElement(this._panelElements.alias, false);
@@ -485,20 +491,40 @@ var gTorCircuitPanel = {
* @param {string} domain - The domain to show for the last node.
*/
_updateBody(nodes, domain) {
- // Clean up old items.
- // NOTE: We do not expect focus within a removed node.
- for (const nodeItem of this._nodeItems) {
- nodeItem.remove();
- }
+ // NOTE: Rather than re-creating the <li> nodes from scratch, we prefer
+ // updating existing <li> nodes so that the display does not "flicker" in
+ // width as we wait for Fluent DOM to fill the nodes with text content. I.e.
+ // the existing node and text will remain in place, occupying the same
+ // width, up until it is replaced by Fluent DOM.
+ for (let index = 0; index < nodes.length; index++) {
+ if (index >= this._nodeItems.length) {
+ const newItem =
+ this._nodeItemTemplate.content.children[0].cloneNode(true);
+ const flagEl = newItem.querySelector(".tor-circuit-region-flag");
+ // Hide region flag whenever the flag src does not exist.
+ flagEl.addEventListener("error", () => {
+ flagEl.classList.add("no-region-flag-src");
+ flagEl.removeAttribute("src");
+ });
+ this._panelElements.list.insertBefore(
+ newItem,
+ this._panelElements.relaysItem
+ );
- this._nodeItems = nodes.map((nodeData, index) => {
- const nodeItem = this._createCircuitNodeItem(nodeData, index === 0);
- this._panelElements.list.insertBefore(
- nodeItem,
- this._panelElements.relaysItem
+ this._nodeItems.push(newItem);
+ }
+ this._updateCircuitNodeItem(
+ this._nodeItems[index],
+ nodes[index],
+ index === 0
);
- return nodeItem;
- });
+ }
+
+ // Remove excess items.
+ // NOTE: We do not expect focus within a removed node.
+ while (nodes.length < this._nodeItems.length) {
+ this._nodeItems.pop().remove();
+ }
this._showPanelElement(
this._panelElements.relaysItem,
@@ -511,40 +537,49 @@ var gTorCircuitPanel = {
// Button description text, depending on whether our first node was a
// bridge, or otherwise a guard.
- this._panelElements.newCircuitDescription.value = this._getString(
+ document.l10n.setAttributes(
+ this._panelElements.newCircuitDescription,
nodes[0].bridgeType === null
- ? "torbutton.circuit_display.new-circuit-guard-description"
- : "torbutton.circuit_display.new-circuit-bridge-description"
+ ? "tor-circuit-panel-new-button-description-guard"
+ : "tor-circuit-panel-new-button-description-bridge"
);
},
/**
- * Create a node item for the given circuit node data.
+ * Update a node item for the given circuit node data.
*
+ * @param {Element} nodeItem - The item to update.
* @param {NodeData} node - The circuit node data to create an item for.
* @param {bool} isCircuitStart - Whether this is the first node in the
* circuit.
*/
- _createCircuitNodeItem(node, isCircuitStart) {
- let nodeName;
- // We do not show a flag for bridge nodes.
- let regionCode = null;
+ _updateCircuitNodeItem(nodeItem, node, isCircuitStart) {
+ const nameEl = nodeItem.querySelector(".tor-circuit-node-name");
+ let flagSrc = null;
+
if (node.bridgeType === null) {
- regionCode = node.regionCode;
- if (!regionCode) {
- nodeName = this._getString("torbutton.circuit_display.unknown_region");
- } else {
- nodeName = Services.intl.getRegionDisplayNames(undefined, [
- regionCode,
- ])[0];
- }
+ const regionCode = node.regionCode;
+ flagSrc = this._regionFlagSrc(regionCode);
+
+ const regionName = regionCode
+ ? Services.intl.getRegionDisplayNames(undefined, [regionCode])[0]
+ : this._unknownRegionName;
+
if (isCircuitStart) {
- nodeName = this._getString(
- "torbutton.circuit_display.region-guard-node",
- [nodeName]
+ document.l10n.setAttributes(
+ nameEl,
+ "tor-circuit-panel-node-region-guard",
+ { region: regionName }
);
+ } else {
+ // Set the text content directly, rather than using Fluent.
+ nameEl.removeAttribute("data-l10n-id");
+ nameEl.removeAttribute("data-l10n-args");
+ nameEl.textContent = regionName;
}
} else {
+ // Do not show a flag for bridges.
+
let bridgeType = node.bridgeType;
if (bridgeType === "meek_lite") {
bridgeType = "meek";
@@ -552,55 +587,72 @@ var gTorCircuitPanel = {
bridgeType = "";
}
if (bridgeType) {
- nodeName = this._getString(
- "torbutton.circuit_display.tor_typed_bridge",
- [bridgeType]
+ document.l10n.setAttributes(
+ nameEl,
+ "tor-circuit-panel-node-typed-bridge",
+ { "bridge-type": bridgeType }
);
} else {
- nodeName = this._getString("torbutton.circuit_display.tor_bridge");
+ document.l10n.setAttributes(nameEl, "tor-circuit-panel-node-bridge");
}
}
- const nodeItem = document.createElement("li");
- nodeItem.classList.add("tor-circuit-node-item");
-
- const regionFlagEl = this._regionFlag(regionCode);
- if (regionFlagEl) {
- nodeItem.append(regionFlagEl);
+ const flagEl = nodeItem.querySelector(".tor-circuit-region-flag");
+ flagEl.classList.toggle("no-region-flag-src", !flagSrc);
+ if (flagSrc) {
+ flagEl.setAttribute("src", flagSrc);
+ } else {
+ flagEl.removeAttribute("src");
}
- // Add whitespace after name for the addresses.
- nodeItem.append(nodeName + " ");
-
- if (node.ipAddrs) {
- const addressesEl = document.createElement("span");
- addressesEl.classList.add("tor-circuit-addresses");
- let firstAddr = true;
- for (const ip of node.ipAddrs) {
- if (firstAddr) {
- firstAddr = false;
- } else {
- addressesEl.append(", ");
- }
- // We use a <code> element to give screen readers a hint that
- // punctuation is different for IP addresses.
- const ipEl = document.createElement("code");
- // TODO: Current HTML-aam 1.0 specs map the <code> element to the "code"
- // role.
- // However, mozilla-central commented out this mapping in
- // accessible/base/HTMLMarkupMap.h because the HTML-aam specs at the
- // time did not do this.
- // See hg.mozilla.org/mozilla-central/rev/51eebe7d6199#l2.12
- // For now we explicitly add the role="code", but once this is fixed
- // from mozilla-central we should remove this.
- ipEl.setAttribute("role", "code");
- ipEl.classList.add("tor-circuit-ip-address");
- ipEl.textContent = ip;
- addressesEl.append(ipEl);
+ const addressesEl = nodeItem.querySelector(".tor-circuit-addresses");
+ // Empty children.
+ addressesEl.replaceChildren();
+ let firstAddr = true;
+ for (const ip of node.ipAddrs) {
+ if (firstAddr) {
+ firstAddr = false;
+ } else {
+ addressesEl.append(", ");
}
- nodeItem.append(addressesEl);
+ const ipEl = document.createElement("code");
+ // TODO: Current HTML-aam 1.0 specs map the <code> element to the "code"
+ // role.
+ // However, mozilla-central commented out this mapping in
+ // accessible/base/HTMLMarkupMap.h because the HTML-aam specs at the
+ // time did not do this.
+ // See hg.mozilla.org/mozilla-central/rev/51eebe7d6199#l2.12
+ //
+ // This was updated in mozilla bug 1834931, for ESR 128
+ //
+ // For now we explicitly add the role="code", but once this is fixed
+ // from mozilla-central we should remove this.
+ ipEl.setAttribute("role", "code");
+ ipEl.classList.add("tor-circuit-ip-address");
+ ipEl.textContent = ip;
+ addressesEl.append(ipEl);
}
+ },
+
+ /**
+ * The string to use for unknown region names.
+ *
+ * Will be updated to match the current locale.
+ *
+ * @type {string}
+ */
+ _unknownRegionName: "Unknown region",
- return nodeItem;
+ /**
+ * Update the name for regions to match the current locale.
+ */
+ _localeChanged() {
+ document.l10n
+ .formatValue("tor-circuit-panel-node-unknown-region")
+ .then(name => {
+ this._unknownRegionName = name;
+ // Update the panel for the new region names, if it is shown.
+ this._updateCircuitPanel();
+ });
},
/**
@@ -609,9 +661,9 @@ var gTorCircuitPanel = {
* @param {string?} regionCode - The code to convert. It should be an upper
* case 2-letter BCP47 Region subtag to be converted into a flag.
*
- * @returns {HTMLImgElement?} The emoji flag img, or null if there is no flag.
+ * @returns {src?} The emoji flag img src, or null if there is no flag.
*/
- _regionFlag(regionCode) {
+ _regionFlagSrc(regionCode) {
if (!regionCode?.match(/^[A-Z]{2}$/)) {
return null;
}
@@ -624,20 +676,7 @@ var gTorCircuitPanel = {
.map(cp => cp.toString(16))
.join("-");
- const flagEl = document.createElement("img");
- // Decorative.
- flagEl.alt = "";
- flagEl.classList.add("tor-circuit-region-flag");
- // Remove self if there is no matching flag found.
- flagEl.addEventListener(
- "error",
- () => {
- flagEl.classList.add("no-region-flag-src");
- },
- { once: true }
- );
- flagEl.src = `chrome://browser/content/tor-circuit-flags/${flagName}.svg`;
- return flagEl;
+ return `chrome://browser/content/tor-circuit-flags/${flagName}.svg`;
},
/**
=====================================
browser/locales/en-US/browser/tor-browser.ftl
=====================================
@@ -326,3 +326,63 @@ about-dialog-browser-license-link = Licensing Information
# "Tor" and "The Onion Logo" are trademark names, so should not be translated (not including the quote marks, which can be localized).
# "The Tor Project, Inc." is an organisation name.
about-dialog-trademark-statement = “Tor” and “The Onion Logo” are registered trademarks of The Tor Project, Inc.
+
+## New tor circuit.
+
+# Shown in the File menu.
+# Uses title case for English (US).
+menu-new-tor-circuit =
+ .label = New Tor Circuit for this Site
+ .accesskey = C
+
+# Shown in the application menu (hamburger menu).
+# Uses sentence case for English (US).
+appmenuitem-new-tor-circuit =
+ .label = New Tor circuit for this site
+
+# Toolbar button to trigger a new circuit, available through toolbar customization.
+# Uses sentence case for English (US).
+# ".label" is the accessible name, and is visible in the overflow menu and when
+# customizing the toolbar.
+# ".tooltiptext" will be identical to the label.
+toolbar-new-tor-circuit =
+ .label = New Tor circuit for this site
+ .tooltiptext = { toolbar-new-tor-circuit.label }
+
+## Tor circuit URL bar button.
+
+# The tooltip also acts as the accessible name.
+tor-circuit-urlbar-button =
+ .tooltiptext = Tor Circuit
+
+## Tor circuit panel.
+
+# $host (String) - The host name shown in the URL bar, potentially shortened.
+tor-circuit-panel-heading = Circuit for { $host }
+# Shown when the current address is a ".tor.onion" alias.
+# $alias (String) - The alias onion address. This should be wrapped in '<a data-l10n-name="alias-link">' and '</a>', which will link to the corresponding address.
+tor-circuit-panel-alias = Connected to <a data-l10n-name="alias-link">{ $alias }</a>
+
+# Text just before the list of circuit nodes.
+tor-circuit-panel-node-list-introduction = Tor Circuit
+# First node in the list of circuit nodes. Refers to Tor Browser.
+tor-circuit-panel-node-browser = This browser
+# Represents a number of unknown relays that complete a connection to an ".onion" site.
+tor-circuit-panel-node-onion-relays = Onion site relays
+# Represents the bridge node used to connect to the Tor network.
+# $bridge-type (String) - The name for the type of bridge used: meek, obfs4, snowflake, etc.
+tor-circuit-panel-node-typed-bridge = Bridge: { $bridge-type }
+# Represents the bridge node used to connect to the Tor network when the bridge type is unknown.
+tor-circuit-panel-node-bridge = Bridge
+# Represents the initial guard node used for a tor circuit.
+# $region (String) - The region name for the guard node, already localized.
+tor-circuit-panel-node-region-guard = { $region } (guard)
+# Represents a circuit node with an unknown regional location.
+tor-circuit-panel-node-unknown-region = Unknown region
+
+# Uses sentence case for English (US).
+tor-circuit-panel-new-button = New Tor circuit for this site
+# Shown when the first node in the circuit is a guard node, rather than a bridge.
+tor-circuit-panel-new-button-description-guard = Your guard node may not change
+# Shown when the first node in the circuit is a bridge node.
+tor-circuit-panel-new-button-description-bridge = Your bridge may not change
=====================================
toolkit/torbutton/chrome/locale/en-US/torbutton.dtd
=====================================
@@ -3,12 +3,6 @@
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<!ENTITY torbutton.context_menu.new_circuit "New Tor Circuit for this Site">
-<!ENTITY torbutton.context_menu.new_circuit_sentence_case "New Tor circuit for this site">
-<!ENTITY torbutton.context_menu.new_circuit_key "C">
-
-<!ENTITY torbutton.circuit_display.title "Tor Circuit">
-
<!-- Onion services strings. Strings are kept here for ease of translation. -->
<!ENTITY torbutton.onionServices.authPrompt.tooltip "Open onion service client authentication prompt">
<!ENTITY torbutton.onionServices.authPrompt.persistCheckboxLabel "Remember this key">
=====================================
toolkit/torbutton/chrome/locale/en-US/torbutton.properties
=====================================
@@ -3,25 +3,6 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-# Circuit display
-# LOCALIZATION NOTE: %S will be the host name shown in the URL bar.
-torbutton.circuit_display.heading = Circuit for %S
-# LOCALIZATION NOTE: %S will be the alias onion address.
-torbutton.circuit_display.connected-to-alias = Connected to %S
-torbutton.circuit_display.this_browser = This browser
-torbutton.circuit_display.onion-site-relays = Onion site relays
-# LOCALIZATION NOTE: %S will be the bridge type name (meek, obfs4, snowflake,
-# etc).
-torbutton.circuit_display.tor_typed_bridge = Bridge: %S
-# LOCALIZATION NOTE: Used when the bridge type is unknown.
-torbutton.circuit_display.tor_bridge = Bridge
-# LOCALIZATION NOTE: Used when a circuit node's regional location is unknown.
-torbutton.circuit_display.unknown_region = Unknown region
-# LOCALIZATION NOTE: %S will be the localized region name for the guard node.
-torbutton.circuit_display.region-guard-node = %S (guard)
-torbutton.circuit_display.new-circuit-guard-description = Your guard node may not change
-torbutton.circuit_display.new-circuit-bridge-description = Your bridge may not change
-
# Download pane warning
torbutton.download.warning.title = Be careful opening downloads
# %S will be a link to the Tails operating system website. With the content given by torbutton.download.warning.tails_brand_name
=====================================
tools/torbrowser/l10n/migrate.py
=====================================
@@ -253,16 +253,13 @@ class TorBrowserMigrationContext(MigrationContext):
if path not in self.localization_resources
)
- def tb_get_transformed(self, target_path, transform_id):
+ def tb_get_transform(self, target_path, transform_id):
"""
Find the transformation node with the given id for the given path.
-
- The node will be evaluated (converted to regular fluent.ast) before it
- is returned.
"""
for node in self.transforms[target_path]:
if node.id.name == transform_id:
- return self.evaluate(node)
+ return node
return None
def tb_get_reference_entry(self, target_path, entry_id):
@@ -330,6 +327,21 @@ class TorBrowserMigrator:
ctx = self._get_migration_context(locale, locale_dir)
+ # NOTE: We do not use the existing ctx.serialize_changeset method.
+ # The problem with this approach was that it would re-shuffle the order
+ # of already existing strings to match the en-US locale.
+ # But Weblate currently does not preserve the order of translated
+ # strings: https://github.com/WeblateOrg/weblate/issues/11134
+ # so this created extra noise in the diff.
+ # Instead, we just always append transformations to the end of the
+ # existing file.
+ # Moreover, it would inject group comments into the translated files,
+ # which Weblate does not handle well. Instead, we just do not add any
+ # comments.
+ #
+ # In case we want to use it again in the future, here is a reference
+ # to how it works:
+ #
# ctx.serialize_changeset expects a set of (path, identifier) of
# localization resources that can be used to evaluate the
# transformations.
@@ -344,76 +356,115 @@ class TorBrowserMigrator:
# one step, so we want to fill the changeset with all required
# (path, identifier) pairs found in the localization resources.
- # Choose the transforms that are required and available.
- changeset = set()
available_strings = ctx.tb_get_available_strings()
- for (target_path, transform_id), dep_set in ctx.dependencies.items():
- # ctx.dependencies is a dict of dependencies for all
- # transformations
- # { (target_path, transform_identifier): set(
- # (localization_path, string_identifier),
- # )}
- #
- # e.g. if we want to create a new fluent Message called
- # "new-string1", and it uses "oldString1" from "old-file1.dtd"
- # and "oldString2" from "old-file2.dtd". And "new-string2" using
- # "oldString3" from "old-file2.dtd", it would be
- # {
- # ("new-file.ftl", "new-string1"): set(
- # ("old-file1.dtd", "oldString1"),
- # ("old-file2.dtd", "oldString2"),
- # ),
- # ("new-file.ftl", "new-string2"): set(
- # ("old-file2.dtd", "oldString3"),
- # ),
- # }
- can_transform = True
- for dep in dep_set:
- path, string_id = dep
- if dep not in available_strings:
- can_transform = False
- self.logger.info(
- f"Skipping transform {target_path}:{transform_id} for "
- f"'{locale}' locale because it is missing the "
- f"string {path}:{string_id}."
- )
- break
- # Strings in legacy formats might have an entry in the file
- # that is just a copy of the en-US strings.
- # For these we want to check the weblate metadata to ensure
- # it is a translated string.
- if not path.endswith(
- ".ftl"
- ) and not self.weblate_metadata.is_translated(
- os.path.join("en-US", path),
- os.path.join(locale, path),
- string_id,
- ):
- can_transform = False
+ wrote_file = False
+ errors = []
+
+ for target_path, reference in ctx.reference_resources.items():
+ translated_ids = [
+ entry.id.name
+ for entry in ctx.target_resources[target_path].body
+ if isinstance(entry, (ast.Message, ast.Term))
+ # NOTE: We're assuming that the Message and Term ids do not
+ # conflict with each other.
+ ]
+ new_entries = []
+
+ # Apply transfomations in the order they appear in the reference
+ # (en-US) file.
+ for entry in reference.body:
+ if not isinstance(entry, (ast.Message, ast.Term)):
+ continue
+ transform_id = entry.id.name
+ transform = ctx.tb_get_transform(target_path, transform_id)
+ if not transform:
+ # No transformation for this reference entry.
+ continue
+
+ if transform_id in translated_ids:
self.logger.info(
- f"Skipping transform {target_path}:{transform_id} for "
- f"'{locale}' locale because the string "
- f"{path}:{string_id} has not been translated on "
- "weblate."
+ f"Skipping transform {target_path}:{transform_id} "
+ f"for '{locale}' locale because it already has a "
+ f"translation."
)
- break
- if can_transform:
- changeset.update(dep_set)
+ continue
- print("", file=sys.stderr)
- wrote_file = False
- errors = []
- for path, fluent in ctx.serialize_changeset(changeset).items():
- full_path = os.path.join(locale_dir, path)
+ # ctx.dependencies is a dict of dependencies for all
+ # transformations
+ # { (target_path, transform_identifier): set(
+ # (localization_path, string_identifier),
+ # )}
+ #
+ # e.g. if we want to create a new fluent Message called
+ # "new-string1", and it uses "oldString1" from "old-file1.dtd"
+ # and "oldString2" from "old-file2.dtd". And "new-string2" using
+ # "oldString3" from "old-file2.dtd", it would be
+ # {
+ # ("new-file.ftl", "new-string1"): set(
+ # ("old-file1.dtd", "oldString1"),
+ # ("old-file2.dtd", "oldString2"),
+ # ),
+ # ("new-file.ftl", "new-string2"): set(
+ # ("old-file2.dtd", "oldString3"),
+ # ),
+ # }
+ dep_set = ctx.dependencies[(target_path, transform_id)]
+ can_transform = True
+ for dep in dep_set:
+ path, string_id = dep
+ if dep not in available_strings:
+ can_transform = False
+ self.logger.info(
+ f"Skipping transform {target_path}:{transform_id} "
+ f"for '{locale}' locale because it is missing the "
+ f"string {path}:{string_id}."
+ )
+ break
+ # Strings in legacy formats might have an entry in the file
+ # that is just a copy of the en-US strings.
+ # For these we want to check the weblate metadata to ensure
+ # it is a translated string.
+ if not path.endswith(
+ ".ftl"
+ ) and not self.weblate_metadata.is_translated(
+ os.path.join("en-US", path),
+ os.path.join(locale, path),
+ string_id,
+ ):
+ can_transform = False
+ self.logger.info(
+ f"Skipping transform {target_path}:{transform_id} "
+ f"for '{locale}' locale because the string "
+ f"{path}:{string_id} has not been translated on "
+ "weblate."
+ )
+ break
+ if not can_transform:
+ continue
+
+ # Run the transformation.
+ new_entries.append(ctx.evaluate(transform))
+
+ if not new_entries:
+ continue
+
+ full_path = os.path.join(locale_dir, target_path)
+ print("", file=sys.stderr)
self.logger.info(f"Writing to {full_path}")
- with open(full_path, "w") as file:
- file.write(fluent)
- wrote_file = True
+ # For Fluent we can just serialize the transformations and append
+ # them to the end of the existing file.
+ resource = ast.Resource(new_entries)
+ with open(full_path, "a") as file:
+ file.write(serialize(resource))
+
+ with open(full_path, "r") as file:
+ full_content = file.read()
+ wrote_file = True
# Collect any fluent parsing errors from the newly written file.
errors.extend(
(full_path, message, line, sample)
- for message, line, sample in self._fluent_errors(fluent)
+ for message, line, sample in self._fluent_errors(full_content)
)
if not wrote_file:
@@ -547,7 +598,7 @@ class TorBrowserMigrator:
have_error = True
continue
- transformed = ctx.tb_get_transformed(target_path, transform_id)
+ transformed = ctx.evaluate(ctx.tb_get_transform(target_path, transform_id))
reference_entry = ctx.tb_get_reference_entry(target_path, transform_id)
if reference_entry is None:
self.logger.error(
=====================================
tools/torbrowser/l10n/migrations/bug-42209-tor-circuit.py
=====================================
@@ -0,0 +1,83 @@
+import fluent.syntax.ast as FTL
+from fluent.migrate.helpers import VARIABLE_REFERENCE, transforms_from
+from fluent.migrate.transforms import CONCAT, REPLACE
+
+
+def migrate(ctx):
+ legacy_dtd = "torbutton.dtd"
+ legacy_properties = "torbutton.properties"
+ ctx.add_transforms(
+ "tor-browser.ftl",
+ "tor-browser.ftl",
+ transforms_from(
+ """
+menu-new-tor-circuit =
+ .label = { COPY(dtd_path, "torbutton.context_menu.new_circuit") }
+ .accesskey = { COPY(dtd_path, "torbutton.context_menu.new_circuit_key") }
+appmenuitem-new-tor-circuit =
+ .label = { COPY(dtd_path, "torbutton.context_menu.new_circuit_sentence_case") }
+toolbar-new-tor-circuit =
+ .label = { COPY(dtd_path, "torbutton.context_menu.new_circuit_sentence_case") }
+ .tooltiptext = { toolbar-new-tor-circuit.label }
+
+tor-circuit-urlbar-button =
+ .tooltiptext = { COPY(dtd_path, "torbutton.circuit_display.title") }
+
+tor-circuit-panel-node-list-introduction = { COPY(dtd_path, "torbutton.circuit_display.title") }
+tor-circuit-panel-node-browser = { COPY(path, "torbutton.circuit_display.this_browser") }
+tor-circuit-panel-node-onion-relays = { COPY(path, "torbutton.circuit_display.onion-site-relays") }
+tor-circuit-panel-node-bridge = { COPY(path, "torbutton.circuit_display.tor_bridge") }
+tor-circuit-panel-node-unknown-region = { COPY(path, "torbutton.circuit_display.unknown_region") }
+
+tor-circuit-panel-new-button = { COPY(dtd_path, "torbutton.context_menu.new_circuit_sentence_case") }
+tor-circuit-panel-new-button-description-guard = { COPY(path, "torbutton.circuit_display.new-circuit-guard-description") }
+tor-circuit-panel-new-button-description-bridge = { COPY(path, "torbutton.circuit_display.new-circuit-bridge-description") }
+""",
+ dtd_path=legacy_dtd,
+ path=legacy_properties,
+ )
+ + [
+ # Replace "%S" with "{ $host }"
+ FTL.Message(
+ id=FTL.Identifier("tor-circuit-panel-heading"),
+ value=REPLACE(
+ legacy_properties,
+ "torbutton.circuit_display.heading",
+ {"%1$S": VARIABLE_REFERENCE("host")},
+ ),
+ ),
+ # Replace "%S" with "<a data-l10n-name="alias-link">{ $alias }</a>"
+ FTL.Message(
+ id=FTL.Identifier("tor-circuit-panel-alias"),
+ value=REPLACE(
+ legacy_properties,
+ "torbutton.circuit_display.connected-to-alias",
+ {
+ "%1$S": CONCAT(
+ FTL.TextElement('<a data-l10n-name="alias-link">'),
+ VARIABLE_REFERENCE("alias"),
+ FTL.TextElement("</a>"),
+ )
+ },
+ ),
+ ),
+ # Replace "%S" with "{ $region }"
+ FTL.Message(
+ id=FTL.Identifier("tor-circuit-panel-node-region-guard"),
+ value=REPLACE(
+ legacy_properties,
+ "torbutton.circuit_display.region-guard-node",
+ {"%1$S": VARIABLE_REFERENCE("region")},
+ ),
+ ),
+ # Replace "%S" with "{ $bridge-type }"
+ FTL.Message(
+ id=FTL.Identifier("tor-circuit-panel-node-typed-bridge"),
+ value=REPLACE(
+ legacy_properties,
+ "torbutton.circuit_display.tor_typed_bridge",
+ {"%1$S": VARIABLE_REFERENCE("bridge-type")},
+ ),
+ ),
+ ],
+ )
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/b7fc91…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/b7fc91…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/mullvad-browser-update-responses][main] release: new version, 13.0.13
by richard (@richard) 22 Mar '24
by richard (@richard) 22 Mar '24
22 Mar '24
richard pushed to branch main at The Tor Project / Applications / mullvad-browser-update-responses
Commits:
dbce8663 by Richard Pospesel at 2024-03-22T17:31:33+00:00
release: new version, 13.0.13
- - - - -
29 changed files:
- update_1/release/.htaccess
- − update_1/release/13.0.10-13.0.12-linux-x86_64-ALL.xml
- − update_1/release/13.0.10-13.0.12-macos-ALL.xml
- − update_1/release/13.0.10-13.0.12-windows-x86_64-ALL.xml
- + update_1/release/13.0.10-13.0.13-linux-x86_64-ALL.xml
- + update_1/release/13.0.10-13.0.13-macos-ALL.xml
- + update_1/release/13.0.10-13.0.13-windows-x86_64-ALL.xml
- + update_1/release/13.0.12-13.0.13-linux-x86_64-ALL.xml
- + update_1/release/13.0.12-13.0.13-macos-ALL.xml
- + update_1/release/13.0.12-13.0.13-windows-x86_64-ALL.xml
- − update_1/release/13.0.12-linux-x86_64-ALL.xml
- − update_1/release/13.0.12-macos-ALL.xml
- − update_1/release/13.0.12-windows-x86_64-ALL.xml
- + update_1/release/13.0.13-linux-x86_64-ALL.xml
- + update_1/release/13.0.13-macos-ALL.xml
- + update_1/release/13.0.13-windows-x86_64-ALL.xml
- − update_1/release/13.0.7-13.0.12-linux-x86_64-ALL.xml
- − update_1/release/13.0.7-13.0.12-macos-ALL.xml
- − update_1/release/13.0.7-13.0.12-windows-x86_64-ALL.xml
- − update_1/release/13.0.9-13.0.12-linux-x86_64-ALL.xml
- − update_1/release/13.0.9-13.0.12-macos-ALL.xml
- − update_1/release/13.0.9-13.0.12-windows-x86_64-ALL.xml
- + update_1/release/13.0.9-13.0.13-linux-x86_64-ALL.xml
- + update_1/release/13.0.9-13.0.13-macos-ALL.xml
- + update_1/release/13.0.9-13.0.13-windows-x86_64-ALL.xml
- update_1/release/download-linux-x86_64.json
- update_1/release/download-macos.json
- update_1/release/download-windows-x86_64.json
- update_1/release/downloads.json
Changes:
=====================================
update_1/release/.htaccess
=====================================
@@ -1,22 +1,22 @@
RewriteEngine On
-RewriteRule ^[^/]+/13.0.12/ no-update.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/13.0.10/ALL 13.0.10-13.0.12-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/13.0.7/ALL 13.0.7-13.0.12-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/13.0.9/ALL 13.0.9-13.0.12-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/[^/]+/ALL 13.0.12-linux-x86_64-ALL.xml [last]
-RewriteRule ^Linux_x86_64-gcc3/ 13.0.12-linux-x86_64-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/13.0.10/ALL 13.0.10-13.0.12-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/13.0.7/ALL 13.0.7-13.0.12-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/13.0.9/ALL 13.0.9-13.0.12-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/[^/]+/ALL 13.0.12-macos-ALL.xml [last]
-RewriteRule ^Darwin_x86_64-gcc3/ 13.0.12-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/13.0.10/ALL 13.0.10-13.0.12-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/13.0.7/ALL 13.0.7-13.0.12-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/13.0.9/ALL 13.0.9-13.0.12-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/[^/]+/ALL 13.0.12-macos-ALL.xml [last]
-RewriteRule ^Darwin_aarch64-gcc3/ 13.0.12-macos-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.10/ALL 13.0.10-13.0.12-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.7/ALL 13.0.7-13.0.12-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.9/ALL 13.0.9-13.0.12-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/[^/]+/ALL 13.0.12-windows-x86_64-ALL.xml [last]
-RewriteRule ^WINNT_x86_64-gcc3-x64/ 13.0.12-windows-x86_64-ALL.xml [last]
+RewriteRule ^[^/]+/13.0.13/ no-update.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/13.0.10/ALL 13.0.10-13.0.13-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/13.0.12/ALL 13.0.12-13.0.13-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/13.0.9/ALL 13.0.9-13.0.13-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/[^/]+/ALL 13.0.13-linux-x86_64-ALL.xml [last]
+RewriteRule ^Linux_x86_64-gcc3/ 13.0.13-linux-x86_64-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/13.0.10/ALL 13.0.10-13.0.13-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/13.0.12/ALL 13.0.12-13.0.13-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/13.0.9/ALL 13.0.9-13.0.13-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/[^/]+/ALL 13.0.13-macos-ALL.xml [last]
+RewriteRule ^Darwin_x86_64-gcc3/ 13.0.13-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/13.0.10/ALL 13.0.10-13.0.13-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/13.0.12/ALL 13.0.12-13.0.13-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/13.0.9/ALL 13.0.9-13.0.13-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/[^/]+/ALL 13.0.13-macos-ALL.xml [last]
+RewriteRule ^Darwin_aarch64-gcc3/ 13.0.13-macos-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.10/ALL 13.0.10-13.0.13-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.12/ALL 13.0.12-13.0.13-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/13.0.9/ALL 13.0.9-13.0.13-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/[^/]+/ALL 13.0.13-windows-x86_64-ALL.xml [last]
+RewriteRule ^WINNT_x86_64-gcc3-x64/ 13.0.13-windows-x86_64-ALL.xml [last]
=====================================
update_1/release/13.0.10-13.0.12-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="376b402661d94c1b3d485fc380095a8ad9546eed3ff9f4cf4abfb6765c5248c0f17e0bf568a9fd698c27dd7041aabed087eec015023a856296702e7ff48bc828" size="107414187" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="7ad00dc2b0acd1e4fe72797e0be720a5df5675580de689ff7dec0d032fee7c037ced1027ff5107e140d149537cc04d74a6b4bcff6f641e5037fcf580095ea84f" size="7848684" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.10-13.0.12-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos-13.0.12_ALL.m…" hashFunction="SHA512" hashValue="8facedccd5a4d1a5802b286683d36716ecd6e11b44aabd365a29c53d1c1c401ddb1a3913c95e4db1e38be03f12079f545e8ee3054bd4778ce61fc5fe9f562c7e" size="115462583" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos--13.0.10-13.0…" hashFunction="SHA512" hashValue="4f8bcee04e7ddc9684f0f264b12a81dce94a179a7ceaa686427079021d18b17b5ac21d27d612abab50cd6f77560351e1edb8721f68b75b3e57185db65d7ae96f" size="12124599" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.10-13.0.12-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="3c30c836e8de5492cffded24e31aae556449da223906706f12af44875401b889fd0609a840bfe1d6a8a845ef2c141bc907cf1c7b3a5d2e0b7e4757f0b66bc9ba" size="89384780" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="72df0c72c97068315d781a017da91d6279d4026f94db5e5d58eb7a711f04509a659142d60fe335559afa713dc026f998cc1de6c8e6383ec4896888d607837b17" size="8560367" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.10-13.0.13-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="04cad7d72b90b41fcca52e05cb4c5904d6516669a32772c498e0b0bb2803ce10e1458ff76d4acfd5a3d9146d8673b258a74c45ca978eb09ea7dcf37c1c2e5238" size="107414411" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="44124453ad5e941790fa865442479ec425373e148a23e7a0f90b494d9e32e623d99c91fbbe942bb3633016663347593962ce7c2a51a5a69eee30433302f42d19" size="7912308" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.10-13.0.13-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos-13.0.13_ALL.m…" hashFunction="SHA512" hashValue="7afaca7077a1f968705fcf1094d16a1b441befcbd2de342654ca78d6ba7cc631622493afd3e71984839283aa37abc66c92021dfee8ecdfd345019a549a220ffb" size="115471199" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos--13.0.10-13.0…" hashFunction="SHA512" hashValue="9fa955c4ac58cb215cfb783284dca39fbbaab7dcebf9f58ca7e4884ffeb03c102abf97c07c7b7adf60c5d69180529afb48f1a9ca5237d42cb3866c7131a6d687" size="12184147" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.10-13.0.13-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="c6aea6ab8c33c4c58bd3a5783db1c7ed4682706e09a239b6ac61b6e28f783ae785891b88374caecbeb49dd388853f090e09a0ff84540de69dcccc065fa6abdbe" size="89393168" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="879e5c052f493485631911ae8b95dcd259c376a43d25ea5e502e2bf3db6e4e66162704d73d0597e85a1433c04fc1d464d64dd4da30b91ce9d77729729d0e931c" size="8623995" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.12-13.0.13-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="04cad7d72b90b41fcca52e05cb4c5904d6516669a32772c498e0b0bb2803ce10e1458ff76d4acfd5a3d9146d8673b258a74c45ca978eb09ea7dcf37c1c2e5238" size="107414411" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="e23005d579adbfd1b3cd6b2ee19b7c5c861afa19169d8c6a9249b2ce71c676eac7f7abfa6c1f0d643f7c6372e1ed364657543c88de2bb570938e23629310c85e" size="186481" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.12-13.0.13-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos-13.0.13_ALL.m…" hashFunction="SHA512" hashValue="7afaca7077a1f968705fcf1094d16a1b441befcbd2de342654ca78d6ba7cc631622493afd3e71984839283aa37abc66c92021dfee8ecdfd345019a549a220ffb" size="115471199" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos--13.0.12-13.0…" hashFunction="SHA512" hashValue="9c446838df3df621eb3d282f1d6ed5313eaf228f004ecada89b99e67075217556bf6cbd78f709a2f527719cbcfa394cd9266388ef782d6a1a2b69863380ebe8a" size="208530" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.12-13.0.13-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="c6aea6ab8c33c4c58bd3a5783db1c7ed4682706e09a239b6ac61b6e28f783ae785891b88374caecbeb49dd388853f090e09a0ff84540de69dcccc065fa6abdbe" size="89393168" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="0e958f81c03c334f01ec24727d8b7b203cccd36bc7ef11c97b1792e7b8c2296eb5f148c28bc3ba334b51012dcdb5d2830d7195fa6265e065dfbde1505549be52" size="189676" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.12-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="376b402661d94c1b3d485fc380095a8ad9546eed3ff9f4cf4abfb6765c5248c0f17e0bf568a9fd698c27dd7041aabed087eec015023a856296702e7ff48bc828" size="107414187" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.12-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos-13.0.12_ALL.m…" hashFunction="SHA512" hashValue="8facedccd5a4d1a5802b286683d36716ecd6e11b44aabd365a29c53d1c1c401ddb1a3913c95e4db1e38be03f12079f545e8ee3054bd4778ce61fc5fe9f562c7e" size="115462583" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.12-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="3c30c836e8de5492cffded24e31aae556449da223906706f12af44875401b889fd0609a840bfe1d6a8a845ef2c141bc907cf1c7b3a5d2e0b7e4757f0b66bc9ba" size="89384780" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.13-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="04cad7d72b90b41fcca52e05cb4c5904d6516669a32772c498e0b0bb2803ce10e1458ff76d4acfd5a3d9146d8673b258a74c45ca978eb09ea7dcf37c1c2e5238" size="107414411" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.13-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos-13.0.13_ALL.m…" hashFunction="SHA512" hashValue="7afaca7077a1f968705fcf1094d16a1b441befcbd2de342654ca78d6ba7cc631622493afd3e71984839283aa37abc66c92021dfee8ecdfd345019a549a220ffb" size="115471199" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.13-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="c6aea6ab8c33c4c58bd3a5783db1c7ed4682706e09a239b6ac61b6e28f783ae785891b88374caecbeb49dd388853f090e09a0ff84540de69dcccc065fa6abdbe" size="89393168" type="complete"></patch></update></updates>
=====================================
update_1/release/13.0.7-13.0.12-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="376b402661d94c1b3d485fc380095a8ad9546eed3ff9f4cf4abfb6765c5248c0f17e0bf568a9fd698c27dd7041aabed087eec015023a856296702e7ff48bc828" size="107414187" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="6fecc36a34bd3d38aa5c34d53bd6d71c6794d07287447f6f70b203f7d210ab485b7face9c7f831c5c526b5549cbf1458a074c146945219b5d8c6561bce2496ed" size="12369078" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.7-13.0.12-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos-13.0.12_ALL.m…" hashFunction="SHA512" hashValue="8facedccd5a4d1a5802b286683d36716ecd6e11b44aabd365a29c53d1c1c401ddb1a3913c95e4db1e38be03f12079f545e8ee3054bd4778ce61fc5fe9f562c7e" size="115462583" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos--13.0.7-13.0.…" hashFunction="SHA512" hashValue="5dcb89d5f4565bb8513a20efaf84f25f6f85229181400ead93095783553a7ff57abea8643c4196ffc07f33f6c22b3d1d96f2f97a2c32f163397db9a711443629" size="17020253" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.7-13.0.12-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="3c30c836e8de5492cffded24e31aae556449da223906706f12af44875401b889fd0609a840bfe1d6a8a845ef2c141bc907cf1c7b3a5d2e0b7e4757f0b66bc9ba" size="89384780" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="e0cf078c426841dd4b80e3efbbc33c577a95ffd0af5ea64303989f265b274311725948ec6ffcd832867c7bf9cca51e76078a02aa107663dae22b58791d439c64" size="13174209" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.9-13.0.12-linux-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="376b402661d94c1b3d485fc380095a8ad9546eed3ff9f4cf4abfb6765c5248c0f17e0bf568a9fd698c27dd7041aabed087eec015023a856296702e7ff48bc828" size="107414187" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="27584d28396169d940626225c8ea910b586995de8fcdf0df305585dd2ae62b4f96c8a84135c52cc10d501b3db35fdbdcae8aa96d78a1e89f5c62fe2195dba090" size="8755552" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.9-13.0.12-macos-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos-13.0.12_ALL.m…" hashFunction="SHA512" hashValue="8facedccd5a4d1a5802b286683d36716ecd6e11b44aabd365a29c53d1c1c401ddb1a3913c95e4db1e38be03f12079f545e8ee3054bd4778ce61fc5fe9f562c7e" size="115462583" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos--13.0.9-13.0.…" hashFunction="SHA512" hashValue="689f37db7be6488773db9e405f7742869cb0885135ab231690fd6b424f4c3a54aedd01f98547e5fffacffe11bd902f77bf3b80279ba2202d16732f221bc71dba" size="13343215" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.9-13.0.12-windows-x86_64-ALL.xml deleted
=====================================
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<updates><update type="minor" displayVersion="13.0.12" appVersion="13.0.12" platformVersion="115.9.0" buildID="20240313183935" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.12" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="3c30c836e8de5492cffded24e31aae556449da223906706f12af44875401b889fd0609a840bfe1d6a8a845ef2c141bc907cf1c7b3a5d2e0b7e4757f0b66bc9ba" size="89384780" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="2c0d987c01caee4d38ed9fddfd7f34403f9c00aadf90dadc792a2e9bc062276d6253db468b25e3448a94163a22f94da18f34fafd32e2ca2efb78ac46bdaef286" size="9488151" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.9-13.0.13-linux-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64-13.0.1…" hashFunction="SHA512" hashValue="04cad7d72b90b41fcca52e05cb4c5904d6516669a32772c498e0b0bb2803ce10e1458ff76d4acfd5a3d9146d8673b258a74c45ca978eb09ea7dcf37c1c2e5238" size="107414411" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64--13.0.…" hashFunction="SHA512" hashValue="913d31600e2b0d20645927fe0549da5881859dc5990942780e3423df7265fabf343b40037a2b488d55fdaeb49f911d3212f61970affd55e43e8f441a489a65c9" size="8819028" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.9-13.0.13-macos-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedOSVersion="16.0.0"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos-13.0.13_ALL.m…" hashFunction="SHA512" hashValue="7afaca7077a1f968705fcf1094d16a1b441befcbd2de342654ca78d6ba7cc631622493afd3e71984839283aa37abc66c92021dfee8ecdfd345019a549a220ffb" size="115471199" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos--13.0.9-13.0.…" hashFunction="SHA512" hashValue="aab41c685738d2288a7f5e33d83c7ef669460e981a6e9a454e81b8b0b5eef77a01babcb17cb7a071591edfae0a55357de79e5e54df4a07c51383f04e49a1d562" size="13403343" type="partial"></patch></update></updates>
=====================================
update_1/release/13.0.9-13.0.13-windows-x86_64-ALL.xml
=====================================
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<updates><update type="minor" displayVersion="13.0.13" appVersion="13.0.13" platformVersion="115.9.1" buildID="20240322132912" detailsURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" actions="showURL" openURL="https://github.com/mullvad/mullvad-browser/releases/13.0.13" minSupportedOSVersion="6.1" minSupportedInstructionSet="SSE2"><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64-13.0…" hashFunction="SHA512" hashValue="c6aea6ab8c33c4c58bd3a5783db1c7ed4682706e09a239b6ac61b6e28f783ae785891b88374caecbeb49dd388853f090e09a0ff84540de69dcccc065fa6abdbe" size="89393168" type="complete"></patch><patch URL="https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64--13.…" hashFunction="SHA512" hashValue="6683305d0c690acd1ee2c5e5c10b430b9b2e93f4905a4cf51f883cf92096291f8373a836a283cdb6fbf60258556052c7308b35b63197e958ae83b7e0212231fa" size="9548715" type="partial"></patch></update></updates>
=====================================
update_1/release/download-linux-x86_64.json
=====================================
@@ -1 +1 @@
-{"binary":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64-13.0.1…","git_tag":"mb-13.0.12-build1","sig":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64-13.0.1…","version":"13.0.12"}
\ No newline at end of file
+{"binary":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64-13.0.1…","git_tag":"mb-13.0.13-build1","sig":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64-13.0.1…","version":"13.0.13"}
\ No newline at end of file
=====================================
update_1/release/download-macos.json
=====================================
@@ -1 +1 @@
-{"binary":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos-13.0.12.dmg","git_tag":"mb-13.0.12-build1","sig":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos-13.0.12.dmg.a…","version":"13.0.12"}
\ No newline at end of file
+{"binary":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos-13.0.13.dmg","git_tag":"mb-13.0.13-build1","sig":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos-13.0.13.dmg.a…","version":"13.0.13"}
\ No newline at end of file
=====================================
update_1/release/download-windows-x86_64.json
=====================================
@@ -1 +1 @@
-{"binary":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64-port…","git_tag":"mb-13.0.12-build1","sig":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64-port…","version":"13.0.12"}
\ No newline at end of file
+{"binary":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64-port…","git_tag":"mb-13.0.13-build1","sig":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64-port…","version":"13.0.13"}
\ No newline at end of file
=====================================
update_1/release/downloads.json
=====================================
@@ -1 +1 @@
-{"downloads":{"linux-x86_64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64-13.0.1…","sig":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-linux-x86_64-13.0.1…"}},"macos":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos-13.0.12.dmg","sig":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-macos-13.0.12.dmg.a…"}},"win64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64-port…","sig":"https://cdn.mullvad.net/browser/13.0.12/mullvad-browser-windows-x86_64-port…"}}},"tag":"mb-13.0.12-build1","version":"13.0.12"}
\ No newline at end of file
+{"downloads":{"linux-x86_64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64-13.0.1…","sig":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-linux-x86_64-13.0.1…"}},"macos":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos-13.0.13.dmg","sig":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-macos-13.0.13.dmg.a…"}},"win64":{"ALL":{"binary":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64-port…","sig":"https://cdn.mullvad.net/browser/13.0.13/mullvad-browser-windows-x86_64-port…"}}},"tag":"mb-13.0.13-build1","version":"13.0.13"}
\ No newline at end of file
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser-update-respo…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser-update-respo…
You're receiving this email because of your account on gitlab.torproject.org.
1
0