Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Chrome extension: sendMessage from content to background getting response from popup

I am trying to send a message from a content script to my background script. When the background receives the message it sends data back to the content script in the callback.

My popup also has a listener for messages from the content script, but does not respond to a message meant for the background script.

Then content is receiving an undefined back from the callback, which I think is caused by the popup receiving the message but not responding.

The reference says:

Note: If multiple pages are listening for onMessage events, only the first to call sendResponse() for a particular event will succeed in sending the response. All other responses to that event will be ignored.

So surely I should only get the response from my background script.

My content script does this:

function notifyReady() {

    chrome.runtime.sendMessage({
        type: 'ACTIVITY_HISTORY_READY'
    },
        function (response) {
            console.log(">>>>Response: ", response);
            if (response.type == 'HISTORY_DATA') {
                processLog(response);
            }
        });
}

My background script listens like this:

chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
    console.log("received " + msg.type);
    if (msg.type = 'ACTIVITY_HISTORY_READY' && historyData) {
        if (historyData) {
            sendResponse({
                type: "HISTORY_DATA",
                position: historyData.position,
                company: historyData.company
            });
            historyData = '';
        } else {
            sendResponse({
                type: "NO_DATA"
            });
        }
    }
});

And the listener in my popup is:

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

    if (msg.type == 'JOB_DETAILS') {

        sendResponse("OK!");

        document.getElementById('position').value = msg.position;
        document.getElementById('company').value = msg.company;
        document.getElementById('url').value = sender.tab.url;
    }
});
like image 973
Chris Read Avatar asked Oct 30 '22 09:10

Chris Read


1 Answers

if (msg.type = 'ACTIVITY_HISTORY_READY' && historyData) {

note that if historyData is falsey you are not sending any response. The else branch of the second if can never be taken.

You should remove historyData from the first if. The popup code has nothing to do with this.

like image 76
rsanchez Avatar answered Nov 13 '22 05:11

rsanchez