如果您正在为其中一个mozilla应用程序(例如Firefox,Thunderbird等)开发扩展程序,请在install.rdf中定义扩展程序ID。
如果由于某种原因您需要知道扩展ID,例如要在本地文件系统(1)中检索扩展名dir,或者如果要将其发送到webservice(useage统计信息)等,最好从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;
答案 0 :(得分:3)
像lwburk一样,我不认为它可以通过Mozilla的API获得,但我有一个有用的想法,但它似乎是一个复杂的黑客。基本步骤是:
将以下行添加到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仍然可以工作(尚未对此进行测试,但已阅读过相关内容)。
请注意,资源网址由所有已安装的扩展程序共享,因此如果packagename-base-dir
不是唯一的,则会遇到问题。您可以利用Programmatically adding aliases来解决此问题。
这个问题促使我今晚加入StackOverflow,我期待更多的参与......我会在你身边看到你们!
答案 1 :(得分:3)
我很确定“硬编码ID”在扩展的整个生命周期内都不会改变。这就是ID的全部目的:它永久地是该扩展所独有的。只需将其存储为常量并在库中使用该常量。这没什么不对。
IS 不良做法是使用install.rdf,其唯一目的是为了安装。开发扩展后,install.rdf文件的状态无关紧要,很可能不一致。
“安装清单是启用加载项管理器的XUL应用程序用于确定有关加载项的信息的文件”[1]
给它一个类比,就像从溢出中访问已删除对象的内存一样。该对象仍然存在于内存中,但它在逻辑上并不具有更长的相关性,并且使用其数据是一个非常非常糟糕的主意。
答案 2 :(得分:1)
由于Firefox现在只使用Chrome的WebExtension API,您可以在@serg's answer使用How to get my extension's id from JavaScript?:
你可以这样做(不需要额外的权限) 不同的方式:
使用运行时api:
var myid = chrome.i18n.getMessage("@@extension_id");
- 醇>
使用i18n api:
<?php header("Access-Control-Allow-Origin: *"); if ($_SERVER['REQUEST_METHOD'] !== 'POST') { echo json_encode(array('status' => false)); exit; } $path = 'uploads/'; if (isset($_FILES['file'])) { $originalName = $_FILES['file']['name']; $ext = '.'.pathinfo($originalName, PATHINFO_EXTENSION); $generatedName = md5($_FILES['file']['tmp_name']).$ext; $filePath = $path.$generatedName; if (!is_writable($path)) { echo json_encode(array( 'status' => false, 'msg' => 'Destination directory not writable.' )); exit; } if (move_uploaded_file($_FILES['file']['tmp_name'], $filePath)) { echo json_encode(array( 'status' => true, 'originalName' => $originalName, 'generatedName' => $generatedName )); } } else { echo json_encode( array('status' => false, 'msg' => 'No file uploaded.') ); exit; }
答案 3 :(得分:0)
我不能证明是消极的,但我做了一些研究,我认为这不可行。证据:
nsIExtensionManager
界面
希望您检索扩展名
ID的信息nsIExtensionManager
interface
description,显示没有
帮助的方法该界面允许您检索已安装扩展的完整列表,因此可以使用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是唯一保证唯一的属性。
答案 4 :(得分:0)
看看这个附加组件,也许它的作者可以帮助你,或者你自己可以弄明白:
[Extension Manager]扩展非常 简单易用。安装后,只是 通过转到打开扩展管理器 工具和单击扩展。您 现在将看到每个扩展名旁边 该扩展名的ID。
(与Firefox 4.0不兼容)