events_session_squeeze.https.html (4349B)
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 = "XRInputSources primary input presses properly fires off the " 9 + "right events"; 10 11 let watcherDone = new Event("watcherdone"); 12 13 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; 14 15 let xrViewerSpace = null; 16 17 let testFunction = function(session, fakeDeviceController, t) { 18 let eventWatcher = new EventWatcher( 19 t, session, ["squeezestart", "squeeze", "squeezeend", "watcherdone"]); 20 let eventPromise = eventWatcher.wait_for( 21 ["squeezestart", "squeeze", "squeezeend", "watcherdone"]); 22 23 function tryCallingFrameMethods(frame) { 24 t.step(() => { 25 // Frame is active but not an animation frame, so calling getPose is 26 // allowed while getViewerPose is not. 27 assert_throws_dom('InvalidStateError', () => frame.getViewerPose(currentReferenceSpace)); 28 let pose = frame.getPose(xrViewerSpace, currentReferenceSpace); 29 assert_not_equals(pose, null); 30 assert_true(pose instanceof XRPose); 31 assert_false(pose instanceof XRViewerPose); 32 }); 33 } 34 35 function onSessionSqueezeStart(event) { 36 t.step( () => { 37 let input_sources = session.inputSources; 38 assert_equals(event.frame.session, session); 39 assert_equals(event.inputSource, input_sources[0]); 40 validateSameObject(event); 41 tryCallingFrameMethods(event.frame); 42 }); 43 } 44 45 function onSessionSqueezeEnd(event) { 46 t.step( () => { 47 let input_sources = session.inputSources; 48 assert_equals(event.frame.session, session); 49 assert_equals(event.inputSource, input_sources[0]); 50 validateSameObject(event); 51 tryCallingFrameMethods(event.frame); 52 }); 53 session.dispatchEvent(watcherDone); 54 } 55 56 function onSessionSqueeze(event) { 57 t.step( () => { 58 let input_sources = session.inputSources; 59 assert_equals(event.frame.session, session); 60 assert_equals(event.inputSource, input_sources[0]); 61 validateSameObject(event); 62 tryCallingFrameMethods(event.frame); 63 }); 64 } 65 66 // Verifies that the same object is returned each time attributes are accessed 67 // on an XRInputSourceEvent, as required by the spec. 68 function validateSameObject(event) { 69 let frame = event.frame; 70 let source = event.inputSource; 71 t.step(() => { 72 assert_equals(frame, event.frame, 73 "XRInputSourceEvent.frame returns the same object."); 74 assert_equals(source, event.inputSource, 75 "XRInputSourceEvent.inputSource returns the same object."); 76 }); 77 } 78 79 session.addEventListener("squeezestart", onSessionSqueezeStart, false); 80 session.addEventListener("squeezeend", onSessionSqueezeEnd, false); 81 session.addEventListener("squeeze", onSessionSqueeze, false); 82 83 let pressed_grip_button = { 84 buttonType: "grip", 85 pressed: true, 86 touched: true, 87 pressedValue: 1.0 88 }; 89 90 let unpressed_grip_button = { 91 buttonType: "grip", 92 pressed: false, 93 touched: false, 94 pressedValue: 0.0 95 }; 96 97 let gripController = { 98 handedness: "none", 99 targetRayMode: "tracked-pointer", 100 pointerOrigin: VALID_POINTER_TRANSFORM, 101 profiles: [], 102 supportedButtons: [ unpressed_grip_button ] 103 }; 104 105 let input_source = 106 fakeDeviceController.simulateInputSourceConnection(gripController); 107 let currentReferenceSpace = null; 108 109 session.requestReferenceSpace('viewer').then(function(viewerSpace) { 110 xrViewerSpace = viewerSpace; 111 112 session.requestReferenceSpace('local').then((referenceSpace) => { 113 currentReferenceSpace = referenceSpace; 114 115 //Simulate a grip starting then release it a short time later. 116 requestSkipAnimationFrame(session, (time, xrFrame) => { 117 input_source.updateButtonState(pressed_grip_button); 118 119 session.requestAnimationFrame((time, xrFrame) => { 120 input_source.updateButtonState(unpressed_grip_button); 121 122 session.requestAnimationFrame((time, xrFrame) => { 123 // Need to process one more frame to allow grip to propegate. 124 }); 125 }); 126 }); 127 }); 128 }); 129 130 return eventPromise; 131 }; 132 133 xr_session_promise_test( 134 testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); 135 136 </script>