如何将旧版XPCOM扩展迁移到WebExtensions?

时间:2017-08-29 21:19:52

标签: firefox-addon xul firefox-webextensions firefox-addon-overlay

Embedded WebExtensions讨论了如何“......将WebExtension嵌入到经典的自举扩展程序或附加SDK插件中。”

但是我既没有“自举”也没有“附加SDK”扩展,只有十年之久的旧XPCOM /覆盖扩展。我没有 bootstrap.js 来启动,也没有使用Add-on SDK。

我尝试添加

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

但是所有这一切都完全破坏了扩展,只有 加载(空)新 bootstrap.js 文件。

确实,我想迁移:我的经典扩展程序所需的数据需要导出到webext版本,以获得良好的用户体验。

4 个答案:

答案 0 :(得分:2)

our tracking bug,用户发布了一个有用的链接:

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代码为您做的事情。

答案 1 :(得分:0)

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

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

请参阅Porting a legacy Firefox extension

[编辑]&#34;嵌入式WebExtension&#34;确实需要你的&#34;外部&#34;扩展程序是自举的或附加的基于SDK的(所以没有&#34;经典&#34;扩展名),但它只是用于逐步迁移,不适用于Firefox 57.

答案 2 :(得分:0)

没有方便的方法直接这样做。

最有效的方法是:

  1. 将您的扩展程序重写为WebExtension。考虑到WebExtensions的限制,尽可能多地发挥功能。
  2. 然后,添加一个bootstrap或Add-on SDK(更简单的)包装器,它只传输来自原始基于覆盖的扩展的数据。因此,扩展的bootstrap / Add-on SDK部分将是最小的,其中唯一的任务是启动WebExtension(每次加载扩展时)并传输数据(一次)。
  3. 虽然这不允许逐步迁移到WebExtension,这是使用嵌入式WebExtensions的假设好处之一,但它允许您将数据从覆盖扩展迁移到基于WebExtensions的版本。

    你可以先将它转换为bootstrapped / Add-on SDK然后嵌入WebExtensions然后完整的WebExtension,但这样做会更多,没有任何明显的好处。

答案 3 :(得分:0)

我建议人们在类似情况下使用的一个选项是在当前的旧版插件中提供导出功能,在WebExtension版本中提供导入。虽然它不是自动迁移(必须是用户操作),但它克服了WebExtension本地文件访问的一些限制。

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

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