Commit ea52c9af authored by Alex Catarineu's avatar Alex Catarineu Committed by Pier Angelo Vendrame
Browse files

BB 40069: Add helpers for message passing with extensions

parent 35ccadbd
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -247,6 +247,8 @@ const ProxyMessenger = {
  /** @type {Map<number, Promise>} */
  portPromises: new Map(),

  _torRuntimeMessageListeners: [],

  init() {
    this.conduit = new lazy.BroadcastConduit(ProxyMessenger, {
      id: "ProxyMessenger",
@@ -347,6 +349,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);
    arg.query = true;
@@ -2333,6 +2339,44 @@ export var StartupCache = {

Services.obs.addObserver(StartupCache, "startupcache-invalidate");

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("torSendExtensionMessage", null, 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);
  });
}

export var ExtensionParent = {
  GlobalManager,
  HiddenExtensionPage,
@@ -2345,6 +2389,8 @@ export var ExtensionParent = {
  watchExtensionProxyContextLoad,
  watchExtensionWorkerContextLoaded,
  DebugUtils,
  torSendExtensionMessage,
  torWaitForExtensionMessage,
};

// browserPaintedPromise and browserStartupPromise are promises that