プライバシータブに出現した、「お客様の拡張機能は、ホスト権限が要求されているため、詳しい審査が必要となり、公開が遅れる可能性があります。」とのメッセージ

ホスト権限って何だよ。マッチパターンって何だよってことでそれについて、また関連する情報について調べてみました。

ホスト権限とは

ホスト権限は、拡張機能のマニフェストの「permissions」フィールドと「content_scripts」フィールドで指定されたマッチパターンです

まず拡張機能のマニフェストは、自分で作成したmanifest.jsonのことですね。ここに名前やpopupの不ファイル名、content scriptの発動するタイミング等々を記述しました。

このようにcontent_scripts.matchesとpermissionsでURLを指定します。

ポイントは、content_script.matchesに記述したURLはpermissionsに記述したものと同等に解釈されることです。

写真の例では、この拡張機能は「https://example.com/*」と「https://google.com/*」双方にアクセスする権限が与えられます。

これがホスト権限です。つまり「どのページ(ドメイン)にアクセスすることができるか」というのがホスト権限ということになります。

chrome設定の拡張機能からもこの設定は閲覧することができます。

注意が必要なのはアップデートで権限をなくしたり狭めたりした場合でも、再インストールしない限り、ユーザーから見えるアクセス権限の表示は縮小されません。

また、更に注意が必要なのが例えば「https://example.com/hello.html」を記述した場合も、与えられるホスト権限は後ろのパスの部分を無視した「https://example.com/*」になります。

何故これが必要なのか

プライバシーの観点から拡張機能が全てのページにアクセスしたり、変更、読み取りができることは不都合だったのでしょう。

コンテンツスクリプトを動作させるのにcontent_script.matchesに記述する必要があるのはもちろんですが、webRequest、cookies、tabs.executeScript()、tabs.insertCSS()のAPIを使用する場合も、利用するマッチパターンをpermissionsに記述する必要があります。

やや蛇足ですが、chrome70からユーザーが拡張機能に対してアクセスできるホスト権限を変更できるようになりました。

何が問題なのか。何の警告メッセージなのか

この警告は正直大げさだと思います。ですがホスト権限に、拡張機能の動作に不必要なものが含まれていると審査に通りません。

例えばある特定ページ「https://example.com」上でしか動作しない拡張機能でも、「<all_urls>」や「https://*」などが指定されていた場合は、不必要なホスト権限とみなされます。

しかし例えば「https://example.com/hello.html」でのみ動作が必要なcontent scriptが存在する場合は自動的に「https://example.com/*」のホスト権限が付与されてしまいますがこれは防ぎようがなく、必要十分の範囲内といえます。筆者の場合はこのパターンで、3日くらいで承認が降りました。

反対にcontent script、通信が必要なAPIを使用せず、popupからユーザーのクリックにより発火するようなものならば、どのホスト権限も必要ありません。
代わりにactiveTabという権限を使い同等なことができます。ユーザーにも権限の警告は表示されないので基本的にこちらを使ったほうが良いのでしょう。

マッチパターンとは

すごく簡単に言うと、正規表現などが使えるURLってことですね。

Host permissions and content script matching are based on a set of URLs defined by match patterns. A match pattern is essentially a URL that begins with a permitted scheme (http, https, file, or ftp, and that can contain ‘*’ characters.

ホスト権限とコンテンツスクリプトマッチングはマッチパターンによって定義された一連のURLによって構成されます。マッチパターンは実際にはURLです。そのURLはhttp, https, file, ftpのように許可されたスキームから始まり、*を含むことができます。

https://developer.chrome.com/docs/extensions/mv2/match_patterns/

因みに*は正規表現と呼ばれ、一般的に0文字以上の任意の文字列を表します。

特別な<all_urls>というパターンは許可されたスキームから始まるあらゆるURLに相当します。マッチパターンは3部分に分かれています。

①scheme スキーム
例えばhttp, https, file などアクセスする方法を表す、URLの最初の部分に当たる文字列。

host ホスト
例えばwww.google.comや、*.google.comや、*のこと。もしスキームがfileなら、ホストはないってことになるよ。

path パス
たとえば、/*や/foo*や/foo/barのこと。パスはホスト権限で表す必要があるよ。だけどすべて/*に変換されるよ。

https://developer.chrome.com/docs/extensions/mv2/match_patterns/

この他にも例やだめな例もつかって詳しく説明していますので気になった方はいかがでしょうか。