親愛なるみんな。
私たちのアプリケーションにはいくつかのブラウザー用に実装された暗号署名拡張機能があり、すべてうまくいきましたが、新しい Mozilla のマルチプロセス API 移行 (E10S aka Electrolysis) で問題に直面しました。
私たちの Web パーツは、C で記述されたネイティブ ライブラリと連携する拡張機能と対話します (この部分には c-types lib を使用します)。
現在、Firefox はコードの適応が必要なマルチプロセス モデルに移行しています。現時点で最も重要で複雑な部分は、コンテンツから拡張機能への通信の再実装です。関連する公式ドキュメントに従って実装されました
次の方法でブートストラップ拡張機能の初期化を使用しました。
function startup(params, reason) {
include("chrome/content/extmain.js");
mainWindow = winMediator.getMostRecentWindow("navigator:browser");
if (null == mainWindow) {
var windowListenerWidget = {
onOpenWindow: function (aWindow) {
winMediator.removeListener(windowListenerWidget);
var mainWindow = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow);
mainWindow.addEventListener("load", function onWindowLoad() {
mainWindow.removeEventListener("load", onWindowLoad);
addAddonListener(mainWindow);
});
},
onCloseWindow: function (aWindow) {
},
onWindowTitleChange: function (aWindow, aTitle) {
}
};
winMediator.addListener(windowListenerWidget);
} else {
addAddonListener(mainWindow);
}
}
function addAddonListener(win) {
win.document.addEventListener(
"CryptoApiExtension_HandleMsg",
function (event) {
var node = event.target;
if (!node || node.nodeType != 3) {
return;
}
var response = CryptoApiExtension.handleMessage(JSON.parse(node.nodeValue));
var doc = node.ownerDocument;
node.nodeValue = JSON.stringify(response);
var event = doc.createEvent("HTMLEvents");
event.initEvent("CryptoApiExtension_response", true, false);
return node.dispatchEvent(event);
}, false, true);
}
上記のこのコードは、新しいマルチプロセス アーキテクチャでは壊れています。私たちが読んだドキュメントはたくさんありますが、それでもこの問題を処理する方法はありません。
問題は、拡張機能が Web ページの呼び出しを受け入れるようにこのコードをどのように適応させるかということです。