Beschreibung
Mit der offscreen
API können Sie Dokumente erstellen und verwalten, die nicht auf dem Bildschirm zu sehen sind.
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
Konzepte und Verwendung
Service Worker haben keinen DOM-Zugriff und auf vielen Websites gibt es Richtlinien für die Contentsicherheit,
die Funktionalität von Inhaltsskripts einschränken. Mit der Offscreen API kann die Erweiterung DOM verwenden
APIs in einem verborgenen Dokument einzufügen, ohne dass die Nutzererfahrung dadurch beeinträchtigt wird, z. B. durch Öffnen neuer Fenster oder
Registerkarten. Die runtime
API ist die einzige Erweiterungs-API
nicht unterstützt werden.
Seiten, die als nicht sichtbare Dokumente geladen werden, werden anders behandelt als andere Arten von Erweiterungsseiten.
Die Berechtigungen der Erweiterung gelten für nicht sichtbare Dokumente, jedoch mit Einschränkungen für die Erweiterungs-API
Zugriff haben. Da die chrome.runtime
API z. B. die einzige
Erweiterungs-API, die von nicht sichtbaren Dokumenten unterstützt wird, muss die Kommunikation gehandhabt werden
mithilfe von Mitgliedern der API.
Im Folgenden finden Sie weitere Beispiele dafür, wie sich nicht sichtbare Dokumente von normalen Seiten unterscheiden:
- Die URL eines nicht sichtbaren Dokuments muss eine statische HTML-Datei sein, die mit der Erweiterung gebündelt ist.
- Nicht sichtbare Dokumente können nicht hervorgehoben werden.
- Ein nicht sichtbares Dokument ist eine Instanz von
window
, aber der Wert seineropener
-Eigenschaft ist immernull
. - Obwohl ein Erweiterungspaket mehrere nicht sichtbare Dokumente enthalten kann, kann eine installierte Erweiterung immer nur jeweils einen Bereich geöffnet. Wenn die Erweiterung ausgeführt wird im geteilten Modus mit einem aktiven Inkognito-Profil haben, können das normale und das Inkognito-Profil jeweils ein nicht sichtbares Dokument.
Verwenden Sie chrome.offscreen.createDocument()
und
chrome.offscreen.closeDocument()
, um einen nicht sichtbaren Bereich zu erstellen und zu schließen
Dokument. createDocument()
erfordert die url
des Dokuments, einen Grund und eine Begründung:
chrome.offscreen.createDocument({
url: 'off_screen.html',
reasons: ['CLIPBOARD'],
justification: 'reason for needing the document',
});
Gründe
Eine Liste möglicher Gründe finden Sie im Abschnitt Gründe. Gründe werden festgelegt während
Dokumenterstellung, um die Lebensdauer des Dokuments zu bestimmen. Der Grund AUDIO_PLAYBACK
legt Folgendes fest:
das Dokument nach 30 Sekunden ohne Ton zu schließen. Aus allen anderen Gründen werden keine Nutzungslimits festgelegt.
Beispiele
Lebenszyklus eines nicht sichtbaren Dokuments verwalten
Das folgende Beispiel zeigt, wie Sie dafür sorgen können, dass ein nicht sichtbares Dokument vorhanden ist. Die
Die Funktion setupOffscreenDocument()
ruft runtime.getContexts()
auf, um
ein nicht sichtbares Dokument erstellen oder das Dokument erstellen, 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 sicherzugehen
das Dokument existiert, 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 der Offscreen-Zwischenablage und Offscreen-Demos 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, clients.matchAll()
verwenden
So suchen Sie nach einem nicht sichtbaren Dokument:
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 detaillierter erklärt. Der User-Agent _kann_ dies verwenden, um dem Nutzer angezeigt zu werden.
-
Gründe
Grund[]
Der Grund bzw. die Gründe, warum die Erweiterung das nicht sichtbare 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 nicht sichtbare Dokument für die Audiowiedergabe verantwortlich ist.
"IFRAME_SCRIPTING"
Gibt an, dass das nicht sichtbare Dokument einen iFrame einbetten und Skript dafür einfügen muss, um den Inhalt des iFrames zu ändern.
"DOM_SCRAPING"
Gibt an, dass das nicht sichtbare Dokument einen iFrame einbetten und aus seinem DOM extrahieren muss, um Informationen zu extrahieren.
"BLOBS"
Gibt an, dass das nicht sichtbare Dokument mit Blob-Objekten (einschließlich URL.createObjectURL()
) interagieren muss.
"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 von Nutzermedien (z.B. getUserMedia()
) interagieren muss.
"DISPLAY_MEDIA"
Gibt an, dass das nicht sichtbare Dokument mit Media-Streams von Displaymedien (z.B. getDisplayMedia()
) interagieren muss.
"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 das nicht sichtbare Dokument Worker erzeugen muss.
"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()
chrome.offscreen.closeDocument(
callback?: function,
)
Schließt das aktuell geöffnete nicht sichtbare Dokument für die Erweiterung.
Parameter
-
callback
Funktion optional
Der Parameter
callback
sieht so aus: <ph type="x-smartling-placeholder"></ph>() => void
Gibt Folgendes zurück:
-
Versprechen<void>
Promise-Objekte werden in Manifest V3 und höher unterstützt, Callbacks sind jedoch für Abwärtskompatibilität. Sie können nicht beide in demselben Funktionsaufruf verwenden. Die Promise wird mit demselben Typ aufgelöst, der an das Callback übergeben wird.
createDocument()
chrome.offscreen.createDocument(
parameters: CreateParameters,
callback?: function,
)
Erstellt ein neues nicht sichtbares Dokument für die Erweiterung.
Parameter
-
Parameter
Die Parameter, die das zu erstellende nicht sichtbare Dokument beschreiben.
-
callback
Funktion optional
Der Parameter
callback
sieht so aus: <ph type="x-smartling-placeholder"></ph>() => void
Gibt Folgendes zurück:
-
Versprechen<void>
Promise-Objekte werden in Manifest V3 und höher unterstützt, Callbacks sind jedoch für Abwärtskompatibilität. Sie können nicht beide in demselben Funktionsaufruf verwenden. Die Promise wird mit demselben Typ aufgelöst, der an das Callback übergeben wird.