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

Keyboard Shortcuts

Thread View

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

tbb-commits

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

  • 1 participants
  • 21316 discussions
[Git][tpo/applications/tor-browser-build][main] 2 commits: Bug 41078: touch pt_config.json before adding to omni.ja
by richard (@richard) 01 Feb '24

01 Feb '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 35330ddb by Richard Pospesel at 2024-02-01T12:28:06+00:00 Bug 41078: touch pt_config.json before adding to omni.ja - - - - - 72226294 by Richard Pospesel at 2024-02-01T12:30:30+00:00 Bug 41051: Update changlog and bump build number - - - - - 3 changed files: - projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt - projects/browser/build - rbm.conf Changes: ===================================== projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt ===================================== @@ -40,6 +40,8 @@ Tor Browser 13.5a4 - January 31 2024 * Bug 41067: Use Capture::Tiny instead of IO::CaptureOutput [tor-browser-build] * Bug 41073: Update documention about required packages for container-less build [tor-browser-build] * Bug 40067: Use --no-verbose wget option when not running in a terminal [rbm] + * Windows + macOS + Linux + * Bug 41078: pt_config.json not touch'd before adding to omni.ja, resulting in build non-determinism [tor-browser-build] * Windows * Bug 40606: Use Clang to compile NSIS [tor-browser-build] * Bug 40900: Update NSIS to 3.09 [tor-browser-build] ===================================== projects/browser/build ===================================== @@ -279,6 +279,7 @@ do pt_config_dir=chrome/toolkit/content/global mkdir -p "$pt_config_dir" cp "pt_config.json" "$pt_config_dir/" + [% c("touch") %] "$pt_config_dir/pt_config.json" zip -Xm "$tbdir/omni.ja" "$pt_config_dir/pt_config.json" rm -rf chrome popd ===================================== rbm.conf ===================================== @@ -82,7 +82,7 @@ buildconf: var: torbrowser_version: '13.5a4' - torbrowser_build: 'build1' + torbrowser_build: 'build2' torbrowser_incremental_from: - '13.5a1' - '13.5a2' View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Add Tor integration and UI
by Dan Ballard (@dan) 31 Jan '24

31 Jan '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 87e8fea1 by clairehurst at 2024-01-31T16:12:55-07:00 fixup! Add Tor integration and UI - - - - - 10 changed files: - fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt - fenix/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt - fenix/app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt - fenix/app/src/main/java/org/mozilla/fenix/settings/TorNetworkSettingsFragment.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapStatus.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorController.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapConnectViewHolder.kt - fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapLoggerViewHolder.kt Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt ===================================== @@ -685,7 +685,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorIn } override fun onTorConnecting() { /* no-op */ } override fun onTorStopped() { /* no-op */ } - override fun onTorStatusUpdate(entry: String?, status: String?) { /* no-op */ } + override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { /* no-op */ } }) return } ===================================== fenix/app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt ===================================== @@ -59,7 +59,7 @@ class IntentReceiverActivity : Activity() { } override fun onTorConnecting() { /* no-op */ } override fun onTorStopped() { /* no-op */ } - override fun onTorStatusUpdate(entry: String?, status: String?) { /* no-op */ } + override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { /* no-op */ } }) // In the meantime, open the HomeActivity so the user can get connected. ===================================== fenix/app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt ===================================== @@ -164,7 +164,7 @@ object TorBrowserFeatures { } @SuppressWarnings("EmptyFunctionBlock") - override fun onTorStatusUpdate(entry: String?, status: String?) { + override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { } }) } ===================================== fenix/app/src/main/java/org/mozilla/fenix/settings/TorNetworkSettingsFragment.kt ===================================== @@ -166,7 +166,7 @@ class TorNetworkSettingsFragment : PreferenceFragmentCompat(), TorEvents { override fun onTorStopped() { } - override fun onTorStatusUpdate(entry: String?, status: String?) { + override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { setStatus() } } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapStatus.kt ===================================== @@ -34,7 +34,7 @@ class TorBootstrapStatus( } @SuppressWarnings("EmptyFunctionBlock") - override fun onTorStatusUpdate(entry: String?, status: String?) { + override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { } fun unregisterTorListener() { ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorController.kt ===================================== @@ -9,7 +9,7 @@ import androidx.lifecycle.LifecycleCoroutineScope interface TorEvents { fun onTorConnecting() fun onTorConnected() - fun onTorStatusUpdate(entry: String?, status: String?) + fun onTorStatusUpdate(entry: String?, status: String?, progress: Double? = 0.0) fun onTorStopped() } @@ -55,7 +55,7 @@ interface TorController: TorEvents { override fun onTorConnecting() override fun onTorConnected() - override fun onTorStatusUpdate(entry: String?, status: String?) + override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) override fun onTorStopped() fun registerTorListener(l: TorEvents) ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt ===================================== @@ -155,9 +155,9 @@ class TorControllerGV( } // TorEvents - override fun onTorStatusUpdate(entry: String?, status: String?) { + override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { synchronized(torListeners) { - torListeners.toList().forEach { it.onTorStatusUpdate(entry, status) } + torListeners.toList().forEach { it.onTorStatusUpdate(entry, status, progress) } } } @@ -221,7 +221,7 @@ class TorControllerGV( // and state for firefox-android (designed for tor-android-service) // fun onTorConnecting() // fun onTorConnected() - // fun onTorStatusUpdate(entry: String?, status: String?) + // fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) // fun onTorStopped() // TorEventsBootstrapStateChangeListener @@ -268,7 +268,7 @@ class TorControllerGV( } entries.add(Pair(status, lastKnownStatus.toTorStatus().status)) - onTorStatusUpdate(status, lastKnownStatus.toTorStatus().status) + onTorStatusUpdate(status, lastKnownStatus.toTorStatus().status, progress) } // TorEventsBootstrapStateChangeListener ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt ===================================== @@ -170,7 +170,7 @@ class TorControllerTAS (private val context: Context): TorController { handlePendingRegistrationChanges() } - override fun onTorStatusUpdate(entry: String?, status: String?) { + override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { lockTorListenersMutation = true torListeners.forEach { it.onTorStatusUpdate(entry, status) } lockTorListenersMutation = false ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapConnectViewHolder.kt ===================================== @@ -92,7 +92,7 @@ class TorBootstrapConnectViewHolder( override fun onTorStopped() { } - override fun onTorStatusUpdate(entry: String?, status: String?) { + override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { if (entry == null) return binding.torBootstrapStatusMessage.text = entry @@ -103,7 +103,7 @@ class TorBootstrapConnectViewHolder( percentIdx ) with(binding.torBootstrapProgress) { - progress = percent.toInt() + this.progress = percent.toInt() } } } ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapLoggerViewHolder.kt ===================================== @@ -55,7 +55,7 @@ class TorBootstrapLoggerViewHolder( override fun onTorStopped() { } - override fun onTorStatusUpdate(entry: String?, status: String?) { + override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) { if (status == null || entry == null) return if (status == "ON" && entry.startsWith("Circuit")) return View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/87e… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/87e… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Add Tor integration and UI
by Dan Ballard (@dan) 31 Jan '24

