Start · Sprachen · JavaScript · Referenz · WorkerNavigator.permissions

WorkerNavigator.permissions

Eigenschaft

Gibt im Worker-Kontext ein <code>Permissions</code>-Objekt zurück, mit dem sich der Berechtigungsstatus von APIs (z. B. Benachrichtigungen, Geolocation) abfragen lässt.

seit JavaScript Baseline 2022: Chrome 43+, Firefox 46+, Safari 16+ Kategorie: webapi

Signatur

WorkerNavigator.permissions

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

Typ
Permissions
Beschreibung
Ein 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 });
  })());
});
Keine Berechtigung – Benachrichtigung wird übersprungen

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' });
{ permission: 'geolocation', state: 'prompt' }

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();
Aktueller Status: prompt Status geändert zu: granted

// 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 einem TypeError abgelehnt – daher immer mit try/catch absichern.
  • Push: Die Abfrage von "push" verlangt in Chromium meist zusätzlich userVisibleOnly: true.
  • Sicherer Kontext: Viele Berechtigungen stehen nur unter HTTPS (oder localhost) zur Verfügung.
  • Kompatibilität: Safari unterstützt WorkerNavigator.permissions erst ab Version 16. Vorher per 'permissions' in navigator prüfen.
  • Die Methode Permissions.revoke() ist veraltet und in aktuellen Browsern kaum noch vorhanden – nicht einsetzen.