在新的多进程Firefox中从网页调用附加组件

时间:2015-11-20 10:51:45

标签: javascript firefox-addon firefox-addon-sdk firefox-addon-bootstrap

亲爱的。

我们在应用程序中为少数浏览器实现了加密签名扩展,一切都很顺利,但现在我们遇到了新的Mozilla多进程API迁移问题(E10S又称Electrolysis)。

我们的Web部分与扩展进行交互,扩展与用C编写的本机库协作(我们利用这部分的c-type lib)。

现在Firefox正在转向需要代码调整的多进程模型。目前最重要和最复杂的部分是内容到扩展的通信重新实现。它是根据相关官员documentation

实施的

我们以下列方式使用了bootstrap扩展初始化:

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);
}

上面的代码被新的多进程架构打破了。我们已经阅读了很多文档,但仍然无法处理这个问题。

问题是:如何调整此代码以使扩展接受网页调用?

1 个答案:

答案 0 :(得分:1)

您现在需要使用messageManagers and frame scripts进行进程间通信:

// 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);
    }
);