devtools/chrome-extension/src/extension/background.ts (31 lines of code) (raw):
// background.ts - Manifest V3版本
const connections = {}
// 处理扩展程序的连接请求
chrome.runtime.onConnect.addListener(function (port) {
if (port.name === '@formily-devtools-panel-script') {
const extensionListener = function (message) {
// 原始的连接事件不包含开发者工具网页的标签页标识符,
// 所以我们需要显式发送它。
if (message.name == 'init') {
connections[message.tabId] = port
return
}
// 其他消息的处理
}
// 监听开发者工具网页发来的消息
port.onMessage.addListener(extensionListener)
port.onDisconnect.addListener(function (disconnectedPort) {
port.onMessage.removeListener(extensionListener)
const tabs = Object.keys(connections)
for (let i = 0, len = tabs.length; i < len; i++) {
if (connections[tabs[i]] == port) {
delete connections[tabs[i]]
break
}
}
})
}
})
// 从内容脚本接收消息,并转发至当前标签页对应的开发者工具网页
chrome.runtime.onMessage.addListener(function (request, sender) {
// 来自内容脚本的消息应该已经设置 sender.tab
if (sender.tab) {
const tabId = sender.tab.id
if (tabId && tabId in connections) {
connections[tabId].postMessage(request)
}
}
return true
})