【问题标题】:How can a Firefox extension get its own version number programmatically?Firefox 扩展如何以编程方式获得自己的版本号?
【发布时间】:2009-07-06 18:03:49
【问题描述】:

如何使用 Javascript 以编程方式获取我自己的 Firefox 扩展程序的版本号?

我的扩展有一个 install.rdf 文件,其中包含类似于下面的版本号。我想提取<em:version>标签的内容。

<?xml version="1.0" encoding="UTF-8"?>
<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:version>1.0</em:version>
    ...
  </Description>
</RDF>

【问题讨论】:

    标签: javascript firefox firefox-addon


    【解决方案1】:

    在 Firefox 4 (Gecko 2) 中,API 发生了变化,因此如果您需要移植到 Firefox 4,代码如下(来自here):

    try {
        // Firefox 4 and later; Mozilla 2 and later
        Components.utils.import("resource://gre/modules/AddonManager.jsm");
        AddonManager.getAddonByID("extension-guid@example.org", function(addon) {
            alert("My extension's version is " + addon.version);
      });
    }
    catch (ex) {
        // Firefox 3.6 and before; Mozilla 1.9.2 and before
        var em = Components.classes["@mozilla.org/extensions/manager;1"]
                 .getService(Components.interfaces.nsIExtensionManager);
        var addon = em.getItemForID("extension-guid@example.org");
        alert("My extension's version is " + addon.version);
    }
    

    【讨论】:

    • 最大的变化是 Firefox 4 API 是异步的,而 Firefox 3 API 是同步的。如果需要阻塞,将依赖代码放在回调中。
    • @Crend King:这是真的,一个不完美的解决方法是在扩展启动时将版本号保存在扩展内的某个位置,并在需要时以同步方式检索。异步调用真的很有感染力。
    • Version 应该适用于您的方法,因为它是扩展的属性。但是,当您尝试获取扩展安装位置等用户相关信息时,您无法绕过 AddonManager(“ProfD/extensions/”并不总是正确的)。
    • 模拟同步调用的另一种方法是使用nsIThread.processNextEvent()nsIThreadManager.currentThread 是正确的线程。
    • 谢谢,这对我也有帮助。太棒了!
    【解决方案2】:

    我没有得到完整的答案,但我找到了the Extended extension 并查看了源代码,因为它似乎是一个很好的起点,并且通过谷歌搜索其中的一些方法我找到了this snippet on MDC。代码的关键部分似乎是这样的:

    var gExtensionManager = Components.classes["@mozilla.org/extensions/manager;1"]
                            .getService(Components.interfaces.nsIExtensionManager);
    var current = gExtensionManager.getItemForID("extension@guid.net").version;
    

    您必须将 extension@guid.net 替换为您的扩展程序的适当 ID。

    Firefox 4 需要不同的代码,请参阅其他答案。

    【讨论】:

    • 优秀。这是一个完整的答案!我确实必须初始化我自己的 gExtensionManager 对象。
    • 嗯,这不是一个完整的答案,因为我实际上不确定它是否会起作用:)
    • 我不知道这样做有什么好处,但这更短:let version = Application.extensions.get('extension@id').version;(来自stackoverflow.com/questions/1965310/…
    • @MatrixFrom:您提到的 FUEL API 在 Firefox 4 中也发生了变化,因为 AddonManager API 现在是异步的。因此,除了节省几个字节以换取使用较少测试和不太知名的 API 之外,它没有任何好处。
    【解决方案3】:

    使用附加 SDK 很简单:

    var version = require("sdk/self").version;

    【讨论】:

      【解决方案4】:

      Web Extensions中使用以下内容:

      browser.runtime.getManifest().version
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        相关资源
        最近更新 更多