chrome.offscreen

Beschreibung

Mit der offscreen API lassen sich nicht sichtbare Dokumente erstellen und verwalten.

Berechtigungen

offscreen

Wenn du die Offscreen API verwenden möchtest, musst du die Berechtigung "offscreen" im Erweiterungsmanifest deklarieren. Beispiel:

{
  "name": "My extension",
  ...
  "permissions": [
    "offscreen"
  ],
  ...
}

Verfügbarkeit

Chrome 109 oder höher MV3+

Konzepte und Nutzung

Service Worker haben keinen DOM-Zugriff und viele Websites haben Inhaltssicherheitsrichtlinien, die die Funktionalität von Inhaltsskripts einschränken. Mit der Offscreen API kann die Erweiterung DOM APIs in einem ausgeblendeten Dokument verwenden, ohne die Nutzererfahrung durch das Öffnen neuer Fenster oder Tabs zu beeinträchtigen. Die runtime API ist die einzige Erweiterungs-API, die von nicht sichtbaren Dokumenten unterstützt wird.

Seiten, die als nicht sichtbare Dokumente geladen werden, werden anders gehandhabt als andere Arten von Erweiterungsseiten. Die Berechtigungen der Erweiterung gelten auch für nicht sichtbare Dokumente, allerdings mit Einschränkungen für den Zugriff auf die Erweiterungs-API. Beispiel: Da die chrome.runtime API die einzige Extensions API ist, die von nicht sichtbaren Dokumenten unterstützt wird, müssen Nachrichten über Mitglieder dieser API verarbeitet werden.

Im Folgenden finden Sie weitere Möglichkeiten, auf welche Weise sich nicht sichtbare Dokumente von normalen Seiten unterscheiden:

  • Die URL eines nicht sichtbaren Dokuments muss eine statische HTML-Datei mit der Erweiterung sein.
  • Nicht sichtbare Dokumente können nicht fokussiert werden.
  • Ein nicht sichtbares Dokument ist eine Instanz von window, aber der Wert der zugehörigen opener-Eigenschaft ist immer null.
  • Obwohl ein Erweiterungspaket mehrere nicht sichtbare Dokumente enthalten kann, kann bei einer installierten Erweiterung immer nur ein Dokument geöffnet sein. Wenn die Erweiterung im Split-Modus mit einem aktiven Inkognitoprofil ausgeführt wird, können das normale und das Inkognitoprofil jeweils ein nicht sichtbares Dokument haben.

Verwenden Sie chrome.offscreen.createDocument() und chrome.offscreen.closeDocument(), um ein nicht sichtbares Dokument zu erstellen und zu schließen. Für createDocument() sind die url des Dokuments, ein Grund und eine Begründung erforderlich:

chrome.offscreen.createDocument({
  url: 'off_screen.html',
  reasons: ['CLIPBOARD'],
  justification: 'reason for needing the document',
});

Gründe

Eine Liste gültiger Gründe finden Sie im Abschnitt Gründe. Die Gründe werden während der Dokumenterstellung festgelegt, um die Lebensdauer des Dokuments zu bestimmen. Der Grund AUDIO_PLAYBACK legt fest, dass das Dokument nach 30 Sekunden ohne Audiowiedergabe geschlossen wird. Bei allen anderen Gründen werden keine lebenslangen Limits festgelegt.

Beispiele

Lebenszyklus eines nicht sichtbaren Dokuments beibehalten

Das folgende Beispiel zeigt, wie Sie dafür sorgen können, dass ein nicht sichtbares Dokument vorhanden ist. Die Funktion setupOffscreenDocument() ruft runtime.getContexts() auf, um ein vorhandenes nicht sichtbares Dokument zu suchen, oder erstellt das Dokument, falls es noch nicht vorhanden ist.

let creating; // A global promise to avoid concurrency issues
async function setupOffscreenDocument(path) {
  // Check all windows controlled by the service worker to see if one
  // of them is the offscreen document with the given path
  const offscreenUrl = chrome.runtime.getURL(path);
  const existingContexts = await chrome.runtime.getContexts({
    contextTypes: ['OFFSCREEN_DOCUMENT'],
    documentUrls: [offscreenUrl]
  });

  if (existingContexts.length > 0) {
    return;
  }

  // create offscreen document
  if (creating) {
    await creating;
  } else {
    creating = chrome.offscreen.createDocument({
      url: path,
      reasons: ['CLIPBOARD'],
      justification: 'reason for needing the document',
    });
    await creating;
    creating = null;
  }
}

Bevor Sie eine Nachricht an ein nicht sichtbares Dokument senden, rufen Sie setupOffscreenDocument() auf, um zu prüfen, ob das Dokument vorhanden ist, wie im folgenden Beispiel gezeigt.

chrome.action.onClicked.addListener(async () => {
  await setupOffscreenDocument('off_screen.html');

  // Send message to offscreen document
  chrome.runtime.sendMessage({
    type: '...',
    target: 'offscreen',
    data: '...'
  });
});

