Javascript 如何将消息从XUL发送到嵌入式WebExtension

Javascript 如何将消息从XUL发送到嵌入式WebExtension,javascript,firefox,firefox-addon,xul,firefox-addon-webextensions,Javascript,Firefox,Firefox Addon,Xul,Firefox Addon Webextensions,我需要将设置从旧版本的扩展(XUL/Components.interfaces.nsIPrefService)迁移到新版本(WebExtension/browser.storage.sync)。为此,我从Mozilla迁移示例(嵌入式webextension覆盖)中导入了代码。在本例中,使用browser.runtime.sendMessage从嵌入式webextension将数据从嵌入式webextension发送到覆盖代码。它很好用。但我需要更改方向,为此,我在代码的覆盖部分调用browse

我需要将设置从旧版本的扩展(XUL/Components.interfaces.nsIPrefService)迁移到新版本(WebExtension/browser.storage.sync)。为此,我从Mozilla迁移示例(嵌入式webextension覆盖)中导入了代码。在本例中,使用browser.runtime.sendMessage从嵌入式webextension将数据从嵌入式webextension发送到覆盖代码。它很好用。但我需要更改方向,为此,我在代码的覆盖部分调用browser.runtime.sendmages,并得到以下消息: browser.runtime.sendMessage不是一个函数 这是一个可修改的覆盖代码:

{
  const addonId = "myAddon@mySite.com";
  const {
    AddonManager,
  } = Components.utils.import("resource://gre/modules/AddonManager.jsm", {});

  AddonManager.getAddonByID(addonId, addon => {
    const baseURI = addon.getResourceURI("/");

    const {
      LegacyExtensionsUtils,
    } = Components.utils.import("resource://gre/modules/LegacyExtensionsUtils.jsm");

    const myOverlayEmbeddedWebExtension = LegacyExtensionsUtils.getEmbeddedExtensionFor({
      id: addonId, resourceURI: baseURI,
    });

    myOverlayEmbeddedWebExtension.startup().then(({browser}) => {
      dump(`${addonId} - embedded webext started\n`);
      // My code
      browser.runtime.sendMessage({msg:"update-settings", data:my_data});
      /* Original Mozilla code
      browser.runtime.onMessage.addListener(msg => {
        dump(`${addonId} - received message from embedded webext ${msg}\n`);
        console.log(`===${addonId} - received message from embedded webext ${msg}\n`);
      });
      */
    }).catch(err => {
      Components.utils.reportError(`${addonId} - embedded webext startup failed: ${err.message} ${err.stack}\n`);
        console.log(`===${addonId} - embedded webext startup failed: ${err.message} ${err.stack}\n`);

    });
  });
}

我做错了什么?

使用
browser.runtime.onConnect
等待旧版加载项中的传入端口,然后从嵌入式WebExtension调用以打开新端口。您应该在
connect
调用中设置一个名称,以便
onConnect
侦听器只使用专门用于迁移过程的端口

以下是一个例子: