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