xrSession_input_events_end.https.html (2777B)
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 let testName = "Calling end during an input callback stops processing at the right time"; 9 10 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; 11 12 let gl = null; 13 14 function requestImmersiveSession() { 15 return new Promise((resolve, reject) => { 16 navigator.xr.test.simulateUserActivation(() => { 17 navigator.xr.requestSession('immersive-vr').then((session) => { 18 session.updateRenderState({ 19 baseLayer: new XRWebGLLayer(session, gl) 20 }); 21 22 resolve(session); 23 }, (err) => { 24 reject(err); 25 }); 26 }); 27 }); 28 } 29 30 let testFunction = function(session, fakeDeviceController, t, sessionObjects) { 31 gl = sessionObjects.gl; 32 // helper method to send a click and then request a dummy animation frame to 33 // ensure that the click propagates. We're doing everything in these tests 34 // from event watchers, we just need to trigger the add/click to make the 35 // event listeners callback. 36 function sendClick(session) { 37 let input_source = fakeDeviceController.simulateInputSourceConnection({ 38 handedness: "right", 39 targetRayMode: "tracked-pointer", 40 pointerOrigin: VALID_POINTER_TRANSFORM, 41 profiles: [], 42 selectionClicked: true 43 }); 44 requestSkipAnimationFrame(session, () => {}); 45 } 46 47 function sessionEndTest(endEvent, eventOrder) { 48 return requestImmersiveSession().then((session) => { 49 let eventWatcher = new EventWatcher(t, session, 50 ["inputsourceschange", "selectstart", "select", "selectend", "end"]); 51 let eventPromise = eventWatcher.wait_for(eventOrder); 52 53 session.addEventListener(endEvent, ()=> { 54 session.end(); 55 }, false); 56 57 sendClick(session); 58 return eventPromise; 59 }); 60 } 61 62 // End our first session, just for simplicity, then make end session calls 63 // during each of our input events, and ensure that events stop processing 64 // and no crashes occur from calling end inside the event callbacks. 65 return session.end().then(() => { 66 return sessionEndTest("inputsourceschange", ["inputsourceschange", "end"]); 67 }).then(() => { 68 return sessionEndTest("selectstart", ["inputsourceschange", "selectstart", "selectend", "end"]); 69 }).then(() => { 70 return sessionEndTest("select", ["inputsourceschange", "selectstart", "select", "selectend", "end"]); 71 }).then(() => { 72 return sessionEndTest("selectend", ["inputsourceschange", "selectstart", "select", "selectend", "end"]); 73 }); 74 }; 75 76 xr_session_promise_test( 77 testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); 78 79 </script>