GoogleChromeの拡張を作る上でFirefoxアドオン作者が知っておくべき10の違い【GoogleChromeでニコ動拡張を作ってみた感想】

https://chrome.google.com/extensions/detail/bkdolnoepbjajdhjejfajjbjbnfhnifb
上記のニコニコ動画向けのExtensionを作ろうとして、色々と現時点でのGoogleChromeの拡張限界がわかったので書いておく。
※環境はWindowsXP Home SP3, GoogleChrome4.0.249.30

  1. 右クリックはいじれない
    • 調べた範囲じゃ無理。
  2. データのダウンロード保存はできない
    • 例えば動画サイトを開くと「DL」ボタンが生成されて、それを押すとあらかじめ指定しておいたフォルダへ自動的にバックグラウンドでダウンロードが開始される、といった動作は無理。落としたい動画URLをwindow.openで開けば自動的にダウンロードは開始されるけど、ニコ動で言えばsmile.flv?XXXXX.XXXXって感じのURLなので、動画の名前が自動的にsmile.flvになる。当然だけどHTMLファイルをwindow.openするとそのページが開かれる。
  3. クリップボードの操作はできない
    • コピーだけは一応可能。document.execCommand("copy", false, null)で、「現在フォーカスが当たって選択されている文字列」がコピーされる。gcoonでは画面端に小さなinputタグを挿入して、そいつのvalueにコピーしたい文字列をぶちこんでフォーカスを当ててexecCommandを発行してコピーを実現してます。document.execCommandの存在はautoCopyで初めて知りました。世の中には知らないことがまだまだあるもんだ。ちなみにpasteは実装されてないらしい。試してないけど。
  4. ブラウザの通信に対してフックをかけることはできない
    • コネクトを張る前に介入して「そのURLは広告だから通信キャンセル」とかがやれない。なので、ひたすらHTML,CSS,JavaScriptのURL該当箇所を消して回るしかない(AdSweepがその方法を採ってる)。当然ながらFlashから通信が発生している場合はどうしようもない(従ってニコ動の時報とかは除去不可能)。
  5. DOM構築前のデータを弄ることはできない
    • DOM構築前に特定要素を排除したい、とかが出来ない。まぁ、DOM構築後に弄れるからそれ使え、という話だろうけど。
  6. ブラウザの下部に新しくツリーボックスを作る等、ブラウザの構造を変えることはできない
  7. 外部exeを実行することはできない
    • 画像をクリックするとあらかじめ登録しておいた画像ビューワが立ち上がる、とか、そういう挙動は不可能。
  8. XMLHttpRequestはクロスドメイン制限を受ける(content_scriptsの場合)
    • manifestでpermissionsを設定できるからクロスドメイン制限解除可能なのかと思ったらcontent_scriptsに入れたjsからだと容赦なく制限くらった件。background_pageからだと制限を受けないので、制限を超えたい場合は一端background_pageでXHRを実行して結果を返すようにしてやる必要がある。
  9. document.getElementsByTagName("body")[0].innerHTMLが使える
    • これはGoogleChromeの良いところ。XULからwindow.content.documentのDOM要素に対してinnerHTMLは使えないが、GoogleChromeのcontent_scriptsからだと普通に使える。これについてはGoogleChromeに軍配を上げたい。ちなみにGoogleChromeはinnerTextもサポートしている。
  10. content_scripts内のjsからlocalStorageにアクセス出来ない
    • バグなのか意図した動作なのかは不明。background_pageからはアクセスできるので、XHR同様にbackground_pageから実行させる必要がある。Firefoxで言うならsqlite的な感じか。ちなみに拡張をアンインストールすると、その拡張が使っていたlocalStorageも一緒に削除してくれるような気がする。Firefoxだとpreferenceを汚染しまくるアドオンがあったりするので、これは悪くないと思う。
  11. javascript1.6とか1.7とか1.8は無い
    • つまりvarはあってもletはない。for eachも無い。まぁ、なくても書けるけど、let好きなんだよね個人的に。
  12. 再起動なしで拡張のテスト・再読込ができる
    • さんざんあっちこっちで言われてるけど、これは明らかにGoogleChromeの方が優位。Firefoxでも出来なくはないけど、うん。まぁ、うん。
  13. 拡張を大量にぶちこんでも重くならない
    • これも既出ネタなんだけど、でもFirefoxが重い重いって言ってる人って基本的にITスキル(笑)が低いと思う。重かったら自分でxpi開いて高速版作れと言いたい。でも感じちゃうびくんびくん(起動が遅い重いぶち殺してぇ、というのは同意せざるを得ない、の意)。とりあえずグリモンは重いから切って、グリモンの一部機能のみに特化した個別アドオンが探せばきっとあるからそれを入れるのが吉。通信系にフックかけるやつも基本的に使わないなら切っておくべき(代表例:Live HTTP Headers)。

所感

Firefoxでいうところのグリモン的な拡張を作りたいなら、FirefoxよりもGoogleChromeの方が確かに簡単。しかしながら、細かいところに手を出そうとすると現状のGoogleChromeには一気に制限がかかってくる。まだβだし、頑張ってる方だとは思うけど、「GoogleChromeマジ神wwwwwwwwFirefox(笑)」な人を見るとイラっと来る。まぁ、「ユーザー」にとっては関係のない話、といえばそうなんだけどね。ただ、「Firefoxに比べて驚異的にExtensionを作るのが簡単!」みたいな見出し文句でブログ書いてる人は実際に上がっている拡張のソースコードを絶対に読んでない。数個読むだけで、既に出ているバグを色々試行錯誤して回避しているのがコメント等から読み取れるはず。ということで、GoogleChromeが特定ジャンルの拡張を作りやすいのは事実だけど、だからといってなんでも簡単に出来る訳じゃない、ということくらいは知っておいて欲しい。いや知ったからって給料上がらないし彼女も出来ないけどね?