통신 방식은 간단하다 :
- 당신의 DevTools로 패널은 배경 페이지
배경 페이지가 해당 포트에서 수신
- 과에 포트를 엽니 다 TabId - 포트 매핑의 조회 테이블을 저장합니다.
- 배경 페이지는 콘텐츠 스크립트의 메시지를 수신하고 위의 조회 테이블을 사용하여 메시지를 chrome.runtime.onMessage는이 때문에
DevTools로 - panel.js 포트 채널을 대응
var port = chrome.runtime.connect();
port.onMessage.addListener(message => {
$id('insertmessagebutton').innerHTML = message.content;
});
$id('executescript').onclick =() =>
runContentScript({code: "console.log('Content script executed')"});
$id('insertscript').onclick =() =>
runContentScript({file: "inserted-script.js"});
$id('insertmessagebutton').onclick =() => {
runContentScript({code: "document.body.innerHTML='<button>Send to panel</button>'"});
runContentScript({file: "messageback-script.js"});
};
function runContentScript(params) {
port.postMessage(
Object.assign({
tabId: chrome.devtools.inspectedWindow.tabId,
}, params)
);
}
function $id(id) {
return document.getElementById(id);
}
background.js는
var tabPorts = {};
chrome.runtime.onConnect.addListener(port => {
let tabId;
port.onMessage.addListener(message => {
if (!tabId) {
// this is a first message from devtools so let's set the tabId-port mapping
tabId = message.tabId;
tabPorts[tabId] = port;
}
if (message.code || message.file) {
delete message.tabId;
chrome.tabs.executeScript(tabId, message);
}
});
port.onDisconnect.addListener(() => {
delete tabPorts[tabId];
});
});
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
const port = sender.tab && tabPorts[sender.tab.id];
if (port) {
port.postMessage(message);
}
});
chrome.tabs.onRemoved.addListener(tabId => {
delete tabPorts[tabId];
});
chrome.tabs.onReplaced.addListener((newTabId, oldTabId) => {
delete tabPorts[oldTabId];
});
코드는 * 세 *의 onMessage 리스너를 추가 chrome.extension.onMessage를 대신하는 실제적이고 선호되는 API. 세 개의 수신기 중 두 개는 devtools 패널에 메시지를 보내고 두 개의 수신기는 탭의 메시지에 의해 트리거됩니다. 코드를 다시 작성하십시오. – wOxxOm
@wOxxOm 제안에 감사드립니다. 이 글을 처음 접했을 때 좀 더 힌트를 주시겠습니까? 코드는 저에게 쓰여진 것이 아니라 단지 사용하고있는 예제/참고서 일뿐입니다. – stafan
나는 그것이 어떻게 끝났는지 싫어하기 때문에 그것을 다시 써야 할 것이다. [메시징 설명서] (https://developer.chrome.com/extensions/messaging)를 읽으셨습니까? 구현은 간단합니다. – wOxxOm