[tbb-commits] [Git][tpo/applications/tor-browser][tor-browser-102.11.0esr-13.0-1] 13 commits: fixup! Firefox preference overrides.

Pier Angelo Vendrame (@pierov) git at gitlab.torproject.org
Mon May 29 08:33:45 UTC 2023



Pier Angelo Vendrame pushed to branch tor-browser-102.11.0esr-13.0-1 at The Tor Project / Applications / Tor Browser


Commits:
16c0f67a by hackademix at 2023-05-29T10:30:14+02:00
fixup! Firefox preference overrides.

- - - - -
073b7c85 by Pier Angelo Vendrame at 2023-05-29T10:30:31+02:00
fixup! Bug 41668: Tweaks to the Base Browser updater for Tor Browser

Bug 41776: Keep shipping the old fontconfig file until users have one

- - - - -
2ce0dfb9 by Pier Angelo Vendrame at 2023-05-29T10:30:31+02:00
fixup! Firefox preference overrides.

Bug 41732: Use font.system.whitelist also on Linux as a defense-in-depth

- - - - -
c3a40e82 by Pier Angelo Vendrame at 2023-05-29T10:30:32+02:00
fixup! Bug 41668: Tweaks to the Base Browser updater for Tor Browser

Bug 41776 (fix): Added some missing lines to the previous patch

- - - - -
d3a2bcd2 by cypherpunks1 at 2023-05-29T10:30:32+02:00
fixup! Bug 23247: Communicating security expectations for .onion

Bug 33298: Warn when submitting form data from http onion sites over an insecure connection

- - - - -
c8e4ee0b by cypherpunks1 at 2023-05-29T10:30:33+02:00
fixup! Bug 23247: Communicating security expectations for .onion

Bug 41785: Show http onion resources as secure in network monitor

- - - - -
02ad5977 by Henry Wilkes at 2023-05-29T10:30:33+02:00
fixup! Bug 40597: Implement TorSettings module

Bug 41608 - Ignore tor connection errors when tor connection is
cancelled by the user. This can happen if the bootstrap process is
cancelled late in the process.

Also remove unused cancelAutoBootstrapping.

- - - - -
6e08e478 by Henry Wilkes at 2023-05-29T10:30:33+02:00
fixup! Add TorStrings module for localization

Bug 41608 - Add new connection status strings.

- - - - -
df852978 by Henry Wilkes at 2023-05-29T10:30:34+02:00
fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection

Bug 41608 - Use the torconnect icon for the onion slash.

- - - - -
a71c563a by Henry Wilkes at 2023-05-29T10:30:34+02:00
fixup! Bug 21952: Implement Onion-Location

Bug 41608 - Use the same styling for ".onion available" urlbar button as
the tor-connect-urlbar-button. This also stops the button from
overflowing its container like before. Also move to after the bookmark
button.

- - - - -
b70efa00 by Henry Wilkes at 2023-05-29T10:33:17+02:00
amend! Bug 27476: Implement about:torconnect captive portal within Tor Browser

Bug 27476: Implement about:torconnect captive portal within Tor Browser

- implements new about:torconnect page as tor-launcher replacement
- adds new torconnect component to browser
- tor process management functionality remains implemented in tor-launcher through the TorProtocolService module
- adds warning/error box to about:preferences#tor when not connected to tor

Bug 40773: Update the about:torconnect frontend page to match additional UI flows.

Bug 41608: Add a toolbar status button and a urlbar "Connect" button.

- - - - -
8c2886c8 by Henry Wilkes at 2023-05-29T10:33:19+02:00
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser

Bug 41608 and 41526 - Use KeyboardEvent.repeat to block triggering newly
focused buttons in about:torconnect. The approach in tor-browser!607
prevented this by waiting for keyup, but keyup could still be triggered
by a key event initialized elsewhere. E.g. when pressing Enter to close
a modal dialog, the Enter's keyup event would be sent to the
about:torconnect page and trigger the focused button.

- - - - -
6c66708f by Dan Ballard at 2023-05-29T10:33:19+02:00
Bug 41749: Replace the onion-glyph with dedicated icon for onion services

- - - - -


30 changed files:

- browser/app/profile/001-base-profile.js
- browser/base/content/browser.js
- browser/base/content/browser.xhtml
- browser/base/content/navigator-toolbox.inc.xhtml
- browser/components/onionservices/content/onionlocation-urlbar.inc.xhtml
- browser/components/onionservices/content/onionlocation.css
- browser/components/torconnect/content/aboutTorConnect.js
- − browser/components/torconnect/content/onion-slash.svg
- − browser/components/torconnect/content/torBootstrapUrlbar.js
- + browser/components/torconnect/content/torConnectTitlebarStatus.css
- + browser/components/torconnect/content/torConnectTitlebarStatus.js
- + browser/components/torconnect/content/torConnectUrlbarButton.js
- − browser/components/torconnect/content/torconnect-urlbar.css
- − browser/components/torconnect/content/torconnect-urlbar.inc.xhtml
- browser/components/torconnect/jar.mn
- browser/components/torpreferences/content/torPreferences.css
- browser/modules/TorConnect.jsm
- browser/modules/TorStrings.jsm
- browser/themes/shared/browser-shared.css
- browser/themes/shared/identity-block/onion-slash.svg
- browser/themes/shared/identity-block/onion-warning.svg
- browser/themes/shared/identity-block/onion.svg
- browser/themes/shared/jar.inc.mn
- + browser/themes/shared/tor-urlbar-button.css
- devtools/shared/webconsole/network-helper.js
- dom/html/HTMLFormElement.cpp
- toolkit/torbutton/chrome/locale/en-US/torConnect.properties
- tools/update-packaging/common.sh
- tools/update-packaging/make_full_update.sh
- tools/update-packaging/make_incremental_update.sh


Changes:

=====================================
browser/app/profile/001-base-profile.js
=====================================
@@ -48,6 +48,9 @@ pref("security.nocertdb", true);
 pref("browser.download.useDownloadDir", false);
 pref("browser.download.manager.addToRecentDocs", false);
 
+// Prevent download stuffing / DOS (tor-browser#41764)
+pref("browser.download.enable_spam_prevention", true);
+
 // Misc privacy: Disk
 pref("signon.rememberSignons", false);
 pref("browser.formfill.enable", false);
