Chrome 扩展程序中发生了一些奇怪的事情。
内容脚本:
console.log('content');
chrome.extension.onRequest.addListener(function(request, sender, sendResponse){
console.log('request received');
sendResponse();
});
chrome.extension.sendRequest( JSON.stringify({'msg': 'page_loaded'}) );
它只是监听扩展消息并在页面加载时将消息发送到后台。
后台脚本:
console.log('bg');
chrome.extension.onRequest.addListener(function(request, sender, sendResponse){
sendResponse();
chrome.tabs.sendRequest(
sender.tab.id,
JSON.stringify({'msg': 'page_loaded_bg_receive'}),
function(){
console.log('sendRequest page_loaded_bg_receive callback');
});
});
它侦听消息并将消息发送到发件人选项卡。
它似乎正在工作,至少在大多数情况下页面日志中出现“收到请求”。
虽然输入 Chrome 的 url 有时会在用户点击“输入”之前加载输入的地址。这是一个奇怪的行为:页面加载,内容脚本运行,将消息发送到后台,但是当后台发送消息时 - 它失败并显示后台日志消息:
端口错误:无法建立连接。接收端不存在。miscellaneous_bindings:184 chromeHidden.Port.dispatchOnDisconnect miscellaneous_bindings:184
这是 Chrome 错误吗?如何将消息发送到预加载选项卡?
这是重现此类行为的人工最小样本。我需要在处理消息后多次调用“chrome.tabs.sendRequest”,因此调用“sendResponse”不是解决方案。