1/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2/*
3 * WebXR Device API
4 * W3C Working Draft, 10 October 2019
5 * The origin of this IDL file is:
6 * https://www.w3.org/TR/2019/WD-webxr-20191010/
7 */
8
9partial interface Navigator {
10  [SecureContext, SameObject] readonly attribute XR xr;
11};
12
13[SecureContext, Exposed=Window] interface XR : EventTarget {
14  // Methods
15  Promise<boolean> isSessionSupported(XRSessionMode mode);
16  [NewObject] Promise<XRSession> requestSession(XRSessionMode mode, optional XRSessionInit options = {});
17
18  // Events
19  attribute EventHandler ondevicechange;
20};
21
22enum XRSessionMode {
23  "inline",
24  "immersive-vr"
25};
26
27dictionary XRSessionInit {
28  sequence<any> requiredFeatures;
29  sequence<any> optionalFeatures;
30};
31
32enum XRVisibilityState {
33  "visible",
34  "visible-blurred",
35  "hidden",
36};
37
38[SecureContext, Exposed=Window] interface XRSession : EventTarget {
39  // Attributes
40  readonly attribute XRVisibilityState visibilityState;
41  [SameObject] readonly attribute XRRenderState renderState;
42  [SameObject] readonly attribute XRInputSourceArray inputSources;
43
44  // Methods
45  undefined updateRenderState(optional XRRenderStateInit state = {});
46  [NewObject] Promise<XRReferenceSpace> requestReferenceSpace(XRReferenceSpaceType type);
47
48  long requestAnimationFrame(XRFrameRequestCallback callback);
49  undefined cancelAnimationFrame(long handle);
50
51  Promise<undefined> end();
52
53  // Events
54  attribute EventHandler onend;
55  attribute EventHandler onselect;
56  attribute EventHandler oninputsourceschange;
57  attribute EventHandler onselectstart;
58  attribute EventHandler onselectend;
59  attribute EventHandler onvisibilitychange;
60};
61
62dictionary XRRenderStateInit {
63  double depthNear;
64  double depthFar;
65  double inlineVerticalFieldOfView;
66  XRWebGLLayer? baseLayer;
67};
68
69[SecureContext, Exposed=Window] interface XRRenderState {
70  readonly attribute double depthNear;
71  readonly attribute double depthFar;
72  readonly attribute double? inlineVerticalFieldOfView;
73  readonly attribute XRWebGLLayer? baseLayer;
74};
75
76callback XRFrameRequestCallback = undefined (DOMHighResTimeStamp time, XRFrame frame);
77
78[SecureContext, Exposed=Window] interface XRFrame {
79  [SameObject] readonly attribute XRSession session;
80
81  XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace);
82  XRPose? getPose(XRSpace space, XRSpace baseSpace);
83};
84
85[SecureContext, Exposed=Window] interface XRSpace : EventTarget {
86
87};
88
89enum XRReferenceSpaceType {
90  "viewer",
91  "local",
92  "local-floor",
93  "bounded-floor",
94  "unbounded"
95};
96
97[SecureContext, Exposed=Window]
98interface XRReferenceSpace : XRSpace {
99  [NewObject] XRReferenceSpace getOffsetReferenceSpace(XRRigidTransform originOffset);
100
101  attribute EventHandler onreset;
102};
103
104[SecureContext, Exposed=Window]
105interface XRBoundedReferenceSpace : XRReferenceSpace {
106  // TODO: Re-enable FrozenArray when supported. See https://bugzilla.mozilla.org/show_bug.cgi?id=1236777
107  //readonly attribute FrozenArray<DOMPointReadOnly> boundsGeometry;
108  [Frozen, Cached, Pure]
109  readonly attribute sequence<DOMPointReadOnly> boundsGeometry;
110};
111
112enum XREye {
113  "none",
114  "left",
115  "right"
116};
117
118[SecureContext, Exposed=Window] interface XRView {
119  readonly attribute XREye eye;
120  readonly attribute Float32Array projectionMatrix;
121  [SameObject] readonly attribute XRRigidTransform transform;
122};
123
124[SecureContext, Exposed=Window] interface XRViewport {
125  readonly attribute long x;
126  readonly attribute long y;
127  readonly attribute long width;
128  readonly attribute long height;
129};
130
131[SecureContext, Exposed=Window]
132interface XRRigidTransform {
133  constructor(optional DOMPointInit position = {}, optional DOMPointInit orientation = {});
134  [SameObject] readonly attribute DOMPointReadOnly position;
135  [SameObject] readonly attribute DOMPointReadOnly orientation;
136  readonly attribute Float32Array matrix;
137  [SameObject] readonly attribute XRRigidTransform inverse;
138};
139
140[SecureContext, Exposed=Window] interface XRPose {
141  [SameObject] readonly attribute XRRigidTransform transform;
142  readonly attribute boolean emulatedPosition;
143};
144
145[SecureContext, Exposed=Window] interface XRViewerPose : XRPose {
146  // TODO: Re-enable FrozenArray when supported. See https://bugzilla.mozilla.org/show_bug.cgi?id=1236777
147  //[SameObject] readonly attribute FrozenArray<XRView> views;
148  [SameObject, Frozen, Cached, Pure]
149  readonly attribute sequence<XRView> views;
150};
151
152enum XRHandedness {
153  "none",
154  "left",
155  "right"
156};
157
158enum XRTargetRayMode {
159  "gaze",
160  "tracked-pointer",
161  "screen"
162};
163
164[SecureContext, Exposed=Window]
165interface XRInputSource {
166  readonly attribute XRHandedness handedness;
167  readonly attribute XRTargetRayMode targetRayMode;
168  [SameObject] readonly attribute XRSpace targetRaySpace;
169  [SameObject] readonly attribute XRSpace? gripSpace;
170  // TODO: Re-enable FrozenArray when supported. See https://bugzilla.mozilla.org/show_bug.cgi?id=1236777
171  //[SameObject] readonly attribute FrozenArray<DOMString> profiles;
172  [SameObject, Frozen, Cached, Pure]
173  readonly attribute sequence<DOMString> profiles;
174};
175
176[SecureContext, Exposed=Window]
177interface XRInputSourceArray {
178  iterable<XRInputSource>;
179  readonly attribute unsigned long length;
180  getter XRInputSource(unsigned long index);
181};
182
183typedef (WebGLRenderingContext or
184         WebGL2RenderingContext) XRWebGLRenderingContext;
185
186dictionary XRWebGLLayerInit {
187  boolean antialias = true;
188  boolean depth = true;
189  boolean stencil = false;
190  boolean alpha = true;
191  boolean ignoreDepthValues = false;
192  double framebufferScaleFactor = 1.0;
193};
194
195// TODO: Change constructor back to original webidl
196// [SecureContext, Exposed=Window]
197[SecureContext, Exposed=Window, Constructor(XRSession session, XRWebGLRenderingContext context, optional XRWebGLLayerInit layerInit = {})]
198interface XRWebGLLayer {
199  //constructor(XRSession session,
200  //  XRWebGLRenderingContext context,
201  //  optional XRWebGLLayerInit layerInit = {});
202
203  // Attributes
204  readonly attribute boolean antialias;
205  readonly attribute boolean ignoreDepthValues;
206
207  [SameObject] readonly attribute WebGLFramebuffer framebuffer;
208  readonly attribute unsigned long framebufferWidth;
209  readonly attribute unsigned long framebufferHeight;
210
211  // Methods
212  XRViewport? getViewport(XRView view);
213
214  // Static Methods
215  static double getNativeFramebufferScaleFactor(XRSession session);
216};
217
218partial dictionary WebGLContextAttributes {
219    boolean xrCompatible = null;
220};
221
222partial interface mixin WebGLRenderingContextBase {
223    Promise<undefined> makeXRCompatible();
224};
225
226[SecureContext, Exposed=Window]
227interface XRSessionEvent : Event {
228  constructor(DOMString type, XRSessionEventInit eventInitDict);
229  [SameObject] readonly attribute XRSession session;
230};
231
232dictionary XRSessionEventInit : EventInit {
233  required XRSession session;
234};
235
236[SecureContext, Exposed=Window]
237interface XRInputSourceEvent : Event {
238  constructor(DOMString type, XRInputSourceEventInit eventInitDict);
239  [SameObject] readonly attribute XRFrame frame;
240  [SameObject] readonly attribute XRInputSource inputSource;
241};
242
243dictionary XRInputSourceEventInit : EventInit {
244  required XRFrame frame;
245  required XRInputSource inputSource;
246};
247
248[SecureContext, Exposed=Window]
249interface XRInputSourcesChangeEvent : Event {
250  constructor(DOMString type, XRInputSourcesChangeEventInit eventInitDict);
251  [SameObject] readonly attribute XRSession session;
252  // TODO: Re-enable FrozenArray when supported. See https://bugzilla.mozilla.org/show_bug.cgi?id=1236777
253  //[SameObject] readonly attribute FrozenArray<XRInputSource> added;
254  [SameObject, Frozen, Cached, Pure]
255  readonly attribute sequence<XRInputSource> added;
256  //[SameObject] readonly attribute FrozenArray<XRInputSource> removed;
257  [SameObject, Frozen, Cached, Pure]
258  readonly attribute sequence<XRInputSource> removed;
259};
260
261dictionary XRInputSourcesChangeEventInit : EventInit {
262  required XRSession session;
263  // TODO: Re-enable FrozenArray when supported. See https://bugzilla.mozilla.org/show_bug.cgi?id=1236777
264  //required FrozenArray<XRInputSource> added;
265  [Frozen, Cached, Pure]
266  required sequence<XRInputSource> added;
267  //required FrozenArray<XRInputSource> removed;
268  [Frozen, Cached, Pure]
269  required sequence<XRInputSource> removed;
270
271};
272
273[SecureContext, Exposed=Window]
274interface XRReferenceSpaceEvent : Event {
275  constructor(DOMString type, XRReferenceSpaceEventInit eventInitDict);
276  [SameObject] readonly attribute XRReferenceSpace referenceSpace;
277  [SameObject] readonly attribute XRRigidTransform? transform;
278};
279
280dictionary XRReferenceSpaceEventInit : EventInit {
281  required XRReferenceSpace referenceSpace;
282  XRRigidTransform transform;
283};
284