web-dev-qa-db-ja.com

Firefox webextensionエラー:接続を確立できませんでした。受信側が存在しません

バックグラウンドスクリプトから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"
  ]
}
11
user6875880

エラーが表示されます:

_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": [“”]}

10
Makyen

私は次の方法で同じタスクを考えました:

コンテキストメニューを作成していて、同様の問題がありました。

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は接続し続けます。

1
Евгений

私もこれと同じエラーがありました。

私の問題と解決策は異なっていましたが、それが役立つ場合に備えて追加しています。

私の場合、content.jsスクリプトには、当初browser.runtime.onMessage.addListener()関数(FireFox)がありませんでした。

後でこのリスナーをcontent.jsスクリプトに追加したとき、FireFoxの「about:debugging」ページで一時的な拡張機能をリロードしませんでした。上記のエラーが表示されました。

「about:debugging」タブの「reload」をクリックすると、コンテンツスクリプトがメッセージを受信しました。

0
russell newton

この問題の別の解決策:(devの通常の一部として)拡張機能をリロードすると、コンテンツスクリプトへのすべての接続が切断されます。

コンテンツスクリプトを使用してページをリロードすることを忘れないでください。正しく再聞くことができます。

0
Offirmo