検索ボックスの文字列を自動クリアするfirefox拡張を作ってみた
(2009-01-03追記) ここで紹介している clearSB のソースコード一式は、GitHub へ移管されました。
clearSB – GitHub
====
firefox の右上にある検索ボックスは、検索後にフォームに検索文字列が残るようになっている。で、後ろから忍び寄ってきた人や、ちょっと席を離れたとき(大体ロックしてるけど)にスクリーンを覗いてきた人に何を検索したか見られることがあったりする。
今のところ、特に恥ずかしい思いを過去にしたわけでもないのだが、勝手に消えてくれた方がなんとなく嬉しい。というわけで、そんな機能を firefox の拡張(addon)で作ってみようと思い立った。SearchBox を Clear するので、名付けて clearsb (クリアエスビー) です。
参考にしたサイトは、次の通り。とくにまとめサイトの方がわかりやすかった。
できあがった拡張(xpi)はこちらの trac に置いておいたので、ご興味の方、どうぞお持ちください。win 環境 Firefox 2.0.0.3 と linux 環境 Firefox 2.0.0.6 で動作確認済です。初めて作ったものなので、何かと行き届かない部分はご容赦を。あ、あと、最低限のコードしかしてないので、環境によっては変な動きをするかもしれません。ご利用は自己責任でお願いします。
以下、作業メモ。xpi の実体は zip 圧縮されたファイルなので、伸張すれば、簡単に解読できますです。
まず、ディレクトリ構成は、こんな感じ。
<拡張を作るディレクトリのルート>$ ls -R .: chrome chrome.manifest install.rdf ./chrome: content skin ./chrome/content: about.xul clearsb.js clearsb.xul ./chrome/skin: clearsb.png clearsbb.png
上記の通り、ごく少量のファイルで拡張が作れてしまうわけだが、自作のアイコンや about 用のダイアログが不要であれば、用意するファイルは、次の 4 つだけで良い。
- インストール方法を記述した /install.rdf
- 配布ファイルの構成を記述した /chrome.manifest
- 拡張の UI への割当て方法を記述した /chrome/content/clearsb.xul
- 拡張の実処理を記述した /chrome/content/clearsb.js
これだけだから、中身も全部貼っておく。
/install.rdf
なお、em:id(GUID) はオンラインサービスで取得してきた。
/chrome.manifest
overlay chrome://browser/content/browser.xul chrome://clearsb/content/clearsb.xul content clearsb jar:chrome/clearsb.jar!/content/ skin clearsb default jar:chrome/clearsb.jar!/skin/
拡張の実体とスキンがどこにあるかを規定するファイル。chrome:// で始まる URI を適宜書き換えれば、ディレクトリ構成はわりと自由にいけるぽい。
/chrome/content/clearsb.xul
ここで処理の実体である clearsb.js を指定している。
/chrome/content/clearsb.xuljs
var ClearSB = { // 初期化処理 .. サーチアクションにリスナをバインドする init: function() { sb = document.getElementById("searchbar"); eval("sb.handleSearchCommand = " + sb.handleSearchCommand.toString().replace( "{", "{ ClearSB.onSearch();")); }, // サーチアクション時に呼ばれる // 検索エンジンに文字列が渡るよう、1msec 後にフォームをクリアする onSearch: function() { setTimeout(function() { sb = document.getElementById("searchbar"); sb._textbox.textValue = ""; }, 1); } }; // 起動時に上記のオブジェクトをロードする window.addEventListener("load", ClearSB.init, false);
実は、肝心のこれだけのコードの書き方がなかなかわからなかった。まず、検索ボックスの検索アクションに function を bind させる方法がわからず(上記 init で eval してるところ)、次に、検索時に検索ボックスを空にすると検索エンジンに検索文字列が渡らないという現象に悩まされた(上記 onSearch で setTimeout してるところ)。
結局、いろいろ探しているうちに、userchrome.js の上で同じ事をやってる人を、こちらのブログのコメント欄で発見し、これを頼りに上記のように書いてみたら、ようやくうまくいった感じ。この辺のプロパティ名とかがオフィシャルにまとめてあるところが見付からないんだな.. どなたかご存知でしたら教えてください。
最後に、上述のまとめサイトのチュートリアルに掲載されているパッケージング用のスクリプトを用意して、こいつを PATH の通ったところに突っ込む。(今回の構成用に、微妙にファイル名をカスタマイズしてあります。)
#!/bin/sh -f x=$(pwd) x=${x##*/} rm $x.xpi # archive chrome (non-compressed) mkdir -p build/chrome cd chrome find . ! -name '.*' -exec zip -0 ../build/chrome/$x.jar {} ; cd .. cp -f chrome.manifest install.rdf build # archive whole (compressed) cd build find . ! -name . -exec zip -9 ../$x.xpi {} ; cd .. rm -rf build
これを、冒頭に書いたルートのディレクトリから実行してやると、xpi ができあがり。簡単な事をやりたかった割には時間がかかってしまった。でも JavaScript でブラウザを拡張していくという感覚は面白いな。乗り遅れたな..
あ、最後に、アイコン作ってくれた嫁さんと、動作確認に協力してくれた(「小倉智昭」を検索しっぱなしで恥ずかしい思いをしたばかりの) 弟に感謝。
(2007/10/31 18:59 追記) clearsb.js のファイル名表記が間違ってたので直しました。
最近のコメント