Chrome extensionsで遊んでいた
連休中ぐらいから、軽く遊んでいたので簡単にメモ。
Chrome extensions は Google Chrome の機能をユーザ側で拡張する仕組み。HTML/Javascriptで書けるのでお手軽。だが、けっこういろんなことができる。
Chrome extensionsを書くのには、基本的なHTML/Javascriptの知識があればいい。いくつかのHTMLファイル、Javascript、各種画像なんかをまとめておけばok。すべてのextensionにはmanifest.jsonというファイルがあり、このファイルにメタ情報(パッケージ名、バージョン、説明など)とファイル構成を記述する。
大雑把にいって、extensionの機能は3つのパートに分かれる。
「toolstrip」は、ウィンドウ下部のステータスバーの位置に用意されたエリアに表示するもの。基本的には指定したHTMLファイルを読み込んで表示する。Javascriptを使って動的にメッセージを変更させたりするのが基本。このエリアは常に表示されるから、あまり広くとらないように注意しないとほかのextensionに迷惑をかけるし、逆にいうと常に表示させておきたいデータを載せる。gmailの未読件数を出すとか、そういう系だね。
「page action」はロケーションバー(オムニボックス)の右はじに出てくる画像。画像ファイルとクリック時のアクションをmanifest.jsonで登録しておく。ちなみにMac版Chromeだとまだ動作しないっぽい(画像が表示されない)。RSS配信しているページの場合に例のアイコンを表示して、クリックしたら購読する、みたいな使い方ができる。
最後に「content script」は、ロードされたページに対して動作するJavascriptで、これがほぼgreasemonkeyに対応するといっていい(細部は若干異なる)。content scriptはページのDOMを触ることはできるが、それ以外のアクセスは制限されており、様々な手段で抜け穴を掘ってあげないといけないが、抜け穴の作り方はgreasemonkeyとは異なる。また、content scriptはtoolstripなどと通信できるのもポイントで、たとえばページ内でbit.lyのアンカーをホバーすると、そのURLを調べてリダイレクト先のURLをtoolstripに送り、表示するといったことができる。
単にJavaScriptというだけではなくて、manifestに記載しておけばcross-originでXMLHttpRequestも投げられるようになるし、タブやウィンドウ、ブックマークあたりの操作用APIも準備されている。どうしてもという場合はNPAPIを使えば任意のバイナリを実行できるだろう(試してないので詳細は分からないが)。
ただ、extensionにはデータの保存に関するAPIがない。つまり、拡張機能はインストールするかしないかだけで細かいユーザ設定を保存できない……と思いきや、Chromeにはlocal storageがあるので、toolstripやbackgroundファイルのlocal storageを使って保存できるのだった。extensionごとに異なるoriginが割り当てられるので、local storageもextensionごとに存在する。
ちなみにMac版のchromeはextensionを作ってもpackingができない(ボタンはあるのだが押しても何も効果はないし、無理矢理コマンドライン引数を渡して実行したらunimplementedなエラーになってしまった)。実行時にload unpacked extension…でロードすると、次に起動したときに消えてしまう。この辺早く実装されないかなー。
rubyのスクリプトがありますよー extension packaging script – Chromium-extensions | Google Groups http://groups.google.com/group/chromium-extensions/browse_thread/thread/2e967e04d59fbacb
cool!