升级一个插件以兼容Firefox4.0,但同时尝试使其与3.x兼容。建议?

升级一个插件以兼容Firefox4.0,但同时尝试使其与3.x兼容。建议?,firefox,firefox-addon,compatibility,firefox4,Firefox,Firefox Addon,Compatibility,Firefox4,我有一个插件是为Firefox3.6编写的,现在我正在为Firefox4.0升级它,同时还试图使它与3.6兼容。有没有人有过尝试这样做的经验,或者有过如何在代码没有变得太意大利面的情况下做到这一点的技巧 在一些地方,保持它与两个版本兼容意味着要执行以下操作: .myAddonClass { -moz-background-size: 100% 100%; /* Fx 3.x */ background-size: 100% 100%; /* Fx 4.x */ } /** get th

我有一个插件是为Firefox3.6编写的,现在我正在为Firefox4.0升级它,同时还试图使它与3.6兼容。有没有人有过尝试这样做的经验,或者有过如何在代码没有变得太意大利面的情况下做到这一点的技巧

在一些地方,保持它与两个版本兼容意味着要执行以下操作:

.myAddonClass {
  -moz-background-size: 100% 100%; /* Fx 3.x */
  background-size: 100% 100%; /* Fx 4.x */
}
/** 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;
}
在两个版本中都会产生CSS警告。我可以接受。我在其他地方也做过类似的事情:

.myAddonClass {
  -moz-background-size: 100% 100%; /* Fx 3.x */
  background-size: 100% 100%; /* Fx 4.x */
}
/** 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是使用的实用程序函数)

检查是否定义了
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(“”)
,那么它确实起作用了,这表明在Firefox4中,
appendChild
调用显然会在抛出错误之前以某种方式修改
myElement
。我确信我能找出如何让这个特定的代码片段工作,但我担心我也会遇到更多类似的问题,所以我想看看是否有其他人已经经历过类似的过程,以及我应该知道的任何提示

抱歉问了这么长的问题我真正想问的是:

  • 您有什么建议可以让插件同时与Firefox3和Firefox4兼容
  • 您认为如何对代码进行分支,以便我们有一个3.x版本和另一个4.x版本?然后,我们必须将任何新特性应用于两个版本,并在两个版本中测试它们,等等
  • 一般来说,测试您想要的特定功能是否存在(就像我对
    if(Application.extensions)..
    或try/catch所做的那样),还是只检查
    Application.version
    是否以“3”或“4”开头

  • Mozilla插件IRC频道为我的
    getVersion()
    函数提供了一个建议:编写一个由nsIExtensionManager支持的插件管理器模型。这样,函数本身就不必具有if/then模式

    您有什么建议可以让插件同时与Firefox3和Firefox4兼容

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

    您认为如何对代码进行分支,以便我们有一个3.x版本和另一个4.x版本?然后,我们必须将任何新特性应用于两个版本,并在两个版本中测试它们,等等

    只有当代码变得太意大利面时,我才会这么做。作为一个爱好者,我会停止更新旧版本,让老版本的Firefox用户使用。您可以在AMO上查看扩展的统计数据,以检查新Firefox版本的采用率(即使stats页面不是很容易使用)

    一般来说,测试您想要的特定功能是否存在(就像我对if(Application.extensions)…或try/catch所做的那样),还是只检查Application.version以“3”或“4”开头更好

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

    但请记住可能的副作用:

    • 检查应用程序的版本将使移植到其他应用程序变得更加困难,因此,如果部分代码只使用平台功能,而不是特定应用程序的功能,那么测试平台版本将更有意义
    • try..catch还可以捕获与您期望的错误无关的其他错误。我会避免的
    附言

    1) 为了避免有关未知属性的CSS警告(如果有很多),可以通过


    2) 我认为Thread.processNextEvent技术是危险的,因为它可以防止调用堆栈在您完成之前展开。

    当然,一个选择是在Firefox 4发布后立即放弃对Firefox 3.x的支持,但是,如果Firefox 3.x用户对升级犹豫不决的话,那就拭目以待吧……如果有人想知道的话,解决这个问题的办法就是只做
    doc.body.appendChild(doc.importNode(myElement))
    ,这在两个版本中都能很好地工作。而不是编写
    doc.body.appendChild(doc.importNode(myElement))
    ,你不能用
    doc.createElement
    创建
    myElement
    而不是用其他文档创建它吗?@Neil我现在手头没有代码,但我认为原因是元素太大太复杂了,我想在自己的html文件中定义它,然后将其加载到一个隐藏的iframe中进行解析,然后直接将其复制到
    文档中。你很幸运,它碰巧在Firefox 3.6中工作;如果您阅读了官方DOM文档,它要求您使用adoptNode或importNode。您所说的“其他应用程序”是指其他Mozilla产品,如Seamonkey?您能否详细说明Thread.processNextEvent危险的原因,或者发布一个描述它的链接?@MatrixFrog:1)是;2) 您链接到的页面本身会对此发出警告。假设您的事件是从一个必须为r的函数F调用的