gpt4 book ai didi

javascript - 在新的多进程 Firefox 中从网页调用插件

转载 作者:行者123 更新时间:2023-11-27 23:39:30 26 4
gpt4 key购买 nike

亲爱的大家。

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

我们的 Web 部件与扩展交互,该扩展与用 C 编写的 native 库协作(我们在这部分使用 c-types lib)。

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

我们通过以下方式使用引导扩展初始化:

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

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

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

最佳答案

您现在需要使用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);
}
);

关于javascript - 在新的多进程 Firefox 中从网页调用插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33824818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com