Signatur
Beschreibung
Die Methode allowsFeature() des FeaturePolicy-Interfaces fragt ab, ob eine einzelne Direktive der Permissions Policy (früher Feature Policy) im aktuellen Kontext erlaubt ist. Das zugehörige Objekt erreichst du über document.featurePolicy (Richtlinie des eigenen Dokuments) oder über iframeElement.featurePolicy (Richtlinie, die für den Inhalt eines eingebetteten Frames gilt).
Die Richtlinie selbst setzt der Server über den HTTP-Header Permissions-Policy (bzw. das veraltete Feature-Policy) oder das Dokument über das allow-Attribut von <iframe>. Mit allowsFeature() kannst du vor dem Aufruf einer Schnittstelle wie navigator.geolocation oder getUserMedia() prüfen, ob die Richtlinie sie überhaupt zulässt. So kannst du Bedienelemente ausblenden oder auf Alternativen ausweichen, statt einen Fehler zu bekommen.
Wichtig: Das Ergebnis sagt nur etwas über die Richtlinie aus, nicht darüber, ob der Nutzer eine Berechtigung erteilt hat. Für den Berechtigungsstatus ist die Permissions API (navigator.permissions.query()) zuständig. Ohne Angabe von origin wird der Origin des Dokuments bzw. des Frames verwendet.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $feature Pflicht | string | Name der Richtlinien-Direktive, z. B. "camera", "microphone", "geolocation", "fullscreen" oder "autoplay". Unbekannte Namen ergeben false. |
|
| $origin | string | Origin des Dokuments bzw. des iframe-Inhalts | Origin, für den die Prüfung erfolgen soll, z. B. "https://maps.example.com". Muss ein gültiger Origin-String sein. |
Rückgabewert
true, wenn das Feature für den angegebenen (bzw. den eigenen) Origin erlaubt ist, sonst false.Beispiele
Geolocation nur anbieten, wenn die Richtlinie es erlaubt
const policy = document.featurePolicy;
const button = document.querySelector('#standort-button');
// Feature-Erkennung: API existiert nur in Chromium-Browsern
if (policy && !policy.allowsFeature('geolocation')) {
button.hidden = true;
console.log('Geolocation ist per Permissions Policy gesperrt.');
} else {
button.addEventListener('click', () => {
navigator.geolocation.getCurrentPosition(
(pos) => console.log(pos.coords.latitude, pos.coords.longitude),
(err) => console.error(err.message)
);
});
}
Prüfung für einen bestimmten Origin
const policy = document.featurePolicy;
if (policy) {
const erlaubt = policy.allowsFeature('camera', 'https://video.example.com');
console.log(`Kamera für video.example.com: ${erlaubt}`);
}
Richtlinie eines iframes prüfen
// <iframe id="karte" src="https://maps.example.com" allow="fullscreen; geolocation"></iframe>
const frame = document.querySelector('#karte');
if ('featurePolicy' in frame) {
const features = ['fullscreen', 'geolocation', 'microphone'];
for (const f of features) {
console.log(f, frame.featurePolicy.allowsFeature(f));
}
}
Wiederverwendbare Hilfsfunktion mit Fallback
const isFeatureAllowed = (feature) => {
const policy = document.featurePolicy ?? document.permissionsPolicy;
// Ohne API: optimistisch true annehmen und Fehler später abfangen
if (!policy || typeof policy.allowsFeature !== 'function') return true;
return policy.allowsFeature(feature);
};
console.log(isFeatureAllowed('autoplay'));
// Wichtig · Fallstricke
- Kompatibilität:
document.featurePolicyundallowsFeature()gibt es nur in Chromium-Browsern (Chrome, Edge, Opera). Firefox und Safari bieten die API nicht an. Prüfe daher immer vorher, ob sie vorhanden ist, z. B. mitif (document.featurePolicy). - Nicht standardisiert: Die Spezifikation wurde in Permissions Policy umbenannt. Dort ist die Schnittstelle als
document.permissionsPolicyvorgesehen, sie wird aber bisher kaum unterstützt. In Produktivcode solltest du dich nicht allein auf diese Methode verlassen. truebedeutet nicht, dass der Nutzer zugestimmt hat. Die Nutzung kann trotzdem an einer verweigerten Berechtigung, einem fehlenden sicheren Kontext (HTTPS) oder fehlender Hardware scheitern. Fehler solltest du daher weiterhin abfangen.- Bei
iframe.featurePolicywird die Richtlinie aus dem Header der Elternseite und demallow-Attribut berechnet. Header, die das eingebettete Dokument selbst sendet, fließen nicht ein. - Unbekannte oder falsch geschriebene Feature-Namen führen nicht zu einem Fehler, sondern geben still
falsezurück. Welche Namen der Browser kennt, zeigtdocument.featurePolicy.features().