31 Jan '24
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android Commits: 54d46f59 by Dan Ballard at 2024-01-31T12:42:11-08:00 fixup! Add Tor integration and UI Bug 42252: Fix safely using iterators while possibly modifying List - - - - - 1 changed file: - fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt Changes: ===================================== fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt ===================================== @@ -143,28 +143,28 @@ class TorControllerGV( // TorEvents override fun onTorConnecting() { synchronized(torListeners) { - torListeners.forEach { it.onTorConnecting() } + torListeners.toList().forEach { it.onTorConnecting() } } } // TorEvents override fun onTorConnected() { synchronized(torListeners) { - torListeners.forEach { it.onTorConnected() } + torListeners.toList().forEach { it.onTorConnected() } } } // TorEvents override fun onTorStatusUpdate(entry: String?, status: String?) { synchronized(torListeners) { - torListeners.forEach { it.onTorStatusUpdate(entry, status) } + torListeners.toList().forEach { it.onTorStatusUpdate(entry, status) } } } // TorEvents override fun onTorStopped() { synchronized(torListeners) { - torListeners.forEach { it.onTorStopped() } + torListeners.toList().forEach { it.onTorStopped() } } } View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/54d… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/54d… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build] Pushed new tag tbb-13.5a4-build1
by richard (@richard) 31 Jan '24

31 Jan '24
richard pushed new tag tbb-13.5a4-build1 at The Tor Project / Applications / tor-browser-build -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/tree/tbb… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] Bug 41051: Update changelogs for Tor Browser 13.5a4
by richard (@richard) 31 Jan '24

31 Jan '24
richard pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: b87a696a by Richard Pospesel at 2024-01-31T12:10:10+00:00 Bug 41051: Update changelogs for Tor Browser 13.5a4 - - - - - 1 changed file: - projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt Changes: ===================================== projects/browser/Bundle-Data/Docs-TBB/ChangeLog.txt ===================================== @@ -1,4 +1,4 @@ -Tor Browser 13.5a4 - January 29 2024 +Tor Browser 13.5a4 - January 31 2024 * All Platforms * Updated zlib to 1.3.1 * Updated Snowflake to 2.8.1 @@ -13,10 +13,15 @@ Tor Browser 13.5a4 - January 29 2024 * Bug 42374: spoof english leaks via numberingSystem: numbers (non-latn) or decimal separator (latn) [tor-browser] * Bug 42384: Regression: quickstart doesn't work anymore [tor-browser] * Bug 41058: Update Snowflake to 2.8.1 [tor-browser-build] + * Bug 262: Mouse-over long links causes the browser element to re-center relative to width of status tooltip [mullvad-browser] * Windows + macOS + Linux * Updated Firefox to 115.7.0esr * Bug 41917: Make the appearance of letterboxing look more intentional [tor-browser] + * Bug 42036: Design and build a user interface for Lox [tor-browser] * Bug 42338: Changing circuit programmatically in Tor Browser not working anymore! [tor-browser] + * Bug 42387: Visual noise in 13.5a4 letterboxing [tor-browser] + * Linux + * Bug 42293: Updater is disabled when tor-browser is run by torbrowser-launcher flatpak [tor-browser] * Android * Updated GeckoView to 115.7.0esr * Bug 42252: Plumb down TorConnect commands from firefox-android to GeckoView [tor-browser] @@ -25,14 +30,15 @@ Tor Browser 13.5a4 - January 29 2024 * Bug 42355: Fullscreen on Android doesn't hide system bars [tor-browser] * Bug 42367: Backport Android security fixes from Firefox 122 [tor-browser] * Bug 42368: Tor Browser 13.5a3 crashes during start-up because of API26+ methods [tor-browser] - * Linux - * Bug 42293: Updater is disabled when tor-browser is run by torbrowser-launcher flatpak [tor-browser] * Build System * All Platforms * Updated Go to 1.20.13 and 1.21.6 * Bug 41037: Set time on signing machine before starting signing [tor-browser-build] + * Bug 41038: Add RPM dependencies to README [tor-browser-build] * Bug 41059: Update keyring/torbrowser.gpg with updated key [tor-browser-build] * Bug 41063: Run "file $keyring" in tools/keyring/list-all-keyrings [tor-browser-build] + * Bug 41067: Use Capture::Tiny instead of IO::CaptureOutput [tor-browser-build] + * Bug 41073: Update documention about required packages for container-less build [tor-browser-build] * Bug 40067: Use --no-verbose wget option when not running in a terminal [rbm] * Windows * Bug 40606: Use Clang to compile NSIS [tor-browser-build] View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/b… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/b… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/firefox-android] Pushed new tag firefox-android-115.2.1-13.5-1-build5
by richard (@richard) 31 Jan '24