@@ -697,6 +700,8 @@ pref("font.name-list.monospace.x-unicode", "Consolas, Noto Sans Balinese, Noto S
 #endif
 
 #ifdef XP_LINUX
+pref("font.system.whitelist", "Arimo, Cousine, Noto Naskh Arabic, Noto Sans Adlam, Noto Sans Armenian, 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 Hebrew, Noto Sans JP, Noto Sans Javanese, Noto Sans KR, Noto Sans Kannada, Noto Sans Kayah Li, Noto Sans Khmer, 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 Myanmar, Noto Sans NKo, Noto Sans New Tai Lue, Noto Sans Newa, 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 SC, 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, Noto Sans Symbols2, Noto Sans Syriac, Noto Sans TC, 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 Thai, Noto Sans Tifinagh, Noto Sans Tifinagh APT, Noto Sans Tifinagh Adrar, Noto Sans Tifinagh Agraw Imazighen, Noto Sans Tifinagh Ahaggar, Noto Sans Tifinagh Air, Noto Sans Tifinagh Azawagh, Noto Sans Tifinagh Ghat, Noto Sans Tifinagh Hawad, 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 Armenian, 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 Hebrew, Noto Serif Hmong Nyiakeng, Noto Serif Kannada, Noto Serif Khmer, Noto Serif Khojki, Noto Serif Lao, Noto Serif Malayalam, Noto Serif Myanmar, Noto Serif Sinhala, Noto Serif Tamil, Noto Serif Telugu, Noto Serif Thai, Noto Serif Tibetan, Noto Serif Yezidi, STIX Math, Tinos, Twemoji Mozilla");
+
 // Arabic
 pref("font.name-list.serif.ar", "Noto Naskh Arabic, Tinos");
 pref("font.name-list.sans-serif.ar", "Noto Naskh Arabic, Arimo");


=====================================
browser/base/content/browser.js
=====================================
@@ -80,6 +80,8 @@ XPCOMUtils.defineLazyModuleGetters(this, {
   TabCrashHandler: "resource:///modules/ContentCrashHandlers.jsm",
   TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.jsm",
   TorConnect: "resource:///modules/TorConnect.jsm",
+  TorConnectState: "resource:///modules/TorConnect.jsm",
+  TorConnectTopics: "resource:///modules/TorConnect.jsm",
   TorDomainIsolator: "resource://gre/modules/TorDomainIsolator.jsm",
   Translation: "resource:///modules/translation/TranslationParent.jsm",
   UITour: "resource:///modules/UITour.jsm",
@@ -270,6 +272,16 @@ XPCOMUtils.defineLazyScriptGetter(
   "gSharedTabWarning",
   "chrome://browser/content/browser-webrtc.js"
 );
+XPCOMUtils.defineLazyScriptGetter(
+  this,
+  ["gTorConnectUrlbarButton"],
+  "chrome://browser/content/torconnect/torConnectUrlbarButton.js"
+);
+XPCOMUtils.defineLazyScriptGetter(
+  this,
+  ["gTorConnectTitlebarStatus"],
+  "chrome://browser/content/torconnect/torConnectTitlebarStatus.js"
+);
 XPCOMUtils.defineLazyScriptGetter(
   this,
   ["gTorCircuitPanel"],
@@ -1809,6 +1821,9 @@ var gBrowserInit = {
     // Init the OnionAuthPrompt
     OnionAuthPrompt.init();
 
+    gTorConnectUrlbarButton.init();
+    gTorConnectTitlebarStatus.init();
+
     gTorCircuitPanel.init();
 
     // Certain kinds of automigration rely on this notification to complete
@@ -1896,8 +1911,6 @@ var gBrowserInit = {
     }
 
     this._loadHandled = true;
-
-    TorBootstrapUrlbar.init();
   },
 
   _cancelDelayedStartup() {
@@ -2555,9 +2568,10 @@ var gBrowserInit = {
 
     OnionAuthPrompt.uninit();
 
-    gTorCircuitPanel.uninit();
+    gTorConnectUrlbarButton.uninit();
+    gTorConnectTitlebarStatus.uninit();
 
-    TorBootstrapUrlbar.uninit();
+    gTorCircuitPanel.uninit();
 
     gAccessibilityServiceIndicator.uninit();
 


=====================================
browser/base/content/browser.xhtml
=====================================
@@ -37,6 +37,7 @@
 <?xml-stylesheet href="chrome://browser/skin/places/editBookmark.css" type="text/css"?>
 <?xml-stylesheet href="chrome://browser/content/onionservices/onionservices.css" type="text/css"?>
 <?xml-stylesheet href="chrome://browser/content/torCircuitPanel.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/content/torconnect/torConnectTitlebarStatus.css" type="text/css"?>
 
 <!DOCTYPE window [
 #include browser-doctype.inc
@@ -123,7 +124,6 @@
   Services.scriptloader.loadSubScript("chrome://browser/content/search/searchbar.js", this);
   Services.scriptloader.loadSubScript("chrome://browser/content/languageNotification.js", this);
   Services.scriptloader.loadSubScript("chrome://torbutton/content/torbutton.js", this);
-  Services.scriptloader.loadSubScript("chrome://browser/content/torconnect/torBootstrapUrlbar.js", this);
 
   window.onload = gBrowserInit.onLoad.bind(gBrowserInit);
   window.onunload = gBrowserInit.onUnload.bind(gBrowserInit);


=====================================
browser/base/content/navigator-toolbox.inc.xhtml
=====================================
@@ -93,6 +93,11 @@
               aria-live="polite"/>
       <hbox class="private-browsing-indicator"/>
 
+      <html:div id="tor-connect-titlebar-status" role="status">
+        <html:img alt="" id="tor-connect-titlebar-status-icon" />
+        <html:span id="tor-connect-titlebar-status-label"></html:span>
+      </html:div>
+
 #include titlebar-items.inc.xhtml
 
     </toolbar>
@@ -335,7 +340,6 @@
                    data-l10n-id="urlbar-go-button"/>
             <hbox id="page-action-buttons" context="pageActionContextMenu">
               <toolbartabstop/>
-#include ../../components/torconnect/content/torconnect-urlbar.inc.xhtml
               <hbox id="contextual-feature-recommendation" role="button" hidden="true">
                 <hbox id="cfr-label-container">
                   <label id="cfr-label"/>
@@ -363,9 +367,6 @@
                      onclick="FullZoom.reset(); FullZoom.resetScalingZoom();"
                      tooltip="dynamic-shortcut-tooltip"
                      hidden="true"/>
-
-#include ../../components/onionservices/content/onionlocation-urlbar.inc.xhtml
-
               <hbox id="pageActionButton"
                     class="urlbar-page-action"
                     role="button"
@@ -383,6 +384,15 @@
                        class="urlbar-icon"/>
               </hbox>
             </hbox>
+
+            <hbox id="tor-connect-urlbar-button"
+                  role="button"
+                  class="tor-urlbar-button"
+                  hidden="true">
+              <label id="tor-connect-urlbar-button-label"/>
+            </hbox>
+
+#include ../../components/onionservices/content/onionlocation-urlbar.inc.xhtml
           </hbox>
         </hbox>
         <toolbartabstop/>


=====================================
browser/components/onionservices/content/onionlocation-urlbar.inc.xhtml
=====================================
@@ -1,10 +1,10 @@
 # Copyright (c) 2020, The Tor Project, Inc.
 
 <hbox id="onion-location-box"
-      class="urlbar-icon-wrapper urlbar-page-action"
+      class="tor-urlbar-button"
       role="button"
       hidden="true"
       onclick="OnionLocationParent.buttonClick(event);">
   <image id="onion-location-button" role="presentation"/>
-  <hbox id="onion-label-container"><label id="onion-label"/></hbox>
+  <label id="onion-label"/>
 </hbox>


=====================================
browser/components/onionservices/content/onionlocation.css
=====================================
@@ -1,44 +1,9 @@
 /* Copyright (c) 2020, The Tor Project, Inc. */
 
-#onion-location-box {
-  background-color: var(--purple-60);
-  -moz-context-properties: fill;
-  fill: white;
-}
-
-#onion-location-box:hover {
-  background-color: var(--purple-70);
-}
-
-#onion-location-box:active {
-  background-color: var(--purple-80);
-}
-
- at media (prefers-color-scheme: dark) {
-  #onion-location-box {
-    background-color: var(--purple-50);
-  }
-
-  #onion-location-box:hover {
-    background-color: var(--purple-60);
-  }
-
-  #onion-location-box:active {
-    background-color: var(--purple-70);
-  }
-}
-
 #onion-location-button {
   list-style-image: url(chrome://browser/content/onionservices/onionlocation.svg);
-  padding-inline-start: 0.5em;
-}
-
-label#onion-label {
-  margin: 0;
-  padding-block: 0;
-  padding-inline: 0.5em;
-  color: white;
-  font-weight: normal;
+  -moz-context-properties: fill;
+  fill: currentColor;
 }
 
 .onionlocation-notification-icon {


=====================================
browser/components/torconnect/content/aboutTorConnect.js
=====================================
@@ -769,26 +769,29 @@ class AboutTorConnect {
       }
     });
 
-    // Delay the "Enter" activation of the given button from "keydown" to
-    // "keyup".
+    // Prevent repeat triggering on keydown when the Enter key is held down.
     //
-    // Without this, holding down Enter will continue to trigger the button
-    // until the user stops holding. This means that a user can accidentally
-    // re-trigger a button several times. This is particularly bad when the
-    // focus gets moved to a new button, and the new button can get triggered
-    // immediately. E.g. when the "Connect" button is triggered it disappears
-    // and focus moves to the "Cancel" button.
+    // Without this, holding down Enter will continue to trigger the button's
+    // click event until the user stops holding. This means that a user can
+    // accidentally re-trigger a button several times. And if focus moves to a
+    // new button it can also get triggered, despite not receiving the initial
+    // keydown event.
+    //
+    // E.g. If the user presses down Enter on the "Connect" button it will
+    // trigger and focus will move to the "Cancel" button. This should prevent
+    // the user accidentally triggering the "Cancel" button if they hold down
+    // Enter for a little bit too long.
     for (const button of document.body.querySelectorAll("button")) {
       button.addEventListener("keydown", event => {
-        if (event.key === "Enter") {
+        // If the keydown is a repeating Enter event, ignore it.
+        // NOTE: If firefox uses wayland display (rather than xwayland), the
+        // "repeat" event is always "false" so this will not work.
+        // See bugzilla bug 1784438. Also see bugzilla bug 1594003.
+        // Currently tor browser uses xwayland by default on linux.
+        if (event.key === "Enter" && event.repeat) {
           event.preventDefault();
         }
       });
-      button.addEventListener("keyup", event => {
-        if (event.key === "Enter") {
-          button.click();
-        }
-      });
     }
   }
 


