エクステンションからコンテンツスクリプトへのポートを開く例がほしい場合は、ここで私が考えることができる最も簡単な方法を示します。背景は単にポートを開き、 "Hello tab!"あなたはウェブページをクリックするたびにコンテンツスクリプトがメッセージをバックグラウンドに送信します。
私はこれがかなり簡単だと思うので、なぜあなたはそれほどストレスがあるのか分かりません。バックグラウンドが接続しようとしたときに、コンテンツタブが既にリッスンしていることを確認してください(「完了」イベントまで待ってください)。
manifest.jsonを:
{
"name": "TestExt",
"version": "0.1",
"background_page": "background.html",
"content_scripts": [{
"matches": ["http://localhost/*"], // same as background.html regexp
"js": ["injected.js"]
}],
"permissions": [
"tabs" // ability to inject js and listen to onUpdated
]
}
がbackground.html:
<script>
var interestingTabs = {};
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
// same as manifest.json wildcard
if (changeInfo.url && /http:\/\/localhost(:\d+)?\/(.|$)/.test(changeInfo.url)) {
interestingTabs[tabId] = true;
}
if (changeInfo.status === 'complete' && interestingTabs[tabId]) {
delete interestingTabs[tabId];
console.log('Trying to connect to tab ' + tabId);
var port = chrome.tabs.connect(tabId);
port.onMessage.addListener(function(m) {
console.log('received message from tab ' + tabId + ':');
console.log(m);
});
port.postMessage('Hello tab!');
}
});
</script>
injection.js:
chrome.extension.onConnect.addListener(function(port) {
console.log('Connected to content script!');
port.onMessage.addListener(function(m) {
console.log('Received message:');
console.log(m);
});
document.documentElement.addEventListener('click', function(e) {
port.postMessage('User clicked on a ' + e.target.tagName);
}, true);
});
これまでのコードと、マニフェストを投稿してください。 – serg