Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sendMessage from extension background or popup to content script doesn't work

I know that question has been repeatedly asked in different ways, but I tried to go through all the answers (hopefully I didn't miss anyone) and none of them worked for me.

Here is my extension's code:

manifest:

{ "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!");   } }); 

The two alerts of the background page work, while the one of the content_script doesn't.

console log's message: Port error: Could not establish connection. Receiving end does not exist.

Where is my fault?

like image 972
Subway Avatar asked Jan 09 '13 19:01

Subway


2 Answers

In your background page you should call

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

instead of using chrome.extension.sendMessage as you currently do.

The chrome.tabs variant sends messages to content scripts, whereas the chrome.extension function sends messages to all other extension components.

like image 59
apsillers Avatar answered Oct 09 '22 23:10

apsillers


@apsillers is correct. Also don't forget to return true in your content-script listener or it might close too early.

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {     console.log(message)     return true }); 
like image 36
Ronan Ca Avatar answered Oct 10 '22 00:10

Ronan Ca