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"
]
}
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.
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_frame
webRequest.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 ”: [“ ”]} "
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é.
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.
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.