少し前にFirefox3 beta1がリリースされたものの、いろいろ拡張機能が動かないから使えないもんねーと思ってスルーしていたけれど、ちょっと移行してみようかと試してみたら、まずGreasemonkeyがFirefox3に対応していませんでした...
が、検索してみるとGreasemonkeyのchange log /trunk/src (log) - greasemonkey - DevjaVuにAdding FF3b support
と書かれているのを発見。最新版なら動くっぽいのでチェックアウトしてきて試してみたら、新しく@importと@requireという新機能もついていたのでちょっと調べてみました。
build.shを実行するだけです。
svn co http://svn.devjavu.com/greasemonkey/trunk/src/ .
sh build.sh
そうするとgreasemonkey.xpiという拡張機能のファイルができあがるのでそれをFirefoxのウインドウにドラッグアンドドロップすれば、拡張機能のインストールダイアログが出てきて、ふつうに動きました。
@importと@requireというのが新しく記述できるようになっています。
このパッチについてGreasemonkey Imports | The Experiments of Gareth Andrewに書かれていたので読んでみると(ここに書かれているものは微妙に関数名とかが実際にGreasemonkeyに実装されているものと違っていたりします)、今までのGreasemonkeyスクリプトは、ひとつのuser.jsファイルの中に全部が入っている必要があったのでCSSや画像をいっしょにしたいと思うとdata:image/gif;base64,のようにデータスキームにして入れておいたりする必要がありました。が、この機能を利用するとuser.jsをダウンロードするとき一緒に別ファイルになっている画像ファイル等もダウンロードしてくれて実行時にはダウンロードしたローカルのファイルを読むようになります。
ちなみにこうしてダウンロードされた依存ファイルは、そのファイルを@importや@requireとして記述していたuser.jsからのみ参照できるようになっていて、また、おなじURLから@importしていても参照しているuser.jsが別なら別のファイルとして個別に管理されています。
@importも@requireも、ダウンロードされるのはuser.jsをインストールしたとき一回だけで、一定期間ごとに再度ダウンロードされたりはしないので自動更新されるGreasemonkeyスクリプトのようなものには使えません。あくまで、いままでひとつのファイルに全部を入れておかないといけなかったのが複数ファイルに分割できるようになったというかんじです。
@requireはちょうどC言語のincludeと同じようなもの(PHPだったらrequireみたいなもの)で、ファイルの内容がそのままuser.jsの先頭に展開されてスクリプトが実行されます。
@require [URL]
という形式で記述して、URLにはhttp, https, ftpのみが指定できます。chromeやfileは指定できないようになっています。
@requireはスクリプト以外のCSSや画像などのファイルをあとから読み込むためのものです。
@import [name] [URL]
という形式で記述します。nameはあとでスクリプトからURLのファイルを参照するときのための識別用文字列です。こちらは@requireのように自動的にスクリプトの中に取り込まれたりはせず、実行時にGM_getImportURLまたはGM_getImportTextに識別用文字列を渡してファイルの内容を読み込むようになっています。GM_getImport*が呼ばれたタイミングでファイルから実際に読み込みが行われます。
GM_getImportTextで読み込んだ場合は、ファイルの中身がそのまま文字列として帰ってきます。GM_getImportURLで読み込んだ場合は、ファイルの中身がdata:{MIMEType};base64の形式で帰ってきます。前者はCSSやHTMLを読み込むとき、後者は画像などのバイナリファイルを読み込むとき用に使うのでしょう。
@requireも@importも地味に便利そうです。
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/181
comments