userChrome.jsで自作のjsmを使う時の読み込み方。
Firefox101以降
Firefox101からセキュリティ上の問題からChromeUtils.importでfileURIを読み込まなくなった。そのため、chromeやresourceパスを登録して読み込む必要がある。
const uc = Services.dirsvc.get('UChrm', Ci.nsIFile);
const protocolHandler = Services.io
.getProtocolHandler("resource")
.QueryInterface(Ci.nsIResProtocolHandler);
const uri = Services.io.newFileURI(uc);
protocolHandler.setSubstitution("ucjs", uri);
const { TEST } = ChromeUtils.import('resource://ucjs/TEST.jsm');
Firefox100以前の方法
chromeパスが無くても、fileURIで読み込める。
Cu.import("resource://gre/modules/osfile.jsm");
Cu.import(OS.Path.toFileURI(OS.Constants.Path.profileDir) + "/chrome/~~.jsm");
そもそも、firefox60以上なら ES module が実装されているので、jsm ではなく ES module を使った方が良いかも。
userChrome.jsではエラー(SyntaxError : import declarations may only appear at top level of a module)が出て駄目でした。
jsm内で他の自作jsmを読み込む
上記と同じ方法でもいいのだが、他の方法として、jsm内では__URI__という変数が設定されていて、これがそのjsmのfileURIである。
なので、例えば test-1.jsm 内で同フォルダ内にある test-2.jsm を読み込もうとした場合、
Cu.import(__URI__.replace('test-1.jsm', 'test-2.jsm'));
と書いても読み込める。(誤爆の可能性を考えたら、ちゃんと正規表現でreplaceした方が良いが)
jsm内限定だが、fileURIを使って読み込める系はこのように__URI__を使ってもいい。
ちなみに、jsm内には他に、
__LOCATION__という変数もある(fx67で廃止されたっぽい)。たぶん
nsIFile。
bootstrap.js内で(Waterfox)
Waterfoxで使える(Waterfox以外のFirefox派生ブラウザやThunderbirdでどうなのかは知らない)
再起動不要型(bootstrap型)レガシー拡張のbootstrap.js内で、chromeパスを使用せずに同フォルダ内にある自作jsmを読み込む方法。
function startup(data) {
Cu.import(data.resourceURI.spec + "test.jsm");
}
startup関数の外で読み込みたい場合、bootstrap.js内には__SCRIPT_URI_SPEC__という変数が設定されている。これがbootstrap.jsのfileURIである。なので、
Cu.import(__SCRIPT_URI_SPEC__.replace('bootstrap.js', 'test.jsm'));
と書いて読み込める。
最終更新:2022年06月03日 05:28