Copyright © 2025World Wide Web Consortium.W3C®liability,trademark andpermissive document license rules apply.
This specification defines common infrastructure that other specifications can use to interact with browser permissions. These permissions represent a user's choice to allow or deny access to "powerful features" of the platform. For developers, the specification standardizes an API to query the permission state of a powerful feature, and be notified if a permission to use a powerful feature changes state.
This section describes the status of this document at the time of its publication. A list of currentW3C publications and the latest revision of this technical report can be found in theW3C standards and drafts index.
This is a work in progress.
This document was published by theWeb Application Security Working Group as an Editor's Draft.
Publication as an Editor's Draft does not imply endorsement byW3C and its Members.
This is a draft document and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to cite this document as other than a work in progress.
This document was produced by a group operating under theW3C Patent Policy.W3C maintains apublic list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent that the individual believes containsEssential Claim(s) must disclose the information in accordance withsection 6 of theW3C Patent Policy.
This document is governed by the18 August 2025W3C Process Document.
This section is non-normative.
Specifications can define features that are explicitly identified as apowerful feature. These features are said to be "powerful" in that they can have significant privacy, security, and performance implications. As such, users rely on user agents to deny sites the ability to use these features until they have given express permission, and usually only granting this ability for a limited amount of time. Express permission to allow a site to use a powerful feature is generally given and controlled through browser UI, as illustrated below.

In this sense, a permission represents the current state of user consent for certain types of features, and particularly "powerful features". Ultimately the user retains control of these permissions and have the ability to manually grant or deny permissions through user preferences. Further, user agents assist users in managing permissions by, for example, hiding and automatically denying certain permission prompts that would otherwise be a nuisance, and automatically expiring granted permissions if a user doesn't visit a website for some time.

