月曜日, 2月 15, 2010

初 Chrome extension 作成

必要に迫られて作成することにした。
GreaseMonkeyのScriptをChromeのExtensionにするのに毛が生えた程度。

以下は経緯。

RSSの処理は、電車の中とか隙間時間でiPhoneでという習慣になっている。
アプリは、Bylineを使っている。気になったアイテムは、スターを付ける。
スターを「後で読む」の代わりとして使っているのだ。
iPhoneでは、(Sナシの3Gなので)PC用のページを読み込むのに時間がかかるし、deliciousなどのソーシャルブックマークに突っ込むのも一手間かかる。

さて、問題はPCのブラウザでスター付きアイテムを処理する段である。
スター付きアイテムを開いて、見ていく。場合によっては元ページを開く。
当初、見始めたところと、見終わったところにタグ付けしていたのだが、これだと途中に未処理が溜まってしまう。それに、一見して処理済みかどうかがわからないという問題があった。
既に見たものは、スターを外して、readedとでもタグを付けていけばいいのだが、非常に面倒である。
そこで、スター付きのアイテムを5つづつ、タブで開いて、スターを外して、readed とタグ付けするgreasemonkeyを書くことにした。

GoogleReaderのスクリプトを見たのだが、スターを外す、タグを付けるといったファンクションを探しだすのは難しそうだったが、いくつかのGoogleReader用greasemonkeyをみたところ、(dom要素).dispatchEvent(event) という形で、ファンクション呼び出しをしていることがわかったので、それを真似ることにした。
【参考】http://www.sukechan.net/archives/84/

Firefoxでは、一応動いた。
しかし、最近メインブラウザをFxからChromeに変えている。
Chromeでは、デフォルトでgreasemonkeyのスクリプトをChromeの機能拡張へ変換する機能がついているのだが、残念ながら変換しただけでは動かなかった。
まず、contents_scriptの中では、window.open が使えないようである。tab絡みのAPIも直接は呼び出せないようだ。
いくつか、Chromeの機能拡張関係の記事を読んでいたところ、contents_scriptの実行コンテキストは元のwindowとは切り離されており、ページに実装されたファンクションの呼び出しもできないらしい。
そうなると、先の(domの要素).dispatchEvent(event) も動かないはず。
一番簡単な解決方法は、contents_script の中で、script 要素を生成して、greasemonkeyのjsを読み込んでやるということらしい。
そうしたら、割とあっけなく動いた。

http://github.com/ytesaki/mine_chrome_extension_for_googlereader

【参考】http://d.hatena.ne.jp/nacookan/20091028/1256747902

※追記
何か、動かなくなる時がある。原因がよくわからん。
setTimeoutとか、まずいのかな?