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 -----
  • 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
  • 20971 discussions
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] fixup! BB 41459: WebRTC fails to build under mingw (Part 2)
by Pier Angelo Vendrame (@pierov) 04 Mar '26

04 Mar '26
Pier Angelo Vendrame pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: eb89dfda by june wilde at 2026-03-04T10:11:37+01:00 fixup! BB 41459: WebRTC fails to build under mingw (Part 2) - - - - - 1 changed file: - third_party/libwebrtc/rtc_base/win/create_direct3d_device.h Changes: ===================================== third_party/libwebrtc/rtc_base/win/create_direct3d_device.h ===================================== @@ -13,15 +13,6 @@ #include <windows.graphics.directx.direct3d11.h> #include <windows.graphics.directx.direct3d11.interop.h> -#ifdef __MINGW32__ -# include <dxgi.h> -# include <inspectable.h> -extern "C" { -// This function is only used in decltype(..) -HRESULT __stdcall CreateDirect3D11DeviceFromDXGIDevice( - ::IDXGIDevice* dxgiDevice, ::IInspectable** graphicsDevice); -} -#endif #include <winerror.h> #include <wrl/client.h> View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/eb89dfd… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/eb89dfd… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] TB 44633: Move CreateDirect3D11DeviceFromDXGIDevice to mingw-webrtc.patch
by Pier Angelo Vendrame (@pierov) 04 Mar '26

04 Mar '26
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 648b1180 by june wilde at 2026-03-04T10:04:24+01:00 TB 44633: Move CreateDirect3D11DeviceFromDXGIDevice to mingw-webrtc.patch - - - - - 1 changed file: - projects/mingw-w64-clang/mingw-webrtc.patch Changes: ===================================== projects/mingw-w64-clang/mingw-webrtc.patch ===================================== @@ -1,9 +1,9 @@ diff --git a/mingw-w64-headers/include/windows.graphics.directx.direct3d11.interop.h b/mingw-w64-headers/include/windows.graphics.directx.direct3d11.interop.h new file mode 100644 -index 000000000..d7ff1be23 +index 000000000..d92535247 --- /dev/null +++ b/mingw-w64-headers/include/windows.graphics.directx.direct3d11.interop.h -@@ -0,0 +1,160 @@ +@@ -0,0 +1,164 @@ +/*** Autogenerated by WIDL 8.0 from include/windows.graphics.directx.direct3d11.interop.idl - Do not edit ***/ + +#ifdef _WIN32 @@ -51,12 +51,16 @@ index 000000000..d7ff1be23 + +/* Headers for imported files */ + ++#include <dxgi.h> ++#include <inspectable.h> +#include <windows.graphics.directx.direct3d11.h> + +#ifdef __cplusplus +extern "C" { +#endif + ++HRESULT CreateDirect3D11DeviceFromDXGIDevice(IDXGIDevice *dxgiDevice,IInspectable **graphicsDevice); ++ +/***************************************************************************** + * IDirect3DDxgiInterfaceAccess interface + */ @@ -166,17 +170,37 @@ index 000000000..d7ff1be23 +#endif /* __windows_graphics_directx_direct3d11_interop_h__ */ diff --git a/mingw-w64-headers/include/windows.graphics.directx.direct3d11.interop.idl b/mingw-w64-headers/include/windows.graphics.directx.direct3d11.interop.idl new file mode 100644 -index 000000000..51e2845ea +index 000000000..b5ca72e40 --- /dev/null +++ b/mingw-w64-headers/include/windows.graphics.directx.direct3d11.interop.idl -@@ -0,0 +1,14 @@ +@@ -0,0 +1,34 @@ ++/* ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ++ */ ++ +#ifdef __WIDL__ +#pragma winrt ns_prefix +#endif + ++import "dxgi.idl"; ++import "inspectable.idl"; +import "windows.graphics.directx.direct3d11.idl"; + +namespace Windows.Graphics.DirectX.Direct3D11 { ++ HRESULT CreateDirect3D11DeviceFromDXGIDevice([in] IDXGIDevice* dxgiDevice, [out] IInspectable** graphicsDevice); ++ + [ + uuid(A9B3D012-3DF2-4EE3-B8D1-8695F457D3C1) + ] View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] fixup! Firefox preference overrides.
by Pier Angelo Vendrame (@pierov) 04 Mar '26

04 Mar '26
Pier Angelo Vendrame pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 864720e4 by Pier Angelo Vendrame at 2026-03-03T18:27:50+01:00 fixup! Firefox preference overrides. BB 44461: Fix caption buttons on Windows. They are rendered with the Segoe MDL2 Assets, so we have to add that font to the list of allowed fonts. - - - - - 1 changed file: - browser/app/profile/001-base-profile.js Changes: ===================================== browser/app/profile/001-base-profile.js ===================================== @@ -910,7 +910,7 @@ pref("font.name-list.monospace.x-unicode", "Menlo, Courier New, Noto Sans Baline #endif #ifdef XP_WIN -pref("font.system.whitelist", "Arial, Cambria Math, Consolas, Courier New, Georgia, Lucida Console, MS Gothic, MS ゴシック, MS PGothic, MS Pゴシック, MV Boli, Malgun Gothic, Microsoft Himalaya, Microsoft JhengHei, Microsoft YaHei, 微软雅黑, Segoe UI, SimSun, 宋体, Sylfaen, Tahoma, Times New Roman, Verdana, Noto Sans Adlam, Noto Sans Balinese, Noto Sans Bamum, Noto Sans Bassa Vah, Noto Sans Batak, Noto Sans Bengali, Noto Sans Buginese, Noto Sans Buhid, Noto Sans Canadian Aboriginal, Noto Sans Chakma, Noto Sans Cham, Noto Sans Cherokee, Noto Sans Coptic, Noto Sans Deseret, Noto Sans Devanagari, Noto Sans Elbasan, Noto Sans Ethiopic, Noto Sans Georgian, Noto Sans Grantha, Noto Sans Gujarati, Noto Sans Gunjala Gondi, Noto Sans Gurmukhi, Noto Sans Hanifi Rohingya, Noto Sans Hanunoo, Noto Sans Kannada, Noto Sans Khmer, Noto Sans Javanese, Noto Sans Kayah Li, Noto Sans Khojki, Noto Sans Khudawadi, Noto Sans Lao, Noto Sans Lepcha, Noto Sans Limbu, Noto Sans Lisu, Noto Sans Mahajani, Noto Sans Malayalam, Noto Sans Mandaic, Noto Sans Masaram Gondi, Noto Sans Medefaidrin, Noto Sans Meetei Mayek, Noto Sans Mende Kikakui, Noto Sans Miao, Noto Sans Modi, Noto Sans Mongolian, Noto Sans Mro, Noto Sans Multani, Noto Sans Newa, Noto Sans New Tai Lue, Noto Sans NKo, Noto Sans Ol Chiki, Noto Sans Oriya, Noto Sans Osage, Noto Sans Osmanya, Noto Sans Pahawh Hmong, Noto Sans Pau Cin Hau, Noto Sans Rejang, Noto Sans Runic, Noto Sans Samaritan, Noto Sans Saurashtra, Noto Sans Sharada, Noto Sans Shavian, Noto Sans Sinhala, Noto Sans Sora Sompeng, Noto Sans Soyombo, Noto Sans Sundanese, Noto Sans Syloti Nagri, Noto Sans Symbols 2, Noto Sans Symbols, Noto Sans Syriac, Noto Sans Tagalog, Noto Sans Tagbanwa, Noto Sans Tai Le, Noto Sans Tai Tham, Noto Sans Tai Viet, Noto Sans Takri, Noto Sans Tamil, Noto Sans Telugu, Noto Sans Thaana, Noto Sans Tifinagh Adrar, Noto Sans Tifinagh Agraw Imazighen, Noto Sans Tifinagh Ahaggar, Noto Sans Tifinagh Air, Noto Sans Tifinagh APT, Noto Sans Tifinagh Azawagh, Noto Sans Tifinagh Ghat, Noto Sans Tifinagh Hawad, Noto Sans Tifinagh, Noto Sans Tifinagh Rhissa Ixa, Noto Sans Tifinagh SIL, Noto Sans Tifinagh Tawellemmet, Noto Sans Tirhuta, Noto Sans Vai, Noto Sans Wancho, Noto Sans Warang Citi, Noto Sans Yi, Noto Sans Zanabazar Square, Noto Serif Balinese, Noto Serif Bengali, Noto Serif Devanagari, Noto Serif Dogra, Noto Serif Ethiopic, Noto Serif Georgian, Noto Serif Grantha, Noto Serif Gujarati, Noto Serif Gurmukhi, Noto Serif Kannada, Noto Serif Khmer, Noto Serif Khojki, Noto Serif Lao, Noto Serif Malayalam, Noto Serif Myanmar, Noto Serif NP Hmong, Noto Serif Sinhala, Noto Serif Tamil, Noto Serif Telugu, Noto Serif Tibetan, Noto Serif Yezidi, Noto Naskh Arabic, Noto Sans, Noto Serif, Pyidaungsu, Twemoji Mozilla"); +pref("font.system.whitelist", "Arial, Cambria Math, Consolas, Courier New, Georgia, Lucida Console, MS Gothic, MS ゴシック, MS PGothic, MS Pゴシック, MV Boli, Malgun Gothic, Microsoft Himalaya, Microsoft JhengHei, Microsoft YaHei, 微软雅黑, Segoe MDL2 Assets, Segoe UI, SimSun, 宋体, Sylfaen, Tahoma, Times New Roman, Verdana, Noto Sans Adlam, Noto Sans Balinese, Noto Sans Bamum, Noto Sans Bassa Vah, Noto Sans Batak, Noto Sans Bengali, Noto Sans Buginese, Noto Sans Buhid, Noto Sans Canadian Aboriginal, Noto Sans Chakma, Noto Sans Cham, Noto Sans Cherokee, Noto Sans Coptic, Noto Sans Deseret, Noto Sans Devanagari, Noto Sans Elbasan, Noto Sans Ethiopic, Noto Sans Georgian, Noto Sans Grantha, Noto Sans Gujarati, Noto Sans Gunjala Gondi, Noto Sans Gurmukhi, Noto Sans Hanifi Rohingya, Noto Sans Hanunoo, Noto Sans Kannada, Noto Sans Khmer, Noto Sans Javanese, Noto Sans Kayah Li, Noto Sans Khojki, Noto Sans Khudawadi, Noto Sans Lao, Noto Sans Lepcha, Noto Sans Limbu, Noto Sans Lisu, Noto Sans Mahajani, Noto Sans Malayalam, Noto Sans Mandaic, Noto Sans Masaram Gondi, Noto Sans Medefaidrin, Noto Sans Meetei Mayek, Noto Sans Mende Kikakui, Noto Sans Miao, Noto Sans Modi, Noto Sans Mongolian, Noto Sans Mro, Noto Sans Multani, Noto Sans Newa, Noto Sans New Tai Lue, Noto Sans NKo, Noto Sans Ol Chiki, Noto Sans Oriya, Noto Sans Osage, Noto Sans Osmanya, Noto Sans Pahawh Hmong, Noto Sans Pau Cin Hau, Noto Sans Rejang, Noto Sans Runic, Noto Sans Samaritan, Noto Sans Saurashtra, Noto Sans Sharada, Noto Sans Shavian, Noto Sans Sinhala, Noto Sans Sora Sompeng, Noto Sans Soyombo, Noto Sans Sundanese, Noto Sans Syloti Nagri, Noto Sans Symbols 2, Noto Sans Symbols, Noto Sans Syriac, Noto Sans Tagalog, Noto Sans Tagbanwa, Noto Sans Tai Le, Noto Sans Tai Tham, Noto Sans Tai Viet, Noto Sans Takri, Noto Sans Tamil, Noto Sans Telugu, Noto Sans Thaana, Noto Sans Tifinagh Adrar, Noto Sans Tifinagh Agraw Imazighen, Noto Sans Tifinagh Ahaggar, Noto Sans Tifinagh Air, Noto Sans Tifinagh APT, Noto Sans Tifinagh Azawagh, Noto Sans Tifinagh Ghat, Noto Sans Tifinagh Hawad, Noto Sans Tifinagh, Noto Sans Tifinagh Rhissa Ixa, Noto Sans Tifinagh SIL, Noto Sans Tifinagh Tawellemmet, Noto Sans Tirhuta, Noto Sans Vai, Noto Sans Wancho, Noto Sans Warang Citi, Noto Sans Yi, Noto Sans Zanabazar Square, Noto Serif Balinese, Noto Serif Bengali, Noto Serif Devanagari, Noto Serif Dogra, Noto Serif Ethiopic, Noto Serif Georgian, Noto Serif Grantha, Noto Serif Gujarati, Noto Serif Gurmukhi, Noto Serif Kannada, Noto Serif Khmer, Noto Serif Khojki, Noto Serif Lao, Noto Serif Malayalam, Noto Serif Myanmar, Noto Serif NP Hmong, Noto Serif Sinhala, Noto Serif Tamil, Noto Serif Telugu, Noto Serif Tibetan, Noto Serif Yezidi, Noto Naskh Arabic, Noto Sans, Noto Serif, Pyidaungsu, Twemoji Mozilla"); pref("font.name-list.emoji", "Twemoji Mozilla"); // Arabic View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/864720e… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/864720e… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Pushed new branch mullvad-browser-148.0a1-16.0-2
by Dan Ballard (@dan) 04 Mar '26

04 Mar '26
Dan Ballard pushed new branch mullvad-browser-148.0a1-16.0-2 at The Tor Project / Applications / Mullvad Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Pushed new tag base-browser-148.0a1-16.0-2-build1
by Dan Ballard (@dan) 03 Mar '26

03 Mar '26
Dan Ballard pushed new tag base-browser-148.0a1-16.0-2-build1 at The Tor Project / Applications / Mullvad Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/base-… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Deleted tag base-browser-148.0a1-16.0-2-build1
by Dan Ballard (@dan) 03 Mar '26

03 Mar '26
Dan Ballard deleted tag base-browser-148.0a1-16.0-2-build1 at The Tor Project / Applications / Mullvad Browser -- You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] 8 commits: Bug 41725: Update toolchains for Firefox 148
by boklm (@boklm) 03 Mar '26