This section is non-normative.
This example uses the Permissions API to decide whether local news should be shown using the Geolocation API or with a button offering to add the feature.
const { state } =await navigator.permissions.query({name:"geolocation"});switch (state) {case"granted":showLocalNewsWithGeolocation();break;case"prompt":showButtonToEnableLocalNews();break;case"denied":showNationalNews();break;} This example simultaneously checks the state of the"geolocation" and"notifications"powerful features:
const queryPromises = ["geolocation","notifications"].map(name => navigator.permissions.query({ name }));forawait (const statusof queryPromises) {console.log(`${status.name}:${status.state}`);}This example is checking the permission state of the available cameras.
const devices =await navigator.mediaDevices.enumerateDevices();// filter on video inputs, and map to query objectconst queries = devices .filter(({ kind }) => kind ==="videoinput") .map(({ deviceId }) => ({name:"camera", deviceId }));const promises = queries.map((queryObj) => navigator.permissions.query(queryObj));try {const results =awaitPromise.all(promises);// log the state of each camera results.forEach(({ state }, i) =>console.log("Camera", i, state));}catch (error) {console.error(error);}This section specifies a model forpermissions to usepowerful features on the Web platform.
Apermission represents a user's decision to allow a web application to use apowerful feature. This decision is represented as a permissionstate.
Express permission refers to the usergranting the web application the ability to use apowerful feature.
Current Web APIs have different ways to deal with permissions. For example, theNotifications API Standard allows developers to request a permission and check the permission status explicitly. Others expose the status to web pages only when they try to use the API, e.g., theGeolocation which fails if the permission was not granted without allowing the developer to check beforehand.
The solution described in this document is meant to be extensible, but isn't expected to be applicable to all the current and future permissions available in the web platform. Working Groups that are creating specifications whose permission model doesn't fit in the model described in this document should contact the editors byfiling an issue.
Conceptually, apermission for apowerful feature can be in one of the followingstates:
To ascertainnew information about the user's intent, a user agentMAY collect and interpret information about a user's intentions. This information can come from explicit user action, aggregate behavior of both the relevant user and other users, orimplicit signals this specification hasn't anticipated.
Theimplicit signals could be, for example, theinstallation status of a web application or frequency and recency of visits. A user that has installed a web application and used it frequently and recently is more likely to trust it. Implementations are advised to exercise caution when relying on implicit signals.
Everypermission has alifetime, which is the duration for which a particular permission remains"granted" before it reverts back to itsdefault state. Alifetime could be until a particularRealm is destroyed, until a particulartop-level browsing context is destroyed, a particular amount of time, or be infinite. The lifetime is negotiated between the end-user and theuser agent when the user givesexpress permission to use afeature—usually via some permission UI or user-agent defined policy.
Every permission has adefault state (usually"prompt"), which is thestate that the permission is in when the user has not yet givenexpress permission to use thefeature or it has been reset because itslifetime has expired.
The user agent maintains a singlepermission store which is alist ofpermission store entries. Each particularentry denoted by itsdescriptor andkey can only appear at most once in this list.
The user agentMAY removeentries from thepermission store when their respectivepermission'slifetime has expired.
Apermission store entry is atuple ofPermissionDescriptordescriptor,permission keykey, andstatestate.
Toget a permission store entry given aPermissionDescriptordescriptor andpermission keykey:
Toset a permission store entry given aPermissionDescriptordescriptor, apermission keykey, and astatestate, run these steps:
Toremove a permission store entry given aPermissionDescriptordescriptor andpermission keykey, run these steps:
Apermission key has its type defined by a feature'spermission key type.
To determine whether apermission keykey1is equal to apermission keykey2, given aPermissionDescriptordescriptor, run the following steps:
name, passingkey1 andkey2.Apowerful feature is a web platform feature (usually an API) for which a user givesexpress permission before the feature can be used. Except for a few notable exceptions (e.g., theNotifications API Standard), most powerful features are alsopolicy-controlled features. For powerful features that are alsopolicy-controlled features, [Permissions-Policy] controls whether adocument isallowed to use a given feature. That is, a powerful feature can only requestexpress permission from a user if thedocument has permission delegated to it via the correspondingpolicy-controlled feature (see example below). Subsequent access to the feature is determined by the user having"granted" permission, or by satisfying some criteria that is equivalent to a permissiongrant.
This example shows how the permissions policy set through theallow attribute controls whether theiframe isallowed to use a powerful feature. Because"geolocation" is allowed, theiframe's document can request permission from the user to use theGeolocation (i.e., it will prompt the user for express permission to access their location information). However, requesting permission to use any other feature will be automatically denied, because they are not listed in theallow attribute.
<iframesrc="https://example.com/"allow="geolocation"></iframe>SeeA. Relationship to the Permissions Policy specification for more information.
Apowerful feature is identified by itsname, which is a string literal (e.g., "geolocation").
The user agent tracks whichpowerful features the user haspermission to use via theenvironment settings object.
Eachpowerful feature can define zero or more additionalaspects. An aspect is defined as WebIDLdictionary thatinherits fromPermissionDescriptor and serves as a WebIDL interface'spermission descriptor type.
A hypotheticalpowerful feature "food detector API" has twoaspects that allow sensing taste and smell. So, a specification would define a new WebIDL interface thatinheritsPermissionDescriptor:
dictionary SensesPermissionDescriptor :PermissionDescriptor {booleancanSmell=false;booleancanTaste=false;};Which would then be queried via the API in the following way:
// Check if the "senses" powerful feature is allowed to smell thingsconst status =await navigator.permissions.query({name:"senses",canSmell:true,});// Do something interesting with the status. A user can restrict the "senses" powerful feature to only "taste", in which case thePermissionStatus'sstate above would be "denied" .
Thepermissions task source is atask source used to perform permissions-relatedtasks in this specification.
When a conformingspecificationspecifies a powerful feature it:
PermissionDescriptor.Registering the newly specifiedpowerful features in thePermissions Registry gives this Working Group an opportunity to provide feedback and check that integration with this specification is done effectively.
PermissionDescriptor or one of its subtypes. If unspecified, this defaults toPermissionDescriptor.
The feature can define apartial order on descriptor instances. IfdescriptorA isstronger thandescriptorB, then ifdescriptorA'spermission state is "granted",descriptorB'spermission state must also be "granted", and ifdescriptorB'spermission state is "denied",descriptorA'spermission state must also be "denied".
{name: "midi", sysex: true} ("midi-with-sysex") isstronger than{name: "midi", sysex: false} ("midi-without-sysex"), so if the user denies access to midi-without-sysex, the UA must also deny access to midi-with-sysex, and similarly if the user grants access to midi-with-sysex, the user agent must also grant access to midi-without-sysex.
Somepowerful features have more information associated with them than just aPermissionState. Each of these features defines anextra permission data type.
For example,getUserMedia() needs to determinewhich cameras the user has granted permission to access.
If aDOMStringname names one of these features, thenname'sextra permission data for an optionalenvironment settings objectsettings is the result of the following algorithm:
If specified, theextra permission data algorithm is usable for this feature.
PermissionStatus or one of its subtypes. If unspecified, this defaults toPermissionStatus. Takes an instance of thepermission descriptor type and a new or existing instance of thepermission result type, and updates thepermission result type instance with the query result. Used byPermissions'query(permissionDesc) method and thePermissionStatus update steps. If unspecified, this defaults to thedefault permission query algorithm.
Thedefault permission query algorithm, given aPermissionDescriptorpermissionDesc and aPermissionStatusstatus, runs the following steps:
status'sstate topermissionDesc's permission state.The type ofpermission key used by the feature. Defaults toorigin. A feature that specifies a custompermission key typeMUST also specify apermission key generation algorithm.
Takes anoriginorigin and anoriginembedded origin, and returns a newpermission key. If unspecified, this defaults to thedefault permission key generation algorithm. A feature that specifies a custompermission key generation algorithmMUST also specify apermission key comparison algorithm.
Takes twopermission keys and returns aboolean that shows whether the two keys are equal. If unspecified, this defaults to thedefault permission key comparison algorithm.
Thedefault permission key comparison algorithm, givenpermission keyskey1 andkey2, runs the following steps:
Takes no arguments. Updates any other parts of the implementation that need to be kept in sync with changes in the results ofpermission states orextra permission data.
If unspecified, this defaults to runningreact to the user revoking permission.
Specifications that define one or morepowerful featuresSHOULD suggest apermissionlifetime that is best suited for the particular feature. Some guidance on determining the lifetime of a permission is noted below, with a strong emphasis on user privacy. If nolifetime is specified, the user agent provides one.
When the permissionlifetime expires for an origin:
For particularly privacy-sensitivefeatures, such asMedia Capture and Streams, which can provide a web application access to a user's camera and microphone, some user agents expire a permissiongrant as soon as a browser tab is closed ornavigated. For other features, like theGeolocation, user agents are known to offer a choice of only granting the permission for the session, or for one day. Others, like theNotifications API Standard andPush API APIs, remember a user's decision indefinitely or until the user manually revokes the permission. Note that permissionlifetimes can vary significantly between user agents.
Finding the right balance for the lifetime of a permission requires a lot of thought and experimentation, and often evolves over a period of years. Implementers are encouraged to work with their UX security teams to find the right balance between ease of access to apowerful feature (i.e., reducing the number of permission prompts), respecting a user's privacy, and making users aware when a web application is making use of a particular powerful feature (e.g., via some visual or auditory UI indicator).
If you are unsure about whatlifetime to suggest for apowerful feature, please contact thePrivacy Interest Group for guidance.
AnPermissionState value that serves as apermission'sdefault state of apowerful feature.
If not specified, thepermission'sdefault state is "prompt".
Adefault powerful feature is apowerful feature with all of the above types and algorithms defaulted.
Toget the current permission state, given anamename and an optionalenvironment settings objectsettings, run the following steps. This algorithm returns aPermissionState enum value.
PermissionDescriptor withname initialized toname. Adescriptor'spermission state, given an optionalenvironment settings objectsettings is the result of the following algorithm. It returns aPermissionState enum value:
denied".name.Document run the following step:Document.denied".PermissionState enum value fromentry'sstate.PermissionState enum value that represents the permission state offeature, taking into account anypermission state constraints fordescriptor'sname. As a shorthand, aDOMStringname'spermission state is thepermission state of aPermissionDescriptor with itsname member set toname.
Torequest permission to use adescriptor, the user agent must perform the following steps. This algorithm returns either "granted" or "denied".
prompt", returncurrent state and abort these steps.granted"; otherwise to "denied". The user's interaction may providenew information about the user's intent for theorigin.This is intentionally vague about the details of the permission UI and how the user agent infers user intent. User agents should be able to explore lots of UI within this framework.
As a shorthand,requesting permission to use aDOMStringname, is the same asrequesting permission to use aPermissionDescriptor with itsname member set toname.
Toprompt the user to choose one or moreoptions associated with a givendescriptor and an optionalbooleanallowMultiple (default false), the user agent must perform the following steps. This algorithm returns either "denied" or the user's selection.
denied", return "denied" and abort these steps.granted", the user agent may return one (or more ifallowMultiple is true) ofoptions chosen by the user and abort these steps. If the user agent returns without prompting, then subsequentprompts for the user to choose from the same set of options with the samedescriptor must return the same option(s), unless the user agent receivesnew information about the user's intent.denied".This is intentionally vague about the details of the permission UI and how the user agent infers user intent. User agents should be able to explore lots of UI within this framework (e.g., a permission prompt could time out and automatically return "denied" without the user making an explicit selection).
As a shorthand,prompting the user to choose from options associated with aDOMStringname, is the same asprompting the user to choose from those options associated with aPermissionDescriptor with itsname member set toname.
When the user agent learns that the user no longer intends to grant permission to use a feature described by thePermissionDescriptordescriptor in the context described by thepermission keykey,react to the user revoking permission by running these steps:
name'spermission revocation algorithm.This feature is in all major engines.
| Chrome | 43+ |
| Chrome Android | ? |
| Edge | ? |
| Edge Mobile | ? |
| Firefox | 46+ |
| Firefox Android | ? |
| Opera | ? |
| Opera Android | ? |
| Safari | 16+ |
| Safari iOS | ? |
| Samsung Internet | ? |
| WebView Android | No |
| Chrome | 43+ |
| Chrome Android | ? |
| Edge | ? |
| Edge Mobile | ? |
| Firefox | No |
| Firefox Android | ? |
| Opera | ? |
| Opera Android | ? |
| Safari | 16.4+ |
| Safari iOS | ? |
| Samsung Internet | ? |
| WebView Android | No |
WebIDL[Exposed=(Window)]partial interfaceNavigator { [SameObject] readonly attributePermissionspermissions;};[Exposed=(Worker)]partial interfaceWorkerNavigator { [SameObject] readonly attributePermissionspermissions;};This feature is in all major engines.
| Chrome | 43+ |
| Chrome Android | ? |
| Edge | ? |
| Edge Mobile | ? |
| Firefox | 46+ |
| Firefox Android | ? |
| Opera | ? |
| Opera Android | ? |
| Safari | 16+ |
| Safari iOS | ? |
| Samsung Internet | ? |
| WebView Android | No |
WebIDL[Exposed=(Window,Worker)]interfacePermissions {Promise<PermissionStatus>query(objectpermissionDesc);};dictionaryPermissionDescriptor { requiredDOMStringname;};This feature is in all major engines.
| Chrome | 43+ |
| Chrome Android | ? |
| Edge | ? |
| Edge Mobile | ? |
| Firefox | 46+ |
| Firefox Android | ? |
| Opera | ? |
| Opera Android | ? |
| Safari | 16+ |
| Safari iOS | ? |
| Samsung Internet | ? |
| WebView Android | No |
When thequery() method is invoked, theuser agentMUST run the followingquery a permission algorithm, passing the parameterpermissionDesc:
Window object, then:Document is notfully active, returna promise rejected with an "InvalidStateError"DOMException.PermissionDescriptor.name"] is not supported, returna promise rejected with aTypeError. This is deliberately designed to work the same as WebIDL'senumeration (enum) and implementers are encouraged to use their own customenum here. The reason this is not an enum in the specification is that browsers vary greatly in the powerful features they support. Using aDOMString to identify a powerful feature gives implementers the freedom to pick and choose which of the powerful features from thePermissions Registry they wish to support.
name'spermission descriptor type.PermissionStatus withtypedDescriptor.[[query]] internal slot.name'spermission query algorithm, passingquery andstatus.This feature is in all major engines.
| Chrome | 43+ |
| Chrome Android | ? |
| Edge | ? |
| Edge Mobile | ? |
| Firefox | 46+ |
| Firefox Android | ? |
| Opera | ? |
| Opera Android | ? |
| Safari | 16+ |
| Safari iOS | ? |
| Samsung Internet | ? |
| WebView Android | No |
WebIDL[Exposed=(Window,Worker)]interfacePermissionStatus :EventTarget { readonly attributePermissionStatestate; readonly attributeDOMStringname; attributeEventHandleronchange;};enumPermissionState {"granted","denied","prompt",};PermissionStatus instances are created with a[[query]] internal slot, which is an instance of a feature'spermission descriptor type.
The "granted", "denied", and "prompt" enum values represent the concepts of"granted","denied", and"prompt" respectively.
Tocreate aPermissionStatus for a givenPermissionDescriptorpermissionDesc:
name.This feature is in all major engines.
| Chrome | 97+ |
| Chrome Android | ? |
| Edge | ? |
| Edge Mobile | ? |
| Firefox | 93+ |
| Firefox Android | ? |
| Opera | ? |
| Opera Android | ? |
| Safari | 16+ |
| Safari iOS | ? |
| Samsung Internet | ? |
| WebView Android | No |
Thename attribute returns the value it was initialized to.
This feature is in all major engines.
| Chrome | ? |
| Chrome Android | ? |
| Edge | ? |
| Edge Mobile | ? |
| Firefox | 46+ |
| Firefox Android | ? |
| Opera | ? |
| Opera Android | ? |
| Safari | 16+ |
| Safari iOS | ? |
| Samsung Internet | ? |
| WebView Android | No |
Thestate attribute returns the latest value that was set on the current instance.
This feature is in all major engines.
| Chrome | 43+ |
| Chrome Android | ? |
| Edge | ? |
| Edge Mobile | ? |
| Firefox | 46+ |
| Firefox Android | ? |
| Opera | ? |
| Opera Android | ? |
| Safari | 16.4+ |
| Safari iOS | ? |
| Samsung Internet | ? |
| WebView Android | No |
Theonchange attribute is anevent handler whose correspondingevent handler event type ischange.
Whenever theuser agent is aware that the state of aPermissionStatus instancestatus has changed, it asynchronously runs thePermissionStatus update steps:
Window object, then:[[query]] internal slot.name'spermission query algorithm, passingquery andstatus.change atstatus. APermissionStatus objectMUST NOT be garbage collected if it has anevent listener whose type ischange.
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key wordsMAY,MUST,MUST NOT,OPTIONAL, andSHOULD in this document are to be interpreted as described inBCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
Two classes of product can claim conformance to this specification:user agents and otherspecifications (i.e., a technical report thatspecifies a powerful feature in a manner that conforms to the requirements of this specification).
This section is non-normative.
Although both this specification and thePermissions Policy specification deal with "permissions", each specification serves a distinct purpose in the platform. Nevertheless, the two specifications do explicitly overlap.
On the one hand, this specification exclusively concerns itself withpowerful features whose access is managed through a user-agent mediated permissions UI (i.e., permissions where the user gives express consent before that feature can be used, and where the user retains the ability to deny that permission at any time for any reason). These powerful features are registered in thePermissions Registry.
On the other hand, thePermissions Policy specification allows developers to selectively enable and disable policy-controlled features through a "permissions policy" (be it a HTTP header or theallow attribute). In that sense, the Permissions Policy subsumes this specification in thatPermissions Policy governs whether a feature is available at all, independently of this specification. These policy-controlled features are also registered in thePermissions Registry.
A powerful feature that has been disabled by thePermissions Policy specification always has itspermission state reflected as "denied" by this specification. This occurs becausereading the current permission relies on [HTML]'s "allowed to use" check, which itself calls into thePermissions Policy specification. Important to note here is the sharing of permission names across both specifications. Both this specification and thePermissions Policy specification rely on other specifications defining the names of the permission andname, and they are usually named the same thing (e.g., "geolocation" of theGeolocation, and so on).
Finally, it's not possible for a powerful feature to ever become "granted" through any means provided by thePermissions Policy specification. The only way that apowerful feature can be"granted" is by the user givingexpress permission or by some user agent policy.
For the purposes of user-agent automation and application testing, this document defines extensions to the [WebDriver] and [WebDriver-BiDi] specifications. It isOPTIONAL for a user agent to support them.
WebIDLdictionaryPermissionSetParameters { requiredobjectdescriptor; requiredPermissionStatestate;}; Toset a permission given aPermissionDescriptordescriptor, aPermissionStatestate, an optionalpermission keykey, and an optionaluser agent:
This document defines the followingextension commands for the [WebDriver] specification.
| HTTP Method | URI Template |
|---|---|
| POST | /session/{session id}/permissions |
TheSet Permissionextension command simulates user modification of aPermissionDescriptor'spermission state.
Theremote end steps are:
PermissionSetParameters. If this throws an exception, return aninvalid argumenterror.state is an inappropriatepermission state for any implementation-defined reason, return aninvalid argumenterror. For example,user agents that define the "midi"powerful feature as "always on" can choose to reject a command to set thepermission state to "denied" at this step.
descriptor.name"). If this throws an exception, return ainvalid argumenterror.state.null. Toset permission for{name: "midi", sysex: true} of thecurrent settings object of thesession with ID 23 to "granted", the local end would POST to/session/23/permissions with the body:
{"descriptor":{"name":"midi","sysex":true},"state":"granted"}This document defines the followingextension modules for the [WebDriver-BiDi] specification.
Thepermissions module contains commands for managing the remote end browser permissions.
{^remote end definition^}
PermissionsCommand = ( permissions.setPermission)permissions.PermissionDescriptor = { name: text,} Thepermissions.PermissionDescriptor type represents aPermissionDescriptor.
permissions.PermissionState = "granted" / "denied" / "prompt" Thepermissions.PermissionState type represents aPermissionState.
TheSet Permissioncommand simulates user modification of aPermissionDescriptor'spermission state.
permissions.setPermission = ( method: "permissions.setPermission", params: permissions.SetPermissionParameters)permissions.SetPermissionParameters = { descriptor: permissions.PermissionDescriptor, state: permissions.PermissionState, origin: text, ? embeddedOrigin: text, ? userContext: text,}EmptyResultTheremote end steps withsession andcommand parameters are:
descriptor field ofcommand parameters.name field ofdescriptor representingname.state field ofcommand parameters.userContext field ofcommand parameters, if present, anddefault otherwise.PermissionSetParameterspermission name'spermission descriptor type. If this conversion throws an exception, returnerror witherror codeinvalid argument.origin field ofcommand parameters.embeddedOrigin field ofcommand parameters, if present, andorigin otherwise.null.This section is non-normative.
ThisW3C Registry provides a centralized place to find thepolicy-controlled features and/orpowerful features of the web platform. Through thechange process it also helps assure permissions in the platform are consistently specified across various specifications.
By splitting the registry into standardized permissions and provisional permissions, the registry also provides a way to track the status of these features.
Thechange process for adding and/or updating this registry is as follows:
"super-awesome"). Make sure the string is linkable by wrapping it adfn element.'self').An typical example that would meet this criteria:
The Super Awesome API defines apolicy-controlled feature identified by the string "super-awesome". Itsdefault allowlist is'self'.For a permission to appear in the table of standardized permissions, and thus be considered astandardized permission, it needs to meet the following criteria:
Eachpermission is identified by a unique literal string. In the case ofPermissions Policy, the string identifies apolicy-controlled features. Similarly, in thePermissions specification the string identifies apowerful feature.
Not everypolicy-controlled feature ispowerful features. For example, "web-share" is apolicy-controlled feature that is not classified as apowerful feature because it doesn't requireexpress permission to be used. However, with very few exceptions, mostpowerful features are alsopolicy-controlled features. For example, "geolocation" is both apolicy-controlled feature and apowerful feature, as it requiresexpress permission to be used. Please refer to thePermissions specification for guidance on how tospecify a powerful feature.
| Identifying string | Ispolicy-controlled feature? | Ispowerful feature? | Specification | Implementations | ||
|---|---|---|---|---|---|---|
| Chromium | Gecko | WebKit | ||||
| "geolocation" | YES | YES | Geolocation | YES | YES | YES |
| "notifications" | NO | YES | Notifications API Standard | YES | YES | YES |
| "push" | NO | YES | Push API | YES | YES | YES |
| "web-share" | YES | NO | Web Share API | YES | YES | YES |
Provisional permissions are permissions that are not yetstandardized (i.e., they are either experimental, still in the incubation phase, or are only implemented in a single browser engine).
| Identifying string | Ispolicy-controlled feature? | Ispowerful feature? | Specification | Implementations | ||
|---|---|---|---|---|---|---|
| Chromium | Gecko | WebKit | ||||
| "accelerometer" | YES | YES | Device Orientation and Motion | YES | NO | NO |
| "window-management" | YES | YES | Window Management | YES | NO | NO |
| "local-fonts" | YES | YES | Local Font Access API | YES | NO | NO |
An adversary could use apermission state as an element in creating a "fingerprint" corresponding to an end-user. Although an adversary can already determine the state of a permission by actually using the API, that often leads to a UI prompt being presented to the end-user (if the permission was not already"granted"). Even though this API doesn't expose new fingerprinting information to websites, it makes it easier for an adversary to have discreet access to this information.
A user agentSHOULD provide a means for the user to review, update, and reset thepermissionstate ofpowerful features associated with anorigin.
There are no documented security considerations at this time. Readers are instead encouraged to read sectionD. Privacy considerations.
WebIDL[Exposed=(Window)]partial interfaceNavigator { [SameObject] readonly attributePermissionspermissions;};[Exposed=(Worker)]partial interfaceWorkerNavigator { [SameObject] readonly attributePermissionspermissions;};[Exposed=(Window,Worker)]interfacePermissions {Promise<PermissionStatus>query(objectpermissionDesc);};dictionaryPermissionDescriptor { requiredDOMStringname;};[Exposed=(Window,Worker)]interfacePermissionStatus :EventTarget { readonly attributePermissionStatestate; readonly attributeDOMStringname; attributeEventHandleronchange;};enumPermissionState {"granted","denied","prompt",};dictionaryPermissionSetParameters { requiredobjectdescriptor; requiredPermissionStatestate;};This section is non-normative.
The editors would like to thank Adrienne Porter Felt, Anne van Kesteren, Domenic Denicola, Jake Archibald and Wendy Seltzer for their help with the API design and editorial work.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: