xrViewport_valid.https.html (2863B)
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 = "XRViewport attributes are valid"; 9 10 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; 11 12 let testFunction = function(session, fakeDeviceController, t, sessionObjects) { 13 return session.requestReferenceSpace('local') 14 .then((referenceSpace) => new Promise((resolve) =>{ 15 let webglLayer = sessionObjects.glLayer; 16 function onFrame(time, xrFrame) { 17 t.step(() => { 18 let pose = xrFrame.getViewerPose(referenceSpace); 19 assert_not_equals(pose, null); 20 assert_not_equals(pose.views, null); 21 22 if (session.sessionInit['optionalFeatures'].includes('secondary-views')) { 23 assert_equals(pose.views.length, 3); 24 } else { 25 assert_equals(pose.views.length, 2); 26 } 27 28 // Ensure the views report the expected viewports into the WebGL layer. 29 for (let i = 0; i < pose.views.length; i++) { 30 let view = pose.views[i]; 31 let viewport = webglLayer.getViewport(view); 32 33 assert_not_equals(viewport, null); 34 assert_true(viewport instanceof XRViewport); 35 36 // Exact viewport values don't matter, but they must pass several tests: 37 38 // Viewports have non-zero widths and heights. 39 assert_greater_than(viewport.width, 0); 40 assert_greater_than(viewport.height, 0); 41 42 // Viewports are located within the framebuffer. 43 assert_greater_than_equal(viewport.x, 0); 44 assert_greater_than_equal(viewport.y, 0); 45 46 assert_less_than_equal( 47 viewport.x + viewport.width, webglLayer.framebufferWidth); 48 assert_less_than_equal( 49 viewport.y + viewport.height, webglLayer.framebufferHeight); 50 51 // Assume that the viewports are ordered from left to right. This is 52 // not a requirement by the WebXR spec, but is a sanity check since 53 // this is how Blink orders them. 54 if (i != 0) { 55 let previousView = pose.views[i - 1]; 56 let previousViewport = webglLayer.getViewport(previousView); 57 assert_less_than_equal(previousViewport.x + previousViewport.width, viewport.x); 58 } 59 } 60 }); 61 62 resolve(); 63 } 64 session.requestAnimationFrame(onFrame); 65 })); 66 }; 67 68 xr_session_promise_test( 69 testName, testFunction, fakeDeviceInitParams, 'immersive-vr', 70 {'optionalFeatures': []}); 71 72 xr_session_promise_test( 73 testName + ' with secondary views requested', testFunction, fakeDeviceInitParams, 'immersive-vr', 74 {'optionalFeatures': ['secondary-views']}); 75 76 </script>