読者です 読者をやめる 読者になる 読者になる

拡張機能を使っても背景ランダム表示は難しそう

前の(id:tomoemon:20080910,id:tomoemon:20080909)続きでFirefoxの背景画像をいじろうという話題です。私用で使う分にはローカルサーバを使う方法で問題はないのだけど、やっぱり別プロセスが動いているのは美しくない。同じくグリモンで背景をいじっているヒデに拡張機能を使ってみたら?と自分で言ったのもあって、ちょいとFirefox拡張機能に手を出してみることにした。

入門資料を読んでいじる前にまずはFirefoxPortableを複数起動できるようにしないといけない。(デフォルトでは一つしか起動できない)

FirefoxPortable\Other\FirefoxPortableSource\FirefoxPortable.ini
を
FirefoxPortable\にコピーして以下の一行を編集
----
AllowMultipleInstances=true
----

簡単な拡張機能ならすぐに動かしてみることができた。

次はローカルファイルを探してくる必要があるがこれは拡張機能の内部で動かすJavaScriptをさらに拡張するXPCOMを利用する。ローカルファイルの読み書きだけでなく外部プロセスを起動したりすることもできる。

形式ばった書き方がちょっと面倒くさいXPCOMを使いやすくするためのラッパでjslibというものがある。Firefox3からは同じ目的でFUELという仕組みができたらしいがまだ満足できるできではないらしい。

拡張機能でできることを確認したところではたと気づいた。ローカルのバイナリファイルを読み込めても結局そのデータを背景に設定する方法が無いじゃんorz

ローカルファイルの読み込みという外堀は埋まったけど、画像を指定するという内堀の攻略方法は前と変わらず「CSSJavaScriptでファイル名を指定」ではどうにもならないわな。ローカルファイルを指定できるのはresource://以下のディレクトリのみなので、必要な画像をコピーしておけば問題はないのだが、それはそれで手間だし無駄が多い。画像フォルダを指定してそこからランダムに画像を拾ってくるという仕様にしたい。

div {
  background-iamge: url(resource:///background.png);
}
 div.style.backgroundImage = "url(resource:///background.png)";
 // あるいはdataスキームを使う
 div.style.backgroundImage = "data:...";

ファイルとして指定できるのはresource://以下のファイルだけなので任意のローカルファイルを指定することができない。base64エンコードした文字列データを指定できるdataスキームという裏技っぽいのもあるが、最大長に制限があるらしく背景に指定するような大きな画像には使うのは難しいだろう(後で試す)。


結局はどちらかを選択するしかないのか。

  • Webサーバを常時動かすというCPUリソースの無駄遣い
  • resource://以下にファイルをコピーするHDDの無駄遣い


参考までにサーバを使う場合の候補で軽量サーバの一覧。