我希望能够询问用户登录我的Web应用程序时是否要安装我的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不是函数”。对于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的一部分,而且似乎也没有其他方法可以直接检索有关网页内已安装的Firefox插件的信息。

诀窍是,扩展程序可以通过操作DOM将其插入页面中,从而自身提供此信息。这是使用firefox SDK的示例,该示例向主体添加了CSS类。

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。

因此,该插件还可以将其版本号插入网页中,以便能够直接安装较新的版本。

09-11 01:01