Commit d2eaddbe authored by Alex Catarineu's avatar Alex Catarineu Committed by Richard Pospesel
Browse files

Bug 40069: Add helpers for message passing with extensions

parent 3507fddc
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -263,6 +263,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);
@@ -2139,6 +2145,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,
@@ -2151,6 +2196,8 @@ var ExtensionParent = {
  watchExtensionProxyContextLoad,
  watchExtensionWorkerContextLoaded,
  DebugUtils,
  torSendExtensionMessage,
  torWaitForExtensionMessage,
};

// browserPaintedPromise and browserStartupPromise are promises that