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

Commits:

30 changed files:

Changes:

  • browser/app/profile/001-base-profile.js
    ... ... @@ -48,6 +48,9 @@ pref("security.nocertdb", true);
    48 48
     pref("browser.download.useDownloadDir", false);
    
    49 49
     pref("browser.download.manager.addToRecentDocs", false);
    
    50 50
     
    
    51
    +// Prevent download stuffing / DOS (tor-browser#41764)
    
    52
    +pref("browser.download.enable_spam_prevention", true);
    
    53
    +
    
    51 54
     // Misc privacy: Disk
    
    52 55
     pref("signon.rememberSignons", false);
    
    53 56
     pref("browser.formfill.enable", false);
    
    ... ... @@ -697,6 +700,8 @@ pref("font.name-list.monospace.x-unicode", "Consolas, Noto Sans Balinese, Noto S
    697 700
     #endif
    
    698 701
     
    
    699 702
     #ifdef XP_LINUX
    
    703
    +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");
    
    704
    +
    
    700 705
     // Arabic
    
    701 706
     pref("font.name-list.serif.ar", "Noto Naskh Arabic, Tinos");
    
    702 707
     pref("font.name-list.sans-serif.ar", "Noto Naskh Arabic, Arimo");
    

  • browser/base/content/browser.js
    ... ... @@ -80,6 +80,8 @@ XPCOMUtils.defineLazyModuleGetters(this, {
    80 80
       TabCrashHandler: "resource:///modules/ContentCrashHandlers.jsm",
    
    81 81
       TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.jsm",
    
    82 82
       TorConnect: "resource:///modules/TorConnect.jsm",
    
    83
    +  TorConnectState: "resource:///modules/TorConnect.jsm",
    
    84
    +  TorConnectTopics: "resource:///modules/TorConnect.jsm",
    
    83 85
       TorDomainIsolator: "resource://gre/modules/TorDomainIsolator.jsm",
    
    84 86
       Translation: "resource:///modules/translation/TranslationParent.jsm",
    
    85 87
       UITour: "resource:///modules/UITour.jsm",
    
    ... ... @@ -270,6 +272,16 @@ XPCOMUtils.defineLazyScriptGetter(
    270 272
       "gSharedTabWarning",
    
    271 273
       "chrome://browser/content/browser-webrtc.js"
    
    272 274
     );
    
    275
    +XPCOMUtils.defineLazyScriptGetter(
    
    276
    +  this,
    
    277
    +  ["gTorConnectUrlbarButton"],
    
    278
    +  "chrome://browser/content/torconnect/torConnectUrlbarButton.js"
    
    279
    +);
    
    280
    +XPCOMUtils.defineLazyScriptGetter(
    
    281
    +  this,
    
    282
    +  ["gTorConnectTitlebarStatus"],
    
    283
    +  "chrome://browser/content/torconnect/torConnectTitlebarStatus.js"
    
    284
    +);
    
    273 285
     XPCOMUtils.defineLazyScriptGetter(
    
    274 286
       this,
    
    275 287
       ["gTorCircuitPanel"],
    
    ... ... @@ -1809,6 +1821,9 @@ var gBrowserInit = {
    1809 1821
         // Init the OnionAuthPrompt
    
    1810 1822
         OnionAuthPrompt.init();
    
    1811 1823
     
    
    1824
    +    gTorConnectUrlbarButton.init();
    
    1825
    +    gTorConnectTitlebarStatus.init();
    
    1826
    +
    
    1812 1827
         gTorCircuitPanel.init();
    
    1813 1828
     
    
    1814 1829
         // Certain kinds of automigration rely on this notification to complete
    
    ... ... @@ -1896,8 +1911,6 @@ var gBrowserInit = {
    1896 1911
         }
    
    1897 1912
     
    
    1898 1913
         this._loadHandled = true;
    
    1899
    -
    
    1900
    -    TorBootstrapUrlbar.init();
    
    1901 1914
       },
    
    1902 1915
     
    
    1903 1916
       _cancelDelayedStartup() {
    
    ... ... @@ -2555,9 +2568,10 @@ var gBrowserInit = {
    2555 2568
     
    
    2556 2569
         OnionAuthPrompt.uninit();
    
    2557 2570
     
    
    2558
    -    gTorCircuitPanel.uninit();
    
    2571
    +    gTorConnectUrlbarButton.uninit();
    
    2572
    +    gTorConnectTitlebarStatus.uninit();
    
    2559 2573
     
    
    2560
    -    TorBootstrapUrlbar.uninit();
    
    2574
    +    gTorCircuitPanel.uninit();
    
    2561 2575
     
    
    2562 2576
         gAccessibilityServiceIndicator.uninit();
    
    2563 2577
     
    

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

  • browser/base/content/navigator-toolbox.inc.xhtml
    ... ... @@ -93,6 +93,11 @@
    93 93
                   aria-live="polite"/>
    
    94 94
           <hbox class="private-browsing-indicator"/>
    
    95 95
     
    
    96
    +      <html:div id="tor-connect-titlebar-status" role="status">
    
    97
    +        <html:img alt="" id="tor-connect-titlebar-status-icon" />
    
    98
    +        <html:span id="tor-connect-titlebar-status-label"></html:span>
    
    99
    +      </html:div>
    
    100
    +
    
    96 101
     #include titlebar-items.inc.xhtml
    
    97 102
     
    
    98 103
         </toolbar>
    
    ... ... @@ -335,7 +340,6 @@
    335 340
                        data-l10n-id="urlbar-go-button"/>
    
    336 341
                 <hbox id="page-action-buttons" context="pageActionContextMenu">
    
    337 342
                   <toolbartabstop/>
    
    338
    -#include ../../components/torconnect/content/torconnect-urlbar.inc.xhtml
    
    339 343
                   <hbox id="contextual-feature-recommendation" role="button" hidden="true">
    
    340 344
                     <hbox id="cfr-label-container">
    
    341 345
                       <label id="cfr-label"/>
    
    ... ... @@ -363,9 +367,6 @@
    363 367
                          onclick="FullZoom.reset(); FullZoom.resetScalingZoom();"
    
    364 368
                          tooltip="dynamic-shortcut-tooltip"
    
    365 369
                          hidden="true"/>
    
    366
    -
    
    367
    -#include ../../components/onionservices/content/onionlocation-urlbar.inc.xhtml
    
    368
    -
    
    369 370
                   <hbox id="pageActionButton"
    
    370 371
                         class="urlbar-page-action"
    
    371 372
                         role="button"
    
    ... ... @@ -383,6 +384,15 @@
    383 384
                            class="urlbar-icon"/>
    
    384 385
                   </hbox>
    
    385 386
                 </hbox>
    
    387
    +
    
    388
    +            <hbox id="tor-connect-urlbar-button"
    
    389
    +                  role="button"
    
    390
    +                  class="tor-urlbar-button"
    
    391
    +                  hidden="true">
    
    392
    +              <label id="tor-connect-urlbar-button-label"/>
    
    393
    +            </hbox>
    
    394
    +
    
    395
    +#include ../../components/onionservices/content/onionlocation-urlbar.inc.xhtml
    
    386 396
               </hbox>
    
    387 397
             </hbox>
    
    388 398
             <toolbartabstop/>
    

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

  • browser/components/onionservices/content/onionlocation.css
    1 1
     /* Copyright (c) 2020, The Tor Project, Inc. */
    
    2 2
     
    
    3
    -#onion-location-box {
    
    4
    -  background-color: var(--purple-60);
    
    5
    -  -moz-context-properties: fill;
    
    6
    -  fill: white;
    
    7
    -}
    
    8
    -
    
    9
    -#onion-location-box:hover {
    
    10
    -  background-color: var(--purple-70);
    
    11
    -}
    
    12
    -
    
    13
    -#onion-location-box:active {
    
    14
    -  background-color: var(--purple-80);
    
    15
    -}
    
    16
    -
    
    17
    -@media (prefers-color-scheme: dark) {
    
    18
    -  #onion-location-box {
    
    19
    -    background-color: var(--purple-50);
    
    20
    -  }
    
    21
    -
    
    22
    -  #onion-location-box:hover {
    
    23
    -    background-color: var(--purple-60);
    
    24
    -  }
    
    25
    -
    
    26
    -  #onion-location-box:active {
    
    27
    -    background-color: var(--purple-70);
    
    28
    -  }
    
    29
    -}
    
    30
    -
    
    31 3
     #onion-location-button {
    
    32 4
       list-style-image: url(chrome://browser/content/onionservices/onionlocation.svg);
    
    33
    -  padding-inline-start: 0.5em;
    
    34
    -}
    
    35
    -
    
    36
    -label#onion-label {
    
    37
    -  margin: 0;
    
    38
    -  padding-block: 0;
    
    39
    -  padding-inline: 0.5em;
    
    40
    -  color: white;
    
    41
    -  font-weight: normal;
    
    5
    +  -moz-context-properties: fill;
    
    6
    +  fill: currentColor;
    
    42 7
     }
    
    43 8
     
    
    44 9
     .onionlocation-notification-icon {
    

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

  • browser/components/torconnect/content/onion-slash.svg deleted
    1
    -<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    
    2
    -<svg viewBox="0 0 16 16" width="16" height="16" xmlns="http://www.w3.org/2000/svg">
    
    3
    -  <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" />
    
    4
    -  <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"/>
    
    5
    -</svg>

  • browser/components/torconnect/content/torBootstrapUrlbar.js deleted
    1
    -// Copyright (c) 2021, The Tor Project, Inc.
    
    2
    -
    
    3
    -"use strict";
    
    4
    -
    
    5
    -const { TorConnect, TorConnectTopics, TorConnectState } = ChromeUtils.import(
    
    6
    -  "resource:///modules/TorConnect.jsm"
    
    7
    -);
    
    8
    -const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
    
    9
    -
    
    10
    -/* globals browser, gURLBar, Services */
    
    11
    -
    
    12
    -var TorBootstrapUrlbar = {
    
    13
    -  selectors: Object.freeze({
    
    14
    -    torConnect: {
    
    15
    -      box: "hbox#torconnect-box",
    
    16
    -      label: "label#torconnect-label",
    
    17
    -    },
    
    18
    -  }),
    
    19
    -
    
    20
    -  elements: null,
    
    21
    -
    
    22
    -  updateTorConnectBox(state) {
    
    23
    -    switch (state) {
    
    24
    -      case TorConnectState.Initial:
    
    25
    -      case TorConnectState.Configuring:
    
    26
    -      case TorConnectState.AutoConfiguring:
    
    27
    -      case TorConnectState.Error:
    
    28
    -      case TorConnectState.FatalError: {
    
    29
    -        this.elements.torConnectBox.removeAttribute("hidden");
    
    30
    -        this.elements.torConnectLabel.textContent =
    
    31
    -          TorStrings.torConnect.torNotConnectedConcise;
    
    32
    -        this.elements.inputContainer.setAttribute("torconnect", "offline");
    
    33
    -        break;
    
    34
    -      }
    
    35
    -      case TorConnectState.Bootstrapping: {
    
    36
    -        this.elements.torConnectBox.removeAttribute("hidden");
    
    37
    -        this.elements.torConnectLabel.textContent =
    
    38
    -          TorStrings.torConnect.torConnectingConcise;
    
    39
    -        this.elements.inputContainer.setAttribute("torconnect", "connecting");
    
    40
    -        break;
    
    41
    -      }
    
    42
    -      case TorConnectState.Bootstrapped: {
    
    43
    -        this.elements.torConnectBox.removeAttribute("hidden");
    
    44
    -        this.elements.torConnectLabel.textContent =
    
    45
    -          TorStrings.torConnect.torConnectedConcise;
    
    46
    -        this.elements.inputContainer.setAttribute("torconnect", "connected");
    
    47
    -        // hide torconnect box after 5 seconds
    
    48
    -        setTimeout(() => {
    
    49
    -          this.elements.torConnectBox.setAttribute("hidden", "true");
    
    50
    -        }, 5000);
    
    51
    -        break;
    
    52
    -      }
    
    53
    -      case TorConnectState.Disabled: {
    
    54
    -        this.elements.torConnectBox.setAttribute("hidden", "true");
    
    55
    -        break;
    
    56
    -      }
    
    57
    -      default:
    
    58
    -        break;
    
    59
    -    }
    
    60
    -  },
    
    61
    -
    
    62
    -  observe(aSubject, aTopic, aData) {
    
    63
    -    if (aTopic === TorConnectTopics.StateChange) {
    
    64
    -      const obj = aSubject?.wrappedJSObject;
    
    65
    -      this.updateTorConnectBox(obj?.state);
    
    66
    -    }
    
    67
    -  },
    
    68
    -
    
    69
    -  init() {
    
    70
    -    if (TorConnect.shouldShowTorConnect) {
    
    71
    -      // browser isn't populated until init
    
    72
    -      this.elements = Object.freeze({
    
    73
    -        torConnectBox: browser.ownerGlobal.document.querySelector(
    
    74
    -          this.selectors.torConnect.box
    
    75
    -        ),
    
    76
    -        torConnectLabel: browser.ownerGlobal.document.querySelector(
    
    77
    -          this.selectors.torConnect.label
    
    78
    -        ),
    
    79
    -        inputContainer: gURLBar._inputContainer,
    
    80
    -      });
    
    81
    -      this.elements.torConnectBox.addEventListener("click", () => {
    
    82
    -        TorConnect.openTorConnect();
    
    83
    -      });
    
    84
    -      Services.obs.addObserver(this, TorConnectTopics.StateChange);
    
    85
    -      this.observing = true;
    
    86
    -      this.updateTorConnectBox(TorConnect.state);
    
    87
    -    }
    
    88
    -  },
    
    89
    -
    
    90
    -  uninit() {
    
    91
    -    if (this.observing) {
    
    92
    -      Services.obs.removeObserver(this, TorConnectTopics.StateChange);
    
    93
    -    }
    
    94
    -  },
    
    95
    -};

  • browser/components/torconnect/content/torConnectTitlebarStatus.css
    1
    +#tor-connect-titlebar-status:not([hidden]) {
    
    2
    +  display: flex;
    
    3
    +  align-items: center;
    
    4
    +  /* Want same as #private-browsing-indicator-with-label */
    
    5
    +  margin-inline: 7px;
    
    6
    +}
    
    7
    +
    
    8
    +#tor-connect-titlebar-status-label {
    
    9
    +  margin-inline: 6px;
    
    10
    +  white-space: nowrap;
    
    11
    +}
    
    12
    +
    
    13
    +#tor-connect-titlebar-status-icon {
    
    14
    +  -moz-context-properties: fill;
    
    15
    +  fill: currentColor;
    
    16
    +  width: 16px;
    
    17
    +  height: 16px;
    
    18
    +}
    
    19
    +
    
    20
    +#tor-connect-titlebar-status-icon.tor-connect-status-connected {
    
    21
    +  fill: var(--purple-60);
    
    22
    +}
    
    23
    +
    
    24
    +@media (prefers-color-scheme: dark) {
    
    25
    +  #tor-connect-titlebar-status-icon.tor-connect-status-connected {
    
    26
    +    fill: var(--purple-30);
    
    27
    +  }
    
    28
    +}
    
    29
    +
    
    30
    +#tor-connect-titlebar-status-icon.tor-connect-status-potentially-blocked {
    
    31
    +  fill: #c50042;
    
    32
    +}
    
    33
    +
    
    34
    +@media (prefers-color-scheme: dark) {
    
    35
    +  #tor-connect-titlebar-status-icon.tor-connect-status-potentially-blocked {
    
    36
    +    fill: #ff9aa2;
    
    37
    +  }
    
    38
    +}

  • browser/components/torconnect/content/torConnectTitlebarStatus.js
    1
    +/* eslint-env mozilla/browser-window */
    
    2
    +
    
    3
    +/**
    
    4
    + * A TorConnect status shown in the application title bar.
    
    5
    + */
    
    6
    +var gTorConnectTitlebarStatus = {
    
    7
    +  /**
    
    8
    +   * The status element in the title bar.
    
    9
    +   *
    
    10
    +   * @type {Element}
    
    11
    +   */
    
    12
    +  node: null,
    
    13
    +  /**
    
    14
    +   * The status label.
    
    15
    +   *
    
    16
    +   * @type {Element}
    
    17
    +   */
    
    18
    +  label: null,
    
    19
    +  /**
    
    20
    +   * The status icon.
    
    21
    +   *
    
    22
    +   * @type {Element}
    
    23
    +   */
    
    24
    +  icon: null,
    
    25
    +
    
    26
    +  /**
    
    27
    +   * Initialize the component.
    
    28
    +   */
    
    29
    +  init() {
    
    30
    +    const { TorStrings } = ChromeUtils.import(
    
    31
    +      "resource:///modules/TorStrings.jsm"
    
    32
    +    );
    
    33
    +
    
    34
    +    this._strings = TorStrings.torConnect;
    
    35
    +
    
    36
    +    this.node = document.getElementById("tor-connect-titlebar-status");
    
    37
    +    this.icon = document.getElementById("tor-connect-titlebar-status-icon");
    
    38
    +    this.label = document.getElementById("tor-connect-titlebar-status-label");
    
    39
    +    // The title also acts as an accessible name for the role="status".
    
    40
    +    this.node.setAttribute("title", this._strings.titlebarStatusName);
    
    41
    +
    
    42
    +    this._observeTopic = TorConnectTopics.StateChange;
    
    43
    +    this._stateListener = {
    
    44
    +      observe: (subject, topic, data) => {
    
    45
    +        if (topic !== this._observeTopic) {
    
    46
    +          return;
    
    47
    +        }
    
    48
    +        this._torConnectStateChanged();
    
    49
    +      },
    
    50
    +    };
    
    51
    +    Services.obs.addObserver(this._stateListener, this._observeTopic);
    
    52
    +
    
    53
    +    this._torConnectStateChanged();
    
    54
    +  },
    
    55
    +
    
    56
    +  /**
    
    57
    +   * De-initialize the component.
    
    58
    +   */
    
    59
    +  deinit() {
    
    60
    +    Services.obs.removeObserver(this._stateListener, this._observeTopic);
    
    61
    +  },
    
    62
    +
    
    63
    +  /**
    
    64
    +   * Callback for when the TorConnect state changes.
    
    65
    +   */
    
    66
    +  _torConnectStateChanged() {
    
    67
    +    let textId;
    
    68
    +    let connected = false;
    
    69
    +    let potentiallyBlocked = false;
    
    70
    +    switch (TorConnect.state) {
    
    71
    +      case TorConnectState.Disabled:
    
    72
    +        // Hide immediately.
    
    73
    +        this.node.hidden = true;
    
    74
    +        return;
    
    75
    +      case TorConnectState.Bootstrapped:
    
    76
    +        this._startHiding();
    
    77
    +        textId = "titlebarStatusConnected";
    
    78
    +        connected = true;
    
    79
    +        break;
    
    80
    +      case TorConnectState.Bootstrapping:
    
    81
    +      case TorConnectState.AutoBootstrapping:
    
    82
    +        textId = "titlebarStatusConnecting";
    
    83
    +        break;
    
    84
    +      default:
    
    85
    +        if (TorConnect.potentiallyBlocked) {
    
    86
    +          textId = "titlebarStatusPotentiallyBlocked";
    
    87
    +          potentiallyBlocked = true;
    
    88
    +        } else {
    
    89
    +          textId = "titlebarStatusNotConnected";
    
    90
    +        }
    
    91
    +        break;
    
    92
    +    }
    
    93
    +    this.label.textContent = this._strings[textId];
    
    94
    +    this.icon.setAttribute(
    
    95
    +      "src",
    
    96
    +      connected
    
    97
    +        ? "chrome://browser/content/torconnect/onion.svg"
    
    98
    +        : "chrome://browser/content/torconnect/onion-slash-fillable.svg"
    
    99
    +    );
    
    100
    +    this.icon.classList.toggle("tor-connect-status-connected", connected);
    
    101
    +    this.icon.classList.toggle(
    
    102
    +      "tor-connect-status-potentially-blocked",
    
    103
    +      potentiallyBlocked
    
    104
    +    );
    
    105
    +  },
    
    106
    +
    
    107
    +  /**
    
    108
    +   * Mark the component to be hidden after some delay.
    
    109
    +   */
    
    110
    +  _startHiding() {
    
    111
    +    setTimeout(() => {
    
    112
    +      this.node.hidden = true;
    
    113
    +    }, 5000);
    
    114
    +  },
    
    115
    +};

  • browser/components/torconnect/content/torConnectUrlbarButton.js
    1
    +/* eslint-env mozilla/browser-window */
    
    2
    +
    
    3
    +/**
    
    4
    + * A "Connect" button shown in the urlbar when not connected to tor and in tabs
    
    5
    + * other than about:torconnect.
    
    6
    + */
    
    7
    +var gTorConnectUrlbarButton = {
    
    8
    +  /**
    
    9
    +   * The urlbar button node.
    
    10
    +   *
    
    11
    +   * @type {Element}
    
    12
    +   */
    
    13
    +  button: null,
    
    14
    +  /**
    
    15
    +   * Whether we are active.
    
    16
    +   *
    
    17
    +   * @type {boolean}
    
    18
    +   */
    
    19
    +  _isActive: false,
    
    20
    +  /**
    
    21
    +   * Whether we are in the "about:torconnect" tab.
    
    22
    +   *
    
    23
    +   * @type {boolean}
    
    24
    +   */
    
    25
    +  // We init to "true" so that the button can only appear after the first page
    
    26
    +  // load.
    
    27
    +  _inAboutTorConnectTab: true,
    
    28
    +
    
    29
    +  /**
    
    30
    +   * Initialize the button.
    
    31
    +   */
    
    32
    +  init() {
    
    33
    +    if (this._isActive) {
    
    34
    +      return;
    
    35
    +    }
    
    36
    +    this._isActive = true;
    
    37
    +
    
    38
    +    const { TorStrings } = ChromeUtils.import(
    
    39
    +      "resource:///modules/TorStrings.jsm"
    
    40
    +    );
    
    41
    +
    
    42
    +    this.button = document.getElementById("tor-connect-urlbar-button");
    
    43
    +    document.getElementById("tor-connect-urlbar-button-label").value =
    
    44
    +      TorStrings.torConnect.torConnectButton;
    
    45
    +    this.button.addEventListener("click", event => {
    
    46
    +      if (event.button !== 0) {
    
    47
    +        return;
    
    48
    +      }
    
    49
    +      this.connect();
    
    50
    +    });
    
    51
    +    this.button.addEventListener("keydown", event => {
    
    52
    +      if (event.key !== "Enter" && event.key !== " ") {
    
    53
    +        return;
    
    54
    +      }
    
    55
    +      this.connect();
    
    56
    +    });
    
    57
    +
    
    58
    +    this._observeTopic = TorConnectTopics.StateChange;
    
    59
    +    this._stateListener = {
    
    60
    +      observe: (subject, topic, data) => {
    
    61
    +        if (topic !== this._observeTopic) {
    
    62
    +          return;
    
    63
    +        }
    
    64
    +        this._torConnectStateChanged();
    
    65
    +      },
    
    66
    +    };
    
    67
    +    Services.obs.addObserver(this._stateListener, this._observeTopic);
    
    68
    +
    
    69
    +    this._locationListener = {
    
    70
    +      onLocationChange: (webProgress, request, locationURI, flags) => {
    
    71
    +        if (
    
    72
    +          webProgress.isTopLevel &&
    
    73
    +          !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT)
    
    74
    +        ) {
    
    75
    +          this._inAboutTorConnectTab = gBrowser.selectedBrowser.currentURI?.spec.startsWith(
    
    76
    +            "about:torconnect"
    
    77
    +          );
    
    78
    +          this._updateButtonVisibility();
    
    79
    +        }
    
    80
    +      },
    
    81
    +    };
    
    82
    +    // Notified of new locations for the currently selected browser (tab) *and*
    
    83
    +    // switching selected browser.
    
    84
    +    gBrowser.addProgressListener(this._locationListener);
    
    85
    +
    
    86
    +    this._torConnectStateChanged();
    
    87
    +  },
    
    88
    +
    
    89
    +  /**
    
    90
    +   * Deactivate and de-initialize the button.
    
    91
    +   */
    
    92
    +  deinit() {
    
    93
    +    if (!this._isActive) {
    
    94
    +      return;
    
    95
    +    }
    
    96
    +    this._isActive = false;
    
    97
    +
    
    98
    +    Services.obs.removeObserver(this._stateListener, this._observeTopic);
    
    99
    +    gBrowser.removeProgressListener(this._locationListener);
    
    100
    +    this._updateButtonVisibility();
    
    101
    +  },
    
    102
    +
    
    103
    +  /**
    
    104
    +   * Begin the tor connection bootstrapping process.
    
    105
    +   */
    
    106
    +  connect() {
    
    107
    +    TorConnect.openTorConnect({ beginBootstrap: true });
    
    108
    +  },
    
    109
    +
    
    110
    +  /**
    
    111
    +   * Callback for when the TorConnect state changes.
    
    112
    +   */
    
    113
    +  _torConnectStateChanged() {
    
    114
    +    if (
    
    115
    +      TorConnect.state === TorConnectState.Bootstrapped ||
    
    116
    +      TorConnect.state === TorConnectState.Disabled
    
    117
    +    ) {
    
    118
    +      this.deinit();
    
    119
    +      return;
    
    120
    +    }
    
    121
    +    this._updateButtonVisibility();
    
    122
    +  },
    
    123
    +
    
    124
    +  /**
    
    125
    +   * Callback when the TorConnect state, current browser location, or activation
    
    126
    +   * state changes.
    
    127
    +   */
    
    128
    +  _updateButtonVisibility() {
    
    129
    +    if (!this.button) {
    
    130
    +      return;
    
    131
    +    }
    
    132
    +    // NOTE: We do not manage focus when hiding the button. We only expect to
    
    133
    +    // move from "not hidden" to "hidden" when:
    
    134
    +    // + switching tabs to "about:torconnect", or
    
    135
    +    // + starting bootstrapping.
    
    136
    +    //
    
    137
    +    // When switching tabs, the normal tab switching logic will eventually move
    
    138
    +    // focus to the new tab or url bar, so whilst the focus may be lost
    
    139
    +    // temporarily when we hide the button, it will be re-established quickly on
    
    140
    +    // tab switch.
    
    141
    +    //
    
    142
    +    // And we don't expect bootstrapping to start whilst outside of the
    
    143
    +    // "about:torconnect", and the automatic bootstrapping should only trigger
    
    144
    +    // at the initial start.
    
    145
    +    this.button.hidden =
    
    146
    +      !this._isActive ||
    
    147
    +      this._inAboutTorConnectTab ||
    
    148
    +      !TorConnect.enabled ||
    
    149
    +      !TorConnect.canBeginBootstrap;
    
    150
    +    this.button.classList.toggle(
    
    151
    +      "tor-urlbar-button-plain",
    
    152
    +      TorConnect.potentiallyBlocked
    
    153
    +    );
    
    154
    +  },
    
    155
    +};

  • browser/components/torconnect/content/torconnect-urlbar.css deleted
    1
    -/*
    
    2
    -    ensure our torconnect button is always visible (same rule as for the bookmark button)
    
    3
    -*/
    
    4
    -label#torconnect-label {
    
    5
    -    margin: 0;
    
    6
    -    opacity: 0.6;
    
    7
    -    padding: 0 0.5em;
    
    8
    -}
    
    9
    -
    
    10
    -hbox.urlbar-page-action#torconnect-box {
    
    11
    -    display: -moz-inline-box!important;
    
    12
    -}
    
    13
    -
    
    14
    -/* hide when hidden attribute is set */
    
    15
    -hbox.urlbar-page-action#torconnect-box[hidden="true"],
    
    16
    -/* hide when user is typing in URL bar */
    
    17
    -#urlbar[usertyping] > #urlbar-input-container > #page-action-buttons > #torconnect-box {
    
    18
    -    display: none!important;
    
    19
    -}
    
    20
    -
    
    21
    -/* hide urlbar's placeholder text when not connectd to tor */
    
    22
    -hbox#urlbar-input-container[torconnect="offline"] input#urlbar-input::placeholder,
    
    23
    -hbox#urlbar-input-container[torconnect="connecting"] input#urlbar-input::placeholder {
    
    24
    -    opacity: 0;
    
    25
    -}
    
    26
    -
    
    27
    -/* hide search suggestions when not connected to tor */
    
    28
    -hbox#urlbar-input-container[torconnect="offline"] + vbox.urlbarView,
    
    29
    -hbox#urlbar-input-container[torconnect="connecting"] + vbox.urlbarView {
    
    30
    -    display: none!important;
    
    31
    -}
    
    32
    -
    
    33
    -/* hide search icon when we are not connected to tor */
    
    34
    -hbox#urlbar-input-container[torconnect="offline"] > #identity-box[pageproxystate="invalid"] > #identity-icon,
    
    35
    -hbox#urlbar-input-container[torconnect="connecting"] > #identity-box[pageproxystate="invalid"] > #identity-icon {
    
    36
    -    display: none!important;
    
    37
    -}

  • browser/components/torconnect/content/torconnect-urlbar.inc.xhtml deleted
    1
    -# Copyright (c) 2021, The Tor Project, Inc.
    
    2
    -
    
    3
    -<hbox id="torconnect-box"
    
    4
    -      class="urlbar-icon-wrapper urlbar-page-action"
    
    5
    -      role="status"
    
    6
    -      align="center"
    
    7
    -      hidden="true">
    
    8
    -    <hbox id="torconnect-container">
    
    9
    -        <label id="torconnect-label"/>
    
    10
    -    </hbox>
    
    11
    -</hbox>
    \ No newline at end of file

  • browser/components/torconnect/jar.mn
    1 1
     browser.jar:
    
    2
    -    content/browser/torconnect/torBootstrapUrlbar.js               (content/torBootstrapUrlbar.js)
    
    2
    +    content/browser/torconnect/torConnectUrlbarButton.js           (content/torConnectUrlbarButton.js)
    
    3
    +    content/browser/torconnect/torConnectTitlebarStatus.js         (content/torConnectTitlebarStatus.js)
    
    4
    +    content/browser/torconnect/torConnectTitlebarStatus.css        (content/torConnectTitlebarStatus.css)
    
    3 5
         content/browser/torconnect/aboutTorConnect.css                 (content/aboutTorConnect.css)
    
    4 6
     *   content/browser/torconnect/aboutTorConnect.xhtml               (content/aboutTorConnect.xhtml)
    
    5 7
         content/browser/torconnect/aboutTorConnect.js                  (content/aboutTorConnect.js)
    
    ... ... @@ -8,6 +10,4 @@ browser.jar:
    8 10
         content/browser/torconnect/connection-failure.svg              (content/connection-failure.svg)
    
    9 11
         content/browser/torconnect/connection-location.svg             (content/connection-location.svg)
    
    10 12
         content/browser/torconnect/onion.svg                           (content/onion.svg)
    
    11
    -    content/browser/torconnect/onion-slash.svg                     (content/onion-slash.svg)
    
    12 13
         content/browser/torconnect/onion-slash-fillable.svg            (content/onion-slash-fillable.svg)
    13
    -    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 {
    58 58
     
    
    59 59
     #torPreferences-connectMessageBox.error #torPreferences-connectMessageBox-icon
    
    60 60
     {
    
    61
    -  mask: url("chrome://browser/skin/onion-slash.svg");
    
    61
    +  mask: url("chrome://browser/content/torconnect/onion-slash-fillable.svg");
    
    62 62
       background-color: white;
    
    63 63
     }
    
    64 64
     
    

  • browser/modules/TorConnect.jsm
    ... ... @@ -99,7 +99,7 @@ const TorConnectState = Object.freeze({
    99 99
       └─┼─────▶ │                                                          │  │
    
    100 100
         │       └──────────────────────────────────────────────────────────┘  │
    
    101 101
         │         │                        ▲                                  │
    
    102
    -    │         │ beginAutoBootstrap()   │ cancelAutoBootstrap()            │
    
    102
    +    │         │ beginAutoBootstrap()   │ cancelBootstrap()                
    
    103 103
         │         ▼                        │                                  │
    
    104 104
         │       ┌───────────────────────┐  │                                  │
    
    105 105
         └────── │   AutoBootstrapping   │ ─┘                                  │
    
    ... ... @@ -464,6 +464,7 @@ const TorConnect = (() => {
    464 464
     
    
    465 465
                   const tbr = new TorBootstrapRequest();
    
    466 466
                   const internetTest = new InternetTest();
    
    467
    +              let cancelled = false;
    
    467 468
     
    
    468 469
                   let bootstrapError = "";
    
    469 470
                   let bootstrapErrorDetails = "";
    
    ... ... @@ -506,6 +507,7 @@ const TorConnect = (() => {
    506 507
                   this.on_transition = async nextState => {
    
    507 508
                     if (nextState === TorConnectState.Configuring) {
    
    508 509
                       // stop bootstrap process if user cancelled
    
    510
    +                  cancelled = true;
    
    509 511
                       internetTest.cancel();
    
    510 512
                       await tbr.cancel();
    
    511 513
                     }
    
    ... ... @@ -520,6 +522,19 @@ const TorConnect = (() => {
    520 522
                     TorConnect._changeState(TorConnectState.Bootstrapped);
    
    521 523
                   };
    
    522 524
                   tbr.onbootstraperror = (message, details) => {
    
    525
    +                if (cancelled) {
    
    526
    +                  // We ignore this error since it occurred after cancelling (by
    
    527
    +                  // the user). We assume the error is just a side effect of the
    
    528
    +                  // cancelling.
    
    529
    +                  // E.g. If the cancelling is triggered late in the process, we
    
    530
    +                  // get "Building circuits: Establishing a Tor circuit failed".
    
    531
    +                  // TODO: Maybe move this logic deeper in the process to know
    
    532
    +                  // when to filter out such errors triggered by cancelling.
    
    533
    +                  console.log(
    
    534
    +                    `TorConnect: Post-cancel error => ${message}; ${details}`
    
    535
    +                  );
    
    536
    +                  return;
    
    537
    +                }
    
    523 538
                     // We have to wait for the Internet test to finish before sending the bootstrap error
    
    524 539
                     bootstrapError = message;
    
    525 540
                     bootstrapErrorDetails = details;
    
    ... ... @@ -1023,11 +1038,6 @@ const TorConnect = (() => {
    1023 1038
           this._changeState(TorConnectState.AutoBootstrapping, countryCode);
    
    1024 1039
         },
    
    1025 1040
     
    
    1026
    -    cancelAutoBootstrap() {
    
    1027
    -      console.log("TorConnect: cancelAutoBootstrap()");
    
    1028
    -      this._changeState(TorConnectState.Configuring);
    
    1029
    -    },
    
    1030
    -
    
    1031 1041
         /*
    
    1032 1042
             Further external commands and helper methods
    
    1033 1043
             */
    

  • browser/modules/TorStrings.jsm
    ... ... @@ -207,10 +207,6 @@ const Loader = {
    207 207
     
    
    208 208
           torConnecting: "Establishing a Connection",
    
    209 209
     
    
    210
    -      torNotConnectedConcise: "Not Connected",
    
    211
    -
    
    212
    -      torConnectingConcise: "Connecting…",
    
    213
    -
    
    214 210
           tryingAgain: "Trying again…",
    
    215 211
     
    
    216 212
           noInternet: "Tor Browser couldn’t reach the Internet",
    
    ... ... @@ -250,8 +246,6 @@ const Loader = {
    250 246
     
    
    251 247
           torConnected: "Connected to the Tor network",
    
    252 248
     
    
    253
    -      torConnectedConcise: "Connected",
    
    254
    -
    
    255 249
           tryAgain: "Try Again",
    
    256 250
     
    
    257 251
           // tor connect strings for message box in about:preferences#connection
    
    ... ... @@ -275,6 +269,13 @@ const Loader = {
    275 269
           autoBootstrappingAllFailed: "None of the configurations we tried worked",
    
    276 270
           cannotDetermineCountry: "Unable to determine user country",
    
    277 271
           noSettingsForCountry: "No settings available for your location",
    
    272
    +
    
    273
    +      // Titlebar status.
    
    274
    +      titlebarStatusName: "Tor connection",
    
    275
    +      titlebarStatusNotConnected: "Not connected",
    
    276
    +      titlebarStatusConnecting: "Connecting…",
    
    277
    +      titlebarStatusPotentiallyBlocked: "Potentially blocked",
    
    278
    +      titlebarStatusConnected: "Connected",
    
    278 279
         };
    
    279 280
     
    
    280 281
         const tsb = new TorPropertyStringBundle(
    

  • browser/themes/shared/browser-shared.css
    ... ... @@ -23,8 +23,8 @@
    23 23
     @import url("chrome://browser/skin/UITour.css");
    
    24 24
     @import url("chrome://browser/skin/browser-colors.css");
    
    25 25
     @import url("chrome://branding/content/tor-styles.css");
    
    26
    -@import url("chrome://browser/skin/torconnect-urlbar.css");
    
    27 26
     @import url("chrome://browser/skin/onionlocation.css");
    
    27
    +@import url("chrome://browser/skin/tor-urlbar-button.css");
    
    28 28
     
    
    29 29
     @namespace html url("http://www.w3.org/1999/xhtml");
    
    30 30
     
    

  • browser/themes/shared/identity-block/onion-slash.svg
    1
    -<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    
    2
    -<svg viewBox="0 0 16 16" width="16" height="16" xmlns="http://www.w3.org/2000/svg">
    
    3
    -  <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" />
    
    4
    -  <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"/>
    
    1
    +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
    
    2
    +<g clip-path="url(#clip0_1827_6565)">
    
    3
    +<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"/>
    
    4
    +<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"/>
    
    5
    +<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"/>
    
    6
    +<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"/>
    
    7
    +<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"/>
    
    8
    +<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"/>
    
    9
    +<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"/>
    
    10
    +</g>
    
    11
    +<defs>
    
    12
    +<clipPath id="clip0_1827_6565">
    
    13
    +<rect width="16" height="16" fill="white"/>
    
    14
    +</clipPath>
    
    15
    +</defs>
    
    5 16
     </svg>

  • browser/themes/shared/identity-block/onion-warning.svg
    1
    -<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    
    2
    -<svg viewBox="0 0 16 16" width="16" height="16"  xmlns="http://www.w3.org/2000/svg">
    
    3
    -  <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"/>
    
    1
    +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
    
    2
    +<g clip-path="url(#clip0_1827_6566)">
    
    3
    +<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"/>
    
    4
    +<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"/>
    
    5
    +<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"/>
    
    6
    +<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"/>
    
    7
    +</g>
    
    8
    +<defs>
    
    9
    +<clipPath id="clip0_1827_6566">
    
    10
    +<rect width="16" height="16" fill="white"/>
    
    11
    +</clipPath>
    
    12
    +</defs>
    
    4 13
     </svg>

  • browser/themes/shared/identity-block/onion.svg
    1
    -<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    
    2
    -<svg viewBox="0 0 16 16" width="16" height="16" xmlns="http://www.w3.org/2000/svg">
    
    3
    -  <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"/>
    
    1
    +<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
    
    2
    +<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"/>
    
    3
    +<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"/>
    
    4
    +<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"/>
    
    4 5
     </svg>

  • browser/themes/shared/jar.inc.mn
    ... ... @@ -32,6 +32,7 @@
    32 32
       skin/classic/browser/tabs.css                                (../shared/tabs.css)
    
    33 33
       skin/classic/browser/toolbarbuttons.css                      (../shared/toolbarbuttons.css)
    
    34 34
       skin/classic/browser/toolbarbutton-icons.css                 (../shared/toolbarbutton-icons.css)
    
    35
    +  skin/classic/browser/tor-urlbar-button.css                   (../shared/tor-urlbar-button.css)
    
    35 36
       skin/classic/browser/urlbar-dynamic-results.css              (../shared/urlbar-dynamic-results.css)
    
    36 37
       skin/classic/browser/urlbar-searchbar.css                    (../shared/urlbar-searchbar.css)
    
    37 38
       skin/classic/browser/urlbarView.css                          (../shared/urlbarView.css)
    

  • browser/themes/shared/tor-urlbar-button.css
    1
    +.tor-urlbar-button:not([hidden]) {
    
    2
    +  --tor-urlbar-button-background-color: var(--purple-60);
    
    3
    +  background-color: var(--tor-urlbar-button-background-color);
    
    4
    +  /* FIXME: Use different colors for light and dark theme, rather than "white".
    
    5
    +   * See tor-browser#41787 */
    
    6
    +  color: white;
    
    7
    +  display: flex;
    
    8
    +  align-items: center;
    
    9
    +  gap: 0.5em;
    
    10
    +  border-radius: var(--urlbar-icon-border-radius);
    
    11
    +  --tor-urlbar-button-inline-padding: 8px;
    
    12
    +  padding-inline: var(--tor-urlbar-button-inline-padding);
    
    13
    +  margin: 0;
    
    14
    +}
    
    15
    +
    
    16
    +.tor-urlbar-button > * {
    
    17
    +  flex: 0 0 auto;
    
    18
    +  margin: 0;
    
    19
    +}
    
    20
    +
    
    21
    +.tor-urlbar-button:focus-visible {
    
    22
    +  /* This button lies within the urlbar, so if the outline extends beyond the
    
    23
    +   * button's boundary, it will be clipped by the urlbar.
    
    24
    +   * Most button's in the urlbar get around this by using --focus-outline-inset,
    
    25
    +   * but our button has a purple background, which does not contrast well with
    
    26
    +   * the focus outline.
    
    27
    +   * Therefore, we use an offset outline rather than an inset outline, and
    
    28
    +   * compensate by shrinking the button's width and height so that the outline
    
    29
    +   * fits within the non-focused button boundary. Essentially, this has a
    
    30
    +   * similar effect to using an inset outline that matches the color of the
    
    31
    +   * urlbar background, but we keep the rounded corners. */
    
    32
    +  outline: var(--focus-outline);
    
    33
    +  outline-offset: var(--focus-outline-offset);
    
    34
    +  /* Use the background color for the outline, same as in-content buttons. */
    
    35
    +  outline-color: var(--tor-urlbar-button-background-color);
    
    36
    +  /* Calculate the difference between the button's border area and the outline
    
    37
    +   * area. */
    
    38
    +  --tor-urlbar-focus-outline-difference: calc(
    
    39
    +    var(--focus-outline-offset)
    
    40
    +    + var(--focus-outline-width)
    
    41
    +  );
    
    42
    +  /* For the inline direction, we shrink the padding by the difference, and
    
    43
    +   * increase the margin by the same amount so that the button text remains in
    
    44
    +   * the same position.
    
    45
    +   * For the block direction, the height of the button is flexibly sized with
    
    46
    +   * the urlbar height, so we should only need to increase the margin. */
    
    47
    +  padding-inline: calc(
    
    48
    +    var(--tor-urlbar-button-inline-padding)
    
    49
    +    - var(--tor-urlbar-focus-outline-difference)
    
    50
    +  );
    
    51
    +  margin: var(--tor-urlbar-focus-outline-difference);
    
    52
    +}
    
    53
    +
    
    54
    +.tor-urlbar-button:focus-visible > * {
    
    55
    +  /* Negate the margin that would be added on focus to ensure the button does
    
    56
    +   * not grow in height.
    
    57
    +   * Ideally, this should not change anything noticeable, otherwise the text
    
    58
    +   * could be clipped when focused. */
    
    59
    +  margin-block: calc(-1 * var(--tor-urlbar-focus-outline-difference));
    
    60
    +}
    
    61
    +
    
    62
    +#urlbar[usertyping] .tor-urlbar-button {
    
    63
    +  /* Hide whilst the user is typing in the url bar. */
    
    64
    +  display: none;
    
    65
    +}
    
    66
    +
    
    67
    +.tor-urlbar-button:hover {
    
    68
    +  --tor-urlbar-button-background-color: var(--purple-70);
    
    69
    +}
    
    70
    +
    
    71
    +.tor-urlbar-button:hover:active {
    
    72
    +  --tor-urlbar-button-background-color: var(--purple-80);
    
    73
    +}
    
    74
    +
    
    75
    +@media (prefers-color-scheme: dark) {
    
    76
    +  .tor-urlbar-button {
    
    77
    +    --tor-urlbar-button-background-color: var(--purple-50);
    
    78
    +  }
    
    79
    +
    
    80
    +  .tor-urlbar-button:hover {
    
    81
    +    --tor-urlbar-button-background-color: var(--purple-60);
    
    82
    +  }
    
    83
    +
    
    84
    +  .tor-urlbar-button:hover:active {
    
    85
    +    --tor-urlbar-button-background-color: var(--purple-70);
    
    86
    +  }
    
    87
    +}
    
    88
    +
    
    89
    +/* Make the button look plain like the identity #urlbar-label-box. */
    
    90
    +.tor-urlbar-button.tor-urlbar-button-plain {
    
    91
    +  --tor-urlbar-button-background-color: var(--urlbar-box-bgcolor);
    
    92
    +  color: var(--urlbar-box-text-color);
    
    93
    +}
    
    94
    +
    
    95
    +.tor-urlbar-button.tor-urlbar-button-plain:focus-visible {
    
    96
    +  outline-color: var(--focus-outline-color);
    
    97
    +}
    
    98
    +
    
    99
    +.tor-urlbar-button.tor-urlbar-button-plain:hover {
    
    100
    +  --tor-urlbar-button-background-color: var(--urlbar-box-hover-bgcolor);
    
    101
    +  color: var(--urlbar-box-hover-text-color);
    
    102
    +}
    
    103
    +
    
    104
    +.tor-urlbar-button.tor-urlbar-button-plain:hover:active {
    
    105
    +  --tor-urlbar-button-background-color: var(--urlbar-box-active-bgcolor);
    
    106
    +  color: var(--urlbar-box-hover-text-color);
    
    107
    +}

  • devtools/shared/webconsole/network-helper.js
    ... ... @@ -600,6 +600,9 @@ var NetworkHelper = {
    600 600
     
    
    601 601
         // The request did not contain any security info.
    
    602 602
         if (!securityInfo) {
    
    603
    +      if (httpActivity.hostname && httpActivity.hostname.endsWith(".onion")) {
    
    604
    +        info.state = "secure";
    
    605
    +      }
    
    603 606
           return info;
    
    604 607
         }
    
    605 608
     
    
    ... ... @@ -651,7 +654,11 @@ var NetworkHelper = {
    651 654
             // schemes other than https and wss are subject to
    
    652 655
             // downgrade/etc at the scheme level and should always be
    
    653 656
             // considered insecure
    
    654
    -        info.state = "insecure";
    
    657
    +        if (httpActivity.hostname && httpActivity.hostname.endsWith(".onion")) {
    
    658
    +          info.state = "secure";
    
    659
    +        } else {
    
    660
    +          info.state = "insecure";
    
    661
    +        }
    
    655 662
           } else if (state & wpl.STATE_IS_SECURE) {
    
    656 663
             // The connection is secure if the scheme is sufficient
    
    657 664
             info.state = "secure";
    

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

  • toolkit/torbutton/chrome/locale/en-US/torConnect.properties
    ... ... @@ -3,10 +3,14 @@
    3 3
     # License, v. 2.0. If a copy of the MPL was not distributed with this
    
    4 4
     # file, You can obtain one at http://mozilla.org/MPL/2.0/.
    
    5 5
     
    
    6
    +torConnect.titlebarStatusName=Tor connection
    
    7
    +torConnect.titlebarStatusNotConnected=Not connected
    
    8
    +torConnect.titlebarStatusConnecting=Connecting…
    
    9
    +torConnect.titlebarStatusPotentiallyBlocked=Potentially blocked
    
    10
    +torConnect.titlebarStatusConnected=Connected
    
    11
    +
    
    6 12
     torConnect.torConnect=Connect to Tor
    
    7 13
     torConnect.torConnecting=Establishing a Connection
    
    8
    -torConnect.torNotConnectedConcise=Not Connected
    
    9
    -torConnect.torConnectingConcise=Connecting…
    
    10 14
     torConnect.tryingAgain=Trying again…
    
    11 15
     torConnect.noInternet=Tor Browser couldn’t reach the Internet
    
    12 16
     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…
    35 39
     torConnect.torConnectButton=Connect
    
    36 40
     torConnect.cancel=Cancel
    
    37 41
     torConnect.torConnected=Connected to the Tor network!
    
    38
    -torConnect.torConnectedConcise=Connected
    
    39 42
     torConnect.tryAgain=Try Again
    
    40 43
     torConnect.connectMessage=Changes to Tor Settings will not take effect until you connect
    
    41 44
     torConnect.tryAgainMessage=Tor Browser has failed to establish a connection to the Tor Network
    
    ... ... @@ -51,3 +54,8 @@ torConnect.autoBootstrappingFailed=Automatic configuration failed
    51 54
     torConnect.autoBootstrappingAllFailed=None of the configurations we tried worked
    
    52 55
     torConnect.cannotDetermineCountry=Unable to determine user country
    
    53 56
     torConnect.noSettingsForCountry=No settings available for your location
    
    57
    +
    
    58
    +# Urlbar strings used up to 12.0 - TODO: remove when 12.5 becomes stable:
    
    59
    +torConnect.torNotConnectedConcise=Not Connected
    
    60
    +torConnect.torConnectingConcise=Connecting…
    
    61
    +torConnect.torConnectedConcise=Connected

  • tools/update-packaging/common.sh
    ... ... @@ -108,6 +108,28 @@ make_add_if_not_instruction() {
    108 108
       echo "add-if-not \"$f\" \"$f\"" >> "$filev3"
    
    109 109
     }
    
    110 110
     
    
    111
    +check_for_add_if_update() {
    
    112
    +  add_if_file_chk="$1"
    
    113
    +
    
    114
    +  # tor-browser#41776: We will remove with the old fontconfig file manually
    
    115
    +  # outside the update process. So, let the updater add the file if there.
    
    116
    +  # TODO: Remove once we do a watershed release.
    
    117
    +  if [ "$add_if_file_chk" = "TorBrowser/Data/fontconfig/fonts.conf" ]; then
    
    118
    +    ## "true" *giggle*
    
    119
    +    return 0;
    
    120
    +  fi
    
    121
    +  ## 'false'... because this is bash. Oh yay!
    
    122
    +  return 1;
    
    123
    +}
    
    124
    +
    
    125
    +make_add_if_instruction() {
    
    126
    +  f="$1"
    
    127
    +  filev3="$2"
    
    128
    +
    
    129
    +  verbose_notice " add-if \"$f\" \"$f\""
    
    130
    +  echo "add-if \"$f\" \"$f\"" >> "$filev3"
    
    131
    +}
    
    132
    +
    
    111 133
     make_addsymlink_instruction() {
    
    112 134
       link="$1"
    
    113 135
       target="$2"
    

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

  • tools/update-packaging/make_incremental_update.sh
    ... ... @@ -220,6 +220,17 @@ for ((i=0; $i<$num_oldfiles; i=$i+1)); do
    220 220
           continue 1
    
    221 221
         fi
    
    222 222
     
    
    223
    +    if check_for_add_if_update "$f"; then
    
    224
    +      # TODO: Remove once we do a watershed release
    
    225
    +      # The full workdir may not exist yet, so create it if necessary.
    
    226
    +      mkdir -p `dirname "$workdir/$f"`
    
    227
    +      $XZ $XZ_OPT --compress $BCJ_OPTIONS --lzma2 --format=xz --check=crc64 --force --stdout "$newdir/$f" > "$workdir/$f"
    
    228
    +      copy_perm "$newdir/$f" "$workdir/$f"
    
    229
    +      make_add_if_instruction "$f" "$updatemanifestv3"
    
    230
    +      archivefiles="$archivefiles \"$f\""
    
    231
    +      continue 1
    
    232
    +    fi
    
    233
    +
    
    223 234
         if check_for_forced_update "$requested_forced_updates" "$f"; then
    
    224 235
           # The full workdir may not exist yet, so create it if necessary.
    
    225 236
           mkdir -p `dirname "$workdir/$f"`
    
    ... ... @@ -328,6 +339,9 @@ for ((i=0; $i<$num_newfiles; i=$i+1)); do
    328 339
     
    
    329 340
       if check_for_add_if_not_update "$f"; then
    
    330 341
         make_add_if_not_instruction "$f" "$updatemanifestv3"
    
    342
    +  elif check_for_add_if_update "$f"; then
    
    343
    +    # TODO: Remove once we do a watershed release
    
    344
    +    make_add_if_instruction "$f" "$updatemanifestv3"
    
    331 345
       else
    
    332 346
         make_add_instruction "$f" "$updatemanifestv3"
    
    333 347
       fi