5

mozillaアプリケーションの1つ(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

lwburkのように、MozillaのAPIを介して利用できるとは思いませんが、うまくいくアイデアはありますが、複雑なハックのようです。基本的な手順は次のとおりです。

  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;
}

Firefox 4では拡張機能が必ずしも解凍されていないため、コンテンツを取得するために(単にファイルから読み取るのではなく)XMLHttpRequestを使用することを選択しました。ただし、拡張機能がパックされたままの場合、XMLHttpRequestは引き続き機能します(これはテストされていませんが、読んでいます)。

packagename-base-dirリソースのURLは、インストールされているすべての拡張機能で共有されているため、一意でない場合は問題が発生することに注意してください。プログラムでエイリアスを追加することで、この問題を解決できる場合があります。

この質問は私に今夜StackOverflowに参加するように促しました、そして私はもっと参加するのを楽しみにしています...私はあなたたちの周りに会うでしょう!

于 2011-03-30T08:58:14.943 に答える
3

「ハードコードされたID」は、拡張機能の存続期間を通じて変更されないはずです。これがIDの全体的な目的です。IDはその拡張機能に永続的に固有のものです。定数として保存し、その定数をライブラリで使用するだけです。それは何も悪いことではありません。

悪い習慣は、 install.rdfを使用することです。これは、インストールの唯一の目的のために存在します。拡張機能が開発されると、install.rdfファイルの状態は無関係になり、一貫性がなくなる可能性があります。

「インストールマニフェストは、アドオンマネージャー対応のXULアプリケーションが、インストール時にアドオンに関する情報を判別するために使用するファイルです」[1]

例えれば、オーバーフローから削除されたオブジェクトのメモリにアクセスするようなものです。そのオブジェクトはまだメモリに存在しますが、論理的にはそれほど関連性がなく、そのデータを使用することは本当に、本当に悪い考えです。

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

于 2011-04-01T09:10:39.467 に答える
1

FirefoxはChromeのWebExtensionAPIを使用するようになったため、JavaScriptから拡張機能のIDを取得する方法で@sergの回答を使用できます。:

次の2つの方法で、このように取得できます(追加のアクセス許可は必要ありません)。

  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 に答える