1

親愛なるみんな。

私たちのアプリケーションにはいくつかのブラウザー用に実装された暗号署名拡張機能があり、すべてうまくいきましたが、新しい 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 ページの呼び出しを受け入れるようにこのコードをどのように適応させるかということです。

4

1 に答える 1

1

プロセス間通信には、メッセージ マネージャーとフレーム スクリプトを使用する必要があります。

// bootstrap.js
function addAddonListener(win) {
    win.messageManager.addEventListener(
        "CryptoApiExtension_request",
        function (event) {
            var response = CryptoApiExtension.handleRequest(event.json);
            var childMM = event.target.messageManager;
            childMM.sendAsyncMessage("CryptoApiExtension_response", response);
        }
    );
    // <...>
    win.messageManager.loadFrameScript("chrome://myaddon/content/frame-script.js", true);
}

// frame-script.js
sendAsyncMessage("CryptoApiExtension_request", request);
addMessageListener(
    "CryptoApiExtension_response",
    function(event) {
        handleResponse(event.json);
    }
);
于 2016-01-04T09:16:52.010 に答える