Mozilla(Firefox、Thunderbird)拡張機能:拡張IDを取得する方法(install.rdfから)?
-
28-10-2019 - |
質問
Mozillaアプリケーションの1つ(Firefox、Thunderbirdなど)の拡張機能を開発している場合は、install.rdfで拡張機能IDを定義します。
何らかの理由で、ローカルファイルシステム(1)で拡張機能監督を取得するために拡張機能IDを知る必要がある場合、または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;
解決
「ハードコーディングされたID」は、拡張機能の生涯を通じて変更されるべきではないと確信しています。それがIDの全体的な目的です。それは、その拡張機能に固有のものです。定数として保存して、ライブラリにその定数を使用してください。それは何の問題もありません。
何 は 悪い練習は、install.rdfを使用することです。これは、唯一の目的のために存在します。拡張機能が開発されると、install.rdfファイルの状態は無関係であり、矛盾する可能性があります。
「インストールマニフェストは、アドオンマネージャー対応のXULアプリケーションが使用するファイルであり、インストールされているアドオンに関する情報を決定する」[1
類推を与えるために、オーバーフローから削除されたオブジェクトのメモリにアクセスするようなものです。そのオブジェクトはまだメモリに存在しますが、論理的に長く関連性がありません。データを使用することは本当に悪い考えです。
他のヒント
Lwburkのように、MozillaのAPIを通じて入手できるとは思いませんが、どのようなものが機能するかを考えていますが、複雑なハックのようです。基本的な手順は次のとおりです。
- 拡張機能のベースディレクトリを指すようにカスタムリソースURLを設定します
- ファイルを読み、XMLに解析します
- 使用してIDを引き出します xpath
次の行を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は、拡張機能がパックされたままであれば機能します(これをテストしていませんが、それについて読んでいます)。
リソースURLはすべてのインストールされている拡張機能によって共有されていることに注意してください。 packagename-base-dir
ユニークではありません。問題が発生します。あなたは活用できるかもしれません プログラムでエイリアスを追加します この問題を解決するために。
この質問により、今夜はStackoverflowに参加するようになりました。もっと参加することを楽しみにしています...私はあなたの周りに皆さんに会うでしょう!
FirefoxがChromeのWebExtensionAPIを使用するだけであるため、使用できます @セルグの答え で JavaScriptから拡張機能のIDを取得するにはどうすればよいですか?:
2つの異なる方法で次のように(追加のアクセス許可は必要ありません)。
ランタイムAPIの使用:
var myid = chrome.runtime.id;
I18N APIを使用してください:
var myid = chrome.i18n.getMessage("@@extension_id");
私は否定的なことを証明することはできませんが、私はいくつかの研究をしました、そして、私はこれが可能であるとは思いません。証拠:
- この質問, 、それを示しています
nsIExtensionManager
Interfaceは、IDで拡張情報を取得することを期待しています - フル
nsIExtensionManager
インターフェイスの説明, 、役立つ方法を示していません
インターフェイスでは、インストールされている拡張機能の完全なリストを取得できるため、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が一意であることが保証されている唯一のものです。
このアドオンをご覧ください。おそらくその著者があなたを助けることができます。
拡張マネージャー]拡張機能は非常に簡単です。インストール後、ツールとクリック拡張機能に移動して、拡張機能マネージャーを開くだけです。これで、各拡張機能の隣にその拡張子のIDが表示されます。
(Firefox 4.0とまだ互換性がありません)