xrViewerPose_secondaryViews.https.html (3287B)
1 <!DOCTYPE html> 2 <body> 3 <script src=/resources/testharness.js></script> 4 <script src=/resources/testharnessreport.js></script> 5 <script src="resources/webxr_util.js"></script> 6 <script src="resources/webxr_test_constants.js"></script> 7 <script src="resources/webxr_test_asserts.js"></script> 8 9 <script> 10 11 let nonImmersiveNoSecondaryTestName = 12 "Only primary views are returned if secondary views are not requested for non-immersive"; 13 let immersiveNoSecondaryTestName = 14 "Only primary views are returned if secondary views are not requested for immersive"; 15 let nonImmersiveSecondaryTestName = 16 "Requesting secondary views only returns primary views for non-immersive"; 17 let immersiveSecondaryTestName = 18 "Requesting secondary views returns both primary and secondary views for immersive"; 19 20 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; 21 22 let verifyView = function(view, eye, isFirstPersonObserver) { 23 assert_equals(view.eye, eye); 24 assert_equals(view.isFirstPersonObserver, isFirstPersonObserver); 25 }; 26 27 let verifyInlineViews = function(views) { 28 // Inline sessions should never have secondary views regardless of whether 29 // it was requested or not. 30 assert_equals(views.length, 1); 31 verifyView(views[0], "none", false); 32 }; 33 34 let verifyImmersiveViews = function(views, secondaryViewsEnabled) { 35 verifyView(views[0], "left", false); 36 verifyView(views[1], "right", false); 37 38 if (secondaryViewsEnabled) { 39 assert_equals(views.length, 3); 40 verifyView(views[2], "none", true); 41 } else { 42 assert_equals(views.length, 2); 43 } 44 }; 45 46 let testFunction = function(session, fakeDeviceController, t) { 47 return session.requestReferenceSpace('local') 48 .then((referenceSpace) => new Promise((resolve, reject) => { 49 function onFrame(time, xrFrame) { 50 t.step(() => { 51 let pose = xrFrame.getViewerPose(referenceSpace); 52 if (!pose) { 53 // For inline sessions, the window may have triggered this frame, 54 // instead of the session. This frame has no frame data which 55 // results in a null pose. 56 assert_true(session.mode == 'inline'); 57 session.requestAnimationFrame(onFrame); 58 return; 59 } 60 61 if (session.mode == 'inline') { 62 verifyInlineViews(pose.views); 63 } else { 64 verifyImmersiveViews( 65 pose.views, 66 session.sessionInit['optionalFeatures'].includes('secondary-views')); 67 } 68 69 resolve(); 70 }); 71 } 72 session.requestAnimationFrame(onFrame); 73 })); 74 }; 75 76 xr_session_promise_test( 77 nonImmersiveNoSecondaryTestName, testFunction, fakeDeviceInitParams, 'inline', 78 {'requiredFeatures': ['local'], 79 'optionalFeatures': []}); 80 xr_session_promise_test( 81 immersiveNoSecondaryTestName, testFunction, fakeDeviceInitParams, 'immersive-vr', 82 {'requiredFeatures': ['local'], 83 'optionalFeatures': []}); 84 xr_session_promise_test( 85 nonImmersiveSecondaryTestName, testFunction, fakeDeviceInitParams, 'inline', 86 {'requiredFeatures': ['local'], 87 'optionalFeatures': ['secondary-views']}); 88 xr_session_promise_test( 89 immersiveSecondaryTestName, testFunction, fakeDeviceInitParams, 'immersive-vr', 90 {'requiredFeatures': ['local'], 91 'optionalFeatures': ['secondary-views']}); 92 93 </script> 94 </body>