バックグラウンドスクリプトからHTMLページに関連付けられているコンテンツスクリプトに変数を送信しようとしています。コンテンツスクリプトは、バックグラウンドスクリプトから受け取った変数でHTMLコンテンツを更新します。
問題は、このエラーメッセージが表示されることです。
Error: Could not establish connection. Receiving end does not exist.
バックグラウンドスクリプトmain.js
:
var target = "<all_urls>";
function logError(responseDetails) {
errorTab = responseDetails.tabId;
console.log("Error tab: "+errorTab);
errorURL = responseDetails.url;
console.log("Error URL: "+errorURL);
//send errorURL variable to content script
var sending = browser.tabs.sendMessage(errorTab, {url: errorURL})
.then(response => {
console.log("Message from the content script:");
console.log(response.response);
}).catch(onError);
//direct to HTML page
browser.tabs.update(errorTab,{url: "data/error.html"});
}//end function
browser.webRequest.onErrorOccurred.addListener(
logError,
{urls: [target],
types: ["main_frame"]}
);
error.html
は:
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
The error received is <span id="error-id"></span>
<script src="content-script.js"></script>
</body>
</html>
content-script.js
:
//listen to errorURL from the background script.
browser.runtime.onMessage.addListener(request => {
console.log("Message from the background script:");
console.log(request.url);
return Promise.resolve({response: "url received"});
}); //end onMessage.addListener
//update the HTML <span> tag with the error
document.getElementById("error-id").innerHTML = request.url;
manifest.json
:
{
"manifest_version": 2,
"name": "test",
"version": "1.0",
"background": {
"scripts": ["main.js"]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["webextension/data/content-script.js"]
}
],
"permissions": [
"<all_urls>",
"activeTab",
"tabs",
"storage",
"webRequest"
]
}
エラーが表示されます:
_Error: Could not establish connection. Receiving end does not exist.
_
コンテンツスクリプトがメッセージをリッスンしていないタブと通信しようとするとき(例: tabs.sendMessage()
、 tabs.connect()
)これには、コンテンツスクリプトがタブに存在しない場合も含まれます。
about:*
_ URLにコンテンツスクリプトを挿入することはできません問題については、コンテンツスクリプトがタブに挿入されていないため、このエラーが発生しています。 _main_frame
_ _webRequest.onErrorOccurred
_イベントでメッセージを送信しようとする時点では、タブのURLはすでに_about:neterror?[much more, including the URL where the error occurred]
_です。あなたは、コンテンツスクリプトを_about:*
_ URLに挿入できません。したがって、タブにはメッセージをリッスンするコンテンツスクリプトはありません。
具体的には、manifest.json_<all_urls>
_エントリで _content_scripts
_match pattern を使用しています。 。 _<all_urls>
_一致:
特別な値_
"<all_urls>"
_は、サポートされているスキーム(「http」、「https」、「file」、「ftp」、「app」)のいずれかのすべてのURLに一致します。
_about:*
_ URLとnotは一致しません。
Firefoxが_webRequest.onErrorOccurred
_の_main_frame
_イベントを取得するときに使用されるURLの詳細については、「 ナビゲーションエラーページへの挿入:エラー:一致するウィンドウがありません。{"matchesHost": [“”]}
私は次の方法で同じタスクを考えました:
コンテキストメニューを作成していて、同様の問題がありました。
browser.contextMenus.onClicked.addListener((info, tab) => {
if (info.menuItemId === "mymenu") {
// some code
browser.tabs.sendMessage(tabs[0].id, {greeting: "Hi from background script"});
}
});
エラーが発生します:
接続を確立できませんでした。受信側が存在しません
関数とリスナーを追加します。
browser.contextMenus.onClicked.addListener((info, tab) => {
if (info.menuItemId === "mymenu") {
// some code
browser.tabs.sendMessage(tabs[0].id, {greeting: "Hi from background script"});
}
});
// -----function and Listener ------
function connectToContent() {
browser.tabs.query({ currentWindow: true, active: true
}).then((tabs) => {
browser.tabs.sendMessage(tabs[0].id, {greeting: "Activate Tab"});
});
}
browser.tabs.onActivated.addListener(connectToContent);
今では動作しています。browser.tabs.onActivated.addListener
は接続し続けます。
私もこれと同じエラーがありました。
私の問題と解決策は異なっていましたが、それが役立つ場合に備えて追加しています。
私の場合、content.jsスクリプトには、当初browser.runtime.onMessage.addListener()関数(FireFox)がありませんでした。
後でこのリスナーをcontent.jsスクリプトに追加したとき、FireFoxの「about:debugging」ページで一時的な拡張機能をリロードしませんでした。上記のエラーが表示されました。
「about:debugging」タブの「reload」をクリックすると、コンテンツスクリプトがメッセージを受信しました。
この問題の別の解決策:(devの通常の一部として)拡張機能をリロードすると、コンテンツスクリプトへのすべての接続が切断されます。
コンテンツスクリプトを使用してページをリロードすることを忘れないでください。正しく再聞くことができます。