web-dev-qa-db-fra.com

Erreur d'extension Web de Firefox: impossible d'établir la connexion. La fin de réception n'existe pas

J'essaie d'envoyer une variable d'un script d'arrière-plan à un script de contenu associé à une page HTML. Le script de contenu met à jour le contenu HTML avec la variable reçue du script d'arrière-plan.

Le problème est que je reçois ce message d'erreur:

Error: Could not establish connection. Receiving end does not exist.

Le script d'arrière-plan 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"]}
);

Le error.html est:

<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>

Le 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;

Le 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

Vous obtenez l'erreur:

Error: Could not establish connection. Receiving end does not exist.

lorsque vous essayez de communiquer (par exemple tabs.sendMessage() , tabs.connect() ) à un onglet où un script de contenu n'écoute pas les messages. Cela inclut les moments où un script de contenu n'existe pas dans l'onglet.

Vous ne pouvez pas injecter de scripts de contenu dans les URL about:*

Pour votre problème, vous obtenez cette erreur car aucun script de contenu n'est injecté dans l'onglet. Au moment où vous essayez d'envoyer le message, dans un événement main_framewebRequest.onErrorOccurred, L'URL de l'onglet est déjà about:neterror?[much more, including the URL where the error occurred]. Vous ne pouvez pas injecter de scripts de contenu dans les URL about:*. Ainsi, il n'y a pas de script de contenu dans l'onglet écoutant votre message.

Plus précisément, vous avez utilisé <all_urls>modèle de correspondance dans votre entrée manifest.jsoncontent_scripts. <all_urls> Correspond à:

La valeur spéciale "<all_urls>" Correspond à toutes les URL sous l'un des schémas pris en charge: c'est-à-dire "http", "https", "fichier", "ftp", "app".

Il correspond à pas correspond aux URL about:*.

Pour un peu plus de discussion sur l'URL utilisée lorsque Firefox obtient un événement webRequest.onErrorOccurred Dans un main_frame, Voir " L'injection dans la page d'erreur de navigation obtient: Erreur: Aucune fenêtre correspondant {" matchesHost ”: [“ ”]} "

10
Makyen

J'ai souhaité la même tâche de la manière suivante:

Je faisais le menu contextuel et j'ai un problème similaire.

browser.contextMenus.onClicked.addListener((info, tab) => {
       if (info.menuItemId === "mymenu") {
       // some code
       browser.tabs.sendMessage(tabs[0].id, {greeting: "Hi from background script"});
       }
        });

Je reçois une erreur:

Impossible d'établir la connexion. La fin de réception n'existe pas

J'ajoute une fonction et un écouteur:

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);

Maintenant, cela fonctionne .browser.tabs.onActivated.addListener fait et reste connecté.

1
Евгений

J'ai également eu cette même erreur.

Mon problème et ma solution étaient différents, mais je les ajoute au cas où cela aiderait.

Dans mon cas, mon script content.js n'avait initialement pas de fonction browser.runtime.onMessage.addListener () (FireFox).

Lorsque j'ai ajouté plus tard cet écouteur au script content.js, je n'ai pas rechargé l'extension temporaire dans la page "about: debugging" de FireFox. J'ai eu l'erreur ci-dessus.

Après avoir cliqué sur "recharger" dans l'onglet "à propos de: débogage", le script de contenu a reçu le message.

0
russell newton

Une autre solution à ce problème: si vous rechargez votre extension (en tant que partie normale du développeur), elle coupe toutes les connexions aux scripts de contenu.

Vous devez également vous rappeler de recharger la page avec le script de contenu pour qu'elle réécoute correctement.

0
Offirmo