Javascript Mozilla(Firefox、Thunderbird)扩展:如何获取扩展id(从install.rdf)?
如果您正在为其中一个mozilla应用程序(如Firefox、Thunderbird等)开发扩展,请在install.rdf中定义扩展id 如果出于某种原因,您需要知道扩展名id,例如在本地文件系统(1)中检索扩展名目录,或者希望将其发送到Web服务(使用统计)等。最好从install.rdf获取该扩展名,以便在javascript代码中对其进行硬编码 但是如何从我的扩展中访问扩展id 1) 示例代码:Javascript Mozilla(Firefox、Thunderbird)扩展:如何获取扩展id(从install.rdf)?,javascript,firefox,firefox-addon,thunderbird,thunderbird-addon,Javascript,Firefox,Firefox Addon,Thunderbird,Thunderbird Addon,如果您正在为其中一个mozilla应用程序(如Firefox、Thunderbird等)开发扩展,请在install.rdf中定义扩展id 如果出于某种原因,您需要知道扩展名id,例如在本地文件系统(1)中检索扩展名目录,或者希望将其发送到Web服务(使用统计)等。最好从install.rdf获取该扩展名,以便在javascript代码中对其进行硬编码 但是如何从我的扩展中访问扩展id 1) 示例代码: var extId = "myspecialthunderbirdextid@mydomai
var extId = "myspecialthunderbirdextid@mydomain.com";
var filename = "install.rdf";
var file = extManager.getInstallLocation(extId).getItemFile(extId, filename);
var fullPathToFile = file.path;
我不能证明是否定的,但我做了一些研究,我认为这是不可能的。证据:
- ,这说明
界面 希望您检索扩展名 按ID列出的信息nsIExtensionManager
- 完整的,显示没有 有帮助的方法
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是唯一保证唯一的属性。像lwburk一样,我不认为它可以通过Mozilla的API获得,但我有一个想法,它可以工作,但似乎是一个复杂的黑客。基本步骤是:
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(而不是简单地从文件中读取)来检索内容,因为在Firefox4中,扩展不一定是解压缩的。但是,如果扩展保持打包状态,XMLHttpRequest仍然可以工作(还没有测试过,但是已经读过了)
请注意,所有已安装的扩展都共享资源URL,因此如果packagename base dir
不是唯一的,您将遇到问题。您可能可以利用此工具来解决此问题
这个问题促使我今晚加入StackOverflow,我期待更多的参与。。。我会和你们在一起的 看看这个附加组件,也许它的作者可以帮助你,或者你自己可以弄明白: [扩展管理器]扩展非常简单 简单易用。安装后,只需 通过转到打开扩展管理器 工具和单击扩展。你 现在将看到每个扩展的旁边 该扩展的id (尚未与Firefox 4.0兼容)
我非常确定“硬编码ID”在扩展的整个生命周期中都不会改变。这就是ID的全部用途:它对该扩展是唯一的,永久的。只需将其存储为常量,并在库中使用该常量即可。这没什么错 是什么糟糕的做法是使用install.rdf,它的唯一目的是。。。嗯,安装。一旦开发了扩展名,install.rdf文件的状态就不相关,很可能不一致 “安装清单是启用加载项管理器的XUL应用程序用于确定正在安装的加载项信息的文件”[1] 打个比方,这就像从溢出中访问已删除对象的内存。那个对象仍然存在于内存中,但它在逻辑上不再相关,使用它的数据是一个非常非常糟糕的主意
[1] 由于Firefox现在只使用Chrome的WebExtension API,您可以在以下位置使用: 您可以通过两种方式获得它(不需要额外的权限) 不同的方式:
var myid=chrome.runtime.id代码>
var myid=chrome.i18n.getMessage(“@@extension_id”)代码>
我想我是对的,但是如果这个问题没有得到回答,我会增加一笔赏金,只是为了见鬼。可能是重复的