sendMessage de l'arrière-plan de l'extension ou du popup au script de contenu ne fonctionne pas

87

Je sais que cette question a été posée à plusieurs reprises de différentes manières, mais j'ai essayé de parcourir toutes les réponses (j'espère que je n'ai manqué personne) et aucune d'elles n'a fonctionné pour moi.

Voici le code de mon extension:

manifeste:

{
"name": "test",
"version": "1.1",
"background": 
{ 
    "scripts": ["contextMenus.js"]
},

"permissions": ["tabs", "<all_urls>", "contextMenus"],

"content_scripts" : [
    {
        "matches" : [ "http://*/*" ],
        "js": ["jquery-1.8.3.js", "jquery-ui.js"],
        "css": [ "jquery-ui.css" ],
        "js": ["openDialog.js"]
    }
],

"manifest_version": 2
}

contextMenus.js

function onClickHandler(info, tab) {
    if (info.menuItemId == "line1"){

      alert("You have selected: " + info.selectionText);

      chrome.extension.sendMessage({action:'open_dialog_box'}, function(){});

      alert("Req sent?");

    }
}

chrome.contextMenus.onClicked.addListener(onClickHandler);

chrome.runtime.onInstalled.addListener(function() {

  chrome.contextMenus.create({"id": "line1", "type": "normal", "title": "I'm line 1",     "contexts":["selection"]});

});

openDialog.js

chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {

  if (msg.action == 'open_dialog_box') {
    alert("Message recieved!");
  }
});

Les deux alertes de la page d'arrière-plan fonctionnent, contrairement à celle de content_script.

message du journal de la console: Erreur de port: impossible d'établir la connexion. La fin de réception n'existe pas.

Où est ma faute?

Métro
la source
Vous devez utiliser chrome.tabs.sendMessage()pour envoyer des messages aux scripts de contenu, pas chrome.extension.sendMessage().
apsillers

Réponses:

141

Dans votre page de fond, vous devez appeler

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"}, function(response) {});  
});

au lieu d'utiliser chrome.extension.sendMessagecomme vous le faites actuellement.

La chrome.tabsvariante envoie des messages aux scripts de contenu, tandis que la chrome.extensionfonction envoie des messages à tous les autres composants d'extension.

apsillers
la source
7
Merci. C'est correct, sauf que cela chrome.tabs.sendMessage doit spécifier l'onglet auquel l'envoyer . La solution est donc de changer pour:chrome.tabs.query({active: true}, function(tabs){ chrome.tabs.sendMessage(tab.id, {action: "open_dialog_box"}, function(response) { }); });
Métro
1
Cette réponse m'a aidé. Merci beaucoup pour cette réponse utile.
Touhid
13
que faut-il écrire pour recevoir sur content-script.js?
Kushal Jain
5
@KushalJain Je viens de comprendre ça. Dans votre fichier JS de script de contenu, vous voudrez ajouter un écouteur d'événements comme celui-ci: chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { /* Code Here */ } ); messageest le paramètre contenant { action: "open_dialog_box" }ou ce que vous envoyez. senderest un objet contenant l'identifiant de votre extension Chrome. sendResponseest le paramètre contenant function(response) {}ou n'importe quelle fonction que vous transmettez pour être appelée une fois le message traité.
jsea
5
Cette solution n'a pas fonctionné pour moi. Je suis la documentation exactement j'ai copié tout le code de developer.chrome.com/extensions/messaging Ceci est un exemple très simple mais je n'ai pas pu le faire correctement. Obtention d'une erreur Impossible d'établir la connexion. La fin de réception n'existe pas. Toutes les idées
umsateesh
0

@apsillers a raison. N'oubliez pas non plus de renvoyer true dans votre écouteur de script de contenu ou il pourrait se fermer trop tôt.

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log(message)
    return true
});
Ronan Ca
la source