Вызов дополнения с веб-страницы в новом многопроцессорном 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);
}
);