morgan pushed to branch tor-browser-153.0a1-16.0-2 at The Tor Project / Applications / Tor Browser
Commits:
-
36f1d1c6
by Henry Wilkes at 2026-07-14T15:24:00+00:00
-
8beb26de
by Henry Wilkes at 2026-07-14T15:24:00+00:00
-
31a4963d
by Henry Wilkes at 2026-07-14T15:24:00+00:00
10 changed files:
- browser/components/preferences/preferences.js
- browser/components/preferences/preferences.xhtml
- + browser/components/torpreferences/config/connection.mjs
- − browser/components/torpreferences/content/connectionCategory.inc.xhtml
- browser/components/torpreferences/content/connectionPane.inc.xhtml
- browser/components/torpreferences/jar.mn
- + browser/components/torpreferences/widgets/tor-connection-status.css
- + browser/components/torpreferences/widgets/tor-connection-status.mjs
- toolkit/locales/en-US/toolkit/global/tor-browser.ftl
- + tools/torbrowser/l10n/migrations/bug-45029-connection-status.py
Changes:
| ... | ... | @@ -116,6 +116,7 @@ ChromeUtils.defineESModuleGetters(this, { |
| 116 | 116 | "resource:///modules/SelectionChangedMenulist.sys.mjs",
|
| 117 | 117 | ShortcutUtils: "resource://gre/modules/ShortcutUtils.sys.mjs",
|
| 118 | 118 | SiteDataManager: "resource:///modules/SiteDataManager.sys.mjs",
|
| 119 | + TorConnect: "resource://gre/modules/TorConnect.sys.mjs",
|
|
| 119 | 120 | TransientPrefs: "resource:///modules/TransientPrefs.sys.mjs",
|
| 120 | 121 | UIState: "resource://services-sync/UIState.sys.mjs",
|
| 121 | 122 | UpdateUtils: "resource://gre/modules/UpdateUtils.sys.mjs",
|
| ... | ... | @@ -267,6 +268,16 @@ const CONFIG_PANES = Object.freeze({ |
| 267 | 268 | visible: () =>
|
| 268 | 269 | Services.prefs.getBoolPref("browser.settings-redesign.enabled", false),
|
| 269 | 270 | },
|
| 271 | + connection: {
|
|
| 272 | + l10nId: "tor-connection-settings-pane",
|
|
| 273 | + iconSrc: "chrome://browser/content/torconnect/tor-connect.svg",
|
|
| 274 | + groupIds: ["connectionStatus"],
|
|
| 275 | + module: "chrome://browser/content/torpreferences/config/connection.mjs",
|
|
| 276 | + visible: () => {
|
|
| 277 | + return TorConnect.enabled;
|
|
| 278 | + },
|
|
| 279 | + replaces: "connection",
|
|
| 280 | + },
|
|
| 270 | 281 | connectionSecurity: {
|
| 271 | 282 | parent: "privacy",
|
| 272 | 283 | l10nId: "preferences-connection-header",
|
| ... | ... | @@ -108,6 +108,7 @@ |
| 108 | 108 | <script type="module" src="chrome://browser/content/preferences/widgets/update-information.mjs"></script>
|
| 109 | 109 | <script type="module" src="chrome://browser/content/preferences/widgets/update-state.mjs"></script>
|
| 110 | 110 | <script type="module" src="chrome://browser/content/ipprotection/bandwidth-usage.mjs"></script>
|
| 111 | + <script type="module" src="chrome://browser/content/torpreferences/widgets/tor-connection-status.mjs"></script>
|
|
| 111 | 112 | <script src="chrome://browser/content/torpreferences/bridgemoji/BridgeEmoji.js"/>
|
| 112 | 113 | </head>
|
| 113 | 114 | |
| ... | ... | @@ -150,6 +151,11 @@ |
| 150 | 151 | iconsrc="chrome://browser/skin/preferences/category-privacy-security.svg"
|
| 151 | 152 | data-l10n-id="pane-privacy-title3">
|
| 152 | 153 | </html:moz-page-nav-button>
|
| 154 | + <html:moz-page-nav-button id="category-connection"
|
|
| 155 | + view="paneConnection"
|
|
| 156 | + iconsrc="chrome://browser/content/torconnect/tor-connect.svg"
|
|
| 157 | + data-l10n-id="tor-connection-settings-nav-button">
|
|
| 158 | + </html:moz-page-nav-button>
|
|
| 153 | 159 | <html:moz-page-nav-button id="category-passwords-autofill"
|
| 154 | 160 | view="panePasswordsAutofill"
|
| 155 | 161 | iconsrc="chrome://browser/skin/login.svg"
|
| ... | ... | @@ -220,8 +226,6 @@ |
| 220 | 226 | <!-- Hide the translations sub-pane. tor-browser#44710. -->
|
| 221 | 227 | <html:moz-page-nav-button hidden="true" class="hidden-category" view="paneTranslations"/>
|
| 222 | 228 | |
| 223 | -#include ../torpreferences/content/connectionCategory.inc.xhtml
|
|
| 224 | - |
|
| 225 | 229 | <!-- Footer links -->
|
| 226 | 230 | <html:moz-page-nav-button id="addonsButton"
|
| 227 | 231 | slot="secondary-nav"
|
| 1 | +import { SettingGroupManager } from "chrome://browser/content/preferences/config/SettingGroupManager.mjs";
|
|
| 2 | +import { Preferences } from "chrome://global/content/preferences/Preferences.mjs";
|
|
| 3 | + |
|
| 4 | +const lazy = {};
|
|
| 5 | +ChromeUtils.defineESModuleGetters(lazy, {
|
|
| 6 | + InternetStatus: "moz-src:///toolkit/modules/TorConnect.sys.mjs",
|
|
| 7 | + TorConnect: "moz-src:///toolkit/modules/TorConnect.sys.mjs",
|
|
| 8 | + TorConnectStage: "moz-src:///toolkit/modules/TorConnect.sys.mjs",
|
|
| 9 | + TorConnectTopics: "moz-src:///toolkit/modules/TorConnect.sys.mjs",
|
|
| 10 | +});
|
|
| 11 | + |
|
| 12 | +SettingGroupManager.registerGroups({
|
|
| 13 | + connectionStatus: {
|
|
| 14 | + inProgress: true,
|
|
| 15 | + l10nId: "tor-connection-internet-status-group",
|
|
| 16 | + supportPage: "tor-manual:about",
|
|
| 17 | + headingLevel: 2,
|
|
| 18 | + items: [
|
|
| 19 | + {
|
|
| 20 | + id: "connectionStatusGroup",
|
|
| 21 | + control: "moz-box-group",
|
|
| 22 | + items: [
|
|
| 23 | + {
|
|
| 24 | + id: "internetStatus",
|
|
| 25 | + control: "tor-connection-status",
|
|
| 26 | + controlAttrs: { "status-type": "internet" },
|
|
| 27 | + },
|
|
| 28 | + {
|
|
| 29 | + id: "torStatus",
|
|
| 30 | + control: "tor-connection-status",
|
|
| 31 | + controlAttrs: { "status-type": "tor" },
|
|
| 32 | + },
|
|
| 33 | + ],
|
|
| 34 | + },
|
|
| 35 | + {
|
|
| 36 | + id: "connectAutomatically",
|
|
| 37 | + l10nId: "tor-connection-quickstart-checkbox",
|
|
| 38 | + control: "moz-toggle",
|
|
| 39 | + },
|
|
| 40 | + ],
|
|
| 41 | + },
|
|
| 42 | +});
|
|
| 43 | + |
|
| 44 | +Preferences.addSetting({
|
|
| 45 | + id: "connectionStatusGroup",
|
|
| 46 | +});
|
|
| 47 | + |
|
| 48 | +Preferences.addSetting({
|
|
| 49 | + id: "internetStatus",
|
|
| 50 | + setup(emitChange) {
|
|
| 51 | + Services.obs.addObserver(
|
|
| 52 | + emitChange,
|
|
| 53 | + lazy.TorConnectTopics.InternetStatusChange
|
|
| 54 | + );
|
|
| 55 | + return () => {
|
|
| 56 | + Services.obs.removeObserver(
|
|
| 57 | + emitChange,
|
|
| 58 | + lazy.TorConnectTopics.InternetStatusChange
|
|
| 59 | + );
|
|
| 60 | + };
|
|
| 61 | + },
|
|
| 62 | + get() {
|
|
| 63 | + switch (lazy.TorConnect.internetStatus) {
|
|
| 64 | + case lazy.InternetStatus.Online:
|
|
| 65 | + return "online";
|
|
| 66 | + case lazy.InternetStatus.Offline:
|
|
| 67 | + return "offline";
|
|
| 68 | + }
|
|
| 69 | + return "unknown";
|
|
| 70 | + },
|
|
| 71 | +});
|
|
| 72 | + |
|
| 73 | +Preferences.addSetting({
|
|
| 74 | + id: "torStatus",
|
|
| 75 | + setup(emitChange) {
|
|
| 76 | + Services.obs.addObserver(emitChange, lazy.TorConnectTopics.StageChange);
|
|
| 77 | + return () => {
|
|
| 78 | + Services.obs.removeObserver(
|
|
| 79 | + emitChange,
|
|
| 80 | + lazy.TorConnectTopics.StageChange
|
|
| 81 | + );
|
|
| 82 | + };
|
|
| 83 | + },
|
|
| 84 | + get() {
|
|
| 85 | + if (lazy.TorConnect.stageName === lazy.TorConnectStage.Bootstrapped) {
|
|
| 86 | + return "connected";
|
|
| 87 | + }
|
|
| 88 | + if (lazy.TorConnect.potentiallyBlocked) {
|
|
| 89 | + return "potentially-blocked";
|
|
| 90 | + }
|
|
| 91 | + return "not-connected";
|
|
| 92 | + },
|
|
| 93 | +});
|
|
| 94 | + |
|
| 95 | +Preferences.addSetting({
|
|
| 96 | + id: "connectAutomatically",
|
|
| 97 | + setup(emitChange) {
|
|
| 98 | + Services.obs.addObserver(
|
|
| 99 | + emitChange,
|
|
| 100 | + lazy.TorConnectTopics.QuickstartChange
|
|
| 101 | + );
|
|
| 102 | + return () => {
|
|
| 103 | + Services.obs.removeObserver(
|
|
| 104 | + emitChange,
|
|
| 105 | + lazy.TorConnectTopics.QuickstartChange
|
|
| 106 | + );
|
|
| 107 | + };
|
|
| 108 | + },
|
|
| 109 | + get() {
|
|
| 110 | + return lazy.TorConnect.quickstart;
|
|
| 111 | + },
|
|
| 112 | + set(val) {
|
|
| 113 | + lazy.TorConnect.quickstart = val;
|
|
| 114 | + },
|
|
| 115 | +}); |
| 1 | -<html:moz-page-nav-button id="category-connection"
|
|
| 2 | - view="paneConnection"
|
|
| 3 | - iconsrc="chrome://browser/content/torconnect/tor-connect.svg"
|
|
| 4 | - data-l10n-id="tor-connection-settings-heading"
|
|
| 5 | - hidden="true">
|
|
| 6 | -</html:moz-page-nav-button> |
| ... | ... | @@ -10,6 +10,7 @@ |
| 10 | 10 | class="subcategory"
|
| 11 | 11 | data-category="paneConnection"
|
| 12 | 12 | hidden="true"
|
| 13 | + data-srd-groupid="connectionStatus"
|
|
| 13 | 14 | >
|
| 14 | 15 | <html:h1 data-l10n-id="tor-connection-settings-heading"></html:h1>
|
| 15 | 16 | <description class="description-deemphasized" flex="1">
|
| ... | ... | @@ -67,7 +68,11 @@ |
| 67 | 68 | </vbox>
|
| 68 | 69 | |
| 69 | 70 | <!-- Quickstart -->
|
| 70 | - <groupbox data-category="paneConnection" hidden="true">
|
|
| 71 | + <groupbox
|
|
| 72 | + data-category="paneConnection"
|
|
| 73 | + hidden="true"
|
|
| 74 | + data-srd-groupid="connectionStatus"
|
|
| 75 | + >
|
|
| 71 | 76 | <label>
|
| 72 | 77 | <html:h2 data-l10n-id="tor-connection-automatic-heading"></html:h2>
|
| 73 | 78 | </label>
|
| ... | ... | @@ -85,7 +90,12 @@ |
| 85 | 90 | </groupbox>
|
| 86 | 91 | |
| 87 | 92 | <!-- Bridges -->
|
| 88 | - <hbox class="subcategory" data-category="paneConnection" hidden="true">
|
|
| 93 | + <hbox
|
|
| 94 | + class="subcategory"
|
|
| 95 | + data-category="paneConnection"
|
|
| 96 | + hidden="true"
|
|
| 97 | + data-srd-groupid="connectionStatus"
|
|
| 98 | + >
|
|
| 89 | 99 | <html:h1
|
| 90 | 100 | id="tor-bridges-subcategory-heading-non-search"
|
| 91 | 101 | class="tor-bridges-subcategory-heading tor-focusable-heading"
|
| ... | ... | @@ -98,6 +108,7 @@ |
| 98 | 108 | data-category="paneConnection"
|
| 99 | 109 | hidden="true"
|
| 100 | 110 | aria-labelledby="tor-bridges-subcategory-heading-non-search"
|
| 111 | + data-srd-groupid="connectionStatus"
|
|
| 101 | 112 | >
|
| 102 | 113 | <!-- Add a search-header that only appears in search results as a substitute
|
| 103 | 114 | - for the hidden h1 element. See tor-browser#43320.
|
| ... | ... | @@ -580,7 +591,12 @@ |
| 580 | 591 | </groupbox>
|
| 581 | 592 | |
| 582 | 593 | <!-- Advanced -->
|
| 583 | - <hbox class="subcategory" data-category="paneConnection" hidden="true">
|
|
| 594 | + <hbox
|
|
| 595 | + class="subcategory"
|
|
| 596 | + data-category="paneConnection"
|
|
| 597 | + hidden="true"
|
|
| 598 | + data-srd-groupid="connectionStatus"
|
|
| 599 | + >
|
|
| 584 | 600 | <html:h1
|
| 585 | 601 | id="tor-advanced-subcategory-heading-non-search"
|
| 586 | 602 | data-l10n-id="tor-advanced-settings-heading"
|
| ... | ... | @@ -591,6 +607,7 @@ |
| 591 | 607 | data-category="paneConnection"
|
| 592 | 608 | hidden="true"
|
| 593 | 609 | aria-labelledby="tor-advanced-subcategory-heading-non-search"
|
| 610 | + data-srd-groupid="connectionStatus"
|
|
| 594 | 611 | >
|
| 595 | 612 | <!-- Add a search-header that only appears in search results as a substitute
|
| 596 | 613 | - for the hidden h1 element. See tor-browser#43320.
|
| ... | ... | @@ -24,9 +24,11 @@ browser.jar: |
| 24 | 24 | content/browser/torpreferences/provideBridgeDialog.js (content/provideBridgeDialog.js)
|
| 25 | 25 | content/browser/torpreferences/requestBridgeDialog.xhtml (content/requestBridgeDialog.xhtml)
|
| 26 | 26 | content/browser/torpreferences/requestBridgeDialog.js (content/requestBridgeDialog.js)
|
| 27 | - content/browser/torpreferences/connectionCategory.inc.xhtml (content/connectionCategory.inc.xhtml)
|
|
| 28 | 27 | content/browser/torpreferences/torLogDialog.js (content/torLogDialog.js)
|
| 29 | 28 | content/browser/torpreferences/torLogDialog.xhtml (content/torLogDialog.xhtml)
|
| 29 | + content/browser/torpreferences/config/connection.mjs (config/connection.mjs)
|
|
| 30 | + content/browser/torpreferences/widgets/tor-connection-status.mjs (widgets/tor-connection-status.mjs)
|
|
| 31 | + content/browser/torpreferences/widgets/tor-connection-status.css (widgets/tor-connection-status.css)
|
|
| 30 | 32 | content/browser/torpreferences/connectionPane.js (content/connectionPane.js)
|
| 31 | 33 | content/browser/torpreferences/torPreferences.css (content/torPreferences.css)
|
| 32 | 34 | content/browser/torpreferences/bridgemoji/BridgeEmoji.js (content/bridgemoji/BridgeEmoji.js)
|
| 1 | +.tor-status-container {
|
|
| 2 | + padding: var(--box-padding);
|
|
| 3 | + |
|
| 4 | + &.tor-status-icon-warning {
|
|
| 5 | + --box-icon-stroke: var(--icon-color-critical);
|
|
| 6 | + }
|
|
| 7 | +}
|
|
| 8 | + |
|
| 9 | +.tor-status-label {
|
|
| 10 | + display: flex;
|
|
| 11 | + align-items: center;
|
|
| 12 | + gap: var(--space-medium);
|
|
| 13 | + & > * {
|
|
| 14 | + flex: 0 0 auto;
|
|
| 15 | + }
|
|
| 16 | + & > p {
|
|
| 17 | + margin: 0;
|
|
| 18 | + }
|
|
| 19 | +}
|
|
| 20 | + |
|
| 21 | +.tor-status-name {
|
|
| 22 | + font-weight: var(--font-weight-semibold);
|
|
| 23 | +} |
| 1 | +import { MozBoxBase } from "chrome://global/content/lit-utils.mjs";
|
|
| 2 | +import {
|
|
| 3 | + classMap,
|
|
| 4 | + html,
|
|
| 5 | + ifDefined,
|
|
| 6 | +} from "chrome://global/content/vendor/lit.all.mjs";
|
|
| 7 | + |
|
| 8 | +const lazy = {};
|
|
| 9 | +ChromeUtils.defineESModuleGetters(lazy, {
|
|
| 10 | + TorConnectParent:
|
|
| 11 | + "moz-src:///browser/components/torconnect/TorConnectParent.sys.mjs",
|
|
| 12 | +});
|
|
| 13 | + |
|
| 14 | +/**
|
|
| 15 | + * Widget for displaying the current internet or Tor connection status.
|
|
| 16 | + *
|
|
| 17 | + * @tagname tor-connection-status
|
|
| 18 | + * @property {"internet" | "tor"} statusType - The type of status this widget is
|
|
| 19 | + * showing.
|
|
| 20 | + * @property {string} value - The current status value.
|
|
| 21 | + */
|
|
| 22 | +class TorConnectionStatus extends MozBoxBase {
|
|
| 23 | + static properties = {
|
|
| 24 | + statusType: { type: String, attribute: "status-type" },
|
|
| 25 | + value: { type: String },
|
|
| 26 | + _nameL10nId: { type: String },
|
|
| 27 | + _valueL10nId: { type: String },
|
|
| 28 | + _iconWarning: { type: Boolean },
|
|
| 29 | + _connectButton: { type: Boolean },
|
|
| 30 | + };
|
|
| 31 | + |
|
| 32 | + /**
|
|
| 33 | + * A map from the status type to it's configuration. Each configuration is
|
|
| 34 | + * used to set the internal properties depending on the current value.
|
|
| 35 | + *
|
|
| 36 | + * @type {{[key: string]: object}}
|
|
| 37 | + */
|
|
| 38 | + static #config = {
|
|
| 39 | + internet: {
|
|
| 40 | + nameL10nId: "tor-connection-internet-status-label",
|
|
| 41 | + values: {
|
|
| 42 | + online: {
|
|
| 43 | + iconSrc: "chrome://browser/content/torconnect/network.svg",
|
|
| 44 | + valueL10nId: "tor-connection-internet-status-online",
|
|
| 45 | + },
|
|
| 46 | + offline: {
|
|
| 47 | + iconSrc: "chrome://browser/content/torconnect/network-broken.svg",
|
|
| 48 | + valueL10nId: "tor-connection-internet-status-offline",
|
|
| 49 | + },
|
|
| 50 | + unknown: {
|
|
| 51 | + iconSrc: "chrome://browser/content/torconnect/network.svg",
|
|
| 52 | + valueL10nId: "tor-connection-internet-status-unknown",
|
|
| 53 | + },
|
|
| 54 | + },
|
|
| 55 | + },
|
|
| 56 | + tor: {
|
|
| 57 | + nameL10nId: "tor-connection-network-status-label",
|
|
| 58 | + values: {
|
|
| 59 | + connected: {
|
|
| 60 | + iconSrc: "chrome://browser/content/torconnect/tor-connect.svg",
|
|
| 61 | + valueL10nId: "tor-connection-network-status-connected",
|
|
| 62 | + },
|
|
| 63 | + "not-connected": {
|
|
| 64 | + iconSrc: "chrome://browser/content/torconnect/tor-connect-broken.svg",
|
|
| 65 | + valueL10nId: "tor-connection-network-status-not-connected",
|
|
| 66 | + connectButton: true,
|
|
| 67 | + },
|
|
| 68 | + "potentially-blocked": {
|
|
| 69 | + iconSrc: "chrome://browser/content/torconnect/tor-connect-broken.svg",
|
|
| 70 | + valueL10nId: "tor-connection-network-status-blocked",
|
|
| 71 | + iconWarning: true,
|
|
| 72 | + connectButton: true,
|
|
| 73 | + },
|
|
| 74 | + },
|
|
| 75 | + },
|
|
| 76 | + };
|
|
| 77 | + |
|
| 78 | + /**
|
|
| 79 | + * Whether we had focus prior to an update.
|
|
| 80 | + *
|
|
| 81 | + * @type {boolean}
|
|
| 82 | + */
|
|
| 83 | + #hadFocus = false;
|
|
| 84 | + |
|
| 85 | + willUpdate() {
|
|
| 86 | + const config = TorConnectionStatus.#config[this.statusType];
|
|
| 87 | + const valueConfig = config?.values[this.value];
|
|
| 88 | + this._nameL10nId = config?.nameL10nId;
|
|
| 89 | + this._valueL10nId = valueConfig?.valueL10nId;
|
|
| 90 | + this.iconSrc = valueConfig?.iconSrc;
|
|
| 91 | + this._iconWarning = valueConfig?.iconWarning ?? false;
|
|
| 92 | + this._connectButton = valueConfig?.connectButton ?? false;
|
|
| 93 | + this.#hadFocus = !!this.shadowRoot.activeElement;
|
|
| 94 | + }
|
|
| 95 | + |
|
| 96 | + updated() {
|
|
| 97 | + if (this.#hadFocus && !this.shadowRoot.activeElement) {
|
|
| 98 | + // Focus is lost. We move focus to the search input.
|
|
| 99 | + window.gSearchResultsPane.searchInput.focus();
|
|
| 100 | + }
|
|
| 101 | + this.#hadFocus = false;
|
|
| 102 | + }
|
|
| 103 | + |
|
| 104 | + connectButtonClick() {
|
|
| 105 | + lazy.TorConnectParent.open({ beginBootstrapping: "soft" });
|
|
| 106 | + }
|
|
| 107 | + |
|
| 108 | + connectButtonTemplate() {
|
|
| 109 | + if (!this._connectButton) {
|
|
| 110 | + return "";
|
|
| 111 | + }
|
|
| 112 | + return html`
|
|
| 113 | + <moz-button
|
|
| 114 | + data-l10n-id="tor-connection-status-connect-button"
|
|
| 115 | + @click=${this.connectButtonClick}
|
|
| 116 | + ></moz-button>
|
|
| 117 | + `;
|
|
| 118 | + }
|
|
| 119 | + |
|
| 120 | + // override MozBoxBase.labelTemplate.
|
|
| 121 | + labelTemplate() {
|
|
| 122 | + if (!this._nameL10nId) {
|
|
| 123 | + return "";
|
|
| 124 | + }
|
|
| 125 | + // NOTE: We purposefully include whitespace between the inner <span>
|
|
| 126 | + // elements so their text is separated.
|
|
| 127 | + return html`<div class="label tor-status-label">
|
|
| 128 | + <p>
|
|
| 129 | + <span
|
|
| 130 | + class="tor-status-name"
|
|
| 131 | + data-l10n-id=${this._nameL10nId}
|
|
| 132 | + ></span>
|
|
| 133 | + <span data-l10n-id=${ifDefined(this._valueL10nId)}></span>
|
|
| 134 | + </p>
|
|
| 135 | + ${this.connectButtonTemplate()}
|
|
| 136 | + </span> `;
|
|
| 137 | + }
|
|
| 138 | + |
|
| 139 | + render() {
|
|
| 140 | + if (!this._nameL10nId) {
|
|
| 141 | + return "";
|
|
| 142 | + }
|
|
| 143 | + // NOTE: textTemplate comes from MozBoxBase, which will include an icon
|
|
| 144 | + // followed by our label.
|
|
| 145 | + return html`
|
|
| 146 | + ${this.stylesTemplate()}
|
|
| 147 | + <link
|
|
| 148 | + rel="stylesheet"
|
|
| 149 | + href="chrome://browser/content/torpreferences/widgets/tor-connection-status.css"
|
|
| 150 | + />
|
|
| 151 | + <div
|
|
| 152 | + class=${classMap({
|
|
| 153 | + "tor-status-container": true,
|
|
| 154 | + "tor-status-icon-warning": this._iconWarning,
|
|
| 155 | + })}
|
|
| 156 | + >
|
|
| 157 | + ${super.textTemplate()}
|
|
| 158 | + </div>
|
|
| 159 | + `;
|
|
| 160 | + }
|
|
| 161 | +}
|
|
| 162 | +customElements.define("tor-connection-status", TorConnectionStatus); |
| ... | ... | @@ -55,10 +55,12 @@ home-mode-choice-tor = |
| 55 | 55 | |
| 56 | 56 | # "Connection" refers to the Tor Browser's connection to the Tor network.
|
| 57 | 57 | tor-connection-settings-heading = Connection
|
| 58 | -# The tooltip text for the "Connection" settings, shown in the preferences side bar.
|
|
| 59 | -# Likely should just be "{ tor-connection-settings-heading }", which will match the displayed text exactly.
|
|
| 60 | -tor-connection-settings-category =
|
|
| 61 | - .tooltiptext = { tor-connection-settings-heading }
|
|
| 58 | +# "Connection" refers to the Tor Browser's connection to the Tor network.
|
|
| 59 | +tor-connection-settings-pane =
|
|
| 60 | + .heading = Connection
|
|
| 61 | +# "Connection" refers to the Tor Browser's connection to the Tor network.
|
|
| 62 | +tor-connection-settings-nav-button = Connection
|
|
| 63 | + .title = Connection
|
|
| 62 | 64 | # -brand-short-name refers to 'Tor Browser', localized.
|
| 63 | 65 | tor-connection-overview = { -brand-short-name } routes your traffic over the Tor network, run by thousands of volunteers around the world.
|
| 64 | 66 | tor-connection-browser-learn-more-link = Learn more
|
| ... | ... | @@ -67,6 +69,10 @@ tor-connection-automatic-description = Automatically connect to the Tor network |
| 67 | 69 | tor-connection-quickstart-checkbox =
|
| 68 | 70 | .label = Always connect automatically
|
| 69 | 71 | |
| 72 | +# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser".
|
|
| 73 | +tor-connection-internet-status-group =
|
|
| 74 | + .label = Connection status
|
|
| 75 | + .description = { -brand-short-name } routes your traffic over the Tor network, run by thousands of volunteers around the world.
|
|
| 70 | 76 | # Prefix before the internet connection status.
|
| 71 | 77 | # "Internet" is not a proper noun, but is capitalized because it is the start of a sentence.
|
| 72 | 78 | tor-connection-internet-status-label = Internet:
|
| ... | ... | @@ -96,6 +102,10 @@ tor-connection-network-status-blocked = Potentially blocked |
| 96 | 102 | # It will open a page to start connecting to the Tor network.
|
| 97 | 103 | # Uses sentence case in English (US).
|
| 98 | 104 | tor-connection-network-status-connect-button = Connect
|
| 105 | +# Here "Connect" refers to connecting to the Tor network.
|
|
| 106 | +# Uses sentence case in English (US).
|
|
| 107 | +tor-connection-status-connect-button =
|
|
| 108 | + .label = Connect
|
|
| 99 | 109 | |
| 100 | 110 | ## Tor Bridges Settings.
|
| 101 | 111 |
| 1 | +from fluent.migrate.helpers import transforms_from
|
|
| 2 | + |
|
| 3 | + |
|
| 4 | +def migrate(ctx):
|
|
| 5 | + ctx.add_transforms(
|
|
| 6 | + "tor-browser.ftl",
|
|
| 7 | + "tor-browser.ftl",
|
|
| 8 | + transforms_from(
|
|
| 9 | + """
|
|
| 10 | +tor-connection-settings-pane =
|
|
| 11 | + .heading = { COPY_PATTERN(path, "tor-connection-settings-heading") }
|
|
| 12 | +tor-connection-settings-nav-button = { COPY_PATTERN(path, "tor-connection-settings-heading") }
|
|
| 13 | + .title = { COPY_PATTERN(path, "tor-connection-settings-heading") }
|
|
| 14 | +tor-connection-status-connect-button =
|
|
| 15 | + .label = { COPY_PATTERN(path, "tor-connection-network-status-connect-button") }
|
|
| 16 | +""",
|
|
| 17 | + path="tor-browser.ftl",
|
|
| 18 | + ),
|
|
| 19 | + ) |