xrWebGLBinding_constructor.https.html (3334B)
1 <!DOCTYPE html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="../resources/webxr_util.js"></script> 5 <script src="../resources/webxr_test_constants.js"></script> 6 7 <script> 8 9 function testConstructor(t, gl) { 10 return navigator.xr.test.simulateDeviceConnection(TRACKED_IMMERSIVE_DEVICE) 11 .then(() => { 12 return navigator.xr.requestSession('inline') 13 .then((session) => { 14 try { 15 let webglLayerIncompatible = new XRWebGLBinding(session, gl); 16 assert_unreached("XRWebGLBinding should fail when created with an inline session."); 17 } catch (err) { 18 assert_equals(err.name, "InvalidStateError", "Should get InvalidStateError for creating with inline session."); 19 } 20 }); 21 }) 22 .then(() => { 23 return new Promise((resolve) => { 24 navigator.xr.test.simulateUserActivation(() => { 25 let xrSession = null; 26 navigator.xr.requestSession('immersive-vr') 27 .then((session) => { 28 xrSession = session; 29 t.step_func(() => { 30 try { 31 let webglLayerIncompatible = new XRWebGLBinding(xrSession, gl); 32 assert_unreached("XRWebGLBinding should fail when created with a context that is not XRCompatible.") 33 } catch (err) { 34 assert_equals(err.name, "InvalidStateError", "Should get InvalidStateError for non-XRCompatible context."); 35 } 36 }) 37 38 return gl.makeXRCompatible(); 39 }).then(() => { 40 try { 41 let webglLayerGood = new XRWebGLBinding(xrSession, gl); 42 } catch (err) { 43 reject("XRWebGLBinding should not fail with valid arguments."); 44 } 45 46 let lose_context_ext = gl.getExtension('WEBGL_lose_context'); 47 48 gl.canvas.addEventListener('webglcontextlost', (ev) => { 49 ev.preventDefault(); 50 51 try { 52 let webglLayerBadContext = new XRWebGLBinding(xrSession, gl); 53 reject("XRWebGLBinding should fail when created with a lost context."); 54 } catch (err) { 55 assert_equals(err.name, 'InvalidStateError', "Should get InvalidStateError for lost context."); 56 t.step_timeout(() => { lose_context_ext.restoreContext(); }, 100); 57 } 58 }); 59 60 gl.canvas.addEventListener('webglcontextrestored', (ev) => { 61 resolve(xrSession.end().then(() => { 62 try { 63 let webglLayerBadSession = new XRWebGLBinding(xrSession, gl); 64 assert_unreached("XRWebGLBinding should fail when created with an ended session."); 65 } catch (err) { 66 assert_equals(err.name, 'InvalidStateError', "Should get InvalidStateError when passed an ended session."); 67 } 68 })); 69 }); 70 71 lose_context_ext.loseContext(); 72 }); 73 }); 74 }); 75 }); 76 } 77 xr_promise_test("Ensure that XRWebGLBinding's constructor throws appropriate errors using webgl", 78 testConstructor, null, 'webgl'); 79 80 xr_promise_test("Ensure that XRWebGLBinding's constructor throws appropriate errors using webgl2", 81 testConstructor, null, 'webgl2'); 82 83 </script>