Ab Chrome 109 können Entwickler die chrome.offscreen
API und die Manifestberechtigung verwenden, um Funktionen bei der Umstellung von Hintergrundseiten auf Erweiterungs-Service-Worker zu ersetzen. Wenn Sie diese Berechtigung anfordern, können Sie Dokumente außerhalb des Bildschirms erstellen, um DOM-APIs zu verwenden, ohne aufdringlich neue Fenster oder Tabs zu öffnen, die die Nutzererfahrung unterbrechen. Die chrome.offscreen
API ist jetzt in Chrome-Erweiterungen verfügbar.
In Chromium sind Manifest V3-Erweiterungen auf Service Workern basierend. Service Worker unterstützen jedoch nicht dieselben APIs und Mechanismen wie vollständige dokumentbasierte Seiten (einschließlich Hintergrund- und Ereignisseiten). Wenn Sie außerdem Inhaltsscripts zum Zugriff auf DOM-APIs auf Webseiten verwenden, ist die Erweiterung von Seite zu Seite verschiedenen Inhaltssicherheitsrichtlinien ausgesetzt. Um dieses Problem zu lösen, führen wir Offscreen-Dokumente ein, um DOM-bezogene Funktionen und APIs zu unterstützen. Manifest V3-Erweiterungen können dann zur Laufzeit über eine spezielle API minimale, begrenzte und relativ unberechtigte Offscreen-Dokumente öffnen.
Informationen zur Funktion
Da Offscreen-Dokumente speziell für Anwendungsfälle entwickelt wurden, die in Service Workern nicht unterstützt werden (z. B. Audiowiedergabe), sind die Lebensdauer dieser Seite und die ihr gewährten Berechtigungen unabhängig von denen des Erweiterungs-Service Workers.
Die Seite hat einen Lebensdauermechanismus, der dem von Ereignisseiten in Manifest V2 ähnelt. Sie wird entfernt, wenn keine Aktionen mehr ausgeführt werden. Außerdem kann der User-Agent für die Lebensdauer weitere Einschränkungen festlegen, die für den angegebenen Zweck spezifisch sind.
Offscreen-Dokumente sollen Lücken von APIs schließen, auf die nur DOM-APIs zugreifen können. Daher müssen Erweiterungs-APIs nicht direkt in diesem Kontext freigegeben werden. Um die Wahrscheinlichkeit zu verringern, dass Erweiterungen diese als „Ersatz für die Hintergrundseite“ verwenden, sind nur die chrome.runtime
Messaging APIs für das ausgeblendete Dokument verfügbar. Entwickler können auch Webnachrichten verwenden, indem sie das ausgeblendete Dokument über ihren Service Worker als Client anfordern.
Da einige Anwendungsfälle – insbesondere das Website-Scraping – Zugriff auf ursprungsübergreifende Frames erfordern, erlauben wir in diesen Dokumenten das Einbetten ursprungsübergreifender Frames gemäß denselben Regeln, die derzeit für Erweiterungsseiten gelten. In Offscreen-Dokumenten können von der Erweiterung angegebene Content-Scripts in diesen Frames ausgeführt werden, um alle erforderlichen Inhalte zu erfassen, wie bei einer normalen Webseite.
Gründe und Zweck
Für das Erstellen eines Offscreen-Dokuments sind angegebene Gründe und eine weitere Begründung erforderlich. Diese Gründe sind in der API-Referenzdokumentation aufgeführt und die Lebensdauer des Dokuments wird unterschiedlich behandelt. Beispielsweise gelten für ein Dokument, das für die Audiowiedergabe geöffnet wird, derzeit andere Regeln als für ein Dokument, das für die Zwischenablageverwaltung geöffnet wird. In der Begründung können Sie auch weitere Details zum Zweck des nicht sichtbaren Dokuments angeben. Dies ist ein vom Entwickler geschriebener String und kein Parameter mit Auswirkungen auf das Dokument. Im Laufe der Zeit können der API weitere Gründe hinzugefügt werden, wenn Entwickler ihr Feedback und ihre Anwendungsfälle teilen.
Ab in die Zukunft
Zur Vereinfachung der Implementierung unterstützt die erste Version dieser API jeweils nur eine Seite pro Erweiterung und Profil. In zukünftigen Versionen werden wir diese Einschränkung möglicherweise aufheben, um mehrere Seiten zu unterstützen. Wenn die Erweiterung derzeit im Splitscreen-Modus mit einem aktiven Inkognitoprofil ausgeführt wird, können sowohl das normale als auch das Inkognitoprofil jeweils ein ausgeblendetes Dokument haben. Außerdem ist geplant, dem Erweiterungsworker später DOM-Funktionen hinzuzufügen. Sie können Ihre Erweiterungen zukunftssicher machen, indem Sie Funktionen, die die Offscreen API verwenden, mit einer entsprechenden kommentierten Funktion im Service Worker koppeln, um sie später auszutauschen.
// Solution 1 - Service workers cannot directly interact with
// the system clipboard. To work around this, we'll create an offscreen
// document and pass the data we want to write to the clipboard.
async function addToClipboard(value) {
await chrome.offscreen.createDocument({
url: 'offscreen.html',
reasons: [chrome.offscreen.Reason.CLIPBOARD],
justification: 'Write text to the clipboard.',
});
}
// Solution 2 – Once extension service workers can use the Clipboard API,
// replace the offscreen document based implementation with something like this
async function addToClipboardV2(value) {
navigator.clipboard.writeText(value);
}
Wenn dem Dienstarbeiter DOM-Funktionen und APIs hinzugefügt werden, wird die Liste der Gründe zum Erstellen eines Dokuments je nach aktuellem Status des Dienstarbeiters erweitert oder reduziert. Das gilt auch für die Gründe zur Verwendung von Offscreen-Dokumenten.
Fazit
Mit Offscreen-Dokumenten können Erweiterungen verwendet werden, die Zugriff auf DOM- oder Fensterinteraktionen erfordern, was derzeit nicht in Service Workern möglich ist. Außerdem bietet es einen flexiblen Ansatz, bei dem neue Anwendungsfälle hinzugefügt und in Zukunft gelöste Anwendungsfälle entfernt werden können. Erweiterungen sollten die vorgeschlagene Offscreen-Dokument-API für bestimmte Anwendungsfälle verwenden. Der primäre Hintergrundkontext der Erweiterung sollte weiterhin der im Manifest angegebene Dienstworker sein. Die primäre Erweiterungslogik sollte nicht im Offscreen-Dokument gespeichert werden, da es nur eingeschränkten API-Zugriff hat. Die Lebensdauer eines Offscreen-Dokuments ist unabhängig vom Dienstarbeiter, der es erstellt hat. Überlegungen zur Lebensdauer von Dienst-Workern und Anwendungsfälle im Zusammenhang mit der Lebensdauer von Dienst-Workern in Erweiterungen werden in einem separaten Blogpost behandelt. Die Gründe für die Verwendung von Offscreen-Dokumenten ändern sich im Laufe der Zeit, da dem Service Worker selbst Funktionen und APIs hinzugefügt werden. Wir freuen uns auf Feedback von Entwicklern.