31 Jan '24
richard pushed new tag firefox-android-115.2.1-13.5-1-build5 at The Tor Project / Applications / firefox-android -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/tree/firef… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser] Pushed new tag tor-browser-115.7.0esr-13.5-1-build2
by richard (@richard) 31 Jan '24

31 Jan '24
richard pushed new tag tor-browser-115.7.0esr-13.5-1-build2 at The Tor Project / Applications / Tor Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows… 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.7.0esr-13.5-1] fixup! Bug 32308: use direct browser sizing for letterboxing.
by richard (@richard) 31 Jan '24

31 Jan '24
richard pushed to branch mullvad-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Mullvad Browser Commits: f74a854e by hackademix at 2024-01-31T13:44:56+00:00 fixup! Bug 32308: use direct browser sizing for letterboxing. Bug 42387: hide visual artifacts and fix the status label on rounded letterboxing borders. - - - - - 3 changed files: - browser/base/content/browser.css - browser/base/content/tabbrowser.js - toolkit/components/resistfingerprinting/RFPHelper.sys.mjs Changes: ===================================== browser/base/content/browser.css ===================================== @@ -127,6 +127,11 @@ body { -moz-window-dragging: drag; } +/** + Never modify the following selector without synchronizing + LETTERBOX_CSS_SELECTOR in RFPHelper.sys.jsm, where + --letterboxing-width & --letterboxing-height are actually set. +**/ .letterboxing .browserContainer { /* From Firefox 115 on, .browserContainer layout is flex / column, @@ -137,6 +142,14 @@ body { background: var(--letterboxing-bgcolor); } +.browserDecorator { + display: none; + pointer-events: none; + background: transparent; + position: relative; + z-index: 1; +} + .letterboxing { --letterboxing-border-radius: 8px; --letterboxing-border-top-radius: 0; @@ -145,6 +158,7 @@ body { --letterboxing-bgcolor: var(--tabpanel-background-color); --letterboxing-gradient-color1: var(--letterboxing-bgcolor); --letterboxing-gradient-color2: color-mix(in srgb, var(--chrome-content-separator-color) 50%, var(--letterboxing-bgcolor)); + --letterboxing-border-color: var(--letterboxing-bgcolor); } .letterboxing.letterboxing-vcenter .browserContainer:not(.responsive-mode) > .browserStack:not(.exclude-letterboxing) { @@ -157,6 +171,26 @@ body { box-shadow: rgba(0, 0, 0, 0.5) 0px -1px 2px; } +:root:not([inDOMFullscreen]) .letterboxing .browserContainer:not(.responsive-mode) + > .browserStack:not(.exclude-letterboxing) + > .browserDecorator { + display: initial; + visibility: visible; + border-radius: var(--letterboxing-border-radius); + border-top-left-radius: var(--letterboxing-border-top-radius); + border-top-right-radius: var(--letterboxing-border-top-radius); + box-shadow: var(--letterboxing-border-color) 0px 0px .1px inset, var(--letterboxing-border-color) 0 0 .1px; + border: .1px solid var(--letterboxing-border-color); + outline: .1px solid var(--letterboxing-bgcolor); + height: calc(var(--letterboxing-height) + 1px); + top: -1px; +} + +.letterboxing-vcenter .browserDecorator { + height: auto !important; + top: 0 !important; +} + /* Align status bar with content. TODO: switch to nested CSS selectors for conciseness when available (Firefox >= 117) @@ -167,6 +201,7 @@ body { place-self: end left; left: 0; right: 0; + z-index: 2; --letterboxing-status-left-radius: var(--letterboxing-border-radius); --letterboxing-status-right-radius: 0; } @@ -184,23 +219,24 @@ body { .letterboxing .browserContainer:not(.responsive-mode) > .browserStack:not(.exclude-letterboxing) #statuspanel-label { border-radius: 0 0 var(--letterboxing-status-right-radius) var(--letterboxing-status-left-radius); + margin: 0; + border: 1px solid var(--letterboxing-border-color); + max-width: calc(var(--letterboxing-width) * .5); } -/** - Never modify the following selector without synchronizing - LETTERBOX_CSS_SELECTOR in RFPHelper.jsm! -**/ .letterboxing .browserContainer:not(.responsive-mode) > .browserStack:not(.exclude-letterboxing) > browser { - /* width & height to be dynamically set by RFPHelper.jsm */ box-shadow: 0px 4px 8px 0px var(--letterboxing-shadow-color); border-radius: var(--letterboxing-border-radius); border-top-left-radius: var(--letterboxing-border-top-radius); border-top-right-radius: var(--letterboxing-border-top-radius); + width: var(--letterboxing-width) !important; + height: var(--letterboxing-height) !important; } :root:not([inDOMFullscreen]) .letterboxing.letterboxing-ready .browserContainer:not(.responsive-mode) > .browserStack:not(.exclude-letterboxing) { place-content: var(--letterboxing-vertical-alignment) center; + background: var(--letterboxing-bgcolor); } #toolbar-menubar[autohide="true"] { ===================================== browser/base/content/tabbrowser.js ===================================== @@ -2238,6 +2238,10 @@ stack.className = "browserStack"; stack.appendChild(b); + let decorator = document.createXULElement("hbox"); + decorator.className = "browserDecorator"; + stack.appendChild(decorator); + let browserContainer = document.createXULElement("vbox"); browserContainer.className = "browserContainer"; browserContainer.appendChild(notificationbox); ===================================== toolkit/components/resistfingerprinting/RFPHelper.sys.mjs ===================================== @@ -447,8 +447,7 @@ class _RFPHelper { // find the rule applying the default letterboxing styles to browsers // preemptively in order to beat race conditions on tab/window creation const LETTERBOX_CSS_URL = "chrome://browser/content/browser.css"; - const LETTERBOX_CSS_SELECTOR = - ".letterboxing .browserContainer:not(.responsive-mode) > .browserStack:not(.exclude-letterboxing) > browser"; + const LETTERBOX_CSS_SELECTOR = ".letterboxing .browserContainer"; for (let ss of document.styleSheets) { if (ss.href !== LETTERBOX_CSS_URL) { continue; @@ -572,8 +571,8 @@ class _RFPHelper { const r = (width, height) => { lastRoundedSize = {width, height}; return { - width: `var(--rdm-width, ${width}px)`, - height: `var(--rdm-height, ${height}px)`, + "--letterboxing-width": `var(--rdm-width, ${width}px)`, + "--letterboxing-height": `var(--rdm-height, ${height}px)`, } }; @@ -637,7 +636,7 @@ class _RFPHelper { for (let [name, value] of Object.entries(props)) { if (style[name] !== value) { this.push(() => { - style.setProperty(name, value, "important"); + style.setProperty(name, value); }); } } @@ -668,8 +667,11 @@ class _RFPHelper { ? // optional UI components such as the notification box, the find bar // or devtools are constraining this browser's size: recompute custom roundDimensions(parentWidth, parentHeight) - : { width: "", height: "" }; // otherwise we can keep the default (rounded) size - styleChanges.queueIfNeeded(aBrowser, roundedInline); + : { + "--letterboxing-width": "", + "--letterboxing-height": "", + }; // otherwise we can keep the default (rounded) size + styleChanges.queueIfNeeded(browserParent, roundedInline); if (lastRoundedSize) { // check wether the letterboxing margin is less than the border radius, and if so flatten the borders View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/f74… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/f74… 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.7.0esr-13.5-1] fixup! Bug 32308: use direct browser sizing for letterboxing.
by richard (@richard) 31 Jan '24

31 Jan '24
richard pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: 922c0f76 by hackademix at 2024-01-31T14:22:39+01:00 fixup! Bug 32308: use direct browser sizing for letterboxing. Bug 42387: hide visual artifacts and fix the status label on rounded letterboxing borders. - - - - - 3 changed files: - browser/base/content/browser.css - browser/base/content/tabbrowser.js - toolkit/components/resistfingerprinting/RFPHelper.sys.mjs Changes: ===================================== browser/base/content/browser.css ===================================== @@ -127,6 +127,11 @@ body { -moz-window-dragging: drag; } +/** + Never modify the following selector without synchronizing + LETTERBOX_CSS_SELECTOR in RFPHelper.sys.jsm, where + --letterboxing-width & --letterboxing-height are actually set. +**/ .letterboxing .browserContainer { /* From Firefox 115 on, .browserContainer layout is flex / column, @@ -137,6 +142,14 @@ body { background: var(--letterboxing-bgcolor); } +.browserDecorator { + display: none; + pointer-events: none; + background: transparent; + position: relative; + z-index: 1; +} + .letterboxing { --letterboxing-border-radius: 8px; --letterboxing-border-top-radius: 0; @@ -145,6 +158,7 @@ body { --letterboxing-bgcolor: var(--tabpanel-background-color); --letterboxing-gradient-color1: var(--letterboxing-bgcolor); --letterboxing-gradient-color2: color-mix(in srgb, var(--chrome-content-separator-color) 50%, var(--letterboxing-bgcolor)); + --letterboxing-border-color: var(--letterboxing-bgcolor); } .letterboxing.letterboxing-vcenter .browserContainer:not(.responsive-mode) > .browserStack:not(.exclude-letterboxing) { @@ -157,6 +171,26 @@ body { box-shadow: rgba(0, 0, 0, 0.5) 0px -1px 2px; } +:root:not([inDOMFullscreen]) .letterboxing .browserContainer:not(.responsive-mode) + > .browserStack:not(.exclude-letterboxing) + > .browserDecorator { + display: initial; + visibility: visible; + border-radius: var(--letterboxing-border-radius); + border-top-left-radius: var(--letterboxing-border-top-radius); + border-top-right-radius: var(--letterboxing-border-top-radius); + box-shadow: var(--letterboxing-border-color) 0px 0px .1px inset, var(--letterboxing-border-color) 0 0 .1px; + border: .1px solid var(--letterboxing-border-color); + outline: .1px solid var(--letterboxing-bgcolor); + height: calc(var(--letterboxing-height) + 1px); + top: -1px; +} + +.letterboxing-vcenter .browserDecorator { + height: auto !important; + top: 0 !important; +} + /* Align status bar with content. TODO: switch to nested CSS selectors for conciseness when available (Firefox >= 117) @@ -167,6 +201,7 @@ body { place-self: end left; left: 0; right: 0; + z-index: 2; --letterboxing-status-left-radius: var(--letterboxing-border-radius); --letterboxing-status-right-radius: 0; } @@ -184,23 +219,24 @@ body { .letterboxing .browserContainer:not(.responsive-mode) > .browserStack:not(.exclude-letterboxing) #statuspanel-label { border-radius: 0 0 var(--letterboxing-status-right-radius) var(--letterboxing-status-left-radius); + margin: 0; + border: 1px solid var(--letterboxing-border-color); + max-width: calc(var(--letterboxing-width) * .5); } -/** - Never modify the following selector without synchronizing - LETTERBOX_CSS_SELECTOR in RFPHelper.jsm! -**/ .letterboxing .browserContainer:not(.responsive-mode) > .browserStack:not(.exclude-letterboxing) > browser { - /* width & height to be dynamically set by RFPHelper.jsm */ box-shadow: 0px 4px 8px 0px var(--letterboxing-shadow-color); border-radius: var(--letterboxing-border-radius); border-top-left-radius: var(--letterboxing-border-top-radius); border-top-right-radius: var(--letterboxing-border-top-radius); + width: var(--letterboxing-width) !important; + height: var(--letterboxing-height) !important; } :root:not([inDOMFullscreen]) .letterboxing.letterboxing-ready .browserContainer:not(.responsive-mode) > .browserStack:not(.exclude-letterboxing) { place-content: var(--letterboxing-vertical-alignment) center; + background: var(--letterboxing-bgcolor); } #toolbar-menubar[autohide="true"] { ===================================== browser/base/content/tabbrowser.js ===================================== @@ -2238,6 +2238,10 @@ stack.className = "browserStack"; stack.appendChild(b); + let decorator = document.createXULElement("hbox"); + decorator.className = "browserDecorator"; + stack.appendChild(decorator); + let browserContainer = document.createXULElement("vbox"); browserContainer.className = "browserContainer"; browserContainer.appendChild(notificationbox); ===================================== toolkit/components/resistfingerprinting/RFPHelper.sys.mjs ===================================== @@ -447,8 +447,7 @@ class _RFPHelper { // find the rule applying the default letterboxing styles to browsers // preemptively in order to beat race conditions on tab/window creation const LETTERBOX_CSS_URL = "chrome://browser/content/browser.css"; - const LETTERBOX_CSS_SELECTOR = - ".letterboxing .browserContainer:not(.responsive-mode) > .browserStack:not(.exclude-letterboxing) > browser"; + const LETTERBOX_CSS_SELECTOR = ".letterboxing .browserContainer"; for (let ss of document.styleSheets) { if (ss.href !== LETTERBOX_CSS_URL) { continue; @@ -572,8 +571,8 @@ class _RFPHelper { const r = (width, height) => { lastRoundedSize = {width, height}; return { - width: `var(--rdm-width, ${width}px)`, - height: `var(--rdm-height, ${height}px)`, + "--letterboxing-width": `var(--rdm-width, ${width}px)`, + "--letterboxing-height": `var(--rdm-height, ${height}px)`, } }; @@ -637,7 +636,7 @@ class _RFPHelper { for (let [name, value] of Object.entries(props)) { if (style[name] !== value) { this.push(() => { - style.setProperty(name, value, "important"); + style.setProperty(name, value); }); } } @@ -668,8 +667,11 @@ class _RFPHelper { ? // optional UI components such as the notification box, the find bar // or devtools are constraining this browser's size: recompute custom roundDimensions(parentWidth, parentHeight) - : { width: "", height: "" }; // otherwise we can keep the default (rounded) size - styleChanges.queueIfNeeded(aBrowser, roundedInline); + : { + "--letterboxing-width": "", + "--letterboxing-height": "", + }; // otherwise we can keep the default (rounded) size + styleChanges.queueIfNeeded(browserParent, roundedInline); if (lastRoundedSize) { // check wether the letterboxing margin is less than the border radius, and if so flatten the borders View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/922c0f7… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/922c0f7… 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.7.0esr-13.5-1] 2 commits: fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in...
by richard (@richard) 31 Jan '24

31 Jan '24
richard pushed to branch tor-browser-115.7.0esr-13.5-1 at The Tor Project / Applications / Tor Browser Commits: d66eecaa by Henry Wilkes at 2024-01-31T09:28:02+00:00 fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection Bug 42385: Add lox invite dialog. - - - - - 48110609 by Henry Wilkes at 2024-01-31T09:28:03+00:00 fixup! Tor Browser strings Bug 42385: Add lox invite dialog strings. - - - - - 6 changed files: - browser/components/torpreferences/content/connectionPane.js - + browser/components/torpreferences/content/loxInviteDialog.js - + browser/components/torpreferences/content/loxInviteDialog.xhtml - browser/components/torpreferences/content/torPreferences.css - browser/components/torpreferences/jar.mn - browser/locales/en-US/browser/tor-browser.ftl Changes: ===================================== browser/components/torpreferences/content/connectionPane.js ===================================== @@ -1321,7 +1321,17 @@ const gLoxStatus = { ); this._invitesButton.addEventListener("click", () => { - // TODO: Show invites. + gSubDialog.open( + "chrome://browser/content/torpreferences/loxInviteDialog.xhtml", + { + features: "resizable=yes", + closedCallback: () => { + // TODO: Listen for events from Lox, rather than call _updateInvites + // directly. + this._updateInvites(); + }, + } + ); }); this._unlockAlertButton.addEventListener("click", () => { // TODO: Have a way to ensure that the cleared event data matches the ===================================== browser/components/torpreferences/content/loxInviteDialog.js ===================================== @@ -0,0 +1,347 @@ +"use strict"; + +const { TorSettings, TorSettingsTopics, TorBridgeSource } = + ChromeUtils.importESModule("resource://gre/modules/TorSettings.sys.mjs"); + +const { Lox, LoxErrors } = ChromeUtils.importESModule( + "resource://gre/modules/Lox.sys.mjs" +); + +/** + * Fake Lox module + +const LoxErrors = { + LoxServerUnreachable: "LoxServerUnreachable", + Other: "Other", +}; + +const Lox = { + remainingInvites: 5, + getRemainingInviteCount() { + return this.remainingInvites; + }, + invites: [ + '{"invite": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}', + '{"invite": [9,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}', + ], + getInvites() { + return this.invites; + }, + failError: null, + generateInvite() { + return new Promise((res, rej) => { + setTimeout(() => { + if (this.failError) { + rej({ type: this.failError }); + return; + } + if (!this.remainingInvites) { + rej({ type: LoxErrors.Other }); + return; + } + const invite = JSON.stringify({ + invite: Array.from({ length: 100 }, () => + Math.floor(Math.random() * 265) + ), + }); + this.invites.push(invite); + this.remainingInvites--; + res(invite); + }, 4000); + }); + }, +}; +*/ + +const gLoxInvites = { + /** + * Initialize the dialog. + */ + init() { + this._dialog = document.getElementById("lox-invite-dialog"); + this._remainingInvitesEl = document.getElementById( + "lox-invite-dialog-remaining" + ); + this._generateButton = document.getElementById( + "lox-invite-dialog-generate-button" + ); + this._connectingEl = document.getElementById( + "lox-invite-dialog-connecting" + ); + this._errorEl = document.getElementById("lox-invite-dialog-error-message"); + this._inviteListEl = document.getElementById("lox-invite-dialog-list"); + + this._generateButton.addEventListener("click", () => { + this._generateNewInvite(); + }); + + const menu = document.getElementById("lox-invite-dialog-item-menu"); + this._inviteListEl.addEventListener("contextmenu", event => { + if (!this._inviteListEl.selectedItem) { + return; + } + menu.openPopupAtScreen(event.screenX, event.screenY, true); + }); + menu.addEventListener("popuphidden", () => { + menu.setAttribute("aria-hidden", "true"); + }); + menu.addEventListener("popupshowing", () => { + menu.removeAttribute("aria-hidden"); + }); + document + .getElementById("lox-invite-dialog-copy-menu-item") + .addEventListener("command", () => { + const selected = this._inviteListEl.selectedItem; + if (!selected) { + return; + } + const clipboard = Cc[ + "@mozilla.org/widget/clipboardhelper;1" + ].getService(Ci.nsIClipboardHelper); + clipboard.copyString(selected.textContent); + }); + + // NOTE: TorSettings should already be initialized when this dialog is + // opened. + Services.obs.addObserver(this, TorSettingsTopics.SettingsChanged); + // TODO: Listen for new invites from Lox, when supported. + + // Set initial _loxId value. Can close this dialog. + this._updateLoxId(); + + this._updateRemainingInvites(); + this._updateExistingInvites(); + }, + + /** + * Un-initialize the dialog. + */ + uninit() { + Services.obs.removeObserver(this, TorSettingsTopics.SettingsChanged); + }, + + observe(subject, topic, data) { + switch (topic) { + case TorSettingsTopics.SettingsChanged: + const { changes } = subject.wrappedJSObject; + if ( + changes.includes("bridges.source") || + changes.includes("bridges.lox_id") + ) { + this._updateLoxId(); + } + break; + } + }, + + /** + * The loxId this dialog is shown for. null if uninitailized. + * + * @type {string?} + */ + _loxId: null, + /** + * Update the _loxId value. Will close the dialog if it changes after + * initialization. + */ + _updateLoxId() { + const loxId = + TorSettings.bridges.source === TorBridgeSource.Lox + ? TorSettings.bridges.lox_id + : ""; + if (!loxId || (this._loxId !== null && loxId !== this._loxId)) { + // No lox id, or it changed. Close this dialog. + this._dialog.cancelDialog(); + } + this._loxId = loxId; + }, + + /** + * The invites that are already shown. + * + * @type {Set<string>} + */ + _shownInvites: new Set(), + + /** + * Add a new invite at the start of the list. + * + * @param {string} invite - The invite to add. + */ + _addInvite(invite) { + if (this._shownInvites.has(invite)) { + return; + } + const newInvite = document.createXULElement("richlistitem"); + newInvite.classList.add("lox-invite-dialog-list-item"); + newInvite.textContent = invite; + + this._inviteListEl.prepend(newInvite); + this._shownInvites.add(invite); + }, + + /** + * Update the display of the existing invites. + */ + _updateExistingInvites() { + // Add new invites. + + // NOTE: we only expect invites to be appended, so we won't re-order any. + // NOTE: invites are ordered with the oldest first. + for (const invite of Lox.getInvites()) { + this._addInvite(invite); + } + }, + + /** + * The shown number or remaining invites we have. + * + * @type {integer} + */ + _remainingInvites: 0, + + /** + * Update the display of the remaining invites. + */ + _updateRemainingInvites() { + this._remainingInvites = Lox.getRemainingInviteCount(); + + document.l10n.setAttributes( + this._remainingInvitesEl, + "tor-bridges-lox-remaining-invites", + { numInvites: this._remainingInvites } + ); + this._updateGenerateButtonState(); + }, + + /** + * Whether we are currently generating an invite. + * + * @type {boolean} + */ + _generating: false, + /** + * Set whether we are generating an invite. + * + * @param {boolean} isGenerating - Whether we are generating. + */ + _setGenerating(isGenerating) { + this._generating = isGenerating; + this._updateGenerateButtonState(); + this._connectingEl.classList.toggle("show-connecting", isGenerating); + }, + + /** + * Update the state of the generate button. + */ + _updateGenerateButtonState() { + this._generateButton.disabled = this._generating || !this._remainingInvites; + }, + + /** + * Start generating a new invite. + */ + _generateNewInvite() { + if (this._generating) { + console.error("Already generating an invite"); + return; + } + this._setGenerating(true); + // Clear the previous error. + this._updateGenerateError(null); + // Move focus from the button to the connecting element, since button is + // now disabled. + this._connectingEl.focus(); + + let lostFocus = false; + Lox.generateInvite() + .finally(() => { + // Fetch whether the connecting label still has focus before we hide it. + lostFocus = this._connectingEl.contains(document.activeElement); + this._setGenerating(false); + }) + .then( + invite => { + this._addInvite(invite); + + if (!this._inviteListEl.contains(document.activeElement)) { + // Does not have focus, change the selected item to be the new + // invite (at index 0). + this._inviteListEl.selectedIndex = 0; + } + + if (lostFocus) { + // Move focus to the new invite before we hide the "Connecting" + // message. + this._inviteListEl.focus(); + } + + // TODO: When Lox sends out notifications, let the observer handle the + // change rather than calling _updateRemainingInvites directly. + this._updateRemainingInvites(); + }, + loxError => { + console.error("Failed to generate an invite", loxError); + switch (loxError.type) { + case LoxErrors.LoxServerUnreachable: + this._updateGenerateError("no-server"); + break; + default: + this._updateGenerateError("generic"); + break; + } + + if (lostFocus) { + // Move focus back to the button before we hide the "Connecting" + // message. + this._generateButton.focus(); + } + } + ); + }, + + /** + * Update the shown generation error. + * + * @param {string?} type - The error type, or null if no error should be + * shown. + */ + _updateGenerateError(type) { + // First clear the existing error. + this._errorEl.removeAttribute("data-l10n-id"); + this._errorEl.textContent = ""; + this._errorEl.classList.toggle("show-error", !!type); + + if (!type) { + return; + } + + let errorId; + switch (type) { + case "no-server": + errorId = "lox-invite-dialog-no-server-error"; + break; + case "generic": + // Generic error. + errorId = "lox-invite-dialog-generic-invite-error"; + break; + } + + document.l10n.setAttributes(this._errorEl, errorId); + }, +}; + +window.addEventListener( + "DOMContentLoaded", + () => { + gLoxInvites.init(); + window.addEventListener( + "unload", + () => { + gLoxInvites.uninit(); + }, + { once: true } + ); + }, + { once: true } +); ===================================== browser/components/torpreferences/content/loxInviteDialog.xhtml ===================================== @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> +<?xml-stylesheet href="chrome://browser/skin/preferences/preferences.css"?> +<?xml-stylesheet href="chrome://browser/content/torpreferences/torPreferences.css"?> + +<window + type="child" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" + xmlns:html="http://www.w3.org/1999/xhtml" + data-l10n-id="lox-invite-dialog-title" +> + <!-- Context menu, aria-hidden whilst not shown so it does not appear in the + - document content. --> + <menupopup id="lox-invite-dialog-item-menu" aria-hidden="true"> + <menuitem + id="lox-invite-dialog-copy-menu-item" + data-l10n-id="lox-invite-dialog-menu-item-copy-invite" + /> + </menupopup> + <dialog id="lox-invite-dialog" buttons="accept"> + <linkset> + <html:link rel="localization" href="browser/tor-browser.ftl" /> + </linkset> + + <script src="chrome://browser/content/torpreferences/loxInviteDialog.js" /> + + <description data-l10n-id="lox-invite-dialog-description"></description> + <html:div id="lox-invite-dialog-generate-area"> + <html:span id="lox-invite-dialog-remaining"></html:span> + <html:button + id="lox-invite-dialog-generate-button" + data-l10n-id="lox-invite-dialog-request-button" + ></html:button> + <html:div id="lox-invite-dialog-message-area"> + <html:span + id="lox-invite-dialog-error-message" + role="alert" + ></html:span> + <html:span + id="lox-invite-dialog-connecting" + role="alert" + tabindex="0" + data-l10n-id="lox-invite-dialog-connecting" + ></html:span> + </html:div> + </html:div> + <html:div + id="lox-invite-dialog-list-label" + data-l10n-id="lox-invite-dialog-invites-label" + ></html:div> + <richlistbox + id="lox-invite-dialog-list" + aria-labelledby="lox-invite-dialog-list-label" + ></richlistbox> + </dialog> +</window> ===================================== browser/components/torpreferences/content/torPreferences.css ===================================== @@ -820,6 +820,75 @@ dialog#torPreferences-requestBridge-dialog > hbox { background: var(--qr-one); } +/* Lox invite dialog */ + +#lox-invite-dialog-generate-area { + flex: 0 0 auto; + display: grid; + grid-template: + ". remaining button" min-content + "message message message" auto + / 1fr max-content max-content; + gap: 8px; + margin-block: 16px 8px; + align-items: center; +} + +#lox-invite-dialog-remaining { + grid-area: remaining; +} + +#lox-invite-dialog-generate-button { + grid-area: button; +} + +#lox-invite-dialog-message-area { + grid-area: message; + justify-self: end; +} + +#lox-invite-dialog-message-area::after { + /* Zero width space, to ensure we are always one line high. */ + content: "\200B"; +} + +#lox-invite-dialog-error-message { + color: var(--in-content-error-text-color); +} + +#lox-invite-dialog-error-message:not(.show-error) { + display: none; +} + +#lox-invite-dialog-connecting { + color: var(--text-color-deemphasized); + /* TODO: Add spinner ::before */ +} + +#lox-invite-dialog-connecting:not(.show-connecting) { + display: none; +} + +#lox-invite-dialog-list-label { + font-weight: 700; +} + +#lox-invite-dialog-list { + flex: 1 1 auto; + /* basis height */ + height: 10em; + margin-block: 8px; +} + +.lox-invite-dialog-list-item { + white-space: nowrap; + overflow-x: hidden; + /* FIXME: ellipsis does not show. */ + text-overflow: ellipsis; + padding-block: 6px; + padding-inline: 8px; +} + /* Builtin bridge dialog */ #torPreferences-builtinBridge-header { margin: 8px 0 10px 0; ===================================== browser/components/torpreferences/jar.mn ===================================== @@ -9,6 +9,8 @@ browser.jar: content/browser/torpreferences/lox-success.svg (content/lox-success.svg) content/browser/torpreferences/lox-complete-ring.svg (content/lox-complete-ring.svg) content/browser/torpreferences/lox-progress-ring.svg (content/lox-progress-ring.svg) + content/browser/torpreferences/loxInviteDialog.xhtml (content/loxInviteDialog.xhtml) + content/browser/torpreferences/loxInviteDialog.js (content/loxInviteDialog.js) content/browser/torpreferences/bridgeQrDialog.xhtml (content/bridgeQrDialog.xhtml) content/browser/torpreferences/bridgeQrDialog.js (content/bridgeQrDialog.js) content/browser/torpreferences/builtinBridgeDialog.xhtml (content/builtinBridgeDialog.xhtml) ===================================== browser/locales/en-US/browser/tor-browser.ftl ===================================== @@ -296,3 +296,17 @@ user-provide-bridge-dialog-result-invite = The following bridges were shared wit user-provide-bridge-dialog-result-addresses = The following bridges were entered by you. user-provide-bridge-dialog-next-button = .label = Next + +## Bridge pass invite dialog. Temporary. + +lox-invite-dialog-title = + .title = Bridge pass invites +lox-invite-dialog-description = You can ask the bridge bot to create a new invite, which you can share with a trusted contact to give them their own bridge pass. Each invite can only be redeemed once, but you will unlock access to more invites over time. +lox-invite-dialog-request-button = Request new invite +lox-invite-dialog-connecting = Connecting to bridge pass server… +lox-invite-dialog-no-server-error = Unable to connect to bridge pass server. +lox-invite-dialog-generic-invite-error = Failed to create a new invite. +lox-invite-dialog-invites-label = Created invites: +lox-invite-dialog-menu-item-copy-invite = + .label = Copy invite + .accesskey = C View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/8069e4… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/8069e4… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 558
  • 559
  • 560
  • 561
  • 562
  • 563
  • 564
  • ...
  • 2132
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.