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を読み込む方法。

startup関数内であれば、引数のBootstrap dataを利用する。
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