PrsPrsBK’s blog

Princess Princess Burn Knuckle

Firefox アドオン開発を web-ext へ移行する:初歩(開発工程の話)

要約

開発工程の話。自分は移行できるっぽい。やらせたい動作を WebExtensions でどのようにやるかは一切書いていない。後で調べる。文中の API キー等秘密の情報は消してある。具体的なポイントは 5 つあった(1 つは途中まで)。

概要

背景と目的

1. Firefox アドオンは WebExtensions ベースに限定される (2017 年 11 月の 57 から切り替わる)。

2. WebExtensions ベースで作っていないので、web-ext という新ツールでやり直すか、もうやめるかどちらかになる。

3. [目的] やめるかどうか決める。

4. [目標] とりあえずこれまでの「変更→パッケージ作成→公開せずに Extension Auto-Installer (これも 11 月で無効になるけど) でインストール」のようなことができるか確認する。

5. [結果] 目標の 75% 程度。アドオン変更→web-ext run で動作確認→webext build でパッケージ (zip) 作成→web-ext sign で署名 (xpi 作成)→インストール、という流れになる (署名は頻繁にやることではないと思うので web-ext run が必要になる)。web-ext run でやる部分を確認するところで滞ったので、続きはまた後でやる。

状況

1. 自分専用で非公開のアドオンを使っている。cfx (Add-on SDK) で作成。jpm には面倒くさがって移行しなかった。web-ext に移行する必要がある。

2. 署名つきにしていない。だるかった。具体的に何するのか把握する必要がある。

3. [環境] Windows10、Firefox Developer Edition (ver. 54、更新すると自作アドオンをインストールできなくなる以前にブックマークが表示されないなどあったので残してある)。Vim で書いていた。

やったこと

情報収集、整理

アドオンには署名必須のはずだが、web-ext の Getting startedSigning and Distributing your Add-on (日本語) 等を読むと、アドオンには署名もしくは ID (正確には manifest.json の applications.gecko.id キー) が必要と読める。ID 取得には一度署名が必要だし ID を管理しないでやっていこう (あと Google Chrome だと良くない) と言っているし、何より実際は ID だけではインストールできていない (まあ一応確認した) ので署名をつける。署名は AMO にアップロードすれば済むが、web-ext sign 経由で署名つければ毎回アドオンページにアップロードしなくて済む、web-ext sign には JWT issuer/key が必要、それらは多分 Firefox アカウントがあれば (あるいは何かアップロードしてやれば) 良い、と見当がついた。

なので以下の手順は 1. Firefox アカウント作って 2. JWT issuer と JWT key とを取得し、3. web-ext sign で署名して 4. インストール、になる。※これは 3 確認の段階で修正されて web-ext run が導入される。

web-ext は Getting started を見てインストールした。更新は npm のドキュメントが node_modules/npm のどこかにあったので参照して、npm update -g web-ext でやれた。ver. 2.0.0。

1. Firefox アカウント

Firefox アカウントはユーザー名、パスワード、メールアドレス、年齢で作成できた。

今回は新規にアドオンを作る必要がない。作業の流れが可能かどうか見た後でやる。github に公式サンプルが沢山あるので、その一つを試しに web-ext build して非公開 (Unlisted) を選んでアドオンページにアップロードし、レビュー・署名してもらった。続いて表示された URL から署名後のパッケージをダウンロードすればインストールできた。

AMO に公開する場合は毎回これをやることになる (って書いてあったけど API でもできるのか?) が、今のところ web-ext publish のようなオプション (タスクというのか) はないようだ。さらに言えば new なり init なりもないけど他のこと整備する方が先だっただろうし、これからの話だろう。

2. JWT issuer と JWT key

JWT issuer と JWT key はアカウントのページ上部メニュー「APIキーの管理」へ進んで「生成」のようなボタンをクリックしたらすぐ表示された。当たり前だけど「秘密にしろ」と注意される。

3. web-ext sign

別のアドオンサンプルを web-ext build のち web-ext sign で署名した。zip ではなく xpi が作成される。