=====================================
browser/components/torconnect/content/onion-slash.svg deleted
=====================================
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg viewBox="0 0 16 16" width="16" height="16" xmlns="http://www.w3.org/2000/svg">
-  <path d="m14.1161 15.6245c-.0821.0001-.1634-.016-.2393-.0474-.0758-.0314-.1447-.0775-.2027-.1356l-12.749984-12.749c-.109266-.11882-.168406-.27526-.165071-.43666.003335-.16139.068886-.31525.182967-.42946.114078-.11421.267868-.17994.429258-.18345.16139-.00352.3179.05544.43685.16457l12.74998 12.75c.1168.1176.1824.2767.1824.4425s-.0656.3249-.1824.4425c-.058.058-.1269.1039-.2028.1352-.0759.0312-.1571.0471-.2392.0468z" fill-opacity="context-fill-opacity" fill="#ff0039" />
-  <path d="m 8,0.5000002 c -1.61963,0 -3.1197431,0.5137987 -4.3457031,1.3867188 l 0.84375,0.8417968 0.7792969,0.78125 0.8613281,0.8613282 0.8164062,0.8164062 0.9863281,0.984375 h 0.058594 c 1.00965,0 1.828125,0.818485 1.828125,1.828125 0,0.01968 6.2e-4,0.039074 0,0.058594 L 10.8125,9.0449221 C 10.9334,8.7195921 11,8.3674002 11,8.0000002 c 0,-1.65685 -1.34314,-3 -3,-3 v -1.078125 c 2.25231,0 4.078125,1.825845 4.078125,4.078125 0,0.67051 -0.162519,1.3033281 -0.449219,1.8613281 l 0.861328,0.8613277 C 12.972434,9.9290067 13.25,8.9965102 13.25,8.0000002 c 0,-2.89949 -2.35049,-5.25 -5.25,-5.25 v -1.078125 c 3.4949,0 6.328125,2.833195 6.328125,6.328125 0,1.29533 -0.388841,2.4990528 -1.056641,3.5019528 l 0.841797,0.84375 C 14.986181,11.119703 15.5,9.6196302 15.5,8.0000002 c 0,-4.14214 -3.3579,-7.5 -7.5,-7.5 z m -6.1113281,3.15625 C 1.0154872,4.8821451 0.5,6.3803304 0.5,8.0000002 0.5,12.1421 3.85786,15.5 8,15.5 c 1.6198027,0 3.117896,-0.515441 4.34375,-1.388672 L 11.501953,13.269531 C 10.498787,13.937828 9.295838,14.328125 8,14.328125 V 13.25 c 0.9967306,0 1.9287093,-0.277621 2.722656,-0.759766 L 9.859375,11.626953 C 9.3016226,11.913918 8.6705338,12.078125 8,12.078125 V 11 C 8.3664751,11 8.716425,10.93088 9.0410156,10.810547 6.6639891,8.4300416 4.2743195,6.0418993 1.8886719,3.6562502 Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
-</svg>


=====================================
browser/components/torconnect/content/torBootstrapUrlbar.js deleted
=====================================
@@ -1,95 +0,0 @@
-// Copyright (c) 2021, The Tor Project, Inc.
-
-"use strict";
-
-const { TorConnect, TorConnectTopics, TorConnectState } = ChromeUtils.import(
-  "resource:///modules/TorConnect.jsm"
-);
-const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
-
-/* globals browser, gURLBar, Services */
-
-var TorBootstrapUrlbar = {
-  selectors: Object.freeze({
-    torConnect: {
-      box: "hbox#torconnect-box",
-      label: "label#torconnect-label",
-    },
-  }),
-
-  elements: null,
-
-  updateTorConnectBox(state) {
-    switch (state) {
-      case TorConnectState.Initial:
-      case TorConnectState.Configuring:
-      case TorConnectState.AutoConfiguring:
-      case TorConnectState.Error:
-      case TorConnectState.FatalError: {
-        this.elements.torConnectBox.removeAttribute("hidden");
-        this.elements.torConnectLabel.textContent =
-          TorStrings.torConnect.torNotConnectedConcise;
-        this.elements.inputContainer.setAttribute("torconnect", "offline");
-        break;
-      }
-      case TorConnectState.Bootstrapping: {
-        this.elements.torConnectBox.removeAttribute("hidden");
-        this.elements.torConnectLabel.textContent =
-          TorStrings.torConnect.torConnectingConcise;
-        this.elements.inputContainer.setAttribute("torconnect", "connecting");
-        break;
-      }
-      case TorConnectState.Bootstrapped: {
-        this.elements.torConnectBox.removeAttribute("hidden");
-        this.elements.torConnectLabel.textContent =
-          TorStrings.torConnect.torConnectedConcise;
-        this.elements.inputContainer.setAttribute("torconnect", "connected");
-        // hide torconnect box after 5 seconds
-        setTimeout(() => {
-          this.elements.torConnectBox.setAttribute("hidden", "true");
-        }, 5000);
-        break;
-      }
-      case TorConnectState.Disabled: {
-        this.elements.torConnectBox.setAttribute("hidden", "true");
-        break;
-      }
-      default:
-        break;
-    }
-  },
-
-  observe(aSubject, aTopic, aData) {
-    if (aTopic === TorConnectTopics.StateChange) {
-      const obj = aSubject?.wrappedJSObject;
-      this.updateTorConnectBox(obj?.state);
-    }
-  },
-
-  init() {
-    if (TorConnect.shouldShowTorConnect) {
-      // browser isn't populated until init
-      this.elements = Object.freeze({
-        torConnectBox: browser.ownerGlobal.document.querySelector(
-          this.selectors.torConnect.box
-        ),
-        torConnectLabel: browser.ownerGlobal.document.querySelector(
-          this.selectors.torConnect.label
-        ),
-        inputContainer: gURLBar._inputContainer,
-      });
-      this.elements.torConnectBox.addEventListener("click", () => {
-        TorConnect.openTorConnect();
-      });
-      Services.obs.addObserver(this, TorConnectTopics.StateChange);
-      this.observing = true;
-      this.updateTorConnectBox(TorConnect.state);
-    }
-  },
-
-  uninit() {
-    if (this.observing) {
-      Services.obs.removeObserver(this, TorConnectTopics.StateChange);
-    }
-  },
-};


=====================================
browser/components/torconnect/content/torConnectTitlebarStatus.css
=====================================
@@ -0,0 +1,38 @@
+#tor-connect-titlebar-status:not([hidden]) {
+  display: flex;
+  align-items: center;
+  /* Want same as #private-browsing-indicator-with-label */
+  margin-inline: 7px;
+}
+
+#tor-connect-titlebar-status-label {
+  margin-inline: 6px;
+  white-space: nowrap;
+}
+
+#tor-connect-titlebar-status-icon {
+  -moz-context-properties: fill;
+  fill: currentColor;
+  width: 16px;
+  height: 16px;
+}
+
+#tor-connect-titlebar-status-icon.tor-connect-status-connected {
+  fill: var(--purple-60);
+}
+
+ at media (prefers-color-scheme: dark) {
+  #tor-connect-titlebar-status-icon.tor-connect-status-connected {
+    fill: var(--purple-30);
+  }
+}
+
+#tor-connect-titlebar-status-icon.tor-connect-status-potentially-blocked {
+  fill: #c50042;
+}
+
+ at media (prefers-color-scheme: dark) {
+  #tor-connect-titlebar-status-icon.tor-connect-status-potentially-blocked {
+    fill: #ff9aa2;
+  }
+}


=====================================
browser/components/torconnect/content/torConnectTitlebarStatus.js
=====================================
@@ -0,0 +1,115 @@
+/* eslint-env mozilla/browser-window */
+
+/**
+ * A TorConnect status shown in the application title bar.
+ */
+var gTorConnectTitlebarStatus = {
+  /**
+   * The status element in the title bar.
+   *
+   * @type {Element}
+   */
+  node: null,
+  /**
+   * The status label.
+   *
+   * @type {Element}
+   */
+  label: null,
+  /**
+   * The status icon.
+   *
+   * @type {Element}
+   */
+  icon: null,
+
+  /**
+   * Initialize the component.
+   */
+  init() {
+    const { TorStrings } = ChromeUtils.import(
+      "resource:///modules/TorStrings.jsm"
+    );
+
+    this._strings = TorStrings.torConnect;
+
+    this.node = document.getElementById("tor-connect-titlebar-status");
+    this.icon = document.getElementById("tor-connect-titlebar-status-icon");
+    this.label = document.getElementById("tor-connect-titlebar-status-label");
+    // The title also acts as an accessible name for the role="status".
+    this.node.setAttribute("title", this._strings.titlebarStatusName);
+
+    this._observeTopic = TorConnectTopics.StateChange;
+    this._stateListener = {
+      observe: (subject, topic, data) => {
+        if (topic !== this._observeTopic) {
+          return;
+        }
+        this._torConnectStateChanged();
+      },
+    };
+    Services.obs.addObserver(this._stateListener, this._observeTopic);
+
+    this._torConnectStateChanged();
+  },
+
+  /**
+   * De-initialize the component.
+   */
+  deinit() {
+    Services.obs.removeObserver(this._stateListener, this._observeTopic);
+  },
+
+  /**
+   * Callback for when the TorConnect state changes.
+   */
+  _torConnectStateChanged() {
+    let textId;
+    let connected = false;
+    let potentiallyBlocked = false;
+    switch (TorConnect.state) {
+      case TorConnectState.Disabled:
+        // Hide immediately.
+        this.node.hidden = true;
+        return;
+      case TorConnectState.Bootstrapped:
+        this._startHiding();
+        textId = "titlebarStatusConnected";
+        connected = true;
+        break;
+      case TorConnectState.Bootstrapping:
+      case TorConnectState.AutoBootstrapping:
+        textId = "titlebarStatusConnecting";
+        break;
+      default:
+        if (TorConnect.potentiallyBlocked) {
+          textId = "titlebarStatusPotentiallyBlocked";
+          potentiallyBlocked = true;
+        } else {
+          textId = "titlebarStatusNotConnected";
+        }
+        break;
+    }
+    this.label.textContent = this._strings[textId];
+    this.icon.setAttribute(
+      "src",
+      connected
+        ? "chrome://browser/content/torconnect/onion.svg"
+        : "chrome://browser/content/torconnect/onion-slash-fillable.svg"
+    );
+    this.icon.classList.toggle("tor-connect-status-connected", connected);
+    this.icon.classList.toggle(
+      "tor-connect-status-potentially-blocked",
+      potentiallyBlocked
+    );
+  },
+
+  /**
+   * Mark the component to be hidden after some delay.
+   */
+  _startHiding() {
+    setTimeout(() => {
+      this.node.hidden = true;
+    }, 5000);
+  },
+};


