Chrome 権限
Chrome 権限の使用
最も強力な低レベルモジュールは、「Chrome 権限」を使用して実行されます。この権限を使用すると、ホストシステムへの無制限のアクセス権を付与する、悪名高い Components
オブジェクトにアクセスできます。モジュールは、Components オブジェクトから、ブラウザが提供するほとんどの機能を実行できます。このような権限を取得するには、モジュールで以下のような文を使用して取得の意図を宣言する必要があります。
var {Cc, Ci} = require("chrome");
require("chrome")
によって返されるオブジェクトを、Mozilla JS 環境の「分割代入(destructuring assignment)」機能を使用して展開すると、通常の Components.*
エイリアスが提供されます。
Cc
Components.classes
のエイリアス
Ci
Components.interfaces
のエイリアス
Cu
Components.utils
のエイリアス
Cr
Components.results
のエイリアス
Cm
Components.manager
のエイリアス
components
Components
自体のエイリアス(小文字であることに注意してください)。このエイリアスから、通常あまり使用されない Components.stack
や Components.isSuccessCode
などのプロパティにアクセスできます。
注:require("chrome")
文は、Chrome 機能や Components
API にアクセスする唯一の方法です。Components
オブジェクトには、モジュールから絶対アクセスしないでください。SDK ツールがモジュールコードの中に Components
への直接参照を発見した場合、警告が発生します。
Chrome 権限は、絶対に必要な場合以外、モジュールで使用しないでください。Chrome 権限を使用したモジュールは、セキュリティ面を慎重に確認する必要があります。このようなモジュールのバグは、ほとんどがセキュリティ上の危険要因となります。
マニフェストの生成
マニフェストは、生成後の XPI に含まれているリストで、require()
アクセスを要求したモジュールとアクセスを要求されたモジュールが記載されます。このリストにはまた、chrome アクセスを要求したモジュールも記録されています。このリストの生成にあたっては、含まれているすべてのモジュールで require(XYZ)
文がスキャンされ、それらが参照する "XYZ" 文字列が記録されます。
マニフェストの実装が完了すると、ランタイムローダーが機能して、マニフェストにリストされていないモジュールに対する require()
が実際に禁止されます。同様に、Chrome 権限を要求したことがマニフェストに記録されているモジュール以外、Chrome 権限を取得できないようになります。これにより、実行コードに適用されているのと同じ権限の制約が確実に実現されるので、アドオンのレビュー効率が向上します(この作業が完了していない場合、モジュールがこの権限の制約を回避できることがあります)。
マニフェストは、完全な Javascript パーサではなく、単純な regexp ベースのスキャナによって作成されます。そのため、開発者は単一の静的文字列を持つ単純な require
文を 1 行に 1 つだけ記述するという規則に従う必要があります。スキャナが require
の指定を検出できなかった場合、その指定はマニフェストに追加されず、実装後にランタイムコードで例外が発生することになります。
例えば、以下のコードはいずれもマニフェストスキャナによって検出されないので、require()
呼び出しによって指定したモジュールをインポートできず、実行時に例外が発生します。
// all of these will fail!
var xhr = require("x"+"hr");
var modname = "xpcom";
var xpcom = require(modname);
var one = require("one"); var two = require("two");
つまり開発者は、モジュールで使用する権限を(セキュリティレビューアに対して)宣言する、それらの権限をモジュールのローカルのネームスペースにマッピングする方法を制御するという 2 つの目的で require() を使用します。したがってその点で、require()
文を明確にし、解析しやすくする必要があります。将来的には、権限のより詳細な表現を可能にするため、マニフェストのフォーマットから宣言部分を別ファイルに移すことが考えられています。
「cfx xpi
」や「cfx run
」など、マニフェストを作成するコマンドを実行すると、含まれているすべてのモジュールで、Cc
/Ci
エイリアス(または拡張形式 Components.classes
)がスキャンされます。拡張形式が検出された場合、または require("chrome") の記述と対応していない「Cc」などを検出した場合、警告が発生します。これらの警告は、開発者が適切なパターンを使用できるようにするためのガイドです。モジュール開発者は、警告に注意し、警告が発生しなくなるようにコードを訂正してください。