Pier Angelo Vendrame pushed to branch tor-browser-115.6.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
-
8649662e
by Pier Angelo Vendrame at 2023-12-20T19:16:35+01:00
-
7cb6472f
by Pier Angelo Vendrame at 2023-12-20T21:49:35+01:00
-
d980086a
by Pier Angelo Vendrame at 2023-12-20T21:49:46+01:00
4 changed files:
- mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorIntegrationAndroid.java
- toolkit/components/tor-launcher/TorProvider.sys.mjs
- toolkit/modules/TorAndroidIntegration.sys.mjs
- toolkit/modules/TorConnect.sys.mjs
Changes:
| ... | ... | @@ -46,6 +46,11 @@ public class TorIntegrationAndroid implements BundleEventListener { |
| 46 | 46 | private static final String EVENT_TOR_STOP = "GeckoView:Tor:StopTor";
|
| 47 | 47 | private static final String EVENT_MEEK_START = "GeckoView:Tor:StartMeek";
|
| 48 | 48 | private static final String EVENT_MEEK_STOP = "GeckoView:Tor:StopMeek";
|
| 49 | + private static final String EVENT_BOOTSTRAP_STATE_CHANGED = "GeckoView:Tor:BootstrapStateChanged";
|
|
| 50 | + private static final String EVENT_BOOTSTRAP_PROGRESS = "GeckoView:Tor:BootstrapProgress";
|
|
| 51 | + private static final String EVENT_BOOTSTRAP_COMPLETE = "GeckoView:Tor:BootstrapComplete";
|
|
| 52 | + private static final String EVENT_BOOTSTRAP_ERROR = "GeckoView:Tor:BootstrapError";
|
|
| 53 | + private static final String EVENT_SETTINGS_OPEN = "GeckoView:Tor:OpenSettings";
|
|
| 49 | 54 | |
| 50 | 55 | // Events we emit
|
| 51 | 56 | private static final String EVENT_SETTINGS_GET = "GeckoView:Tor:SettingsGet";
|
| ... | ... | @@ -106,7 +111,12 @@ public class TorIntegrationAndroid implements BundleEventListener { |
| 106 | 111 | EVENT_TOR_START,
|
| 107 | 112 | EVENT_MEEK_START,
|
| 108 | 113 | EVENT_MEEK_STOP,
|
| 109 | - EVENT_SETTINGS_READY);
|
|
| 114 | + EVENT_SETTINGS_READY,
|
|
| 115 | + EVENT_BOOTSTRAP_STATE_CHANGED,
|
|
| 116 | + EVENT_BOOTSTRAP_PROGRESS,
|
|
| 117 | + EVENT_BOOTSTRAP_COMPLETE,
|
|
| 118 | + EVENT_BOOTSTRAP_ERROR,
|
|
| 119 | + EVENT_SETTINGS_OPEN);
|
|
| 110 | 120 | }
|
| 111 | 121 | |
| 112 | 122 | @Override // BundleEventListener
|
| ... | ... | @@ -122,6 +132,32 @@ public class TorIntegrationAndroid implements BundleEventListener { |
| 122 | 132 | stopMeek(message, callback);
|
| 123 | 133 | } else if (EVENT_SETTINGS_READY.equals(event)) {
|
| 124 | 134 | loadSettings(message);
|
| 135 | + } else if (EVENT_BOOTSTRAP_STATE_CHANGED.equals(event)) {
|
|
| 136 | + String state = message.getString("state");
|
|
| 137 | + for (BootstrapStateChangeListener listener: mBootstrapStateListeners) {
|
|
| 138 | + listener.onBootstrapStateChange(state);
|
|
| 139 | + }
|
|
| 140 | + } else if (EVENT_BOOTSTRAP_PROGRESS.equals(event)) {
|
|
| 141 | + double progress = message.getDouble("progress");
|
|
| 142 | + String status = message.getString("status");
|
|
| 143 | + boolean hasWarnings = message.getBoolean("hasWarnings");
|
|
| 144 | + for (BootstrapStateChangeListener listener: mBootstrapStateListeners) {
|
|
| 145 | + listener.onBootstrapProgress(progress, status, hasWarnings);
|
|
| 146 | + }
|
|
| 147 | + } else if (EVENT_BOOTSTRAP_COMPLETE.equals(event)) {
|
|
| 148 | + for (BootstrapStateChangeListener listener: mBootstrapStateListeners) {
|
|
| 149 | + listener.onBootstrapComplete();
|
|
| 150 | + }
|
|
| 151 | + } else if (EVENT_BOOTSTRAP_ERROR.equals(event)) {
|
|
| 152 | + String msg = message.getString("message");
|
|
| 153 | + String details = message.getString("details");
|
|
| 154 | + for (BootstrapStateChangeListener listener: mBootstrapStateListeners) {
|
|
| 155 | + listener.onBootstrapError(msg, details);
|
|
| 156 | + }
|
|
| 157 | + } else if (EVENT_SETTINGS_OPEN.equals(event)) {
|
|
| 158 | + for (BootstrapStateChangeListener listener: mBootstrapStateListeners) {
|
|
| 159 | + listener.onSettingsRequested();
|
|
| 160 | + }
|
|
| 125 | 161 | }
|
| 126 | 162 | }
|
| 127 | 163 | |
| ... | ... | @@ -467,17 +503,12 @@ public class TorIntegrationAndroid implements BundleEventListener { |
| 467 | 503 | }
|
| 468 | 504 | }
|
| 469 | 505 | |
| 470 | - public static class BootstrapState {
|
|
| 471 | - // FIXME: We can do better than this :)
|
|
| 472 | - public GeckoBundle mBundle;
|
|
| 473 | - |
|
| 474 | - BootstrapState(GeckoBundle bundle) {
|
|
| 475 | - mBundle = bundle;
|
|
| 476 | - }
|
|
| 477 | - }
|
|
| 478 | - |
|
| 479 | 506 | public interface BootstrapStateChangeListener {
|
| 480 | - void onBootstrapStateChange(BootstrapState state);
|
|
| 507 | + void onBootstrapStateChange(String state);
|
|
| 508 | + void onBootstrapProgress(double progress, String status, boolean hasWarnings);
|
|
| 509 | + void onBootstrapComplete();
|
|
| 510 | + void onBootstrapError(String message, String details);
|
|
| 511 | + void onSettingsRequested();
|
|
| 481 | 512 | }
|
| 482 | 513 | |
| 483 | 514 | public @NonNull GeckoResult<GeckoBundle> getSettings() {
|
| ... | ... | @@ -514,16 +545,6 @@ public class TorIntegrationAndroid implements BundleEventListener { |
| 514 | 545 | return EventDispatcher.getInstance().queryVoid(EVENT_BOOTSTRAP_CANCEL);
|
| 515 | 546 | }
|
| 516 | 547 | |
| 517 | - public @NonNull GeckoResult<BootstrapState> getBootstrapState() {
|
|
| 518 | - return EventDispatcher.getInstance().queryBundle(EVENT_BOOTSTRAP_GET_STATE).map(new GeckoResult.OnValueMapper<>() {
|
|
| 519 | - @AnyThread
|
|
| 520 | - @Nullable
|
|
| 521 | - public BootstrapState onValue(@Nullable GeckoBundle value) throws Throwable {
|
|
| 522 | - return new BootstrapState(value);
|
|
| 523 | - }
|
|
| 524 | - });
|
|
| 525 | - }
|
|
| 526 | - |
|
| 527 | 548 | public void registerBootstrapStateChangeListener(BootstrapStateChangeListener listener) {
|
| 528 | 549 | mBootstrapStateListeners.add(listener);
|
| 529 | 550 | }
|
| ... | ... | @@ -875,10 +875,7 @@ export class TorProvider { |
| 875 | 875 | */
|
| 876 | 876 | #processBootstrapStatus(statusObj, isNotification) {
|
| 877 | 877 | // Notify observers
|
| 878 | - Services.obs.notifyObservers(
|
|
| 879 | - { wrappedJSObject: statusObj },
|
|
| 880 | - TorProviderTopics.BootstrapStatus
|
|
| 881 | - );
|
|
| 878 | + Services.obs.notifyObservers(statusObj, TorProviderTopics.BootstrapStatus);
|
|
| 882 | 879 | |
| 883 | 880 | if (statusObj.PROGRESS === 100) {
|
| 884 | 881 | this.#isBootstrapDone = true;
|
| ... | ... | @@ -25,9 +25,13 @@ const logger = new ConsoleAPI({ |
| 25 | 25 | prefix: "TorAndroidIntegration",
|
| 26 | 26 | });
|
| 27 | 27 | |
| 28 | -const EmittedEvents = Object.freeze( {
|
|
| 28 | +const EmittedEvents = Object.freeze({
|
|
| 29 | 29 | settingsReady: "GeckoView:Tor:SettingsReady",
|
| 30 | 30 | settingsChanged: "GeckoView:Tor:SettingsChanged",
|
| 31 | + bootstrapStateChanged: "GeckoView:Tor:BootstrapStateChanged",
|
|
| 32 | + bootstrapProgress: "GeckoView:Tor:BootstrapProgress",
|
|
| 33 | + bootstrapComplete: "GeckoView:Tor:BootstrapComplete",
|
|
| 34 | + bootstrapError: "GeckoView:Tor:BootstrapError",
|
|
| 31 | 35 | });
|
| 32 | 36 | |
| 33 | 37 | const ListenedEvents = Object.freeze({
|
| ... | ... | @@ -89,6 +93,30 @@ class TorAndroidIntegrationImpl { |
| 89 | 93 | }
|
| 90 | 94 | break;
|
| 91 | 95 | case lazy.TorConnectTopics.StateChange:
|
| 96 | + lazy.EventDispatcher.instance.sendRequest({
|
|
| 97 | + type: EmittedEvents.bootstrapStateChanged,
|
|
| 98 | + state: subj.wrappedJSObject.state ?? "",
|
|
| 99 | + });
|
|
| 100 | + break;
|
|
| 101 | + case lazy.TorConnectTopics.BootstrapProgress:
|
|
| 102 | + lazy.EventDispatcher.instance.sendRequest({
|
|
| 103 | + type: EmittedEvents.bootstrapProgress,
|
|
| 104 | + progress: subj.wrappedJSObject.progress ?? "",
|
|
| 105 | + status: subj.wrappedJSObject.status ?? 0,
|
|
| 106 | + hasWarnings: subj.wrappedJSObject.hasWarnings ?? false,
|
|
| 107 | + });
|
|
| 108 | + break;
|
|
| 109 | + case lazy.TorConnectTopics.BootstrapComplete:
|
|
| 110 | + lazy.EventDispatcher.instance.sendRequest({
|
|
| 111 | + type: EmittedEvents.bootstrapComplete,
|
|
| 112 | + });
|
|
| 113 | + break;
|
|
| 114 | + case lazy.TorConnectTopics.BootstrapError:
|
|
| 115 | + lazy.EventDispatcher.instance.sendRequest({
|
|
| 116 | + type: EmittedEvents.bootstrapError,
|
|
| 117 | + message: subj.wrappedJSObject.message ?? "",
|
|
| 118 | + details: subj.wrappedJSObject.details ?? "",
|
|
| 119 | + });
|
|
| 92 | 120 | break;
|
| 93 | 121 | case lazy.TorSettingsTopics.Ready:
|
| 94 | 122 | lazy.EventDispatcher.instance.sendRequest({
|
| ... | ... | @@ -7,6 +7,7 @@ import { setTimeout, clearTimeout } from "resource://gre/modules/Timer.sys.mjs"; |
| 7 | 7 | const lazy = {};
|
| 8 | 8 | |
| 9 | 9 | ChromeUtils.defineESModuleGetters(lazy, {
|
| 10 | + EventDispatcher: "resource://gre/modules/Messaging.sys.mjs",
|
|
| 10 | 11 | MoatRPC: "resource://gre/modules/Moat.sys.mjs",
|
| 11 | 12 | TorBootstrapRequest: "resource://gre/modules/TorBootstrapRequest.sys.mjs",
|
| 12 | 13 | });
|
| ... | ... | @@ -1092,6 +1093,12 @@ export const TorConnect = (() => { |
| 1092 | 1093 | Further external commands and helper methods
|
| 1093 | 1094 | */
|
| 1094 | 1095 | openTorPreferences() {
|
| 1096 | + if (TorLauncherUtil.isAndroid) {
|
|
| 1097 | + lazy.EventDispatcher.instance.sendRequest({
|
|
| 1098 | + type: "GeckoView:Tor:OpenSettings",
|
|
| 1099 | + });
|
|
| 1100 | + return;
|
|
| 1101 | + }
|
|
| 1095 | 1102 | const win = lazy.BrowserWindowTracker.getTopWindow();
|
| 1096 | 1103 | win.switchToTabHavingURI("about:preferences#connection", true);
|
| 1097 | 1104 | },
|