1. Introduction and Background
+User agents expose powerful features to web sites, like geolocation +or camera access. These features are important to some use cases, but can be +easily abused.To handle this, user agents use permissions to ask the user +whether they wish for a particular access to be allowed or not.
+These permission requests began as a fairly direct passthrough: A site would +ask for some capability and the user agent immediately prompts the user to make +a decision for the request. Meanwhile, spam and abuse have forced user agents +to take a more opinionated approach to protect users' security, privacy, and +attention. The status quo is that users get a multitude of permission requests, +where it’s oftentimes unclear to users what the consequences of these requests +might be.
+This spec introduces a new mechanism that requests and initiates access to
+Geolocation capabilities through in-page elements, with built-in protections
+against abuse. Giving access to the location through in in-page lement wants
+to tie capability activation to the actual context in which it will be used
+, thus reducing "permission spam" and at the same time providing implementations
+with a better signal of user intent.
The later chapters of this specification are careful to build up the required +spec infrastructure to that it can be re-used on other, similarly spirited +elements providing access to other powerful features and their associated +capabilities.
+2. The geolocation Element
+ The HTML geolocation element can moderate access to the
+"geolocation" permission and the associated Geolocation
+capabilities.
-
+
- Categories: +
- Flow content.
+
- Phrasing content. +
- Interactive content. +
- Palpable content. +
- Phrasing content. +
- Contexts in which this element can be used: +
- Where phrasing content is expected. +
- Content model: +
- Flow content. +
- Content attributes: +
- Global attributes.
+
- ActivationBlockersMixin attributes. +
- PermissionsMixin attributes. +
autolocate— Whether to locate right away (if permission has already been granted). +watch— Wether to read the position once, or watch it continously. + - ActivationBlockersMixin attributes. +
- Accessibility considerations: +
- See issues below. +
- DOM interface: +
HTMLGeolocationElement+
[WAI-ARIA] specifies roles for in-page content.
+ It is yet unclear whether or how the geolocation element fits into
+ the existing set of roles.
+ Given that this element triggers permission requests, one could argue
+ that whatever accessibility concerns apply there should cover this element
+ as well. On the other hand, more specialized treatment may lead to better
+ support for users.
In § 3.4 Styling, and Styling Restrictions, this specification defines elaborate restrictions on
+ how geolocation elements can be rendered. It’s unclear whether there
+ need to be similarly spirited restrictions on which ARIA attributes can
+ be applied.
The isValid and
+invalidReason, as well as the global
+lang and
+tabindex content attributes, and the
+onpromptaction,
+onpromptdismiss, and
+onvalidationstatuschange event handlers follow the
+description in § 3 Mixins and Infrastructure.
The autolocate attribute determines
+whether the geolocation element should start locating immediately (if
+permission has already been granted).
The watch attribute determine whether
+the geolocation element report the location once or continously.
[+Exposed =Window ] +interface :HTMLGeolocationElement HTMLElement { + [HTMLConstructor ]constructor (); + +readonly attribute GeolocationPosition ?; +position readonly attribute GeolocationPositionError ?; + [error CEReactions ,Reflect ]attribute boolean ; + [autolocate CEReactions ,Reflect ]attribute boolean ; + +watch attribute EventHandler ; +}; +onlocation HTMLGeolocationElement includes ActivationBlockersMixin ; +HTMLGeolocationElement includes PermissionsMixin ; +
If the user has decided to allow access to geolocation information, the
+readonly attributes position and
+error reflect the current
+GeolocationPosition and GeolocationPositionError values, just like
+the PositionCallback and
+PositionErrorCallback callbacks (respectively) would have returned
If the boolean attribute autolocate is true,
+and if the "geolocation" permission has already been granted by
+the user, then the location should be retrieved immediately when the
+geolocation element is attached to the document. If the permission has
+not already been granted at insertion time, then this attribute has no effect.
If the boolean attribute watch
+is set to true, the onlocation event is called
+every time the position changes, matching the behaviour of watchPosition.
When a location is available, an Event is dispatched on the
+onlocation event handler.
+When the event is
+dispatched, the location, or information about a failure to retrieve the
+location, are available in the position or the
+error attributes. Depending on the
+watch element this happens once (if absent or false),
+or continously (if true).
HTMLGeolocationElement wants to mirror the Geolocation interface.
+There is a direct correspondance:
| position + | Result of PositionCallback.
+ |
|---|---|
| error + | Result of PositionErrorCallback.
+ |
| watch + | Use watchPosition().
+ |
| ¬ watch + | Use getCurrentPosition().
+ |
The global lang attribute is +observed by the element to select localized text.
+The default value
+for the global tabindex content attribute on the
+element is 0.
2.1. geolocation element internal state
+ The geolocation element uses all the internal slots from ActivationBlockersMixin and PermissionsMixin. Additionally,
+geolocation has the following internal slots:
-
+
-
+
A constant
+[[watchIDs]], +which is used with the request a position algorithm. -
+
+[[position]], +which contains the most recentGeolocationPosition. -
+
+[[positionError]], +which contains the most recentGeolocationPositionError.
2.1.1. Mixin-supporting state at the navigable
+In order to support the HTMLGeolocationElement, the navigable maintains
+an ordered set of elements, [[PermissionElements]]. This ordered set is used to evaluate the blockers of type unsuccesful_registration.
2.2. geolocation element algorithms
+ HTMLGeolocationElement constructor() steps are:
+
+
+ -
+
-
+
Initialize the internal
+[[Features]]to +« "geolocation" ». -
+
Initialize the internal
+[[BlockerList]]to «». -
+
Initialize the internal
+[[LastNotifiedValidState]]with false. -
+
Initialize the internal
+[[LastNotifiedInvalidReason]]with the empty +string. -
+
Initialize the internal
+[[watchIDs]]to « watchID », where +watchID is an implementation-definedunsigned longthat is +greater than zero. -
+
Initialize the internal
+[[position]]to null. -
+
Initialize the internal
+[[positionError]]to null. - + +
HTMLGeolocationElement’s insertion steps are:
+
+
+ -
+
-
+
Initialize the internal
+[[BlockerList]]to «». - + +
-
+
Initialize the internal
+[[IntersectionRect]]with undefined. -
+
Initialize the internal
+[[IntersectionObserver]]with the result of +constructing a newIntersectionObserverwith +IntersectionObserver callback and +«[ "rootMargin" →"-4px"]». -
+
Call
+[[IntersectionObserver]].observe(this). -
+
Run
+PermissionsMixin’s insertion steps. -
+
If this is not type permissible, then add a temporary blocker +with
+unsuccesful_registration. -
+
Add an expiring blocker with reason +
+recently_attached. -
+
If the traversable navigable of the node navigable of +this +is a fenced navigable, then add a permanent blocker +with
+illegal_subframe. - + +
- + +
HTMLGeolocationElement element’s activation behavior given event is:
+
+
+ -
+
-
+
Assert: element’s
+[[Features]]is not null. -
+
If element’s
+[[Features]]is empty, then return. -
+
If event.
+isTrustedis false, then return. -
+
If element.
+isValidis false, then return. -
+
Let descriptor be the result of build a permission descriptor for +element.
+ -
+
Request permission to use the powerful features described by +descriptor.
+ -
+
If the previous step was cancelled or dismissed by the user, then +dispatch onpromptdismiss on this and return.
+The [Permissions] spec assumes that request permission to use +will always succeed. That is, it assumes that the user will always make a +choice and that the algorithm will always deliver a
+grant/deny+answer corresponding to that choice. But you can’t force a user to do that. +Some user agents may have different UI affordances for an explicit +denial (e.g. a "deny" button) on one hand, and cancelling or dismissing the +request dialog (e.g. an "X" button in the top right corner). Here, we +distinguish between these two actions, despite no clear hook for this +in the underlying specification. - + +
- + +
position getter steps are to return the value
+of [[position]].
+error getter steps are to return the value of
+[[positionError]].
+-
+
-
+
If get the current permission state is not +
+granted, then return. -
+
If
+autolocateis not true, then return. - + +
-
+
-
+
Let positionCallback be a
+PositionCallbackthat performs the following steps:-
+
-
+
Set this’s
+[[positionError]]to undefined. -
+
Set this’s
+[[position]]toPositionCallback’s position +argument. - + +
-
+
-
+
Let errorCallback be a
+PositionErrorCallbackthat performs the following steps:-
+
-
+
Set this’s
+[[position]]to undefined. -
+
Set this’s
+[[positionError]]toPositionCallback’s +positionError argument. - + +
-
+
-
+
Let positionOptions be «[]»
+ -
+
Let geolocation be the relevant global object’s
+Geolocation. -
+
+
-
+
-
+
Request a position with geolocation, positionCallback, +errorCallback, positionOptions, and this’s
+[[watchIDs]].
-
+
-
+
Otherwise:
+-
+
-
+
Request a position with geolocation, positionCallback, +errorCallback, positionOptions.
+
-
+
-
+
-
+
Assert: element’s node navigable’s
+[[PermissionElements]]+contains element. -
+
Let count be 0.
+ -
+
For each current in +element’s node navigable’s
+[[PermissionElements]]:-
+
-
+
If current is element, then break.
+ -
+
If element.
+[[Features]]equals current.[[Features]]then increment count by 1.
+
-
+
-
+
Return whether count is less than 3.
+
-
+
-
+
For each current in document’s +
+[[PermissionElements]]:-
+
-
+
If current is type permissible, then remove blockers with +
+unsuccesful_registrationfrom +current.
-
+
-
+
-
+
Let event be a new
+Event. -
+
Initialize event with
+type+"onlocation". -
+
Dispatch event to element.
+
2.3. geolocation element rendering
+ The geolocation element is a non-devolvable widget and is chiefly
+rendered like a button. The button label is largely expected to be
+determined by the browser, rather than the page, and reflects its function of given
+access to Geolocation functionality. The element may also convey information about
+the current permission state of the "geolocation" powerful feature.
The page can influence the permission elements' styling, but with
+constraints to prevent abuse (e.g. minimum and maximum sizes for fonts and
+the label itself). These are described in § 3.4 Styling, and Styling Restrictions.
+The page can also select a locale for the text via the lang attribute.
The permission elements support fallback content, which will be +displayed by any browser not yet supporting that element. Note that +there are also conditions under which a browser that supports +a respective permission element falls back to its fallback content.
+3. Mixins and Infrastructure
+This section defines several mixins and supporting algorithms.
+3.1. Activation Blockers
+To support a meaningful user intent signal and to conditionally block element
+activation, you can use the ActivationBlockersMixin
-
+
- Content attributes: +
isValid— query whether the element can currently be activated. +invalidReason— return a string representation of why the element currently cannot be activated. +onvalidationstatuschange— notifies when the validation status changes. +- DOM interface: +
-
+
+interface mixin { +ActivationBlockersMixin readonly attribute boolean isValid ; +readonly attribute ActivationBlockersMixinBlockerReason invalidReason ; +attribute EventHandler ; +}; +onvalidationstatuschange
The isValid attribute reflects whether the
+element is currently blocked.
The invalidReason attribute is an
+enumerated attribute that informs the caller of the reason why activation
+is currently blocked. If there are multiple reasons, it picks one.
+Its value set is ActivationBlockersMixinBlockerReason.
The following are the event handler (and their corresponding event handler event type) that
+must be supported on elements that include the ActivationBlockersMixin:
| onvalidationstatuschange + | Event + |
|---|
The ActivationBlockersMixin attributes +are:
+-
+
- + +
- + +
- + +
3.1.1. Internal state
+ActivationBlockersMixin elements have the following internal slots:
-
+
-
+
The
+[[BlockerList]]is a +list of records, containing a +blocker timestamp and a +blocker reason. The blocker reason is aActivationBlockersMixinBlockerReason, but not the empty string. -
+
+[[LastNotifiedValidState]]+is a boolean that stores the most recently notified state of +isValid. -
+
+[[LastNotifiedInvalidReason]]+is a string that stores the most recently notified state of +invalidReason. +[[LastNotifiedValidState]]and[[LastNotifiedInvalidReason]]are +used to determine whether an +onvalidationstatuschangeevent needs to be +dispatches. -
+
+[[IntersectionObserver]]+is a reference to anIntersectionObserver. -
+
+[[IntersectionRect]]is a +DOMRectReadOnlythat stores the most recently seen intersection, i.e. +the position of the element relative to the viewport.
3.1.2. Action Blockers, Blocker Reasons, and Blocker Lifetimes
+The key goal of the elements in this specification is to reflect a user’s +conscious choice, and we need to make sure the user cannot easily be tricked +into activating it. To do so, we maintain a list of blocker reasons, which may - +permanently or temporarily - prevent the element from being activated.
+Conceptually, a blocker reason is just an arbitrary string identifier. We
+provide an enumeration of its value set. It’s expected that not all users
+of the ActivationBlockersMixin will support all reasons.
+enum { +ActivationBlockersMixinBlockerReason , // No blocker reason. +"" ,"illegal_subframe" , +"unsuccesful_registration" ,"recently_attached" , +"intersection_changed" , +"intersection_out_of_viewport_or_clipped" ,"intersection_occluded_or_distorted" , +"style_invalid" , +}; +"type_invalid"
These blockers come with three lifetimes: Permanent, temporary, and expiring.
+-
+
- Permanent blocker +
-
+
Once an element has a permanent blocker, it will be disabled permanently. +There are used for issues that the website owner is expected to fix. +An example is an element inside a
+fencedframe. - Temporary blocker +
-
+
This is a blocker that will only be valid until the blocking condition no +no longer occurs. An example is an element that is not +currently in view. All temporary blockers turn into +expiring blockers once the condition no longer applies.
+ - Expiring blocker +
-
+
This is a blocker that is only valid for a fixed period of time. This is +used to block abuse scenarios like "click jacking". An example is +an element that has recently been moved.
+
| Blocker name + + | Blocker type + + | Example condition + + | Order hint + + |
|---|---|---|---|
type_invalid
+
+ | permanent + + | When an unsupported permission type has been + set. + + | 1 + + |
illegal_subframe
+
+ | permanent + + | When the element is used inside a fencedframe.
+
+ | 2 + + |
unsuccesful_registration
+
+ | temporary + + | When too many other elements for the same + powerful feature have been inserted into the same document. + + | 3 + + |
recently_attached
+
+ | expiring + + | When the element has just been attached to the + DOM. + + | 4 + + |
intersection_changed
+
+ | expiring + + | When the element is being moved. + + | 6 + + |
intersection_out_of_viewport_or_clipped
+
+ | temporary + + | When the element is not or not fully in the viewport. + + | 7 + + |
intersection_occluded_or_distorted
+
+ | temporary + + | When the element is fully in the viewport, + but still not fully visible (e.g. because it’s partly behind other content). + + | 8 + + |
style_invalid
+
+ | temporary + + | + | 9 + + |
3.1.3. Algorithms
+ActivationBlockersMixinBlockerReason reason and an optional flag expires:
+
+
+ -
+
-
+
Assert: reason is not
+"". +(The empty string inActivationBlockersMixinBlockerReasonsignals no blocker +is present. Why would you add a non-blocking empty string blocker?) -
+
Let timestamp be None.
+ -
+
If expires, then let timestamp be current high resolution time +plus the blocker delay.
+ -
+
Append an entry to the internal
+[[BlockerList]]+with reason and timestamp.
ActivationBlockersMixinBlockerReason reason:
+
+
+ -
+
-
+
Assert: reason is listed as "expiring" in the blocker reason table.
+ -
+
Add a blocker with reason and true.
+
ActivationBlockersMixinBlockerReason reason:
+
+
+ -
+
-
+
Assert: reason is listed as "temporary" in the blocker reason table.
+ -
+
Add a blocker with reason and false.
+
ActivationBlockersMixinBlockerReason reason:
+
+
+ -
+
-
+
Assert: reason is listed as "permanent" in the blocker reason table.
+ -
+
Add a blocker with reason and false.
+
ActivationBlockersMixinBlockerReason reason from an element:
+
+
+ -
+
-
+
Assert: reason is listed as "temporary" in the +blocker reason table.
+ -
+
For each entry in element’s
+[[BlockerList]]:-
+
-
+
If entry’s reason equals reason, then remove +entry from element’s
+[[BlockerList]].
-
+
-
+
Add a blocker with reason and true.
+
ActivationBlockersMixin element’s
+blocker:
+
+
+ -
+
-
+
Let blockers be the result of sorting element’s
+[[BlockerList]]+with the blocker ordering algorithm. -
+
If blockers is not empty and blockers[0] is blocking, then return blockers[0].
+ -
+
Return nothing.
+
-
+
-
+
Let really large number be 99.
+ -
+
Assert: No order hint in the blocker reason table is equal to or +greater than really large number.
+ -
+
If a is blocking, then let a hint be the +order hint of a’s reason in the +blocker reason table, otherwise let a hint be really large number.
+ -
+
If b is blocking, then let b hint be the +order hint of b’s reason in the +blocker reason table, otherwise let b hint be really large number.
+ -
+
Return whether a hint is less than or equal to b hint.
+
ActivationBlockersMixin’s blocker list’s entry is
+blocking if:
+
+
+ -
+
-
+
entry has no blocker timestamp,
+ -
+
or entry has a blocker timestamp, and the blocker timestamp is +greater or equal to the current high resolution time.
+
NOTE: The spec maintains blockers as a list [[BlockerList]], which may
+ potentially grow indefinitely (since some blocker types simply expire,
+ but are not removed).
+ This structure is chosen for the simplicity of explanation, rather than for
+ efficiency. The details of this blocker structure are not observable except
+ for a handful of algorithms defined here, which should open plenty of
+ opportunities for implementations to handle this more efficiently.
ActivationBlockersMixin element’s isValid getter steps are:
+
+
+ -
+
-
+
Return whether element’s blocker is Nothing.
+
ActivationBlockersMixin element’s invalidReason getter steps are:
+
+
+
+ -
+
-
+
Let oldState be
+[[LastNotifiedValidState]]. -
+
Let newState be whether element’s blocker is Nothing.
+ -
+
Set
+[[LastNotifiedValidState]]to newState. -
+
Let oldReason be
+[[LastNotifiedInvalidReason]]. -
+
Let newReason be whether element’s +
+invalidReason. -
+
Set
+[[LastNotifiedInvalidReason]]to newReason. -
+
If oldState != newState or oldReason != newReason, then:
+-
+
-
+
Let event be a new
+Event. -
+
Initialize event with +type +"
+onvalidationstatuschange", +bubbles +true, and +cancelable +true. -
+
Dispatch event to element.
+
-
+
ActivationBlockersMixin’s IntersectionObserver callback implements IntersectionObserverCallback and runs the following steps:
+
+
+ -
+
-
+
Assert: The
+IntersectionObserver’sroot+is the document -
+
Let entries be the value of the first callback parameter, the +list of
+intersection observer entries. - + +
-
+
Let entry be entries’s last item.
+ -
+
If entry.
+ +isVisible, then: -
+
Otherwise:
+-
+
-
+
If entry.
+intersectionRatio>= 1, then:-
+
-
+
Let reason be
+intersection_occluded_or_distorted.
-
+
-
+
Otherwise:
+-
+
-
+
Let reason be
+intersection_out_of_viewport_or_clipped.
-
+
-
+
Add a temporary blocker with reason.
+
-
+
-
+
If
+[[IntersectionRect]]does not equal +entry.intersectionRectthen +add an expiring blocker with +intersection_changed. -
+
Set
+[[IntersectionRect]]to +entry.intersectionRect - + +
3.2. Powerful Features, aka Permissions
+To support elements that gate access to powerful features, you can use the
+PermissionsMixin.
-
+
- DOM interface: +
-
+
+interface mixin { +PermissionsMixin readonly attribute PermissionState initialPermissionStatus ; +readonly attribute PermissionState permissionStatus ; +attribute EventHandler ; +onpromptaction attribute EventHandler ; +}; +onpromptdismiss
The following are the event handlers (and their corresponding event handler event types) that must be supported on elements that include the PermissionsMixin:
| onpromptaction + | Event + |
|---|---|
| onpromptdismiss + | Event + |
The PermissionsMixin attributes are:
+-
+
- + +
- + +
- + +
- + +
3.2.1. Internal state
+The PermissionsMixin represents capabilities gated by user-requestable
+permissions, which the user can activate to allow the site to start accessing them.
+It is core to the these elements that such requests are
+triggered by the user, and not by the page’s script. To enforce
+this, the element checks whether the activation event is trusted. Additionally it watches a number of conditions, like whether the element is
+(partially) occluded, or if it has recently been moved. The element maintains
+an internal [[BlockerList]] to keep track of this.
PermissionsMixin elements have the following internal slots:
-
+
-
+
+[[Features]]is null +or an ordered set of powerful features. For most permission +elements this is likely a fixed set, while for some this may be variable. +Making it an internal slot allows us to write algorithms that work for all +of them. -
+
+[[InitialPermissionStatus]]+is aPermissionStatethat stores the initialPermissionStatefor +[[Features]].
3.2.2. Algorithms
+PermissionsMixin’s initialization steps are:
+
+
+ -
+
-
+
Assert: The internal
+[[Features]]slot has been +initialized. The including element must define and initialize this. -
+
Initialize the internal
+[[InitialPermissionStatus]]to +the result of get the current permission state.
PermissionsMixin’s insertion steps are:
+
+
+ -
+
-
+
If
+[[Features]]is empty or is null, +then add a permanent blocker +with reasontype_invalid.
PermissionsMixin element’s
+initialPermissionStatus
+getter steps are:
+
+
+ -
+
-
+
Return element’s internal
+[[InitialPermissionStatus]].
PermissionsMixin element’s
+permissionStatus
+getter steps are:
+
+
+ -
+
-
+
Return get the current permission state for +element.
+
PermissionsMixin element:
+
+
+ -
+
-
+
Let features be element’s internal
+[[Features]]. - + +
-
+
Let current be "
+granted". -
+
For each feature of features:
+-
+
-
+
Let state be the result of get the current permission state for +feature.
+ -
+
Let current be the smaller of current and state, assuming the +following ordering:
+
+"granted" > +"prompt" > +"denied".
-
+
-
+
Return current.
+
It’s not clear what the PermissionState for 'no valid permission type' + should be. Here I pick "prompt" based on Chrome’s implementation; but that + choice is arbitrary.
+-
+
-
+
Let event be a new
+Event. -
+
Initialize event with +type +"
+onpromptaction", +bubbles +true, and +cancelable +true. -
+
Dispatch event to element.
+
-
+
-
+
Let event be a new
+Event. -
+
Initialize event with +type +"
+onpromptdismiss", +bubbles +true, and +cancelable +true. -
+
Dispatch event to element.
+
The [Permissions] specification assumes a descriptor describes a
+single permission without parameters (like an equivalent of
+enableHighAccuracy). Here, we assume a permissions model
+that is more expressive. This needs to be resolved -- likely upstream,
+in [Permissions], plus adaptions here.
-
+
-
+
Let result be a new
+PermissionDescriptor. -
+
Fill in result, by including the powerful feature names contained in +element’s
+[[Features]]. -
+
Return result.
+
3.2.3. Presentation
+There isn’t much precedence for describing the user agent UI in detail. + It may be better to leave more freedom to user agents.
+An element using the PermissionsMixin contains browser-chosen content, text and maybe an
+icon. Activating them will often prompt the user to choose.
+This provides two bits of user interface that a user can interact with.
+The user agent is largely free to determine these — rendering of the
+element and the subsequent permission
+prompt — in whichever way it thinks best convey’s the element’s intent.
UI options for the elements' presentation include:
+-
+
-
+
Name the powerful features listed in
+[[Features]], in the language +indicated by the language of the element. Note that this would +always be the language indicated by thelangattribute, +if present. -
+
An icon indicating the powerful feature type or types.
+ -
+
The current permission state of the powerful feature in questions. +For example, if the permission is already +
+granted, the element might be labeled +as "geolocation already in use". -
+
A modal prompt with a "scrim". +(I.e., darkening out the page behind the prompt.) +This would normally quite disruptive. But here our goal is to ensure a +user means to make this choice.
+
User agents are encouraged to name or describe the powerful features +in a way that’s consistent with similar usage in program or the platform it +is running on.
+Very non-normative examples might be:
+-
+
-
+
+<geolocation lang=de>: "Standort verwenden". -
+
+<geolocation watch=true>(in an English language page): "⌖ Track location.". -
+
Upon activiating
+<geolocation>, when the corresponding +permission state isdenied, modify the text to +"Continue blocking".
3.3. Falling Back
+A user agent that does not support a particular element would
+recognize them as HTMLUnknownElement and render their children as
+regular HTML.
+User agents that support such an element should usually
+render the element as described in § 3.4 Styling, and Styling Restrictions, but are still
+required to render the fallback content under one condition:
If the internal [[BlockerList]] contains a record whose
+blocker reason is type_invalid,
+then the element should render the fallback content
+instead of its usual rendering.
3.4. Styling, and Styling Restrictions
+Permission elements constrain the styling that can be applied to them. +These constraints come in three flavours:
+-
+
-
+
If the condition isn’t met, the element is deactivated.
+ -
+
A user-agent defined stylesheet enforces certain styling.
+ -
+
The user-agent enforces bounds on additional styles, where the bounds +cannot be easily expressed in CSS. For example, if the style bounds are +expressed relative to the computed style of the element.
+
3.4.1. Conditions that Deactivate the Element
+If one of these conditions is not met, then a
+temporary blocker is added with type
+style_invalid.
| 'color', 'background-color' + |
+Set by default to the user agent’s default button colors.
+The contrast ratio between the 2 colors needs to be at least 3.
+Alpha has to be 1.
+
+ |
|---|---|
| 'font-size' + |
+
+If specified value is expressed as <relative-size>:
+
+
|
3.4.2. User-Agent Defined Stylesheet
+A permission element is expected to render with the following styles:
++@namespace "http://www.w3.org/1999/xhtml" ; +geolocation{ +opacity : 1.0 ; +line-height : normal !important; +whitespace : nowrap !important; +user-select : none !important; +appearance : auto !important; +box-sizing : content-box !important; +vertical-align : middle !important; +text-emphasis : initial !important; +text-shadow : initial !important; +} +
3.4.3. Additional User-Agent Defined Style Bounds
+ +Permission elements define several bounds on styles. For example, we want +the font size are constraints on the The style bounds are explained below. + + +For notational convenience, we imagine that the computed value of an element
+could be accessed in CSS rules with computed, just like the
+inherited value of an element can via the inherit keyword.
+Then the following sheet expresses the style bounds:
+@namespace "http://www.w3.org/1999/xhtml" ; +geolocation{ +outline-offset : clamp ( 0 , computed, none); /* No negative outline-offsets. */ + font-weight:clamp ( 200 , computed, none); /* No font-weights below 200. */ + word-spacing:clamp ( 0 , computed, 0.5 em ); /* Word-spacing between 0..0.5em */ + letter-spacing:clamp ( -0.05 em , commputed, 0.2 em ); /* Letter spacing between -0.05..0.2em */ + + min-height:clamp ( 1 em , computed, none); +max-height : clamp ( none, computed, 3 em ); +min-width : clamp ( none, computed, calc ( fit-content)); + +border-width : clamp ( none, computed, 1 em ); + +font-style : if ( computed ="normal" or computed ="italic" , computed, "normal" ); +display : if( computed ="inline-block" or computed ="none" , computed, "inline-block" ); +cursor : if( computed ="pointer" or computed ="not-allowed" , computed, "pointer" ) +} +
Additionally, some rules apply based on conditions not easily expressible as +CSS.
+If height is auto, then apply:
+@namespace "http://www.w3.org/1999/xhtml" ; +geolocation{ +padding-top : clamp ( 1 em , computed, none); +padding-bottom : calc ( padding-top); +} +
If width is auto, then apply:
+@namespace "http://www.w3.org/1999/xhtml" ; +geolocation{ +padding-left : clamp ( none, computed, 5 em ); +padding-right : calc ( padding-left); +} +
Apply the following sheet, if the element does not have all of the following:
+-
+
-
+
A border width of at least
+1px, -
+
a color to background-color contrast ratio of at least 3,
+ -
+
and alpha of 1.
+
+@namespace "http://www.w3.org/1999/xhtml" ; +geolocation{ +max-width : clamp ( none, computed, calc ( 3 * fit-content)); +} +
The following CSS properties can be used normally:
+-
+
- + +
- + +
- + +
- + +
- + +
- + +
- + +
- + +
- + +
- + +
- + +
- + +
-
+
border and all +border shorthand properties, +border-top, border-right, border-bottom, border-left
+ - + +
- + +
- + +
- + +
- + +
- + +
- + +
-
+
flex and its longhands, flex-grow, flex-shrink, flex-basis
+ - + +
- + +
- + +
- + +
- + +
- + +
- + +
-
+
outline and mostly its longhands, +outline-color and outline-style. +
+
Note that outline-offset is clamped by the rules above. - + +
-
+
overscroll-behavior and its +longhands, +overscroll-behavior-inline, overscroll-behavior-block, +overscroll-behavior-x, overscroll-behavior-y
+ - + +
- + +
- + +
- + +
-
+
scroll-margin and its longhands, +scroll-margin-top, scroll-margin-right, scroll-marginbottom', +scroll-margin-left
+ -
+
scroll-padding and its longhands, +scroll-padding-top, scroll-padding-right, scroll-padding-bottom, +scroll-padding-left, scroll-padding-inline-start, +scroll-padding-block-start, scroll-padding-block-start, +scroll-padding-inline-end, scroll-padding-block-end
+ - + +
- + +
- + +
- + +
- + +
- + +
- + +
- + +
- + +
- + +
- + +
Properties that are not listed above, or in the rules in this section, +and aren’t logically equivalent to one of the properties mentioned here, +will be ignored.
+4. Security & Privacy Considerations
+Note: Security & Privacy Considerations can be found +here & +there, +in the Explainer. +This section will eventually contain a specification-worthy transcription +of those Explainer sections.
+