tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>