@@ -9,6 +9,7 @@ goog.provide('shaka.ui.VRManager');
9
9
10
10
goog . require ( 'shaka.log' ) ;
11
11
goog . require ( 'shaka.ui.VRWebgl' ) ;
12
+ goog . require ( 'shaka.util.Dom' ) ;
12
13
goog . require ( 'shaka.util.EventManager' ) ;
13
14
goog . require ( 'shaka.util.FakeEvent' ) ;
14
15
goog . require ( 'shaka.util.FakeEventTarget' ) ;
@@ -54,7 +55,7 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
54
55
this . eventManager_ = new shaka . util . EventManager ( ) ;
55
56
56
57
/** @private {?WebGLRenderingContext} */
57
- this . gl_ = this . getGL_ ( ) ;
58
+ this . gl_ = this . getGL_ ( this . canvas_ ) ;
58
59
59
60
/** @private {?shaka.ui.VRWebgl} */
60
61
this . vrWebgl_ = null ;
@@ -167,7 +168,12 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
167
168
* @return {boolean }
168
169
*/
169
170
canPlayVR ( ) {
170
- return ! ! this . gl_ ;
171
+ if ( this . canvas_ ) {
172
+ return ! ! this . gl_ ;
173
+ }
174
+ const canvas =
175
+ shaka . util . Dom . asHTMLCanvasElement ( document . createElement ( 'canvas' ) ) ;
176
+ return ! ! this . getGL_ ( canvas ) ;
171
177
}
172
178
173
179
/**
@@ -306,10 +312,15 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
306
312
* @private
307
313
*/
308
314
checkVrStatus_ ( ) {
309
- if ( ! this . canvas_ ) {
310
- return ;
311
- }
312
315
if ( ( this . config_ . displayInVrMode || this . vrAsset_ ) ) {
316
+ if ( ! this . canvas_ ) {
317
+ this . canvas_ = shaka . util . Dom . asHTMLCanvasElement (
318
+ document . createElement ( 'canvas' ) ) ;
319
+ this . canvas_ . classList . add ( 'shaka-vr-canvas-container' ) ;
320
+ this . video_ . parentElement . insertBefore (
321
+ this . canvas_ , this . video_ . nextElementSibling ) ;
322
+ this . gl_ = this . getGL_ ( this . canvas_ ) ;
323
+ }
313
324
const newProjectionMode =
314
325
this . vrAsset_ || this . config_ . defaultVrProjectionMode ;
315
326
if ( ! this . vrWebgl_ ) {
@@ -328,7 +339,7 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
328
339
}
329
340
}
330
341
} else if ( ! this . config_ . displayInVrMode && ! this . vrAsset_ &&
331
- this . vrWebgl_ ) {
342
+ this . canvas_ && this . vrWebgl_ ) {
332
343
this . canvas_ . style . display = 'none' ;
333
344
this . eventManager_ . removeAll ( ) ;
334
345
this . vrWebgl_ . release ( ) ;
@@ -352,11 +363,12 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
352
363
}
353
364
354
365
/**
366
+ * @param {?HTMLCanvasElement } canvas
355
367
* @return {?WebGLRenderingContext }
356
368
* @private
357
369
*/
358
- getGL_ ( ) {
359
- if ( ! this . canvas_ ) {
370
+ getGL_ ( canvas ) {
371
+ if ( ! canvas ) {
360
372
return null ;
361
373
}
362
374
// The user interface is not intended for devices that are controlled with
@@ -369,7 +381,7 @@ shaka.ui.VRManager = class extends shaka.util.FakeEventTarget {
369
381
'webgl' ,
370
382
] ;
371
383
for ( const webgl of webglContexts ) {
372
- const gl = this . canvas_ . getContext ( webgl ) ;
384
+ const gl = canvas . getContext ( webgl ) ;
373
385
if ( gl ) {
374
386
return /** @type {!WebGLRenderingContext } */ ( gl ) ;
375
387
}
0 commit comments