Вызов дополнения с веб-страницы в новом многопроцессорном Firefox

Дорогие все

В нашем приложении реализованы расширения для криптографической подписи для нескольких браузеров, все прошло нормально, но теперь мы столкнулись с проблемой перехода на новый многопроцессный API Mozilla (E10S aka Electrolysis).

Наша веб-часть взаимодействует с расширением, которое взаимодействует с нативной библиотекой, написанной на C (для этой части мы используем lib c-types).

Теперь 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);
}

Этот код выше был нарушен с новой многопроцессорной архитектурой. Мы прочитали много документации, но мы никак не могли решить эту проблему.

Вопрос в том, как адаптировать этот код, чтобы расширение принимало вызовы веб-страниц.

1 ответ

Решение

Теперь вам нужно использовать MessageManager и рамочные сценарии для межпроцессного взаимодействия:

// 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);
    }
);
Другие вопросы по тегам