如何确定网页中 JavaScript 中安装脚本的 firefox 扩展版本?

How to determine firefox extension version for install script in JavaScript in a web page?

我希望能够在用户登录我的网络应用程序时询问他们是否要安装我的 firefox 扩展程序,以防他们尚未安装它,或者他们的版本是否不是最新的。有没有可能做到这一点?

我无法通过网络搜索收集到有关此事的有用信息。我目前的尝试是这样的:

$(function() {
    if ("InstallTrigger" in window) {
        var params = {
            "Example": { 
                URL: "https://www.example.com/plugins/firefox/latest/example.xpi",
                IconURL: "https://www.example.com/favicon.ico",
                Hash: "sha1:37441290FFDD33AB0280BECD79E1EF",
                toString: function () { return this.URL; }
            }
        };

        alert(InstallTrigger.compareVersion("Example", "0.8"));

        InstallTrigger.install(params);
    }
});

使用 InstallTrigger.install() 的安装有效。但是在Firefox 38中调用InstallTrigger.compareVersion()会导致报错"TypeError: InstallTrigger.compareVersion is not a function",InstallTrigger.getVersion()也是如此。

compareVersion() 记录在此处:http://www.applied-imagination.com/aidocs/xul/xultu/elemref/ref_InstallTrigger.html。但是我也发现了compareVersion()与firefox扩展无关的讨论,所以我很困惑。

当安装的扩展版本不是当前版本时,如何只调用 InstallTrigger.install()?

我现在找到了合适的解决方案。 InstallTrigger.compareVersion() 和 InstallTrigger.getVersion() 似乎不再是 InstallTrigger API 的一部分,而且似乎也没有其他方法可以直接检索有关 web 中已安装的 firefox 插件的信息页。

诀窍是扩展程序可以通过操作 DOM 将其插入页面来提供此信息。这是一个使用 firefox SDK 的示例,它向正文添加了 CSS class。

var pageMod = require("sdk/page-mod");
var contentScriptValue = 
    'document.body.className += " ExampleComFirefoxExtensionInstalledClass";';
pageMod.PageMod({
    include: "*www.example.com*",
    contentScript: contentScriptValue
});

页面随后可以检查插入的信息。

$(function() {
    window.setTimeout(function() {
        if ("InstallTrigger" in window && 
            !$('body').hasClass('ExampleComFirefoxExtensionInstalledClass'))) {
            var params = {
                "Example": { 
                    URL: "https://www.example.com/plugins/firefox/latest/example.xpi",
                    IconURL: "https://www.example.com/favicon.ico",
                    Hash: "sha1:37441290FFDD33AB0280BECD79E1EF",
                    toString: function () { return this.URL; }
                }
            };

            InstallTrigger.install(params);
        }
    }, 500);
});

需要超时,因为插件在页面完全加载后操作DOM。

相应地,该插件也可以将其版本号插入网页,以便能够直接安装更新的版本。