Beschreibung
Verwenden Sie die offscreen API, um Offscreen-Dokumente zu erstellen und zu verwalten.
Berechtigungen
offscreenWenn Sie die Offscreen API verwenden möchten, müssen Sie die Berechtigung "offscreen" im Erweiterungsmanifest deklarieren. Beispiel:
{
"name": "My extension",
...
"permissions": [
"offscreen"
],
...
}
Verfügbarkeit
Konzepte und Verwendung
Service Worker haben keinen DOM-Zugriff und viele Websites haben Content Security Policies, die die Funktionalität von Inhaltsskripten einschränken. Mit der Offscreen API kann die Erweiterung DOM-APIs in einem verborgenen Dokument verwenden, ohne die Nutzerfreundlichkeit durch das Öffnen neuer Fenster oder Tabs zu beeinträchtigen. Die runtime API ist die einzige Erweiterungs-API, die von Offscreen-Dokumenten unterstützt wird.
Seiten, die als Offscreen-Dokumente geladen werden, werden anders behandelt als andere Arten von Erweiterungsseiten.
Die Berechtigungen der Erweiterung werden auf Offscreen-Dokumente übertragen, aber mit Einschränkungen beim Zugriff auf die Erweiterungs-API. Da die chrome.runtime API beispielsweise die einzige Erweiterungs-API ist, die von Offscreen-Dokumenten unterstützt wird, muss die Nachrichtenübermittlung über Mitglieder dieser API erfolgen.
Offscreen-Dokumente verhalten sich in folgenden Punkten anders als normale Seiten:
- Die URL eines Offscreen-Dokuments muss eine statische HTML-Datei sein, die mit der Erweiterung gebündelt ist.
- Dokumente, die nicht auf dem Bildschirm angezeigt werden, können nicht fokussiert werden.
- Ein Offscreen-Dokument ist eine Instanz von
window, aber der Wert des Attributsopenerist immernull. - Ein Erweiterungspaket kann zwar mehrere Offscreen-Dokumente enthalten, aber eine installierte Erweiterung kann jeweils nur eines geöffnet haben. Wenn die Erweiterung im Split-Modus mit einem aktiven Inkognitoprofil ausgeführt wird, können das normale und das Inkognitoprofil jeweils ein Offscreen-Dokument haben.
Verwenden Sie chrome.offscreen.createDocument() und chrome.offscreen.closeDocument(), um ein Offscreen-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 der gültigen Gründe finden Sie im Abschnitt Gründe. Gründe werden bei der Dokumenterstellung festgelegt, um die Lebensdauer des Dokuments zu bestimmen. Mit dem Grund AUDIO_PLAYBACK wird festgelegt, dass das Dokument nach 30 Sekunden ohne Audio geschlossen wird. Bei allen anderen Gründen werden keine Lebenszeitlimits festgelegt.
Beispiele
Lebenszyklus eines Offscreen-Dokuments verwalten
Das folgende Beispiel zeigt, wie Sie dafür sorgen, dass ein Offscreen-Dokument vorhanden ist. Die Funktion setupOffscreenDocument() ruft runtime.getContexts() auf, um ein vorhandenes Offscreen-Dokument zu finden, 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 Offscreen-Dokument senden, rufen Sie setupOffscreenDocument() auf, um sicherzugehen, dass das Dokument vorhanden ist. Das wird im folgenden Beispiel veranschaulicht.
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 finden Sie in den Demos offscreen-clipboard und offscreen-dom auf GitHub.
Vor Chrome 116: Prüfen, ob ein Offscreen-Dokument geöffnet ist
runtime.getContexts() wurde in Chrome 116 hinzugefügt. In früheren Versionen von Chrome können Sie mit clients.matchAll() prüfen, ob ein Offscreen-Dokument vorhanden ist:
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 matchedClients.some(client => {
return client.url.includes(chrome.runtime.id);
});
}
}
Typen
CreateParameters
Attribute
-
Begründung
String
Ein vom Entwickler bereitgestellter String, der den Bedarf an Hintergrundkontext genauer erläutert. Der User-Agent _kann_ diese Informationen für die Anzeige für den Nutzer verwenden.
-
Gründe
Grund[]
Der Grund oder die Gründe, warum die Erweiterung das Offscreen-Dokument erstellt.
-
URL
String
Die (relative) URL, die in das Dokument geladen werden soll.
Reason
Enum
„TESTING“
Ein Grund, der nur zu Testzwecken verwendet wird.
„AUDIO_PLAYBACK“
Gibt an, dass das Offscreen-Dokument für die Audiowiedergabe verantwortlich ist.
"IFRAME_SCRIPTING"
Gibt an, dass das Offscreen-Dokument ein iFrame einbetten und scripten muss, um den Inhalt des iFrames zu ändern.
"DOM_SCRAPING"
Gibt an, dass in das Offscreen-Dokument ein iFrame eingebettet und sein DOM analysiert werden muss, um Informationen zu extrahieren.
„BLOBS“
Gibt an, dass das Offscreen-Dokument mit Blob-Objekten (einschließlich URL.createObjectURL()) interagieren muss.
„DOM_PARSER“
Gibt an, dass im Offscreen-Dokument die DOMParser API verwendet werden muss.
„USER_MEDIA“
Gibt an, dass das Offscreen-Dokument mit Media-Streams aus Nutzermedien (z.B. getUserMedia()) interagieren muss.
„DISPLAY_MEDIA“
Gibt an, dass das Offscreen-Dokument mit Media-Streams aus Display-Media interagieren muss (z.B. getDisplayMedia()).
„WEB_RTC“
Gibt an, dass für das Offscreen-Dokument WebRTC-APIs verwendet werden müssen.
„CLIPBOARD“
Gibt an, dass das Offscreen-Dokument mit der Clipboard API interagieren muss.
"LOCAL_STORAGE"
Gibt an, dass das Offscreen-Dokument Zugriff auf localStorage benötigt.
WORKERS
Gibt an, dass für das Offscreen-Dokument Worker erstellt werden müssen.
„BATTERY_STATUS“
Gibt an, dass für das Offscreen-Dokument navigator.getBattery verwendet werden muss.
„MATCH_MEDIA“
Gibt an, dass im Offscreen-Dokument window.matchMedia verwendet werden muss.
„GEOLOCATION“
Gibt an, dass das Offscreen-Dokument navigator.geolocation verwenden muss.
Methoden
closeDocument()
chrome.offscreen.closeDocument(): Promise<void>
Schließt das aktuell geöffnete Offscreen-Dokument für die Erweiterung.
Ausgabe
-
Promise<void>
Promise, das aufgelöst wird, wenn das Offscreen-Dokument geschlossen wurde.
createDocument()
chrome.offscreen.createDocument(
parameters: CreateParameters,
): Promise<void>
Erstellt ein neues Offscreen-Dokument für die Erweiterung.
Parameter
-
Parameter
Die Parameter, die das zu erstellende Offscreen-Dokument beschreiben.
Ausgabe
-
Promise<void>
Promise, das aufgelöst wird, wenn das Offscreen-Dokument erstellt wurde und der erste Seitenaufruf abgeschlossen ist.