Chrome extensionsで遊んでいた

This entry was posted by on Monday, 5 October, 2009

連休中ぐらいから、軽く遊んでいたので簡単にメモ。

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…でロードすると、次に起動したときに消えてしまう。この辺早く実装されないかなー。

2 Responses to “Chrome extensionsで遊んでいた”

  1. ku

    rubyのスクリプトがありますよー extension packaging script – Chromium-extensions | Google Groups http://groups.google.com/group/chromium-extensions/browse_thread/thread/2e967e04d59fbacb

  2. cool!