我有一个为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);
}
上面的代码不起作用,但如果我在throw new Error('')
之前插入doc.body.appendChild(myElement)
,那么它确实有效,表明在Firefox 4中,appendChild
调用显然会修改{{ 1}}以某种方式抛出错误之前。我确信我可以弄清楚如何使这个特定的代码片段起作用,但我担心我会遇到更多这样的问题,所以我想知道是否有其他人已经通过一个类似的过程,并有任何我应该知道的提示。
抱歉这个长期存在的问题。 以下是我真正要求的内容:
myElement
或尝试/捕获)或只检查if (Application.extensions) ...
是否以'3'开头是否更好?还是'4'?答案 0 :(得分:1)
来自Mozilla #addons IRC频道的一个建议,我的getVersion()
函数:编写一个由nsIExtensionManager支持的AddonManager模型。 Or use this one。这样,函数本身不必具有if / then模式。
答案 1 :(得分:1)
您有什么建议可以让插件同时兼容Firefox 3和Firefox 4?
我建议为最近的两个主要版本使用一个XPI。老版本的人是一个丢失的案例,并且有两个XPI用于不同的“活动”版本是令人困惑的(我最近没有尝试AMO呈现这种方式,但这是我的旧印象)。
您如何看待分支代码的想法,以便我们有一个版本用于3.x而另一个版本用于4.x?然后,我们必须对这两个版本应用任何新功能,并在两个版本中测试它们等。
只有当代码变得过于意大利面时,我才会这样做。作为一个业余爱好者,我会停止更新旧版本,然后留给旧版Firefox版本的用户使用。您可以在AMO上查看扩展的统计信息,以检查新版Firefox的采用率(即使统计页面不是很容易使用。)
一般情况下,测试是否存在您想要的特定功能(比如我使用if(Application.extensions)...或try / catch)或仅检查Application.version是否以' 3'或'4'?
基于功能的分支在这里并不重要,因为与网页不同,您正在处理一组固定的主机应用程序。
请记住可能的副作用:
P.S。
1)为了避免有关未知属性的CSS警告(如果有很多),您可以通过appversion in chrome.manifest
为不同版本使用不同的样式2)我认为Thread.processNextEvent技术是危险的,因为它会阻止调用堆栈在你完成之前展开。