=====================================
browser/components/torconnect/content/torConnectUrlbarButton.js
=====================================
@@ -0,0 +1,155 @@
+/* eslint-env mozilla/browser-window */
+
+/**
+ * A "Connect" button shown in the urlbar when not connected to tor and in tabs
+ * other than about:torconnect.
+ */
+var gTorConnectUrlbarButton = {
+  /**
+   * The urlbar button node.
+   *
+   * @type {Element}
+   */
+  button: null,
+  /**
+   * Whether we are active.
+   *
+   * @type {boolean}
+   */
+  _isActive: false,
+  /**
+   * Whether we are in the "about:torconnect" tab.
+   *
+   * @type {boolean}
+   */
+  // We init to "true" so that the button can only appear after the first page
+  // load.
+  _inAboutTorConnectTab: true,
+
+  /**
+   * Initialize the button.
+   */
+  init() {
+    if (this._isActive) {
+      return;
+    }
+    this._isActive = true;
+
+    const { TorStrings } = ChromeUtils.import(
+      "resource:///modules/TorStrings.jsm"
+    );
+
+    this.button = document.getElementById("tor-connect-urlbar-button");
+    document.getElementById("tor-connect-urlbar-button-label").value =
+      TorStrings.torConnect.torConnectButton;
+    this.button.addEventListener("click", event => {
+      if (event.button !== 0) {
+        return;
+      }
+      this.connect();
+    });
+    this.button.addEventListener("keydown", event => {
+      if (event.key !== "Enter" && event.key !== " ") {
+        return;
+      }
+      this.connect();
+    });
+
+    this._observeTopic = TorConnectTopics.StateChange;
+    this._stateListener = {
+      observe: (subject, topic, data) => {
+        if (topic !== this._observeTopic) {
+          return;
+        }
+        this._torConnectStateChanged();
+      },
+    };
+    Services.obs.addObserver(this._stateListener, this._observeTopic);
+
+    this._locationListener = {
+      onLocationChange: (webProgress, request, locationURI, flags) => {
+        if (
+          webProgress.isTopLevel &&
+          !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT)
+        ) {
+          this._inAboutTorConnectTab = gBrowser.selectedBrowser.currentURI?.spec.startsWith(
+            "about:torconnect"
+          );
+          this._updateButtonVisibility();
+        }
+      },
+    };
+    // Notified of new locations for the currently selected browser (tab) *and*
+    // switching selected browser.
+    gBrowser.addProgressListener(this._locationListener);
+
+    this._torConnectStateChanged();
+  },
+
+  /**
+   * Deactivate and de-initialize the button.
+   */
+  deinit() {
+    if (!this._isActive) {
+      return;
+    }
+    this._isActive = false;
+
+    Services.obs.removeObserver(this._stateListener, this._observeTopic);
+    gBrowser.removeProgressListener(this._locationListener);
+    this._updateButtonVisibility();
+  },
+
+  /**
+   * Begin the tor connection bootstrapping process.
+   */
+  connect() {
+    TorConnect.openTorConnect({ beginBootstrap: true });
+  },
+
+  /**
+   * Callback for when the TorConnect state changes.
+   */
+  _torConnectStateChanged() {
+    if (
+      TorConnect.state === TorConnectState.Bootstrapped ||
+      TorConnect.state === TorConnectState.Disabled
+    ) {
+      this.deinit();
+      return;
+    }
+    this._updateButtonVisibility();
+  },
+
+  /**
+   * Callback when the TorConnect state, current browser location, or activation
+   * state changes.
+   */
+  _updateButtonVisibility() {
+    if (!this.button) {
+      return;
+    }
+    // NOTE: We do not manage focus when hiding the button. We only expect to
+    // move from "not hidden" to "hidden" when:
+    // + switching tabs to "about:torconnect", or
+    // + starting bootstrapping.
+    //
+    // When switching tabs, the normal tab switching logic will eventually move
+    // focus to the new tab or url bar, so whilst the focus may be lost
+    // temporarily when we hide the button, it will be re-established quickly on
+    // tab switch.
+    //
+    // And we don't expect bootstrapping to start whilst outside of the
+    // "about:torconnect", and the automatic bootstrapping should only trigger
+    // at the initial start.
+    this.button.hidden =
+      !this._isActive ||
+      this._inAboutTorConnectTab ||
+      !TorConnect.enabled ||
+      !TorConnect.canBeginBootstrap;
+    this.button.classList.toggle(
+      "tor-urlbar-button-plain",
+      TorConnect.potentiallyBlocked
+    );
+  },
+};


=====================================
browser/components/torconnect/content/torconnect-urlbar.css deleted
=====================================
@@ -1,37 +0,0 @@
-/*
-    ensure our torconnect button is always visible (same rule as for the bookmark button)
-*/
-label#torconnect-label {
-    margin: 0;
-    opacity: 0.6;
-    padding: 0 0.5em;
-}
-
-hbox.urlbar-page-action#torconnect-box {
-    display: -moz-inline-box!important;
-}
-
-/* hide when hidden attribute is set */
-hbox.urlbar-page-action#torconnect-box[hidden="true"],
-/* hide when user is typing in URL bar */
-#urlbar[usertyping] > #urlbar-input-container > #page-action-buttons > #torconnect-box {
-    display: none!important;
-}
-
-/* hide urlbar's placeholder text when not connectd to tor */
-hbox#urlbar-input-container[torconnect="offline"] input#urlbar-input::placeholder,
-hbox#urlbar-input-container[torconnect="connecting"] input#urlbar-input::placeholder {
-    opacity: 0;
-}
-
-/* hide search suggestions when not connected to tor */
-hbox#urlbar-input-container[torconnect="offline"] + vbox.urlbarView,
-hbox#urlbar-input-container[torconnect="connecting"] + vbox.urlbarView {
-    display: none!important;
-}
-
-/* hide search icon when we are not connected to tor */
-hbox#urlbar-input-container[torconnect="offline"] > #identity-box[pageproxystate="invalid"] > #identity-icon,
-hbox#urlbar-input-container[torconnect="connecting"] > #identity-box[pageproxystate="invalid"] > #identity-icon {
-    display: none!important;
-}


=====================================
browser/components/torconnect/content/torconnect-urlbar.inc.xhtml deleted
=====================================
@@ -1,11 +0,0 @@
-# Copyright (c) 2021, The Tor Project, Inc.
-
-<hbox id="torconnect-box"
-      class="urlbar-icon-wrapper urlbar-page-action"
-      role="status"
-      align="center"
-      hidden="true">
-    <hbox id="torconnect-container">
-        <label id="torconnect-label"/>
-    </hbox>
-</hbox>
\ No newline at end of file


=====================================
browser/components/torconnect/jar.mn
=====================================
@@ -1,5 +1,7 @@
 browser.jar:
-    content/browser/torconnect/torBootstrapUrlbar.js               (content/torBootstrapUrlbar.js)
+    content/browser/torconnect/torConnectUrlbarButton.js           (content/torConnectUrlbarButton.js)
+    content/browser/torconnect/torConnectTitlebarStatus.js         (content/torConnectTitlebarStatus.js)
+    content/browser/torconnect/torConnectTitlebarStatus.css        (content/torConnectTitlebarStatus.css)
     content/browser/torconnect/aboutTorConnect.css                 (content/aboutTorConnect.css)
 *   content/browser/torconnect/aboutTorConnect.xhtml               (content/aboutTorConnect.xhtml)
     content/browser/torconnect/aboutTorConnect.js                  (content/aboutTorConnect.js)