03 Mar '26
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 6e095bab by Nicolas Vigier at 2026-03-03T11:21:23+01:00 Bug 41725: Update toolchains for Firefox 148 - - - - - a29c899d by Nicolas Vigier at 2026-03-03T11:21:26+01:00 Bug 41725: Remove projects/oss-licenses-plugin https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/merge_re… - - - - - f4700966 by Nicolas Vigier at 2026-03-03T11:21:28+01:00 Bug 41726: check that the sha512sum we have for the macOS SDK is the same as Mozilla - - - - - 9406ba99 by Nicolas Vigier at 2026-03-03T11:21:29+01:00 Bug 41728: Check that the sha256sum we have for nss is the same as Mozilla - - - - - eafc83b5 by Nicolas Vigier at 2026-03-03T11:21:30+01:00 Bug 41725: Bump firefox version to 148.0a1-2 - - - - - ba70ed85 by Nicolas Vigier at 2026-03-03T11:21:32+01:00 Bug 41737: Remove comment saying to update var/gradle_dependencies_version - - - - - 45b2ba09 by Nicolas Vigier at 2026-03-03T11:21:33+01:00 Bug 41736: Add generate_gradle_dependencies_list-$project makefile targets - - - - - 9921a71b by Nicolas Vigier at 2026-03-03T12:15:31+01:00 Bug 41745: Add .sh file extension to included build_* scripts in projects/geckoview Since those files are included and don't have a shebang, text editors which have syntax highlighting cannot easily detect the format. Adding the .sh file extension usually fixes that. - - - - - 28 changed files: - Makefile - doc/how-to-update-gradle-dependencies-list.md - projects/application-services/build - projects/application-services/config - projects/application-services/gradle-dependencies-list.txt - projects/application-services/list_toolchain_updates_checks - projects/common/gen-gradle-deps-file.py - projects/firefox/config - projects/firefox/list_toolchain_updates_checks - projects/geckoview/build - projects/geckoview/build_ac_fenix → projects/geckoview/build_ac_fenix.sh - projects/geckoview/build_apk - projects/geckoview/build_common → projects/geckoview/build_common.sh - projects/geckoview/config - projects/geckoview/gradle-dependencies-list.txt - projects/geckoview/list_toolchain_updates_checks - projects/glean/build - projects/glean/config - projects/glean/gradle-dependencies-list.txt - projects/glean/use-uniffi-noop.diff - projects/gradle/config - projects/macosx-toolchain/config - − projects/oss-licenses-plugin/build - − projects/oss-licenses-plugin/build-customization.diff - − projects/oss-licenses-plugin/config - − projects/oss-licenses-plugin/gradle-dependencies-list.txt - − projects/oss-licenses-plugin/sort-dependencies-pr-268.patch - rbm.conf The diff was not included because it is too large. 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/tor-browser][tor-browser-148.0a1-16.0-2] fixup! BB 43615: Add Gitlab Issue and Merge Request templates
by Dan Ballard (@dan) 03 Mar '26

03 Mar '26
Dan Ballard pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 69e76487 by Dan Ballard at 2026-03-03T09:21:29-08:00 fixup! BB 43615: Add Gitlab Issue and Merge Request templates TB 44703: Updating rebase alpha template with recent 148 experience - - - - - 1 changed file: - .gitlab/issue_templates/060 Rebase - Alpha.md Changes: ===================================== .gitlab/issue_templates/060 Rebase - Alpha.md ===================================== @@ -13,7 +13,7 @@ The step-by-step rebase process is detailed on the [Rebase Process](https://gitl - Rebase application-services - uniffi-rs - Prepare the rebase - - [ ] Verify if application-services has updated it's uniffi-rs version + - [ ] Verify if application-services has updated it's uniffi-rs version else skip this step - [ ] Get the [upstream](https://github.com/mozilla/uniffi-rs) tag - [ ] Freeze the current default branch - [ ] Create the target branch (`X.XX.X`) @@ -45,10 +45,11 @@ The step-by-step rebase process is detailed on the [Rebase Process](https://gitl - Prepare the rebase - [ ] Get the [Firefox](https://github.com/mozilla-firefox/firefox) tag - Do the rebase [Part 1] - - [ ] Create the target branch (`tor-browser-...-1`) - - [ ] Cherry-pick commits until `tor-browser-...-build1` + - [ ] Create the target branch (`tor-browser-XXX.0a1-YY.0-1`) + - [ ] Cherry-pick commits until `tor-browser-(XXX - 1).0a1-YY.0-2-build1` + - Optional: If your first rebase, complex, or difficult, can do an MR here for feedback. - [ ] Freeze the current default branch - - [ ] Cherry-pick remaining commits + - [ ] Cherry-pick remaining commits (rest of tor-browser-(XXX - 1)a1-YY.Y-2) - Merge - [ ] Perform a self-review (`git range-diff`) - [ ] Run linters @@ -62,10 +63,14 @@ The step-by-step rebase process is detailed on the [Rebase Process](https://gitl - [ ] Make `tor-browser-...-1` the default branch and freeze it - Do the rebase [Part 2] - [ ] Create the target branch (`tor-browser-...-2`) - - [ ] Cherry-pick commits until `tor-browser-...-1-build1` + - [ ] Cherry-pick commits until `tor-browser-XXX...-1-build1` - [ ] Squash (`git rebase --autosquash FIREFOX_...`) - [ ] Cherry-pick the remaining commits - [ ] Reorder commits + - [ ] Move Mozilla "Bug ZZZZZZZZ" issues to the very start + - [ ] Move any Base Browser "BB TTTTT" issues into the BB range + - [ ] Move `--fixups` next to their parent (`git rebase -i --autosquash FIREFOX_...` then change all the `fixup` to `pick`) + - Note: also `drop` any commits marked `!dropme` - Merge - [ ] Perform a self-review (`git range-diff` + diff of diffs) - [ ] Run linters View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/69e7648… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/69e7648… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] 2 commits: fixup! TB 44098: [android] Disable sync
by Dan Ballard (@dan) 03 Mar '26

03 Mar '26
Dan Ballard pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 9a24e35c by clairehurst at 2026-03-03T09:19:42-08:00 fixup! TB 44098: [android] Disable sync - - - - - 1142203f by clairehurst at 2026-03-03T09:19:42-08:00 fixup! TB 34403 [android]: Disable Normal mode by default. - - - - - 1 changed file: - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/ui/banner/TabsTrayBanner.kt Changes: ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/ui/banner/TabsTrayBanner.kt ===================================== @@ -326,40 +326,6 @@ private fun TabPageBanner( style = FirefoxTheme.typography.button, ) } - - Tab( - selected = selectedPage == Page.NormalTabs, - onClick = { onTabPageIndicatorClicked(Page.NormalTabs) }, - modifier = Modifier - .testTag(TabsTrayTestTag.NORMAL_TABS_PAGE_BUTTON) - .semantics { - contentDescription = normalTabDescription - } - .height(RowHeight), - unselectedContentColor = inactiveColor, - ) { - Text( - text = stringResource(R.string.tabs_header_normal_tabs_title), - style = FirefoxTheme.typography.button, - ) - } - - Tab( - selected = selectedPage == Page.SyncedTabs, - onClick = { onTabPageIndicatorClicked(Page.SyncedTabs) }, - modifier = Modifier - .testTag(TabsTrayTestTag.SYNCED_TABS_PAGE_BUTTON) - .semantics { - contentDescription = syncedTabDescription - } - .height(RowHeight), - unselectedContentColor = inactiveColor, - ) { - Text( - text = stringResource(id = R.string.tabs_header_synced_tabs_title), - style = FirefoxTheme.typography.button, - ) - } } } }, View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/ec8f5c… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/ec8f5c… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] fixup! BB 44522: Modify the about dialog.
by henry (@henry) 03 Mar '26

