@@ -37,7 +37,7 @@ export type XRState<T extends XRElementImplementations> = Readonly<
37
37
/**
38
38
* the HTML element for doing dom overlays in handheld AR experiences
39
39
*/
40
- domOverlayRoot : Element
40
+ domOverlayRoot ? : Element
41
41
/**
42
42
* the session visibility state
43
43
* e.g. `"visible-blurred"` typically occurs when the user sees an OS overlay
@@ -309,7 +309,12 @@ export function createXRStore<T extends XRElementImplementations>(options?: XRSt
309
309
window . addEventListener ( 'keydown' , keydownListener )
310
310
cleanupEmulate = ( ) => window . removeEventListener ( 'keydown' , keydownListener )
311
311
}
312
- const domOverlayRoot = options ?. domOverlay instanceof HTMLElement ? options . domOverlay : document . createElement ( 'div' )
312
+ const domOverlayRoot =
313
+ typeof HTMLElement === 'undefined'
314
+ ? undefined
315
+ : options ?. domOverlay instanceof HTMLElement
316
+ ? options . domOverlay
317
+ : document . createElement ( 'div' )
313
318
const store = createStore < XRState < XRElementImplementations > > ( ( ) => ( {
314
319
...baseInitialState ,
315
320
controller : options ?. controller ,
@@ -321,19 +326,21 @@ export function createXRStore<T extends XRElementImplementations>(options?: XRSt
321
326
} ) )
322
327
323
328
let cleanupDomOverlayRoot : ( ( ) => void ) | undefined
324
- if ( domOverlayRoot . parentNode == null ) {
325
- const setupDisplay = ( state : XRState < any > ) => {
326
- domOverlayRoot . style . display = state . session != null ? 'block' : 'none'
327
- }
328
- const unsubscribe = store . subscribe ( setupDisplay )
329
- setupDisplay ( store . getState ( ) )
330
- document . body . appendChild ( domOverlayRoot )
331
- cleanupDomOverlayRoot = ( ) => {
332
- domOverlayRoot . remove ( )
333
- unsubscribe ( )
329
+ if ( domOverlayRoot != null ) {
330
+ if ( domOverlayRoot . parentNode == null ) {
331
+ const setupDisplay = ( state : XRState < any > ) => {
332
+ domOverlayRoot . style . display = state . session != null ? 'block' : 'none'
333
+ }
334
+ const unsubscribe = store . subscribe ( setupDisplay )
335
+ setupDisplay ( store . getState ( ) )
336
+ document . body . appendChild ( domOverlayRoot )
337
+ cleanupDomOverlayRoot = ( ) => {
338
+ domOverlayRoot . remove ( )
339
+ unsubscribe ( )
340
+ }
334
341
}
342
+ document . body . append ( domOverlayRoot )
335
343
}
336
- document . body . append ( domOverlayRoot )
337
344
338
345
const syncXRInputSourceStates = createSyncXRInputSourceStates (
339
346
( state ) => store . setState ( { inputSourceStates : [ ...store . getState ( ) . inputSourceStates , state ] } ) ,
@@ -548,7 +555,7 @@ async function setFrameRate(session: XRSession, frameRate: FrameRateOption): Pro
548
555
}
549
556
550
557
async function enterXR (
551
- domOverlayRoot : Element ,
558
+ domOverlayRoot : Element | undefined ,
552
559
mode : XRSessionMode ,
553
560
options : XRStoreOptions < XRElementImplementations > | undefined ,
554
561
xrManager : WebXRManager | undefined ,
0 commit comments