Vollständige Beispiele findest du in den Demos zu offscreen-clipboard und offscreen-dom auf GitHub.

Vor Chrome 116: Prüfen, ob ein nicht sichtbares Dokument geöffnet ist

runtime.getContexts() wurde in Chrome 116 hinzugefügt. In früheren Versionen von Chrome können Sie mit clients.matchAll() nach einem nicht sichtbaren Dokument suchen:

async function hasOffscreenDocument() {
  if ('getContexts' in chrome.runtime) {
    const contexts = await chrome.runtime.getContexts({
      contextTypes: ['OFFSCREEN_DOCUMENT'],
      documentUrls: [OFFSCREEN_DOCUMENT_PATH]
    });
    return Boolean(contexts.length);
  } else {
    const matchedClients = await clients.matchAll();
    return await matchedClients.some(client => {
        client.url.includes(chrome.runtime.id);
    });
  }
}

Typen

CreateParameters

Attribute

  • Begründung

    String

    Ein vom Entwickler bereitgestellter String, der die Notwendigkeit des Hintergrundkontexts ausführlicher erläutert. Der User-Agent _kann_ dies in der Anzeige für den Nutzer verwenden.

  • Gründe

    Der Grund bzw. die Gründe, warum die Erweiterung das nicht sichtbare Dokument erstellt.

  • url

    String

    Die (relative) URL, die im Dokument geladen werden soll.

Reason

Enum

"TESTING"
Ein Grund, der nur zu Testzwecken verwendet wird.

"AUDIO_PLAYBACK"
Gibt an, dass das nicht sichtbare Dokument für die Audiowiedergabe zuständig ist.

"IFRAME_SCRIPTING"
Gibt an, dass das nicht sichtbare Dokument einen iFrame einbetten und Script enthalten muss, um den Inhalt des iFrames zu ändern.

"DOM_SCRAPING"
Gibt an, dass das nicht sichtbare Dokument einen iFrame einbetten und dessen DOM kopieren muss, um Informationen zu extrahieren.

"BLOBS"
Gibt an, dass das nicht sichtbare Dokument mit Blob-Objekten interagieren muss (einschließlich URL.createObjectURL()).

"DOM_PARSER"
Gibt an, dass das nicht sichtbare Dokument die DOMParser API verwenden muss.

"USER_MEDIA"
Gibt an, dass das nicht sichtbare Dokument mit Medienstreams der Nutzermedien interagieren muss (z.B. getUserMedia()).

"DISPLAY_MEDIA"
Gibt an, dass das nicht sichtbare Dokument mit Medienstreams von Displaymedien interagieren muss (z.B. getDisplayMedia()).

"WEB_RTC"
Gibt an, dass für das nicht sichtbare Dokument WebRTC APIs verwendet werden müssen.

"CLIPBOARD"
Gibt an, dass das nicht sichtbare Dokument mit der Clipboard API interagieren muss.

"LOCAL_STORAGE"
Gibt an, dass das nicht sichtbare Dokument Zugriff auf localStorage benötigt.

"WORKERS"
Gibt an, dass aus dem nicht sichtbaren Dokument Worker erstellt werden müssen.

"BATTERY_STATUS"
Gibt an, dass für das nicht sichtbare Dokument navigator.getBattery verwendet werden muss.

"MATCH_MEDIA"
Gibt an, dass für das nicht sichtbare Dokument window.matchMedia verwendet werden muss.

"GEOLOCATION"
Gibt an, dass für das nicht sichtbare Dokument navigator.geolocation verwendet werden muss.

Methoden

closeDocument()

Versprechen
chrome.offscreen.closeDocument(
  callback?: function,
)

Schließt das aktuell geöffnete nicht sichtbare Dokument für die Erweiterung.

Parameters

  • callback

    Funktion optional

    Der Parameter callback sieht so aus:

    ()=>void

Rückgaben

  • Promise<void>

    Promise-Objekte werden in Manifest V3 und höher unterstützt, Callbacks werden jedoch aus Gründen der Abwärtskompatibilität bereitgestellt. Sie können nicht beide in einem Funktionsaufruf verwenden. Das Promise wird mit demselben Typ aufgelöst, der an den Callback übergeben wird.

createDocument()

Versprechen
chrome.offscreen.createDocument(
  parameters: CreateParameters,
  callback?: function,
)

Erstellt ein neues nicht sichtbares Dokument für die Erweiterung.

Parameters

  • Parameter

    Die Parameter zur Beschreibung des nicht sichtbaren Dokuments, das erstellt werden soll.

  • callback

    Funktion optional

    Der Parameter callback sieht so aus:

    ()=>void

Rückgaben

  • Promise<void>

    Promise-Objekte werden in Manifest V3 und höher unterstützt, Callbacks werden jedoch aus Gründen der Abwärtskompatibilität bereitgestellt. Sie können nicht beide in einem Funktionsaufruf verwenden. Das Promise wird mit demselben Typ aufgelöst, der an den Callback übergeben wird.