【问题标题】:Mozilla (Firefox, Thunderbird) Extension: How to get extension id (from install.rdf)?Mozilla(Firefox,Thunderbird)扩展:如何获取扩展 ID(来自 install.rdf)?
【发布时间】:2011-03-23 00:53:54
【问题描述】:

如果您正在为其中一个 mozilla 应用程序(例如 Firefox、Thunderbird 等)开发扩展程序,您可以在 install.rdf 中定义一个扩展程序 ID。

如果出于某种原因您需要知道扩展 ID,例如在本地文件系统 (1) 中检索扩展目录,或者如果您想将其发送到 web 服务(使用统计)等。最好从 install.rdf 中获取它,以便将其硬编码到您的 javascript 代码中.

但是如何从我的扩展程序中访问扩展程序 ID?

1) 示例代码:

var extId = "myspecialthunderbirdextid@mydomain.com";
var filename = "install.rdf";
var file = extManager.getInstallLocation(extId).getItemFile(extId, filename);
var fullPathToFile = file.path;

【问题讨论】:

标签: javascript firefox firefox-addon thunderbird thunderbird-addon


【解决方案1】:

我相当确定“硬编码 ID”在扩展程序的整个生命周期内都不会更改。这就是 ID 的全部目的:它是该扩展程序所独有的,永久不变。只需将其存储为常量并在您的库中使用该常量。这没有什么问题。

不好的做法是使用 install.rdf,它存在的唯一目的是......嗯,安装。一旦开发了扩展,install.rdf 文件的状态就无关紧要了,很可能是不一致的。

“安装清单是启用插件管理器的 XUL 应用程序用来确定正在安装的插件信息的文件”[1]

打个比方,这就像从溢出中访问已删除对象的内存。该对象仍然存在于内存中,但它在逻辑上不再相关,并且使用它的数据是一个非常非常糟糕的主意。

[1]https://developer.mozilla.org/en/install_manifests

【讨论】:

    【解决方案2】:

    和 lwburk 一样,我不认为它可以通过 Mozilla 的 API 获得,但我有一个可行的想法,但它似乎是一个复杂的 hack。基本步骤是:

    1. 设置自定义资源 url 以指向您的扩展程序的基本目录
    2. 读取文件并将其解析为 XML
    3. 使用XPath拉出id

    将以下行添加到您的 chrome.manifest 文件中

    resource    packagename-base-dir chrome/../
    

    然后我们就可以用下面的代码抓取并解析文件了:

    function myId(){
        var req = new XMLHttpRequest();
    
        // synchronous request
        req.open('GET', "resource://packagename-base-dir/install.rdf", false); 
        req.send(null);
    
        if( req.status !== 0){
            throw("file not found");
        }
    
        var data = req.responseText;
    
        // this is so that we can query xpath with namespaces
        var nsResolver = function(prefix){
            var ns = {
                "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
                "em" : "http://www.mozilla.org/2004/em-rdf#"
            };
            return ns[prefix] || null;
        };
    
        var parser = CCIN("@mozilla.org/xmlextras/domparser;1", Ci.nsIDOMParser);
        var doc = parser.parseFromString(data, "text/xml");
        // you might have to change this xpath expression a bit to fit your setup
        var myExtId = doc.evaluate("//em:targetApplication//em:id", doc, nsResolver, 
                                Ci.nsIDOMXPathResult.FIRST_ORDERED_NODE_TYPE, null);
    
        return myExtId.singleNodeValue.textContent;
    }
    

    我选择使用 XMLHttpRequest(而不是简单地从文件中读取)来检索内容,因为在 Firefox 4 中,扩展不一定是解压缩的。但是,如果扩展仍然打包,XMLHttpRequest 仍然可以工作(尚未对此进行测试,但已经阅读过)。

    请注意,资源 URL 由所有已安装的扩展程序共享,因此如果 packagename-base-dir 不是唯一的,您将遇到问题。您或许可以利用Programmatically adding aliases 来解决这个问题。

    这个问题促使我今晚加入了 StackOverflow,我期待更多的参与……我会见到你们的!

    【讨论】:

      【解决方案3】:

      由于 Firefox 现在只使用 Chrome 的 WebExtension API,您可以在 How to get my extension's id from JavaScript? 使用 @serg's answer

      你可以像这样(不需要额外的权限)在两个 不同的方式:

      1. 使用运行时 api:var myid = chrome.runtime.id;

      2. 使用 i18n api:var myid = chrome.i18n.getMessage("@@extension_id");

      【讨论】:

        【解决方案4】:

        我无法证明是否定的,但我做了一些研究,我认为这是不可能的。证据:

        该界面允许您检索已安装扩展程序的完整列表,因此可以使用 ID 以外的其他内容检索有关您的扩展程序的信息。见this code,例如:

        var em = Cc['@mozilla.org/extensions/manager;1']
          .getService(Ci.nsIExtensionManager);
        const nsIUpdateItem = Ci.nsIUpdateItem;
        
        var extension_type = nsIUpdateItem.TYPE_EXTENSION;
        items = em.getItemList(extension_type, {});
        items.forEach(function(item, index, array) {
            alert(item.name + " / " + item.id + " version: " + item.version);
        });
        

        但您仍将依赖硬编码属性,其中 ID 是唯一保证唯一的属性。

        【讨论】:

          【解决方案5】:

          看看这个插件,也许它的作者可以帮助你,或者你自己可以弄清楚:

          [扩展管理器]扩展非常 使用简单。安装后,只需 通过转到打开扩展管理器 工具和单击扩展。你 现在将在每个扩展名旁边看到 该扩展程序的 ID。

          (尚不兼容 Firefox 4.0)

          https://addons.mozilla.org/firefox/addon/2195

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多