firefox 插件从引导到 webextension 的过渡不起作用
Transition of firefox addon from bootstrapped to webextension not working
我正在尝试从引导插件过渡到网络扩展插件。为此,我想从一个中间版本开始,它是一个带有嵌入式 webextension 的自举扩展;这尤其应该将个人设置从旧式首选项复制到新式本地存储。
我想我遵循了我找到的说明:
- 我将嵌入式网络扩展添加为
webextension\manifest.json
和 webextension\background.js
- 我将
<em:hasEmbeddedWebExtension>true</em:hasEmbeddedWebExtension>
添加到 install.rdf
- 我在 bootstrap.js 中从
startup()
中调用 webextension.startup
;这将导致通过一些消息复制设置
根据我在文档中的内容,startup(data,reason)
的第一个参数应该增加 webextension
属性。然而,情况似乎并非如此:我的转储仅显示 id
、version
、installPath
、resourceURI
和 instanceID
,因此我无法执行以上第三点。
我可能做错了什么?
编辑: 精简为最小示例,minimal.xpi
,包含
bootstrap.js
(注意 startup
的签名遵循 webextension 示例而不是 "old-style" startup(data,reason)
)
function startup({webextension} /*was: data,reason*/) {
console.log("A");
webextension.startup().then(api => {
console.log("B");
});
console.log("C");
}
install.rdf
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>minimalexample@example</em:id>
<em:name>Minimal Example</em:name>
<em:version>1.0.0</em:version>
<em:type>2</em:type>
<em:hasEmbeddedWebExtension>true</em:hasEmbeddedWebExtension>
<em:bootstrap>true</em:bootstrap>
<!-- Firefox -->
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>46.0</em:minVersion>
<em:maxVersion>99.0</em:maxVersion>
</Description>
</em:targetApplication>
</Description>
</RDF>
webextension\manifest.json
{
"name": "minimal example embedded webextension",
"version": "1.0.0",
"manifest_version": 2
}
预期行为: "A"、"B" 和 "C" 出现在控制台日志中(其中 "B" 可能出现在"C"之后,因为承诺的异步性质)
实际行为: "A" 出现在日志中,但后面跟着
addons.xpi WARN Exception running bootstrap method startup on
minimalexample@example: TypeError: webextension is undefined
(resource://gre/modules/addons/XPIProvider.jsm ->
jar:file:///home/obscured/minimal.xpi!/bootstrap.js:4:5)
JS Stack trace: startup@bootstrap.js:4:5 <
this.XPIProvider.callBootstrapMethod@XPIProvider.jsm:4800:9 <
this.XPIProvider.installTemporaryAddon<@XPIProvider.jsm:3993:5
一切都很好,没有真正的问题,或者至少在 non-debugging 环境中不会有:
首先,应该注意的是 webextensions 自 FireFox 45 版以来就已经存在。但是,直到最近,从旧插件过渡到 webextension 一直很困难添加在。即,具有 嵌入式 webextensions 的旧版插件的过渡插件仅适用于 FireFox 51 版本。
因此,在编写带有嵌入式 webextensions 的插件时,应该注意过渡插件的 install.rdf 中至少有 <em:minimalVersion>51.0</em:minimalVersion>
。
作为一个细心的程序员,我确实在我的插件中有这个设置(并且很高兴这可以防止人们过早更新 运行 旧的 FireFox 版本,正如预期的那样)。
所以我继续调试我的过渡插件(使用 firefox --console
和 about:debugging
加载未签名的测试版本)并观察我在问题 post 中写的内容。
对我观察到的问题的解释很简单,我用我的普通稳定版 FireFox(当时版本 50)进行了调试,但没有注意到这一点,因为在尝试加载插件时没有发生错误(错误会发生在<em:minimalVersion>
以下的版本,不是吗)。但是当然(?)这已经是调试的一个特性:在那种模式下,即使版本检查失败也会加载插件...
使用较新的 FireFox(aurora 或 nightly),一切都很好。
我正在尝试从引导插件过渡到网络扩展插件。为此,我想从一个中间版本开始,它是一个带有嵌入式 webextension 的自举扩展;这尤其应该将个人设置从旧式首选项复制到新式本地存储。
我想我遵循了我找到的说明:
- 我将嵌入式网络扩展添加为
webextension\manifest.json
和webextension\background.js
- 我将
<em:hasEmbeddedWebExtension>true</em:hasEmbeddedWebExtension>
添加到 install.rdf - 我在 bootstrap.js 中从
startup()
中调用webextension.startup
;这将导致通过一些消息复制设置
根据我在文档中的内容,startup(data,reason)
的第一个参数应该增加 webextension
属性。然而,情况似乎并非如此:我的转储仅显示 id
、version
、installPath
、resourceURI
和 instanceID
,因此我无法执行以上第三点。
我可能做错了什么?
编辑: 精简为最小示例,minimal.xpi
,包含
bootstrap.js
(注意startup
的签名遵循 webextension 示例而不是 "old-style"startup(data,reason)
)function startup({webextension} /*was: data,reason*/) { console.log("A"); webextension.startup().then(api => { console.log("B"); }); console.log("C"); }
install.rdf
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:install-manifest"> <em:id>minimalexample@example</em:id> <em:name>Minimal Example</em:name> <em:version>1.0.0</em:version> <em:type>2</em:type> <em:hasEmbeddedWebExtension>true</em:hasEmbeddedWebExtension> <em:bootstrap>true</em:bootstrap> <!-- Firefox --> <em:targetApplication> <Description> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <em:minVersion>46.0</em:minVersion> <em:maxVersion>99.0</em:maxVersion> </Description> </em:targetApplication> </Description> </RDF>
webextension\manifest.json
{ "name": "minimal example embedded webextension", "version": "1.0.0", "manifest_version": 2 }
预期行为: "A"、"B" 和 "C" 出现在控制台日志中(其中 "B" 可能出现在"C"之后,因为承诺的异步性质)
实际行为: "A" 出现在日志中,但后面跟着
addons.xpi WARN Exception running bootstrap method startup on
minimalexample@example: TypeError: webextension is undefined
(resource://gre/modules/addons/XPIProvider.jsm ->
jar:file:///home/obscured/minimal.xpi!/bootstrap.js:4:5)
JS Stack trace: startup@bootstrap.js:4:5 <
this.XPIProvider.callBootstrapMethod@XPIProvider.jsm:4800:9 <
this.XPIProvider.installTemporaryAddon<@XPIProvider.jsm:3993:5
一切都很好,没有真正的问题,或者至少在 non-debugging 环境中不会有:
首先,应该注意的是 webextensions 自 FireFox 45 版以来就已经存在。但是,直到最近,从旧插件过渡到 webextension 一直很困难添加在。即,具有 嵌入式 webextensions 的旧版插件的过渡插件仅适用于 FireFox 51 版本。
因此,在编写带有嵌入式 webextensions 的插件时,应该注意过渡插件的 install.rdf 中至少有 <em:minimalVersion>51.0</em:minimalVersion>
。
作为一个细心的程序员,我确实在我的插件中有这个设置(并且很高兴这可以防止人们过早更新 运行 旧的 FireFox 版本,正如预期的那样)。
所以我继续调试我的过渡插件(使用 firefox --console
和 about:debugging
加载未签名的测试版本)并观察我在问题 post 中写的内容。
对我观察到的问题的解释很简单,我用我的普通稳定版 FireFox(当时版本 50)进行了调试,但没有注意到这一点,因为在尝试加载插件时没有发生错误(错误会发生在<em:minimalVersion>
以下的版本,不是吗)。但是当然(?)这已经是调试的一个特性:在那种模式下,即使版本检查失败也会加载插件...
使用较新的 FireFox(aurora 或 nightly),一切都很好。