您能否创建一个扩展程序集线器,用于注册其他扩展程序并具有消息传递中心。
所有想要与公共数据库通信的扩展都可以通过集线器进行。从后台页面初始化后,每个扩展都可以向中心注册他们的 ID 以及他们想要订阅的事件。
从每个扩展注册操作
chrome.tabs.sendRequest("hub", {
action: "register",
key: "somePrivKey",
id: "extId",
subscribeTo: ["createFoo", "deleteFoo"]
});
然后,执行的每个操作都将传达给集线器:
chrome.tabs.sendRequest("hub", {
action: "createFoo",
key: "somePrivKey",
context: 1
});
然后集线器扩展将监听事件。对于“注册”操作,集线器会将扩展注册为“subscribeTo”操作的端点。对于其他操作(“createFoo”或“deleteFoo”),集线器将遍历事件的已注册扩展列表并执行发送“操作”名称和可选“上下文”的 sendRequest。
在集线器和所有想要通信的扩展之间可能知道一个共享的“密钥”,以防止集线器侦听来自未知来源的事件。
集线器扩展 background.js:
var actionToExtMap = {};
chrome.extension.onRequestExternal.addListener(function(request, sender, sendResponse) {
if (request.key === "somePrivKey") {
if (request.action === "register") {
for (i = 0; i < request.subscribeTo.length; i++) {
var action = request.subscribeTo[i];
var extsionsForAction = actionToExtMap[action] || [];
extsionsForAction.push(request.id)
}
} else if (request.action) {
var extensionsToSendAction = actionToExtMap[request.action];
for (i = 0; i < extensionsToSendAction.length; i++) {
chrome.extension.sendRequest(extensionsToSendAction[i], {
action: request.action,
context: request.context //pass an option context object
}
}
}
}
});