モジュールごとに分けたxulを起動時に選択的に動的にロードするには
今回の事例でいえば、もしもステータスバー下の機能がばっさり必要ないということになれば最初からオーバーレイをロードしない。コンテクストメニューがいらないなら最初からその部分のオーバーレイをロードしない。という形が望ましい。(もしstyleやhiddenやなんかで非表示にするだけの機能を提供したのだとしたら、デザインの変更をする機能を実装したことになってしまう!)か、か勘違いしないでよね! あくまでいらない機能を切り離してわずかな節約を愉しむために実装したんだから!
―さて、そのためにはchrome.manifestで定めるのではなく、条件分岐をして動的にxulを読み込む必要がある、のだが、オーバーレイ読み込み時にオーバーレイを読み込めないという 不具合がある。そのため初期設定のルーチンを window.setEventListener("load" してオーバーレイの解釈時には実行しないようにし、さらにそのloadイベントの中でこうする必要がある。
var ps = Components.classes['@mozilla.org/preferences;1'] .getService(Components.interfaces.nsIPref); var loadoverlayobserver = { stack:[], observe: function() { if(this.stack.length == 0) { return; } document.loadOverlay(this.stack.pop(), this); } }; if(ps.GetBoolPref("extensions.yass.showcontextmenu")) loadoverlayobserver.stack.push("chrome://yass/content/contextmenu.xul"); if(ps.GetBoolPref("extensions.yass.showstatusbar")) loadoverlayobserver.stack.push("chrome://yass/content/statusbar.xul"); loadoverlayobserver.observe();
loadOverlayはオーバーレイの評価が終わると2個目の引数のobserve()を呼ぶ仕組みになってるので、こうして複数のロード候補を順番に読んでいくわけ。結局こんなまでしなくてはいけなくなるから、デザインにカチンときたら黙ってuserChrome.cssを開くのがいいんだと思うんだよ。と思ったけどラベル文字列はuserChrome.jsでもいれるかしないとだめか。
ジャンク技術度 : 0.1 cleartype