概要
将来、Jetpack 拡張は Firefox 本体と別プロセスで動作するようになる。 Add-on SDK (Jetpack SDK) の API はプロセス分離後もそのまま利用可能となるように設計されている。
将来の Firefox のプロセス構造
Firefox の Electrolysis (E10S) というプロジェクトでは、ブラウザ本体・プラグイン・Web ページのコンテンツ・Jetpack 拡張を それぞれ別のプロセスで実行することが計画されている。 プロセスを分離する効果としては以下のような点が挙げられる。
- UI の応答性が向上する。
- コンテンツ内容に起因するレンダリング性能の低下やクラッシュを避け、安定性が向上する。
- マルチコア環境でのパフォーマンスが向上する
2011/05/08 時点の Electrolysis プロジェクトの状況は次のようになっている。
項目 | 状況 |
---|---|
プラグインのプロセス分離 (Out-of-process plugins) | Firefox 3.6.4 でリリースされた。 Firefox 3.6.4 以降で Flash などを用いたページを閲覧し、タスクマネージャを確認すると、 firefox.exe の他に plugin-container.exe というプロセスが動いているのが確認できる。 |
コンテンツのプロセス分離 (Out-of-process tabs) | スマートフォン向けの Firefox 4 for Android and Maemo (Fennec) でリリースされた。 PC 向けの Firefox 4 には導入されず、PC 向けには将来のバージョンでのリリースとなる見込みである。 |
Jetpack 拡張のプロセス分離 | Firefox 4 で nsIJetpack というインターフェースが導入され、別プロセスで拡張を実行できるようになった。 Add-on SDK は現時点では未対応。 |
分離されたそれぞれのプロセスは個別にメモリを管理するため、 プロセスをまたがって直接情報を参照することはできない。 他のプロセスと情報をやりとりするには、プロセス間でメッセージ通信をする必要がある。 Electrolysis では、Cross-Process Object Wrapper (CPOW) というラッパーを用意しており、 JSON 形式に変換可能な JavaScript オブジェクトをプロセス間で受け渡しできる。
Add-on SDK の Electrolysis 対応
Panel、Page Worker、Page Mod、Widget、Context Menu の各 API は、 Jetpack とは異なるプロセスでスクリプトを実行できる仕様となっている。 スクリプトの実行方法とメッセージ通信については、ドキュメントの Working with Content Scripts ページで説明されている。
コンテント・スクリプトのロード
コンテント・スクリプトを利用する場合、 コンストラクタの「contentScript」「contentScriptFile」「contentScriptWhen」でスクリプトを指定する。 contentScript はスクリプト本体を文字列として指定する。 contentScriptFile はスクリプトの URL を指定する。 スクリプトは data フォルダに格納し、 self.data.url() で URL を取得する。インターネット上のスクリプトは実行できない。
contentScriptWhen には "start" "ready" "end" のいずれかを指定する。 "start" はページのロードが開始した直後、 "ready" は DOM の読み込み完了後、 "end" は JavaScript や CSS、画像を含めてページのロードが完了した後にスクリプトが実行される。
port を介したメッセージ通信
コンテント・スクリプトとアドオン・スクリプトからはそれぞれ port オブジェクトにアクセスできる。 port.emit() で送信したメッセージは、port.on() で受信できる。
コンテント・スクリプトからは、self.port で port オブジェクトが得られる。
self.port.emit("myContentScriptEvent", myContentScriptEventPayload); self.port.on("myAddonEvent", function(myAddonEventPayload) { // Handle the event });
アドオン・スクリプトからは worker オブジェクトの port プロパティで port オブジェクトが得られる。
var panel = require("panel").Panel({ contentScript: "self.port.emit('showing', 'panel is showing');" }); panel.port.on("showing", function(text) { console.log(text); }); panel.show();
ビルトイン message イベントによる通信
port を利用せず、"message" というビルトインイベントを利用して通信をすることもできる。 送信には「postMessage」メソッドを利用し、 受信には「onMessage」プロパティもしくは「on」メソッドでイベントハンドラを登録する。
コンテント・スクリプトからは、self.postMessage および self.on を利用する。self.postMessage(contentScriptMessage); self.on("message", function(addonMessage) { // Handle the message });
アドオン・スクリプトからは worker オブジェクトの postMessage メソッド、on メソッド、onMessage プロパティを利用する。
panel = require("panel").Panel({ onMessage: function(contentScriptMessage) { // Handle message from the content script } }); panel.postMessage(addonMessage);
プロセス分離の試行
cfx コマンドに「--e10s」オプションをつけることで Jetpack のプロセス分離を試行できる。 このオプションは現時点では「Internal Command-Specific Options」という位置づけとなっている。 ブラウザ本体で実行する必要のあるライブラリとは、e10s-adapter を介した通信が行われる。
D:\jetpack-sdk\packages\hoge> cfx run --e10s
Using binary at 'C:\Program Files\Mozilla Firefox\firefox.exe'.
Using profile at 'c:\docume~1\asukaze\locals~1\temp\tmpqwioic.mozrunner'.
info: The add-on is running.
OK
関連リンク
- Working with Content Scripts - Add-on SDK Documentation
- Multi-process Jetpack - MDC
- Jetpack Processes - MDC
- Electrolysis - MozillaWiki
更新履歴
- 2011/05/08: SDK 1.0b5 の情報で更新
- 2010/10/30: OOP-Tabs と Jetpack のプロセス分離を混同している記述があったのを修正。「プロセス分離の試行」を追加。その他全面的に見直し。
- 2010/10/09: 初版作成。