Je sais que cette question a été posée à plusieurs reprises de différentes manières, mais j'ai essayé de passer en revue toutes les réponses (espérons que personne ne m'a manqué) et aucune d'entre 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, alors que celle de content_script ne fonctionne pas.
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?
Dans votre page de fond, vous devriez appeler
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"}, function(response) {});
});
à la place d'utiliser chrome.extension.sendMessage
comme vous le faites actuellement.
Le chrome.tabs
variante envoie des messages aux scripts de contenu, alors que la chrome.extension
_ fonction envoie des messages à tous les autres composants de l’extension.