Commits:
-
36f1d1c6
by Henry Wilkes at 2026-07-14T15:24:00+00:00
fixup! TB 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
TB 45029: Add the connection status pane to the connection settings
config.
-
8beb26de
by Henry Wilkes at 2026-07-14T15:24:00+00:00
fixup! Tor Browser strings
TB 45029: Add connection status strings.
-
31a4963d
by Henry Wilkes at 2026-07-14T15:24:00+00:00
fixup! Tor Browser localization migration scripts.
TB 45029: Migrate connection status strings.
10 changed files:
Changes:
browser/components/preferences/preferences.js
| ... |
... |
@@ -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",
|
browser/components/preferences/preferences.xhtml
| ... |
... |
@@ -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"
|
browser/components/torpreferences/config/connection.mjs
|
|
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
|
+}); |
browser/components/torpreferences/content/connectionCategory.inc.xhtml
deleted
|
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> |
browser/components/torpreferences/content/connectionPane.inc.xhtml
| ... |
... |
@@ -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.
|
browser/components/torpreferences/jar.mn
| ... |
... |
@@ -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)
|
browser/components/torpreferences/widgets/tor-connection-status.css
|
|
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
|
+} |
browser/components/torpreferences/widgets/tor-connection-status.mjs
|
|
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=""
|
|
|
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); |
toolkit/locales/en-US/toolkit/global/tor-browser.ftl
| ... |
... |
@@ -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
|
|
tools/torbrowser/l10n/migrations/bug-45029-connection-status.py
|
|
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
|
+ ) |
|