Mozilla(Firefox,Thunderbird)扩展:如何获取扩展ID(来自install.rdf)?

时间:2011-03-23 00:53:55

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

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

5 个答案:

答案 0 :(得分:3)

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

  1. 设置自定义资源网址以指向您的扩展程序的基本目录
  2. 读取文件并将其解析为XML
  3. 使用XPath
  4. 拉出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仍然可以工作(尚未对此进行测试,但已阅读过相关内容)。

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

    这个问题促使我今晚加入StackOverflow,我期待更多的参与......我会在你身边看到你们!

答案 1 :(得分:3)

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

IS 不良做法是使用install.rdf,其唯一目的是为了安装。开发扩展后,install.rdf文件的状态无关紧要,很可能不一致。

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

给它一个类比,就像从溢出中访问已删除对象的内存一样。该对象仍然存在于内存中,但它在逻辑上并不具有更长的相关性,并且使用其数据是一个非常非常糟糕的主意。

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

答案 2 :(得分:1)

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

  

你可以这样做(不需要额外的权限)   不同的方式:

     
      
  1. 使用运行时api:var myid = chrome.i18n.getMessage("@@extension_id");

  2.   
  3. 使用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; }

  4.   

答案 3 :(得分:0)

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

该界面允许您检索已安装扩展的完整列表,因此可以使用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不兼容)

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