Firefox 版は AMO に置くのを諦め、ここでホストすることにした。
Chrome 版のソースを Firefox の WebExtensions のシステムで動かす際、以下の点が Chrome と異なる。
- [cci]chrome.runtime.onInstalled[/cci] がまだない。したがって、
'onInstalled' in chrome.runtime && chrome.runtime.onInstalled.addListener(function () { });
みたいな書き方をする必要がある。 - content script で生成した CustomEvent にオブジェクトを含んだ detail を与え、ディスパッチする。それをページスクリプトでリスンすると、detail が正しく引き渡されない。Firefox では権限の異なるスクリプト間ではプリミティブな型以外のものを渡せないようだ。そんなわけで、Firefox で動かす際は detail には JSON.stringify() したものを与え、受け取る際も JSON.parse() しないといけない
- ソースはほぼ Chrome 版と共有できるが、パッケージングはかなり異なる。ストアに登録する際は Chrome 同様にソースディレクトリを単に zip するだけでもよいが、web-ext ツールを用いてビルドと署名をコマンドラインから行う方法も用意されている。
- 自前でホストする場合、更新情報も自分で管理しないといけない。そのために、manifest.json に
"applications": {
"gecko": {
"id": "abeani-extension@appsweets.net",
"strict_min_version": "42.0",
"update_url": "https://appsweets.net/abeani/updates.json"
}
},
というものを含める必要がある。このエントリは、Chrome は無視するのでこの manifest を Chrome に与えてもエラーにはならない。updates.json の内容は
{
"addons": {
"abeani-extension@appsweets.net": {
"updates": [
{
"version": "1.0.8",
"update_link": "https://appsweets.net/abeani/extension/AbeaniExtension.xpi"
}
]
}
}
}
こんな感じ。調子に乗って Edge でも動かしてみたのだが、まず Edge は chrome.alarms がないので普通のタイマーで代替しないといけないのだが、それは代替手段があるのだから別にいい。だがなんと、content script から chrome.runtime.sendMessage() でバックグラウンドにメッセージを送る機能がまだ実装されていない。これがないとどうにもならない。ひどい。というわけで Edge 版はしばらくペンディングだ。MS さん真面目にやってくださいよ。