我已经检查过很多关于Chrome扩展程序中邮件传递的问题,但我没有找到与此有关的具体内容。
我正在使用chrome.devtools * API,当开发人员工具栏停靠时,我在内容脚本之间发送邮件时遇到问题。当它没有停靠即浮动时,一切正常。
以下是我正在做的一个简短示例。
devtools.js
chrome.devtools.panels.create("myExtension", "img/icon.png",
"/panel.html", function(extensionPanel) {
var myData; //this variable gets manipulated before a user
//clicks on the panel
extensionPanel.onShown.addListener(function(panelWindow) {
chrome.extension.sendMessage({greeting: "update my data", data: myData}, function(response) {});
});
});
然后在我的后台脚本(eventPage.js)中,我收听此消息并将其传递给panel.js
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
if (request.greeting == "update my data"){
chrome.tabs.sendMessage(sender.tab.id, {greeting: "show data", showResource: request.data}, function(response) {});
}
});
最后我在我的panel.js(从panel.html加载)中监听'show data'调用
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
if (request.greeting == "show data") {
//do stuff with my data here
});
基本上,我需要将devtools.js之间的消息传递给panel.js,但唯一的方法是使用后台脚本作为中介。
devtools.js - > background.js - > panel.js。
只要开发工具面板没有停靠在窗口上,这实际上就可以正常工作。当它停靠时我得到一个错误,因为sendMessage()除了标签id为-1之外不会,这就是当dev工具停靠在窗口时sender.tab.id等于的内容。我也尝试使用chrome.tabs.connect - 持久连接 - 但遇到了同样的问题。
答案 0 :(得分:1)
我最近也发现了如何做到这一点。
“Google Pagespeed”使用的一种技术是获取被检查窗口的标签ID,并使用端口在扩展和背景之间来回传递。
每当您想要向分机发送消息时,您都会查找标签ID并获取其端口。
// get the inspected windows tab id from the panel
var tabId = chrome.devtools.inspectedWindow.tabId;
// create the port
var port = chrome.extension.connect({name: 'connection'});
// keep track of the port and tab id on the background by
// sending the inspected windows tab id
port.postMessage(['connect', tabId])
var activeListeners = {};
chrome.extension.onConnect.addListener(function(port) {
port.onMessage.addListener(function(message) {
if (message[0] === 'connect') {
// get the tab id
var tabId = message[1];
// save the reference to the port
activeListeners[tabId] = port;
// make sure we clean up after disconnecting (closing the panel)
activeListeners[tabId].onDisconnect.addListener(function() {
delete activeListeners[tabId];
});
}
});
});
这不是一个非常彻底的解释,但我希望你明白这一点。