質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XUL

XUL(ズール)とは、XMLアプリケーションの一種で、ユーザーインターフェースマークアップ言語です。 Mozillaアプリケーションを作成でき、CSSやJavaScriptなどに親しんでいるエンジニアやデザイナーには習得しやすい言語といえます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1684閲覧

Xul(Firefox, Thunderbird)においてchromeURLでディレクトリを指定する方法

hsk

総合スコア728

XUL

XUL(ズール)とは、XMLアプリケーションの一種で、ユーザーインターフェースマークアップ言語です。 Mozillaアプリケーションを作成でき、CSSやJavaScriptなどに親しんでいるエンジニアやデザイナーには習得しやすい言語といえます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2015/12/18 13:10

編集2015/12/21 07:47

いつもお世話になっております。

###実現したいこと
Mozilla系の拡張機能(アドオン)を開発しています。拡張機能のあるディレクトリのサブディレクトリ内にある画像ファイル名を列挙または検索したいのです。

###質問
chromeURLでディレクトリパスを示すことは可能でしょうか?何か他のスキーマ(ただし、file://などのOS依存のものはNG)などで、ディレクトリを扱えるものはあるでしょうか?chrome://.../ で示すと、ファイル名を指定しなくても、Xulによって推測されたファイルが示されてしまいます。

###具体的なこと
chrome.manifest に

content common chrome/content/common/

と登録していた上で、

javascript

1let url = "chrome://common/content/"; 2let crs = Components.classes['@mozilla.org/chrome/chrome-registry;1'].getService(Components.interfaces.nsIChromeRegistry); 3let ios = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService); 4let nsIURI = ios.newURI(decodeURI(url), null, null); 5let path = crs.convertChromeURL(nsIURI).path; // <- すみません、修正しました...(以前は let path = nsIURI.path)

と記述すると、path には(Windows7で実行させた場合。 --- は何かしらのフォルダ名)

file:///C:/Users/---/AppData/Roaming/---/Profiles/---/extensions/---/chrome/content/common/common.xul
がセットされます。

file:///C:/Users/---/AppData/Roaming/---/Profiles/---/extensions/---/chrome/content/common/
を指定させるには、どのような指定方法を行うと実現できるでしょうか?

Xulのチュートリアル によれば、chromeURLでは「そのディレクトリの用途に応じて適切なファイルが自動的に選択されることになります。 具体的には、コンテントであれば、パッケージ名に .xul を拡張子として加えたファイルが選択されます。」と書かれています。なので、仕様どおりではあります。しかし、ディレクトリそのものを示したい場合の方法がわかりません。

同じく File I/O から「あなたの拡張のフォルダーを取得する」の下にあるコードをもとに拡張機能のインストールされているフォルダを探すように実行させてみましたが、そもそも

javascipt

1Components.classes["@mozilla.org/extensions/manager;1"]

の箇所で
Type Error: Components.classes["@mozilla.org/extensions/manager;1"] is undefined
とエラーになってしまいます。

もしかして、これらのチュートリアルは情報が古いままなのでしょうか...


ご存知の方、(またはヒントなど)よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

ずばりの内容が書かれている情報を WEB上から見つけることができました。

chromeURL が推測した「ファイル」を示すことは仕様として、nsIURL オブジェクトにdirectoryプロパティがあるのでこれを利用して(複製したオブジェクトのpathプロパティに代入して)利用します。

JavaScript

1let url = "chrome://common/content/"; 2 3let crs = Components.classes['@mozilla.org/chrome/chrome-registry;1'].getService(Components.interfaces.nsIChromeRegistry); 4let ios = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces.nsIIOService); 5 6let nsIURI = ios.newURI(decodeURI(url), null, null); 7let path = nsIURI.path; 8let baseURI = nsIURI.clone().QueryInterface(Components.interfaces.nsIURL); // <- クローンを生成して 9baseURI.path = baseURI.directory; // <- ここで path に directory のパスを代入 10let localURI = crs.convertChromeURL(baseURI); 11let path = localURI.path;

これで、無事ディレクトリのパスを得ることが出来ました。

投稿2015/12/21 07:48

編集2015/12/21 07:51
hsk

総合スコア728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問