Chrome.runtime.onMessage.addListener on new tab not receiving message from popup.js

615 Views Asked by At

I have the following code in popup.js which responds to a button press to get all the tabs, create a new tab (template.html), and send the tabs as an array to the new tab. Later I will delete the current tabs and display the links on one page to save space (That's the idea of the extension).

function saveAll() {
  var openTabs = [];

  chrome.tabs.query({}, function(tabs) {
    for (var i = 0; i < tabs.length; i++) {
      openTabs[i] = tabs[i];
    }

    createSavedPage(openTabs);
  });
}

function createSavedPage(tabsToSave) {
  chrome.tabs.create({
      "url": chrome.extension.getURL("template.html"),
      "active": false
    },
    function(tab) {
      sendListToPage(tab, tabsToSave);
    }
  );
}


function sendListToPage(tab, tabsArray) {
  chrome.tabs.sendMessage(tab.id, {
    "action": "fill-list",
    "data": tabsArray
  });
}


var saveAllButton = document.getElementById("select-all-tabs");
saveAllButton.addEventListener("click", saveAll);

The tab that is created includes a template.js file:

function fillList(array) {
  var list = document.getElementById("link-list");
  for (var item in array) {
    //Something
  }
}

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

    if (request.action == "fill-list") {
      var data = request.data;
      fillList(data);
    }
  }
);

When I create the new tab, the message is sent from the extension but never received. What is causing this issue?

1

There are 1 best solutions below

0
On

I also thought that the message was being sent before the created tab was fully loaded. So I've changed popup.js by adding a chrome.tabs.onUpdated listener:

function createSavedPage(tabsToSave) {
  chrome.tabs.create({
      "url": chrome.extension.getURL("template.html"),
      "active": false
    },
    function(tab) {
      chrome.tabs.onUpdated.addListener(function(tabId, info)       {
        if (tabId == tab.id && info.status == "complete")
          sendListToPage(tab, tabsToSave);
      });
    }
  );
}

And it seems to solve the issue. Is there still a better way?