Signatur
Beschreibung
Die schreibgeschützte Eigenschaft permissions des WorkerNavigator-Interfaces liefert ein Permissions-Objekt. Damit kann ein Dedicated Worker, Shared Worker oder Service Worker den Berechtigungsstatus von Web-APIs abfragen, die unter die Permissions API fallen. Im Worker greift man über self.navigator.permissions bzw. kurz navigator.permissions darauf zu.
Wichtigste Methode ist permissions.query({ name }). Sie gibt ein Promise<PermissionStatus> zurück, dessen Eigenschaft state den Wert "granted", "denied" oder "prompt" hat. Über das change-Event des PermissionStatus lässt sich auf spätere Änderungen reagieren.
Typischer Einsatz: Ein Service Worker prüft vor dem Anzeigen einer Push-Benachrichtigung mit showNotification(), ob die Berechtigung "notifications" erteilt ist, oder ein Worker entscheidet, ob er Hintergrundaufgaben wie Periodic Background Sync überhaupt einplanen soll.
Wichtig: Aus einem Worker heraus lassen sich Berechtigungen nur abfragen, nicht anfordern. Einen Berechtigungsdialog können Worker nicht auslösen – das muss im Fensterkontext passieren, meist nach einer Nutzeraktion (z. B. mit Notification.requestPermission()).
Rückgabewert
Permissions-Objekt mit der Methode query(). In einem Kontext bleibt es immer dasselbe Objekt.Beispiele
Benachrichtigungs-Berechtigung im Service Worker prüfen
// sw.js
self.addEventListener('push', (event) => {
event.waitUntil((async () => {
const status = await navigator.permissions.query({ name: 'notifications' });
if (status.state !== 'granted') {
console.log('Keine Berechtigung – Benachrichtigung wird übersprungen');
return;
}
const data = event.data?.json() ?? { title: 'Neue Nachricht' };
await self.registration.showNotification(data.title, { body: data.body });
})());
});
Status im Dedicated Worker abfragen und an die Seite melden
// worker.js
const checkPermission = async (name) => {
if (!('permissions' in navigator)) return 'nicht unterstützt';
try {
const { state } = await navigator.permissions.query({ name });
return state;
} catch (err) {
// Unbekannter Name im jeweiligen Browser -> TypeError
return `Fehler: ${err.message}`;
}
};
self.onmessage = async ({ data }) => {
const state = await checkPermission(data.permission);
self.postMessage({ permission: data.permission, state });
};
// main.js
const worker = new Worker('worker.js');
worker.onmessage = ({ data }) => console.log(data);
worker.postMessage({ permission: 'geolocation' });
Auf Änderungen der Berechtigung reagieren
// worker.js
const watchPermission = async () => {
const status = await navigator.permissions.query({ name: 'notifications' });
console.log('Aktueller Status:', status.state);
status.addEventListener('change', () => {
console.log('Status geändert zu:', status.state);
});
};
watchPermission();
// Wichtig · Fallstricke
- Nur abfragen, nicht anfordern: In Workern gibt es keine Möglichkeit, einen Berechtigungsdialog auszulösen. Anfragen müssen im Fenster erfolgen.
- Unterstützte Namen sind je nach Browser verschieden: Nicht jeder Browser kennt jeden Namen (z. B.
"push","camera","periodic-background-sync"). Bei unbekannten Namen wird das Promise mit einemTypeErrorabgelehnt – daher immer mittry/catchabsichern. - Push: Die Abfrage von
"push"verlangt in Chromium meist zusätzlichuserVisibleOnly: true. - Sicherer Kontext: Viele Berechtigungen stehen nur unter HTTPS (oder
localhost) zur Verfügung. - Kompatibilität: Safari unterstützt
WorkerNavigator.permissionserst ab Version 16. Vorher per'permissions' in navigatorprüfen. - Die Methode
Permissions.revoke()ist veraltet und in aktuellen Browsern kaum noch vorhanden – nicht einsetzen.