通信方式は単純です:
- あなたのデベロッパーツールパネルには、背景ページ
- にポートを開き、背景ページは、そのポートでリッスンし、タブID - ポートマッピングのルックアップテーブルを格納する
- バックグラウンドページはコンテンツスクリプトからのメッセージもリッスンし、上記ルックアップテーブルを使用してメッセージをchrome.runtime.onMessageがあるので
デベロッパーツール-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];
});
あなたのコードは、* 3人の*のonMessageリスナーを追加しますchrome.extension.onMessageに代わる実際のAPIと優先するAPI 3つのリスナのうち2つはdevtoolsパネルにメッセージを送るものであり、どちらもタブからのメッセージによってトリガされます。コードを再編集します。 – wOxxOm
@wOxxOm提案に感謝します。私はこれに新しいですし、コードは私によって書かれていないが、それは私が使用している例/参考に過ぎなかったので、もう少しヒントを教えてください。 – stafan
私はそれがここでどのように行われているのが好きではないので、おそらくそれを完全に書き直さなければならないでしょう。 [メッセージングのドキュメント](https://developer.chrome.com/extensions/messaging)を読んだことがありますか?実装は簡単です。 – wOxxOm