tor-browser

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

ar_anchor_states.https.html (4235B)


      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_asserts.js"></script>
      6 <script src="../resources/webxr_test_constants.js"></script>
      7 <script src="../resources/webxr_test_constants_fake_world.js"></script>
      8 
      9 <script>
     10 
     11 // 1m above world origin.
     12 const VIEWER_ORIGIN_TRANSFORM = {
     13  position: [0, 1, 0],
     14  orientation: [0, 0, 0, 1],
     15 };
     16 
     17 const fakeDeviceInitParams = {
     18  supportedModes: ["immersive-ar"],
     19  views: VALID_VIEWS,
     20  supportedFeatures: ALL_FEATURES,
     21  viewerOrigin: VIEWER_ORIGIN_TRANSFORM,
     22 };
     23 
     24 // Creates a test method that leverages anchors API.
     25 // |expectSucceeded| - true if the anchors creation request is expected to succeed, false otherwise
     26 // |endSession| - true if the test case should call session.end() prior to creating an anchor
     27 // |expectedError| - expected error name that should be returned in case expectSucceeded is false
     28 const testFunctionGenerator = function(expectSucceeded, endSession, expectedError) {
     29 
     30  const testFunction = function(session, fakeDeviceController, t) {
     31 
     32    const debug = xr_debug.bind(this, 'testAnchorStates');
     33 
     34    fakeDeviceController.setAnchorCreationCallback((parameters, controller) => {
     35      // All anchor creation requests that reach this stage should be marked as successful.
     36      // If this test is expected to fail, the failure will happen earlier in the anchor
     37      // creation process.
     38      return Promise.resolve(true);
     39    });
     40 
     41    const watcherDone = new Event("watcherdone");
     42    const eventWatcher = new EventWatcher(t, session, ["watcherdone"]);
     43    const eventPromise = eventWatcher.wait_for(["watcherdone"]);
     44 
     45    session.requestReferenceSpace('local').then((localRefSpace) => {
     46 
     47      const onFrame = function(time, frame) {
     48        debug("rAF 1");
     49 
     50        let setUpPromise = Promise.resolve();
     51        if(endSession) {
     52          debug("ending session");
     53          setUpPromise = session.end();
     54        }
     55 
     56        setUpPromise.then(() => {
     57          debug("creating anchor");
     58          frame.createAnchor(new XRRigidTransform(), localRefSpace)
     59            .then((anchor) => {
     60              debug("anchor created");
     61 
     62              t.step(() => {
     63                assert_true(expectSucceeded,
     64                  "`createAnchor` succeeded when it was expected to fail");
     65              });
     66 
     67              session.dispatchEvent(watcherDone);
     68            }).catch((error) => {
     69              debug("anchor creation failed");
     70 
     71              t.step(() =>  {
     72                assert_false(expectSucceeded,
     73                  "`createAnchor` failed when it was expected to succeed, error: " + error);
     74                assert_equals(error.name, expectedError,
     75                  "`createAnchor` failed with unexpected error name");
     76              });
     77 
     78              session.dispatchEvent(watcherDone);
     79            });
     80 
     81          // Anchor result will only take effect with frame data - schedule
     82          // a frame after we requested anchor creation, otherwise the test will time out.
     83          session.requestAnimationFrame(() => {
     84            debug("rAF 2");
     85          });
     86        }); // setUpPromise.then(() => { ... })
     87      }; // onFrame() { ... }
     88 
     89      debug("requesting animation frame");
     90      session.requestAnimationFrame(onFrame);
     91    }); // session.requestReferenceSpace(...)
     92 
     93    return eventPromise;
     94  };  // testFunction
     95 
     96  return testFunction;
     97 };
     98 
     99 xr_session_promise_test("Anchor creation succeeds if the feature was requested",
    100  testFunctionGenerator(/*expectSucceeded=*/true, /*endSession=*/false),
    101  fakeDeviceInitParams,
    102  'immersive-ar', { 'requiredFeatures': ['anchors'] });
    103 
    104 xr_session_promise_test("Anchor creation fails if the feature was not requested",
    105  testFunctionGenerator(/*expectSucceeded=*/false, /*endSession=*/false, "NotSupportedError"),
    106  fakeDeviceInitParams,
    107  'immersive-ar', {});
    108 
    109 xr_session_promise_test("Anchor creation fails if the feature was requested but the session already ended",
    110  testFunctionGenerator(/*expectSucceeded=*/false, /*endSession=*/true, "InvalidStateError"),
    111  fakeDeviceInitParams,
    112  'immersive-ar', { 'requiredFeatures': ['anchors'] });
    113 
    114 </script>