如何将遗留的 XPCOM 扩展迁移到 WebExtensions?

How do I migrate a legacy XPCOM extension to WebExtensions?

Embedded WebExtensions 谈论如何“...将 WebExtension 嵌入到经典的引导扩展或附加 SDK 附加组件中。”

但我既没有 "bootstrapped" 也没有 "Add-on SDK" 扩展名,只有十年前的普通旧 XPCOM/overlay 扩展名。我没有 bootstrap.js 来启动,也没有使用 Add-on SDK 来做任何事情。

我试过添加

<em:bootstrap>true</em:bootstrap>

但是所有完成的都是完全破坏扩展,它 加载那个(空的)新 bootstrap.js 文件。

确实,我想迁移:我的经典扩展有的数据需要导出到webext版本,为了更好的用户体验。

您只能使用 WebExtension API 从头开始​​重写它。

请注意,WebExtensions 模型要求您仅使用显式导出供扩展使用的 API,因此准备在重写期间删除一些功能,或者甚至发现不可能完全重新实现扩展(除非您说服 Mozilla实现您需要的新 API 或在 WebExtension 实验中自己实现它——仍然限于 Nightly/Dev.edition).

Porting a legacy Firefox extension

[edit] "embedded WebExtension" 确实需要您的 "outer" 扩展被引导或基于附加 SDK(因此没有 "classic" 扩展),但这只是为了用于逐步迁移,不适用于 Firefox 57。

我向处于类似情况的人建议的一个选项是在当前的旧插件中提供一个 Export 函数和一个 Import 在 WebExtension 版本中。虽然它不是自动迁移(必须是用户操作),但它克服了 WebExtension 本地文件访问的一些限制。

使用导出,系统会提示用户将完整数据保存到硬盘。

然后下一个升级将是 WebExtension,提示用户导入 保存的数据。

our tracking bug 有位用户发布了有用的 link:

https://github.com/mdn/webextensions-examples/tree/master/embedded-webextension-overlay

归结为

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`);
  browser.runtime.onMessage.addListener(msg => {
    dump(`${addonId} - received message from embedded webext ${msg}\n`);
  });
}).catch(err => {
  Components.utils.reportError(
    `${addonId} - embedded webext startup failed: ${err.message} ${err.stack}\n`
  );
});

这肯定等同于 bootstrap/SDK 代码为您所做的。