03 Mar '26
henry pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: ec8f5ce3 by Henry Wilkes at 2026-03-03T16:25:56+00:00 fixup! BB 44522: Modify the about dialog. TB 44713: Restore the top padding that was removed upstream. - - - - - 1 changed file: - browser/base/content/aboutDialog.css Changes: ===================================== browser/base/content/aboutDialog.css ===================================== @@ -192,6 +192,7 @@ } #rightBox { + padding-block-start: 38px; background-size: auto; margin-inline: 30px; } View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/ec8f5ce… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/ec8f5ce… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] fixup! TB 42669: [android] Use custom no-op app-services
by boklm (@boklm) 03 Mar '26

03 Mar '26
boklm pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 3c502c6e by Nicolas Vigier at 2026-03-03T11:23:14+01:00 fixup! TB 42669: [android] Use custom no-op app-services TB 44690: remove nimbus handling code as it's changed in moz - - - - - 2 changed files: - mobile/android/gradle/plugins/nimbus-gradle-plugin/src/main/groovy/org/mozilla/appservices/tooling/nimbus/NimbusAssembleToolsTask.groovy - mobile/android/moz.configure Changes: ===================================== mobile/android/gradle/plugins/nimbus-gradle-plugin/src/main/groovy/org/mozilla/appservices/tooling/nimbus/NimbusAssembleToolsTask.groovy ===================================== @@ -23,6 +23,12 @@ import org.gradle.api.tasks.Nested import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction +import java.io.File +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths +import java.nio.file.StandardCopyOption + import javax.inject.Inject import java.security.MessageDigest @@ -148,6 +154,17 @@ abstract class NimbusAssembleToolsTask extends DefaultTask { @TaskAction void assembleTools() { + String nimbusFml = System.getenv("NIMBUS_FML") + if (nimbusFml == null || "".equals(nimbusFml)) { + nimbusFml = System.getProperty("nimbusFml") + } + if (nimbusFml != null && !"".equals(nimbusFml)) { + Path source = (new File(nimbusFml)).toPath() + Path dest = fmlBinary.get().asFile.toPath() + Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING) + return + } + def binaryFile = fmlBinary.get().asFile def archiveFileObj = archiveFile.get().asFile def hashFileObj = hashFile.get().asFile ===================================== mobile/android/moz.configure ===================================== @@ -233,8 +233,8 @@ def check_host_bin_prog(var, prog, toolchain=None): ) -check_host_bin_prog("EMBEDDED_UNIFFI_BINDGEN", "embedded-uniffi-bindgen") # tb-44669 - this was added in rebase 148 to make android compile but tracking potentially better fix +#check_host_bin_prog("EMBEDDED_UNIFFI_BINDGEN", "embedded-uniffi-bindgen") #check_host_bin_prog("NIMBUS_FML", "nimbus-fml") project_flag( View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/3c502c6… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/3c502c6… 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 41744: Reduce duplication between projects/geckoview/build and projects/geckoview/build_apk
by boklm (@boklm) 03 Mar '26

03 Mar '26
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 84af6965 by Nicolas Vigier at 2026-03-02T18:27:45+01:00 Bug 41744: Reduce duplication between projects/geckoview/build and projects/geckoview/build_apk - - - - - 3 changed files: - projects/geckoview/build - projects/geckoview/build_apk - projects/geckoview/build_common Changes: ===================================== projects/geckoview/build ===================================== @@ -1,26 +1,20 @@ #!/bin/bash -[% INCLUDE 'build_common' %] +[% c("var/set_default_env") -%] -tar -C /var/tmp/dist -xf [% c('input_files_by_name/rust') %] -tar -C /var/tmp/dist -xf [% c('input_files_by_name/cbindgen') %] -tar -C /var/tmp/dist -xf [% c('input_files_by_name/nasm') %] -tar -C /var/tmp/dist -xf [% c('input_files_by_name/clang') %] +mkdir -p /var/tmp/dist +tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/rust') %] +tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/cbindgen') %] +tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/nasm') %] +tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/clang') %] export LLVM_CONFIG="/var/tmp/dist/clang-linux/bin/llvm-config" export PATH="/var/tmp/dist/rust/bin:/var/tmp/dist/cbindgen:/var/tmp/dist/nasm/bin:/var/tmp/dist/clang-linux/bin:$PATH" [% IF c("var/rlbox") -%] - tar -C /var/tmp/dist -xf [% c('input_files_by_name/wasi-sysroot') %] + tar -C /var/tmp/dist -xf $rootdir/[% c('input_files_by_name/wasi-sysroot') %] export WASI_SYSROOT=/var/tmp/dist/wasi-sysroot/ [% END -%] -cd /var/tmp/build/[% project %]-[% c("version") %] -cp $rootdir/mozconfig ./ - -echo "Starting ./mach configure $(date)" -./mach configure \ - [% IF !c("var/firefox-browser") %]--with-base-browser-version=[% c("var/torbrowser_version") %][% END %] \ - [% IF !c("var/firefox-browser") %]--with-branding=$branding_dir[% END %] \ - [% IF !c("var/rlbox") -%]--without-wasm-sandboxed-libraries[% END %] +[% INCLUDE 'build_common' %] echo "Starting ./mach build $(date)" ./mach build --verbose [% IF c('var/generate_gradle_dependencies_list') %]2>&1 | tee -a $gradle_logs[% END %] ===================================== projects/geckoview/build_apk ===================================== @@ -1,10 +1,15 @@ #!/bin/bash -[% INCLUDE 'build_common' %] +[% c("var/set_default_env") -%] -echo "Starting the creation of the fat AAR $(date)" +# Specify the architectures we want to merge +export MOZ_ANDROID_FAT_AAR_ARCHITECTURES=armeabi-v7a,arm64-v8a,x86_64 +export MOZ_ANDROID_FAT_AAR_ARMEABI_V7A=$rootdir/[% c('input_files_by_name/geckoview_armv7') %]/geckoview/target.maven.zip +export MOZ_ANDROID_FAT_AAR_ARM64_V8A=$rootdir/[% c('input_files_by_name/geckoview_aarch64') %]/geckoview/target.maven.zip +export MOZ_ANDROID_FAT_AAR_X86_64=$rootdir/[% c('input_files_by_name/geckoview_x86_64') %]/geckoview/target.maven.zip -tar -C $builddir -xf [% project %]-[% c('version') %].tar.[% c('compress_tar') %] +[% INCLUDE 'build_common' %] +./mach build --verbose [% IF c("var/dev_artifacts") -%] mkdir -p $outdir/[% project %]/artifacts/armeabi-v7a @@ -15,22 +20,4 @@ tar -C $builddir -xf [% project %]-[% c('version') %].tar.[% c('compress_tar') % mv $rootdir/[% c('input_files_by_name/geckoview_x86_64') %]/artifacts/* $outdir/[% project %]/artifacts/x86_64 [% END -%] -# Specify the architectures we want to merge -export MOZ_ANDROID_FAT_AAR_ARCHITECTURES=armeabi-v7a,arm64-v8a,x86_64 -export MOZ_ANDROID_FAT_AAR_ARMEABI_V7A=$rootdir/[% c('input_files_by_name/geckoview_armv7') %]/geckoview/target.maven.zip -export MOZ_ANDROID_FAT_AAR_ARM64_V8A=$rootdir/[% c('input_files_by_name/geckoview_aarch64') %]/geckoview/target.maven.zip -export MOZ_ANDROID_FAT_AAR_X86_64=$rootdir/[% c('input_files_by_name/geckoview_x86_64') %]/geckoview/target.maven.zip - -cd $builddir/[% project %]-[% c("version") %] -cp $rootdir/mozconfig ./ - -# We still need to specify --base-browser-version due to bug 34005. -./mach configure \ - --with-base-browser-version=[% c("var/torbrowser_version") %] \ - --enable-update-channel=[% c("var/variant") %] \ - --with-branding=$branding_dir \ - [% IF !c("var/rlbox") -%]--without-wasm-sandboxed-libraries[% END %] - -./mach build --verbose - [% INCLUDE 'build_ac_fenix' %] ===================================== projects/geckoview/build_common ===================================== @@ -1,4 +1,3 @@ -[% c("var/set_default_env") -%] [% pc(c('var/compiler'), 'var/setup', { compiler_tarfile => c('input_files_by_name/' _ c('var/compiler')), }) %] @@ -82,3 +81,13 @@ touch $HOME/.mozbuild/android-device/avd chmod +x $HOME/.mozbuild/android-device/avd [% INCLUDE 'browser-localization' %] + +cd $builddir/[% project %]-[% c("version") %] +cp $rootdir/mozconfig ./ + +echo "Starting ./mach configure $(date)" +# We still need to specify --base-browser-version due to bug 34005. +./mach configure \ + [% IF !c("var/firefox-browser") %]--with-base-browser-version=[% c("var/torbrowser_version") %][% END %] \ + [% IF !c("var/firefox-browser") %]--with-branding=$branding_dir[% END %] \ + [% IF !c("var/rlbox") -%]--without-wasm-sandboxed-libraries[% END %] View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/8… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Pushed new branch mullvad-browser-148.0a1-16.0-1
by Dan Ballard (@dan) 03 Mar '26

03 Mar '26
Dan Ballard pushed new branch mullvad-browser-148.0a1-16.0-1 at The Tor Project / Applications / Mullvad Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser] Pushed new tag base-browser-148.0a1-16.0-2-build1
by Dan Ballard (@dan) 03 Mar '26

03 Mar '26
Dan Ballard pushed new tag base-browser-148.0a1-16.0-2-build1 at The Tor Project / Applications / Mullvad Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/base-… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] TB 44581 [android]: Cleanup new android compose tab-strip feature
by clairehurst (@clairehurst) 02 Mar '26

