【发布时间】:2010-12-17 21:53:28
【问题描述】:
我有一个为 Firefox 3.6 编写的插件,现在我正在为 Firefox 4.0 升级它,同时尝试使其与 3.6 兼容。有没有人有任何尝试这样做的经验,或者关于如何在不让代码变得过于意大利面条式的情况下做到这一点的提示?
在一些地方保持它与两个版本兼容意味着做这样的事情:
.myAddonClass {
-moz-background-size: 100% 100%; /* Fx 3.x */
background-size: 100% 100%; /* Fx 4.x */
}
在两个版本中都会产生 CSS 警告。我可以忍受这一点。还有其他地方我正在做这样的事情:
/** get the current version of this addon */
function getVersion() {
var version;
if (Application.extensions) { // Fx 3.x
version = Application.extensions.get('myaddon@example.com').version;
}
else { // Fx 4.x
Components.utils.import('resource://gre/modules/AddonManager.jsm');
AddonManager.getAddonByID('myaddon@example.com', function(addon) {
version = addon.version;
});
sleepUntil(function() {
return version;
}
}
return version;
}
(其中 sleepUntil 是一个使用 Thread.processNextEvent technique 的实用程序函数)
检查Application.extensions 是否已定义似乎比直接检查Application.version 字符串更干净,但这种方法可能存在一些我不知道的缺陷?
我在尝试将内容插入网页时也遇到了问题。在一种情况下,doc.body.appendChild 在 3.x 中工作,但在 4.x 中没有,所以我尝试这样做:
try { // Fx 3.x
doc.body.appendChild(myElement);
}
catch (e) { // Fx 4.x
let span = doc.createElement('span');
doc.body.appendChild(span);
span.innerHTML = outerHTML(myElement);
}
上面的代码不起作用,但如果我在 doc.body.appendChild(myElement) 之前插入一个 throw new Error('') 则它确实起作用,这表明在 Firefox 4 中,appendChild 调用显然在它之前以某种方式修改了 myElement引发错误。我确信我可以弄清楚如何让这个特定的代码 sn-p 工作,但我担心我也会遇到更多这样的问题,所以我想看看其他人是否已经经历了类似的过程,并且有任何我应该注意的提示。
很抱歉这个冗长的问题。 这是我真正要问的:
- 对于尝试同时与 Firefox 3 和 Firefox 4 兼容的插件,您有什么建议?
- 您如何看待对代码进行分支以便我们为 3.x 提供一个版本而为 4.x 提供另一个版本的想法?然后,我们必须将任何新功能应用于两个版本,并在两个版本中进行测试,等等。
- 一般来说,最好是测试是否存在您想要的特定功能(就像我对
if (Application.extensions) ...或try/catch 所做的那样)还是只检查Application.version是否以“3”或“4”开头?
【问题讨论】:
-
当然,一种选择是在 Firefox 4 发布后不久就放弃对 Firefox 3.x 的支持,但最好还是等着看 Firefox 3.x 用户是否犹豫不决升级...
-
如果有人想知道,该 try/catch 的解决方案就是执行
doc.body.appendChild(doc.importNode(myElement)),这在两个版本中都能完美运行。 -
与其写
doc.body.appendChild(doc.importNode(myElement)),不如使用doc.createElement创建myElement而不是使用其他文档创建它吗? -
@Neil 我现在没有代码在我面前,但我认为原因是元素足够大且足够复杂,我想在自己的 html 文件中定义它,然后将其加载到隐藏的 iframe 中进行解析,然后直接将其复制到
doc。 -
在这种情况下,我同意 importNode 是要走的路。你很幸运,它恰好在 Firefox 3.6 中工作;如果您阅读官方 DOM 文档,则需要使用adoptNode 或 importNode。
标签: firefox firefox-addon compatibility firefox4