nyoron0128's blog

がうがう

踊ってみたとかを非表示にするgoogle chrome拡張作りました

Temita Vanisher

https://chrome.google.com/webstore/detail/temita-vanisher/hffnpkkhfacfccmglhkoaddcokbchjid?hl=ja
youtubeニコニコ動画のランキングや検索結果から「~てみた」と付くタイトル(踊ってみた、歌ってみた)の動画を非表示にする。
現在はyoutubeニコニコ動画でだけ有効になる。両サイトともそこそこ使うものの、踊ってみたとか歌ってみたとかそういう系は興味ないのでvanishするために作った。ついでにchrome拡張の作り方も学習したりとか。

ソース

https://github.com/urusupa/GoogleExtension/tree/master/TemitaVanisher

反省

innerHTMLを使うと下手するとメモリリークを起こすらしい。クロージャも循環参照もしてないから問題ないはずなのに、当該サイトで更新連打してると拡張無効時には見られないような、javascritpのメモリの微増が見られる。問題あるレベルじゃないが気になるのでなんとかしたい。
とりあえずの応急処置として変数のメモリ開放はしておいた。開放方法もいくつかあって、nullで埋めるとかdeleteで消すとかってあるみたい。とりあえずdeleteしておいた。

メモリリーク

この記事の下書きを書いてる時、ちょうどIBMの技術文書が発表されてハテブで話題になってたから参考になった。
http://www.ibm.com/developerworks/jp/web/library/wa-jsmemory/?cmp=dw&cpb=dwwdv&ct=dwrss&cr=dwrss&ccy=jp&csr=120712

拡張の公開

拡張を他人と共有するには、google chrome拡張機能管理→拡張機能のパッケージ化で6つのファイルが入ってるフォルダを選べば、TemitaVanisher.crxとTemitaVanisher.pemができる。crxの方を適当な方法で送って、chromeにドロップすれば追加できる。が、しかしgoogle Webstoreに公開するときは、上記の6つのファイルをzipで固めてうpしなくてはならない。最初、勘違いでパッケージ化されたcrxをアップロードしようとして、TemitaVanisher.crxだけをzipにしてうpしたら

エラーが発生しました: パッケージ内にマニフェストがありません。zip パッケージのルート ディレクトリに manifest.json を追加してください。

って言われた。次にTemitaVanisher.crxとmanifest.jsonをzipにしてうpしたらうまくアップロードできた。その後の拡張の概要とか情報を入れて確定もできた。
ひととおり手続き終わって、さあWebstoreからインストールしてみるかとやってみたら

パッケージが無効です。詳細:拡張機能アイコン「icon16.png」を読み込むことができませんでした。

っていわれた。
zipに入れる組み合わせをいろいろ試した結果、上記の6つをzipでかためたものをアップロードしないといけなかったみたい。crxファイルすら入れなくていいらしい。このzipに入れる組み合わせがググってもなかなかヒットしなかったので後学のためにメモ。こんな簡単なところにひっかかる人がそもそもいないってことか・・・?
あと、Webstoreで公開する一発目だけ、デベロッパー登録費として$5必要だった。

幻のプロトタイプ

拡張をwebstoreに公開した日にyoutubeの仕様がごっそり変わっちゃって、youtube関連のとこ作り直しになっちゃった。幻のver0.1。
と思ったら数時間後にclassだけ戻っちゃった。ということでyoutubeの見た目はごっそり変わったけど、拡張の方は特に変更なくいけちゃった。だけども、いつまたこんなことがあるかわからないので自動更新機能をつけてver0.2にしておいた。
と、思ったらmanifest version2から自動更新はgoogle側でホスティングされるらしい。manifest.jsonにupdate_url要素を入れたままアップロードしたら

エラーが発生しました: マニフェストには「update_url」を含めないでください。

って怒られた。
つまり、拡張の自動更新機能はデフォルトで装備されるようになったので、拡張を更新したら"version"要素の数字を増やして、デベロッパーダッシュボードからzipを入れ替えれば、後は全部googleさんがやってくれるとのこと。すごい!
あれ?じゃあデベロッパーならcrxファイルいらないよね。デベロッパー用の機能で、特定のテストユーザーのみに公開ってのがあるけど、それが実装される前にテストするためだけのファイルなんじゃ?一度デベロッパー登録の$5払えば、webstoreで公開できるからcrxをやり取りする必要ないし・・・。あれあれ、だったらcrxを作るときにしか使わない秘密鍵ファイルpemも必要ないじゃん。さらに、バージョンアップのときにzipをうpするだけでいいならば、その拡張がバージョンアップ前後で同じ機能を提供するってことを保障する要素ないよね?っていう
訳がわかめだよ・・・