1. Introduction
Hardware that enables Virtual Reality (VR) and Augmented Reality (AR) applications are now broadly available to consumers, offering an immersive computing platform with both new opportunities and challenges. The ability to interact directly with immersive hardware is critical to ensuring that the web is well equipped to operate as a first-class citizen in this environment.
Immersive computing introduces strict requirements for high-precision, low-latency communication in order to deliver an acceptable experience. It also brings unique security concerns for a platform like the web. The WebXR Device API provides the interfaces necessary to enable developers to build compelling, comfortable, and safe immersive applications on the web across a wide variety of hardware form factors.
Other
web
interfaces,
such
as
the
RelativeOrientationSensor
and
AbsoluteOrientationSensor
,
can
be
repurposed
to
surface
input
from
some
devices
to
polyfill
the
WebXR
Device
API
in
limited
situations.
These
interfaces
cannot
support
multiple
features
of
high-end
immersive
experiences,
however,
such
as
6DoF
tracking,
presentation
to
headset
peripherals,
or
tracked
input
devices.
1.1. Terminology
This document uses the acronym XR throughout to refer to the spectrum of hardware, applications, and techniques used for Virtual Reality, Augmented Reality, and other related technologies. Examples include, but are not limited to:
-
Head-mounted displays, whether they are opaque, transparent, or utilize video passthrough
-
Mobile devices with positional tracking
-
Fixed displays with head tracking capabilities
The important commonality between them being that they offer some degree of spatial tracking with which to simulate a view of virtual content.
Terms like "XR device", "XR Application", etc. are generally understood to apply to any of the above. Portions of this document that only apply to a subset of these devices will indicate so as appropriate.
The terms 3DoF and 6DoF are used throughout this document to describe the tracking capabilities of XR devices .
-
A 3DoF device, short for "Three Degrees of Freedom", is one that can only track rotational movement. This is common in devices which rely exclusively on accelerometer and gyroscope readings to provide tracking. 3DoF devices do not respond translational movements from the user, though they may employ algorithms to estimate translational changes based on modeling of the neck or arms.
-
A 6DoF device, short for "Six Degrees of Freedom", is one that can track both rotation and translation, enabling for precise 1:1 tracking in space. This typically requires some level of understanding of the user’s environment. That environmental understanding may be achieved via inside-out tracking, where sensors on the tracked device itself (such as cameras or depth sensors) are used to determine the device’s position, or outside-in tracking, where external devices placed in the user’s environment (like a camera or light emitting device) provides a stable point of reference against which the XR device can determine its position.
1.2. Application flow
Most applications using the WebXR Device API will follow a similar usage pattern:
-
Query
navigator.xr.isSessionSupported()to determine if the desired type of XR content is supported by the hardware and UA. -
If so, advertise the XR content to the user.
-
Wait for the window to have transient activation . This is most commonly indicated by the user clicking a button on the page indicating they want to begin viewing XR content.
-
Request an
XRSessionwithin the user activation event withnavigator.xr.requestSession(). -
If the
XRSessionrequest succeeds, use it to run a frame loop to respond to XR input and produce images to display on the XR device in response. -
Continue running the frame loop until the session is shut down by the UA or the user indicates they want to exit the XR content.
2. Model
2.1. XR device
An XR device is a physical unit of hardware that can present imagery to the user. On desktop clients, this is usually a headset peripheral. On mobile clients, it may represent the mobile device itself in conjunction with a viewer harness. It may also represent devices without stereo-presentation capabilities but with more advanced tracking.
An
XR
device
has
a
list
of
supported
modes
(a
list
of
strings
)
that
contains
the
enumeration
values
of
XRSessionMode
that
the
XR
device
supports.
Each
XR
device
has
a
list
of
enabled
features
for
each
XRSessionMode
in
its
list
of
supported
modes
,
which
is
a
list
of
feature
descriptors
which
MUST
be
initially
an
empty
list
.
The user-agent has a list of immersive XR devices (a list of XR device ), which MUST be initially an empty list .
The
user-agent
has
an
immersive
XR
device
(
null
or
XR
device
)
which
is
initially
null
and
represents
the
active
XR
device
from
the
list
of
immersive
XR
devices
.
This
object
MAY
live
on
a
separate
thread
and
be
updated
asynchronously.
The
user-agent
MUST
have
a
default
inline
XR
device
,
which
is
an
XR
device
that
MUST
contain
"inline"
in
its
list
of
supported
modes
.
The
default
inline
XR
device
MUST
NOT
report
any
pose
information,
and
MUST
NOT
report
XR
input
source
s
or
events
other
than
those
created
by
pointer
events.
Note: The default inline XR device exists purely as a convenience for developers, allowing them to use the same rendering and input logic for both inline and immersive content. The default inline XR device does not expose any information not already available to the developer through other mechanisms on the page (such as pointer events for input), it only surfaces those values in an XR-centric format.
The
user-agent
MUST
have
a
inline
XR
device
,
which
is
an
XR
device
that
MUST
contain
"inline"
in
its
list
of
supported
modes
.
The
inline
XR
device
MAY
be
the
immersive
XR
device
if
the
tracking
it
provides
makes
sense
to
expose
to
inline
content
or
the
default
inline
XR
device
otherwise.
Note: On phones, the inline XR device may report pose information derived from the phone’s internal sensors, such as the gyroscope and accelerometer. On desktops and laptops without similar sensors, the inline XR device will not be able to report a pose, and as such should fall back to the default inline XR device . In case the user agent is already running on an XR device , the inline XR device will be the same device, and may support multiple views . User consent must be given before any tracking or input features beyond what the default inline XR device exposes are provided.
The current values of list of immersive XR devices , inline XR device , and immersive XR device MAY live on a separate thread and be updated asynchronously. These objects SHOULD NOT be directly accessed in steps that are not running in parallel .
3. Initialization
3.1. navigator.xr
In only one current engine.
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile None
partial interface Navigator { [SecureContext ,SameObject ]readonly attribute XRSystem xr ; };
The
xr
attribute’s
getter
MUST
return
the
XRSystem
object
that
is
associated
with
it.
3.2. XRSystem
In no current engines.
Opera None Edge None
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android None Android WebView None Samsung Internet None Opera Mobile None
[SecureContext ,Exposed =Window ]interface :XRSystem EventTarget { // MethodsPromise <boolean >isSessionSupported (XRSessionMode ); [mode NewObject ]Promise <XRSession >requestSession (XRSessionMode ,mode optional XRSessionInit = {}); // Eventsoptions attribute EventHandler ondevicechange ; };
The
user
agent
MUST
create
an
XRSystem
object
when
a
Navigator
object
is
created
and
associate
it
with
that
object.
An
XRSystem
object
is
the
entry
point
to
the
API,
used
to
query
for
XR
features
available
to
the
user
agent
and
initiate
communication
with
XR
hardware
via
the
creation
of
XRSession
s.
The user agent MUST be able to enumerate immersive XR devices attached to the system, at which time each available device is placed in the list of immersive XR devices . Subsequent algorithms requesting enumeration MUST reuse the cached list of immersive XR devices . Enumerating the devices should not initialize device tracking . After the first enumeration the user agent MUST begin monitoring device connection and disconnection, adding connected devices to the list of immersive XR devices and removing disconnected devices.
Each time the list of immersive XR devices changes the user agent should select an immersive XR device by running the following steps:
-
Let oldDevice be the immersive XR device .
-
If the list of immersive XR devices is an empty list , set the immersive XR device to
null. -
If the list of immersive XR devices 's size is one, set the immersive XR device to the list of immersive XR devices [0].
-
Set the immersive XR device as follows:
-
If
there
are
any
active
XRSessions and the list of immersive XR devices contains oldDevice : -
Set the immersive XR device to oldDevice .
- Otherwise:
-
Set the immersive XR device to a device of the user agent’s choosing.
-
If
there
are
any
active
-
The user agent MAY update the inline XR device to the immersive XR device if appropriate, or the default inline XR device otherwise.
-
If this is the first time devices have been enumerated or oldDevice equals the immersive XR device , abort these steps.
-
Queue a task to set the XR compatible boolean of all
WebGLRenderingContextBaseinstances tofalse. -
Queue a task to fire an event named
devicechangeon the context object 'snavigator'sxr. -
Queue a task to fire appropriate
changeevents on anyXRPermissionStatusobjects who are affected by the change in the immersive XR device or inline XR device .
Note: These steps should always be run in parallel .
Note: The user agent is allowed to use any criteria it wishes to select an immersive XR device when the list of immersive XR devices contains multiple devices. For example, the user agent may always select the first item in the list, or provide settings UI that allows users to manage device priority. Ideally the algorithm used to select the default device is stable and will result in the same device being selected across multiple browsing sessions.
The user agent can ensure an immersive XR device is selected by running the following steps:
-
If immersive XR device is not
null, return immersive XR device and abort these steps. -
Return the immersive XR device .
Note: These steps should always be run in parallel .
In only one current engine.
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile None
The
ondevicechange
attribute
is
an
Event
handler
IDL
attribute
for
the
devicechange
event
type.
In only one current engine.
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile None
isSessionSupported(
mode
)
method
queries
if
a
given
mode
may
be
supported
by
the
user
agent
and
device
capabilities.
When this method is invoked, it MUST run the following steps:
-
Let promise be a new Promise in the relevant realm of this
XRSystem. -
If mode is
"inline", resolve promise withtrueand return it. -
If the requesting document’s origin is not allowed to use the "xr-spatial-tracking" permissions policy , reject promise with a "
SecurityError"DOMExceptionand return it. -
Check whether the session mode is supported as follows:
- If the user agent and system are known to never support mode sessions
Resolve promise with
false.- If the user agent and system are is known to usually support mode sessions
promise MAY be resolved with
trueprovided that all instances of this user agent indistinguishable by user-agent string produce the same result here.- Otherwise
Run the following steps in parallel :
-
Let device be the result of ensuring an immersive XR device is selected .
-
If device is
null ,null, resolve promise withfalseand abort these steps. -
If device ’s list of supported modes does not contain mode , queue a task to resolve promise with
falseand abort these steps. -
request permission to use the powerful feature
"xr-session-supported"withXRSessionSupportedPermissionDescriptorwithmodeequal to mode . If it returns"denied"queue a task to resolve promise withfalseand abort these steps. queue a task to resolve promise with
true.
-
-
Return promise .
Note:
The
purpose
of
isSessionSupported()
is
not
to
report
with
perfect
accuracy
the
user
agent’s
ability
to
create
an
XRSession
,
but
to
inform
the
page
whether
or
not
advertising
the
ability
to
create
sessions
of
the
given
mode
is
advised.
A
certain
level
of
false-positives
are
expected,
even
when
user
agent
checks
for
the
presence
of
the
necessary
hardware/software
prior
to
resolving
the
method.
(For
example,
even
if
the
appropriate
hardware
is
present
it
may
have
given
exclusive
access
to
another
application
at
the
time
a
session
is
requested.)
It
is
expected
that
most
pages
with
XR
content
will
call
early
in
the
document
lifecycle.
As
such,
calling
Because
isSessionSupported()
isSessionSupported()
SHOULD
avoid
displaying
any
modal
or
otherwise
intrusive
UI.
Calling
isSessionSupported()
MUST
NOT
trigger
device-selection
UI,
MUST
NOT
interfere
with
any
running
XR
applications
on
the
system,
and
MUST
NOT
cause
XR-related
applications
to
launch
such
as
system
trays
or
storefronts.
immersive-vr
sessions
are
supported.
const supported= await navigator. xr. isSessionSupported( 'immersive-vr' ); if ( supported) { // 'immersive-vr' sessions may be supported. // Page should advertise support to the user. } else { // 'immersive-vr' sessions are not supported. }
3.2.1. Fingerprinting considerations
Because
isSessionSupported()
can
be
called
without
user
activation
and
without
triggering
any
consent
dialogs,
it
may
be
used
as
a
fingerprinting
vector
despite
the
limited
amount
of
information
it
reports.
"xr-session-supported"
powerful
feature
gates
access
to
the
isSessionSupported()
API
in
cases
where
there
are
fingerprinting
concerns.
The
"xr-session-supported"
’s
permission-related
algorithms
and
types
are
defined
as
follows:
- permission descriptor type
WebGLRenderingContext/makeXRCompatible
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneXRReferenceSpace/getOffsetReferenceSpace
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneXRSession/requestReferenceSpace
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile Nonedictionary :XRSessionSupportedPermissionDescriptor PermissionDescriptor {XRSessionMode ; };mode nameforXRPermissionDescriptoris"xr-session-supported"."xr-session-supported"may be granted automatically for some systems based on the criteria below.A set of user agents is indistinguishable by user-agent string if they all report the same
userAgentandappVersion. Such classes are typically identified by the browser version and platform/device being run on, but cannot be distinguished by the status of any connected external device. We can use the concept of user agents that are indistinguishable by user-agent string to properly assess fingerprinting risk.Some user agents indistinguishable by user-agent string will never support sessions of a given
XRSessionMode. For example: User agents running on a model of phone thatwishis known tominimize allnot meet requirements for mobile AR support. In these cases there is little fingerprinting risk inisSessionSupported()always reporting theXRSessionModeis not supported because every such device will consistently report the same value and it’s assumed that device type and model can be inferred in other ways, such as throughuserAgent. Thus, on such systems, the user-agent SHOULD automatically deny"xr-session-supported"for the relevantXRSessionMode.Other user agents will indistinguishable by user-agent string usually support sessions of a given
XRSessionMode. For example: User agents known to support WebXR that run exclusively within VR headsets are likely to support"immersive-vr"sessions unless specifically blocked by the user. In these cases reporting that theXRSessionModeis not supported, whilestill enablingaccurate, would offer more uniquely identifying information about the user. As such reporting that theXRSessionModeis always available and allowingrequestSession()to fail is more privacy-preserving while likely not being a source of confusion for the user. On such systems, the user-agent SHOULD automatically grant"xr-session-supported"for the relevantXRSessionMode.User agents indistinguishable by user-agent string for which availability of XR
content may wishcapabilities is highly variable, such as desktop systems which support XR peripherals, present the highest fingerprinting risk. User agents on such devices SHOULD NOT automatically grant"xr-session-supported"in a way that allows theisSessionSupported()API tohaveprovide additional fingerprinting bits.Note: Some acceptable approaches to handle such cases are as follows:Always judging explicit consent for
"xr-session-supported"(with a potentially cached permissions prompt or similar) whenisSessionSupported()is called.Automatically granting
"xr-session-supported"but havingisSessionSupported()always reporttrueforeven on platforms which do not consistently haveany possibility of running the specified mode ofXRcontent,capabilities available, regardless of whether or not the appropriate hardware or software is present. This comes at the cost of user ergonomics, as it will cause pages to advertise XR content to users that cannot view it.-
Have
isSessionSupported()request explicit consent for"xr-session-supported"when the appropriate hardware is present, and when such hardware is _not_ present, returnfalseafter an appropriately random length of time. In such an implementation content must not be able to distinguish between cases where the user agent was not connected to XR hardware and cases where the user agent was connected to XR hardware but the user declined to provide explicit consent .
Whatever the technique chosen, it MUST NOT reveal additional knowledge about connected XR hardware without explicit consent .
The
XRSystemobject has a pending immersive session boolean, which MUST be initiallyfalse, an active immersive session , which MUST be initiallynull, and a list of inline sessions , which MUST be initially empty.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
requestSession( mode , options )method attempts to initialize anXRSessionfor the given mode if possible, entering immersive mode if necessary.When this method is invoked, the user agent MUST run the following steps:
-
Let promise be a new Promise in the relevant realm of this
XRSystem. -
Let immersive be
trueif mode is an immersive session mode, andfalseotherwise. -
Let global object be the relevant Global object for the
XRSystemon which this method was invoked. -
Check whether the session request is allowed as follows:
-
If
immersive
is
true: -
-
Check if an immersive session request is allowed for the global object , and if not reject promise with a "
SecurityError"DOMExceptionand return promise . -
If pending immersive session is
trueor active immersive session is notnull, reject promise with an "InvalidStateError"DOMExceptionand return promise . -
Set pending immersive session to
true.
-
- Otherwise:
-
Check if an inline session request is allowed for the global object , and if not reject promise with a "
SecurityError"DOMExceptionand return promise .
-
If
immersive
is
-
Run the following steps in parallel :
-
Let requiredFeatures be options ’
requiredFeatures. -
Let optionalFeatures be options ’
optionalFeatures. -
Set device to the result of obtaining the current device for mode , requiredFeatures , and optionalFeatures .
-
Queue a task to perform the following steps:
-
If device is
nullor device ’s list of supported modes does not contain mode , run the following steps:-
Reject promise with a "
NotSupportedError"DOMException. -
If immersive is
true, set pending immersive session tofalse. -
Abort these steps.
-
-
Let descriptor be an
XRPermissionDescriptorinitialized with mode , requiredFeatures , and optionalFeatures -
Let status be an
XRPermissionStatus, initiallynull -
Request the xr permission with descriptor and status .
-
If status ’
stateis"denied"run the following steps:-
Reject promise with a "
NotSupportedError"DOMException. -
If immersive is
true, set pending immersive session tofalse. -
Abort these steps.
-
-
Let session be a new
XRSessionobject in the relevant realm of thisXRSystem. -
Initialize the session with session , mode , and device .
-
Potentially set the active immersive session as follows:
-
If
immersive
is
true: -
Set the active immersive session to session , and set pending immersive session to
false. - Otherwise:
-
Append session to the list of inline sessions .
-
If
immersive
is
-
Resolve promise with session .
-
Queue a task to perform the following steps:
Note: These steps ensure that initialinputsourceschangeevents occur after the initial session is resolved.-
Set session ’s promise resolved flag to
true. -
Let sources be any existing input sources attached to session .
-
If sources is non-empty, perform the following steps:
-
Set session ’s list of active XR input sources to sources .
-
Fire an
XRInputSourcesChangeEventnamedinputsourceschangeon session withaddedset to sources .
-
-
-
-
-
Return promise .
To obtain the current device for an
XRSessionModemode , requiredFeatures , and optionalFeatures the user agent MUST run the following steps:-
Choose device as follows:
- If mode is an immersive session mode:
-
Set device to the result of ensuring an immersive XR device is selected .
- Else if requiredFeatures or optionalFeatures are not empty:
-
Set device to the inline XR device .
- Otherwise:
-
Set device to the default inline XR device .
-
Return device .
Note: These steps should always be run in parallel .
The following code attempts to retrieve animmersive-vrXRSession.const xrSession= await navigator. xr. requestSession( "immersive-vr" ); 3.3. XRSessionMode
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView 79+ Samsung Internet 11.2+ Opera Mobile NoneThe
XRSessionModeenum defines the modes that anXRSessioncan operate in.enum {XRSessionMode "inline" ,,"immersive-vr" ,"immersive-ar" };-
A session mode of
inlineindicates that the session’s output will be shown as an element in the HTML document.inlinesession content MUST be displayed in mono (i.e., with a single view ). It MAY allow for viewer tracking. User agents MUST allowinlinesessions to be created. -
A session mode of
immersive-vrindicates that the session’s output will be given exclusive access to the immersive XR device display and that content is not intended to be integrated with the user’s environment. -
The behavior of the
immersive-arsession mode is defined in the WebXR AR Module and MUST NOT be added to the immersive XR device 's list of supported modes unless the UA implements that module.
In this document, the term inline session is synonymous with an
inlinesession and the term immersive session refers to either animmersive-vrorimmersive-arsession.Immersive sessions MUST provide some level of viewer tracking, and content MUST be shown at the proper scale relative to the user and/or the surrounding environment. Additionally, Immersive sessions MUST be given exclusive access to the immersive XR device , meaning that while the immersive session is
"visible"the HTML document is not shown on the immersive XR device 's display, nor does content from any other source have exclusive access. Exclusive access does not prevent the user agent from overlaying its own UI, however this UI SHOULD be minimal.Note: Future specifications or modules may expand the definition of immersive session include additional session modes.
Note: Examples of ways exclusive access may be presented include stereo content displayed on a virtual reality headset.
Note: As an example of overlaid UI, the user-agent or operating system in an immersive session may show notifications over the rendered content.
Note: While the HTML document is not shown on the immersive XR device 's display during an immersive session , it may still be shown on a separate display, e.g. when the user is entering the immersive session from a 2d browser on their computer tethered to their immersive XR device .
3.4. Feature Dependencies
Some features of an
XRSessionmay not be universally available for a number of reasons, among which is the fact not all XR devices can support the full set of features. Another consideration is that some features expose sensitive information which may require a clear signal of user intent before functioning.Since it is a poor user experience to initialize the underlying XR platform and create an
XRSessiononly to immediately notify the user that the applications cannot function correctly, developers can indicate required features by passing anXRSessionInitdictionary torequestSession(). This will block the creation of theXRSessionif any of the required features are unavailable due to device limitations or in the absence of a clear signal of user intent to expose sensitive information related to the feature.Additionally, developers are encouraged to design experiences which progressively enhance their functionality when run one more capable devices. Optional features which the experience does not require but will take advantage of when available must also be indicated in an
XRSessionInitdictionary to ensure that user intent can be determined before enabling the feature if necessary.dictionary {XRSessionInit sequence <any >requiredFeatures ;sequence <any >optionalFeatures ; };The
requiredFeaturesarray contains any Required features for the experience. If any value in the list is not a recognized feature descriptor theXRSessionwill not be created. If any feature listed in therequiredFeaturesarray is not supported by the XR device or, if necessary, has not received a clear signal of user intent theXRSessionwill not be created.The
optionalFeaturesarray contains any Optional features for the experience. If any value in the list is not a recognized feature descriptor it will be ignored. Features listed in theoptionalFeaturesarray will be enabled if supported by the XR device and, if necessary, given a clear signal of user intent , but will not block creation of theXRSessionif absent.Values given in the feature lists are considered a valid feature descriptor if the value is one of the following:
-
Any
XRReferenceSpaceTypeenum value
Future iterations of this specification and additional modules may expand the list of accepted feature descriptors .
Note: Features are accepted as an array of
anyvalues to ensure forwards compatibility. It allows unrecognized optional values to be properly ignored as new feature descriptor types are added.Note: Features that can be stringified via ToString () will be converted.
Depending on the
XRSessionModerequested, certain feature descriptors are added to therequiredFeaturesoroptionalFeatureslists by default. The following table describes the default features associated with each session type and feature list:Feature Sessions List "viewer"Inline sessions and immersive sessions requiredFeatures"local"Immersive sessions requiredFeaturesThe combined list of feature descriptors given by the
requiredFeaturesandoptionalFeaturesare collectively considered the requested features for anXRSession.Some feature descriptors , when present in the requested features list, are subject to permissions policy and/or requirements that user intent to use the feature is well understood, via either explicit consent or implicit consent . The following table describes the feature requirements that must be satisfied prior to being enabled:
Feature Permissions Policy Required Consent Required "local""xr-spatial-tracking" Inline sessions require consent "local-floor""xr-spatial-tracking" Always requires consent "bounded-floor""xr-spatial-tracking" Always requires consent "unbounded""xr-spatial-tracking" Always requires consent Note:
"local"is always included in the requested features of immersive sessions as a default feature , and as such immersive sessions always need to obtain explicit consent or implicit consent .Requested features can only be enabled for a session if the XR device is capable of supporting the feature, which means that the feature is known to be supported by the XR device in some configurations, even if the current configuration has not yet been verified as supporting the feature. The user agent MAY apply more rigorous constraints if desired in order to yield a more consistent user experience.
Note: For example, several VR devices support either configuring a safe boundary for the user to move around within or skipping boundary configuration and operating in a mode where the user is expected to stand in place. Such a device can be considered to be capable of supporting
"bounded-floor"XRReferenceSpaces even if they are currently not configured with safety boundaries, because it’s expected that the user could configure the device appropriately if the experience required it. This is to allow user agents to avoid fully initializing the XR device or waiting for the user’s environment to be recognized prior to resolving the requested features if desired. If, however, the user agent knows that the boundary state at the time the session is requested without additional initialization it may choose to reject the"bounded-floor"feature if the safety boundary not already configured.4. Session
4.1. XRSession
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAny interaction with XR hardware is done via an
XRSessionobject, which can only be retrieved by callingrequestSession()on theXRSystemobject. Once a session has been successfully acquired, it can be used topoll the viewer pose, query information about the user’s environment, and present imagery to the user.The user agent, when possible, SHOULD NOT initialize device tracking or rendering capabilities until an
XRSessionhas been acquired. This is to prevent unwanted side effects of engaging the XR systems when they’re not actively being used, such as increased battery usage or related utility applications from appearing when first navigating to a page that only wants to test for the presence of XR hardware in order to advertise XR features. Not all XR platforms offer ways to detect the hardware’s presence without initializing tracking, however, so this is only a strong recommendation.enum {XRVisibilityState "visible" ,"visible-blurred" ,"hidden" , }; [SecureContext ,Exposed =Window ]interface :XRSession EventTarget { // Attributesreadonly attribute XRVisibilityState visibilityState ; [SameObject ]readonly attribute XRRenderState renderState ; [SameObject ]readonly attribute XRInputSourceArray inputSources ; // Methodsundefined updateRenderState (optional XRRenderStateInit = {}); [state NewObject ]Promise <XRReferenceSpace >requestReferenceSpace (XRReferenceSpaceType );type unsigned long requestAnimationFrame (XRFrameRequestCallback );callback undefined cancelAnimationFrame (unsigned long );handle Promise <undefined >end (); // Eventsattribute EventHandler onend ;attribute EventHandler oninputsourceschange ;attribute EventHandler onselect ;attribute EventHandler onselectstart ;attribute EventHandler onselectend ;attribute EventHandler onsqueeze ;attribute EventHandler onsqueezestart ;attribute EventHandler onsqueezeend ;attribute EventHandler onvisibilitychange ; };Each
XRSessionhas a mode , which is one of the values ofXRSessionMode.Each
XRSessionhas an animation frame , which is anXRFrameinitialized with active set tofalse, animationFrame set totrue, andsessionset to theXRSession.To initialize the session , given session , mode , and device , the user agent MUST run the following steps:
-
Set session ’s mode to mode .
-
Set session ’s XR device to device .
-
If no other features of the user agent have done so already, perform the necessary platform-specific steps to initialize the device’s tracking and rendering capabilities, including showing any necessary instructions to the user.
Note: Some devices require additional user instructions for activation. For example, going into immersive mode on a phone-based headset device requires inserting the phone into the headset, and doing so on a desktop browser connected to an external headset requires wearing the headset. It is the responsibility of the user agent — not the author — to ensure any such instructions are shown.
A number of different circumstances may shut down the session , which is permanent and irreversible. Once a session has been shut down the only way to access the XR device 's tracking or rendering capabilities again is to request a new session. Each
XRSessionhas an ended boolean, initially set tofalse, that indicates if it has been shut down.When an
XRSessionsession is shut down the following steps are run:-
Set session ’s ended value to
true. -
If the active immersive session is equal to session , set the active immersive session to
null. -
Remove session from the list of inline sessions .
-
Reject any outstanding promises returned by session with an
InvalidStateError, except for any promises returned byend(). -
If no other features of the user agent are actively using them, perform the necessary platform-specific steps to shut down the device’s tracking and rendering capabilities. This MUST include:
-
Releasing exclusive access to the XR device if session is an immersive session .
-
Deallocating any graphics resources acquired by session for presentation to the XR device .
-
Putting the XR device in a state such that a different source may be able to initiate a session with the same device if session is an immersive session .
-
-
Queue a task that fires an
XRSessionEventnamedendon session .
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
end()method provides a way to manually shut down a session. When invoked, it MUST run the following steps:-
Let promise be a new Promise in the relevant realm of this
XRSession. -
Queue a task to perform the following steps:
-
Wait until any platform-specific steps related to shutting down the session have completed.
-
Resolve promise .
-
-
Return promise .
Each
XRSessionhas an active render state which is a newXRRenderState, and a pending render state , which is anXRRenderStatewhich is initiallynull.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
renderStateattribute returns theXRSession's active render state .Each
XRSessionhas a minimum inline field of view and a maximum inline field of view , defined in radians. The values MUST be determined by the user agent and MUST fall in the range of0toPI.Each
XRSessionhas a minimum near clip plane and a maximum far clip plane , defined in meters. The values MUST be determined by the user agent and MUST be non-negative. The minimum near clip plane SHOULD be less than0.1. The maximum far clip plane SHOULD be greater than1000.0(and MAY be infinite).When the user agent will update the pending layers state with
XRSessionsession andXRRenderStateInitnewState , it must run the following steps:-
If newState ’s
layers's value is notnull, throw aNotSupportedError.
NOTE: The WebXR layers module will introduce new semantics for this algorithm.
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
updateRenderState( newState )method queues an update to the active render state to be applied on the next frame. Unset fields of theXRRenderStateInitnewState passed to this method will not be changed.When this method is invoked, the user agent MUST run the following steps:
-
Let session be this .
-
If session ’s ended value is
true, throw anInvalidStateErrorand abort these steps. -
If newState ’s
baseLayerwas created with anXRSessionother than session , throw anInvalidStateErrorand abort these steps. -
If newState ’s
inlineVerticalFieldOfViewis set and session is an immersive session , throw anInvalidStateErrorand abort these steps. -
If none of newState ’s
depthNear,depthFar,inlineVerticalFieldOfView,baseLayer,layersare set, abort these steps. -
Run update the pending layers state with session and newState .
-
Let activeState be session ’s active render state .
-
If session ’s pending render state is
null, set it to a copy of activeState . -
If newState ’s
depthNearvalue is set, set session ’s pending render state 'sdepthNearto newState ’sdepthNear. -
If newState ’s
depthFarvalue is set, set session ’s pending render state 'sdepthFarto newState ’sdepthFar. -
If newState ’s
inlineVerticalFieldOfViewis set, set session ’s pending render state 'sinlineVerticalFieldOfViewto newState ’sinlineVerticalFieldOfView. -
If newState ’s
baseLayeris set, set session ’s pending render state 'sbaseLayerto newState ’sbaseLayer.
When requested, the
XRSessionsession MUST apply the pending render state by running the following steps:-
Let activeState be session ’s active render state .
-
Let newState be session ’s pending render state .
-
Set session ’s pending render state to
null. -
Let oldBaseLayer be activeState ’s
baseLayer. -
Let oldLayers be activeState ’s
layers. -
Queue a task to perform the following steps:
-
Set activeState to newState .
-
If oldBaseLayer is not equal to activeState ’s
baseLayer, oldLayers is not equal to activeState ’slayers, or the dimensions of any of the layers have changed, update the viewports for session . -
If activeState ’s
inlineVerticalFieldOfViewis less than session ’s minimum inline field of view set activeState ’sinlineVerticalFieldOfViewto session ’s minimum inline field of view . -
If activeState ’s
inlineVerticalFieldOfViewis greater than session ’s maximum inline field of view set activeState ’sinlineVerticalFieldOfViewto session ’s maximum inline field of view . -
If activeState ’s
depthNearis less than session ’s minimum near clip plane set activeState ’sdepthNearto session ’s minimum near clip plane . -
If activeState ’s
depthFaris greater than session ’s maximum far clip plane set activeState ’sdepthFarto session ’s maximum far clip plane . -
Let baseLayer be activeState ’s
baseLayer. -
Set activeState ’s composition disabled and output canvas as follows:
-
If
session
’s
mode
is
"inline"and baseLayer is an instance of anXRWebGLLayerwith composition disabled set totrue: -
Set activeState ’s composition disabled boolean to
true.Set activeState ’s output canvas to baseLayer ’s context 's
canvas. - Otherwise:
-
Set activeState ’s composition disabled boolean to
false.Set activeState ’s output canvas to
null.
-
If
session
’s
mode
is
-
⚠ MDN XRSession/requestReferenceSpace In only one current engine. Firefox None Safari None Chrome 79+ Opera None Edge 79+ Edge (Legacy) None IE None Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneTherequestReferenceSpace( type )method constructs a newXRReferenceSpaceof a given type , if possible.When this method is invoked, the user agent MUST run the following steps:
-
Let promise be a new Promise in the relevant realm of this
XRSession. -
Run the following steps in parallel :
-
If the result of running reference space is supported for type and session is
false, queue a task to reject promise with aNotSupportedErrorand abort these steps. -
Set up any platform resources required to track reference spaces of type type .
User agents need not wait for tracking to be established for such reference spaces to resolverequestReferenceSpace(). It is okay forgetViewerPose()to returnnullwhen the session is initially attempting to establish tracking, and content can use this time to show a splash screen or something else. Note that if type is"bounded-floor", and the bounds have not yet been established, user agents MAY set the bounds to a small initial area and use aresetevent when bounds are established. -
Queue a task to run the following steps:
-
Create a reference space , referenceSpace , with type and session .
-
Resolve promise with referenceSpace .
-
-
Return promise .
Each
XRSessionhas a list of active XR input sources (a list ofXRInputSource) which MUST be initially an empty list .Each
XRSessionhas an XR device , which is an XR device set at initialization.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
inputSourcesattribute returns theXRSession's list of active XR input sources .The user agent MUST monitor any XR input source s associated with the XR device , including detecting when XR input source s are added, removed, or changed.
Each
XRSessionhas a promise resolved flag, initiallyfalse.NOTE: The purpose of this flag is to ensure that the add input source , remove input source , and change input source algorithms do not run until the user code actually has had a chance to attach event listeners. Implementations may not need this flag if they simply choose to start listening for input source changes after the session resolves.
When new XR input source s become available for
XRSessionsession , the user agent MUST run the following steps:-
If session ’s promise resolved flag is not set, abort these steps.
-
Let added be a new list .
-
For each new XR input source :
-
Let inputSource be a new
XRInputSourcein the relevant realm of thisXRSession. -
Add inputSource to added .
-
-
Queue a task to perform the following steps:
-
Extend session ’s list of active XR input sources with added .
-
Fire an
XRInputSourcesChangeEventnamedinputsourceschangeon session withaddedset to added .
-
When any previously added XR input source s are no longer available for
XRSessionsession , the user agent MUST run the following steps:-
If session ’s promise resolved flag is not set, abort these steps.
-
Let removed be a new list .
-
For each XR input source that is no longer available:
-
Let inputSource be the
XRInputSourcein session ’s list of active XR input sources associated with the XR input source . -
Add inputSource to removed .
-
-
Queue a task to perform the following steps:
-
Remove each
XRInputSourcein removed from session ’s list of active XR input sources . -
Fire an
XRInputSourcesChangeEventnamedinputsourceschangeon session withremovedset to removed .
-
Note: The user agent MAY fire this event when an input source temporarily loses both position and orientation tracking. It is recommended that this only be done for physical handheld controller input sources. It is not recommended that this event be fired when this happens for tracked hand input sources, because this will happen often, nor is it recommended when this happens for tracker object input sources, since this makes it harder for the application to maintain a notion of identity.
When the
handedness,targetRayMode,profiles, or presence of agripSpacefor any XR input source s change forXRSessionsession , the user agent MUST run the following steps:-
If session ’s promise resolved flag is not set, abort these steps.
-
Let added be a new list .
-
Let removed be a new list .
-
For each changed XR input source :
-
Let oldInputSource be the
XRInputSourcein session ’s list of active XR input sources previously associated with the XR input source . -
Let newInputSource be a new
XRInputSourcein the relevant realm of session . -
Add oldInputSource to removed .
-
Add newInputSource to added .
-
-
Queue a task to perform the following steps:
-
Remove each
XRInputSourcein removed from session ’s list of active XR input sources . -
Extend session ’s list of active XR input sources with added .
-
Fire an
XRInputSourcesChangeEventnamedinputsourceschangeon session withaddedset to added andremovedset to removed .
-
Each
XRSessionhas a visibility state value, which is an enum. For inline sessions the visibility state MUST mirror theDocument's visibilityState . For immersive sessions the visibility state MUST be set to whichever of the following values best matches the state of session.-
A state of
visibleindicates that imagery rendered by theXRSessioncan be seen by the user andrequestAnimationFrame()callbacks are processed at the XR device 's native refresh rate. Input is processed by theXRSessionnormally. -
A state of
visible-blurredindicates that imagery rendered by theXRSessionmay be seen by the user, but is not the primary focus.requestAnimationFrame()callbacks MAY be throttled . Input is not processed by theXRSession. -
A state of
hiddenindicates that imagery rendered by theXRSessioncannot be seen by the user.requestAnimationFrame()callbacks will not be processed until the visibility state changes. Input is not processed by theXRSession.
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
visibilityStateattribute returns theXRSession's visibility state . Theonvisibilitychangeattribute is an Event handler IDL attribute for thevisibilitychangeevent type.The visibility state MAY be changed by the user agent at any time other than during the processing of an XR animation frame , and the user agent SHOULD monitor the XR platform when possible to observe when session visibility has been affected external to the user agent and update the visibility state accordingly.
Note: The
XRSession's visibility state does not necessarily imply the visibility of the HTML document. Depending on the system configuration the page may continue to be visible while an immersive session is active. (For example, a headset connected to a PC may continue to display the page on the monitor while the headset is viewing content from an immersive session .) Developers should continue to rely on the Page Visibility API to determine page visibility.Note: The
XRSession's visibility state does not affect or restrict mouse behavior on tethered sessions where 2D content is still visible while an immersive session is active. Content should consider using the [pointerlock] API if it wishes to have stronger control over mouse behavior.Each
XRSessionhas a viewer reference space , which is anXRReferenceSpaceof type"viewer"with an identity transform origin offset .Each
XRSessionhas a list of views , which is a list of view s corresponding to the views provided by the XR device . If theXRSession'srenderState's composition disabled boolean is set totruethe list of views MUST contain a single view . The list of views is immutable during theXRSessionand MUST contain any views that may be surfaced during the session, including secondary views that may not initially be active .In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
onendattribute is an Event handler IDL attribute for theendevent type.XRSession/oninputsourceschange
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
oninputsourceschangeattribute is an Event handler IDL attribute for theinputsourceschangeevent type.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
onselectstartattribute is an Event handler IDL attribute for theselectstartevent type.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
onselectendattribute is an Event handler IDL attribute for theselectendevent type.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
onselectattribute is an Event handler IDL attribute for theselectevent type.The
onsqueezestartattribute is an Event handler IDL attribute for thesqueezestartevent type.The
onsqueezeendattribute is an Event handler IDL attribute for thesqueezeendevent type.The
onsqueezeattribute is an Event handler IDL attribute for thesqueezeevent type.4.2. XRRenderState
An
XRRenderStaterepresents a set of configurable values which affect how anXRSession's output is composited. The active render state for a givenXRSessioncan only change between frame boundaries, and updates can be queued up viaupdateRenderState().dictionary {XRRenderStateInit double ;depthNear double ;depthFar double ;inlineVerticalFieldOfView XRWebGLLayer ?;baseLayer sequence <XRLayer >?; }; [layers SecureContext ,Exposed =Window ]interface {XRRenderState readonly attribute double depthNear ;readonly attribute double depthFar ;readonly attribute double ?inlineVerticalFieldOfView ;readonly attribute XRWebGLLayer ?baseLayer ; };Each
XRRenderStatehas a output canvas , which is anHTMLCanvasElementinitially set tonull. The output canvas is the DOM element that will display any content rendered for an"inline"XRSession.Each
XRRenderStatealso has composition disabled boolean, which is initiallyfalse. TheXRRenderStateis considered to be have composition disabled if rendering commands performed for an"inline"XRSessionare executed in such a way that they are directly displayed into output canvas , rather than first being processed by the XR Compositor .Note: At this point the
XRRenderStatewill only have an output canvas if it has composition disabled , but future versions of the specification are likely to introduce methods for setting output canvas ' that support more advanced uses like mirroring and layer compositing that will require composition.When an
XRRenderStateobject is created for anXRSessionsession , the user agent MUST initialize the render state by running the following steps:-
Let state be a new
XRRenderStateobject in the relevant realm of session . -
Initialize state ’s
depthNearto0.1. -
Initialize state ’s
depthFarto1000.0. -
Initialize state ’s
inlineVerticalFieldOfViewas follows:- If session is an inline session :
-
Initialize state ’s
inlineVerticalFieldOfViewtoPI * 0.5. - Otherwise:
-
Initialize state ’s
inlineVerticalFieldOfViewtonull.
-
Initialize state ’s
baseLayertonull.
The
depthNearattribute defines the distance, in meters, of the near clip plane from the viewer . ThedepthFarattribute defines the distance, in meters, of the far clip plane from the viewer .depthNearanddepthFarare used in the computation of theprojectionMatrixofXRViews. When theprojectionMatrixis used during rendering, only geometry with a distance to the viewer that falls betweendepthNearanddepthFarwill be drawn. They also determine how the values of anXRWebGLLayerdepth buffer are interpreted.depthNearMAY be greater thandepthFar.Note: Typically when constructing a perspective projection matrix for rendering the developer specifies the viewing frustum and the near and far clip planes. When displaying to an immersive XR device the correct viewing frustum is determined by some combination of the optics, displays, and cameras being used. The near and far clip planes, however, may be modified by the application since the appropriate values depend on the type of content being rendered.
The
inlineVerticalFieldOfViewattribute defines the default vertical field of view in radians used when computing projection matrices for"inline"XRSessions. The projection matrix calculation also takes into account the aspect ratio of the output canvas . This value MUST benullfor immersive sessions .The
baseLayerattribute defines anXRWebGLLayerwhich the XR compositor will obtain images from.4.3. Animation Frames
The primary way an
XRSessionprovides information about the tracking state of the XR device is via callbacks scheduled by callingrequestAnimationFrame()on theXRSessioninstance.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile Nonecallback =XRFrameRequestCallback undefined (DOMHighResTimeStamp ,time XRFrame );frame Each
XRFrameRequestCallbackobject has a cancelled boolean initially set tofalse.Each
XRSessionhas a list of animation frame callbacks , which is initially empty, a list of currently running animation frame callbacks , which is also initially empty, and an animation frame callback identifier , which is a number which is initially zero.XRSession/requestAnimationFrame
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
requestAnimationFrame( callback )method queues up callback for being run the next time the user agent wishes to run an animation frame for the device.When this method is invoked, the user agent MUST run the following steps:
-
Let session be the this .
-
Increment session ’s animation frame callback identifier by one.
-
Append callback to session ’s list of animation frame callbacks , associated with session ’s animation frame callback identifier ’s current value.
-
Return session ’s animation frame callback identifier ’s current value.
XRSession/cancelAnimationFrame
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
cancelAnimationFrame( handle )method cancels an existing animation frame callback given its animation frame callback identifier handle .When this method is invoked, the user agent MUST run the following steps:
-
Let session be the this .
-
Find the entry in session ’s list of animation frame callbacks or session ’s list of currently running animation frame callbacks that is associated with the value handle .
-
If there is such an entry, set its cancelled boolean to
trueand remove it from session ’s list of animation frame callbacks .
To check the layers state withrenderStatestate , the user agent MUST run the following steps:-
If state ’s
baseLayerisnull, returnfalse. -
return
true.
NOTE: The WebXR layers module will introduce new semantics for this algorithm.
To determine if a frame should be rendered forXRSessionsession , the user agent MUST run the following steps:-
If check the layers state with session ’s
renderStateisfalse, returnfalse. -
If session ’s mode is
"inline"and session ’srenderState's output canvas isnull, returnfalse. -
return
true.
When an
XRSessionsession receives updated viewer state for timestamp frameTime from the XR device , it runs an XR animation frame , which MUST run the following steps regardless of if the list of animation frame callbacks is empty or not:-
Queue a task to perform the following steps:
-
Let now be the current high resolution time .
-
Let frame be session ’s animation frame .
-
Set frame ’s time to frameTime .
-
For each view in list of views , set view ’s viewport modifiable flag to true.
-
If the active flag of any view in the list of views has changed since the last XR animation frame , update the viewports .
-
If the frame should be rendered for session :
-
Set session ’s list of currently running animation frame callbacks to be session ’s list of animation frame callbacks .
-
Set session ’s list of animation frame callbacks to the empty list.
-
Set frame ’s active boolean to
true. -
Apply frame updates for frame .
-
For each entry in session ’s list of currently running animation frame callbacks , in order:
-
If the entry ’s cancelled boolean is
true, continue to the next entry. -
Invoke the Web IDL callback function for entry , passing now and frame as the arguments
-
If an exception is thrown, report the exception .
-
Set session ’s list of currently running animation frame callbacks to the empty list .
-
Set frame ’s active boolean to
false.
-
-
If session ’s pending render state is not
null, apply the pending render state .
-
The behavior of the
Windowinterface’srequestAnimationFrame()method is not changed by the presence of any activeXRSession, nor does callingrequestAnimationFrame()on anyXRSessioninteract withWindow'srequestAnimationFrame()in any way. An active immersive session MAY affect the rendering opportunity of a browsing context if it causes the page to be obscured. If the 2D browser view is visible during an active immersive session (i.e., when the sesson is running on a tethered headset), the timing of callbacks run withWindow'srequestAnimationFrame()andrequestIdleCallback()MAY NOT coincide with that of the session’srequestAnimationFrame()and should not be relied upon by the user for rendering XR content.Note: User agents may wish to display a warning to the developer console if
XRSession'srequestAnimationFrame()is called during callbacks scheduled viaWindow'srequestAnimationFrame(), as these callbacks are not guaranteed to occur if the active immersive session affects the rendering opportunity of the browsing context , and may not have the correct timing even if they run.If an immersive session prevents rendering opportunities then callbacks supplied toWindowrequestAnimationFrame()may not be processed while the session is active. This depends on the type of device being used and is most likely to happen depend on mobile or standalone devices where the immersive content completely obscures the HTML document. As such, developers must not rely onWindowrequestAnimationFrame()callbacks to scheduleXRSessionrequestAnimationFrame()callbacks and visa-versa, even if they share the same rendering logic. Applications that do not follow this guidance may not execute properly on all platforms. A more effective pattern for applications that wish to transition between these two types of animation loops is demonstrated below:let xrSession= null ; function onWindowAnimationFrame( time) { window. requestAnimationFrame( onWindowAnimationFrame); // This may be called while an immersive session is running on some devices, // such as a desktop with a tethered headset. To prevent two loops from // rendering in parallel, skip drawing in this one until the session ends. if ( ! xrSession) { renderFrame( time, null ); } } // The window animation loop can be started immediately upon the page loading. window. requestAnimationFrame( onWindowAnimationFrame); function onXRAnimationFrame( time, xrFrame) { xrSession. requestAnimationFrame( onXRAnimationFrame); renderFrame( time, xrFrame); } function renderFrame( time, xrFrame) { // Shared rendering logic. } // Assumed to be called by a user gesture event elsewhere in code. asyncfunction startXRSession() { xrSession= await navigator. xr. requestSession( 'immersive-vr' ); xrSession. addEventListener( 'end' , onXRSessionEnded); // Do necessary session setup here. // Begin the session’s animation loop. xrSession. requestAnimationFrame( onXRAnimationFrame); } function onXRSessionEnded() { xrSession= null ; } Applications which use
"inline"sessions for rendering to the HTML document do not need to take any special steps to coordinate the animation loops, since the user agent will automatically suspend the animation loops of any"inline"sessions while an immersive session is active.4.4. The XR Compositor
The user agent MUST maintain an XR Compositor which handles presentation to the XR device and frame timing. The compositor MUST use an independent rendering context whose state is isolated from that of any graphics contexts created by the document. The compositor MUST prevent the page from corrupting the compositor state or reading back content from other pages or applications. The compositor MUST also run in separate thread or processes to decouple performance of the page from the ability to present new imagery to the user at the appropriate framerate. The compositor MAY composite additional device or user agent UI over rendered content, like device menus.
Note: Future extensions to this spec may utilize the compositor to composite multiple layers coming from the same page as well.
5. Frame Loop
5.1. XRFrame
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRFramerepresents a snapshot of the state of all of the tracked objects for anXRSession. Applications can acquire anXRFrameby callingrequestAnimationFrame()on anXRSessionwith anXRFrameRequestCallback. When the callback is called it will be passed anXRFrame. Events which need to communicate tracking state, such as theselectevent, will also provide anXRFrame.[
SecureContext ,Exposed =Window ]interface { [XRFrame SameObject ]readonly attribute XRSession session ;XRViewerPose ?getViewerPose (XRReferenceSpace );referenceSpace XRPose ?getPose (XRSpace ,space XRSpace ); };baseSpace Each
XRFramehas an active boolean which is initially set tofalse, and an animationFrame boolean which is initially set tofalse.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
sessionattribute returns theXRSessionthat produced theXRFrame.Each
XRFramerepresents the state of all tracked objects for a given time , and either stores or is able to query concrete information about this state at the time .In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
getViewerPose( referenceSpace )method provides the pose of the viewer relative to referenceSpace as anXRViewerPose, at theXRFrame's time .When this method is invoked, the user agent MUST run the following steps:
-
Let frame be this .
-
Let session be frame ’s
sessionobject. -
If frame ’s animationFrame boolean is
false, throw anInvalidStateErrorand abort these steps. -
Let pose be a new
XRViewerPoseobject in the relevant realm of session . -
Populate the pose of session ’s viewer reference space in referenceSpace at the time represented by frame into pose , with
force emulationset totrue. -
If pose is
nullreturnnull. -
Let xrviews be an empty list .
-
For each active view view in the list of views on
session, perform the following steps:-
Let xrview be a new
XRViewobject in the relevant realm of session . -
Initialize xrview ’s underlying view to view .
-
Initialize xrview ’s frame time to frame ’s time .
-
Initialize xrview ’s session to session .
-
Let offset be an new
XRRigidTransformobject equal to the view offset of view in the relevant realm of session . -
Set xrview ’s
transformproperty to the result of multiplying theXRViewerPose'stransformby the offset transform in the relevant realm of session -
Append xrview to xrviews
-
-
Set pose ’s
viewsto xrviews -
Return pose .
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
getPose( space , baseSpace )method provides the pose of space relative to baseSpace as anXRPose, at the time represented by theXRFrame.When this method is invoked, the user agent MUST run the following steps:
-
Let frame be this .
-
Let pose be a new
XRPoseobject in the relevant realm of frame . -
Populate the pose of space in baseSpace at the time represented by frame into pose .
-
Return pose .
A frame update is an algorithm that can be run given an
XRFrame, which is intended to be run eachXRFrame.Every
XRSessionhas a list of frame updates , which is a list of frame updates , initially the empty list .To apply frame updates for an
XRFrameframe , the user agent MUST run the following steps:-
For each frame update in frame ’s
session's list of frame updates , perform the following steps:-
Run frame update with frame .
-
NOTE: This spec does not define any frame updates , but other specifications may add some.
6. Spaces
A core feature of the WebXR Device API is the ability to provide spatial tracking. Spaces are the interface that enable applications to reason about how tracked entities are spatially related to the user’s physical environment and each other.
6.1. XRSpace
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRSpacerepresents a virtual coordinate system with an origin that corresponds to a physical location. Spatial data that is requested from the API or given to the API is always expressed in relation to a specificXRSpaceat the time of a specificXRFrame. Numeric values such as pose positions are coordinates in that space relative to its origin. The interface is intentionally opaque.[
SecureContext ,Exposed =Window ]interface :XRSpace EventTarget { };Each
XRSpacehas a session which is set to theXRSessionthat created theXRSpace.Each
XRSpacehas a native origin which is a position and orientation in space. TheXRSpace's native origin may be updated by the XR device 's underlying tracking system, and differentXRSpaces may define different semantics as to how their native origins are tracked and updated.Each
XRSpacehas an effective origin , which is the basis of theXRSpace's coordinate system .The transform from the effective space to the native origin 's space is defined by an origin offset , which is an
XRRigidTransforminitially set to an identity transform . In other words, the effective origin can be obtained by multiplying origin offset and the native origin .The effective origin of an
XRSpacecan only be observed in the coordinate system of anotherXRSpaceas anXRPose, returned by anXRFrame'sgetPose()method. The spatial relationship betweenXRSpaces MAY change betweenXRFrames.To populate the pose of an
XRSpacespace in anXRSpacebaseSpace at the time represented by anXRFrameframe into anXRPosepose , with an optional force emulation flag, the user agent MUST run the following steps:-
If frame ’s active boolean is
false, throw anInvalidStateErrorand abort these steps. -
Let session be frame ’s
sessionobject. -
If space ’s session does not equal session , throw an
InvalidStateErrorand abort these steps. -
If baseSpace ’s session does not equal session , throw an
InvalidStateErrorand abort these steps. -
Check if poses may be reported and, if not, throw a
SecurityErrorand abort these steps. -
Let limit be the result of whether poses must be limited between space and baseSpace .
-
Let transform be pose ’s
transform. -
Query the XR device 's tracking system for space ’s pose relative to baseSpace at the frame ’s time , then perform the following steps:
-
If
limit
is
falseand the tracking system provides a 6DoF pose whose position is actively tracked or statically known for space ’s pose relative to baseSpace : -
Set transform ’s
orientationto the orientation of space ’s effective origin in baseSpace ’s coordinate system .Set transform ’s
positionto the position of space ’s effective origin in baseSpace ’s coordinate system .Set pose ’s
emulatedPositiontofalse. -
Else
if
limit
is
falseand the tracking system provides a 3DoF pose or a 6DoF pose whose position is neither actively tracked nor statically known for space ’s pose relative to baseSpace : -
Set transform ’s
orientationto the orientation of space ’s effective origin in baseSpace ’s coordinate system .Set transform ’s
positionto the tracking system’s best estimate of the position of space ’s effective origin in baseSpace ’s coordinate system . This MAY include a computed offset such as a neck or arm model. If a position estimate is not available, the last known position MUST be used.Set pose ’s
emulatedPositiontotrue. -
Else
if
space
’s
pose
relative
to
baseSpace
has
been
determined
in
the
past
and
force
emulation
is
true: -
Set transform ’s
positionto the last known position of space ’s effective origin in baseSpace ’s coordinate system .Set transform ’s
orientationto the last known orientation of space ’s effective origin in baseSpace ’s coordinate system .Set pose ’s
emulatedPositionboolean totrue. - Otherwise:
-
Set pose to
null.
-
If
limit
is
Note: The
XRPose'semulatedPositionboolean does not indicate whether baseSpace ’s position is emulated or not, only whether evaluating space ’s position relative to baseSpace relies on emulation. For example, a controller with 3DoF tracking would report poses with anemulatedPositionoftruewhen itstargetRaySpaceorgripSpaceare queried against anXRReferenceSpace, but would report anemulatedPositionoffalseif the pose of thetargetRaySpacewas queried ingripSpace, because the relationship between those two spaces should be known exactly.6.2. XRReferenceSpace
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRReferenceSpaceis one of several commonXRSpaces that applications can use to establish a spatial relationship with the user’s physical environment.XRReferenceSpaces are generally expected to remain static for the duration of theXRSession, with the most common exception being mid-session reconfiguration by the user. The native origin for everyXRReferenceSpacedescribes a coordinate system where+Xis considered "Right",+Yis considered "Up", and-Zis considered "Forward".enum {XRReferenceSpaceType "viewer" ,"local" ,"local-floor" ,"bounded-floor" ,"unbounded" }; [SecureContext ,Exposed =Window ]interface :XRReferenceSpace XRSpace { [NewObject ]XRReferenceSpace getOffsetReferenceSpace (XRRigidTransform );originOffset attribute EventHandler onreset ; };Each
XRReferenceSpacehas a type , which is anXRReferenceSpaceType.An
XRReferenceSpaceis most frequently obtained by callingrequestReferenceSpace(), which creates an instance of anXRReferenceSpace(or an interface extending it) if theXRReferenceSpaceTypeenum value passed into the call is supported . The type indicates the tracking behavior that the reference space will exhibit:-
Passing a type of
viewercreates anXRReferenceSpaceinstance. It represents a tracking space with a native origin which tracks the position and orientation of the viewer . EveryXRSessionMUST support"viewer"XRReferenceSpaces. -
Passing a type of
localcreates anXRReferenceSpaceinstance. It represents a tracking space with a native origin near the viewer at the time of creation. The exact position and orientation will be initialized based on the conventions of the underlying platform. When using this reference space the user is not expected to move beyond their initial position much, if at all, and tracking is optimized for that purpose. For devices with 6DoF tracking,localreference spaces should emphasize keeping the origin stable relative to the user’s environment. -
Passing a type of
local-floorcreates anXRReferenceSpaceinstance. It represents a tracking space with a native origin at the floor in a safe position for the user to stand. TheYaxis equals0at floor level, with theXandZposition and orientation initialized based on the conventions of the underlying platform. If the floor level isn’t known it MUST be estimated, with some estimated floor level . If the estimated floor level is determined with a non-default value, it MUST be rounded sufficiently to prevent fingerprinting. When using this reference space the user is not expected to move beyond their initial position much, if at all, and tracking is optimized for that purpose. For devices with 6DoF tracking,local-floorreference spaces should emphasize keeping the origin stable relative to the user’s environment.Note: If the floor level of a
"local-floor"reference space is adjusted to prevent fingerprinting, rounded to the nearest 1cm is suggested. -
Passing a type of
bounded-floorcreates anXRBoundedReferenceSpaceinstance. It represents a tracking space with its native origin at the floor, where the user is expected to move within a pre-established boundary, given as theboundsGeometry. Tracking in abounded-floorreference space is optimized for keeping the native origin andboundsGeometrystable relative to the user’s environment. -
Passing a type of
unboundedcreates anXRReferenceSpaceinstance. It represents a tracking space where the user is expected to move freely around their environment, potentially even long distances from their starting point. Tracking in anunboundedreference space is optimized for stability around the user’s current position, and as such the native origin may drift over time.
Devices that support
"local"reference spaces MUST support"local-floor"reference spaces, through emulation if necessary, and vice versa.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
onresetattribute is an Event handler IDL attribute for theresetevent type.When an
XRReferenceSpaceis requested withXRReferenceSpaceTypetype forXRSessionsession , the user agent MUST create a reference space by running the following steps:-
Initialize referenceSpace as follows:
-
If
type
is
bounded-floor: -
Let referenceSpace be a new
XRBoundedReferenceSpacein the relevant realm of session . - Otherwise:
-
Let referenceSpace be a new
XRReferenceSpacein the relevant realm of session .
-
If
type
is
-
Initialize referenceSpace ’s type to type .
-
Initialize referenceSpace ’s session to session .
-
Return referenceSpace .
To check if a reference space is supported for a given reference space type type andXRSessionsession , run the following steps:-
If type is not contained in session ’s XR device 's list of enabled features for mode return
false. -
If type is
viewer, returntrue. -
If type is
localorlocal-floor, and session is an immersive session , returntrue. -
If type is
localorlocal-floor, and the XR device supports reporting orientation data, returntrue. -
If type is
bounded-floorand session is an immersive session , return the result of whether bounded reference spaces are supported by the XR device . -
If type is
unbounded, session is an immersive session , and the XR device supports stable tracking near the user over an unlimited distance, returntrue. -
Return
false.
⚠ MDN XRReferenceSpace/getOffsetReferenceSpace In only one current engine. Firefox None Safari None Chrome 79+ Opera None Edge 79+ Edge (Legacy) None IE None Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThegetOffsetReferenceSpace( originOffset )method MUST perform the following steps when invoked:-
Let base be the
XRReferenceSpacethe method was called on. -
Initialize offsetSpace as follows:
-
If
base
is
an
instance
of
XRBoundedReferenceSpace: -
Let offsetSpace be a new
XRBoundedReferenceSpacein the relevant realm of base , and set offsetSpace ’sboundsGeometryto base ’sboundsGeometry, with each point multiplied by theinverseof originOffset . - Otherwise:
-
Let offsetSpace be a new
XRReferenceSpacein the relevant realm of base .
-
If
base
is
an
instance
of
-
Set offsetSpace ’s origin offset to the result of multiplying base ’s origin offset by originOffset in the relevant realm of base .
-
Return offsetSpace .
Note: It’s expected that some applications will use
getOffsetReferenceSpace()to implement scene navigation controls based on mouse, keyboard, touch, or gamepad input. This will result ingetOffsetReferenceSpace()being called frequently, at least once per-frame during periods of active input. As a result UAs are strongly encouraged to make the creation of newXRReferenceSpaces withgetOffsetReferenceSpace()a lightweight operation.6.3. XRBoundedReferenceSpace
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneXRBoundedReferenceSpaceextendsXRReferenceSpaceto includeboundsGeometry, indicating the pre-configured boundaries of the users space.[
SecureContext ,Exposed =Window ]interface :XRBoundedReferenceSpace XRReferenceSpace {readonly attribute FrozenArray <DOMPointReadOnly >boundsGeometry ; };The origin of an
XRBoundedReferenceSpaceMUST be positioned at the floor, such that theYaxis equals0at floor level. TheXandZposition and orientation are initialized based on the conventions of the underlying platform, typically expected to be near the center of the room facing in a logical forward direction.Note: Other XR platforms sometimes refer to the type of tracking offered by a
bounded-floorreference space as "room scale" tracking. AnXRBoundedReferenceSpaceis not intended to describe multi-room spaces, areas with uneven floor levels, or very large open areas. Content that needs to handle those scenarios should use anunboundedreference space.Each
XRBoundedReferenceSpacehas a native bounds geometry describing the border around theXRBoundedReferenceSpace, which the user can expect to safely move within. The polygonal boundary is given as an array ofDOMPointReadOnlys, which represents a loop of points at the edges of the safe space. The points describe offsets from the native origin in meters. Points MUST be given in a clockwise order as viewed from above, looking towards the negative end of the Y axis. Theyvalue of each point MUST be0and thewvalue of each point MUST be1. The bounds can be considered to originate at the floor and extend infinitely high. The shape it describes MAY be convex or concave.Each point in the native bounds geometry MUST be limited to a reasonable distance from the reference space’s native origin .
Note: It is suggested that points of the native bounds geometry be limited to 15 meters from the native origin in all directions.
Each point in the native bounds geometry MUST also be quantized sufficiently to prevent fingerprinting. For user’s safety, quantized points values MUST NOT fall outside the bounds reported by the platform.
Note: It is suggested that points of the native bounds geometry be quantized to the nearest 5cm.
XRBoundedReferenceSpace/boundsGeometry
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
boundsGeometryattribute is an array ofDOMPointReadOnlys such that each entry is equal to the entry in theXRBoundedReferenceSpace's native bounds geometry premultiplied by theinverseof the origin offset . In other words, it provides the same border inXRBoundedReferenceSpacecoordinates relative to the effective origin .If the native bounds geometry is temporarily unavailable, which may occur for several reasons such as during XR device initialization, extended periods of tracking loss, or movement between pre-configured spaces, the
boundsGeometryMUST report an empty array.To check if bounded reference spaces are supported run the following steps:Note: Bounded references spaces may be returned if the boundaries or floor height have not been resolved at the time of the reference space request, but the XR device is known to support them.
Note: Content should not require the user to move beyond the
boundsGeometry. It is possible for the user to move beyond the bounds if their physical surroundings allow for it, resulting in position values outside of the polygon they describe. This is not an error condition and should be handled gracefully by page content.Note: Content generally should not provide a visualization of the
boundsGeometry, as it’s the user agent’s responsibility to ensure that safety critical information is provided to the user.7. Views
7.1. XRView
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRViewdescribes a single view into an XR scene for a given frame.A view corresponds to a display or portion of a display used by an XR device to present imagery to the user. They are used to retrieve all the information necessary to render content that is well aligned to the view 's physical output properties, including the field of view, eye offset, and other optical properties. Views may cover overlapping regions of the user’s vision. No guarantee is made about the number of views any XR device uses or their order, nor is the number of views required to be constant for the duration of an
XRSession.A view has an associated internal view offset , which is an
XRRigidTransformdescribing the position and orientation of the view in the viewer reference space 's coordinate system .NOTE: There are no constraints on what the view offset might be, and views are allowed to have differing orientations. This can crop up in head-mounted devices with eye displays centered at an angle, and it can also surface itself in more extreme cases like CAVE rendering. Techniques like z-sorting and culling may need to be done per-eye because of this.
A view has an associated projection matrix which is a matrix describing the projection to be used when rendering the view , provided by the underlying XR device. The projection matrix MAY include transformations such as shearing that prevent the projection from being accurately described by a simple frustum.
A view has an associated eye which is an
XREyedescribing which eye this view is expected to be shown to. If the view does not have an intrinsically associated eye (the display is monoscopic, for example) this value MUST be set to"none".A view has an active flag that may change through the lifecycle of an
XRSession. Primary views MUST always have the active flag set totrue.Note: Many HMDs will request that content render two views , one for the left eye and one for the right, while most magic window devices will only request one view , but applications should never assume a specific view configuration. For example: A magic window device may request two views if it is capable of stereo output, but may revert to requesting a single view for performance reasons if the stereo output mode is turned off. Similarly, HMDs may request more than two views to facilitate a wide field of view or displays of different pixel density.
A view has an internal viewport modifiable flag that indicates if the viewport scale can be changed by a
requestViewportScale()call at this point in the session. It is set totrueat the start of an animation frame, and set tofalsewhengetViewport()is called.A view has an internal requested viewport scale value that represents the requested viewport scale for this view. It is initially set to 1.0, and can be modified by the
requestViewportScale()method if the system supports dynamic viewport scaling.A view has an internal current viewport scale value that represents the current viewport scale for this view as used internally by the system. It is initially set to 1.0. It is updated to match the requested viewport scale when the viewport change is successfully applied by a
getViewport()call.Note: Dynamic viewport scaling allows applications to render to a subset of the full-sized viewport using a scale factor that can be changed every animation frame. This is intended to be efficiently modifiable on a per-frame basis without reallocation. For correct rendering, it’s essential that the XR system and application agree on the active viewport. An application can call
requestViewportScale()for anXRViewmultiple times within a single animation frame, but the requested scale does not take effect until the application callsgetViewport()for that view. The firstgetViewportcall in an animation frame applies the change (taking effect immediately for the current animation frame), locks in the view’s current scaled viewport for the remainder of this animation frame, and sets the scale as the new default for future animation frames. Optionally, the system can provide a suggested value through therecommendedViewportScaleattribute based on internal performance heuristics and target framerates.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView 79+ Samsung Internet 11.2+ Opera Mobile Noneenum {XREye ,"none" ,"left" }; ["right" SecureContext ,Exposed =Window ]interface {XRView readonly attribute XREye eye ;readonly attribute Float32Array projectionMatrix ; [SameObject ]readonly attribute XRRigidTransform transform ;readonly attribute double ?recommendedViewportScale ;undefined requestViewportScale (double ?); };scale In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
eyeattribute describes is the eye of the underlying view . This attribute’s primary purpose is to ensure that pre-rendered stereo content can present the correct portion of the content to the correct eye.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
projectionMatrixattribute is the projection matrix of the underlying view . It is strongly recommended that applications use this matrix without modification or decomposition. Failure to use the provided projection matrices when rendering may cause the presented frame to be distorted or badly aligned, resulting in varying degrees of user discomfort. This attribute MUST be computed by obtaining the projection matrix for theXRView.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
transformattribute is theXRRigidTransformof the viewpoint. It represents the position and orientation of the viewpoint in theXRReferenceSpaceprovided ingetViewerPose().The optional
recommendedViewportScaleattribute contains a UA-recommended viewport scale value that the application can use for arequestViewportScale()call to configure dynamic viewport scaling. It isnullif the system does not implement a heuristic or method for determining a recommended scale. If not null, the value MUST be a numeric value greater than 0.0 and less than or equal to 1.0.Each
XRViewhas an associated session which is theXRSessionthat produced it.Each
XRViewhas an associated frame time which is the time of theXRFramethat produced it.Each
XRViewhas an associated underlying view which is the underlying view that it represents.Each
XRViewhas an associated internal projection matrix which stores the projection matrix of its underlying view . It is initiallynull.Note: The
transformcan be used to position camera objects in many rendering libraries. If a more traditional view matrix is needed by the application one can be retrieved by callingview.transform.inverse.matrix.The
requestViewportScale( scale )method requests that the user agent should set the requested viewport scale for this viewport to the requested value.When this method is invoked on an
XRViewxrview , the user agent MUST run the following steps:-
If scale is null or undefined, abort these steps.
-
If scale is less than or equal to 0.0, abort these steps.
-
If scale is greater than 1.0, set scale to 1.0.
-
Let view be xrview ’s underlying view .
-
Set the view ’s requested viewport scale value to scale .
Note: The method ignores null or undefined scale values so that applications can safely use
view.requestViewportScale(view.recommendedViewportScale)even on systems that don’t provide a recommended scale.To obtain the projection matrix for a given
XRViewview-
If view ’s internal projection matrix is not
null, perform the following steps:-
If the operation
IsDetachedBufferon internal projection matrix isfalse, return view ’s internal projection matrix .
-
-
Set view ’s internal projection matrix to a new matrix in the relevant realm of view which is equal to view ’s underlying view 's projection matrix .
-
Return view ’s internal projection matrix .
When the active flag of any view in the list of views changes, one can update the viewports for an
XRSessionsession by performing the following steps:-
Let layer be the
renderState'sbaseLayer. -
If layer is
nullabort these steps. -
Set layer ’s list of viewport objects to the empty list .
-
For each active view view in list of views :
-
Let viewport be the
XRViewportresult of obtaining a scaled viewport from the list of full-sized viewports associated with view for session . -
Append viewport to layer ’s list of viewport objects .
-
To obtain a scaled viewport for a given
XRViewview for anXRSessionsession-
Let glFullSizedViewport be the WebGL viewport from the list of full-sized viewports associated with view .
-
Let scale be the view ’s current viewport scale .
-
The user-agent MAY choose to clamp scale to apply a minimum viewport scale factor.
-
Let glViewport be a new WebGL viewport .
-
Set glViewport ’s
widthto an integer value less than or equal to glFullSizedViewport ’swidthmultiplied by scale . -
If glViewport ’s
widthis less than 1, set it to 1. -
Set glViewport ’s
heightto an integer value less than or equal to glFullSizedViewport ’sheightmultiplied by scale . -
If glViewport ’s
heightis less than 1, set it to 1. -
Set glViewport ’s
xcomponent to an integer value between glFullSizedViewport ’sxcomponent (inclusive) and glFullSizedViewport ’sxcomponent plus glFullSizedViewport ’swidthminus glViewport ’swidth(inclusive). -
Set glViewport ’s
ycomponent to a integer value between glFullSizedViewport ’sycomponent (inclusive) and glFullSizedViewport ’sycomponent plus glFullSizedViewport ’sheightminus glViewport ’sheight(inclusive). -
Let viewport be a new
XRViewportin the relevant realm of session . -
Initialize viewport ’s
xto glViewport ’sxcomponent. -
Initialize viewport ’s
yto glViewport ’sycomponent. -
Initialize viewport ’s
widthto glViewport ’swidth. -
Initialize viewport ’s
heightto glViewport ’sheight. -
Return viewport .
Note: The specific integer value calculation is intentionally left to the UA’s discretion. The straightforward method of rounding down the width/height and using the
xandyoffsets as-is is valid, but the UA MAY also choose a slightly adjusted value within the specified constraints, for example to align the viewport to a power-of-two pixel grid for efficiency. The scaled viewport MUST be completely contained within the full-sized viewport, but MAY be placed at any location within the full-sized viewport at the UA’s discretion. The size and position calculation MUST be deterministic and return a consistent result for identical input values within a session.7.2. Primary and Secondary Views
A view is a primary view when rendering to it is necessary for an immersive experience. Primary views MUST be active for the entire duration of the
XRSession.A view is a secondary view when it is possible for content to choose to not render to it and still produce a working immersive experience. When content chooses to not render to these views, the user-agent MAY be able to reconstruct them via reprojection. Secondary views MUST NOT be active unless the " secondary-views " feature is enabled.
Examples of primary views include the main mono view for a handheld AR session, the main two stereo views for headworn AR/VR sessions, or all of the wall views for a CAVE session.Examples of secondary views include the first-person observer view used for video capture, or "quad views" where there are two views per eye with differing resolution and fields of view.
While content should be written to assume that there may be any number of views, we expect a significant amount of content to make incorrect assumptions about theviewsarray and thus break when presented with more than two views.Because user-agents may have the ability to use mechanisms like reprojection to render to these secondary views in lieu of the content, it is desirable to be able to distinguish between content that plans on handling these secondary views itself and content that is either oblivious to the existence of such secondary views or does not wish to deal with them.
To provide for this, user-agents that expose secondary views MUST support an " secondary-views " feature descriptor as a hint. Content enabling this feature is expected to:
-
Handle the existence of multiple views that have the same eye .
-
Handle the size of the
viewsarray changing from frame to frame. This can happen when video capture is enabled, for example
When " secondary-views " is enabled, the user-agent MAY surface any secondary views the device supports to the
XRSession, when necessary. The user-agent MUST NOT use reprojection to reconstruct secondary views in such a case, and instead rely on whatever the content decides to render.Note: We recommend content use
optionalFeaturesto enable " secondary-views " to ensure maximum compatibility.If secondary views have lower underlying frame rates, the
XRSessionMAY choose to do one or more of the following:-
Lower the overall frame rate of the application while the secondary views are active.
-
Surface secondary views in the
viewsarray only for some of the frames. Implementations doing this SHOULD NOT have frames where the primary views are not present. -
Silently discard rendered content for secondary views during some of the frames.
7.3. XRViewport
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRViewportobject describes a viewport, or rectangular region, of a graphics surface.[
SecureContext ,Exposed =Window ]interface {XRViewport readonly attribute long x ;readonly attribute long y ;readonly attribute long width ;readonly attribute long height ; };In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
xandyattributes define an offset from the surface origin and thewidthandheightattributes define the rectangular dimensions of the viewport.The exact interpretation of the viewport values depends on the conventions of the graphics API the viewport is associated with:
-
When used with an
XRWebGLLayerthexandyattributes specify the lower left corner of the viewport rectangle, in pixels, with the viewport rectangle extendingwidthpixels to the right ofxandheightpixels abovey. The values can be passed to the WebGL viewport function directly.
The following code loops through all of theXRViews of anXRViewerPose, queries anXRViewportfrom anXRWebGLLayerfor each, and uses them to set the appropriate WebGL viewport s for rendering.xrSession
. requestAnimationFrame(( time, xrFrame) => { const viewer= xrFrame. getViewerPose( xrReferenceSpace); gl. bindFramebuffer( xrWebGLLayer. framebuffer); for ( xrViewof viewer. views) { let xrViewport= xrWebGLLayer. getViewport( xrView); gl. viewport( xrViewport. x, xrViewport. y, xrViewport. width, xrViewport. height); // WebGL draw calls will now be rendered into the appropriate viewport. } }); 8. Geometric Primitives
8.1. Matrices
WebXR provides various transforms in the form of matrices . WebXR uses the WebGL conventions when communicating matrices, in which 4x4 matrices are given as 16 element
Float32Arrays with column major storage, and are applied to column vectors by premultiplying the matrix from the left. They may be passed directly to WebGL’suniformMatrix4fvfunction, used to create an equivalentDOMMatrix, or used with a variety of third party math libraries.Matrices returned from the WebXR Device API will be a 16 elementFloat32Arraylaid out like so:[a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15]
Applying this matrix as a transform to a column vector specified as a
DOMPointReadOnlylike so:{x:X, y:Y, z:Z, w:1}Produces the following result:
a0 a4 a8 a12 * X = a0 * X + a4 * Y + a8 * Z + a12 a1 a5 a9 a13 Y a1 * X + a5 * Y + a9 * Z + a13 a2 a6 a10 a14 Z a2 * X + a6 * Y + a10 * Z + a14 a3 a7 a11 a15 1 a3 * X + a7 * Y + a11 * Z + a15
8.2. Normalization
There are several algorithms which call for a vector or quaternion to be normalized, which means to scale the components to have a collective magnitude of
1.0.To normalize a list of components the UA MUST perform the following steps:
-
Let length be the square root of the sum of the squares of each component.
-
If length is
0, throw anInvalidStateErrorand abort these steps. -
Divide each component by length and set the component.
8.3. XRRigidTransform
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRRigidTransformis a transform described by apositionandorientation. When interpreting anXRRigidTransformtheorientationis always applied prior to theposition.An
XRRigidTransformcontains an internal matrix which is a matrix .[
SecureContext ,Exposed =Window ]interface {XRRigidTransform constructor (optional DOMPointInit = {},position optional DOMPointInit = {}); [orientation SameObject ]readonly attribute DOMPointReadOnly position ; [SameObject ]readonly attribute DOMPointReadOnly orientation ;readonly attribute Float32Array matrix ; [SameObject ]readonly attribute XRRigidTransform inverse ; };XRRigidTransform/XRRigidTransform
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
XRRigidTransform( position , orientation )constructor MUST perform the following steps when invoked:-
Let transform be a new
XRRigidTransformin the current realm . -
Let transform ’s
positionbe a newDOMPointReadOnlyin the current realm . -
If position ’s
wvalue is not1.0, throw aTypeErrorand abort these steps. -
If one or more of position ’s or orientation ’s values is
NaNor another non-finite number such asinfinity, throw aTypeErrorand abort these steps. -
Set transform ’s
position’sxvalue to position ’s x dictionary member,yvalue to position ’s y dictionary member,zvalue to position ’s z dictionary member andwvalue to position ’s w dictionary member. -
Let transform ’s
orientationbe a newDOMPointReadOnlyin the current realm . -
Set transform ’s
orientation’sxvalue to orientation ’s x dictionary member,yvalue to orientation ’s y dictionary member,zvalue to orientation ’s z dictionary member andwvalue to orientation ’s w dictionary member. -
Let transform ’s internal matrix be
null. -
Normalize
x,y,z, andwcomponents of transform ’sorientation. -
Return transform .
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
positionattribute is a 3-dimensional point, given in meters, describing the translation component of the transform. Theposition'swattribute MUST be1.0.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
orientationattribute is a quaternion describing the rotational component of the transform. TheorientationMUST be normalized to have a length of1.0.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
matrixattribute returns the transform described by thepositionandorientationattributes as a matrix . This attribute MUST be computed by obtaining the matrix for theXRRigidTransform.Note: This matrix when premultiplied onto a column vector will rotate the vector by the 3D rotation described by
orientation, and then translate it byposition. Mathematically in column-vector notation, this isM = T * R, whereTis a translation matrix corresponding topositionandRis a rotation matrix corresponding toorientation.To obtain the matrix for a given
XRRigidTransformtransform-
If transform ’s internal matrix is not
null, perform the following steps:-
If the operation
IsDetachedBufferon internal matrix isfalse, return transform ’s internal matrix .
-
-
Let translation be a new matrix which is a column-vector translation matrix corresponding to
position. Mathematically, ifpositionis(x, y, z), this matrix is -
Let rotation be a new matrix which is a column-vector rotation matrix corresponding to
orientation. Mathematically, iforientationis the unit quaternion(q<sub>x</sub>, q<sub>y</sub>, q<sub>z</sub>, q<sub>w</sub>), this matrix is -
Set transform ’s internal matrix to a new
Float32Arrayin the relevant realm of transform set to the result of multiplying translation and rotation with translation on the left (translation * rotation) in the relevant realm of transform . Mathematically, this matrix is -
Return transform ’s internal matrix .
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
inverseattribute of aXRRigidTransformtransform returns anXRRigidTransformin the relevant realm of transform which, if applied to an object that had previously been transformed by transform , would undo the transform and return the object to its initial pose. This attribute SHOULD be lazily evaluated. TheXRRigidTransformreturned byinverseMUST return transform as itsinverse.An
XRRigidTransformwith apositionof{ x: 0, y: 0, z: 0 w: 1 }and anorientationof{ x: 0, y: 0, z: 0, w: 1 }is known as an identity transform .To multiply two
XRRigidTransforms , B and A in a Realm realm , the UA MUST perform the following steps:-
Let result be a new
XRRigidTransformobject in realm . -
Set result ’s
matrixto a newFloat32Arrayin realm , the result of premultiplying B ’smatrixfrom the left onto A ’smatrix. -
Set result ’s
orientationto a newDOMPointReadOnlyin realm , the quaternion that describes the rotation indicated by the top left 3x3 sub-matrix of result ’smatrix. -
Set result ’s
positionto a newDOMPointReadOnlyin realm , the vector given by the fourth column of result ’smatrix. -
Return result .
result is a transform from A ’s source space to B ’s destination space.
Note: This is equivalent to constructing an
XRRigidTransformwhoseorientationis the composition of the orientation of A and B , and whosepositionis equal to A ’spositionrotated by B ’sorientation, added to B ’sposition.9. Pose
9.1. XRPose
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRPosedescribes a position and orientation in space relative to anXRSpace.[
SecureContext ,Exposed =Window ]interface { [XRPose SameObject ]readonly attribute XRRigidTransform transform ;readonly attribute boolean emulatedPosition ; };In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
transformattribute describes the position and orientation relative to the baseXRSpace.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
emulatedPositionattribute isfalsewhen thetransformrepresents an actively tracked 6DoF pose based on sensor readings, ortrueif itspositionvalue includes a computed offset , such as that provided by a neck or arm model. Estimated floor level s MUST NOT be considered when determining if anXRPoseincludes a computed offset .9.2. XRViewerPose
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRViewerPoseis anXRPosedescribing the state of a viewer of the XR scene as tracked by the XR device . A viewer may represent a tracked piece of hardware, the observed position of a users head relative to the hardware, or some other means of computing a series of viewpoints into the XR scene.XRViewerPoses can only be queried relative to anXRReferenceSpace. It provides, in addition to theXRPosevalues, an array of view s which include rigid transforms to indicate the viewpoint and projection matrices. These values should be used by the application when rendering a frame of an XR scene.[
SecureContext ,Exposed =Window ]interface :XRViewerPose XRPose { [SameObject ]readonly attribute FrozenArray <XRView >views ; };In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
viewsarray is a sequence ofXRViews describing the viewpoints of the XR scene, relative to theXRReferenceSpacetheXRViewerPosewas queried with. Every view of the XR scene in the array must be rendered in order to display correctly on the XR device . EachXRViewincludes rigid transforms to indicate the viewpoint and projection matrices, and can be used to queryXRViewports from layers when needed.Note: The
XRViewerPose'stransformcan be used to position graphical representations of the viewer for spectator views of the scene or multi-user interaction.10. Input
10.1. XRInputSource
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRInputSourcerepresents an XR input source , which is any input mechanism which allows the user to perform targeted actions in the same virtual space as the viewer . Example XR input source s include, but are not limited to, handheld controllers, optically tracked hands, and gaze-based input methods that operate on the viewer 's pose. Input mechanisms which are not explicitly associated with the XR device , such as traditional gamepads, mice, or keyboards SHOULD NOT be considered XR input source s.enum {XRHandedness ,"none" ,"left" };"right" enum {XRTargetRayMode "gaze" ,"tracked-pointer" ,"screen" }; [SecureContext ,Exposed =Window ]interface {XRInputSource readonly attribute XRHandedness handedness ;readonly attribute XRTargetRayMode targetRayMode ; [SameObject ]readonly attribute XRSpace targetRaySpace ; [SameObject ]readonly attribute XRSpace ?gripSpace ; [SameObject ]readonly attribute FrozenArray <DOMString >profiles ; };Note: The
XRInputSourceinterface is also extended by the WebXR Gamepads ModuleIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
handednessattribute describes which hand the XR input source is associated with, if any. Input sources with no natural handedness (such as headset-mounted controls) or for which the handedness is not currently known MUST set this attribute"none".In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
targetRayModeattribute describes the method used to produce the target ray, and indicates how the application should present the target ray to the user if desired.-
gazeindicates the target ray will originate at the viewer and follow the direction it is facing. (This is commonly referred to as a "gaze input" device in the context of head-mounted displays.) -
tracked-pointerindicates that the target ray originates from either a handheld device or other hand-tracking mechanism and represents that the user is using their hands or the held device for pointing. The orientation of the target ray relative to the tracked object MUST follow platform-specific ergonomics guidelines when available. In the absence of platform-specific guidance, the target ray SHOULD point in the same direction as the user’s index finger if it was outstretched. -
screenindicates that the input source was an interaction with the canvas element associated with an inline session’s output context, such as a mouse click or touch event.
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
targetRaySpaceattribute is anXRSpacethat has a native origin tracking the position and orientation of the preferred pointing ray of theXRInputSource(along its -Z axis), as defined by thetargetRayMode.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
gripSpaceattribute is anXRSpacethat has a native origin tracking to the pose that should be used to render virtual objects such that they appear to be held in the user’s hand. If the user were to hold a straight rod, thisXRSpaceplaces the native origin at the centroid of their curled fingers and where the-Zaxis points along the length of the rod towards their thumb. TheXaxis is perpendicular to the back of the hand being described, with back of the users right hand pointing towards+Xand the back of the user’s left hand pointing towards-X. TheYaxis is implied by the relationship between theXandZaxis, with+Yroughly pointing in the direction of the user’s arm.The
gripSpaceMUST benullif the input source isn’t inherently trackable such as for input sources with atargetRayModeof"gaze"or"screen".In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
profilesattribute is a list of input profile name s indicating both the prefered visual representation and behavior of the input source.An input profile name is an ASCII lowercase
DOMStringcontaining no spaces, with separate words concatenated with a hyphen (-) character. A descriptive name should be chosen, using the prefered verbiage of the device vendor when possible. If the platform provides an appropriate identifier, such as a USB vendor and product ID, it MAY be used. Values that uniquely identify a single device, such as serial numbers, MUST NOT be used. The input profile name MUST NOT contain an indication of device handedness. If multiple user agents expose the same device, they SHOULD make an effort to report the same input profile name . The WebXR Input Profiles Registry is the recommended location for managing input profile name s.Profiles are given in descending order of specificity. Any input profile name s given after the first entry in the list should provide fallback values that represent alternative representations of the device. This may include a more generic or prior version of the device, a more widely recognized device that is sufficiently similar, or a broad description of the device type (such as "generic-trigger-touchpad"). If multiple profiles are given, the layouts they describe must all represent a superset or subset of every other profile in the list.
If the
XRSession's mode is"inline",profilesMUST be an empty list.The user agent MAY choose to only report an appropriate generic input profile name s or an empty list at its discretion. Some scenarios where this would be appropriate are if the input device cannot be reliably identified, no known input profiles match the input device, or the user agent wishes to mask the input device being used.
For example, the Samsung HMD Odyssey’s controller is a design variant of the standard Windows Mixed Reality controller. Both controllers share the same input layout. As a result, the
profilesfor a Samsung HMD Odyssey controller could be:["samsung-odyssey", "microsoft-mixed-reality", "generic-trigger-squeeze-touchpad-thumbstick"]. The appearance of the controller is most precisely communicated by the first profile in the list, with the second profile describing an acceptable substitute, and the last profile a generic fallback that describes the device in the roughest sense. (It’s a controller with a trigger, squeeze button, touchpad and thumbstick.)
Similarly, the Valve Index controller is backwards compatible with the HTC Vive controller, but the Index controller has additional buttons and axes. As a result, theprofilesfor the Valve Index controller could be:["valve-index", "htc-vive", "generic-trigger-squeeze-touchpad-thumbstick"]. In this case the input layout described by the"valve-index"profile is a superset of the layout described by the"htc-vive"profile. Also, the"valve-index"profile indicates the precise appearance of the controller, while the"htc-vive"controller has a significantly different appearance. In this case the UA would have deemed that difference acceptable. And as in the first example, the last profile is a generic fallback.
(Exact strings are examples only. Actual profile names are managed in the WebXR Input Profiles Registry .)Note:
XRInputSources in anXRSession'sinputSourcesarray are "live". As such values within them are updated in-place. This means that it doesn’t work to save a reference to anXRInputSource's attribute on one frame and compare it to the same attribute in a subsequent frame to test for state changes, because they will be the same object. Therefore developers that wish to compare input state from frame to frame should copy the content of the state in question.An XR input source is a primary input source if it supports a primary action . The primary action is a platform-specific action that, when engaged, produces
selectstart,selectend, andselectevents. Examples of possible primary action s are pressing a trigger, touchpad, or button, speaking a command, or making a hand gesture. If the platform guidelines define a recommended primary input then it should be used as the primary action , otherwise the user agent is free to select one. The device MUST support at least one primary input source .An XR input source is an auxiliary input source if it does not support a primary action , for example transient input sources associated with secondary screen touches on a multitouch device.
When an XR input source source for
XRSessionsession begins its primary action the UA MUST run the following steps:-
Let frame be a new
XRFramein the relevant realm of session withsessionsession with time being the time the action occurred. -
Queue a task to fire an input source event with name
selectstart, frame frame , and source source .
When an XR input source source for
XRSessionsession ends its primary action the UA MUST run the following steps:-
Let frame be a new
XRFramein the relevant realm of session withsessionsession with time being the time the action occurred. -
Queue a task to perform the following steps:
-
Fire an input source event with name
select, frame frame , and source source . -
Fire an input source event with name
selectend, frame frame , and source source .
-
Each XR input source MAY define a primary squeeze action . The primary squeeze action is a platform-specific action that, when engaged, produces
squeezestart,squeezeend, andsqueezeevents. The primary squeeze action should be used for actions roughly mapping to squeezing or grabbing. Examples of possible primary squeeze action s are pressing a grip trigger or making a grabbing hand gesture. If the platform guidelines define a recommended primary squeeze action then it should be used as the primary squeeze action , otherwise the user agent MAY select one.When an XR input source source for
XRSessionsession begins its primary squeeze action the UA MUST run the following steps:-
Let frame be a new
XRFramein the relevant realm of session withsessionsession with time being the time the action occurred. -
Queue a task to fire an input source event with name
squeezestart, frame frame , and source source .
When an XR input source source for
XRSessionsession ends its primary squeeze action the UA MUST run the following steps:-
Let frame be a new
XRFramein the relevant realm of session withsessionsession with time being the time the action occurred. -
Queue a task to perform the following steps:
-
Fire an input source event with name
squeeze, frame frame , and source source . -
Fire an input source event with name
squeezeend, frame frame , and source source .
-
Sometimes platform-specific behavior can result in a primary action or primary squeeze action being interrupted or cancelled. For example, a XR input source may be removed from the XR device after the primary action or primary squeeze action is started but before it ends.
When an XR input source source for
XRSessionsession has its primary action cancelled the UA MUST run the following steps:-
Let frame be a new
XRFramein the relevant realm of session withsessionsession with time being the time the action occurred. -
Queue a task to fire an input source event an
XRInputSourceEventwith nameselectend, frame frame , and source source .
When an XR input source source for
XRSessionsession has its primary squeeze action cancelled the UA MUST run the following steps:-
Let frame be a new
XRFramein the relevant realm of session withsessionsession with time being the time the action occurred. -
Queue a task to fire an input source event an
XRInputSourceEventwith namesqueezeend, frame frame , and source source .
10.2. Transient input
Some XR device s may support transient input sources , where the XR input source is only meaningful while performing a transient action , either the primary action for a primary input source , or a device-specific auxiliary action for an auxiliary input source . An example would be mouse, touch, or stylus input against an
"inline"XRSession, which MUST produce a transientXRInputSourcewith atargetRayModeset toscreen, treated as a primary action for the primary pointer , and as a non-primary auxiliary action for a non-primary pointer. Transient input sources are only present in the session’s list of active XR input sources for the duration of the transient action .Transient input sources follow the following sequence when handling transient actions instead of the algorithms for non-transient primary actions :
When a transient input source source for
XRSessionsession begins its transient action the UA MUST run the following steps:-
Let frame be a new
XRFramein the relevant realm of session withsessionsession for the time the action occurred. -
Queue a task to perform the following steps:
-
Fire any
"pointerdown"events produced by the XR input source 's action, if necessary. -
Add the XR input source to the list of active XR input sources .
-
If the transient action is a primary action , fire an input source event with name
selectstart, frame frame , and source source .
-
When a transient input source source for
XRSessionsession ends its transient action the UA MUST run the following steps:-
Let frame be a new
XRFramein the relevant realm of session withsessionsession for the time the action occurred. -
Queue a task to perform the following steps:
-
If the transient action is a primary action , fire an input source event with name
select, frame frame , and source source . -
Fire any
"click"events produced by the XR input source 's action, if necessary. -
If the transient action is a primary action , fire an input source event with name
selectend, frame frame , and source source . -
Remove the XR input source from the list of active XR input sources .
-
Fire any
"pointerup"events produced by the XR input source 's action, if necessary.
-
When a transient input source source for
XRSessionsession has its transient action cancelled the UA MUST run the following steps:-
Let frame be a new
XRFramein the relevant realm of session withsessionsession for the time the action occurred. -
Queue a task to perform the following steps:
-
If the transient action is a primary action , fire an input source event with name
selectend, frame frame , and source source . -
Remove the XR input source from the list of active XR input sources .
-
Fire any
"pointerup"events produced by the XR input source 's action, if necessary.
-
10.3. XRInputSourceArray
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRInputSourceArrayrepresents a list ofXRInputSources. It is used in favor of a frozen array type when the contents of the list are expected to change over time, such as with theXRSessioninputSourcesattribute.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile None[
SecureContext ,Exposed =Window ]interface {XRInputSourceArray iterable <XRInputSource >;readonly attribute unsigned long length ;getter XRInputSource (unsigned long ); };index In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
lengthattribute ofXRInputSourceArrayindicates how manyXRInputSources are contained within theXRInputSourceArray.The indexed property getter of
XRInputSourceArrayretrieves theXRInputSourceat the provided index.11. Layers
Note: While this specification only defines the
XRWebGLLayerlayer, future extensions to the spec are expected to add additional layer types and the image sources that they draw from.11.1. XRLayer
[
SecureContext ,Exposed =Window ]interface :XRLayer EventTarget {};XRLayeris the base class forXRWebGLLayerand other layer types introduced by future extensions.11.2. XRWebGLLayer
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneAn
XRWebGLLayeris a layer which provides a WebGL framebuffer to render into, enabling hardware accelerated rendering of 3D graphics to be presented on the XR device .In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView 79+ Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView 79+ Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView 79+ Samsung Internet 11.2+ Opera Mobile NoneXRWebGLLayerInit/framebufferScaleFactor
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView 79+ Samsung Internet 11.2+ Opera Mobile NoneXRWebGLLayerInit/ignoreDepthValues
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView 79+ Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView 79+ Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView 79+ Samsung Internet 11.2+ Opera Mobile Nonetypedef (WebGLRenderingContext or WebGL2RenderingContext );XRWebGLRenderingContext dictionary {XRWebGLLayerInit boolean =antialias true ;boolean =depth true ;boolean =stencil false ;boolean =alpha true ;boolean =ignoreDepthValues false ;double = 1.0; }; [framebufferScaleFactor SecureContext ,Exposed =Window ]interface :XRWebGLLayer XRLayer {constructor (XRSession ,session XRWebGLRenderingContext ,context optional XRWebGLLayerInit = {}); // AttributeslayerInit readonly attribute boolean antialias ;readonly attribute boolean ignoreDepthValues ; [SameObject ]readonly attribute WebGLFramebuffer ?framebuffer ;readonly attribute unsigned long framebufferWidth ;readonly attribute unsigned long framebufferHeight ; // MethodsXRViewport ?getViewport (XRView ); // Static Methodsview static double getNativeFramebufferScaleFactor (XRSession ); };session Each
XRWebGLLayerhas a context object, initiallynull, which is an instance of either aWebGLRenderingContextor aWebGL2RenderingContext.Each
XRWebGLLayerhas an associated session , which is theXRSessionit was created with.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
XRWebGLLayer( session , context , layerInit )constructor MUST perform the following steps when invoked:-
Let layer be a new
XRWebGLLayerin the relevant realm of session . -
If session ’s ended value is
true, throw anInvalidStateErrorand abort these steps. -
If context is lost, throw an
InvalidStateErrorand abort these steps. -
If session is an immersive session and context ’s XR compatible boolean is
false, throw anInvalidStateErrorand abort these steps. -
Initialize layer ’s context to context .
-
Initialize layer ’s session to session .
-
Initialize layer ’s
ignoreDepthValuesas follows:-
If
layerInit
’s
ignoreDepthValuesvalue isfalseand the XR Compositor will make use of depth values: -
Initialize layer ’s
ignoreDepthValuestofalse. - Otherwise:
-
Initialize layer ’s
ignoreDepthValuestotrue.
-
If
layerInit
’s
-
Initialize layer ’s composition disabled boolean as follows:
- If session is an inline session :
-
Initialize layer ’s composition disabled to
true. - Otherwise:
-
Initialize layer ’s composition disabled boolean to
false.
-
-
If
layer
’s
composition
disabled
boolean
is
false: -
-
Initialize layer ’s
antialiasto layerInit ’santialiasvalue. -
Let scaleFactor be layerInit ’s
framebufferScaleFactor. -
The user-agent MAY choose to clamp or round scaleFactor as it sees fit here, for example if it wishes to fit the buffer dimensions into a power of two for performance reasons.
-
Let framebufferSize be the recommended WebGL framebuffer resolution with width and height separately multiplied by scaleFactor .
-
Initialize layer ’s
framebufferto a newWebGLFramebufferin the relevant realm of context , which is an opaque framebuffer with the dimensions framebufferSize created with context , session initialized to session , and layerInit ’sdepth,stencil, andalphavalues. -
Allocate and initialize resources compatible with session ’s XR device , including GPU accessible memory buffers, as required to support the compositing of layer .
-
If layer ’s resources were unable to be created for any reason, throw an
OperationErrorand abort these steps.
-
- Otherwise:
-
-
Initialize layer ’s
antialiasto layer ’scontext's actual context parametersantialiasvalue. -
Initialize layer ’s
framebuffertonull.
-
-
If
layer
’s
composition
disabled
boolean
is
-
Return layer .
Note: If an
XRWebGLLayer's composition disabled boolean is set totrueall values on theXRWebGLLayerInitobject are ignored, since theWebGLRenderingContext's default framebuffer was already allocated using the context’s actual context parameters and cannot be overridden.The
contextattribute is theWebGLRenderingContexttheXRWebGLLayerwas created with.Each
XRWebGLLayerhas a composition disabled boolean which is initially set tofalse. If set totrueit indicates that theXRWebGLLayerMUST NOT allocate its ownWebGLFramebuffer, and all properties of theXRWebGLLayerthat reflectframebufferproperties MUST instead reflect the properties of the context 's default framebuffer.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
framebufferattribute of anXRWebGLLayeris an instance of aWebGLFramebufferwhich has been marked as opaque if composition disabled isfalse, andnullotherwise. Theframebuffersize cannot be adjusted by the developer after theXRWebGLLayerhas been created.An opaque framebuffer functions identically to a standard
WebGLFramebufferwith the following changes that make it behave more like the default framebuffer :-
An opaque framebuffer MAY support antialiasing, even in WebGL 1.0.
-
An opaque framebuffer 's attachments cannot be inspected or changed. Calling
framebufferTexture2D,framebufferRenderbuffer,deleteFramebuffer, orgetFramebufferAttachmentParameterwith an opaque framebuffer MUST generate anINVALID_OPERATIONerror. -
An opaque framebuffer has a related session , which is the
XRSessionit was created for. -
An opaque framebuffer is considered incomplete outside of a
requestAnimationFrame()callback. When not in therequestAnimationFrame()callback of its session , calls tocheckFramebufferStatusMUST generate aFRAMEBUFFER_UNSUPPORTEDerror and attempts to clear, draw to, or read from the opaque framebuffer MUST generate anINVALID_FRAMEBUFFER_OPERATIONerror. -
An opaque framebuffer initialized with
depthtruewill have an attached depth buffer. -
An opaque framebuffer initialized with
stenciltruewill have an attached stencil buffer. -
An opaque framebuffer 's color buffer will have an alpha channel if and only if
alphaistrue. -
The XR Compositor will assume the opaque framebuffer contains colors with premultiplied alpha. This is true regardless of the
premultipliedAlphavalue set in thecontext's actual context parameters .
Note: User agents are required to respect
truevalues ofdepthandstencil, which is similar to WebGL’s behavior when creating a drawing bufferThe buffers attached to an opaque framebuffer MUST be cleared to the values in the table below when first created, or prior to the processing of each XR animation frame . This is identical to the behavior of the WebGL context’s default framebuffer . Opaque framebuffers will always be cleared regardless of the associated WebGL context’s
preserveDrawingBuffervalue.Buffer Clear Value Color (0, 0, 0, 0) Depth 1.0 Stencil 0 Note: Implementations may optimize away the required implicit clear operation of the opaque framebuffer as long as a guarantee can be made that the developer cannot gain access to buffer contents from another process. For instance, if the developer performs an explicit clear then the implicit clear is not needed.
When an
XRWebGLLayeris set as an immersive session 'sbaseLayerthe content of the opaque framebuffer is presented to the immersive XR device immediately after an XR animation frame completes, but only if at least one of the following has occurred since the previous XR animation frame :-
The immersive session 's
baseLayerwas changed. -
clear,drawArrays,drawElements, or any other rendering operation which similarly affects the framebuffer’s color values has been called while the opaque framebuffer is the currently bound framebuffer of theWebGLRenderingContextassociated with theXRWebGLLayer.
Before the opaque framebuffer is presented to the immersive XR device the user agent shall ensure that all rendering operations have been flushed to the opaque framebuffer .
Each
XRWebGLLayerhas a target framebuffer , which is theframebufferif composition disabled isfalse, and the context 's default framebuffer otherwise.XRWebGLLayer/framebufferHeight
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
framebufferWidthandframebufferHeightattributes return the width and height of the target framebuffer 's attachments, respectively.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
antialiasattribute istrueif the target framebuffer supports antialiasing using a technique of the UAs choosing, andfalseif no antialiasing will be performed.XRWebGLLayer/ignoreDepthValues
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
ignoreDepthValuesattribute, iftrue, indicates the XR Compositor MUST NOT make use of values in the depth buffer attachment when rendering. When the attribute isfalseit indicates that the content of the depth buffer attachment will be used by the XR Compositor and is expected to be representative of the scene rendered into the layer.Depth values stored in the buffer are expected to be between
0.0and1.0, with0.0representing the distance ofdepthNearand1.0representing the distance ofdepthFar, with intermediate values interpolated linearly. This is the default behavior of WebGL. (See documentation for the depthRange function for additional details.))Note: Making the scene’s depth buffer available to the compositor allows some platforms to provide quality and comfort improvements such as improved reprojection.
Each
XRWebGLLayerMUST have a list of full-sized viewports which is a list containing one WebGL viewport for each view theXRSessionmay expose, including secondary views that are not currently active but may become active for the current session. The viewports MUST have awidthandheightgreater than0and MUST describe a rectangle that does not exceed the bounds of the target framebuffer . The viewports MUST NOT be overlapping. If composition disabled istrue, the list of full-sized viewports MUST contain a single WebGL viewport that covers the context 's entire default framebuffer.Each
XRWebGLLayerMUST have a list of viewport objects which is a list containing oneXRViewportfor each active view theXRSessioncurrently exposes.getViewport()queries theXRViewportthe givenXRViewshould use when rendering to the layer.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
getViewport( view )method, when invoked on anXRWebGLLayerlayer , MUST run the following steps:-
Let session be view ’s session .
-
Let frame be session ’s animation frame .
-
If session is not equal to layer ’s session , throw an
InvalidStateErrorand abort these steps. -
If frame ’s active boolean is
false, throw anInvalidStateErrorand abort these steps. -
If view ’s frame time is not equal to frame ’s time , throw an
InvalidStateErrorand abort these steps. -
If the viewport modifiable flag is
trueand view ’s requested viewport scale is not equal to current viewport scale :-
In the list of viewport objects , set the
XRViewportassociated with view to theXRViewportresult of obtaining a scaled viewport from the list of full-sized viewports associated with view for session .
-
Set the view ’s viewport modifiable flag to false.
-
Let viewport be the
XRViewportfrom the list of viewport objects associated with view . -
Return viewport .
Note: The viewport modifiable flag is intentionally set to false even if there was no change to the current viewport scale . This ensures that
getViewport(view)calls always return consistent results within an animation frame for that view, so the first retrieved value is locked in for the remainder of the frame. If an application callsrequestViewportScale()aftergetViewport(), the requested value is only applied later whengetViewport()is called again in a future frame.Each
XRSessionMUST identify a native WebGL framebuffer resolution , which is the pixel resolution of a WebGL framebuffer required to match the physical pixel resolution of the XR device .The native WebGL framebuffer resolution for an
XRSessionsession is determined by running the following steps:-
If session ’s mode value is not
"inline", set the native WebGL framebuffer resolution to the resolution required to have a 1:1 ratio between the pixels of a framebuffer large enough to contain all of the session’sXRViews and the physical screen pixels in the area of the display under the highest magnification and abort these steps. If no method exists to determine the native resolution as described, the recommended WebGL framebuffer resolution MAY be used. -
If session ’s mode value is
"inline", set the native WebGL framebuffer resolution to the size of the session ’srenderState's output canvas in physical display pixels and reevaluate these steps every time the size of the canvas changes or the output canvas is changed.
Additionally, the
XRSessionMUST identify a recommended WebGL framebuffer resolution , which represents a best estimate of the WebGL framebuffer resolution large enough to contain all of the session’sXRViews that provides an average application a good balance between performance and quality. It MAY be smaller than, larger than, or equal to the native WebGL framebuffer resolution . New opaque framebuffer will be created with this resolution, with width and height each scaled by anyXRWebGLLayerInit'sframebufferScaleFactorprovided.Note: The user agent is free to use and method of its choosing to estimate the recommended WebGL framebuffer resolution . If there are platform-specific methods for querying a recommended size it is recommended that they be used, but not required. The scale factors used by
framebufferScaleFactorandgetNativeFramebufferScaleFactorapply to width and height separately, so a scale factor of two results in four times the overall pixel count. If the platform exposes an area-based render scale that’s based on pixel count, the user agent needs to take the square root of that to convert it to a WebXR scale factor.XRWebGLLayer/getNativeFramebufferScaleFactor
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
getNativeFramebufferScaleFactor( session )method, when invoked, MUST run the following steps:-
Let session be this .
-
If session ’s ended value is
true, return0.0and abort these steps. -
Return the value that the session ’s recommended WebGL framebuffer resolution width and height must each be multiplied by to yield the session ’s native WebGL framebuffer resolution .
11.3. WebGL Context Compatibility
In order for a WebGL context to be used as a source for immersive XR imagery it must be created on a compatible graphics adapter for the immersive XR device . What is considered a compatible graphics adapter is platform dependent, but is understood to mean that the graphics adapter can supply imagery to the immersive XR device without undue latency. If a WebGL context was not already created on the compatible graphics adapter , it typically must be re-created on the adapter in question before it can be used with an
XRWebGLLayer.Note: On an XR platform with a single GPU, it can safely be assumed that the GPU is compatible with the immersive XR device s advertised by the platform, and thus any hardware accelerated WebGL contexts are compatible as well. On PCs with both an integrated and discrete GPU the discrete GPU is often considered the compatible graphics adapter since it generally a higher performance chip. On desktop PCs with multiple graphics adapters installed, the one with the immersive XR device physically connected to it is likely to be considered the compatible graphics adapter .
Note:
"inline"sessions render using the same graphics adapter as canvases, and thus do not needxrCompatiblecontexts.partial dictionary WebGLContextAttributes {boolean =xrCompatible false ; };partial interface mixin WebGLRenderingContextBase { [NewObject ]Promise <undefined >makeXRCompatible (); };When a user agent implements this specification it MUST set a XR compatible boolean, initially set to
false, on everyWebGLRenderingContextBase. Once the XR compatible boolean is set totrue, the context can be used with layers for anyXRSessionrequested from the current immersive XR device .Note: This flag introduces slow synchronous behavior and is discouraged. Consider calling
makeXRCompatible()instead for an asynchronous solution.The XR compatible boolean can be set either at context creation time or after context creation, potentially incurring a context loss. To set the XR compatible boolean at context creation time, the
xrCompatiblecontext creation attribute must be set totruewhen requesting a WebGL context. If the requesting document’s origin is not allowed to use the "xr-spatial-tracking" permissions policy ,xrCompatiblehas no effect.The
xrCompatibleflag onWebGLContextAttributes, iftrue, affects context creation by requesting the user-agent create the WebGL context using a compatible graphics adapter for the immersive XR device . If the user agent succeeds in this, the created context’s XR compatible boolean will be set to true. To obtain the immersive XR device , ensure an immersive XR device is selected SHOULD be called.Note: Ensure an immersive XR device is selected needs to be run in parallel , which introduces slow synchronous behavior on the main thread. User-agents SHOULD print a warning to the console requesting that
makeXRCompatible()be used instead.The following code creates a WebGL context that is compatible with an immersive XR device and then uses it to create anXRWebGLLayer.function onXRSessionStarted( xrSession) { const glCanvas= document. createElement( "canvas" ); const gl= glCanvas. getContext( "webgl" , { xrCompatible: true }); loadWebGLResources(); xrSession. updateRenderState({ baseLayer: new XRWebGLLayer( xrSession, gl) }); } To set the XR compatible boolean after the context has been created, the
makeXRCompatible()method is used.Note: On some systems this flag may turn on a high powered discrete GPU, for example, or proxy all commands to an on-device GPU. If you are in a situation where you may or may not be using XR, it is suggested that you only call
makeXRCompatible()when you intend to start an immersive session .⚠ MDN WebGLRenderingContext/makeXRCompatible In only one current engine. Firefox None Safari None Chrome 79+ Opera None Edge 79+ Edge (Legacy) None IE None Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThemakeXRCompatible()method ensures theWebGLRenderingContextBaseis running on a compatible graphics adapter for the immersive XR device .When this method is invoked, the user agent MUST run the following steps:
-
If the requesting document’s origin is not allowed to use the "xr-spatial-tracking" permissions policy , resolve promise and return it. When the XR permissions policy is disabled, we wish to behave as if there is no XR device in this case, since
makeXRCompatible()is supposed to be a set-and-forget method. -
Let promise be a new Promise created in the Realm of this
WebGLRenderingContextBase. -
Let context be this .
-
Run the following steps in parallel :
-
Let device be the result of ensuring an immersive XR device is selected .
-
Set context ’s XR compatible boolean as follows:
- If context ’s WebGL context lost flag is set:
-
Queue a task to set context ’s XR compatible boolean to
falseand reject promise with anInvalidStateError. -
If
device
is
null: -
Queue a task to set context ’s XR compatible boolean to
falseand reject promise with anInvalidStateError. -
If
context
’s
XR
compatible
boolean
is
true: -
Queue a task to resolve promise .
- If context was created on a compatible graphics adapter for device :
-
Queue a task to set context ’s XR compatible boolean to
trueand resolve promise . - Otherwise:
-
Queue a task on the WebGL task source to perform the following steps:
-
Force context to be lost.
-
Handle the context loss as described by the WebGL specification:
-
Let canvas be the context ’s canvas .
-
If context ’s webgl context lost flag is set, abort these steps.
-
Set context ’s webgl context lost flag .
-
Set the invalidated flag of each
WebGLObjectinstance created by context . -
Disable all extensions except "WEBGL_lose_context".
-
Queue a task on the WebGL task source to perform the following steps:
-
Fire a WebGL context event e named "webglcontextlost" at canvas , with
statusMessageset to "". -
If e ’s canceled flag is not set, reject promise with an
AbortErrorand abort these steps. -
Run the following steps in parallel .
-
Await a restorable drawing buffer on a compatible graphics adapter for device .
-
Queue a task on the WebGL task source to perform the following steps:
-
Restore the context on a compatible graphics adapter for device .
-
Set context ’s XR compatible boolean to
true. -
Resolve promise .
-
-
-
-
-
-
-
Return promise .
Additionally, when any WebGL context is lost run the following steps prior to firing the "webglcontextlost" event:
-
Set the context’s XR compatible boolean to
false.
The following code creates anXRWebGLLayerfrom a pre-existing WebGL context.const glCanvas= document. createElement( "canvas" ); const gl= glCanvas. getContext( "webgl" ); loadWebGLResources(); glCanvas. addEventListener( "webglcontextlost" , ( event) => { // Indicates that the WebGL context can be restored. event. canceled= true ; }); glCanvas. addEventListener( "webglcontextrestored" , ( event) => { // WebGL resources need to be re-created after a context loss. loadWebGLResources(); }); asyncfunction onXRSessionStarted( xrSession) { // Make sure the canvas context we want to use is compatible with the device. // May trigger a context loss. await gl. makeXRCompatible(); xrSession. updateRenderState({ baseLayer: new XRWebGLLayer( xrSession, gl) }); } 12. Events
The task source for all tasks queued in this specification is the XR task source , unless otherwise specified.
12.1. XRSessionEvent
XRSessionEvents are fired to indicate changes to the state of anXRSession.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile None[
SecureContext ,Exposed =Window ]interface :XRSessionEvent Event {(constructor DOMString ,type XRSessionEventInit ); [eventInitDict SameObject ]readonly attribute XRSession session ; };dictionary :XRSessionEventInit EventInit {required XRSession ; };session In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
sessionattribute indicates theXRSessionthat generated the event.12.2. XRInputSourceEvent
XRInputSourceEvents are fired to indicate changes to the state of anXRInputSource.XRInputSourceEvent/XRInputSourceEvent
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile None[
SecureContext ,Exposed =Window ]interface :XRInputSourceEvent Event {(constructor DOMString ,type XRInputSourceEventInit ); [eventInitDict SameObject ]readonly attribute XRFrame frame ; [SameObject ]readonly attribute XRInputSource inputSource ; };dictionary :XRInputSourceEventInit EventInit {required XRFrame ;frame required XRInputSource ; };inputSource XRInputSourceEvent/inputSource
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
inputSourceattribute indicates theXRInputSourcethat generated this event.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
frameattribute is anXRFramethat corresponds with the time that the event took place. It may represent historical data.getViewerPose()MUST throw an exception when called onframe.When the user agent has to fire an input source event with name name ,
XRFrameframe , andXRInputSourcesource it MUST run the following steps:-
Create an
XRInputSourceEventevent withtypename ,frameframe , andinputSourcesource . -
Set frame ’s active boolean to
true. -
Apply frame updates for frame .
-
Set frame ’s active boolean to
false.
12.3. XRInputSourcesChangeEvent
XRInputSourcesChangeEvents are fired to indicate changes to theXRInputSources that are available to anXRSession.XRInputSourcesChangeEvent/XRInputSourcesChangeEvent
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile None[
SecureContext ,Exposed =Window ]interface :XRInputSourcesChangeEvent Event {(constructor DOMString ,type XRInputSourcesChangeEventInit ); [eventInitDict SameObject ]readonly attribute XRSession session ; [SameObject ]readonly attribute FrozenArray <XRInputSource >added ; [SameObject ]readonly attribute FrozenArray <XRInputSource >removed ; };dictionary :XRInputSourcesChangeEventInit EventInit {required XRSession ;session required FrozenArray <XRInputSource >;added required FrozenArray <XRInputSource >; };removed XRInputSourcesChangeEvent/session
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
sessionattribute indicates theXRSessionthat generated the event.XRInputSourcesChangeEvent/added
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
addedattribute is a list ofXRInputSources that were added to theXRSessionat the time of the event.XRInputSourcesChangeEvent/removed
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
removedattribute is a list ofXRInputSources that were removed from theXRSessionat the time of the event.12.4. XRReferenceSpaceEvent
XRReferenceSpaceEvents are fired to indicate changes to the state of anXRReferenceSpace.XRReferenceSpaceEvent/XRReferenceSpaceEvent
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneIn only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile None[
SecureContext ,Exposed =Window ]interface :XRReferenceSpaceEvent Event {(constructor DOMString ,type XRReferenceSpaceEventInit ); [eventInitDict SameObject ]readonly attribute XRReferenceSpace referenceSpace ; [SameObject ]readonly attribute XRRigidTransform ?transform ; };dictionary :XRReferenceSpaceEventInit EventInit {required XRReferenceSpace ;referenceSpace XRRigidTransform ?=transform null ; };XRReferenceSpaceEvent/referenceSpace
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
referenceSpaceattribute indicates theXRReferenceSpacethat generated this event.XRReferenceSpaceEvent/transform
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe
transformattribute describes the post-event position and orientation of thereferenceSpace's native origin in the pre-event coordinate system.12.5. Event Types
The user agent MUST provide the following new events. Registration for and firing of the events must follow the usual behavior of DOM4 Events.
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneThe user agent MUST fire a
devicechangeevent on theXRSystemobject to indicate that the availability of immersive XR device s has been changed unless the document’s origin is not allowed to use the "xr-spatial-tracking" permissions policy . The event MUST be of typeEvent.XRSession/visibilitychange_event
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneA user agent MUST dispatch a
visibilitychangeevent on anXRSessioneach time the visibility state of theXRSessionhas changed. The event MUST be of typeXRSessionEvent.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneA user agent MUST dispatch an
endevent on anXRSessionwhen the session ends, either by the application or the user agent. The event MUST be of typeXRSessionEvent.XRSession/inputsourceschange_event
In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneA user agent MUST dispatch an
inputsourceschangeevent on anXRSessionwhen the session’s list of active XR input sources has changed. The event MUST be of typeXRInputSourcesChangeEvent.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneA user agent MUST dispatch a
selectstartevent on anXRSessionwhen one of itsXRInputSources begins its primary action . The event MUST be of typeXRInputSourceEvent.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneA user agent MUST dispatch a
selectendevent on anXRSessionwhen one of itsXRInputSources ends its primary action or when anXRInputSourcethat has begun a primary action is disconnected. The event MUST be of typeXRInputSourceEvent.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneA user agent MUST dispatch a
selectevent on anXRSessionwhen one of itsXRInputSources has fully completed a primary action . The event MUST be of typeXRInputSourceEvent.A user agent MUST dispatch a
squeezestartevent on anXRSessionwhen one of itsXRInputSources begins its primary squeeze action . The event MUST be of typeXRInputSourceEvent.A user agent MUST dispatch a
squeezeendevent on anXRSessionwhen one of itsXRInputSources ends its primary squeeze action or when anXRInputSourcethat has begun a primary squeeze action is disconnected. The event MUST be of typeXRInputSourceEvent.A user agent MUST dispatch a
squeezeevent on anXRSessionwhen one of itsXRInputSources has fully completed a primary squeeze action . The event MUST be of typeXRInputSourceEvent.In only one current engine.
Firefox None Safari None Chrome 79+
Opera None Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet 11.2+ Opera Mobile NoneA user agent MUST dispatch a
resetevent on anXRReferenceSpacewhen discontinuities of the native origin or effective origin occur, i.e. there are significant changes in the origin’s position or orientation relative to the user’s environment. (For example: After user recalibration of their XR device or if the XR device automatically shifts its origin after losing and regaining tracking.) Aresetevent MUST also be dispatched when theboundsGeometrychanges for anXRBoundedReferenceSpace. Aresetevent MUST NOT be dispatched if the viewer 's pose experiences discontinuities but theXRReferenceSpace's origin physical mapping remains stable, such as when the viewer momentarily loses and regains tracking within the same tracking area. Aresetevent also MUST NOT be dispatched as anunboundedreference space makes small adjustments to its native origin over time to maintain space stability near the user, if a significant discontinuity has not occurred. The event MUST be of typeXRReferenceSpaceEvent, and MUST be dispatched prior to the execution of any XR animation frame s that make use of the new origin. Aresetevent MUST be dispatched on all offset reference spaces of a reference space that fires aresetevent, and theboundsGeometryof offsetXRBoundedReferenceSpaces should also be recomputed.Note: This does mean that the session needs to hold on to strong references to any
XRReferenceSpaces that haveresetlisteners.Note: Jumps in viewer position can be handled by the application by observing the
emulatedPositionboolean. If a jump in viewer position coincides withemulatedPositionswitching fromtruetofalse, it indicates that the viewer has regained tracking and their new position represents a correction from the previously emulated values. For experiences without a "teleportation" mechanic, where the viewer can move through the virtual world without moving physically, this is generally the application’s desired behavior. However, if an experience does provide a "teleportation" mechanic, it may be needlessly jarring to jump the viewer 's position back after tracking recovery. Instead, when such an application recovers tracking, it can simply resume the experience from the viewer 's current position in the virtual world by absorbing that sudden jump in position into its teleportation offset. To do so, the developer callsgetOffsetReferenceSpace()to create a replacement reference space with its effective origin adjusted by the amount that the viewer 's position jumped since the previous frame.13. Security, Privacy, and Comfort Considerations
The WebXR Device API provides powerful new features which bring with them several unique privacy, security, and comfort risks that user agents must take steps to mitigate.
13.1. Sensitive Information
In the context of XR, sensitive information includes, but is not limited to, user-configurable data such as interpupillary distance (IPD) and sensor-based data such as
XRPoses. All immersive sessions will expose some amount of sensitive data, due to the user’s pose being necessary to render anything. However, in some cases, the same sensitive information will also be exposed via"inline"sessions.13.2. User intention
User intent for a given action is a signal from the user that such an action was intentional and has their consent.
It is often necessary to be sure of user intent before exposing sensitive information or allowing actions with a significant effect on the user’s experience. This intent may be communicated or observed in a number of ways.
Note: A common way of determining user intent is by transient activation of a UI control, typically an "enter VR" button. Since activation is transient, the browsing context requesting an XR session must be an ancestor or a same origin-domain descendant of the context containing the UI control, and must recently have been the active document of the browsing context.
13.2.1. User activation
Transient activation MAY serve as an indication of user intent in some scenarios.13.2.2. Launching a web application
In some environments a page may be presented as an application, installed with the express intent of running immersive content. In that case launching a web application MAY also serve as an indication of user intent .13.2.3. Implicit and Explicit consent
A user agent MAY useimplicitImplicit consentbased,is when the user agent makes a judgement on the consent of a user without explicitly asking for it, for example, based on the install status of a web application or frequency and recency of visits. Given the sensitivity of XR data, caution is strongly advised when relying on implicit signals.It is often useful to getexplicitExplicit consentfromis when the userbefore exposing sensitive information .agent makes a judgement on the consent of a user based on having explicitly asked for it. When gathering explicituser consent,consent , user agents present an explanation of what is being requested and provide users the option to decline. Requests for user consent can be presented in many visual forms based on the features being protected and user agent choice. Install status of a web application MAY count as a signal of explicit consent provided some form of explicit consent is requested at install time.13.2.4. Duration of consent
It is recommended that once explicit consent is granted for a specific origin that this consent persist until the browsing context has ended. User agents may choose to lengthen or shorten this consent duration based upon implicit or explicit signals of user intent , but implementations are advised to exercise caution when deviating from this recommendation, particularly when relying on implicit signals. For example, it may be appropriate for a web application installed with the express intent of running immersive content to persist the user’s consent, but not for an installed web application where immersive content is a secondary feature.Regardless of how long the user agent chooses to persist the user’s consent, sensitive information MUST only be exposed by an
XRSessionwhich has not ended .13.3. Mid-session consent
There are multiple non-XR APIs which cause user agents to request explicit consent to use a feature. If the user agent will request the user’s consent while there is an active immersive session , the user agent MUST shut down the session prior to displaying the consent request to the user. If the user’s consent for the feature had been granted prior to the active immersive session being created the session does not need to be terminated.
Note: This limitation is to ensure that there is behavioral parity between all user agents until consensus is reached about how user agents should manage mid-session explicit consent . It is not expected to be a long term requirement.
13.4. Data adjustments
In some cases, security and privacy threats can be mitigated through data adjustment s such as throttling, quantizing, rounding, limiting, or otherwise manipulating the data reported from the XR device . This may sometimes be necessary to avoid fingerprinting, even in situations when user intent has been established. However, data adjustment mitigations MUST only be used in situations which would not result in user discomfort.
13.4.1. Throttling
Throttling is when sensitive information is reported at a lower frequency than otherwise possible. This mitigation has the potential to reduce a site’s ability to infer user intent, infer location, or perform user profiling. However, when not used appropriately throttling runs a significant risk of causing user discomfort. In addition, under many circumstances it may be inadequate to provide a complete mitigation.13.4.2. Rounding, quantization, and fuzzing
Rounding, quantization, and fuzzing are three categories of mitigations that modify the raw data that would otherwise be returned to the developer. Rounding decreases the precision of data by reducing the number of digits used to express it. Quantization constrains continuous data to instead report a discrete subset of values. Fuzzing is the introduction of slight, random errors into the the data. Collectively, these mitigations are useful to avoid fingerprinting, and are especially useful when doing so does not cause noticeable impact on user comfort.13.4.3. Limiting
Limiting is when data is reported only when it is within a specific range. For example, it is possible to comfortably limit reporting positional pose data when a user has moved beyond a specific distance away from an approved location. Care should be taken to ensure that the user experience is not negatively affected when employing this mitigation. It is often desirable to avoid a 'hard stop' at the end of a range as this may cause disruptive user experiences.13.5. Protected functionality
The sensitive information exposed by the API can be divided into categories that share threat profiles and necessary protections against those threats.
13.5.1. Immersiveness
Users must be in control of when immersive sessions are created because the creation causes invasive changes on a user’s machine. For example, starting an immersive session will engage the XR device sensors, take over access to the device’s display, and begin presentating immersive content which may terminate another application’s access to the XR hardware. It may also incur significant power or performance overhead on some systems or trigger the launching of a status tray or storefront.To determine if an immersive session request is allowed for a given global object the user agent MUST run the following steps:
-
If the request was not made while the global object has transient activation or when launching a web application , return
false -
If user intent to begin an immersive session is not well understood, either via explicit consent or implicit consent , return
false -
Return
true
Starting an
"inline"session does not implicitly carry the same requirements, though additional requirements may be imposed depending on the session’s requested features .To determine if an inline session request is allowed for a given global object the user agent MUST run the following steps:
-
If the session request contained any required features or optional features and the request was not made while the global object has transient activation or when launching a web application , return
false -
If the requesting document is not responsible , return
false -
Return
true
13.5.2. Poses
When based on sensor data,XRPoseandXRViewerPosewill expose sensitive information that may be misused in a number of ways, including input sniffing, gaze tracking, or fingerprinting.To determine if poses may be reported to an
XRSessionsession , the user agent MUST run the following steps:-
If session ’s relevant global object is not the current global object , return
false. -
If session ’s
visibilityStatein not"visible", returnfalse. -
Determine if the pose data can be returned as follows:
- If the pose data is known by the user agent to not expose fingerprintable sensor data
-
Return
true. - If data adjustments will be applied to the underlying sensor data to prevent fingerprinting or profiling
-
Return
true. - If user intent is well understood, either via explicit consent or implicit consent
-
Return
true. - Otherwise
-
Return
false.
Note: The method by which a user agent determines that poses do not expose fingerprintable data is left to the user agent’s discretion.
The primary difference between
XRViewerPoseandXRPoseis the inclusion ofXRViewinformation. When more than one view is present and the physical relationship between these views is configurable by the user, the relationship between these views is considered sensitive information as it can be used to fingerprint or profile the user.If the relationship between
XRViews could uniquely identify the XR device , then the user agent MUST anonymize theXRViewdata to prevent fingerprinting. The method of anonymization is at the discretion of the user agent.Note: Furthermore, if the relationship between
XRViews is affected by a user-configured interpupillary distance (IPD), then it is strongly recommended that the user agent require explicit consent during session creation, prior to reporting anyXRViewdata.13.5.3. Reference spaces
Depending on the reference spaces used, several different types of sensitive information may be exposed to the application.-
On devices which support 6DoF tracking,
"local"reference spaces may be used to perform gait analysis, allowing user profiling and fingerprinting. -
On devices which support 6DoF tracking,
"local-floor"reference spaces may be used to perform gait analysis, allowing user profiling and fingerprinting. In addition, because the"local-floor"reference spaces provide an established floor level, it may be possible for a site to infer the user’s height, allowing user profiling and fingerprinting. -
"bounded-floor"reference spaces, when sufficiently constrained in size, do not enable developers to determine geographic location. However, because the floor level is established and users are able to walk around, it may be possible for a site to infer the user’s height or perform gait analysis, allowing user profiling and fingerprinting. In addition, it may be possible perform fingerprinting using the bounds reported by a bounded reference space. -
"unbounded"reference spaces reveal the largest amount of spatial data and may result in user profiling and fingerprinting. For example, this data may enable determining user’s specific geographic location or to perform gait analysis.
As a result the various reference space types have restrictions placed on their creation to ensure the sensitive information expose is handled safely:
Most reference spaces require that user intent to use the reference space is well understood, either via explicit consent or implicit consent . See the feature requirements table for details.
Any group of
"local","local-floor", and"bounded-floor"reference spaces that are capable of being related to one another MUST share a common native origin ; This restriction only applies when the creation of"unbounded"reference spaces has been restricted.To determine if poses must be limited between two spaces, space and baseSpace , the user agent MUST run the following steps:
-
If either space or baseSpace are an
XRBoundedReferenceSpaceand the other space’s native origin 's falls further outside the native bounds geometry than a reasonable distance determined by the user agent, return true. -
If either space or baseSpace are an
XRReferenceSpacewith a type of"local"or"local-floor"and the distance between the spaces' native origin 's is greater than a reasonable distance determined by the user agent, returntrue. -
Return
false.
Note: The requirement for document visibility is based on [DEVICE-ORIENTATION] .
Note: Is is suggested that poses reported relative to a
"local"or"local-floor"reference space be limited to a distance of 15 meters from theXRReferenceSpace's native origin .Note: Is is suggested that poses reported relative to a
XRBoundedReferenceSpacebe limited to a distance of 1 meter outside theXRBoundedReferenceSpace's native bounds geometry .13.6. Trusted Environment
A Trusted UI is an interface presented by the User Agent that the user is able to interact with but the page cannot. The user agent MUST support showing trusted UI .
A trusted UI MUST have the following properties:
-
It must not be spoofable
-
It indicates where the request/content displayed originates from
-
If it relies on a shared secret with the user, this shared secret cannot be observed by a mixed reality capture (e.g. it may not be a gesture that can be seen by the camera)
-
It is consistent between immersive experiences in the same UA
Broadly speaking, there are two options for user agents who wish to support trusted UI . One option is trusted immersive UI , which is a trusted UI which does not exit immersive mode. Implementing trusted immersive UI can be challenging because
XRWebGLLayerbuffers fill the XR Device display and the User Agent does not typically "reserve" pixels for its own use. User agents are not required to support trusted immersive UI , they may instead temporarily pause/exit immersive mode and show non-immersive trusted UI to the user.Note: Examples of trusted UI include:-
The default 2D mode browser shown when not in immersive mode
-
A prompt shown within immersive mode which can only be interacted with via a reserved hardware button to prevent spoofing
-
Pausing the immersive session and showing some form of native system environment in which a prompt can be shown
The ability to read input information (head pose, input pose, etc) poses a risk to the integrity of trusted UI as the page may use this information to snoop on the choices made by the user while interacting with the trusted UI , including guessing keyboard input. To prevent this risk the user agent MUST set the visibility state of all
XRSessions toor"visible-blurred"when the user is interacting with trusted UI ( immersive or non-immersive) such as URL bars or system dialogs. Additionally, to prevent a malicious page from being able to monitor input on other pages the user agent MUST set theXRSession's visibility state toif the currently focused area does not belong to the document which created theXRSession.When choosing between using
or"visible-blurred"for a particular instance of trusted UI , the user agent MUST consider whether head pose information is a security risk. For example, trusted UI involving text input, especially password inputs, can potentially leak the typed text through the user’s head pose as they type. The user agent SHOULD also stop exposing any eye tracking-related information in such cases.The user agent MUST use trusted UI to show permissions prompts.
If the virtual environment does not consistently track the user’s head motion with low latency and at a high frame rate the user may become disoriented or physically ill. Since it is impossible to force pages to produce consistently performant and correct content the user agent MUST provide a tracked, trusted environment and an XR Compositor which runs asynchronously from page content. The compositor is responsible for compositing the trusted and untrusted content. If content is not performant, does not submit frames, or terminates unexpectedly the user agent should be able to continue presenting a responsive, trusted UI .
Additionally, page content has the ability to make users uncomfortable in ways not related to performance. Badly applied tracking, strobing colors, and content intended to offend, frighten, or intimidate are examples of content which may cause the user to want to quickly exit the XR experience. Removing the XR device in these cases may not always be a fast or practical option. To accommodate this the user agent MUST provide users with an action, such as pressing a reserved hardware button or performing a gesture, that escapes out of WebXR content and displays the user agent’s trusted UI .
13.7. Context Isolation
The trusted UI must be drawn by an independent rendering context whose state is isolated from any rendering contexts used by the page. (For example, any WebGL rendering contexts.) This is to prevent the page from corrupting the state of the trusted UI’s context, which may prevent it from properly rendering a tracked environment. It also prevents the possibility of the page being able to capture imagery from the trusted UI, which could lead to private information being leaked.
Also, to prevent CORS-related vulnerabilities each browsing context will see a new instance of objects returned by the API, such as
XRSession. Attributes such as the context set on anXRWebGLLayerwith one relevant realm should not be able to be read through anXRWebGLLayerwith a relevant realm that does not have the same origin . Similarly, methods invoked on the API MUST NOT cause an observable state change on other browsing contexts . For example: No method will be exposed that enables a system-level orientation reset, as this could be called repeatedly by a malicious page to prevent other pages from tracking properly. The user agent MUST, however, respect system-level orientation resets triggered by a user gesture or system menu.Note: this doesn’t apply to state changes that are caused by one browsing context entering immersive mode, acquiring a lock on the device, and potentially firing
devicechangeevents on other browsing contexts .13.8. Fingerprinting
Given that the API describes hardware available to the user and its capabilities it will inevitably provide additional surface area for fingerprinting. While it’s impossible to completely avoid this, user agents should take steps to mitigate the issue. This spec limits reporting of available hardware to only a single device at a time, which prevents using the rare cases of multiple headsets being connected as a fingerprinting signal. Also, the devices that are reported have no string identifiers and expose very little information about the devices capabilities until an XRSession is created, which requires additional protections when sensitive information will be exposed.
14. Integrations
14.1. Permissions Policy
Headers/Feature-Policy/xr-spatial-tracking
In only one current engine.
Firefox None Safari None Chrome 79+
Opera 66+ Edge 79+
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android 79+ Android WebView None Samsung Internet None Opera Mobile NoneThis specification defines a policy-controlled feature that controls whether any
XRSessionthat requires the use of spatial tracking may be returned byrequestSession(), and whether support for session modes that require spatial tracking may be indicated by eitherisSessionSupported()ordevicechangeevents on thenavigator.xrobject.The feature identifier for this feature is
"xr-spatial-tracking".The default allowlist for this feature is
["self"].Note: If the document’s origin is not allowed to use the
"xr-spatial-tracking"permissions policy any immersive sessions will be blocked, because all immersive sessions require some use of spatial tracking. Inline sessions will still be allowed, but restricted to only using the"viewer"XRReferenceSpace.14.2. Permissions API Integration
The [permissions] API provides a uniform way for websites to request permissions from users and query which permissions they have been granted.
The
"xr"powerful feature ’s permission-related algorithms and types are defined as follows:- permission descriptor type
-
In no current engines.
Firefox None Safari None Chrome None
Opera None Edge None
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android None Android WebView None Samsung Internet None Opera Mobile NoneXRPermissionDescriptor/optionalFeatures
In no current engines.
Firefox None Safari None Chrome None
Opera None Edge None
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android None Android WebView None Samsung Internet None Opera Mobile NoneXRPermissionDescriptor/requiredFeatures
In no current engines.
Firefox None Safari None Chrome None
Opera None Edge None
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android None Android WebView None Samsung Internet None Opera Mobile NoneIn no current engines.
Firefox None Safari None Chrome None
Opera None Edge None
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android None Android WebView None Samsung Internet None Opera Mobile None{ ;dictionary :XRPermissionDescriptor PermissionDescriptor {XRSessionMode ;mode sequence <any >;requiredFeatures sequence <any >; };optionalFeatures nameforXRPermissionDescriptoris"xr". - permission result type
-
In no current engines.
Firefox None Safari None Chrome None
Opera None Edge None
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android None Android WebView None Samsung Internet None Opera Mobile NoneIn no current engines.
Firefox None Safari None Chrome None
Opera None Edge None
Edge (Legacy) None IE None
Firefox for Android None iOS Safari None Chrome for Android None Android WebView None Samsung Internet None Opera Mobile None[
Exposed =Window ]interface :XRPermissionStatus PermissionStatus {attribute FrozenArray <any >; };granted - permission request algorithm
-
To request the "xr" permission with an
XRPermissionDescriptordescriptor and aXRPermissionStatusstatus , the UA MUST run the following steps:-
Set status ’s
grantedto an emptyFrozenArray. -
Let requiredFeatures be descriptor ’s
requiredFeatures. -
Let optionalFeatures be descriptor ’s
optionalFeatures. -
Let device be the result of obtaining the current device for mode , requiredFeatures , and optionalFeatures .
-
Let result be the result of resolving the requested features given requiredFeatures , optionalFeatures , and
mode. -
If result is
null, run the following steps: -
Let ( consentRequired , consentOptional , granted ) be the fields of result .
-
The user agent MAY at this point ask the user’s permission for the calling algorithm to use any of the features in consentRequired and consentOptional . The results of these prompts should be included when determining if there is a clear signal of user intent for enabling these features.
-
For each feature in consentRequired perform the following steps:
-
The user agent MAY at this point ask the user’s permission for the calling algorithm to use feature . The results of these prompts should be included when determining if there is a clear signal of user intent to enable feature .
-
If a clear signal of user intent to enable feature has not been determined, set status ’s
stateto"denied"and abort these steps. -
If feature is not in granted , append feature to granted .
-
-
For each feature in consentOptional perform the following steps:
-
The user agent MAY at this point ask the user’s permission for the calling algorithm to use feature . The results of these prompts should be included when determining if there is a clear signal of user intent to enable feature .
-
If a clear signal of user intent to enable feature has not been determined, continue to the next entry.
-
If feature is not in granted , append feature to granted .
-
-
Set status ’s
grantedto granted . -
Set device ’s list of enabled features for mode to granted .
Note: The user agent has the freedom to batch up permissions prompts for all requested features when gauging if there is a clear signal of user intent , but it is also allowed to show them one at a time.
-
- permission query algorithm
-
To query the "xr" permission with an
XRPermissionDescriptordescriptor and aXRPermissionStatusstatus , the UA MUST run the following steps:-
Set status ’s
stateto descriptor ’s permission state . -
If status ’s
stateis"denied", set status ’sgrantedto an emptyFrozenArrayand abort these steps. -
Let result be the result of resolving the requested features given descriptor ’s
requiredFeatures,optionalFeatures, andmode. -
If result is
null, run the following steps:-
Set status ’s
grantedto an emptyFrozenArray. -
Abort these steps.
-
-
Let ( consentRequired , consentOptional , granted ) be the fields of result .
-
Set status ’s
grantedto granted . -
If consentRequired is empty and consentOptional is empty , set status ’s
stateto"granted"and abort these steps
-
To resolve the requested features given requiredFeatures and optionalFeatures for an
XRSessionModemode , the user agent MUST run the following steps:-
Let device be the result of obtaining the current device for mode , requiredFeatures , and optionalFeatures .
-
Let granted be a list of
DOMStringinitialized to device ’s list of enabled features for mode . -
If device is
nullor device ’s list of supported modes does not contain mode , run the following steps:-
Return the tuple ( consentRequired , consentOptional , granted )
-
-
Add every feature descriptor in the default features table associated with mode to the indicated feature list if it is not already present.
-
For each feature in requiredFeatures perform the following steps:
-
If the feature is
null, continue to the next entry. -
If feature is not a valid feature descriptor , perform the following steps:
-
If s is not a valid feature descriptor or is
undefined, returnnull. -
Set feature to s .
-
If feature is already in granted , continue to the next entry.
-
If the requesting document’s origin is not allowed to use any permissions policy required by feature as indicated by the feature requirements table, return
null. -
If session ’s XR device is not capable of supporting the functionality described by feature or the user agent has otherwise determined to reject the feature, return
null. -
If the functionality described by feature requires explicit consent , append it to consentRequired .
-
Else append feature to granted .
-
-
For each feature in optionalFeatures perform the following steps:
-
If the feature is
null, continue to the next entry. -
If feature is not a valid feature descriptor , perform the following steps:
-
If s is not a valid feature descriptor or is
undefined, continue to the next entry. -
Set feature to s .
-
If feature is already in granted , continue to the next entry.
-
If the requesting document’s origin is not allowed to use any permissions policy required by feature as indicated by the feature requirements table, continue to the next entry.
-
If session ’s XR device is not capable of supporting the functionality described by feature or the user agent has otherwise determined to reject the feature, continue to the next entry.
-
If the functionality described by feature requires explicit consent , append it to consentOptional .
-
Else append feature to granted .
-
-
Return the tuple
(|consentRequired|, |consentOptional|, |granted|)
15. Acknowledgements
Thank you to the following individuals for their contributions the WebXR Device API specification:
-
Sebastian Sylvan (Formerly Microsoft )
-
John Pallett ( Google )
-
Chris Wilson ( Google )
-
Ningxin Hu ( Intel )
-
Klaus Weidner ( Google )
-
Alan Jeffrey ( Mozilla )
-
Diane Hosfelt ( Mozilla )
-
Kyungsuk ( AT&T Xandr )
-
David Dorwin ( Google )
-
Mounir Lamouri ( Google )
And a special thanks to Vladimir Vukicevic ( Unity ) for kick-starting this whole adventure!