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

Keyboard Shortcuts

Thread View

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

tbb-commits

Thread Start a new thread
Download
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
tbb-commits@lists.torproject.org

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

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
0 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

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
0 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

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
0 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

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
0 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

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
0 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

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 &quot;fixup! Tor Browser localization migration scripts.&quot; 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
0 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

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 &quot;fixup! Tor Browser localization migration scripts.&quot; 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
0 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

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
0 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

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
0 0
[Git][tpo/applications/mullvad-browser-update-responses][main] release: new version, 13.0.13
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
0 0
  • ← Newer
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • ...
  • 18
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.