@@ -8,6 +10,4 @@ browser.jar:
     content/browser/torconnect/connection-failure.svg              (content/connection-failure.svg)
     content/browser/torconnect/connection-location.svg             (content/connection-location.svg)
     content/browser/torconnect/onion.svg                           (content/onion.svg)
-    content/browser/torconnect/onion-slash.svg                     (content/onion-slash.svg)
     content/browser/torconnect/onion-slash-fillable.svg            (content/onion-slash-fillable.svg)
-    skin/classic/browser/torconnect-urlbar.css                     (content/torconnect-urlbar.css)


=====================================
browser/components/torpreferences/content/torPreferences.css
=====================================
@@ -58,7 +58,7 @@ html:dir(rtl) input[type="checkbox"].toggle-button::before {
 
 #torPreferences-connectMessageBox.error #torPreferences-connectMessageBox-icon
 {
-  mask: url("chrome://browser/skin/onion-slash.svg");
+  mask: url("chrome://browser/content/torconnect/onion-slash-fillable.svg");
   background-color: white;
 }
 


=====================================
browser/modules/TorConnect.jsm
=====================================
@@ -99,7 +99,7 @@ const TorConnectState = Object.freeze({
   └─┼─────▶ │                                                          │  │
     │       └──────────────────────────────────────────────────────────┘  │
     │         │                        ▲                                  │
-    │         │ beginAutoBootstrap()   │ cancelAutoBootstrap()            │
+    │         │ beginAutoBootstrap()   │ cancelBootstrap()                │
     │         ▼                        │                                  │
     │       ┌───────────────────────┐  │                                  │
     └────── │   AutoBootstrapping   │ ─┘                                  │
@@ -464,6 +464,7 @@ const TorConnect = (() => {
 
               const tbr = new TorBootstrapRequest();
               const internetTest = new InternetTest();
+              let cancelled = false;
 
               let bootstrapError = "";
               let bootstrapErrorDetails = "";
@@ -506,6 +507,7 @@ const TorConnect = (() => {
               this.on_transition = async nextState => {
                 if (nextState === TorConnectState.Configuring) {
                   // stop bootstrap process if user cancelled
+                  cancelled = true;
                   internetTest.cancel();
                   await tbr.cancel();
                 }
@@ -520,6 +522,19 @@ const TorConnect = (() => {
                 TorConnect._changeState(TorConnectState.Bootstrapped);
               };
               tbr.onbootstraperror = (message, details) => {
+                if (cancelled) {
+                  // We ignore this error since it occurred after cancelling (by
+                  // the user). We assume the error is just a side effect of the
+                  // cancelling.
+                  // E.g. If the cancelling is triggered late in the process, we
+                  // get "Building circuits: Establishing a Tor circuit failed".
+                  // TODO: Maybe move this logic deeper in the process to know
+                  // when to filter out such errors triggered by cancelling.
+                  console.log(
+                    `TorConnect: Post-cancel error => ${message}; ${details}`
+                  );
+                  return;
+                }
                 // We have to wait for the Internet test to finish before sending the bootstrap error
                 bootstrapError = message;
                 bootstrapErrorDetails = details;
@@ -1023,11 +1038,6 @@ const TorConnect = (() => {
       this._changeState(TorConnectState.AutoBootstrapping, countryCode);
     },
 
-    cancelAutoBootstrap() {
-      console.log("TorConnect: cancelAutoBootstrap()");
-      this._changeState(TorConnectState.Configuring);
-    },
-
     /*
         Further external commands and helper methods
         */


=====================================
browser/modules/TorStrings.jsm
=====================================
@@ -207,10 +207,6 @@ const Loader = {
 
       torConnecting: "Establishing a Connection",
 
-      torNotConnectedConcise: "Not Connected",
-
-      torConnectingConcise: "Connecting…",
-
       tryingAgain: "Trying again…",
 
       noInternet: "Tor Browser couldn’t reach the Internet",
@@ -250,8 +246,6 @@ const Loader = {
 
       torConnected: "Connected to the Tor network",
 
-      torConnectedConcise: "Connected",
-
       tryAgain: "Try Again",
 
       // tor connect strings for message box in about:preferences#connection
@@ -275,6 +269,13 @@ const Loader = {
       autoBootstrappingAllFailed: "None of the configurations we tried worked",
       cannotDetermineCountry: "Unable to determine user country",
       noSettingsForCountry: "No settings available for your location",
+
+      // Titlebar status.
+      titlebarStatusName: "Tor connection",
+      titlebarStatusNotConnected: "Not connected",
+      titlebarStatusConnecting: "Connecting…",
+      titlebarStatusPotentiallyBlocked: "Potentially blocked",
+      titlebarStatusConnected: "Connected",
     };
 
     const tsb = new TorPropertyStringBundle(


=====================================
browser/themes/shared/browser-shared.css
=====================================
@@ -23,8 +23,8 @@
 @import url("chrome://browser/skin/UITour.css");
 @import url("chrome://browser/skin/browser-colors.css");
 @import url("chrome://branding/content/tor-styles.css");
- at import url("chrome://browser/skin/torconnect-urlbar.css");
 @import url("chrome://browser/skin/onionlocation.css");
+ at import url("chrome://browser/skin/tor-urlbar-button.css");
 
 @namespace html url("http://www.w3.org/1999/xhtml");
 


=====================================
browser/themes/shared/identity-block/onion-slash.svg
=====================================
@@ -1,5 +1,16 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg viewBox="0 0 16 16" width="16" height="16" xmlns="http://www.w3.org/2000/svg">
-  <path d="m14.1161 15.6245c-.0821.0001-.1634-.016-.2393-.0474-.0758-.0314-.1447-.0775-.2027-.1356l-12.749984-12.749c-.109266-.11882-.168406-.27526-.165071-.43666.003335-.16139.068886-.31525.182967-.42946.114078-.11421.267868-.17994.429258-.18345.16139-.00352.3179.05544.43685.16457l12.74998 12.75c.1168.1176.1824.2767.1824.4425s-.0656.3249-.1824.4425c-.058.058-.1269.1039-.2028.1352-.0759.0312-.1571.0471-.2392.0468z" fill-opacity="context-fill-opacity" fill="#ff0039" />
-  <path d="m 8,0.5000002 c -1.61963,0 -3.1197431,0.5137987 -4.3457031,1.3867188 l 0.84375,0.8417968 0.7792969,0.78125 0.8613281,0.8613282 0.8164062,0.8164062 0.9863281,0.984375 h 0.058594 c 1.00965,0 1.828125,0.818485 1.828125,1.828125 0,0.01968 6.2e-4,0.039074 0,0.058594 L 10.8125,9.0449221 C 10.9334,8.7195921 11,8.3674002 11,8.0000002 c 0,-1.65685 -1.34314,-3 -3,-3 v -1.078125 c 2.25231,0 4.078125,1.825845 4.078125,4.078125 0,0.67051 -0.162519,1.3033281 -0.449219,1.8613281 l 0.861328,0.8613277 C 12.972434,9.9290067 13.25,8.9965102 13.25,8.0000002 c 0,-2.89949 -2.35049,-5.25 -5.25,-5.25 v -1.078125 c 3.4949,0 6.328125,2.833195 6.328125,6.328125 0,1.29533 -0.388841,2.4990528 -1.056641,3.5019528 l 0.841797,0.84375 C 14.986181,11.119703 15.5,9.6196302 15.5,8.0000002 c 0,-4.14214 -3.3579,-7.5 -7.5,-7.5 z m -6.1113281,3.15625 C 1.0154872,4.8821451 0.5,6.3803304 0.5,8.0000002 0.5,12.1421 3.85786,15.5 8,15.5 c 1.6198027,0 3.117896,-0.515441 4.34375,-1.388672 L 11.501953,13.269531 C 10.498787,13.937828 9.295838,14.328125 8,14.328125 V 13.25 c 0.9967306,0 1.9287093,-0.277621 2.722656,-0.759766 L 9.859375,11.626953 C 9.3016226,11.913918 8.6705338,12.078125 8,12.078125 V 11 C 8.3664751,11 8.716425,10.93088 9.0410156,10.810547 6.6639891,8.4300416 4.2743195,6.0418993 1.8886719,3.6562502 Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_1827_6565)">
+<path d="M6.62435 8.54824C6.23983 8.91273 6 9.42836 6 10C6 11.1046 6.89543 12 8 12C8.57164 12 9.08727 11.7602 9.45176 11.3757L8.74414 10.668C8.56107 10.8718 8.29551 11 8 11C7.44772 11 7 10.5523 7 10C7 9.70449 7.12818 9.43893 7.33197 9.25586L6.62435 8.54824Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<path d="M9.99442 10.1505C9.99812 10.1008 10 10.0506 10 10C10 8.89543 9.10457 8 8 8C7.94936 8 7.89915 8.00188 7.84946 8.00558L9.99442 10.1505Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<path d="M5.20988 7.13377C4.46354 7.86041 4 8.87607 4 10C4 12.2091 5.79086 14 8 14C9.12393 14 10.1396 13.5365 10.8662 12.7901L10.159 12.0829C9.61343 12.6483 8.84778 13 8 13C6.34315 13 5 11.6569 5 10C5 9.15222 5.35166 8.38657 5.91707 7.84097L5.20988 7.13377Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<path d="M10.8331 10.9892C10.9412 10.6795 11 10.3466 11 10C11 8.34315 9.65685 7 8 7C7.65339 7 7.32052 7.05878 7.01079 7.16692L6.24731 6.40343C6.77658 6.14502 7.37135 6 8 6C10.2091 6 12 7.79086 12 10C12 10.6286 11.855 11.2234 11.5966 11.7527L10.8331 10.9892Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M14 10C14 8.223 13.2275 6.62643 12 5.52779V4C12 1.79086 10.2091 0 8 0C5.79086 0 4 1.79086 4 4V4.15613L5.50811 5.66423C6.2417 5.2417 7.09263 5 8 5C10.7614 5 13 7.23858 13 10C13 10.9074 12.7583 11.7583 12.3358 12.4919L13.0637 13.2199C13.6565 12.2896 14 11.1849 14 10ZM8 4C7.00883 4 6.0738 4.24033 5.25 4.66591V4C5.25 2.48122 6.48122 1.25 8 1.25C9.51878 1.25 10.75 2.48122 10.75 4V4.66591C9.9262 4.24033 8.99117 4 8 4Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<path d="M12.2805 14.2044C11.1919 15.3126 9.67621 16 8 16C4.68629 16 2 13.3137 2 10C2 8.32379 2.68736 6.80812 3.79558 5.71948L4.50272 6.42662C3.57545 7.33427 3 8.59993 3 10C3 12.7614 5.23858 15 8 15C9.40007 15 10.6657 14.4246 11.5734 13.4973L12.2805 14.2044Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M1.25801 3.93806C1.50209 3.69398 1.89782 3.69398 2.14189 3.93806L13.1419 14.9381C13.386 15.1821 13.386 15.5779 13.1419 15.8219C12.8978 16.066 12.5021 16.066 12.258 15.8219L1.25801 4.82194C1.01393 4.57787 1.01393 4.18214 1.25801 3.93806Z" fill="#F90D3F"/>
+</g>
+<defs>
+<clipPath id="clip0_1827_6565">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
 </svg>


=====================================
browser/themes/shared/identity-block/onion-warning.svg
=====================================
@@ -1,4 +1,13 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg viewBox="0 0 16 16" width="16" height="16"  xmlns="http://www.w3.org/2000/svg">
-  <path d="M 7.5,0.5 C 3.35786,0.5 0,3.85786 0,8 c 0,3.7093 2.6930488,6.789278 6.2304688,7.392578 -0.032181,-0.0637 -0.060149,-0.128686 -0.085938,-0.195312 -0.00862,-0.02227 -0.01751,-0.04385 -0.025391,-0.06641 -0.023385,-0.0669 -0.043878,-0.135932 -0.060547,-0.205078 -0.00186,-0.0077 -0.00213,-0.01571 -0.00391,-0.02344 -0.017615,-0.07685 -0.032109,-0.153488 -0.041016,-0.232422 -7.27e-5,-6.44e-4 7.2e-5,-0.0013 0,-0.002 -0.0087,-0.07777 -0.011896,-0.157155 -0.011719,-0.236328 7.71e-5,-0.0337 2.127e-4,-0.06769 0.00195,-0.101563 3.337e-4,-0.0065 -3.955e-4,-0.01303 0,-0.01953 0.00318,-0.05219 0.0084,-0.10381 0.015625,-0.15625 0.03623,-0.263929 0.1235201,-0.529812 0.2714844,-0.787109 L 6.421875,13.138672 C 7.1130865,11.933878 7.8482649,10.654869 8.4882812,9.5390625 8.2033713,9.7224325 7.864,9.828125 7.5,9.828125 v -3.65625 c 1.00965,0 1.828125,0.818485 1.828125,1.828125 0,0.02558 -9.131e-4,0.050842 -0.00195,0.076172 L 9.6015625,7.5957031 C 9.7779825,7.2883331 10.012797,7.0451975 10.279297,6.8671875 9.8324169,5.7717775 8.75611,5 7.5,5 V 3.921875 c 1.72627,0 3.201675,1.0728106 3.796875,2.5878906 0.4511,-0.0416 0.914353,0.052393 1.314453,0.2832032 C 12.066128,4.4750988 9.98426,2.75 7.5,2.75 V 1.671875 c 3.4949,0 6.328125,2.833195 6.328125,6.328125 0,0.10641 -0.0026,0.2112863 -0.0078,0.3164062 L 14.74806,9.9355469 C 14.912447,9.3182669 15,8.66904 15,8 15,3.85786 11.6421,0.5 7.5,0.5 Z m 4,7 c -0.40375,0 -0.808156,0.19825 -1.035156,0.59375 l -3.3105471,5.771484 c -0.446,0.775 0.1271562,1.734375 1.0351562,1.734375 H 14.8125 c 0.907,0 1.478203,-0.959375 1.033203,-1.734375 L 12.535156,8.09375 C 12.308156,7.69825 11.90375,7.5 11.5,7.5 Z m 0,2.1015625 c 0.1658,0 0.324206,0.066384 0.441406,0.1835937 0.1172,0.1172101 0.183594,0.2757058 0.183594,0.4414058 v 1.748047 c 0,0.1658 -0.06639,0.324207 -0.183594,0.441407 -0.1172,0.1172 -0.275606,0.183593 -0.441406,0.183593 -0.1657,0 -0.324206,-0.06639 -0.441406,-0.183593 -0.1172,-0.1172 -0.183594,-0.275607 -0.183594,-0.441407 v -1.748047 c 0,-0.165699 0.06639,-0.3241957 0.183594,-0.4414058 C 11.175794,9.6679462 11.3343,9.6015625 11.5,9.6015625 Z m 0,3.7480465 c 0.1658,0 0.324206,0.06639 0.441406,0.183594 0.1172,0.1172 0.183594,0.275706 0.183594,0.441406 0,0.1658 -0.06639,0.32616 -0.183594,0.44336 -0.1172,0.1172 -0.275606,0.18164 -0.441406,0.18164 -0.1657,0 -0.324206,-0.06444 -0.441406,-0.18164 -0.1172,-0.1172 -0.183594,-0.27756 -0.183594,-0.44336 0,-0.1657 0.06639,-0.324206 0.183594,-0.441406 0.1172,-0.1172 0.275706,-0.183594 0.441406,-0.183594 z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_1827_6566)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.92788 10.5342L7.42044 11.408C7.05803 11.7736 6.55546 12 6 12C4.89543 12 4 11.1046 4 10C4 8.89543 4.89543 8 6 8C7.10457 8 8 8.89543 8 10C8 10.185 7.97488 10.3641 7.92788 10.5342ZM7 10C7 10.5523 6.55228 11 6 11C5.44772 11 5 10.5523 5 10C5 9.44772 5.44772 9 6 9C6.55228 9 7 9.44772 7 10Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<path d="M6.52221 12.9547C6.35262 12.9845 6.17812 13 6 13C4.34315 13 3 11.6569 3 10C3 8.34315 4.34315 7 6 7C7.30202 7 8.41032 7.82945 8.8253 8.98878L9.35089 8.08372C9.37772 8.03755 9.40587 7.99285 9.43523 7.94962C8.73673 6.78186 7.45967 6 6 6C3.79086 6 2 7.79086 2 10C2 12.1857 3.75302 13.9619 5.92975 13.9994C5.96208 13.9274 5.99884 13.8558 6.0402 13.7847L6.52221 12.9547Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M11.1978 7.00088C10.8782 6.44807 10.4728 5.95098 10 5.52779V4C10 1.79086 8.20914 0 6 0C3.79086 0 2 1.79086 2 4V5.52779C0.772501 6.62643 0 8.223 0 10C0 13.3137 2.68629 16 6 16C6.03024 16 6.06043 15.9998 6.09057 15.9993C5.89561 15.7007 5.77424 15.3557 5.749 14.9938C3.10419 14.8631 1 12.6773 1 10C1 7.23858 3.23858 5 6 5C7.75288 5 9.29509 5.90201 10.1878 7.26719C10.5002 7.0977 10.8482 7.00893 11.1978 7.00088ZM6 4C5.00883 4 4.0738 4.24033 3.25 4.66591V4C3.25 2.48122 4.48122 1.25 6 1.25C7.51878 1.25 8.75 2.48122 8.75 4V4.66591C7.9262 4.24033 6.99117 4 6 4Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+<path d="M15.5956 14.2875L12.2846 8.58591C11.8306 7.8047 10.6696 7.8047 10.2156 8.58591L6.90465 14.2875C6.45865 15.0529 7.03065 16 7.93865 16H14.5616C15.4686 16 16.0406 15.0529 15.5956 14.2875ZM11.8746 12.4189C11.8746 12.5826 11.8088 12.7396 11.6916 12.8553C11.5744 12.9711 11.4154 13.0361 11.2496 13.0361C11.0839 13.0361 10.9249 12.9711 10.8077 12.8553C10.6905 12.7396 10.6246 12.5826 10.6246 12.4189V10.6935C10.6246 10.5298 10.6905 10.3728 10.8077 10.257C10.9249 10.1413 11.0839 10.0762 11.2496 10.0762C11.4154 10.0762 11.5744 10.1413 11.6916 10.257C11.8088 10.3728 11.8746 10.5298 11.8746 10.6935V12.4189ZM11.2496 15.0124C11.0839 15.0124 10.9249 14.9473 10.8077 14.8316C10.6905 14.7158 10.6246 14.5588 10.6246 14.3951C10.6246 14.2314 10.6905 14.0744 10.8077 13.9586C10.9249 13.8429 11.0839 13.7778 11.2496 13.7778C11.4154 13.7778 11.5744 13.8429 11.6916 13.9586C11.8088 14.0744 11.8746 14.2314 11.8746 14.3951C11.8746 14.5588 11.8088 14.7158 11.6916 14.8316C11.5744 14.9473 11.4154 15.0124 11.2496 15.0124Z" fill-opacity="context-fill-opacity" fill="context-fill"/>
+</g>
+<defs>
+<clipPath id="clip0_1827_6566">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
 </svg>


=====================================
browser/themes/shared/identity-block/onion.svg
=====================================
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg viewBox="0 0 16 16" width="16" height="16" xmlns="http://www.w3.org/2000/svg">
-  <path d="M 8 0.5 C 3.85786 0.5 0.5 3.85786 0.5 8 C 0.5 12.1421 3.85786 15.5 8 15.5 C 12.1421 15.5 15.5 12.1421 15.5 8 C 15.5 3.85786 12.1421 0.5 8 0.5 z M 8 1.671875 C 11.4949 1.671875 14.328125 4.50507 14.328125 8 C 14.328125 11.4949 11.4949 14.328125 8 14.328125 L 8 13.25 C 10.89951 13.25 13.25 10.89951 13.25 8 C 13.25 5.10051 10.89951 2.75 8 2.75 L 8 1.671875 z M 8 3.921875 C 10.25231 3.921875 12.078125 5.74772 12.078125 8 C 12.078125 10.25231 10.25231 12.078125 8 12.078125 L 8 11 C 9.65686 11 11 9.65686 11 8 C 11 6.34315 9.65686 5 8 5 L 8 3.921875 z M 8 6.171875 C 9.00965 6.171875 9.828125 6.99036 9.828125 8 C 9.828125 9.00965 9.00965 9.828125 8 9.828125 L 8 6.171875 z " clip-rule="evenodd" fill-rule="evenodd" fill="context-fill" fill-opacity="context-fill-opacity"/>
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8 13C9.65685 13 11 11.6569 11 10C11 8.34315 9.65685 7 8 7C6.34315 7 5 8.34315 5 10C5 11.6569 6.34315 13 8 13ZM8 14C10.2091 14 12 12.2091 12 10C12 7.79086 10.2091 6 8 6C5.79086 6 4 7.79086 4 10C4 12.2091 5.79086 14 8 14Z" fill="context-fill" fill-opacity="context-fill-opacity"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8 11C8.55228 11 9 10.5523 9 10C9 9.44772 8.55228 9 8 9C7.44772 9 7 9.44772 7 10C7 10.5523 7.44772 11 8 11ZM8 12C9.10457 12 10 11.1046 10 10C10 8.89543 9.10457 8 8 8C6.89543 8 6 8.89543 6 10C6 11.1046 6.89543 12 8 12Z" fill="context-fill" fill-opacity="context-fill-opacity"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12 5.52779C13.2275 6.62643 14 8.223 14 10C14 13.3137 11.3137 16 8 16C4.68629 16 2 13.3137 2 10C2 8.223 2.7725 6.62643 4 5.52779V4C4 1.79086 5.79086 0 8 0C10.2091 0 12 1.79086 12 4V5.52779ZM5.25 4.66591C6.0738 4.24033 7.00883 4 8 4C8.99117 4 9.9262 4.24033 10.75 4.66591V4C10.75 2.48122 9.51878 1.25 8 1.25C6.48122 1.25 5.25 2.48122 5.25 4V4.66591ZM13 10C13 12.7614 10.7614 15 8 15C5.23858 15 3 12.7614 3 10C3 7.23858 5.23858 5 8 5C10.7614 5 13 7.23858 13 10Z" fill="context-fill" fill-opacity="context-fill-opacity"/>
 </svg>


=====================================
browser/themes/shared/jar.inc.mn
=====================================
@@ -32,6 +32,7 @@
   skin/classic/browser/tabs.css                                (../shared/tabs.css)
   skin/classic/browser/toolbarbuttons.css                      (../shared/toolbarbuttons.css)
   skin/classic/browser/toolbarbutton-icons.css                 (../shared/toolbarbutton-icons.css)
+  skin/classic/browser/tor-urlbar-button.css                   (../shared/tor-urlbar-button.css)
   skin/classic/browser/urlbar-dynamic-results.css              (../shared/urlbar-dynamic-results.css)
   skin/classic/browser/urlbar-searchbar.css                    (../shared/urlbar-searchbar.css)
   skin/classic/browser/urlbarView.css                          (../shared/urlbarView.css)


=====================================
browser/themes/shared/tor-urlbar-button.css
=====================================
@@ -0,0 +1,107 @@
+.tor-urlbar-button:not([hidden]) {
+  --tor-urlbar-button-background-color: var(--purple-60);
+  background-color: var(--tor-urlbar-button-background-color);
+  /* FIXME: Use different colors for light and dark theme, rather than "white".
+   * See tor-browser#41787 */
+  color: white;
+  display: flex;
+  align-items: center;
+  gap: 0.5em;
+  border-radius: var(--urlbar-icon-border-radius);
+  --tor-urlbar-button-inline-padding: 8px;
+  padding-inline: var(--tor-urlbar-button-inline-padding);
+  margin: 0;
+}
+
+.tor-urlbar-button > * {
+  flex: 0 0 auto;
+  margin: 0;
+}
+
+.tor-urlbar-button:focus-visible {
+  /* This button lies within the urlbar, so if the outline extends beyond the
+   * button's boundary, it will be clipped by the urlbar.
+   * Most button's in the urlbar get around this by using --focus-outline-inset,
+   * but our button has a purple background, which does not contrast well with
+   * the focus outline.
+   * Therefore, we use an offset outline rather than an inset outline, and
+   * compensate by shrinking the button's width and height so that the outline
+   * fits within the non-focused button boundary. Essentially, this has a
+   * similar effect to using an inset outline that matches the color of the
+   * urlbar background, but we keep the rounded corners. */
+  outline: var(--focus-outline);
+  outline-offset: var(--focus-outline-offset);
+  /* Use the background color for the outline, same as in-content buttons. */
+  outline-color: var(--tor-urlbar-button-background-color);
+  /* Calculate the difference between the button's border area and the outline
+   * area. */
+  --tor-urlbar-focus-outline-difference: calc(
+    var(--focus-outline-offset)
+    + var(--focus-outline-width)
+  );
+  /* For the inline direction, we shrink the padding by the difference, and
+   * increase the margin by the same amount so that the button text remains in
+   * the same position.
+   * For the block direction, the height of the button is flexibly sized with
+   * the urlbar height, so we should only need to increase the margin. */
+  padding-inline: calc(
+    var(--tor-urlbar-button-inline-padding)
+    - var(--tor-urlbar-focus-outline-difference)
+  );
+  margin: var(--tor-urlbar-focus-outline-difference);
+}
+
+.tor-urlbar-button:focus-visible > * {
+  /* Negate the margin that would be added on focus to ensure the button does
+   * not grow in height.
+   * Ideally, this should not change anything noticeable, otherwise the text
+   * could be clipped when focused. */
+  margin-block: calc(-1 * var(--tor-urlbar-focus-outline-difference));
+}
+
+#urlbar[usertyping] .tor-urlbar-button {
+  /* Hide whilst the user is typing in the url bar. */
+  display: none;
+}
+
+.tor-urlbar-button:hover {
+  --tor-urlbar-button-background-color: var(--purple-70);
+}
+
+.tor-urlbar-button:hover:active {
+  --tor-urlbar-button-background-color: var(--purple-80);
+}
+
+ at media (prefers-color-scheme: dark) {
+  .tor-urlbar-button {
+    --tor-urlbar-button-background-color: var(--purple-50);
+  }
+
+  .tor-urlbar-button:hover {
+    --tor-urlbar-button-background-color: var(--purple-60);
+  }
+
+  .tor-urlbar-button:hover:active {
+    --tor-urlbar-button-background-color: var(--purple-70);
+  }
+}
+
+/* Make the button look plain like the identity #urlbar-label-box. */
+.tor-urlbar-button.tor-urlbar-button-plain {
+  --tor-urlbar-button-background-color: var(--urlbar-box-bgcolor);
+  color: var(--urlbar-box-text-color);
+}
+
+.tor-urlbar-button.tor-urlbar-button-plain:focus-visible {
+  outline-color: var(--focus-outline-color);
+}
+
+.tor-urlbar-button.tor-urlbar-button-plain:hover {
+  --tor-urlbar-button-background-color: var(--urlbar-box-hover-bgcolor);
+  color: var(--urlbar-box-hover-text-color);
+}
+
+.tor-urlbar-button.tor-urlbar-button-plain:hover:active {
+  --tor-urlbar-button-background-color: var(--urlbar-box-active-bgcolor);
+  color: var(--urlbar-box-hover-text-color);
+}


=====================================
devtools/shared/webconsole/network-helper.js
=====================================
@@ -600,6 +600,9 @@ var NetworkHelper = {
 
     // The request did not contain any security info.
     if (!securityInfo) {
+      if (httpActivity.hostname && httpActivity.hostname.endsWith(".onion")) {
+        info.state = "secure";
+      }
       return info;
     }
 
@@ -651,7 +654,11 @@ var NetworkHelper = {
         // schemes other than https and wss are subject to
         // downgrade/etc at the scheme level and should always be
         // considered insecure
-        info.state = "insecure";
+        if (httpActivity.hostname && httpActivity.hostname.endsWith(".onion")) {
+          info.state = "secure";
+        } else {
+          info.state = "insecure";
+        }
       } else if (state & wpl.STATE_IS_SECURE) {
         // The connection is secure if the scheme is sufficient
         info.state = "secure";


=====================================
dom/html/HTMLFormElement.cpp
=====================================
@@ -893,7 +893,10 @@ nsresult HTMLFormElement::DoSecureToInsecureSubmitCheck(nsIURI* aActionURL,
     formIsHTTPS = OwnerDoc()->GetDocumentURI()->SchemeIs("https");
   }
   if (!formIsHTTPS) {
-    return NS_OK;
+    bool formIsOnion = nsMixedContentBlocker::IsPotentiallyTrustworthyOnion(OwnerDoc()->GetDocumentURI());
+    if (!formIsOnion) {
+      return NS_OK;
+    }
   }
 
   if (nsMixedContentBlocker::IsPotentiallyTrustworthyLoopbackURL(aActionURL)) {


=====================================
toolkit/torbutton/chrome/locale/en-US/torConnect.properties
=====================================
@@ -3,10 +3,14 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
+torConnect.titlebarStatusName=Tor connection
+torConnect.titlebarStatusNotConnected=Not connected
+torConnect.titlebarStatusConnecting=Connecting…
+torConnect.titlebarStatusPotentiallyBlocked=Potentially blocked
+torConnect.titlebarStatusConnected=Connected
+
 torConnect.torConnect=Connect to Tor
 torConnect.torConnecting=Establishing a Connection
-torConnect.torNotConnectedConcise=Not Connected
-torConnect.torConnectingConcise=Connecting…
 torConnect.tryingAgain=Trying again…
 torConnect.noInternet=Tor Browser couldn’t reach the Internet
 torConnect.noInternetDescription=This could be due to a connection issue rather than Tor being blocked. Check your Internet connection, proxy and firewall settings before trying again.
@@ -35,7 +39,6 @@ torConnect.viewLog=View logs…
 torConnect.torConnectButton=Connect
 torConnect.cancel=Cancel
 torConnect.torConnected=Connected to the Tor network!
-torConnect.torConnectedConcise=Connected
 torConnect.tryAgain=Try Again
 torConnect.connectMessage=Changes to Tor Settings will not take effect until you connect
 torConnect.tryAgainMessage=Tor Browser has failed to establish a connection to the Tor Network
@@ -51,3 +54,8 @@ torConnect.autoBootstrappingFailed=Automatic configuration failed
 torConnect.autoBootstrappingAllFailed=None of the configurations we tried worked
 torConnect.cannotDetermineCountry=Unable to determine user country
 torConnect.noSettingsForCountry=No settings available for your location
+
+# Urlbar strings used up to 12.0 - TODO: remove when 12.5 becomes stable:
+torConnect.torNotConnectedConcise=Not Connected
+torConnect.torConnectingConcise=Connecting…
+torConnect.torConnectedConcise=Connected


=====================================
tools/update-packaging/common.sh
=====================================
@@ -108,6 +108,28 @@ make_add_if_not_instruction() {
   echo "add-if-not \"$f\" \"$f\"" >> "$filev3"
 }
 
+check_for_add_if_update() {
+  add_if_file_chk="$1"
+
+  # tor-browser#41776: We will remove with the old fontconfig file manually
+  # outside the update process. So, let the updater add the file if there.
+  # TODO: Remove once we do a watershed release.
+  if [ "$add_if_file_chk" = "TorBrowser/Data/fontconfig/fonts.conf" ]; then
+    ## "true" *giggle*
+    return 0;
+  fi
+  ## 'false'... because this is bash. Oh yay!
+  return 1;
+}
+
+make_add_if_instruction() {
+  f="$1"
+  filev3="$2"
+
+  verbose_notice " add-if \"$f\" \"$f\""
+  echo "add-if \"$f\" \"$f\"" >> "$filev3"
+}
+
 make_addsymlink_instruction() {
   link="$1"
   target="$2"


=====================================
tools/update-packaging/make_full_update.sh
=====================================
@@ -106,6 +106,9 @@ for ((i=0; $i<$num_files; i=$i+1)); do
 
   if check_for_add_if_not_update "$f"; then
     make_add_if_not_instruction "$f" "$updatemanifestv3"
+  elif check_for_add_if_update "$f"; then
+    # TODO: Remove once we do a watershed release
+    make_add_if_instruction "$f" "$updatemanifestv3"
   else
     make_add_instruction "$f" "$updatemanifestv3"
   fi


=====================================
tools/update-packaging/make_incremental_update.sh
=====================================
@@ -220,6 +220,17 @@ for ((i=0; $i<$num_oldfiles; i=$i+1)); do
       continue 1
     fi
 
+    if check_for_add_if_update "$f"; then
+      # TODO: Remove once we do a watershed release
+      # The full workdir may not exist yet, so create it if necessary.
+      mkdir -p `dirname "$workdir/$f"`
+      $XZ $XZ_OPT --compress $BCJ_OPTIONS --lzma2 --format=xz --check=crc64 --force --stdout "$newdir/$f" > "$workdir/$f"
+      copy_perm "$newdir/$f" "$workdir/$f"
+      make_add_if_instruction "$f" "$updatemanifestv3"
+      archivefiles="$archivefiles \"$f\""
+      continue 1
+    fi
+
     if check_for_forced_update "$requested_forced_updates" "$f"; then
       # The full workdir may not exist yet, so create it if necessary.
       mkdir -p `dirname "$workdir/$f"`
@@ -328,6 +339,9 @@ for ((i=0; $i<$num_newfiles; i=$i+1)); do
 
   if check_for_add_if_not_update "$f"; then
     make_add_if_not_instruction "$f" "$updatemanifestv3"
+  elif check_for_add_if_update "$f"; then
+    # TODO: Remove once we do a watershed release
+    make_add_if_instruction "$f" "$updatemanifestv3"
   else
     make_add_instruction "$f" "$updatemanifestv3"
   fi



View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/5b547f815eccc64ac6ff218649acbeb5ae89e7b2...6c66708ff8bdb0e631ee6a36557db2a5974da9af

-- 
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/5b547f815eccc64ac6ff218649acbeb5ae89e7b2...6c66708ff8bdb0e631ee6a36557db2a5974da9af
You're receiving this email because of your account on gitlab.torproject.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.torproject.org/pipermail/tbb-commits/attachments/20230529/1535a026/attachment-0001.htm>


More information about the tbb-commits mailing list