Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mozilla(Firefox、Thunderbird)扩展:如何获取扩展id(从install.rdf)?_Javascript_Firefox_Firefox Addon_Thunderbird_Thunderbird Addon - Fatal编程技术网

Javascript Mozilla(Firefox、Thunderbird)扩展:如何获取扩展id(从install.rdf)?

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

如果您正在为其中一个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;

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

  • ,这说明
    nsIExtensionManager
    界面 希望您检索扩展名 按ID列出的信息
  • 完整的,显示没有 有帮助的方法
该接口允许您检索已安装扩展的完整列表,因此可以使用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是唯一保证唯一的属性。

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

  • 设置自定义资源url以指向扩展的基本目录
  • 读取文件并将其解析为XML
  • 用鼠标将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(而不是简单地从文件中读取)来检索内容,因为在Firefox4中,扩展不一定是解压缩的。但是,如果扩展保持打包状态,XMLHttpRequest仍然可以工作(还没有测试过,但是已经读过了)

    请注意,所有已安装的扩展都共享资源URL,因此如果
    packagename base dir
    不是唯一的,您将遇到问题。您可能可以利用此工具来解决此问题


    这个问题促使我今晚加入StackOverflow,我期待更多的参与。。。我会和你们在一起的

    看看这个附加组件,也许它的作者可以帮助你,或者你自己可以弄明白:

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

    (尚未与Firefox 4.0兼容)


    我非常确定“硬编码ID”在扩展的整个生命周期中都不会改变。这就是ID的全部用途:它对该扩展是唯一的,永久的。只需将其存储为常量,并在库中使用该常量即可。这没什么错

    是什么糟糕的做法是使用install.rdf,它的唯一目的是。。。嗯,安装。一旦开发了扩展名,install.rdf文件的状态就不相关,很可能不一致

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

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


    [1]

    由于Firefox现在只使用Chrome的WebExtension API,您可以在以下位置使用:

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

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

  • 使用I18NAPI:
    var myid=chrome.i18n.getMessage(“@@extension_id”)


  • 我想我是对的,但是如果这个问题没有得到回答,我会增加一笔赏金,只是为了见鬼。可能是重复的