Chrome拡張機能 Manifest V2対応とInvalid manifestと格闘

2012年中に公開しているChrome拡張機能を更新しないといけない件についての件があったので風邪をひいて苦しんでいたが残っていた拡張機能のManifest V2対応を実施した。基本的にContent Security Policyにそって構成を修正するだけで問題なく対応ができたがリリース後にトラップにハマった。

対応ができてローカルで確認済み、拡張機能をアップデートして作業完了!と思ったがなかなかインストール済みの拡張機能がバージョンアップされない。数分でアップロードした内容が反映されるとデベロッパー ダッシュボードでは表示されたし、Chrome Storeで公開される内容も更新されているのだけどバージョンアップされない。

インストールしていない別の環境で試したところ

Error during webstorePrivate.completeInstall: マニフェスト ファイルが無効です。 sendRequest:22
chromeHidden.handleResponse sendRequest:22

というエラーがコンソールに出力されてインストールができないことが判明した。

browser_action > default_iconを消すと直った・・・

結論からいうと”browser_action” > “default_icon”を消すと直った。19×19のアイコンを設定していたのだけどそれがまずかったのだろうか?

Chrome右上のブラウザアクションに表示されるアイコンが何故か19×19という不思議なサイズで実行中はCanvasで書いたImageDataを反映させていたのだけど念のためデフォルトとして19×19のpng画像をmanifestの”browser_action” > “default_icon”に設定していた。background.jsで描画しているのでdefault_iconを消してみたところ更新ができるようになった。

サイズなのか画像が悪かったのかよくわからないがとりあえず結果オーライとした。

その他Invalid manifestにまつわる話

いろいろググったのだがいくつかこのマニフェストファイル問題にまつわる話があるようだ。大きく分けるとアップロード時にコケる問題と、インストール時にコケる問題があって、今回ハマったのは後者の方なのだが後者に関する解決方法は見つけられなかった。

前者に関していうと、文字コードがおかしいファイル名などが入っていると失敗するという話と、無圧縮でzipにしてアップロードしないと失敗するという問題があるらしい。

わらにもすがる思いでantのzip, OSXの圧縮, WinRARの無圧縮zipとすべて試したけど今回の問題には関係無かったしアップロード自体はできたのでzip圧縮作法に関する問題は現在は起きていないように思えた。

Testerアカウントを使ったテスト方法

現在のChromeデベロッパー ダッシュボードには任意のGoogleアカウントにだけ公開できるようなテスター機能が追加されている。そしてChromeには複数のGoogleアカウントを切り替えて使う機能が追加されている。

ChromeではGoogleアカウントごとに設定(拡張機能を含む)が保存されるのでこの2つを組み合わせると開発用とテスト用のGoogleアカウントをChrome内に混在させることができて、新規インストールやアップデートインストールなどを検証したかったので今回はこれを活用した。

どうでもいいけど、アップロードはできるけどインストールがコケるという問題をテストする場合、何回もバージョンアップして試さないといけないのでものすごく不毛な作業を繰り返していた。このあたりローカルでも問題が再現できるようにしてほしい。