Chris Read
Chris Read

Reputation: 307

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;
    }
});

Upvotes: 5

Views: 4452

Answers (1)

rsanchez
rsanchez

Reputation: 14657

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.

Upvotes: 2

Related Questions