Signatur
Beschreibung
Die Methode allowedFeatures() der Schnittstelle FeaturePolicy liefert eine Liste von Direktivennamen (z. B. "camera", "geolocation", "fullscreen"). Das sind alle Features, die die aktive Richtlinie dem aktuellen Dokument oder einem eingebetteten <iframe> für den eigenen Ursprung erlaubt. Auf das Richtlinienobjekt greift man über document.featurePolicy bzw. iframeElement.featurePolicy zu.
Nützlich ist die Methode zur Laufzeitprüfung: Bevor eine Anwendung auf sensible APIs wie Kamera, Mikrofon oder Standort zugreift, kann sie nachsehen, ob der HTTP-Header Permissions-Policy (bzw. der ältere Feature-Policy) oder das allow-Attribut eines iframes das Feature überhaupt freigibt. So lassen sich Bedienelemente ausblenden, die ohnehin nicht funktionieren würden, oder Konfigurationsfehler bei der Richtlinie finden.
Wichtig: Ein erlaubtes Feature heißt nur, dass die Richtlinie es nicht blockiert. Ob der Nutzer tatsächlich eine Berechtigung erteilt hat, prüft man mit der Permissions API (navigator.permissions.query()). Wenn du nur ein einzelnes Feature prüfen willst, ist allowsFeature(name) meist die bessere Wahl.
Rückgabewert
Beispiele
Alle erlaubten Features des Dokuments auflisten
// Nur in Chromium-Browsern verfügbar – deshalb vorher prüfen
if ('featurePolicy' in document) {
const allowed = document.featurePolicy.allowedFeatures();
console.log(`Erlaubte Features (${allowed.length}):`);
allowed.forEach((feature) => console.log(`- ${feature}`));
} else {
console.log('FeaturePolicy-API wird nicht unterstützt.');
}
UI abhängig von der Richtlinie anpassen
const isFeatureAllowed = (name) => {
const policy = document.featurePolicy;
// Ohne API-Unterstützung optimistisch annehmen, dass das Feature erlaubt ist
if (!policy) return true;
return policy.allowedFeatures().includes(name);
};
const cameraButton = document.querySelector('#start-camera');
if (cameraButton && !isFeatureAllowed('camera')) {
cameraButton.disabled = true;
cameraButton.title = 'Kamera ist durch die Permissions Policy blockiert';
}
Richtlinie eines eingebetteten iframes prüfen
const frame = document.createElement('iframe');
frame.src = 'https://example.com/widget.html';
frame.allow = 'fullscreen; geolocation';
document.body.append(frame);
frame.addEventListener('load', () => {
const features = frame.featurePolicy?.allowedFeatures() ?? [];
console.log('fullscreen:', features.includes('fullscreen'));
console.log('camera:', features.includes('camera'));
});
// Wichtig · Fallstricke
- Kompatibilität: Die
FeaturePolicy-Schnittstelle ist experimentell und nicht standardisiert. Sie gibt es nur in Chromium-basierten Browsern, Firefox und Safari kennen sie nicht. Frage deshalb immer vorher'featurePolicy' in documentab. Die Spezifikation wurde in Permissions Policy umbenannt, die geplante Nachfolger-API heißtdocument.permissionsPolicy, ist aber noch nicht allgemein verfügbar. - Richtlinie ≠ Nutzerberechtigung: Ein Feature in der Liste kann trotzdem scheitern, wenn der Nutzer den Zugriff verweigert. Den Berechtigungsstatus prüfst du mit
navigator.permissions.query(). - Die Liste gilt nur für den eigenen Ursprung. Ob ein fremder Ursprung ein Feature nutzen darf, fragst du mit
allowsFeature(feature, origin)ab. - Welche Direktivennamen vorkommen, unterscheidet sich je nach Browserversion. Feste Längen oder Reihenfolgen des Arrays solltest du nicht voraussetzen.
- Bei iframes mit fremdem Ursprung spiegelt
iframe.featurePolicydie Richtlinie aus Sicht des Elternelements wider, also dasallow-Attribut plus die eigene Richtlinie.