02 Mar '26
clairehurst pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: ac3ffc44 by clairehurst at 2026-03-02T16:22:13-07:00 TB 44581 [android]: Cleanup new android compose tab-strip feature - - - - - 5 changed files: - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/MenuDialogFragment.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/CustomTabMenu.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MainMenu.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuNavigation.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MoreSettingsSubmenu.kt Changes: ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/MenuDialogFragment.kt ===================================== @@ -118,6 +118,7 @@ import com.google.android.material.R as materialR import mozilla.components.browser.engine.gecko.GeckoEngineSession import android.util.Log +import org.mozilla.fenix.HomeActivity // EXPANDED_MIN_RATIO is used for BottomSheetBehavior.halfExpandedRatio(). // That value needs to be less than the PEEK_HEIGHT. @@ -321,7 +322,7 @@ class MenuDialogFragment : BottomSheetDialogFragment() { activity?.let { activity -> activity.lifecycleScope.launch { deleteBrowsingDataController.clearBrowsingDataOnQuit { - activity.finishAndRemoveTask() + (activity as HomeActivity).shutDown() } } } ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/CustomTabMenu.kt ===================================== @@ -222,20 +222,6 @@ internal fun CustomTabMenu( badgeBackgroundColor = badgeBackgroundColor, ) } - - if (shouldShowExtensionsMenu) { - ExtensionsMenuItem( - inCustomTab = true, - isPrivate = isPrivate, - isExtensionsProcessDisabled = isExtensionsProcessDisabled, - isExtensionsExpanded = isExtensionsExpanded, - isAllWebExtensionsDisabled = isAllWebExtensionsDisabled, - webExtensionMenuCount = webExtensionMenuCount, - extensionsMenuItemDescription = extensionsMenuDescription, - onExtensionsMenuClick = onExtensionsMenuClick, - extensionSubmenu = extensionSubmenu, - ) - } } if (!customTabMenuItems.isNullOrEmpty()) { ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MainMenu.kt ===================================== @@ -243,33 +243,6 @@ fun MainMenu( } } - if (accessPoint == MenuAccessPoint.Home && showBanner) { - MenuBanner( - onDismiss = { - onBannerDismiss() - }, - onClick = { - onBannerClick() - }, - ) - } - - if (accessPoint == MenuAccessPoint.Home) { - MenuGroup { - ExtensionsMenuItem( - inCustomTab = false, - isPrivate = isPrivate, - isExtensionsProcessDisabled = isExtensionsProcessDisabled, - isExtensionsExpanded = isExtensionsExpanded, - isAllWebExtensionsDisabled = isAllWebExtensionsDisabled, - webExtensionMenuCount = webExtensionMenuCount, - extensionsMenuItemDescription = extensionsMenuItemDescription, - onExtensionsMenuClick = onExtensionsMenuClick, - extensionSubmenu = extensionSubmenu, - ) - } - } - if (accessPoint == MenuAccessPoint.Browser) { ToolsAndActionsMenuGroup( isBookmarked = isBookmarked, @@ -304,45 +277,24 @@ fun MainMenu( ) MenuGroup { - MozillaAccountMenuItem( - account = account, - accountState = accountState, - isPrivate = isPrivate, - onClick = onMozillaAccountButtonClick, - ) - MenuItem( label = stringResource(id = R.string.browser_menu_settings), beforeIconPainter = painterResource(id = iconsR.drawable.mozac_ic_settings_24), onClick = onSettingsButtonClick, ) - } - - if (showQuitMenu) { - QuitMenuGroup( - onQuitMenuClick = onQuitMenuClick, + MenuItem( + label = stringResource( + id = R.string.browser_menu_delete_browsing_data_on_quit, + stringResource(id = R.string.app_name), + ), + beforeIconPainter = painterResource(id = iconsR.drawable.mozac_ic_cross_circle_24), + state = MenuItemState.WARNING, + onClick = onQuitMenuClick, ) } } } -@Composable -private fun QuitMenuGroup( - onQuitMenuClick: () -> Unit, -) { - MenuGroup { - MenuItem( - label = stringResource( - id = R.string.browser_menu_delete_browsing_data_on_quit, - stringResource(id = R.string.app_name), - ), - beforeIconPainter = painterResource(id = iconsR.drawable.mozac_ic_cross_circle_fill_24), - state = MenuItemState.WARNING, - onClick = onQuitMenuClick, - ) - } -} - @Suppress("LongParameterList", "LongMethod", "CognitiveComplexMethod") @Composable private fun ToolsAndActionsMenuGroup( @@ -435,21 +387,9 @@ private fun ToolsAndActionsMenuGroup( ) } - ExtensionsMenuItem( - inCustomTab = false, - isPrivate = isPrivate, - isExtensionsProcessDisabled = isExtensionsProcessDisabled, - isExtensionsExpanded = isExtensionsExpanded, - isAllWebExtensionsDisabled = isAllWebExtensionsDisabled, - webExtensionMenuCount = webExtensionMenuCount, - extensionsMenuItemDescription = extensionsMenuItemDescription, - onExtensionsMenuClick = onExtensionsMenuClick, - extensionSubmenu = extensionSubmenu, - ) - if (!moreMenuExpanded) { MoreMenuButtonGroup( - isMoreMenuHighlighted = isMoreMenuHighlighted, + isMoreMenuHighlighted = false, // This prevents a dot from incorrectly showing e.g. "open in app" is available, even though we disable it. onMoreMenuClick = onMoreMenuClick, ) } @@ -530,33 +470,20 @@ private fun LibraryMenuGroup( .semantics { this.collectionInfo = CollectionInfo( rowCount = 1, - columnCount = 4, + columnCount = 2, ) }, horizontalArrangement = Arrangement.SpaceEvenly, verticalAlignment = Alignment.CenterVertically, ) { - LibraryMenuItem( - modifier = Modifier - .weight(1f) - .fillMaxHeight(), - iconRes = iconsR.drawable.mozac_ic_history_24, - labelRes = R.string.library_history, - shape = leftShape, - index = 0, - onClick = onHistoryMenuClick, - ) - - Spacer(Modifier.width(spacerWidth)) - LibraryMenuItem( modifier = Modifier .weight(1f) .fillMaxHeight(), iconRes = iconsR.drawable.mozac_ic_bookmark_tray_fill_24, labelRes = R.string.library_bookmarks, - shape = middleShape, - index = 1, + shape = leftShape, + index = 0, onClick = onBookmarksMenuClick, ) @@ -569,22 +496,9 @@ private fun LibraryMenuGroup( isHighlighted = isDownloadHighlighted, iconRes = iconsR.drawable.mozac_ic_download_24, labelRes = R.string.library_downloads, - shape = middleShape, - index = 2, - onClick = onDownloadsMenuClick, - ) - - Spacer(Modifier.width(spacerWidth)) - - LibraryMenuItem( - modifier = Modifier - .weight(1f) - .fillMaxHeight(), - iconRes = iconsR.drawable.mozac_ic_login_24, - labelRes = R.string.browser_menu_passwords, shape = rightShape, - index = 3, - onClick = onPasswordsMenuClick, + index = 1, + onClick = onDownloadsMenuClick, ) } } ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuNavigation.kt ===================================== @@ -95,14 +95,6 @@ internal fun MenuNavigation( onLongClick = { onForwardButtonClick(true) }, ) - MenuNavItem( - modifier = Modifier.weight(1f), - state = state, - painter = painterResource(id = iconsR.drawable.mozac_ic_share_android_24), - label = stringResource(id = R.string.browser_menu_share), - onClick = onShareButtonClick, - ) - if (isSiteLoading) { MenuNavItem( modifier = Modifier.weight(1f), ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MoreSettingsSubmenu.kt ===================================== @@ -49,67 +49,6 @@ internal fun MoreSettingsSubmenu( Column( verticalArrangement = Arrangement.spacedBy(2.dp), ) { - if (translationInfo.isTranslationSupported) { - TranslationMenuItem( - translationInfo = translationInfo, - isReaderViewActive = isReaderViewActive, - ) - } - - if (isWebCompatReporterSupported) { - MenuItem( - label = stringResource(id = R.string.browser_menu_webcompat_reporter_2), - beforeIconPainter = painterResource(id = iconsR.drawable.mozac_ic_lightbulb_24), - state = if (isWebCompatEnabled) MenuItemState.ENABLED else MenuItemState.DISABLED, - onClick = onWebCompatReporterClick, - ) - } - - if (showShortcuts) { - ShortcutsMenuItem( - isPinned = isPinned, - onShortcutsMenuClick = onShortcutsMenuClick, - ) - } - - if (isAddToHomeScreenSupported) { - MenuItem( - label = if (isInstallable) { - stringResource(id = R.string.browser_menu_add_app_to_homescreen) - } else { - stringResource(id = R.string.browser_menu_add_to_homescreen) - }, - beforeIconPainter = painterResource(id = iconsR.drawable.mozac_ic_add_to_homescreen_24), - onClick = onAddToHomeScreenMenuClick, - ) - } - - MenuItem( - label = stringResource(id = R.string.browser_menu_save_to_collection_2), - beforeIconPainter = painterResource(id = iconsR.drawable.mozac_ic_collection_24), - onClick = onSaveToCollectionMenuClick, - ) - - if (hasExternalApp) { - MenuItem( - label = if (externalAppName != "") { - stringResource(id = R.string.browser_menu_open_in_fenix, externalAppName) - } else { - stringResource(id = R.string.browser_menu_open_app_link) - }, - beforeIconPainter = painterResource(id = iconsR.drawable.mozac_ic_more_grid_24), - isBeforeIconHighlighted = isOpenInAppMenuHighlighted, - state = MenuItemState.ENABLED, - onClick = onOpenInAppMenuClick, - ) - } else { - MenuItem( - label = stringResource(id = R.string.browser_menu_open_app_link), - beforeIconPainter = painterResource(id = iconsR.drawable.mozac_ic_more_grid_24), - state = MenuItemState.DISABLED, - ) - } - MenuItem( label = stringResource(id = R.string.browser_menu_save_as_pdf_2), beforeIconPainter = painterResource(id = iconsR.drawable.mozac_ic_save_file_24), View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/ac3ffc4… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/ac3ffc4… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] TB 44582 [android]: Temporarily disable settings search button on Android
by clairehurst (@clairehurst) 02 Mar '26

