[tbb-commits] [tor-browser/geckoview-96.0-11.5-1] Bug 40069: Add helpers for message passing with extensions

sysrqb at torproject.org sysrqb at torproject.org
Thu Feb 17 20:29:07 UTC 2022


commit 82756a665a90251a8e9e26ccc73f420f9b3de6bb
Author: Alex Catarineu <acat at torproject.org>
Date:   Sun Aug 2 19:12:25 2020 +0200

    Bug 40069: Add helpers for message passing with extensions
---
 toolkit/components/extensions/ExtensionParent.jsm | 47 +++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/toolkit/components/extensions/ExtensionParent.jsm b/toolkit/components/extensions/ExtensionParent.jsm
index 4934b6cea5cb..f93abef3a51d 100644
--- a/toolkit/components/extensions/ExtensionParent.jsm
+++ b/toolkit/components/extensions/ExtensionParent.jsm
@@ -264,6 +264,8 @@ const ProxyMessenger = {
   /** @type Map<number, ParentPort> */
   ports: new Map(),
 
+  _torRuntimeMessageListeners: [],
+
   init() {
     this.conduit = new BroadcastConduit(ProxyMessenger, {
       id: "ProxyMessenger",
@@ -340,6 +342,10 @@ const ProxyMessenger = {
   },
 
   async recvRuntimeMessage(arg, { sender }) {
+    // We need to listen to some extension messages in Tor Browser
+    for (const listener of this._torRuntimeMessageListeners) {
+      listener(arg);
+    }
     arg.firstResponse = true;
     let kind = await this.normalizeArgs(arg, sender);
     let result = await this.conduit.castRuntimeMessage(kind, arg);
@@ -1974,6 +1980,45 @@ for (let name of StartupCache.STORE_NAMES) {
   StartupCache[name] = new CacheStore(name);
 }
 
+async function torSendExtensionMessage(extensionId, message) {
+  // This should broadcast the message to all children "conduits"
+  // listening for a "RuntimeMessage". Those children conduits
+  // will either be extension background pages or other extension
+  // pages listening to browser.runtime.onMessage.
+  const result = await ProxyMessenger.conduit.castRuntimeMessage("messenger", {
+    extensionId,
+    holder: new StructuredCloneHolder(message),
+    firstResponse: true,
+    sender: {
+      id: extensionId,
+      envType: "addon_child",
+    },
+  });
+  return result
+    ? result.value
+    : Promise.reject({ message: ERROR_NO_RECEIVERS });
+}
+
+async function torWaitForExtensionMessage(extensionId, checker) {
+  return new Promise(resolve => {
+    const msgListener = msg => {
+      try {
+        if (msg && msg.extensionId === extensionId) {
+          const deserialized = msg.holder.deserialize({});
+          if (checker(deserialized)) {
+            const idx = ProxyMessenger._torRuntimeMessageListeners.indexOf(
+              msgListener
+            );
+            ProxyMessenger._torRuntimeMessageListeners.splice(idx, 1);
+            resolve(deserialized);
+          }
+        }
+      } catch (e) {}
+    };
+    ProxyMessenger._torRuntimeMessageListeners.push(msgListener);
+  });
+}
+
 var ExtensionParent = {
   GlobalManager,
   HiddenExtensionPage,
@@ -1986,6 +2031,8 @@ var ExtensionParent = {
   watchExtensionProxyContextLoad,
   watchExtensionWorkerContextLoaded,
   DebugUtils,
+  torSendExtensionMessage,
+  torWaitForExtensionMessage,
 };
 
 // browserPaintedPromise and browserStartupPromise are promises that





More information about the tbb-commits mailing list