5

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

如果由于某种原因您需要知道扩展 id,例如在本地文件系统 (1) 中检索扩展目录,或者如果您想将其发送到 web 服务(使用统计)等,那么从安装中获取它会很好.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;
4

5 回答 5

3

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

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

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

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

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

于 2011-04-01T09:10:39.467 回答
3

像 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不是唯一的,您将遇到问题。您也许可以利用以编程方式添加别名来解决此问题。

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

于 2011-03-30T08:58:14.943 回答
1

由于 Firefox 现在只使用 Chrome 的 WebExtension API,您可以使用@sergHow to get my extension's id from JavaScript? 中的回答?

您可以通过两种不同的方式获得它(不需要额外的权限):

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

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

于 2017-03-02T21:04:17.217 回答
0

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

该界面确实允许您检索已安装扩展的完整列表,因此可以使用 ID 以外的其他内容检索有关您的扩展的信息。请参阅此代码,例如:

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 是唯一保证唯一的属性。

于 2011-03-23T04:14:08.937 回答
0

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

[扩展管理器] 扩展使用非常简单。安装后,只需转到“工具”并单击“扩展”即可打开扩展管理器。您现在将在每个扩展程序旁边看到该扩展程序的 id。

(尚不兼容 Firefox 4.0)

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

于 2011-04-01T07:57:03.560 回答