Chrome-Erweiterung: Tab erstellen und Inhaltsskript darin einfügen

Nachdem ich eine Nachricht von einem Inhaltsskript erhalten habe, möchte ich einen neuen Tab erstellen und die Seite füllen, die sich dynamisch öffnet (im Moment versuche ich nur, die neu erstellte Seite rot zu färben).

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

Dadurch wird erfolgreich eine neue Registerkarte erstellt und geladenblankpage.html (das ist nur eine HTML-Seite mit etwas Text) in Ordnung, aber die Hintergrundfarbe wird nicht rot dargestellt. Nach dem Einsetzenconsole.log() Aussagen an verschiedenen Stellen und Herumalbern im Debugger, das habe ich festgestelltturnTabRed wird gerufen,tab.id ist ja die id der neu erstellten tab und wenn ich anrufedocument.body.style.backgroundColor="red" In der Konsole wird der Hintergrund der neuen Registerkarte rot. Ich bemerkte das, wenn ich hinzufügte

(*)

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

in den Körper vonturnTabRed Der Titel des neuen Registers wurde nicht in die Konsole gedruckt, was darauf hindeutete, dass das Skript zu früh injiziert wurde. Ich habe daher versucht, die Injektion mit zu verzögernsetTimeout und als das fehlschlug, habe ich versucht, auf das status-complete-Ereignis zu warten:

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

was auch fehlgeschlagen ist. Anrufen (*) nach Warten mitsetTimeout hat den Titel des neuen Tabs zusammen mit allen anderen gedruckt.

Was ist los mit dir? Wie kann ich einen neuen Tab erstellen, eine HTML-Seite laden und dann den Hintergrund rot färben?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage