Extensión de Chrome: crea una pestaña y luego inyecta el script de contenido en ella

Al recibir un mensaje de una secuencia de comandos de contenido, quiero crear una nueva pestaña y llenar la página que se abre dinámicamente (por ahora solo estoy tratando de convertir la página recién creada en rojo).

eventPage.js:

// ... code that injects another content script, works fine

// Problem code...
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) 
  {
    chrome.tabs.create({url: chrome.extension.getURL("blankpage.html")}, 
                       turnTabRed);      
  });

function turnTabRed(tab)
{
  chrome.tabs.executeScript(
    tab.id,
    {code: 'document.body.style.backgroundColor="red"'}
  );
}

Esto crea con éxito una nueva pestaña y cargablankpage.html (que es solo una página HTML con algo de texto) está bien, pero no puede pintar el color de fondo rojo. Después de insertarconsole.log() declaraciones en varios lugares y bromeando en el depurador, he comprobado queturnTabRed está siendo llamado,tab.id es de hecho el ID de la pestaña recién creada y si llamodocument.body.style.backgroundColor="red" Desde la consola, el fondo de la nueva pestaña se vuelve rojo. Me di cuenta de que si añadía

(*)

chrome.tabs.query(
    {}, function (tabArr) { for (var i = 0; tabArr[i]; i++)    
                              console.log(tabArr[i].title); });

en el cuerpo deturnTabRed el título de la nueva pestaña no se imprimiría en la consola, lo que sugiere que el script se estaba inyectando demasiado pronto, así que intenté retrasar la inyección consetTimeout y cuando eso falló, intenté escuchar el evento de estado completo:

function turnTabRed(tab)
{
  chrome.tabs.onUpdated.addListener(
    function(tabUpdatedId, changeInfo, tabUpdated)
    {
      if (tabUpdatedId == tab.id && changeInfo.status && 
                                    changeInfo.status == 'complete')
        chrome.tabs.executeScript(
          tabUpdatedId,
          {code: 'document.body.style.backgroundColor="red"'});
    });
}

que también fracasó. Llamando (*) después de esperar consetTimeout Imprimí el título de la nueva pestaña junto con todos los demás sin embargo.

Que pasa ¿Cómo puedo crear una nueva pestaña, cargar una página HTML y luego volver a su fondo rojo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta