升级插件以与Firefox 4.0兼容,但也尝试使其与3.x兼容.建议吗?

我有一个为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)之前插入一个新的错误(”)然后它确实有效,表明在Firefox 4中,appendChild调用显然以某种方式修改myElement在它抛出错误之前.我确信我可以弄清楚如何使这个特定的代码片段起作用,但我担心我会遇到更多这样的问题,所以我想知道是否有其他人已经通过一个类似的过程,并有任何我应该知道的提示.

抱歉,这是一个长期存在的问题.这就是我真正要求的:

>对于尝试同时兼容Firefox 3和Firefox 4的插件,你有什么建议?
>您如何看待分支代码的想法,以便我们有一个版本用于3.x而另一个版本用于4.x?然后我们必须对这两个版本应用任何新功能,并在两个版本中测试它们等.
>一般来说,测试是否存在您想要的特定功能(比如我使用if(Application.extensions)…或try / catch)或只检查Application.version是否以’3’开头是否更好?还是’4’?

最佳答案

What advice do you have for trying to keep an addon compatible with both Firefox 3 and Firefox 4 at the same time?

我建议为最近的两个主要版本使用一个XPI.旧版本的人是丢失的案例,并且有两个XPI用于不同的“活动”版本是令人困惑的(我最近没有尝试AMO呈现这种方式,但这是我的旧印象).

What do you think about the idea of branching the code so that we have one version for 3.x and another for 4.x? We would then have to apply any new features to both versions, and test them in both versions, etc.

只有当代码变得过于意大利面时,我才会这样做.作为一个业余爱好者,我会停止更新旧版本,然后留给旧版Firefox版本的用户使用.您可以在AMO上查看扩展的统计信息,以检查新Firefox版本的采用率(即使统计页面不是很容易使用.)

In general, is it better to test for the presence of the specific feature you want (like I did with if (Application.extensions) … or try/catch) or to just check whether Application.version starts with ‘3’ or ‘4’?

基于功能的分支在这里并不重要,因为与网页不同,您正在处理一组固定的主机应用程序.

但请记住可能的副作用:

>检查应用程序的版本将使其更难移植到其他应用程序,因此如果代码的某些部分仅使用平台功能,而不是特定应用程序的功能,则测试平台版本会更有意义.
> try..catch还可以捕获其他错误,与您期望的错误无关.我会避免它.

附:

1)为了避免有关未知属性的CSS警告(如果有很多),可以通过appversion in chrome.manifest为不同版本使用不同的样式

2)我相信Thread.processNextEvent技术是危险的,因为它会阻止调用堆栈在你完成之前展开.

点赞