Chrome 扩展:devtools面板可以接收一次性消息吗?
Chrome extension: can devtools panel receive one-time messages?
在我的 devtool.js 代码中,我正在收听这样的一次性消息:
chrome.devtools.panels.create("TT's Automatron", "devtool/icon.ico", "devtool/panel.html",
function(panel) {
var panelconsole;
panel.onShown.addListener(function tmp(panel) {
panel.onShown.removeListener(tmp);
panelconsole = panel;
// this works
chrome.runtime.sendMessage({type:'get-status'}, function(response) {
panelconsole.write_queue(response.globalstatus);
});;
// this does not work - cannot listen to the same messages from popup.js
// as I do it in background.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
alert();
});
});
}
);
在代码中我可以发送一次性消息但不能收听一次性消息。 Alert()
永远不会触发,即使发送消息也是如此。在后台脚本中,我可以通过 chrome.runtime.onMessage.addListener()
毫无问题地收听消息,那么为什么不在 devtools 中呢?
我正在阅读 documentation 但没有显示接收到的一次性消息,只有会话连接。这是否意味着不可能?
在 background 脚本中,我正在收听相同的消息并且它在那里工作:
// listening to the same messages as in devtools panel
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
alert('This works');
switch(request.type) {
// recognising different messages
case "start-tron":
// ..some code..
sendResponse({globalstatus: globalstatus});
break;
}
});
消息来自 popup 脚本:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.runtime.sendMessage({type: "start-tron", tabid:tabs[0].id});
});
也许我应该提到后台和 devtools:
之间还有一个打开的长期会话连接
var port = chrome.runtime.connect({name: 'automatron_console'});
port.onMessage.addListener(function(item) {
// if reference exists - panel is open
if (panelconsole) {
panelconsole.write_log(item);
}
});
那么,为什么我不能像在 background.js 中那样在 devtools.js 中收听来自弹出窗口的消息?
在 documentation 中没有直接指出,无法在开发工具面板中接收 one-time 消息,但是只提到了 long-lived 连接所以我想
one-time devtools 不支持消息传递。
好像可以发送one-time消息,如上面的脚本所示,但是收不到。
我们只能使用long-lived连接:
// creating communication port in devtool script
var devtools_connection = chrome.runtime.connect({name: 'devtools_connection'});
// listening to the port messages
devtools_connection.onMessage.addListener(function(request, sender, sendResponse) {
// sending response back to what sent this message
sendResponse('some response');
});
// sending messages to the port
devtools_connection.postMessage({msg: 'some message'});
在我的 devtool.js 代码中,我正在收听这样的一次性消息:
chrome.devtools.panels.create("TT's Automatron", "devtool/icon.ico", "devtool/panel.html",
function(panel) {
var panelconsole;
panel.onShown.addListener(function tmp(panel) {
panel.onShown.removeListener(tmp);
panelconsole = panel;
// this works
chrome.runtime.sendMessage({type:'get-status'}, function(response) {
panelconsole.write_queue(response.globalstatus);
});;
// this does not work - cannot listen to the same messages from popup.js
// as I do it in background.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
alert();
});
});
}
);
在代码中我可以发送一次性消息但不能收听一次性消息。 Alert()
永远不会触发,即使发送消息也是如此。在后台脚本中,我可以通过 chrome.runtime.onMessage.addListener()
毫无问题地收听消息,那么为什么不在 devtools 中呢?
我正在阅读 documentation 但没有显示接收到的一次性消息,只有会话连接。这是否意味着不可能?
在 background 脚本中,我正在收听相同的消息并且它在那里工作:
// listening to the same messages as in devtools panel
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
alert('This works');
switch(request.type) {
// recognising different messages
case "start-tron":
// ..some code..
sendResponse({globalstatus: globalstatus});
break;
}
});
消息来自 popup 脚本:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.runtime.sendMessage({type: "start-tron", tabid:tabs[0].id});
});
也许我应该提到后台和 devtools:
之间还有一个打开的长期会话连接var port = chrome.runtime.connect({name: 'automatron_console'});
port.onMessage.addListener(function(item) {
// if reference exists - panel is open
if (panelconsole) {
panelconsole.write_log(item);
}
});
那么,为什么我不能像在 background.js 中那样在 devtools.js 中收听来自弹出窗口的消息?
在 documentation 中没有直接指出,无法在开发工具面板中接收 one-time 消息,但是只提到了 long-lived 连接所以我想 one-time devtools 不支持消息传递。
好像可以发送one-time消息,如上面的脚本所示,但是收不到。
我们只能使用long-lived连接:
// creating communication port in devtool script
var devtools_connection = chrome.runtime.connect({name: 'devtools_connection'});
// listening to the port messages
devtools_connection.onMessage.addListener(function(request, sender, sendResponse) {
// sending response back to what sent this message
sendResponse('some response');
});
// sending messages to the port
devtools_connection.postMessage({msg: 'some message'});