02 Mar '26
clairehurst pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 63d57d3e by clairehurst at 2026-03-02T15:07:09-08:00 TB 44582 [android]: Temporarily disable settings search button on Android - - - - - 1 changed file: - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt Changes: ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt ===================================== @@ -2024,7 +2024,7 @@ class Settings( var isSettingsSearchEnabled by booleanPreference( key = appContext.getPreferenceKey(R.string.pref_key_allow_settings_search), - default = { FxNimbus.features.settingsSearch.value().enabled }, + default = false, ) var isTabStripEnabled by booleanPreference( View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/63d57d3… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/63d57d3… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] fixup! [android] Modify UI/UX
by clairehurst (@clairehurst) 02 Mar '26

02 Mar '26
clairehurst pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: f48e0883 by clairehurst at 2026-03-02T11:20:17-08:00 fixup! [android] Modify UI/UX TB 44274 Re-adds screenshot setting to our custom location. It was removed upstream in 144 and re-added in 145, but not in the place we want it - - - - - 2 changed files: - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt - mobile/android/fenix/app/src/main/res/xml/preferences.xml Changes: ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt ===================================== @@ -80,6 +80,8 @@ import org.mozilla.fenix.utils.Settings import kotlin.system.exitProcess import org.mozilla.fenix.GleanMetrics.Settings as SettingsMetrics +import android.view.WindowManager + @Suppress("LargeClass", "TooManyFunctions") class SettingsFragment : PreferenceFragmentCompat(), UserInteractionHandler { @@ -577,6 +579,21 @@ class SettingsFragment : PreferenceFragmentCompat(), UserInteractionHandler { val preferenceMakeDefaultBrowser = requirePreference<DefaultBrowserPreference>(R.string.pref_key_make_default_browser) + // Copied from PrivateBrowsingFragment with some removals + requirePreference<SwitchPreference>(R.string.pref_key_allow_screenshots_in_private_mode).apply { + onPreferenceChangeListener = object : SharedPreferenceUpdater() { + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + if (newValue == false) { + activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_SECURE) + } else { + activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + return super.onPreferenceChange(preference, newValue) + } + } + } + + if (!Config.channel.isReleased) { preferenceLeakCanary?.setOnPreferenceChangeListener { _, newValue -> val isEnabled = newValue == true ===================================== mobile/android/fenix/app/src/main/res/xml/preferences.xml ===================================== @@ -204,6 +204,11 @@ android:key="@string/pref_key_advanced" android:layout="@layout/preference_category_no_icon_style"> + <SwitchPreference + android:key="@string/pref_key_allow_screenshots_in_private_mode" + app:iconSpaceReserved="false" + android:title="@string/preferences_allow_screenshots" /> + <androidx.preference.Preference android:key="@string/pref_key_addons" app:iconSpaceReserved="false" View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/f48e088… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/f48e088… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] fixup! BB 44711: Hide unwanted setting controls.
by henry (@henry) 02 Mar '26

02 Mar '26
henry pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 5160eedf by Henry Wilkes at 2026-03-02T18:32:23+00:00 fixup! BB 44711: Hide unwanted setting controls. TB 44679: Rehide the autofill preferences. - - - - - 1 changed file: - browser/components/preferences/privacy.inc.xhtml Changes: ===================================== browser/components/preferences/privacy.inc.xhtml ===================================== @@ -564,7 +564,14 @@ #include ../onionservices/content/authPreferences.inc.xhtml +<!-- groupid="payments" and groupid="addresses" are configured by + - FormAutofillPreferences.sys.mjs via FormAutofillStatus. But since the + - "autofill" extension is excluded from the build, FormAutofillStatus is + - never initialised. So we add the would-be data-hidden-* attributes + - explicitly here instead. See tor-browser#44460. --> <groupbox id="paymentsGroupBox" + data-hidden-from-search="true" + data-hidden-by-setting-group="" data-category="panePrivacy" data-subcategory="payment-methods-autofill" hidden="true"> <label><html:h2 data-l10n-id="autofill-payment-methods-title" class="subsection-heading"/></label> @@ -572,6 +579,8 @@ </groupbox> <groupbox id="addressesGroupBox" + data-hidden-from-search="true" + data-hidden-by-setting-group="" data-category="panePrivacy" data-subcategory="addresses-autofill" hidden="true"> <label><html:h2 data-l10n-id="autofill-addresses-title" class="subsection-heading"/></label> View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/5160eed… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/5160eed… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] 6 commits: fixup! TB 40933: Add tor-launcher functionality
by Pier Angelo Vendrame (@pierov) 02 Mar '26

02 Mar '26
Pier Angelo Vendrame pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: b07229fd by Pier Angelo Vendrame at 2026-03-02T17:49:55+01:00 fixup! TB 40933: Add tor-launcher functionality TB 44635: Gather conflux information on circuits. - - - - - b7ffbcb1 by Pier Angelo Vendrame at 2026-03-02T17:49:55+01:00 fixup! TB 40933: Add tor-launcher functionality TB 44635: Gather conflux information on circuits. Proactively gather data about the circuits in TorProvider, and send the complete information about a circuit, not only its node fingerprints. Also, gather conflux sets, and send both conflux circuits to the circuit display backend. - - - - - 13a9f1cc by Pier Angelo Vendrame at 2026-03-02T17:49:55+01:00 fixup! TB 3455: Add DomainIsolator, for isolating circuit by domain. TB 44635: Gather conflux information on circuits. Reword CircuitID to IsolationKey, for better clarity. - - - - - 66986d27 by Pier Angelo Vendrame at 2026-03-02T17:49:56+01:00 fixup! TB 3455: Add DomainIsolator, for isolating circuit by domain. TB 44635: Gather conflux information on circuits. Relay information collection now happens at the tor provider level. So, adapt the code of TorDomainIsolator to take the data alrady prepared. - - - - - ef0640a3 by Pier Angelo Vendrame at 2026-03-02T17:49:56+01:00 fixup! TB 41600: Add a tor circuit display panel. TB 44635: Gather conflux information on circuits. Consume only the first circuit on the circuit display. - - - - - 61cf191b by Pier Angelo Vendrame at 2026-03-02T17:49:56+01:00 fixup! TB 42247: Android helpers for the TorProvider TB 44635: Gather conflux information on circuits. Update the getCircuit name to getCircuits. - - - - - 6 changed files: - browser/components/torcircuit/content/torCircuitPanel.js - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java - mobile/shared/modules/geckoview/GeckoViewContent.sys.mjs - toolkit/components/tor-launcher/TorControlPort.sys.mjs - toolkit/components/tor-launcher/TorDomainIsolator.sys.mjs - toolkit/components/tor-launcher/TorProvider.sys.mjs Changes: ===================================== browser/components/torcircuit/content/torCircuitPanel.js ===================================== @@ -293,11 +293,14 @@ var gTorCircuitPanel = { _updateCurrentBrowser() { const browser = gBrowser.selectedBrowser; const domain = TorDomainIsolator.getDomainForBrowser(browser); - const nodes = TorDomainIsolator.getCircuit( + const circuits = TorDomainIsolator.getCircuits( browser, domain, browser.contentPrincipal.originAttributes.userContextId ); + // TODO: Handle multiple circuits (for conflux). Only show the primary + // circuit until the UI for that is developed. + const nodes = circuits.length ? circuits[0] : []; // We choose the currentURI, which matches what is shown in the URL bar and // will match up with the domain. // In contrast, documentURI corresponds to the shown page. E.g. it could ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java ===================================== @@ -2760,8 +2760,8 @@ public class GeckoSession { * @return The circuit information as a {@link GeckoResult} object. */ @AnyThread - public @NonNull GeckoResult<GeckoBundle> getTorCircuit() { - return mEventDispatcher.queryBundle("GeckoView:GetTorCircuit"); + public @NonNull GeckoResult<GeckoBundle> getTorCircuits() { + return mEventDispatcher.queryBundle("GeckoView:GetTorCircuits"); } /** ===================================== mobile/shared/modules/geckoview/GeckoViewContent.sys.mjs ===================================== @@ -297,8 +297,8 @@ export class GeckoViewContent extends GeckoViewModule { case "GeckoView:HasCookieBannerRuleForBrowsingContextTree": this._hasCookieBannerRuleForBrowsingContextTree(aCallback); break; - case "GeckoView:GetTorCircuit": - this._getTorCircuit(aCallback); + case "GeckoView:GetTorCircuits": + this._getTorCircuits(aCallback); break; case "GeckoView:NewTorCircuit": this._newTorCircuit(aCallback); @@ -472,15 +472,15 @@ export class GeckoViewContent extends GeckoViewModule { } } - _getTorCircuit(aCallback) { + _getTorCircuits(aCallback) { if (this.browser && aCallback) { const domain = lazy.TorDomainIsolator.getDomainForBrowser(this.browser); - const nodes = lazy.TorDomainIsolator.getCircuit( + const circuits = lazy.TorDomainIsolator.getCircuits( this.browser, domain, this.browser.contentPrincipal.originAttributes.userContextId ); - aCallback?.onSuccess({ domain, nodes }); + aCallback?.onSuccess({ domain, circuits }); } else { aCallback?.onSuccess(null); } ===================================== toolkit/components/tor-launcher/TorControlPort.sys.mjs ===================================== @@ -248,16 +248,23 @@ class AsyncSocket { */ /** * The ID of a circuit. - * From control-spec.txt: + * From the control port specs: * CircuitID = 1*16 IDChar * IDChar = ALPHA / DIGIT * Currently, Tor only uses digits, but this may change. * * @typedef {string} CircuitID */ +/** + * The ID to match paired conflux circuits. + * From the control port specs: + * ConfluxID = 32*HEXDIG + * + * @typedef {string} ConfluxID + */ /** * The ID of a stream. - * From control-spec.txt: + * From the control port specs: * CircuitID = 1*16 IDChar * IDChar = ALPHA / DIGIT * Currently, Tor only uses digits, but this may change. @@ -266,7 +273,7 @@ class AsyncSocket { */ /** * The fingerprint of a node. - * From control-spec.txt: + * From the control port specs: * Fingerprint = "$" 40*HEXDIG * However, we do not keep the $ in our structures. * @@ -275,7 +282,10 @@ class AsyncSocket { /** * @typedef {object} CircuitInfo * @property {CircuitID} id The ID of a circuit - * @property {NodeFingerprint[]} nodes List of node fingerprints + * @property {NodeFingerprint[]} nodes List of node fingerprints, ordered from + * guard/bridge to exit. + * @property {ConfluxID} [confluxId] The conflux ID, for associating conflux + * circuits. */ /** * @typedef {object} Bridge @@ -823,8 +833,8 @@ export class TorController { } const cmd = `GETCONF ${key}`; const reply = await this.#sendCommand(cmd); - // From control-spec.txt: a 'default' value semantically different from an - // empty string will not have an equal sign, just `250 $key`. + // From the control port specs: a 'default' value semantically different + // from an empty string will not have an equal sign, just `250 $key`. const defaultRe = new RegExp(`^250[-\\s]${key}$`, "gim"); if (reply.match(defaultRe)) { return []; @@ -1149,10 +1159,7 @@ export class TorController { data.groups.data ); if (maybeCircuit) { - this.#eventHandler.onCircuitBuilt( - maybeCircuit.id, - maybeCircuit.nodes - ); + this.#eventHandler.onCircuitBuilt(maybeCircuit); } else if (closedEvent) { this.#eventHandler.onCircuitClosed(closedEvent.groups.ID); } @@ -1222,7 +1229,7 @@ export class TorController { */ #parseCircBuilt(line) { const builtEvent = - /^(?<ID>[a-zA-Z0-9]{1,16})\sBUILT\s(?<Path>(,?\$([0-9a-fA-F]{40})(?:~[a-zA-Z0-9]{1,19})?)+)/.exec( + /^(?<ID>[a-zA-Z0-9]{1,16})\sBUILT\s(?<Path>(,?\$([0-9a-fA-F]{40})(?:~[a-zA-Z0-9]{1,19})?)+)(?<details>.*)/.exec( line ); if (!builtEvent) { @@ -1232,6 +1239,8 @@ export class TorController { const nodes = Array.from(builtEvent.groups.Path.matchAll(fp), g => g[1].toUpperCase() ); + const circuit = { id: builtEvent.groups.ID, nodes }; + // In some cases, we might already receive SOCKS credentials in the // line. However, this might be a problem with Onion services: we get // also a 4-hop circuit that we likely do not want to show to the @@ -1239,7 +1248,22 @@ export class TorController { // need a technical explaination. // So we do not try to extract them for now. Otherwise, we could do // const credentials = this.#parseCredentials(line); - return { id: builtEvent.groups.ID, nodes }; + + // NOTE: We use a greedy leading ".*" to skip over previous fields that + // can contain arbitrary strings, like SOCKS_USERNAME and SOCKS_PASSWORD, + // which allows them to contain " CONFLUX_ID=" within their values. + // Although such a value is not expected from the usernames and passwords we + // set in Tor Browser, it may be set by an external tor user. + // NOTE: This assumes there is no other arbitrary string field after + // CONFLUX_ID. + const maybeConfluxId = builtEvent.groups.details.match( + /.* CONFLUX_ID=([0-9a-fA-F]{32,})(?:$| )/ + ); + if (maybeConfluxId) { + circuit.confluxId = maybeConfluxId[1]; + } + + return circuit; } /** @@ -1327,8 +1351,7 @@ export class TorController { /** * @callback OnCircuitBuilt * - * @param {CircuitID} id The id of the circuit that has been built - * @param {NodeFingerprint[]} nodes The onion routers composing the circuit + * @param {CircuitInfo} circuit The information about the circuit */ /** * @callback OnCircuitClosed ===================================== toolkit/components/tor-launcher/TorDomainIsolator.sys.mjs ===================================== @@ -12,6 +12,7 @@ import { const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { + ObjectUtils: "resource://gre/modules/ObjectUtils.sys.mjs", TorProviderBuilder: "resource://gre/modules/TorProviderBuilder.sys.mjs", TorProviderTopics: "resource://gre/modules/TorProviderBuilder.sys.mjs", }); @@ -51,26 +52,21 @@ const TOR_CIRCUIT_TOPIC = "TorCircuitChange"; const CLEAR_TIMEOUT = 600_000; /** - * @typedef {string} CircuitId A string that we use to identify a circuit. - * Currently, it is a string that combines SOCKS credentials, to make it easier - * to use as a map key. - * It is not related to Tor's CircuitIDs. + * @typedef {string} IsolationKey A string that we use to identify an isolation + * key. Currently, it is a string that combines SOCKS credentials. + * Each isolation key is used to identify a set of circuits. */ /** * @typedef {number} BrowserId */ -/** - * @typedef {NodeData[]} CircuitData The data about the nodes, ordered from - * guard (or bridge) to exit. - */ /** * @typedef BrowserCircuits Circuits related to a certain combination of * isolators (first-party domain and user context ID, currently). - * @property {CircuitId} current The id of the last known circuit that has been - * used to fetch data for the isolated context. - * @property {CircuitId?} pending The id of the last used circuit for this - * isolation context. We might or might not know data about it, yet. But if we - * know it, we should move this id into current. + * @property {IsolationKey} current The last isolation key for which circuit + * information is known. + * @property {IsolationKey?} pending The last used isolation key. + * We might or might not know data about it, yet. But if we know it, we should + * move this key into current, and pending should be made null. */ /** @@ -112,9 +108,16 @@ class TorDomainIsolatorImpl { #catchallDirtySince = Date.now(); /** - * A map that associates circuit ids to the circuit information. + * A map that associates an isolation context to its circuits. * - * @type {Map<CircuitId, CircuitData>} + * The circuits are represented with a multidimensional array. + * The outer layer contains an array for each circuit of the isolation context + * (when conflux is in use, a certain isolation context might use more than a + * circuit). + * The inner layer contains the data about a certain circuit, ordered from + * guard/bridge to exit. + * + * @type {Map<IsolationKey, NodeData[][]>} */ #knownCircuits = new Map(); @@ -191,8 +194,11 @@ class TorDomainIsolatorImpl { } /** - * Get the last circuit used in a certain browser. - * The returned data is created when the circuit is first seen, therefore it + * Get the circuits being used for a certain browser. There may be multiple + * if conflux is being used. + * + * Note, this returns the last known circuits for the browser. In particular, + * the returned data is created when the circuit is first seen, therefore it * could be stale (i.e., the circuit might not be available anymore). * * @param {MozBrowser} browser The browser to get data for @@ -200,10 +206,12 @@ class TorDomainIsolatorImpl { * for * @param {number} userContextId The user context domain we want to get the * circuit for - * @returns {NodeData[]} The node data, or an empty array if we do not have - * data for the requested key. + * @returns {NodeData[][]} An array of all the circuits being used for this + * context. Each circuit is represented by an array of nodes, ordered from + * the guard/bridge to the exit. If the context has no known circuits, then + * this will be an empty array. */ - getCircuit(browser, domain, userContextId) { + getCircuits(browser, domain, userContextId) { const username = this.#makeUsername(domain, userContextId); const circuits = this.#browsers.get(browser.browserId)?.get(username); // This is the only place where circuit data can go out, so the only place @@ -278,8 +286,8 @@ class TorDomainIsolatorImpl { // TODO: What UX to use here? See tor-browser#41708 } } else if (topic === lazy.TorProviderTopics.CircuitCredentialsMatched) { - const { username, password, circuit } = subject.wrappedJSObject; - this.#updateCircuit(username, password, circuit); + const { username, password, circuits } = subject.wrappedJSObject; + this.#updateCircuits(username, password, circuits); } } @@ -421,10 +429,10 @@ class TorDomainIsolatorImpl { * * @param {string} username The SOCKS username * @param {string} password The SOCKS password - * @returns {CircuitId} A string that combines username and password and can - * be used for map lookups. + * @returns {IsolationKey} A string that combines username and password and + * can be used as a key for maps. */ - #credentialsToId(username, password) { + #credentialsToKey(username, password) { return `${username}|${password}`; } @@ -540,7 +548,7 @@ class TorDomainIsolatorImpl { this.#browsers.set(browser.browserId, browserCircuits); } const circuitIds = browserCircuits.get(username) ?? {}; - const id = this.#credentialsToId(username, password); + const id = this.#credentialsToKey(username, password); if (circuitIds.current === id) { // The circuit with these credentials was already built (we already knew // its nodes, or we would not have promoted it to the current circuit). @@ -580,36 +588,25 @@ class TorDomainIsolatorImpl { } /** - * Update a circuit, and notify the related circuit displays if it changed. + * Update the circuits associated to a certain isolation context, and notify + * the related circuit displays if they changed. * * This function is called when a certain stream has succeeded and so we can - * associate its SOCKS credential to the circuit it is using. - * We receive only the fingerprints of the circuit nodes, but they are enough - * to check if the circuit has changed. If it has, we also get the nodes' - * information through the control port. + * associate its SOCKS credentials to the circuit it is using. * * @param {string} username The SOCKS username * @param {string} password The SOCKS password - * @param {NodeFingerprint[]} circuit The fingerprints of the nodes that - * compose the circuit + * @param {NodeData[][]} circuits The circuits being used for this isolation + * context. Each is represented by an array of nodes. */ - async #updateCircuit(username, password, circuit) { - const id = this.#credentialsToId(username, password); - let data = this.#knownCircuits.get(id) ?? []; - // Should we modify the lower layer to send a circuit identifier, instead? - if ( - circuit.length === data.length && - circuit.every((fp, index) => fp === data[index].fingerprint) - ) { + async #updateCircuits(username, password, circuits) { + const key = this.#credentialsToKey(username, password); + let current = this.#knownCircuits.get(key); + if (lazy.ObjectUtils.deepEqual(current, circuits)) { return; } - - const provider = await lazy.TorProviderBuilder.build(); - data = await Promise.all( - circuit.map(fingerprint => provider.getNodeInfo(fingerprint)) - ); - logger.debug(`Updating circuit ${id}`, data); - this.#knownCircuits.set(id, data); + logger.info(`Updating circuits for ${key}`, circuits); + this.#knownCircuits.set(key, circuits); // We know that something changed, but we cannot know if anyone is // interested in this change. So, we have to notify all the possible // consumers of the data in any case. ===================================== toolkit/components/tor-launcher/TorProvider.sys.mjs ===================================== @@ -154,9 +154,24 @@ export class TorProvider { * built before the new identity but not yet used. If we cleaned the map, we * risked of not having the data about it. * - * @type {Map<CircuitID, Promise<NodeFingerprint[]>>} + * @type {Map<CircuitID, CircuitInfo>} */ #circuits = new Map(); + + /** + * Cache with node information. + * + * As a matter of fact, the circuit display backend continuously ask for + * information about the same nodes (e.g., the guards/bridges, and the exit + * for conflux circuits). + * Therefore, we can keep a cache of them to avoid a few control port lookups. + * And since it is likely we will get asked information about all nodes that + * appear in circuits, we can build this cache proactively. + * + * @type {Map<NodeFingerprint, Promise<NodeData>>} + */ + #nodeInfo = new Map(); + /** * The last used bridge, or null if bridges are not in use or if it was not * possible to detect the bridge. This needs the user to have specified bridge @@ -457,50 +472,6 @@ export class TorProvider { ); } - /** - * Returns tha data about a relay or a bridge. - * - * @param {string} id The fingerprint of the node to get data about - * @returns {Promise<NodeData>} - */ - async getNodeInfo(id) { - const node = { - fingerprint: id, - ipAddrs: [], - bridgeType: null, - regionCode: null, - }; - const bridge = (await this.#controller.getBridges())?.find( - foundBridge => foundBridge.id?.toUpperCase() === id.toUpperCase() - ); - if (bridge) { - node.bridgeType = bridge.transport ?? ""; - // Attempt to get an IP address from bridge address string. - const ip = bridge.addr.match(/^\[?([^\]]+)\]?:\d+$/)?.[1]; - if (ip && !ip.startsWith("0.")) { - node.ipAddrs.push(ip); - } - } else { - node.ipAddrs = await this.#controller.getNodeAddresses(id); - } - // tor-browser#43116, tor-browser-build#41224: on Android, we do not ship - // the GeoIP databases to save some space. So skip it for now. - if (node.ipAddrs.length && !TorLauncherUtil.isAndroid) { - // Get the country code for the node's IP address. - try { - // Expect a 2-letter ISO3166-1 code, which should also be a valid - // BCP47 Region subtag. - const regionCode = await this.#controller.getIPCountry(node.ipAddrs[0]); - if (regionCode && regionCode !== "??") { - node.regionCode = regionCode.toUpperCase(); - } - } catch (e) { - logger.warn(`Cannot get a country for IP ${node.ipAddrs[0]}`, e); - } - } - return node; - } - /** * Add a private key to the Tor configuration. * @@ -936,14 +907,76 @@ export class TorProvider { return crypto.getRandomValues(new Uint8Array(kPasswordLen)); } + // Circuit handling. + /** * Ask Tor the circuits it already knows to populate our circuit map with the * circuits that were already open before we started listening for events. */ async #fetchCircuits() { - for (const { id, nodes } of await this.#controller.getCircuits()) { - this.onCircuitBuilt(id, nodes); + for (const circuit of await this.#controller.getCircuits()) { + this.onCircuitBuilt(circuit); + } + } + + /** + * Returns tha data about a relay or a bridge. + * + * @param {string} id The fingerprint of the node to get data about + * @returns {Promise<NodeData>} + */ + #getNodeInfo(id) { + // This is an async method, so it will not insert the result, but a promise. + // However, this is what we want. + const info = this.#nodeInfo.getOrInsertComputed(id, async () => { + const node = { + fingerprint: id, + ipAddrs: [], + bridgeType: null, + regionCode: null, + }; + + const bridge = (await this.#controller.getBridges())?.find( + foundBridge => foundBridge.id?.toUpperCase() === id.toUpperCase() + ); + if (bridge) { + node.bridgeType = bridge.transport ?? ""; + // Attempt to get an IP address from bridge address string. + const ip = bridge.addr.match(/^\[?([^\]]+)\]?:\d+$/)?.[1]; + if (ip && !ip.startsWith("0.")) { + node.ipAddrs.push(ip); + } + } else { + node.ipAddrs = await this.#controller.getNodeAddresses(id); + } + + // tor-browser#43116, tor-browser-build#41224: on Android, we do not ship + // the GeoIP databases to save some space. So skip it for now. + if (node.ipAddrs.length && !TorLauncherUtil.isAndroid) { + // Get the country code for the node's IP address. + try { + // Expect a 2-letter ISO3166-1 code, which should also be a valid + // BCP47 Region subtag. + const regionCode = await this.#controller.getIPCountry( + node.ipAddrs[0] + ); + if (regionCode && regionCode !== "??") { + node.regionCode = regionCode.toUpperCase(); + } + } catch (e) { + logger.warn(`Cannot get a country for IP ${node.ipAddrs[0]}`, e); + } + } + return node; + }); + + const MAX_NODES = 300; + while (this.#nodeInfo.size > MAX_NODES) { + const oldestKey = this.#nodeInfo.keys().next().value; + this.#nodeInfo.delete(oldestKey); } + + return info; } // Notification handlers @@ -1046,24 +1079,43 @@ export class TorProvider { * If a change of bridge is detected (including a change from bridge to a * normal guard), a notification is broadcast. * - * @param {CircuitID} id The circuit ID - * @param {NodeFingerprint[]} nodes The nodes that compose the circuit + * @param {CircuitInfo} circuit The information about the circuit */ - async onCircuitBuilt(id, nodes) { - this.#circuits.set(id, nodes); - logger.debug(`Built tor circuit ${id}`, nodes); + onCircuitBuilt(circuit) { + logger.debug(`Built tor circuit ${circuit.id}`, circuit); + // Ignore circuits of length 1, that are used, for example, to probe // bridges. So, only store them, since we might see streams that use them, // but then early-return. - if (nodes.length === 1) { + if (circuit.nodes.length === 1) { return; } - if (this.#currentBridge?.fingerprint !== nodes[0]) { - const nodeInfo = await this.getNodeInfo(nodes[0]); + this.#circuits.set(circuit.id, circuit); + + for (const fingerprint of circuit.nodes) { + // To make the pending onStreamSentConnect call for this circuit faster, + // we pre-fetch the node data, which should be cached by the time it is + // called. No need to await here. + this.#getNodeInfo(fingerprint); + } + + this.#maybeBridgeChanged(circuit); + } + + /** + * Broadcast a bridge change, if needed. + * + * @param {CircuitInfo} circuit The information about the circuit + */ + #maybeBridgeChanged(circuit) { + if (this.#currentBridge?.fingerprint === circuit.nodes[0]) { + return; + } + this.#getNodeInfo(circuit.nodes[0]).then(nodeInfo => { let notify = false; if (nodeInfo?.bridgeType) { - logger.info(`Bridge changed to ${nodes[0]}`); + logger.info(`Bridge changed to ${circuit.nodes[0]}`); this.#currentBridge = nodeInfo; notify = true; } else if (this.#currentBridge) { @@ -1074,7 +1126,7 @@ export class TorProvider { if (notify) { Services.obs.notifyObservers(null, TorProviderTopics.BridgeChanged); } - } + }); } /** @@ -1091,48 +1143,60 @@ export class TorProvider { /** * Handle a notification about a stream switching to the sentconnect status. * - * @param {StreamID} streamId The ID of the stream that switched to the + * @param {StreamID} _streamId The ID of the stream that switched to the * sentconnect status. * @param {CircuitID} circuitId The ID of the circuit used by the stream * @param {string} username The SOCKS username * @param {string} password The SOCKS password */ - async onStreamSentConnect(streamId, circuitId, username, password) { + async onStreamSentConnect(_streamId, circuitId, username, password) { if (!username || !password) { return; } logger.debug("Stream sentconnect event", username, password, circuitId); - let circuit = this.#circuits.get(circuitId); - if (!circuit) { - circuit = new Promise((resolve, reject) => { - this.#controlConnection.getCircuits().then(circuits => { - for (const { id, nodes } of circuits) { - if (id === circuitId) { - resolve(nodes); - return; - } - // Opportunistically collect circuits, since we are iterating them. - this.#circuits.set(id, nodes); - } - logger.error( - `Seen a STREAM SENTCONNECT with circuit ${circuitId}, but Tor did not send information about it.` - ); - reject(); - }); - }); - this.#circuits.set(circuitId, circuit); + if (!this.#circuits.has(circuitId)) { + // tor-browser#42132: When using onion-grater (e.g., in Tails), we might + // not receive the CIRC BUILT event, as it is impossible to know whether + // that circuit will be the browser's at that point. So, we will have to + // poll circuits and wait for that to finish to be able to get the data. + try { + await this.#fetchCircuits(); + } catch { + return; + } } - try { - circuit = await circuit; - } catch { + + const primaryCircuit = this.#circuits.get(circuitId); + if (!primaryCircuit) { + logger.error( + `Seen a STREAM SENTCONNECT with circuit ${circuitId}, but Tor did not send information about it.` + ); return; } + + const circuitIds = [circuitId]; + if (primaryCircuit.confluxId) { + circuitIds.push( + ...this.#circuits + .entries() + .filter( + ([id, circ]) => + circ.confluxId === primaryCircuit.confluxId && id != circuitId + ) + .map(([id]) => id) + ); + } + const circuits = await Promise.all( + circuitIds.map(id => + Promise.all(this.#circuits.get(id).nodes.map(n => this.#getNodeInfo(n))) + ) + ); Services.obs.notifyObservers( { wrappedJSObject: { username, password, - circuit, + circuits, }, }, TorProviderTopics.CircuitCredentialsMatched View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/3848ba… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/3848ba… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] 2 commits: BB 44711: Hide unwanted setting controls.
by henry (@henry) 02 Mar '26

02 Mar '26
henry pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: baed8491 by Henry Wilkes at 2026-03-02T16:26:22+00:00 BB 44711: Hide unwanted setting controls. - - - - - 3848baf5 by Henry Wilkes at 2026-03-02T16:26:22+00:00 TB 44711: Hide unwanted setting controls. - - - - - 2 changed files: - browser/components/preferences/preferences.js - browser/components/preferences/preferences.xhtml Changes: ===================================== browser/components/preferences/preferences.js ===================================== @@ -242,11 +242,13 @@ const CONFIG_PANES = Object.freeze({ groupIds: ["containers"], }, dnsOverHttps: { + skip: true, // Skip DNS over HTTPS (DoH). tor-browser#41906. parent: "privacy", l10nId: "preferences-doh-header2", groupIds: ["dnsOverHttpsAdvanced"], }, managePayments: { + skip: true, parent: "privacy", l10nId: "autofill-payment-methods-manage-payments-title", groupIds: ["managePayments"], @@ -257,6 +259,7 @@ const CONFIG_PANES = Object.freeze({ groupIds: ["profilePane"], }, etp: { + skip: true, // Skip enhanced tracking protection. tor-browser#33848. parent: "privacy", l10nId: "preferences-etp-header", groupIds: ["etpBanner", "etpAdvanced"], @@ -267,11 +270,13 @@ const CONFIG_PANES = Object.freeze({ groupIds: ["etpReset", "etpCustomize"], }, manageAddresses: { + skip: true, parent: "privacy", l10nId: "autofill-addresses-manage-addresses-title", groupIds: ["manageAddresses"], }, translations: { + skip: true, // Skip translations. tor-browser#44710. parent: "general", l10nId: "settings-translations-subpage-header", groupIds: [ @@ -281,6 +286,7 @@ const CONFIG_PANES = Object.freeze({ iconSrc: "chrome://browser/skin/translations.svg", }, aiFeatures: { + skip: true, // Skip AI pane. tor-browser#44709. l10nId: "preferences-ai-features-header", groupIds: ["debugModelManagement", "aiFeatures", "aiWindowFeatures"], module: "chrome://browser/content/preferences/config/aiFeatures.mjs", @@ -346,6 +352,22 @@ function init_all() { register_module("paneContainers", gContainersPane); for (let [id, config] of Object.entries(CONFIG_PANES)) { + // Skip over configs we do not want, including all its children. + // See tor-browser#44711. + let skip = false; + let parentConfig = config; + while (parentConfig) { + skip = parentConfig.skip; + if (skip) { + break; + } + parentConfig = parentConfig.parent + ? CONFIG_PANES[parentConfig.parent] + : undefined; + } + if (skip) { + continue; + } SettingPaneManager.registerPane(id, config); } ===================================== browser/components/preferences/preferences.xhtml ===================================== @@ -175,8 +175,12 @@ <label class="category-name" flex="1" data-l10n-id="pane-sync-title3"></label> </richlistitem> + <!-- We skip registering the "ai" pane (aiFeatures.mjs), which means + - this richlistitem is non-functional and unmanaged. We have to + - manually hide it instead. See tor-browser#44709. --> <richlistitem id="category-ai-features" class="category" + hidden="true" value="paneAiFeatures" data-l10n-id="category-ai-features" data-l10n-attrs="tooltiptext" @@ -222,7 +226,9 @@ class="category hidden-category" value="paneProfiles"/> + <!-- Hide the translations sub-pane. tor-browser#44710. --> <richlistitem + hidden="true" class="category hidden-category" value="paneTranslations"/> View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/bfa83e… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/bfa83e… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-147.0a1-16.0-2] fixup! BB 40925: Implemented the Security Level component
by henry (@henry) 02 Mar '26

02 Mar '26
henry pushed to branch mullvad-browser-147.0a1-16.0-2 at The Tor Project / Applications / Mullvad Browser Commits: 232eea38 by Henry Wilkes at 2026-03-02T16:24:37+00:00 fixup! BB 40925: Implemented the Security Level component TB 44687: Expect javascript.options.asmjs to be `false` for all security levels. - - - - - 1 changed file: - toolkit/components/securitylevel/SecurityLevel.sys.mjs Changes: ===================================== toolkit/components/securitylevel/SecurityLevel.sys.mjs ===================================== @@ -271,7 +271,9 @@ const kSecuritySettings = { "gfx.font_rendering.graphite.enabled": [, false, false, false, true ], "gfx.font_rendering.opentype_svg.enabled": [, false, false, false, true ], "svg.disabled": [, true, false, false, false], - "javascript.options.asmjs": [, false, false, false, true ], + // Expect asmjs to be switched off for all levels. See tor-browser#44687. + // TODO: Stop tracking this preference entirely. See tor-browser#44712. + "javascript.options.asmjs": [, false, false, false, false], // tor-browser#44234, tor-browser#44242: this interferes with the correct // functioning of the browser. So, WASM is also handled by NoScript now. "javascript.options.wasm": [, true, true, true, true ], View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/232… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/232… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] fixup! BB 40925: Implemented the Security Level component
by henry (@henry) 02 Mar '26

02 Mar '26
henry pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: bfa83e89 by Henry Wilkes at 2026-03-02T13:15:00+00:00 fixup! BB 40925: Implemented the Security Level component TB 44687: Expect javascript.options.asmjs to be `false` for all security levels. - - - - - 1 changed file: - toolkit/components/securitylevel/SecurityLevel.sys.mjs Changes: ===================================== toolkit/components/securitylevel/SecurityLevel.sys.mjs ===================================== @@ -259,7 +259,9 @@ const kSecuritySettings = { "gfx.font_rendering.graphite.enabled": [, false, false, false, true ], "gfx.font_rendering.opentype_svg.enabled": [, false, false, false, true ], "svg.disabled": [, true, false, false, false], - "javascript.options.asmjs": [, false, false, false, true ], + // Expect asmjs to be switched off for all levels. See tor-browser#44687. + // TODO: Stop tracking this preference entirely. See tor-browser#44712. + "javascript.options.asmjs": [, false, false, false, false], // tor-browser#44234, tor-browser#44242: this interferes with the correct // functioning of the browser. So, WASM is also handled by NoScript now. "javascript.options.wasm": [, true, true, true, true ], View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/bfa83e8… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/bfa83e8… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser-build][main] 2 commits: Bug 41743: Make an error if gradle-dependencies-list is missing in input_files
by boklm (@boklm) 02 Mar '26

02 Mar '26
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 455d80c0 by Nicolas Vigier at 2026-02-27T12:23:35+01:00 Bug 41743: Make an error if gradle-dependencies-list is missing in input_files - - - - - 01344e2f by Nicolas Vigier at 2026-02-27T12:24:05+01:00 Bug 41743: Add missing gradle-dependencies-list in input_files - - - - - 2 changed files: - projects/geckoview/config - rbm.conf Changes: ===================================== projects/geckoview/config ===================================== @@ -98,6 +98,8 @@ steps: name: glean pkg_type: build enable: '[% !c("var/generate_gradle_dependencies_list") %]' + - filename: gradle-dependencies-list.txt + name: gradle-dependencies-list - filename: 'gradle-dependencies-[% c("var/gradle_dependencies_version") %]' name: gradle-dependencies exec: '[% INCLUDE "fetch-gradle-dependencies" %]' ===================================== rbm.conf ===================================== @@ -300,7 +300,7 @@ var: # be enabled in rbm.local.conf. dev_artifacts: 0 - gradle_dependencies_version: '[% c("input_files_ids_by_name/gradle-dependencies-list").split(":").1.substr(0, 15) %]' + gradle_dependencies_version: '[% c("input_files_ids_by_name/gradle-dependencies-list", { error_if_undef => 1 }).split(":").1.substr(0, 15) %]' targets: notarget: linux-x86_64 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/torbrowser-launcher][main] 3 commits: AppArmor: generalize rule
by asciiwolf (@asciiwolf) 28 Feb '26

28 Feb '26
asciiwolf pushed to branch main at The Tor Project / Applications / torbrowser-launcher Commits: 7ff7c438 by intrigeri at 2026-02-17T13:38:00+00:00 AppArmor: generalize rule The auto-generated app name varies across GNOME (and perhaps systemd) versions, let's simplify and allow read access to `cpu.max` everywhere relevant. - - - - - ab081741 by intrigeri at 2026-02-17T13:38:59+00:00 AppArmor: allow newly needed access Sadly, I could not figure out which code needs this. But it seems pretty harmless. - - - - - 4bfb2021 by asciiwolf at 2026-02-28T20:02:09+00:00 Merge branch 'apparmor-fixes-2026-02-edition' into 'main' AppArmor: fixes for recent Debian sid See merge request tpo/applications/torbrowser-launcher!43 - - - - - 1 changed file: - apparmor/torbrowser.Browser.firefox Changes: ===================================== apparmor/torbrowser.Browser.firefox ===================================== @@ -124,10 +124,11 @@ profile torbrowser_firefox @{torbrowser_firefox_executable} { @{sys}/devices/pci[0-9]*/**/irq r, /sys/devices/system/cpu/ r, /sys/devices/system/cpu/present r, + @{sys}/devices/system/cpu/cpu[0-9]*/cpu_capacity r, /sys/devices/system/node/ r, /sys/devices/system/node/node[0-9]*/meminfo r, /sys/fs/cgroup/cpu,cpuacct/{,user.slice/}cpu.cfs_quota_us r, - /sys/fs/cgroup/user.slice/user-[0-9]*.slice/user@[0-9]*.service/app.slice/app-gnome-torbrowser-[0-9]*.scope/cpu.max r, + @{sys}/fs/cgroup/**/cpu.max r, deny /sys/class/input/ r, deny /sys/devices/virtual/block/*/uevent r, View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/compar… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/torbrowser-launcher/-/compar… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-148.0a1-16.0-2] TB 31951: [Android] Disable Scroll to hide toolbar
by clairehurst (@clairehurst) 27 Feb '26

27 Feb '26
clairehurst pushed to branch tor-browser-148.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: f35a834a by clairehurst at 2026-02-26T19:58:28-07:00 TB 31951: [Android] Disable Scroll to hide toolbar - - - - - 4 changed files: - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/CustomizationFragment.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt - mobile/android/fenix/app/src/main/res/values/preference_keys.xml - mobile/android/fenix/app/src/main/res/xml/customization_preferences.xml Changes: ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/CustomizationFragment.kt ===================================== @@ -256,10 +256,6 @@ class CustomizationFragment : PreferenceFragmentCompat() { isChecked = context.settings().isPullToRefreshEnabledInBrowser onPreferenceChangeListener = SharedPreferenceUpdater() } - requirePreference<SwitchPreference>(R.string.pref_key_dynamic_toolbar).apply { - isChecked = context.settings().isDynamicToolbarEnabled - onPreferenceChangeListener = SharedPreferenceUpdater() - } requirePreference<SwitchPreference>(R.string.pref_key_swipe_toolbar_switch_tabs).apply { isChecked = context.settings().isSwipeToolbarToSwitchTabsEnabled isVisible = isSwipeToolbarToSwitchTabsVisible @@ -278,9 +274,6 @@ class CustomizationFragment : PreferenceFragmentCompat() { resources.getString(R.string.pref_key_website_pull_to_refresh) -> { PullToRefreshInBrowser.enabled.set(requireContext().settings().isPullToRefreshEnabledInBrowser) } - resources.getString(R.string.pref_key_dynamic_toolbar) -> { - CustomizationSettings.dynamicToolbar.set(requireContext().settings().isDynamicToolbarEnabled) - } } return super.onPreferenceTreeClick(preference) } ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt ===================================== @@ -2033,10 +2033,7 @@ class Settings( (isTabStripEligible(appContext) || FxNimbus.features.tabStrip.value().allowOnAllDevices), ) - var isDynamicToolbarEnabled by booleanPreference( - appContext.getPreferenceKey(R.string.pref_key_dynamic_toolbar), - default = true, - ) + var isDynamicToolbarEnabled = false var useNewDynamicToolbarBehaviour by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_use_scroll_data_for_dynamic_toolbar), ===================================== mobile/android/fenix/app/src/main/res/values/preference_keys.xml ===================================== @@ -203,7 +203,6 @@ <string name="pref_key_website_pull_to_refresh" translatable="false">pref_key_website_pull_to_refresh</string> <string name="pref_key_tab_strip_show" translatable="false">pref_key_tab_strip_show</string> <string name="pref_key_tab_strip_message" translatable="false">pref_key_tab_strip_message</string> - <string name="pref_key_dynamic_toolbar" translatable="false">pref_key_dynamic_toolbar</string> <string name="pref_key_use_scroll_data_for_dynamic_toolbar" translatable="false">pref_key_use_scroll_data_for_dynamic_toolbar</string> <string name="pref_key_swipe_toolbar_switch_tabs" translatable="false">pref_key_swipe_toolbar_switch_tabs</string> <string name="pref_key_swipe_toolbar_show_tabs" translatable="false">pref_key_swipe_toolbar_show_tabs</string> ===================================== mobile/android/fenix/app/src/main/res/xml/customization_preferences.xml ===================================== @@ -98,9 +98,6 @@ android:key="@string/pref_key_website_pull_to_refresh" android:title="@string/preference_gestures_website_pull_to_refresh" app:isPreferenceVisible="false" /> - <androidx.preference.SwitchPreference - android:key="@string/pref_key_dynamic_toolbar" - android:title="@string/preference_gestures_dynamic_toolbar" /> <androidx.preference.SwitchPreference android:key="@string/pref_key_swipe_toolbar_switch_tabs" android:title="@string/preference_gestures_swipe_toolbar_switch_tabs_2" /> View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/f35a834… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/f35a834… You're receiving this email because of your account on gitlab.torproject.org.
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • ...
  • 839
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.