> web-ext sign --api-key=some_issuer --api-secret=some_key64
Building web extension from C:\path\to\webextensions-examples\beastify
No extension ID specified (it will be auto-generated)
Validating add-on [..........................................................................................]
Validation results: https://addons.mozilla.org/en-US/developers/upload/some_path
Downloading signed files: 100%
Downloaded:
    .\web-ext-artifacts\beastify-1.0-an+fx.xpi
Extension ID: {some_id}
SUCCESS

アドオンページにアップロードした場合と同様に META-INF ディレクトリが作成される (中身と使われ方)。

.web-extension-id ファイルが作られた。WebExtensions and the Add-on ID に「AMO の API を使っている (AMO のアドオンページにアップロードするのではない) 場合、リクエストに ID が必要」と書いてある。ほか、WebExtensions の一部の API では ID 使うらしい。筆者には使う必要はない(けど次で一応使っておいた)。「失くすな」と書いてあった。非公開アドオンだけど失くして ID が変わるとプロファイル中のデータの場所が変わるだろうから失くしたくない。

# This file was created by https://github.com/mozilla/web-ext
# Your auto-generated extension ID for addons.mozilla.org is:
{some_id}

変更から動作確認までの工程に組み入れて頻繁にやるものではない

ソフトウェアの署名ってこんな雑に (ボタンのアイコンどれがいいか試してるからまた署名してもらおう、のように) 使うのか、ということで動作確認したところ、一度 web-ext sign すると manifest.json に書いたバージョンを変更しないとエラーになり、署名されないと判った。

Building web extension from C:\path\to\ext
Using previously auto-generated extension ID: {someid}
Server response: Version already exists. (status: 409)
FAIL

そりゃそうだ……なので、変更→ビルド→署名→インストールは確かにできるのだが、インストール前のいち工程として頻繁にできない。実際はできるけど怒られたりアホ扱いされたりしたら良くない。次にインストールについて書いた後で、署名なしの一時的なインストール (web-ext run) について少し書いて終わる。

4. インストール

Extension Auto-Installer(AMO) でインストールできた。wget.exe --post-file=web-ext-artifacts/beastify-1.0-an+fx.xpi http://127.0.0.1:8888/。ただし ver. 57 以降はこのツールは使えないので、そんなに意味はない。web-ext run をやってみて嫌だったらエクスプローラからアドオン管理画面へドラッグアンドドロップすればいいや……と思っていたけど、インストール自体を頻繁にやらないのでどうでもよいことになった。

なお、一応 ID を使う場合も試した (既にインストールには署名が必須になっているので意味はないが ver. 54 だとできる)。manifest.jsonapplications.gecko.id を設けて .web-extension-id ファイルの内容を書き web-ext build してできた zip をインストールすれば良いが、警告が表示される。

f:id:PrsPrsBK:20170906120916j:plain

ID なしの zip ならばインストールできず、エラーメッセージ「Add-on_download_failed (error code -3)」が表示され、ドラッグアンドドロップしてみると「壊れているのでインストールできませんでした」となる。Lubuntu 17 の Firefox Developer Edition ver. 56 だと ID あるだけではインストールできない。

5. web-ext run (途中)

web-ext run によって署名なしでも一時的なインストールができるので、開発中はこれを使うことになる。ファイルを変更したら自動でリロードしてくれるらしい。まだちょっとスムーズな使用ができてない、というかリファレンスにあるような動作を確認できてないので、ここで終わり。後で書くかもしれない。

追記 少しだけど翌日続きを書いた

感想

当たり前だが署名が必要なのでちょっと時間かかるしオフラインでは同じことができない。署名必須になったことには文句はない。自分と同じように面倒くさがっている人間の参考になれば良いと思ってノートを書き直した。面倒だった。余談を述べると beast という言葉は (サンプルが選んだ言葉なんだけど) レビューで警告される。mozilla も面倒くさそうだと感じた。あと WebExtension's' と WebExtension と見かけたんだけど使い分けが分かっていない。

f:id:PrsPrsBK:20170906121336j:plain